diff --git a/Makefile b/Makefile index 99e1d11..e56e18c 100644 --- a/Makefile +++ b/Makefile @@ -48,7 +48,7 @@ all: $(COMPOSED_WASMS) $(STUBS_DIR): $(COMPUTE_WIT) rm -rf $(STUBS_DIR) - uv run --extra dev componentize-py -d wit --world-module wit_world -w $(TARGET_WORLD) bindings $(STUBS_DIR) + $(FASTLY_COMPUTE_PY) bindings -d wit -w $(TARGET_WORLD) --world-module wit_world $(STUBS_DIR) # Build our composed wasm using fastly-compute-py build $(BUILD_DIR)/%.composed.wasm: wit/viceroy.wit wit/deps/fastly/compute.wit fastly_compute/wsgi.py fastly_compute/runtime_patching/patches.py | $(BUILD_DIR) $(STUBS_DIR) diff --git a/crates/fastly-compute-py/src/cli.rs b/crates/fastly-compute-py/src/cli.rs index bf41327..ec0361c 100644 --- a/crates/fastly-compute-py/src/cli.rs +++ b/crates/fastly-compute-py/src/cli.rs @@ -36,4 +36,22 @@ pub enum Command { #[arg(short, long)] virtualenv: Option, }, + + /// Generate WIT binding stubs for use with type checkers and IDEs + Bindings { + /// WIT directory to generate bindings from (default: wit) + #[arg(short = 'd', long)] + wit_dir: Option, + + /// WIT world to target (e.g. fastly:compute/service@0.1.0) + #[arg(short = 'w', long)] + world: Option, + + /// Python module name for the generated bindings (default: wit_world) + #[arg(long)] + world_module: Option, + + /// Output directory for the generated stubs + output_dir: PathBuf, + }, } diff --git a/crates/fastly-compute-py/src/config.rs b/crates/fastly-compute-py/src/config.rs index 4414dac..d8cd037 100644 --- a/crates/fastly-compute-py/src/config.rs +++ b/crates/fastly-compute-py/src/config.rs @@ -74,6 +74,7 @@ impl ConfigBuilder { self.cli.output = output.clone(); self.cli.virtualenv = virtualenv.clone(); } + Command::Bindings { .. } => {} } self } diff --git a/crates/fastly-compute-py/src/lib.rs b/crates/fastly-compute-py/src/lib.rs index f4784e2..424e8b0 100644 --- a/crates/fastly-compute-py/src/lib.rs +++ b/crates/fastly-compute-py/src/lib.rs @@ -80,23 +80,40 @@ fn init_logging(verbose: u8) { pub fn run_main(cli: &Cli) -> Result<()> { init_logging(cli.verbose); - log::info!("Building Python application for Fastly Compute..."); + match &cli.command { + cli::Command::Build { .. } => { + log::info!("Building Python application for Fastly Compute..."); - let config = ConfigBuilder::from_pyproject() - .unwrap_or_else(|e| { - log::warn!("Failed to load pyproject.toml: {}", e); - ConfigBuilder::default() - }) - .with_command(&cli.command) - .resolve(); + let config = ConfigBuilder::from_pyproject() + .unwrap_or_else(|e| { + log::warn!("Failed to load pyproject.toml: {}", e); + ConfigBuilder::default() + }) + .with_command(&cli.command) + .resolve(); - log::debug!("Final resolved configuration: {config:?}"); - log::info!(" Entry point: {}", config.entry); - log::info!(" Output: {}", config.output.display()); + log::debug!("Final resolved configuration: {config:?}"); + log::info!(" Entry point: {}", config.entry); + log::info!(" Output: {}", config.output.display()); - build(config.output.clone(), config.entry, config.virtualenv)?; + build(config.output.clone(), config.entry, config.virtualenv)?; - log::info!("✓ Build complete: {}", config.output.display()); + log::info!("✓ Build complete: {}", config.output.display()); + } + cli::Command::Bindings { + wit_dir, + world, + world_module, + output_dir, + } => { + generate_bindings( + wit_dir.as_deref(), + world.as_deref(), + world_module.as_deref(), + output_dir, + )?; + } + } Ok(()) } @@ -119,6 +136,42 @@ fn _fastly_compute_py(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> { Ok(()) } +pub fn generate_bindings( + wit_dir: Option<&Path>, + world: Option<&str>, + world_module: Option<&str>, + output_dir: &Path, +) -> Result<()> { + let wit_path = wit_dir.unwrap_or(Path::new("wit")); + let worlds: &[&str] = match world { + Some(w) => &[w], + None => &[], + }; + + log::info!("Generating WIT bindings..."); + log::debug!(" WIT path: {}", wit_path.display()); + log::debug!(" World: {:?}", world); + log::debug!(" World module: {:?}", world_module); + log::debug!(" Output dir: {}", output_dir.display()); + + componentize_py::BindingsGenerator { + wit_path: &[wit_path], + worlds, + features: &[], + all_features: false, + world_module, + output_dir, + import_interface_names: &HashMap::new(), + export_interface_names: &HashMap::new(), + full_names: false, + } + .generate()?; + + log::info!("✓ Bindings generated: {}", output_dir.display()); + + Ok(()) +} + pub fn build(output: PathBuf, entry_name: String, virtualenv: Option) -> Result<()> { let temp_dir = TempDir::new()?; let temp_path = temp_dir.path(); diff --git a/examples/backend-requests/uv.lock b/examples/backend-requests/uv.lock index 236eeba..9fbc7c3 100644 --- a/examples/backend-requests/uv.lock +++ b/examples/backend-requests/uv.lock @@ -35,7 +35,6 @@ source = { editable = "../../" } requires-dist = [ { name = "bottle", marker = "extra == 'examples'", specifier = ">=0.12.25" }, { name = "bottle", marker = "extra == 'test'", specifier = ">=0.12.25" }, - { name = "componentize-py", marker = "extra == 'dev'", specifier = ">=0.19.3,<0.20" }, { name = "flask", marker = "extra == 'examples'", specifier = ">=3.1.2,<4.0" }, { name = "pyrefly", marker = "extra == 'dev'", specifier = ">=0.49.0,<0.50" }, { name = "pytest", marker = "extra == 'test'", specifier = ">=8.4.0,<9.0.0" }, diff --git a/examples/bottle-app/uv.lock b/examples/bottle-app/uv.lock index a0d5055..2880ae6 100644 --- a/examples/bottle-app/uv.lock +++ b/examples/bottle-app/uv.lock @@ -35,7 +35,6 @@ source = { editable = "../../" } requires-dist = [ { name = "bottle", marker = "extra == 'examples'", specifier = ">=0.12.25" }, { name = "bottle", marker = "extra == 'test'", specifier = ">=0.12.25" }, - { name = "componentize-py", marker = "extra == 'dev'", specifier = ">=0.19.3,<0.20" }, { name = "flask", marker = "extra == 'examples'", specifier = ">=3.1.2,<4.0" }, { name = "pyrefly", marker = "extra == 'dev'", specifier = ">=0.49.0,<0.50" }, { name = "pytest", marker = "extra == 'test'", specifier = ">=8.4.0,<9.0.0" }, diff --git a/examples/flask-app/uv.lock b/examples/flask-app/uv.lock index 42a3009..86e398d 100644 --- a/examples/flask-app/uv.lock +++ b/examples/flask-app/uv.lock @@ -41,7 +41,6 @@ source = { editable = "../../" } requires-dist = [ { name = "bottle", marker = "extra == 'examples'", specifier = ">=0.12.25" }, { name = "bottle", marker = "extra == 'test'", specifier = ">=0.12.25" }, - { name = "componentize-py", marker = "extra == 'dev'", specifier = ">=0.19.3,<0.20" }, { name = "flask", marker = "extra == 'examples'", specifier = ">=3.1.2,<4.0" }, { name = "pyrefly", marker = "extra == 'dev'", specifier = ">=0.49.0,<0.50" }, { name = "pytest", marker = "extra == 'test'", specifier = ">=8.4.0,<9.0.0" }, diff --git a/examples/game-of-life/uv.lock b/examples/game-of-life/uv.lock index 1bd5d5a..b7fc1a8 100644 --- a/examples/game-of-life/uv.lock +++ b/examples/game-of-life/uv.lock @@ -41,7 +41,6 @@ source = { editable = "../../" } requires-dist = [ { name = "bottle", marker = "extra == 'examples'", specifier = ">=0.12.25" }, { name = "bottle", marker = "extra == 'test'", specifier = ">=0.12.25" }, - { name = "componentize-py", marker = "extra == 'dev'", specifier = ">=0.19.3,<0.20" }, { name = "flask", marker = "extra == 'examples'", specifier = ">=3.1.2,<4.0" }, { name = "pyrefly", marker = "extra == 'dev'", specifier = ">=0.49.0,<0.50" }, { name = "pytest", marker = "extra == 'test'", specifier = ">=8.4.0,<9.0.0" }, diff --git a/fastly_compute/testing/stubs/poll_loop.py b/fastly_compute/testing/stubs/poll_loop.py index c067a0f..504c958 100644 --- a/fastly_compute/testing/stubs/poll_loop.py +++ b/fastly_compute/testing/stubs/poll_loop.py @@ -2,9 +2,8 @@ This also includes helper classes and functions for working with `wasi:http`. -As of WASI Preview 2, there is not yet a standard for first-class, composable -asynchronous functions and streams. We expect that little or none of this -boilerplate will be needed once those features arrive in Preview 3. +This is only useful for `wasi:http@0.2.x`; `wasi:http@0.3.x` uses a different +mechanism to model concurrency. """ import asyncio diff --git a/fastly_compute/testing/stubs/wit_world/exports/__init__.py b/fastly_compute/testing/stubs/wit_world/exports/__init__.py index 981f1a2..47a00e5 100644 --- a/fastly_compute/testing/stubs/wit_world/exports/__init__.py +++ b/fastly_compute/testing/stubs/wit_world/exports/__init__.py @@ -8,8 +8,8 @@ import weakref from componentize_py_types import Result, Ok, Err, Some -from ..imports import http_req from ..imports import async_io +from ..imports import http_req class HttpIncoming(Protocol): @@ -26,7 +26,7 @@ def handle(self, request: http_req.Request, body: async_io.Pollable) -> None: stream the response body after the response has been initiated, use `send-downstream-streaming`. - Raises: `wit_world.types.Err(None)` + Raises: `componentize_py_types.Err(None)` """ raise NotImplementedError diff --git a/fastly_compute/testing/stubs/wit_world/imports/acl.py b/fastly_compute/testing/stubs/wit_world/imports/acl.py index 65f8dfd..abc28d6 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/acl.py +++ b/fastly_compute/testing/stubs/wit_world/imports/acl.py @@ -13,8 +13,8 @@ import weakref from componentize_py_types import Result, Ok, Err, Some -from ..imports import async_io from ..imports import types +from ..imports import async_io class AclError(Enum): """ @@ -33,7 +33,7 @@ def open(cls, name: str) -> Self: """ Opens an ACL linked to the current service with the given link name. - Raises: `wit_world.types.Err(wit_world.imports.types.OpenError)` + Raises: `componentize_py_types.Err(wit_world.imports.types.OpenError)` """ raise NotImplementedError def lookup(self, ip_addr: types.IpAddress) -> Optional[async_io.Pollable]: @@ -45,7 +45,7 @@ def lookup(self, ip_addr: types.IpAddress) -> Optional[async_io.Pollable]: If no matches are found, then `ok(none)` is returned. This corresponds to an HTTP error code of 204, “No Content”. - Raises: `wit_world.types.Err(wit_world.imports.acl.AclError)` + Raises: `componentize_py_types.Err(wit_world.imports.acl.AclError)` """ raise NotImplementedError def __enter__(self) -> Self: diff --git a/fastly_compute/testing/stubs/wit_world/imports/backend.py b/fastly_compute/testing/stubs/wit_world/imports/backend.py index c8cd26c..ee35369 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/backend.py +++ b/fastly_compute/testing/stubs/wit_world/imports/backend.py @@ -268,7 +268,7 @@ def open(cls, name: str) -> Self: """ Attempts to open the named static backend. - Raises: `wit_world.types.Err(wit_world.imports.types.OpenError)` + Raises: `componentize_py_types.Err(wit_world.imports.types.OpenError)` """ raise NotImplementedError def get_name(self) -> str: @@ -283,21 +283,21 @@ def is_healthy(self) -> BackendHealth: For backends without a configured healthcheck, this will always return `backend-health.unknown`. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def is_dynamic(self) -> bool: """ Returns `true` if the backend is a “dynamic” backend. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_host(self, max_len: int) -> str: """ Gets the host of this backend. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_override_host(self, max_len: int) -> Optional[bytes]: @@ -309,21 +309,21 @@ def get_override_host(self, max_len: int) -> Optional[bytes]: [the Fastly documentation on override hosts]: https://docs.fastly.com/en/guides/specifying-an-override-host - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_port(self) -> int: """ Gets the remote TCP port of the backend connection for the request. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_connect_timeout_ms(self) -> int: """ Gets the connection timeout of the backend. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_first_byte_timeout_ms(self) -> int: @@ -332,7 +332,7 @@ def get_first_byte_timeout_ms(self) -> int: This timeout applies between the time of connection and the time we get the first byte back. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_between_bytes_timeout_ms(self) -> int: @@ -341,28 +341,28 @@ def get_between_bytes_timeout_ms(self) -> int: This timeout applies between any two bytes we receive across the wire. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def is_tls(self) -> bool: """ Returns `true` if the backend is configured to use TLS. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_tls_min_version(self) -> Optional[int]: """ Gets the minimum TLS version this backend will use. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_tls_max_version(self) -> Optional[int]: """ Gets the maximum TLS version this backend will use. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_http_keepalive_time(self) -> int: @@ -370,21 +370,21 @@ def get_http_keepalive_time(self) -> int: Returns the time for this backend to hold onto an idle HTTP keepalive connection after it was last used before closing it. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_tcp_keepalive_enable(self) -> bool: """ Returns `true` if TCP keepalives have been enabled for this backend. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_tcp_keepalive_interval(self) -> int: """ Returns the time to wait in between sending each TCP keepalive probe to this backend. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_tcp_keepalive_probes(self) -> int: @@ -392,7 +392,7 @@ def get_tcp_keepalive_probes(self) -> int: Returns the time to wait after the last data was sent before starting to send TCP keepalive probes to this backend. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_tcp_keepalive_time(self) -> int: @@ -400,7 +400,7 @@ def get_tcp_keepalive_time(self) -> int: Returns the time to wait after the last data was sent before starting to send TCP keepalive probes to this backend. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def __enter__(self) -> Self: @@ -439,6 +439,6 @@ def register_dynamic_backend(prefix: str, target: str, options: DynamicBackendOp backends with a service that has not had dynamic backends enabled, or dynamic backends have been administratively prohibited for the node in response to an ongoing incident. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError diff --git a/fastly_compute/testing/stubs/wit_world/imports/cache.py b/fastly_compute/testing/stubs/wit_world/imports/cache.py index 91bdf96..4a84d69 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/cache.py +++ b/fastly_compute/testing/stubs/wit_world/imports/cache.py @@ -132,7 +132,7 @@ def lookup(cls, key: bytes, options: LookupOptions) -> Self: Returns a result without waiting for any request collapsing that may be ongoing. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError @classmethod @@ -143,7 +143,7 @@ def transaction_lookup(cls, key: bytes, options: LookupOptions) -> Self: This operation always participates in request collapsing and may return stale objects. To bypass request collapsing, use `entry.lookup` or `insert` instead. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError @classmethod @@ -155,7 +155,7 @@ def transaction_lookup_async(cls, key: bytes, options: LookupOptions) -> async_i This operation always participates in request collapsing and may return stale objects. To bypass request collapsing, use `entry.lookup` or `insert` instead. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def transaction_insert(self, options: WriteOptions) -> async_io.Pollable: @@ -167,7 +167,7 @@ def transaction_insert(self, options: WriteOptions) -> async_io.Pollable: The returned handle is to a streaming body that is used for writing the object into the cache. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def transaction_insert_and_stream_back(self, options: WriteOptions) -> Tuple[async_io.Pollable, Self]: @@ -183,7 +183,7 @@ def transaction_insert_and_stream_back(self, options: WriteOptions) -> Tuple[asy the cache. The returned cache handle provides a separate transaction for reading out the newly cached object to send elsewhere. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def transaction_update(self, options: WriteOptions) -> None: @@ -194,7 +194,7 @@ def transaction_update(self, options: WriteOptions) -> None: - `found` - `must-insert-or-update` - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_state(self) -> LookupState: @@ -205,7 +205,7 @@ def get_state(self) -> LookupState: Some SDKs were released that checked only FOUND to infer "usable"; we preserve the equivalence for backwards compatibility. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_user_metadata(self, max_len: int) -> Optional[bytes]: @@ -213,7 +213,7 @@ def get_user_metadata(self, max_len: int) -> Optional[bytes]: Gets the user metadata of the found object, returning `ok(none)` if no object was found. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_body(self, options: GetBodyOptions) -> async_io.Pollable: @@ -228,7 +228,7 @@ def get_body(self, options: GetBodyOptions) -> async_io.Pollable: the body of objects that are past the stale-while-revalidate period will not be available, even when other metadata is. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_length(self) -> Optional[int]: @@ -236,7 +236,7 @@ def get_length(self) -> Optional[int]: Gets the content length of the found object, returning `ok(none)` if there was no found object, or no content length was provided. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_max_age_ns(self) -> Optional[int]: @@ -244,7 +244,7 @@ def get_max_age_ns(self) -> Optional[int]: Gets the configured max age of the found object, returning `ok(none)` if there was no found object. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_stale_while_revalidate_ns(self) -> Optional[int]: @@ -252,7 +252,7 @@ def get_stale_while_revalidate_ns(self) -> Optional[int]: Gets the configured stale-while-revalidate period of the found object, returning `ok(none)` if there was no found object. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_age_ns(self) -> Optional[int]: @@ -260,7 +260,7 @@ def get_age_ns(self) -> Optional[int]: Gets the age of the found object, returning `ok(none)` if there was no found object. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_hits(self) -> Optional[int]: @@ -268,7 +268,7 @@ def get_hits(self) -> Optional[int]: Gets the number of cache hits for the found object, returning `ok(none)` if there was no found object. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def transaction_cancel(self) -> None: @@ -278,7 +278,7 @@ def transaction_cancel(self) -> None: Useful if there is an error before streaming is possible, for example if a backend is unreachable. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def __enter__(self) -> Self: @@ -338,7 +338,7 @@ def replace(cls, key: bytes, options: ReplaceOptions) -> Self: This operation always participates in request collapsing and may return stale objects. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_age_ns(self) -> Optional[int]: @@ -346,7 +346,7 @@ def get_age_ns(self) -> Optional[int]: Gets the age of the existing object during replace, returning `ok(none)` if there was no object. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_body(self, options: GetBodyOptions) -> Optional[async_io.Pollable]: @@ -357,7 +357,7 @@ def get_body(self, options: GetBodyOptions) -> Optional[async_io.Pollable]: The returned `body` must be closed before calling this function again on the same `replace-entry`. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_hits(self) -> Optional[int]: @@ -365,7 +365,7 @@ def get_hits(self) -> Optional[int]: Gets the number of cache hits for the existing object during replace, returning `ok(none)` if there was no object. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_length(self) -> Optional[int]: @@ -374,7 +374,7 @@ def get_length(self) -> Optional[int]: returning `ok(none)` if there was no object, or no content length was provided. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_max_age_ns(self) -> Optional[int]: @@ -382,7 +382,7 @@ def get_max_age_ns(self) -> Optional[int]: Gets the configured max age of the existing object during replace, returning `ok(none)` if there was no object. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_stale_while_revalidate_ns(self) -> Optional[int]: @@ -391,7 +391,7 @@ def get_stale_while_revalidate_ns(self) -> Optional[int]: object during replace, returning `ok(none)` if there was no object. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_state(self) -> Optional[LookupState]: @@ -403,7 +403,7 @@ def get_state(self) -> Optional[LookupState]: Some SDKs were released that checked only FOUND to infer "usable"; we preserve the equivalence for backwards compatibility. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_user_metadata(self, max_len: int) -> Optional[bytes]: @@ -411,7 +411,7 @@ def get_user_metadata(self, max_len: int) -> Optional[bytes]: Gets the user metadata of the existing object during replace, returning `ok(none)` if there was no object. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def __enter__(self) -> Self: @@ -433,7 +433,7 @@ def insert(key: bytes, options: WriteOptions) -> async_io.Pollable: The returned handle is to a streaming body that is used for writing the object into the cache. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def await_entry(handle: async_io.Pollable) -> Entry: @@ -441,14 +441,14 @@ def await_entry(handle: async_io.Pollable) -> Entry: Continues the lookup transaction from which the given busy handle was returned, waiting for the leader transaction if request collapsed, and returns a cache handle. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def close_pending_entry(handle: async_io.Pollable) -> None: """ Closes an interaction with the cache that has not yet finished request collapsing. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def close_entry(handle: Entry) -> None: @@ -459,7 +459,7 @@ def close_entry(handle: Entry) -> None: update has been performed), closing the handle cancels any request collapsing, potentially choosing a new waiter to perform the insertion/update. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def replace_insert(handle: ReplaceEntry, options: WriteOptions) -> async_io.Pollable: @@ -469,7 +469,7 @@ def replace_insert(handle: ReplaceEntry, options: WriteOptions) -> async_io.Poll The returned handle is to a streaming body that is used for writing the object into the cache. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def close_replace_entry(handle: ReplaceEntry) -> None: @@ -480,6 +480,6 @@ def close_replace_entry(handle: ReplaceEntry) -> None: update has been performed), closing the handle cancels any request collapsing, potentially choosing a new waiter to perform the insertion/update. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError diff --git a/fastly_compute/testing/stubs/wit_world/imports/config_store.py b/fastly_compute/testing/stubs/wit_world/imports/config_store.py index 3d0ca2f..932f585 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/config_store.py +++ b/fastly_compute/testing/stubs/wit_world/imports/config_store.py @@ -27,14 +27,14 @@ def open(cls, name: str) -> Self: Names are case sensitive. - Raises: `wit_world.types.Err(wit_world.imports.types.OpenError)` + Raises: `componentize_py_types.Err(wit_world.imports.types.OpenError)` """ raise NotImplementedError def get(self, key: str, max_len: int) -> Optional[str]: """ Fetches a value from the config store, returning `ok(none)` if it doesn't exist. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def __enter__(self) -> Self: diff --git a/fastly_compute/testing/stubs/wit_world/imports/device_detection.py b/fastly_compute/testing/stubs/wit_world/imports/device_detection.py index c9c4f38..33ac84b 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/device_detection.py +++ b/fastly_compute/testing/stubs/wit_world/imports/device_detection.py @@ -23,6 +23,6 @@ def lookup(user_agent: str, max_len: int) -> Optional[str]: [here]: https://www.fastly.com/documentation/reference/vcl/variables/client-request/client-identified/ - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError diff --git a/fastly_compute/testing/stubs/wit_world/imports/dictionary.py b/fastly_compute/testing/stubs/wit_world/imports/dictionary.py index 6c0ae2b..ae668f1 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/dictionary.py +++ b/fastly_compute/testing/stubs/wit_world/imports/dictionary.py @@ -27,7 +27,7 @@ def open(cls, name: str) -> Self: Names are case sensitive. - Raises: `wit_world.types.Err(wit_world.imports.types.OpenError)` + Raises: `componentize_py_types.Err(wit_world.imports.types.OpenError)` """ raise NotImplementedError def lookup(self, key: str, max_len: int) -> Optional[str]: @@ -37,7 +37,7 @@ def lookup(self, key: str, max_len: int) -> Optional[str]: If the lookup is successful, this function returns `ok(some(s))` containing the found string `s`, or `ok(none)` if no entry with the given key was found. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def __enter__(self) -> Self: diff --git a/fastly_compute/testing/stubs/wit_world/imports/erl.py b/fastly_compute/testing/stubs/wit_world/imports/erl.py index 1c957d6..1dbcfa4 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/erl.py +++ b/fastly_compute/testing/stubs/wit_world/imports/erl.py @@ -26,7 +26,7 @@ def open(cls, name: str) -> Self: """ Opens a `penalty-box` identified by the given name. - Raises: `wit_world.types.Err(wit_world.imports.types.OpenError)` + Raises: `componentize_py_types.Err(wit_world.imports.types.OpenError)` """ raise NotImplementedError def get_name(self) -> str: @@ -40,14 +40,14 @@ def add(self, entry: str, ttl: int) -> None: Valid ttl span is 1m to 1h and TTL value is truncated to the nearest minute. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def has(self, entry: str) -> bool: """ Checks if `entry` is in the penaltybox. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def __enter__(self) -> Self: @@ -72,7 +72,7 @@ def open(cls, name: str) -> Self: """ Opens a `rate-counter` with the given name. - Raises: `wit_world.types.Err(wit_world.imports.types.OpenError)` + Raises: `componentize_py_types.Err(wit_world.imports.types.OpenError)` """ raise NotImplementedError def get_name(self) -> str: @@ -90,28 +90,28 @@ def check_rate(self, entry: str, delta: int, window: int, limit: int, penalty_bo Returns `true` if the client is penalized (i.e. should be limited), or `false` if not. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def increment(self, entry: str, delta: int) -> None: """ Increments an entry in the ratecounter by `delta`. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def lookup_rate(self, entry: str, window: int) -> int: """ Looks up the current rate for entry in the ratecounter for a window. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def lookup_count(self, entry: str, duration: int) -> int: """ Looks up the current count for entry in the ratecounter for duration. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def __enter__(self) -> Self: diff --git a/fastly_compute/testing/stubs/wit_world/imports/geo.py b/fastly_compute/testing/stubs/wit_world/imports/geo.py index 9660d34..6a58de1 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/geo.py +++ b/fastly_compute/testing/stubs/wit_world/imports/geo.py @@ -25,6 +25,6 @@ def lookup(ip_addr: types.IpAddress, max_len: int) -> str: [here]: https://www.fastly.com/documentation/reference/vcl/variables/geolocation/ - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError diff --git a/fastly_compute/testing/stubs/wit_world/imports/http_body.py b/fastly_compute/testing/stubs/wit_world/imports/http_body.py index c89fba5..050d1db 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/http_body.py +++ b/fastly_compute/testing/stubs/wit_world/imports/http_body.py @@ -37,21 +37,21 @@ def new() -> async_io.Pollable: """ Creates a new empty body that can be used for outgoing requests and responses. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def append(dest: async_io.Pollable, src: async_io.Pollable) -> None: """ Appends the contents of the body `src` to the body `dest`. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def read(body: async_io.Pollable, chunk_size: int) -> bytes: """ Reads from a body. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def write(body: async_io.Pollable, buf: bytes) -> int: @@ -61,7 +61,7 @@ def write(body: async_io.Pollable, buf: bytes) -> int: This function may write fewer bytes than requested; on success, the number of bytes actually written is returned. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def write_front(body: async_io.Pollable, buf: bytes) -> None: @@ -70,7 +70,7 @@ def write_front(body: async_io.Pollable, buf: bytes) -> None: On success, this function always writes all the bytes of `buf`. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def close(body: async_io.Pollable) -> None: @@ -85,7 +85,7 @@ def close(body: async_io.Pollable) -> None: If a handle is dropped without calling `close`, it's an *unsuccessful* stream termination. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_known_length(body: async_io.Pollable) -> Optional[int]: @@ -107,7 +107,7 @@ def append_trailer(body: async_io.Pollable, name: str, value: bytes) -> None: """ Adds a body trailing header with given value. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_trailer_names(body: async_io.Pollable, max_len: int, cursor: int) -> Tuple[str, Optional[int]]: @@ -120,7 +120,7 @@ def get_trailer_names(body: async_io.Pollable, max_len: int, cursor: int) -> Tup or `none` if all the remaining names fit. If `max-len` is too small to fit any name, an `error.buffer-len` error is returned, providing a recommended buffer size. - Raises: `wit_world.types.Err(wit_world.imports.http_body.TrailerError)` + Raises: `componentize_py_types.Err(wit_world.imports.http_body.TrailerError)` """ raise NotImplementedError def get_trailer_value(body: async_io.Pollable, name: str, max_len: int) -> Optional[bytes]: @@ -135,7 +135,7 @@ def get_trailer_value(body: async_io.Pollable, name: str, max_len: int) -> Optio small to fit the value, an `error.buffer-len` error is returned, providing a recommended buffer size. - Raises: `wit_world.types.Err(wit_world.imports.http_body.TrailerError)` + Raises: `componentize_py_types.Err(wit_world.imports.http_body.TrailerError)` """ raise NotImplementedError def get_trailer_values(body: async_io.Pollable, name: str, max_len: int, cursor: int) -> Tuple[bytes, Optional[int]]: @@ -150,6 +150,6 @@ def get_trailer_values(body: async_io.Pollable, name: str, max_len: int, cursor: fit, or `none` if all the remaining values fit. If `max-len` is too small to fit any value, an `error.buffer-len` error is returned, providing a recommended buffer size. - Raises: `wit_world.types.Err(wit_world.imports.http_body.TrailerError)` + Raises: `componentize_py_types.Err(wit_world.imports.http_body.TrailerError)` """ raise NotImplementedError diff --git a/fastly_compute/testing/stubs/wit_world/imports/http_cache.py b/fastly_compute/testing/stubs/wit_world/imports/http_cache.py index d535aff..d0d6b82 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/http_cache.py +++ b/fastly_compute/testing/stubs/wit_world/imports/http_cache.py @@ -33,11 +33,11 @@ import weakref from componentize_py_types import Result, Ok, Err, Some -from ..imports import cache -from ..imports import http_req from ..imports import backend -from ..imports import http_resp from ..imports import async_io +from ..imports import http_resp +from ..imports import http_req +from ..imports import cache class ExtraLookupOptions: """ @@ -113,7 +113,7 @@ def get_vary_rule(self, max_len: int) -> str: """ Returns the suggested value for the `write-options.vary-rule` field. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_initial_age_ns(self) -> int: @@ -130,7 +130,7 @@ def get_surrogate_keys(self, max_len: int) -> str: """ Returns the suggested value for the `write-options.surrogate-keys` field. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_length(self) -> Optional[int]: @@ -179,7 +179,7 @@ def transaction_lookup(cls, req_handle: http_req.Request, options: LookupOptions The request is not consumed. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def transaction_insert(self, resp_handle: http_resp.Response, options: WriteOptions) -> async_io.Pollable: @@ -191,7 +191,7 @@ def transaction_insert(self, resp_handle: http_resp.Response, options: WriteOpti The response is consumed. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def transaction_insert_and_stream_back(self, resp_handle: http_resp.Response, options: WriteOptions) -> Tuple[async_io.Pollable, Self]: @@ -205,7 +205,7 @@ def transaction_insert_and_stream_back(self, resp_handle: http_resp.Response, op The response is consumed. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def transaction_update(self, resp_handle: http_resp.Response, options: WriteOptions) -> None: @@ -219,7 +219,7 @@ def transaction_update(self, resp_handle: http_resp.Response, options: WriteOpti The response is consumed. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def transaction_update_and_return_fresh(self, resp_handle: http_resp.Response, options: WriteOptions) -> Self: @@ -234,7 +234,7 @@ def transaction_update_and_return_fresh(self, resp_handle: http_resp.Response, o The response is consumed. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def transaction_record_not_cacheable(self, options: WriteOptions) -> None: @@ -246,7 +246,7 @@ def transaction_record_not_cacheable(self, options: WriteOptions) -> None: Only the max age and, optionally, the vary rule are read from the `options` for this function. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_suggested_backend_request(self) -> http_req.Request: @@ -257,7 +257,7 @@ def get_suggested_backend_request(self) -> http_req.Request: looked-up request is ranged, the suggested request will be unranged in order to try caching the entire response. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_suggested_write_options(self, response: http_resp.Response) -> SuggestedWriteOptions: @@ -266,7 +266,7 @@ def get_suggested_write_options(self, response: http_resp.Response) -> Suggested The response is not consumed. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def prepare_response_for_storage(self, response: http_resp.Response) -> Tuple[StorageAction, http_resp.Response]: @@ -279,7 +279,7 @@ def prepare_response_for_storage(self, response: http_resp.Response) -> Tuple[St In addition to the updated response, this function returns the recommended storage action. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_found_response(self, transform_for_client: int) -> Optional[Tuple[http_resp.Response, async_io.Pollable]]: @@ -291,7 +291,7 @@ def get_found_response(self, transform_for_client: int) -> Optional[Tuple[http_r request. For example, a response retrieved for a range request may be transformed into a `206 Partial Content` response with an appropriate `content-range` header. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_state(self) -> cache.LookupState: @@ -301,7 +301,7 @@ def get_state(self) -> cache.LookupState: Primarily useful after performing the lookup to determine what subsequent operations are possible and whether any insertion or update obligations exist. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_length(self) -> Optional[int]: @@ -309,7 +309,7 @@ def get_length(self) -> Optional[int]: Gets the length of the found response, returning `ok(none)` if there was no response found or no length was provided. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_max_age_ns(self) -> Optional[int]: @@ -317,7 +317,7 @@ def get_max_age_ns(self) -> Optional[int]: Gets the configured max age of the found response in nanoseconds, returning `ok(none)` if there was no response found. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_stale_while_revalidate_ns(self) -> Optional[int]: @@ -325,7 +325,7 @@ def get_stale_while_revalidate_ns(self) -> Optional[int]: Gets the configured stale-while-revalidate period of the found response in nanoseconds, returning `ok(none)` if there was no response found. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_age_ns(self) -> Optional[int]: @@ -333,7 +333,7 @@ def get_age_ns(self) -> Optional[int]: Gets the age of the found response in nanoseconds, returning `ok(none)` if there was no response found. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_hits(self) -> Optional[int]: @@ -344,7 +344,7 @@ def get_hits(self) -> Optional[int]: This figure only reflects hits for a stored response in a particular cache server or cluster, not the entire Fastly network. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_sensitive_data(self) -> Optional[bool]: @@ -352,7 +352,7 @@ def get_sensitive_data(self) -> Optional[bool]: Gets whether a found response is marked as containing sensitive data, returning `ok(none)` if there was no response found. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_surrogate_keys(self, max_len: int) -> Optional[str]: @@ -365,7 +365,7 @@ def get_surrogate_keys(self, max_len: int) -> Optional[str]: If the full list requires more than `max-len` bytes, an `error.buffer-len` error is returned containing the required size. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_vary_rule(self, max_len: int) -> Optional[str]: @@ -378,7 +378,7 @@ def get_vary_rule(self, max_len: int) -> Optional[str]: If the full list requires more than `max-len` bytes, an `error.buffer-len` error is returned containing the required size. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def transaction_abandon(self) -> None: @@ -394,7 +394,7 @@ def transaction_abandon(self) -> None: requests. Consider using `transaction-record-not-cacheable` to make lookups for this request bypass the cache. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def __enter__(self) -> Self: @@ -420,7 +420,7 @@ def is_request_cacheable(request: http_req.Request) -> bool: [RFC 9111]: https://www.rfc-editor.org/rfc/rfc9111.html - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_suggested_cache_key(request: http_req.Request, max_len: int) -> bytes: @@ -432,7 +432,7 @@ def get_suggested_cache_key(request: http_req.Request, max_len: int) -> bytes: At the moment, HTTP cache keys must always be 32 bytes. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def close_entry(handle: Entry) -> None: @@ -443,6 +443,6 @@ def close_entry(handle: Entry) -> None: has been performed), closing the handle cancels any request collapsing, potentially choosing a new waiter to perform the insertion/update. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError diff --git a/fastly_compute/testing/stubs/wit_world/imports/http_downstream.py b/fastly_compute/testing/stubs/wit_world/imports/http_downstream.py index 4d61c54..67621f0 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/http_downstream.py +++ b/fastly_compute/testing/stubs/wit_world/imports/http_downstream.py @@ -13,9 +13,9 @@ import weakref from componentize_py_types import Result, Ok, Err, Some -from ..imports import http_req from ..imports import types from ..imports import async_io +from ..imports import http_req class ExtraNextRequestOptions: """ @@ -65,7 +65,7 @@ def next_request(options: NextRequestOptions) -> async_io.Pollable: necessary to preserve state between multiple requests, store it outside of the sandbox. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def await_request(pending: async_io.Pollable) -> Optional[Tuple[http_req.Request, async_io.Pollable]]: @@ -75,7 +75,7 @@ def await_request(pending: async_io.Pollable) -> Optional[Tuple[http_req.Request Returns `ok(none)` if there are no more requests for this sandbox. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def downstream_original_header_names(ds_request: http_req.Request, max_len: int, cursor: int) -> Tuple[str, Optional[int]]: @@ -91,14 +91,14 @@ def downstream_original_header_names(ds_request: http_req.Request, max_len: int, or `none` if all the remaining names fit. If `max-len` is too small to fit any name, an `error.buffer-len` error is returned, providing a recommended buffer size. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def downstream_original_header_count(ds_request: http_req.Request) -> int: """ Returns the number of headers in the client request as originally received. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def downstream_client_ip_addr(ds_request: http_req.Request) -> Optional[types.IpAddress]: @@ -115,28 +115,28 @@ def downstream_client_h2_fingerprint(ds_request: http_req.Request, max_len: int) """ Gets the HTTP/2 fingerprint of client request if available. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def downstream_client_request_id(ds_request: http_req.Request, max_len: int) -> str: """ Gets the id of the current request if available. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def downstream_client_oh_fingerprint(ds_request: http_req.Request, max_len: int) -> str: """ Gets the fingerprint of client request headers if available. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def downstream_client_ddos_detected(ds_request: http_req.Request) -> bool: """ Returns whether the request was tagged as contributing to a DDoS attack. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def downstream_tls_cipher_openssl_name(ds_request: http_req.Request, max_len: int) -> Optional[bytes]: @@ -149,7 +149,7 @@ def downstream_tls_cipher_openssl_name(ds_request: http_req.Request, max_len: in [OpenSSL name]: https://testssl.sh/openssl-iana.mapping.html - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def downstream_tls_protocol(ds_request: http_req.Request, max_len: int) -> Optional[bytes]: @@ -158,7 +158,7 @@ def downstream_tls_protocol(ds_request: http_req.Request, max_len: int) -> Optio Returns `ok(none)` if the downstream client connection is not a TLS connection. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def downstream_tls_client_hello(ds_request: http_req.Request, max_len: int) -> Optional[bytes]: @@ -171,7 +171,7 @@ def downstream_tls_client_hello(ds_request: http_req.Request, max_len: int) -> O [RFC 5246]: https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.2 - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def downstream_tls_raw_client_certificate(ds_request: http_req.Request, max_len: int) -> Optional[bytes]: @@ -182,7 +182,7 @@ def downstream_tls_raw_client_certificate(ds_request: http_req.Request, max_len: Returns `ok(none)` if the downstream client connection is not a TLS connection. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def downstream_tls_client_cert_verify_result(ds_request: http_req.Request) -> Optional[http_req.ClientCertVerifyResult]: @@ -191,7 +191,7 @@ def downstream_tls_client_cert_verify_result(ds_request: http_req.Request) -> Op Returns `ok(none)` if the downstream client connection is not a TLS connection. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def downstream_tls_client_servername(ds_request: http_req.Request, max_len: int) -> Optional[str]: @@ -200,7 +200,7 @@ def downstream_tls_client_servername(ds_request: http_req.Request, max_len: int) Returns `ok(none)` if not available. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def downstream_tls_ja3_md5(ds_request: http_req.Request) -> Optional[bytes]: @@ -209,7 +209,7 @@ def downstream_tls_ja3_md5(ds_request: http_req.Request) -> Optional[bytes]: Returns `ok(none)` if the downstream client connection is not a TLS connection. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def downstream_tls_ja4(ds_request: http_req.Request, max_len: int) -> Optional[str]: @@ -218,14 +218,14 @@ def downstream_tls_ja4(ds_request: http_req.Request, max_len: int) -> Optional[s Returns `ok(none)` if the downstream client connection is not a TLS connection. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def downstream_compliance_region(ds_request: http_req.Request, max_len: int) -> Optional[str]: """ Gets the compliance region that the client IP address is in. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def fastly_key_is_valid(ds_request: http_req.Request) -> bool: @@ -234,6 +234,6 @@ def fastly_key_is_valid(ds_request: http_req.Request) -> bool: Fastly-Key belonging to a user with the rights to purge content on this service. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError diff --git a/fastly_compute/testing/stubs/wit_world/imports/http_req.py b/fastly_compute/testing/stubs/wit_world/imports/http_req.py index e8abd74..6ec795a 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/http_req.py +++ b/fastly_compute/testing/stubs/wit_world/imports/http_req.py @@ -11,9 +11,9 @@ import weakref from componentize_py_types import Result, Ok, Err, Some +from ..imports import types from ..imports import http_types from ..imports import backend -from ..imports import types from ..imports import async_io from ..imports import http_resp @@ -79,7 +79,7 @@ def new(cls) -> Self: """ Creates a new `request` with no method, URL, or headers, and an empty body. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def set_cache_override(self, cache_override: CacheOverride) -> None: @@ -88,7 +88,7 @@ def set_cache_override(self, cache_override: CacheOverride) -> None: This setting will override any cache directive headers returned in response to this request. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_header_names(self, max_len: int, cursor: int) -> Tuple[str, Optional[int]]: @@ -101,7 +101,7 @@ def get_header_names(self, max_len: int, cursor: int) -> Tuple[str, Optional[int or `none` if all the remaining names fit. If `max-len` is too small to fit any name, an `error.buffer-len` error is returned, providing a recommended buffer size. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_header_value(self, name: str, max_len: int) -> Optional[bytes]: @@ -114,7 +114,7 @@ def get_header_value(self, name: str, max_len: int) -> Optional[bytes]: If header name requires more than `max-len` bytes, this will return an `error.buffer-len` containing the required size. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_header_values(self, name: str, max_len: int, cursor: int) -> Tuple[bytes, Optional[int]]: @@ -129,7 +129,7 @@ def get_header_values(self, name: str, max_len: int, cursor: int) -> Tuple[bytes fit, or `none` if all the remaining values fit. If `max-len` is too small to fit any value, an `error.buffer-len` error is returned, providing a recommended buffer size. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def set_header_values(self, name: str, values: bytes) -> None: @@ -137,7 +137,7 @@ def set_header_values(self, name: str, values: bytes) -> None: Sets the values for the given header name, replacing any headers that previously existed for that name. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def insert_header(self, name: str, value: bytes) -> None: @@ -145,7 +145,7 @@ def insert_header(self, name: str, value: bytes) -> None: Sets a request header to the given value, discarding any previous values for the given header name. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def append_header(self, name: str, value: bytes) -> None: @@ -154,7 +154,7 @@ def append_header(self, name: str, value: bytes) -> None: Unlike `set-header-values`, this does not discard existing values for the same header name. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def remove_header(self, name: str) -> None: @@ -163,49 +163,49 @@ def remove_header(self, name: str) -> None: Returns `ok` if any headers were successfully removed. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_method(self, max_len: int) -> str: """ Gets the request method. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def set_method(self, method: str) -> None: """ Sets the request method. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_uri(self, max_len: int) -> str: """ Gets the request URI. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def set_uri(self, uri: str) -> None: """ Sets the request URI. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_version(self) -> http_types.HttpVersion: """ Gets the HTTP version of this request. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def set_version(self, version: http_types.HttpVersion) -> None: """ Sets the HTTP version of this request. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def set_auto_decompress_response(self, encodings: http_types.ContentEncodings) -> None: @@ -219,7 +219,7 @@ def set_auto_decompress_response(self, encodings: http_types.ContentEncodings) - Not all of the flags defined in `content-encodings` are supported. Currently the only supported flag is `content-encodings.gzip`. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def redirect_to_websocket_proxy(self, backend: backend.Backend) -> None: @@ -236,7 +236,7 @@ def redirect_to_websocket_proxy(self, backend: backend.Backend) -> None: [WebSockets passthrough]: https://www.fastly.com/documentation/guides/concepts/real-time-messaging/websockets-tunnel/ - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def set_framing_headers_mode(self, mode: http_types.FramingHeadersMode) -> None: @@ -244,12 +244,12 @@ def set_framing_headers_mode(self, mode: http_types.FramingHeadersMode) -> None: Sets how the framing headers `Content-Length` and `Transfer-Encoding` will be determined when sending this request. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def redirect_to_grip_proxy(self, backend: backend.Backend) -> None: """ - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def __enter__(self) -> Self: @@ -462,7 +462,7 @@ def send(request: Request, body: async_io.Pollable, backend: backend.Backend) -> Returns once the response headers have been received, or an error occurs. - Raises: `wit_world.types.Err(wit_world.imports.http_req.ErrorWithDetail)` + Raises: `componentize_py_types.Err(wit_world.imports.http_req.ErrorWithDetail)` """ raise NotImplementedError def send_uncached(request: Request, body: async_io.Pollable, backend: backend.Backend) -> Tuple[http_resp.Response, async_io.Pollable]: @@ -472,7 +472,7 @@ def send_uncached(request: Request, body: async_io.Pollable, backend: backend.Ba Returns once the response headers have been received, or an error occurs. - Raises: `wit_world.types.Err(wit_world.imports.http_req.ErrorWithDetail)` + Raises: `componentize_py_types.Err(wit_world.imports.http_req.ErrorWithDetail)` """ raise NotImplementedError def send_async(request: Request, body: async_io.Pollable, backend: backend.Backend) -> async_io.Pollable: @@ -493,7 +493,7 @@ def send_async(request: Request, body: async_io.Pollable, backend: backend.Backe able to run, as the request will continue sending even after the program that initiated it exits. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def send_async_uncached(request: Request, body: async_io.Pollable, backend: backend.Backend) -> async_io.Pollable: @@ -504,7 +504,7 @@ def send_async_uncached(request: Request, body: async_io.Pollable, backend: back backend server without performing any caching or inserting any cache-related headers in the response. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def send_async_streaming(request: Request, body: async_io.Pollable, backend: backend.Backend) -> async_io.Pollable: @@ -526,7 +526,7 @@ def send_async_streaming(request: Request, body: async_io.Pollable, backend: bac and transmission of the request body and headers will continue in the background. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def send_async_uncached_streaming(request: Request, body: async_io.Pollable, backend: backend.Backend) -> async_io.Pollable: @@ -537,7 +537,7 @@ def send_async_uncached_streaming(request: Request, body: async_io.Pollable, bac backend server without performing any caching or inserting any cache-related headers in the response. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def await_response(pending: async_io.Pollable) -> Tuple[http_resp.Response, async_io.Pollable]: @@ -545,7 +545,7 @@ def await_response(pending: async_io.Pollable) -> Tuple[http_resp.Response, asyn Waits until the request is completed, and then returns the resulting response and body. - Raises: `wit_world.types.Err(wit_world.imports.http_req.ErrorWithDetail)` + Raises: `componentize_py_types.Err(wit_world.imports.http_req.ErrorWithDetail)` """ raise NotImplementedError def close(request: Request) -> None: @@ -555,11 +555,11 @@ def close(request: Request) -> None: A `request` is automatically consumed when you send a request. You should call `close` only if you have a `request` you don't intend to use anymore. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def upgrade_websocket(backend: backend.Backend) -> None: """ - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError diff --git a/fastly_compute/testing/stubs/wit_world/imports/http_resp.py b/fastly_compute/testing/stubs/wit_world/imports/http_resp.py index a295a8f..3e2a4f4 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/http_resp.py +++ b/fastly_compute/testing/stubs/wit_world/imports/http_resp.py @@ -11,8 +11,8 @@ import weakref from componentize_py_types import Result, Ok, Err, Some -from ..imports import http_types from ..imports import types +from ..imports import http_types from ..imports import async_io class KeepaliveMode(Enum): @@ -31,7 +31,7 @@ def new(cls) -> Self: The new `response` is created with status code 200 OK, no headers, and an empty body. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_header_names(self, max_len: int, cursor: int) -> Tuple[str, Optional[int]]: @@ -44,7 +44,7 @@ def get_header_names(self, max_len: int, cursor: int) -> Tuple[str, Optional[int or `none` if all the remaining names fit. If `max-len` is too small to fit any name, an `error.buffer-len` error is returned, providing a recommended buffer size. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_header_value(self, name: str, max_len: int) -> Optional[bytes]: @@ -57,7 +57,7 @@ def get_header_value(self, name: str, max_len: int) -> Optional[bytes]: If header name requires more than `max-len` bytes, this will return an `error.buffer-len` containing the required size. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_header_values(self, name: str, max_len: int, cursor: int) -> Tuple[bytes, Optional[int]]: @@ -72,7 +72,7 @@ def get_header_values(self, name: str, max_len: int, cursor: int) -> Tuple[bytes fit, or `none` if all the remaining values fit. If `max-len` is too small to fit any value, an `error.buffer-len` error is returned, providing a recommended buffer size. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def set_header_values(self, name: str, values: bytes) -> None: @@ -80,7 +80,7 @@ def set_header_values(self, name: str, values: bytes) -> None: Sets the values for the given header name, replacing any headers that previously existed for that name. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def insert_header(self, name: str, value: bytes) -> None: @@ -88,7 +88,7 @@ def insert_header(self, name: str, value: bytes) -> None: Sets a response header to the given value, discarding any previous values for the given header name. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def append_header(self, name: str, value: bytes) -> None: @@ -97,7 +97,7 @@ def append_header(self, name: str, value: bytes) -> None: Unlike `set-header-values`, this does not discard existing values for the same header name. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def remove_header(self, name: str) -> None: @@ -106,35 +106,35 @@ def remove_header(self, name: str) -> None: Returns `ok` if any headers were successfully removed. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_version(self) -> http_types.HttpVersion: """ Gets the HTTP version of this response. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def set_version(self, version: http_types.HttpVersion) -> None: """ Sets the HTTP version of this response. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_status(self) -> int: """ Gets the HTTP status code of the response. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def set_status(self, status: int) -> None: """ Sets the HTTP status code of the response. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def set_framing_headers_mode(self, mode: http_types.FramingHeadersMode) -> None: @@ -142,14 +142,14 @@ def set_framing_headers_mode(self, mode: http_types.FramingHeadersMode) -> None: Sets how the framing headers `Content-Length` and `Transfer-Encoding` will be determined when sending this response. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def set_http_keepalive_mode(self, mode: KeepaliveMode) -> None: """ Adjust the response's connection reuse mode. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def get_remote_ip_addr(self) -> Optional[types.IpAddress]: @@ -184,7 +184,7 @@ def send_downstream(response: Response, body: async_io.Pollable) -> None: Data for the body must be written before calling this function. To start a response and write data to it afterwards, use `send-downstream-streaming` instead. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def send_downstream_streaming(response: Response, body: async_io.Pollable) -> None: @@ -193,7 +193,7 @@ def send_downstream_streaming(response: Response, body: async_io.Pollable) -> No The body is left open, allowing data to be written after calling this function. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def close(response: Response) -> None: @@ -204,6 +204,6 @@ def close(response: Response) -> None: client. You should call `close` only if you have a `response` you don't intend to use anymore. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError diff --git a/fastly_compute/testing/stubs/wit_world/imports/image_optimizer.py b/fastly_compute/testing/stubs/wit_world/imports/image_optimizer.py index 8fe144c..8ca24d9 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/image_optimizer.py +++ b/fastly_compute/testing/stubs/wit_world/imports/image_optimizer.py @@ -13,10 +13,10 @@ import weakref from componentize_py_types import Result, Ok, Err, Some -from ..imports import http_req from ..imports import backend from ..imports import async_io from ..imports import http_resp +from ..imports import http_req class ExtraImageOptimizerTransformOptions: """ @@ -42,6 +42,6 @@ class ImageOptimizerTransformOptions: def transform_image_optimizer_request(origin_image_request: http_req.Request, origin_image_request_body: Optional[async_io.Pollable], origin_image_request_backend: backend.Backend, io_transform_options: ImageOptimizerTransformOptions) -> Tuple[http_resp.Response, async_io.Pollable]: """ - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError diff --git a/fastly_compute/testing/stubs/wit_world/imports/kv_store.py b/fastly_compute/testing/stubs/wit_world/imports/kv_store.py index e9d3bd0..8da2a70 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/kv_store.py +++ b/fastly_compute/testing/stubs/wit_world/imports/kv_store.py @@ -36,7 +36,7 @@ def metadata(self, max_len: int) -> Optional[str]: """ Read the metadata of the KV Store item, if present. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def generation(self) -> int: @@ -202,7 +202,7 @@ def open(cls, name: str) -> Self: """ Opens the KV Store with the given name. - Raises: `wit_world.types.Err(wit_world.imports.types.OpenError)` + Raises: `componentize_py_types.Err(wit_world.imports.types.OpenError)` """ raise NotImplementedError def lookup(self, key: str) -> Optional[Entry]: @@ -214,7 +214,7 @@ def lookup(self, key: str) -> Optional[Entry]: This function waits until the operation completes. - Raises: `wit_world.types.Err(wit_world.imports.kv_store.KvError)` + Raises: `componentize_py_types.Err(wit_world.imports.kv_store.KvError)` """ raise NotImplementedError def lookup_async(self, key: str) -> async_io.Pollable: @@ -224,7 +224,7 @@ def lookup_async(self, key: str) -> async_io.Pollable: This function initiates an async lookup of a value in the KV Store. Use `await-lookup` to finish the lookup. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def insert(self, key: str, body: async_io.Pollable, options: InsertOptions) -> None: @@ -236,7 +236,7 @@ def insert(self, key: str, body: async_io.Pollable, options: InsertOptions) -> N This function waits until the operation completes. - Raises: `wit_world.types.Err(wit_world.imports.kv_store.KvError)` + Raises: `componentize_py_types.Err(wit_world.imports.kv_store.KvError)` """ raise NotImplementedError def insert_async(self, key: str, body: async_io.Pollable, options: InsertOptions) -> async_io.Pollable: @@ -249,7 +249,7 @@ def insert_async(self, key: str, body: async_io.Pollable, options: InsertOptions This function initiates an async insert of a value in the KV Store. Use `await-insert` to finish the lookup. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def delete(self, key: str) -> bool: @@ -261,7 +261,7 @@ def delete(self, key: str) -> bool: This function waits until the operation completes. - Raises: `wit_world.types.Err(wit_world.imports.kv_store.KvError)` + Raises: `componentize_py_types.Err(wit_world.imports.kv_store.KvError)` """ raise NotImplementedError def delete_async(self, key: str) -> async_io.Pollable: @@ -271,7 +271,7 @@ def delete_async(self, key: str) -> async_io.Pollable: This function initiates an async delete of a value in the KV Store. Use `await-delete` to finish the lookup. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def list(self, options: ListOptions) -> async_io.Pollable: @@ -283,7 +283,7 @@ def list(self, options: ListOptions) -> async_io.Pollable: This function waits until the operation completes. - Raises: `wit_world.types.Err(wit_world.imports.kv_store.KvError)` + Raises: `componentize_py_types.Err(wit_world.imports.kv_store.KvError)` """ raise NotImplementedError def list_async(self, options: ListOptions) -> async_io.Pollable: @@ -293,7 +293,7 @@ def list_async(self, options: ListOptions) -> async_io.Pollable: This function initiates an async list value in the KV Store. Use `await-list` to finish the lookup. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def __enter__(self) -> Self: @@ -315,7 +315,7 @@ def await_lookup(handle: async_io.Pollable) -> Optional[Entry]: Returns `ok(some(v))` with the value `v` that was found, `ok(none)` if no value was found, or `err(e)` indicating the error `e` occurred. - Raises: `wit_world.types.Err(wit_world.imports.kv_store.KvError)` + Raises: `componentize_py_types.Err(wit_world.imports.kv_store.KvError)` """ raise NotImplementedError def await_insert(handle: async_io.Pollable) -> None: @@ -324,7 +324,7 @@ def await_insert(handle: async_io.Pollable) -> None: Returns `ok` if the `insert` succeeded, or an error code on failure. - Raises: `wit_world.types.Err(wit_world.imports.kv_store.KvError)` + Raises: `componentize_py_types.Err(wit_world.imports.kv_store.KvError)` """ raise NotImplementedError def await_delete(handle: async_io.Pollable) -> bool: @@ -334,7 +334,7 @@ def await_delete(handle: async_io.Pollable) -> bool: Returns `ok(true)` if a value was successfully deleted, `ok(false)` if no value was found, or `err(e)` indicating the error `e` occurred. - Raises: `wit_world.types.Err(wit_world.imports.kv_store.KvError)` + Raises: `componentize_py_types.Err(wit_world.imports.kv_store.KvError)` """ raise NotImplementedError def await_list(handle: async_io.Pollable) -> async_io.Pollable: @@ -344,6 +344,6 @@ def await_list(handle: async_io.Pollable) -> async_io.Pollable: Returns `ok(b)` with the JSON-encoded body `b` on success, or `err(e)` indicating the error `e` occurred. - Raises: `wit_world.types.Err(wit_world.imports.kv_store.KvError)` + Raises: `componentize_py_types.Err(wit_world.imports.kv_store.KvError)` """ raise NotImplementedError diff --git a/fastly_compute/testing/stubs/wit_world/imports/log.py b/fastly_compute/testing/stubs/wit_world/imports/log.py index 1b326a4..977415a 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/log.py +++ b/fastly_compute/testing/stubs/wit_world/imports/log.py @@ -35,7 +35,7 @@ def open(cls, name: str) -> Self: to that endpoint will succeed. Refer to your service dashboard to diagnose missing log events. - Raises: `wit_world.types.Err(wit_world.imports.types.OpenError)` + Raises: `componentize_py_types.Err(wit_world.imports.types.OpenError)` """ raise NotImplementedError def write(self, msg: bytes) -> None: diff --git a/fastly_compute/testing/stubs/wit_world/imports/purge.py b/fastly_compute/testing/stubs/wit_world/imports/purge.py index be6ab32..39f0c9f 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/purge.py +++ b/fastly_compute/testing/stubs/wit_world/imports/purge.py @@ -45,7 +45,7 @@ def purge_surrogate_key(surrogate_keys: str, purge_options: PurgeOptions) -> Non A surrogate key must contain only printable ASCII characters (those between `0x21` and `0x7E`, inclusive). - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def purge_surrogate_key_verbose(surrogate_keys: str, purge_options: PurgeOptions, max_len: int) -> str: @@ -58,6 +58,6 @@ def purge_surrogate_key_verbose(surrogate_keys: str, purge_options: PurgeOptions [JSON purge response]: https://developer.fastly.com/reference/api/purging/#purge-tag - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError diff --git a/fastly_compute/testing/stubs/wit_world/imports/secret_store.py b/fastly_compute/testing/stubs/wit_world/imports/secret_store.py index b8a8687..0f6bb16 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/secret_store.py +++ b/fastly_compute/testing/stubs/wit_world/imports/secret_store.py @@ -37,14 +37,14 @@ def from_bytes(cls, bytes: bytes) -> Self: As the early note says, this `secret` will be local to the current sandbox, and will not be shared with other instances of this service. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def plaintext(self, max_len: int) -> bytes: """ Returns the plaintext value of this secret. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def __enter__(self) -> Self: @@ -68,7 +68,7 @@ def open(cls, name: str) -> Self: """ Opens the Secret Store with the given name. - Raises: `wit_world.types.Err(wit_world.imports.types.OpenError)` + Raises: `componentize_py_types.Err(wit_world.imports.types.OpenError)` """ raise NotImplementedError def get(self, key: str) -> Optional[Secret]: @@ -78,7 +78,7 @@ def get(self, key: str) -> Optional[Secret]: If successful, this method returns `ok(some(s))` containing the found secret `s` if the secret is found, or `ok(none)` if the secret was not found. - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def __enter__(self) -> Self: diff --git a/fastly_compute/testing/stubs/wit_world/imports/security.py b/fastly_compute/testing/stubs/wit_world/imports/security.py index 06b4ccf..9af91ba 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/security.py +++ b/fastly_compute/testing/stubs/wit_world/imports/security.py @@ -13,9 +13,9 @@ import weakref from componentize_py_types import Result, Ok, Err, Some +from ..imports import types from ..imports import async_io from ..imports import http_req -from ..imports import types class ExtraInspectOptions: """ @@ -52,6 +52,6 @@ def inspect(request: http_req.Request, body: async_io.Pollable, options: Inspect [NGWAF]: https://docs.fastly.com/en/ngwaf/ - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError diff --git a/fastly_compute/testing/stubs/wit_world/imports/shielding.py b/fastly_compute/testing/stubs/wit_world/imports/shielding.py index 07694a0..ebd0ab0 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/shielding.py +++ b/fastly_compute/testing/stubs/wit_world/imports/shielding.py @@ -41,11 +41,11 @@ def __exit__(self, exc_type: type[BaseException] | None, exc_value: BaseExceptio def shield_info(name: str, max_len: int) -> str: """ - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError def backend_for_shield(name: str, options: Optional[ShieldBackendOptions]) -> backend.Backend: """ - Raises: `wit_world.types.Err(wit_world.imports.types.Error)` + Raises: `componentize_py_types.Err(wit_world.imports.types.Error)` """ raise NotImplementedError diff --git a/fastly_compute/testing/stubs/wit_world/imports/streams.py b/fastly_compute/testing/stubs/wit_world/imports/streams.py index fc14206..3fc7b3d 100644 --- a/fastly_compute/testing/stubs/wit_world/imports/streams.py +++ b/fastly_compute/testing/stubs/wit_world/imports/streams.py @@ -76,7 +76,7 @@ def read(self, len: int) -> bytes: as a return value by the callee. The callee may return a list of bytes less than `len` in size while more bytes are available for reading. - Raises: `wit_world.types.Err(wit_world.imports.streams.StreamError)` + Raises: `componentize_py_types.Err(wit_world.imports.streams.StreamError)` """ raise NotImplementedError def blocking_read(self, len: int) -> bytes: @@ -84,7 +84,7 @@ def blocking_read(self, len: int) -> bytes: Read bytes from a stream, after blocking until at least one byte can be read. Except for blocking, behavior is identical to `read`. - Raises: `wit_world.types.Err(wit_world.imports.streams.StreamError)` + Raises: `componentize_py_types.Err(wit_world.imports.streams.StreamError)` """ raise NotImplementedError def skip(self, len: int) -> int: @@ -94,7 +94,7 @@ def skip(self, len: int) -> int: Behaves identical to `read`, except instead of returning a list of bytes, returns the number of bytes consumed from the stream. - Raises: `wit_world.types.Err(wit_world.imports.streams.StreamError)` + Raises: `componentize_py_types.Err(wit_world.imports.streams.StreamError)` """ raise NotImplementedError def blocking_skip(self, len: int) -> int: @@ -102,7 +102,7 @@ def blocking_skip(self, len: int) -> int: Skip bytes from a stream, after blocking until at least one byte can be skipped. Except for blocking behavior, identical to `skip`. - Raises: `wit_world.types.Err(wit_world.imports.streams.StreamError)` + Raises: `componentize_py_types.Err(wit_world.imports.streams.StreamError)` """ raise NotImplementedError def subscribe(self) -> poll.Pollable: @@ -154,7 +154,7 @@ def check_write(self) -> int: become ready when this function will report at least 1 byte, or an error. - Raises: `wit_world.types.Err(wit_world.imports.streams.StreamError)` + Raises: `componentize_py_types.Err(wit_world.imports.streams.StreamError)` """ raise NotImplementedError def write(self, contents: bytes) -> None: @@ -173,7 +173,7 @@ def write(self, contents: bytes) -> None: returns Err(closed) without writing if the stream has closed since the last call to check-write provided a permit. - Raises: `wit_world.types.Err(wit_world.imports.streams.StreamError)` + Raises: `componentize_py_types.Err(wit_world.imports.streams.StreamError)` """ raise NotImplementedError def blocking_write_and_flush(self, contents: bytes) -> None: @@ -203,7 +203,7 @@ def blocking_write_and_flush(self, contents: bytes) -> None: let _ = this.check-write(); // eliding error handling ``` - Raises: `wit_world.types.Err(wit_world.imports.streams.StreamError)` + Raises: `componentize_py_types.Err(wit_world.imports.streams.StreamError)` """ raise NotImplementedError def flush(self) -> None: @@ -219,7 +219,7 @@ def flush(self) -> None: completed. The `subscribe` pollable will become ready when the flush has completed and the stream can accept more writes. - Raises: `wit_world.types.Err(wit_world.imports.streams.StreamError)` + Raises: `componentize_py_types.Err(wit_world.imports.streams.StreamError)` """ raise NotImplementedError def blocking_flush(self) -> None: @@ -227,7 +227,7 @@ def blocking_flush(self) -> None: Request to flush buffered output, and block until flush completes and stream is ready for writing again. - Raises: `wit_world.types.Err(wit_world.imports.streams.StreamError)` + Raises: `componentize_py_types.Err(wit_world.imports.streams.StreamError)` """ raise NotImplementedError def subscribe(self) -> poll.Pollable: @@ -253,7 +253,7 @@ def write_zeroes(self, len: int) -> None: passing a list of bytes, you simply pass the number of zero-bytes that should be written. - Raises: `wit_world.types.Err(wit_world.imports.streams.StreamError)` + Raises: `componentize_py_types.Err(wit_world.imports.streams.StreamError)` """ raise NotImplementedError def blocking_write_zeroes_and_flush(self, len: int) -> None: @@ -283,7 +283,7 @@ def blocking_write_zeroes_and_flush(self, len: int) -> None: let _ = this.check-write(); // eliding error handling ``` - Raises: `wit_world.types.Err(wit_world.imports.streams.StreamError)` + Raises: `componentize_py_types.Err(wit_world.imports.streams.StreamError)` """ raise NotImplementedError def splice(self, src: InputStream, len: int) -> int: @@ -302,7 +302,7 @@ def splice(self, src: InputStream, len: int) -> int: This function returns the number of bytes transferred; it may be less than `len`. - Raises: `wit_world.types.Err(wit_world.imports.streams.StreamError)` + Raises: `componentize_py_types.Err(wit_world.imports.streams.StreamError)` """ raise NotImplementedError def blocking_splice(self, src: InputStream, len: int) -> int: @@ -313,7 +313,7 @@ def blocking_splice(self, src: InputStream, len: int) -> int: `output-stream` is ready for writing, and the `input-stream` is ready for reading, before performing the `splice`. - Raises: `wit_world.types.Err(wit_world.imports.streams.StreamError)` + Raises: `componentize_py_types.Err(wit_world.imports.streams.StreamError)` """ raise NotImplementedError def __enter__(self) -> Self: diff --git a/pyproject.toml b/pyproject.toml index fb9ca74..b52ec60 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,6 @@ test = [ "syrupy (==5.0.0)", ] dev = [ - "componentize-py (>=0.19.3,<0.20)", "ruff (>=0.12.11,<0.13.0)", "pyrefly (>=0.49.0,<0.50)", ] diff --git a/uv.lock b/uv.lock index 24204bf..f764ffc 100644 --- a/uv.lock +++ b/uv.lock @@ -123,19 +123,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] -[[package]] -name = "componentize-py" -version = "0.19.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/fd/8b04b29f7321a2cb9a290be015b45f6c776838b5b3abfa1dbc677910aee8/componentize_py-0.19.3.tar.gz", hash = "sha256:09a3cf44dd4d85340e127467cf211817fb339e8673b2eb113527663635452ee2", size = 172756, upload-time = "2025-11-24T21:18:13.345Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/87/cc02b37ceeacf4ecbf1325e01d45484bbc6b69ffb17f723f74cb57253eec/componentize_py-0.19.3-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:0cd9ebe222947da39425c80293c9ee76e8657e6faf7a6dea8d7f98c8a4e5aa64", size = 23592460, upload-time = "2025-11-24T21:17:42.849Z" }, - { url = "https://files.pythonhosted.org/packages/3d/a6/d4d4d6615b2bf312f169387e91414d5f24dbae8b8ffe1a1a38fd33b787b7/componentize_py-0.19.3-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:c41e26785767ef5d2235216a61bae9263c85c6bfe94149484f84c2441c228d9e", size = 22839205, upload-time = "2025-11-24T21:17:50.42Z" }, - { url = "https://files.pythonhosted.org/packages/95/cc/a3d94927fb510320ec07773eb3fb50e5ce4a6fe9bc08c4af9c8a34d849d6/componentize_py-0.19.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3c739ac68f7308dfeda4a56b6abfbaa786ef5d1752365536869b5a02de3fcc42", size = 23942495, upload-time = "2025-11-24T21:17:57.451Z" }, - { url = "https://files.pythonhosted.org/packages/42/34/94be4922fa52986138075f6ca98e4a775112b57145906a9dc34b3d8fdb06/componentize_py-0.19.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:38090c8ad642fbf754bcab9d9940ae73a9b4ca3f226eadfe48e7e9158cdf20d5", size = 24337701, upload-time = "2025-11-24T21:18:04.408Z" }, - { url = "https://files.pythonhosted.org/packages/9b/9d/53c8548a6a8f903e63a70b113cf316520320f7cc9dd2ba102c1af0bb36e1/componentize_py-0.19.3-cp39-abi3-win_amd64.whl", hash = "sha256:f8ddd953c674460fb988cd5d8d2f72045c54df1e76880f7515451eb81ccd320f", size = 22308097, upload-time = "2025-11-24T21:18:11.276Z" }, -] - [[package]] name = "fastly-compute" version = "0.1.0" @@ -143,7 +130,6 @@ source = { editable = "." } [package.optional-dependencies] dev = [ - { name = "componentize-py" }, { name = "pyrefly" }, { name = "ruff" }, ] @@ -169,7 +155,6 @@ dev = [ requires-dist = [ { name = "bottle", marker = "extra == 'examples'", specifier = ">=0.12.25" }, { name = "bottle", marker = "extra == 'test'", specifier = ">=0.12.25" }, - { name = "componentize-py", marker = "extra == 'dev'", specifier = ">=0.19.3,<0.20" }, { name = "flask", marker = "extra == 'examples'", specifier = ">=3.1.2,<4.0" }, { name = "pyrefly", marker = "extra == 'dev'", specifier = ">=0.49.0,<0.50" }, { name = "pytest", marker = "extra == 'test'", specifier = ">=8.4.0,<9.0.0" },