diff --git a/.gitignore b/.gitignore index 762878fb..1b802eaa 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,4 @@ __pycache__ .mcp.json .claude CLAUDE.md -.kli/** \ No newline at end of file +*.xml \ No newline at end of file diff --git a/README.md b/README.md index 8e1d30ff..4b9c2da5 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ Once you have a Mojo project set up locally, ```toml [dependencies] - lightbug_http = ">=0.26.1.2,<0.26.2" + lightbug_http = ">=0.26.2.0,<0.26.3" ``` 3. Run `pixi install` at the root of your project, where `pixi.toml` is located @@ -151,6 +151,33 @@ struct ExampleRouter(HTTPService): We plan to add more advanced routing functionality in a future library called `lightbug_api`, see [Roadmap](#roadmap) for more details. +### JSON + +Use `json_decode[T]` to deserialize a request body into a typed struct, and `Json(value)` to return a JSON response: + +```mojo +from lightbug_http import OK, HTTPRequest, HTTPResponse, HTTPService +from lightbug_http.http.json import Json, json_decode + +@fieldwise_init +struct GreetRequest(Movable, Defaultable): + var name: String + fn __init__(out self): self.name = "" + +@fieldwise_init +struct GreetResponse(Movable, Defaultable): + var message: String + fn __init__(out self): self.message = "" + +@fieldwise_init +struct JsonService(HTTPService): + fn func(mut self, req: HTTPRequest) raises -> HTTPResponse: + var body = json_decode[GreetRequest](req) + return OK(Json(GreetResponse(String("Hello, ", body.name, "!")))) +``` + +JSON support is powered by [emberjson](https://github.com/bgreni/EmberJson). +

(back to top)

@@ -190,7 +217,7 @@ Check out the examples directory for more example services built with Lightbug, We're working on support for the following (contributors welcome!): - - [ ] [JSON support](https://github.com/saviorand/lightbug_http/issues/4) + - [x] [JSON support](https://github.com/saviorand/lightbug_http/issues/4) - [ ] Complete HTTP/1.x support compliant with RFC 9110/9112 specs (see issues) - [ ] [SSL/HTTPS support](https://github.com/saviorand/lightbug_http/issues/20) - [ ] [Multiple simultaneous connections](https://github.com/saviorand/lightbug_http/issues/5), [parallelization and performance optimizations](https://github.com/saviorand/lightbug_http/issues/6) diff --git a/examples/echo_server/pixi.toml b/examples/echo_server/pixi.toml index 229147a9..f277d729 100644 --- a/examples/echo_server/pixi.toml +++ b/examples/echo_server/pixi.toml @@ -11,7 +11,7 @@ server = "mojo run server.mojo" client = "mojo run client.mojo" [dependencies] -mojo = ">=0.26.1.0,<0.26.2.0" +mojo = ">=0.26.2.0,<0.26.3" curl_wrapper = { git = "https://github.com/thatstoasty/mojo-curl.git", branch = "main", subdirectory = "shim" } floki = ">=0.1.0,<0.2" -lightbug_http = ">=0.26.1.2,<0.26.2.0" +lightbug_http = ">=0.26.2.0,<0.26.3" diff --git a/examples/json_service/README.md b/examples/json_service/README.md new file mode 100644 index 00000000..93a5d19f --- /dev/null +++ b/examples/json_service/README.md @@ -0,0 +1,18 @@ +# JSON Service + +A simple JSON API example using `lightbug_http`. The server accepts a POST request with a JSON body and returns a JSON response. + +To run the server: + +```bash +pixi run server +``` + +Then send a request: + +```bash +curl -X POST http://localhost:8080/greet \ + -H "Content-Type: application/json" \ + -d '{"name": "Alice"}' +# {"message":"Hello, Alice!"} +``` diff --git a/examples/json_service/pixi.toml b/examples/json_service/pixi.toml new file mode 100644 index 00000000..ea7dceb7 --- /dev/null +++ b/examples/json_service/pixi.toml @@ -0,0 +1,13 @@ +[workspace] +channels = ["https://conda.modular.com/max", "https://repo.prefix.dev/modular-community", "https://repo.prefix.dev/mojo-community", "conda-forge"] +name = "json_service" +platforms = ["osx-arm64", "linux-64", "linux-aarch64"] +version = "0.1.0" +preview = ["pixi-build"] + +[tasks] +server = "mojo run server.mojo" + +[dependencies] +mojo = ">=2.0,<0.26.3" +lightbug_http = ">=0.26.2.0,<0.26.3" diff --git a/examples/json_service/server.mojo b/examples/json_service/server.mojo new file mode 100644 index 00000000..e4d4a2ac --- /dev/null +++ b/examples/json_service/server.mojo @@ -0,0 +1,34 @@ +from lightbug_http import OK, NotFound, HTTPRequest, HTTPResponse, HTTPService, Server +from lightbug_http.http.json import Json, json_decode + + +@fieldwise_init +struct GreetRequest(Movable, Defaultable): + var name: String + + fn __init__(out self): + self.name = "" + + +@fieldwise_init +struct GreetResponse(Movable, Defaultable): + var message: String + + fn __init__(out self): + self.message = "" + + +@fieldwise_init +struct JsonService(HTTPService): + fn func(mut self, req: HTTPRequest) raises -> HTTPResponse: + if req.uri.path == "/greet": + var body = json_decode[GreetRequest](req) + var response = GreetResponse(String("Hello, ", body.name, "!")) + return OK(Json(response)) + return NotFound(req.uri.path) + + +fn main() raises: + var server = Server() + var handler = JsonService() + server.listen_and_serve("localhost:8080", handler) diff --git a/lightbug.mojo b/lightbug.mojo new file mode 100644 index 00000000..2ae1823c --- /dev/null +++ b/lightbug.mojo @@ -0,0 +1,13 @@ +from lightbug_http import Welcome +from lightbug_http.server import Server +from std.os.env import getenv + + +fn main() raises: + var server = Server() + var handler = Welcome() + + var host = getenv("DEFAULT_SERVER_HOST", "localhost") + var port = getenv("DEFAULT_SERVER_PORT", "8080") + + server.listen_and_serve(host + ":" + port, handler) diff --git a/lightbug_http/__init__.mojo b/lightbug_http/__init__.mojo index 65fed45f..706df32e 100644 --- a/lightbug_http/__init__.mojo +++ b/lightbug_http/__init__.mojo @@ -4,4 +4,4 @@ from lightbug_http.service import Counter, HTTPService, Welcome from lightbug_http.uri import URI from lightbug_http.cookie import Cookie, RequestCookieJar, ResponseCookieJar -from lightbug_http.http import OK, HTTPRequest, HTTPResponse, NotFound, SeeOther, StatusCode +from lightbug_http.http import OK, HTTPRequest, HTTPResponse, NotFound, SeeOther, StatusCode, Json, json_decode, JsonSerializable, JsonDeserializable diff --git a/lightbug_http/address.mojo b/lightbug_http/address.mojo index 2f992c38..4141b546 100644 --- a/lightbug_http/address.mojo +++ b/lightbug_http/address.mojo @@ -1,4 +1,4 @@ -from sys.ffi import CompilationTarget, c_char, c_int, c_uchar, external_call +from std.ffi import CompilationTarget, c_char, c_int, c_uchar, external_call from lightbug_http.c.address import AddressFamily, AddressLength from lightbug_http.c.aliases import ExternalImmutUnsafePointer, ExternalMutUnsafePointer, c_void @@ -15,7 +15,7 @@ from lightbug_http.c.network import ( from lightbug_http.c.socket import SocketType, socket from lightbug_http.socket import Socket from lightbug_http.utils.error import CustomError -from utils import Variant +from std.utils import Variant comptime MAX_PORT = 65535 @@ -37,8 +37,6 @@ trait Addr( Defaultable, Equatable, ImplicitlyCopyable, - Representable, - Stringable, Writable, ): comptime _type: StaticString @@ -266,8 +264,7 @@ struct UDPAddr[network: NetworkType = NetworkType.udp4](Addr, ImplicitlyCopyable @fieldwise_init -@register_passable("trivial") -struct addrinfo_macos(AnAddrInfo): +struct addrinfo_macos(AnAddrInfo, TrivialRegisterPassable): """ For MacOS, I had to swap the order of ai_canonname and ai_addr. https://stackoverflow.com/questions/53575101/calling-getaddrinfo-directly-from-python-ai-addr-is-null-pointer. @@ -307,8 +304,7 @@ struct addrinfo_macos(AnAddrInfo): @fieldwise_init -@register_passable("trivial") -struct addrinfo_unix(AnAddrInfo): +struct addrinfo_unix(AnAddrInfo, TrivialRegisterPassable): """Standard addrinfo struct for Unix systems. Overwrites the existing libc `getaddrinfo` function to adhere to the AnAddrInfo trait. """ @@ -361,8 +357,7 @@ fn get_ip_address( The IP address. """ - @parameter - if CompilationTarget.is_macos(): + comptime if CompilationTarget.is_macos(): var result: CAddrInfo[addrinfo_macos] var hints = addrinfo_macos( ai_flags=0, @@ -374,10 +369,10 @@ fn get_ip_address( try: result = getaddrinfo(host, service, hints) except getaddrinfo_err: - raise getaddrinfo_err + raise GetIPAddressError(getaddrinfo_err) if not result.unsafe_ptr()[].ai_addr: - raise GetaddrinfoNullAddrError() + raise GetIPAddressError(GetaddrinfoNullAddrError()) # extend result's lifetime to avoid invalid access of pointer, it'd get freed early return ( @@ -398,10 +393,10 @@ fn get_ip_address( try: result = getaddrinfo(host, service, hints) except getaddrinfo_err: - raise getaddrinfo_err + raise GetIPAddressError(getaddrinfo_err) if not result.unsafe_ptr()[].ai_addr: - raise GetaddrinfoNullAddrError() + raise GetIPAddressError(GetaddrinfoNullAddrError()) return ( result.unsafe_ptr()[] @@ -427,8 +422,7 @@ fn is_ipv6(network: NetworkType) -> Bool: @fieldwise_init -@register_passable("trivial") -struct ParseEmptyAddressError(CustomError): +struct ParseEmptyAddressError(CustomError, TrivialRegisterPassable): comptime message = "ParseError: Failed to parse address: received empty address string." fn write_to[W: Writer, //](self, mut writer: W): @@ -439,8 +433,7 @@ struct ParseEmptyAddressError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ParseMissingClosingBracketError(CustomError): +struct ParseMissingClosingBracketError(CustomError, TrivialRegisterPassable): comptime message = "ParseError: Failed to parse ipv6 address: missing ']'" fn write_to[W: Writer, //](self, mut writer: W): @@ -451,8 +444,7 @@ struct ParseMissingClosingBracketError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ParseMissingPortError(CustomError): +struct ParseMissingPortError(CustomError, TrivialRegisterPassable): comptime message = "ParseError: Failed to parse ipv6 address: missing port in address" fn write_to[W: Writer, //](self, mut writer: W): @@ -463,8 +455,7 @@ struct ParseMissingPortError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ParseUnexpectedBracketError(CustomError): +struct ParseUnexpectedBracketError(CustomError, TrivialRegisterPassable): comptime message = "ParseError: Address failed bracket validation, unexpectedly contained brackets" fn write_to[W: Writer, //](self, mut writer: W): @@ -475,8 +466,7 @@ struct ParseUnexpectedBracketError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ParseEmptyPortError(CustomError): +struct ParseEmptyPortError(CustomError, TrivialRegisterPassable): comptime message = "ParseError: Failed to parse port: port string is empty." fn write_to[W: Writer, //](self, mut writer: W): @@ -487,8 +477,7 @@ struct ParseEmptyPortError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ParseInvalidPortNumberError(CustomError): +struct ParseInvalidPortNumberError(CustomError, TrivialRegisterPassable): comptime message = "ParseError: Failed to parse port: invalid integer value." fn write_to[W: Writer, //](self, mut writer: W): @@ -499,8 +488,7 @@ struct ParseInvalidPortNumberError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ParsePortOutOfRangeError(CustomError): +struct ParsePortOutOfRangeError(CustomError, TrivialRegisterPassable): comptime message = "ParseError: Failed to parse port: Port number out of range (0-65535)." fn write_to[W: Writer, //](self, mut writer: W): @@ -511,8 +499,7 @@ struct ParsePortOutOfRangeError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ParseMissingSeparatorError(CustomError): +struct ParseMissingSeparatorError(CustomError, TrivialRegisterPassable): comptime message = "ParseError: Failed to parse address: missing port separator ':' in address." fn write_to[W: Writer, //](self, mut writer: W): @@ -523,8 +510,7 @@ struct ParseMissingSeparatorError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ParseTooManyColonsError(CustomError): +struct ParseTooManyColonsError(CustomError, TrivialRegisterPassable): comptime message = "ParseError: Failed to parse address: too many colons in address" fn write_to[W: Writer, //](self, mut writer: W): @@ -535,8 +521,7 @@ struct ParseTooManyColonsError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ParseIPProtocolPortError(CustomError): +struct ParseIPProtocolPortError(CustomError, TrivialRegisterPassable): comptime message = "ParseError: IP protocol addresses should not include ports" fn write_to[W: Writer, //](self, mut writer: W): @@ -547,8 +532,7 @@ struct ParseIPProtocolPortError(CustomError): @fieldwise_init -@register_passable("trivial") -struct GetaddrinfoNullAddrError(CustomError): +struct GetaddrinfoNullAddrError(CustomError, TrivialRegisterPassable): comptime message = "GetaddrinfoError: Failed to get IP address because the response's `ai_addr` was null." fn write_to[W: Writer, //](self, mut writer: W): @@ -559,8 +543,7 @@ struct GetaddrinfoNullAddrError(CustomError): @fieldwise_init -@register_passable("trivial") -struct GetaddrinfoError(CustomError): +struct GetaddrinfoError(CustomError, TrivialRegisterPassable): comptime message = "GetaddrinfoError: Failed to resolve address information." fn write_to[W: Writer, //](self, mut writer: W): @@ -570,125 +553,22 @@ struct GetaddrinfoError(CustomError): return Self.message -@fieldwise_init -struct GetIPAddressError(Movable, Stringable, Writable): - """Typed error variant for get_ip_address() function.""" - - comptime type = Variant[GetaddrinfoError, GetaddrinfoNullAddrError] - var value: Self.type - - @implicit - fn __init__(out self, value: GetaddrinfoError): - self.value = value - - @implicit - fn __init__(out self, value: GetaddrinfoNullAddrError): - self.value = value - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[GetaddrinfoError](): - writer.write(self.value[GetaddrinfoError]) - elif self.value.isa[GetaddrinfoNullAddrError](): - writer.write(self.value[GetaddrinfoNullAddrError]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) - - -@fieldwise_init -struct ParseError(Movable, Stringable, Writable): - """Typed error variant for address parsing functions.""" - - comptime type = Variant[ - ParseEmptyAddressError, - ParseMissingClosingBracketError, - ParseMissingPortError, - ParseUnexpectedBracketError, - ParseEmptyPortError, - ParseInvalidPortNumberError, - ParsePortOutOfRangeError, - ParseMissingSeparatorError, - ParseTooManyColonsError, - ParseIPProtocolPortError, - ] - var value: Self.type +comptime GetIPAddressError = Variant[GetaddrinfoError, GetaddrinfoNullAddrError] - @implicit - fn __init__(out self, value: ParseEmptyAddressError): - self.value = value - @implicit - fn __init__(out self, value: ParseMissingClosingBracketError): - self.value = value - - @implicit - fn __init__(out self, value: ParseMissingPortError): - self.value = value - - @implicit - fn __init__(out self, value: ParseUnexpectedBracketError): - self.value = value - - @implicit - fn __init__(out self, value: ParseEmptyPortError): - self.value = value - - @implicit - fn __init__(out self, value: ParseInvalidPortNumberError): - self.value = value - - @implicit - fn __init__(out self, value: ParsePortOutOfRangeError): - self.value = value - - @implicit - fn __init__(out self, value: ParseMissingSeparatorError): - self.value = value - - @implicit - fn __init__(out self, value: ParseTooManyColonsError): - self.value = value - - @implicit - fn __init__(out self, value: ParseIPProtocolPortError): - self.value = value - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[ParseEmptyAddressError](): - writer.write(self.value[ParseEmptyAddressError]) - elif self.value.isa[ParseMissingClosingBracketError](): - writer.write(self.value[ParseMissingClosingBracketError]) - elif self.value.isa[ParseMissingPortError](): - writer.write(self.value[ParseMissingPortError]) - elif self.value.isa[ParseUnexpectedBracketError](): - writer.write(self.value[ParseUnexpectedBracketError]) - elif self.value.isa[ParseEmptyPortError](): - writer.write(self.value[ParseEmptyPortError]) - elif self.value.isa[ParseInvalidPortNumberError](): - writer.write(self.value[ParseInvalidPortNumberError]) - elif self.value.isa[ParsePortOutOfRangeError](): - writer.write(self.value[ParsePortOutOfRangeError]) - elif self.value.isa[ParseMissingSeparatorError](): - writer.write(self.value[ParseMissingSeparatorError]) - elif self.value.isa[ParseTooManyColonsError](): - writer.write(self.value[ParseTooManyColonsError]) - elif self.value.isa[ParseIPProtocolPortError](): - writer.write(self.value[ParseIPProtocolPortError]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) +comptime ParseError = Variant[ + ParseEmptyAddressError, + ParseMissingClosingBracketError, + ParseMissingPortError, + ParseUnexpectedBracketError, + ParseEmptyPortError, + ParseInvalidPortNumberError, + ParsePortOutOfRangeError, + ParseMissingSeparatorError, + ParseTooManyColonsError, + ParseIPProtocolPortError, +] fn parse_ipv6_bracketed_address[ @@ -699,21 +579,21 @@ fn parse_ipv6_bracketed_address[ Returns: Tuple of (host, colon_index_offset). """ - if address[0:1] != "[": + if address[byte=0:1] != StringSlice("["): return address, UInt16(0) var end_bracket_index = address.find("]") if end_bracket_index == -1: - raise ParseMissingClosingBracketError() + raise ParseError(ParseMissingClosingBracketError()) if end_bracket_index + 1 == len(address): - raise ParseMissingPortError() + raise ParseError(ParseMissingPortError()) var colon_index = end_bracket_index + 1 - if address[colon_index : colon_index + 1] != ":": - raise ParseMissingPortError() + if address[byte=colon_index : colon_index + 1] != StringSlice(":"): + raise ParseError(ParseMissingPortError()) - return address[1:end_bracket_index], UInt16(end_bracket_index + 1) + return address[byte=1:end_bracket_index], UInt16(end_bracket_index + 1) fn validate_no_brackets[ @@ -723,29 +603,29 @@ fn validate_no_brackets[ var segment: StringSlice[origin] if end_idx is None: - segment = address[Int(start_idx) :] + segment = address[byte=Int(start_idx) :] else: - segment = address[Int(start_idx) : Int(end_idx.value())] + segment = address[byte=Int(start_idx) : Int(end_idx.value())] if segment.find("[") != -1: - raise ParseUnexpectedBracketError() + raise ParseError(ParseUnexpectedBracketError()) if segment.find("]") != -1: - raise ParseUnexpectedBracketError() + raise ParseError(ParseUnexpectedBracketError()) fn parse_port[origin: ImmutOrigin](port_str: StringSlice[origin]) raises ParseError -> UInt16: """Parse and validate port number.""" if port_str == AddressConstants.EMPTY: - raise ParseEmptyPortError() + raise ParseError(ParseEmptyPortError()) var port: Int try: port = Int(String(port_str)) except conversion_err: - raise ParseInvalidPortNumberError() + raise ParseError(ParseInvalidPortNumberError()) if port < MIN_PORT or port > MAX_PORT: - raise ParsePortOutOfRangeError() + raise ParseError(ParsePortOutOfRangeError()) return UInt16(port) @@ -774,29 +654,27 @@ fn parse_address[ Tuple containing the host and port. """ if address == AddressConstants.EMPTY: - raise ParseEmptyAddressError() + raise ParseError(ParseEmptyAddressError()) if address == AddressConstants.LOCALHOST: - @parameter - if network.is_ipv4(): + comptime if network.is_ipv4(): return HostPort(AddressConstants.IPV4_LOCALHOST, DEFAULT_IP_PORT) elif network.is_ipv6(): return HostPort(AddressConstants.IPV6_LOCALHOST, DEFAULT_IP_PORT) - @parameter - if network.is_ip_protocol(): + comptime if network.is_ip_protocol(): if network == NetworkType.ip6 and address.find(":") != -1: return HostPort(String(address), DEFAULT_IP_PORT) if address.find(":") != -1: - raise ParseIPProtocolPortError() + raise ParseError(ParseIPProtocolPortError()) return HostPort(String(address), DEFAULT_IP_PORT) var colon_index = address.rfind(":") if colon_index == -1: - raise ParseMissingSeparatorError() + raise ParseError(ParseMissingSeparatorError()) var host: StringSlice[origin] var port: UInt16 @@ -804,20 +682,19 @@ fn parse_address[ # TODO (Mikhail): StringSlice does byte level slicing, so this can be # invalid for multi-byte UTF-8 characters. Perhaps we instead assert that it's # an ascii string instead. - if address[0:1] == "[": + if address[byte=0:1] == "[": var bracket_offset: UInt16 (host, bracket_offset) = parse_ipv6_bracketed_address(address) validate_no_brackets(address, bracket_offset) else: - host = address[:colon_index] + host = address[byte=:colon_index] if host.find(":") != -1: - raise ParseTooManyColonsError() + raise ParseError(ParseTooManyColonsError()) - port = parse_port(address[colon_index + 1 :]) + port = parse_port(address[byte=colon_index + 1 :]) if host == AddressConstants.LOCALHOST: - @parameter - if network.is_ipv4(): + comptime if network.is_ipv4(): return HostPort(AddressConstants.IPV4_LOCALHOST, port) elif network.is_ipv6(): return HostPort(AddressConstants.IPV6_LOCALHOST, port) @@ -857,8 +734,7 @@ fn binary_ip_to_string[address_family: AddressFamily](ip_address: UInt32) raises The IP address as a string. """ - @parameter - if address_family == AddressFamily.AF_INET: + comptime if address_family == AddressFamily.AF_INET: return inet_ntop[address_family, AddressLength.INET_ADDRSTRLEN](ip_address) else: return inet_ntop[address_family, AddressLength.INET6_ADDRSTRLEN](ip_address) diff --git a/lightbug_http/c/address.mojo b/lightbug_http/c/address.mojo index 0cff7636..5163f287 100644 --- a/lightbug_http/c/address.mojo +++ b/lightbug_http/c/address.mojo @@ -1,11 +1,10 @@ -from sys.ffi import c_int +from std.ffi import c_int from lightbug_http.c.aliases import ExternalImmutUnsafePointer, ExternalMutUnsafePointer, c_void @fieldwise_init -@register_passable("trivial") -struct AddressInformation(Copyable, Equatable, Stringable, Writable): +struct AddressInformation(Copyable, Equatable, Writable, TrivialRegisterPassable): var value: c_int comptime AI_PASSIVE = Self(1) comptime AI_CANONNAME = Self(2) @@ -43,8 +42,7 @@ struct AddressInformation(Copyable, Equatable, Stringable, Writable): # TODO: These might vary on each platform...we should confirm this. # Taken from: https://github.com/openbsd/src/blob/master/sys/sys/socket.h#L250 @fieldwise_init -@register_passable("trivial") -struct AddressFamily(Copyable, Equatable, Stringable, Writable): +struct AddressFamily(Copyable, Equatable, Writable, TrivialRegisterPassable): var value: c_int comptime AF_UNSPEC = Self(0) comptime AF_INET = Self(2) @@ -73,8 +71,7 @@ struct AddressFamily(Copyable, Equatable, Stringable, Writable): @fieldwise_init -@register_passable("trivial") -struct AddressLength(Copyable, Equatable, Stringable, Writable): +struct AddressLength(Copyable, Equatable, Writable, TrivialRegisterPassable): var value: Int comptime INET_ADDRSTRLEN = Self(16) comptime INET6_ADDRSTRLEN = Self(46) diff --git a/lightbug_http/c/aliases.mojo b/lightbug_http/c/aliases.mojo index 020c356c..9ce73cdc 100644 --- a/lightbug_http/c/aliases.mojo +++ b/lightbug_http/c/aliases.mojo @@ -1,4 +1,4 @@ -comptime ExternalMutUnsafePointer = UnsafePointer[origin=MutExternalOrigin] -comptime ExternalImmutUnsafePointer = UnsafePointer[origin=ImmutExternalOrigin] +comptime ExternalMutUnsafePointer[type: AnyType] = UnsafePointer[type, MutExternalOrigin] +comptime ExternalImmutUnsafePointer[type: AnyType] = UnsafePointer[type, ImmutExternalOrigin] comptime c_void = NoneType diff --git a/lightbug_http/c/network.mojo b/lightbug_http/c/network.mojo index d3ceb4c8..ca50043f 100644 --- a/lightbug_http/c/network.mojo +++ b/lightbug_http/c/network.mojo @@ -1,16 +1,15 @@ -from sys.ffi import c_char, c_int, c_uint, c_ushort, external_call, get_errno -from sys.info import size_of +from std.ffi import c_char, c_int, c_uint, c_ushort, external_call, get_errno +from std.sys.info import size_of from lightbug_http.c.address import AddressFamily, AddressLength from lightbug_http.c.aliases import ExternalImmutUnsafePointer, ExternalMutUnsafePointer, c_void from lightbug_http.utils.error import CustomError -from memory import stack_allocation -from utils import StaticTuple, Variant +from std.memory import stack_allocation +from std.utils import StaticTuple, Variant @fieldwise_init -@register_passable("trivial") -struct InetNtopEAFNOSUPPORTError(CustomError): +struct InetNtopEAFNOSUPPORTError(CustomError, TrivialRegisterPassable): comptime message = "inet_ntop Error (EAFNOSUPPORT): `*src` was not an `AF_INET` or `AF_INET6` family address." fn write_to[W: Writer, //](self, mut writer: W): @@ -21,8 +20,7 @@ struct InetNtopEAFNOSUPPORTError(CustomError): @fieldwise_init -@register_passable("trivial") -struct InetNtopENOSPCError(CustomError): +struct InetNtopENOSPCError(CustomError, TrivialRegisterPassable): comptime message = "inet_ntop Error (ENOSPC): The buffer size was not large enough to store the presentation form of the address." fn write_to[W: Writer, //](self, mut writer: W): @@ -33,8 +31,7 @@ struct InetNtopENOSPCError(CustomError): @fieldwise_init -@register_passable("trivial") -struct InetPtonInvalidAddressError(CustomError): +struct InetPtonInvalidAddressError(CustomError, TrivialRegisterPassable): comptime message = "inet_pton Error: The input is not a valid address." fn write_to[W: Writer, //](self, mut writer: W): @@ -44,72 +41,10 @@ struct InetPtonInvalidAddressError(CustomError): return Self.message -@fieldwise_init -struct InetNtopError(Movable, Stringable, Writable): - """Typed error variant for inet_ntop() function.""" - - comptime type = Variant[InetNtopEAFNOSUPPORTError, InetNtopENOSPCError, Error] - var value: Self.type - - @implicit - fn __init__(out self, value: InetNtopEAFNOSUPPORTError): - self.value = value - - @implicit - fn __init__(out self, value: InetNtopENOSPCError): - self.value = value - - @implicit - fn __init__(out self, var value: Error): - self.value = value^ - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[InetNtopEAFNOSUPPORTError](): - writer.write(self.value[InetNtopEAFNOSUPPORTError]) - elif self.value.isa[InetNtopENOSPCError](): - writer.write(self.value[InetNtopENOSPCError]) - elif self.value.isa[Error](): - writer.write(self.value[Error]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) +comptime InetNtopError = Variant[InetNtopEAFNOSUPPORTError, InetNtopENOSPCError, Error] -@fieldwise_init -struct InetPtonError(Movable, Stringable, Writable): - """Typed error variant for inet_pton() function.""" - - comptime type = Variant[InetPtonInvalidAddressError, Error] - var value: Self.type - - @implicit - fn __init__(out self, value: InetPtonInvalidAddressError): - self.value = value - - @implicit - fn __init__(out self, var value: Error): - self.value = value^ - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[InetPtonInvalidAddressError](): - writer.write(self.value[InetPtonInvalidAddressError]) - elif self.value.isa[Error](): - writer.write(self.value[Error]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) +comptime InetPtonError = Variant[InetPtonInvalidAddressError, Error] fn htonl(hostlong: c_uint) -> c_uint: @@ -203,19 +138,16 @@ comptime in_port_t = c_ushort @fieldwise_init -@register_passable("trivial") -struct in_addr: +struct in_addr(TrivialRegisterPassable): var s_addr: in_addr_t @fieldwise_init -@register_passable("trivial") -struct in6_addr: +struct in6_addr(TrivialRegisterPassable): var s6_addr: StaticTuple[c_char, 16] -@register_passable("trivial") -struct sockaddr: +struct sockaddr(TrivialRegisterPassable): var sa_family: sa_family_t var sa_data: StaticTuple[c_char, 14] @@ -229,8 +161,7 @@ struct sockaddr: @fieldwise_init -@register_passable("trivial") -struct sockaddr_in: +struct sockaddr_in(TrivialRegisterPassable): var sin_family: sa_family_t var sin_port: in_port_t var sin_addr: in_addr @@ -244,15 +175,14 @@ struct sockaddr_in: port: A 16-bit integer port in host byte order, gets converted to network byte order via `htons`. binary_ip: The binary representation of the IP address. """ - self.sin_family = address_family + self.sin_family = sa_family_t(address_family) self.sin_port = htons(port) self.sin_addr = in_addr(binary_ip) self.sin_zero = StaticTuple[c_char, 8](0, 0, 0, 0, 0, 0, 0, 0) @fieldwise_init -@register_passable("trivial") -struct sockaddr_in6: +struct sockaddr_in6(TrivialRegisterPassable): var sin6_family: sa_family_t var sin6_port: in_port_t var sin6_flowinfo: c_uint @@ -307,8 +237,7 @@ struct SocketAddress(Movable): @fieldwise_init -@register_passable("trivial") -struct addrinfo: +struct addrinfo(TrivialRegisterPassable): var ai_flags: c_int var ai_family: c_int var ai_socktype: c_int @@ -331,8 +260,8 @@ struct addrinfo: fn _inet_ntop( af: c_int, - src: ImmutUnsafePointer[c_void], - dst: MutUnsafePointer[c_char], + src: ImmutUnsafePointer[c_void, _], + dst: MutUnsafePointer[c_char, _], size: socklen_t, ) raises -> ExternalImmutUnsafePointer[c_char]: """Libc POSIX `inet_ntop` function. @@ -398,24 +327,24 @@ fn inet_ntop[ address_family.value, UnsafePointer(to=ip_address).bitcast[c_void](), dst.unsafe_ptr().bitcast[c_char](), - address_length.value, + UInt32(address_length.value), ) if not result: var errno = get_errno() if errno == errno.EAFNOSUPPORT: - raise InetNtopEAFNOSUPPORTError() + raise InetNtopError(InetNtopEAFNOSUPPORTError()) elif errno == errno.ENOSPC: - raise InetNtopENOSPCError() + raise InetNtopError(InetNtopENOSPCError()) else: - raise Error( + raise InetNtopError(Error( "inet_ntop Error: An error occurred while converting the address. Error code: ", errno, - ) + )) return String(unsafe_from_utf8_ptr=dst.unsafe_ptr()) -fn _inet_pton(af: c_int, src: ImmutUnsafePointer[c_char], dst: MutUnsafePointer[c_void]) -> c_int: +fn _inet_pton(af: c_int, src: ImmutUnsafePointer[c_char, _], dst: MutUnsafePointer[c_void, _]) -> c_int: """Libc POSIX `inet_pton` function. Converts a presentation format address (that is, printable form as held in a character string) to network format (usually a struct in_addr or some other internal binary representation, in network byte order). It returns 1 if the address was valid for the specified address family, or 0 if the address was not parseable in the specified address family, @@ -473,20 +402,19 @@ fn inet_pton[address_family: AddressFamily](var src: String) raises InetPtonErro """ var ip_buffer: ExternalMutUnsafePointer[c_void] - @parameter - if address_family == AddressFamily.AF_INET6: + comptime if address_family == AddressFamily.AF_INET6: ip_buffer = stack_allocation[16, c_void]() else: ip_buffer = stack_allocation[4, c_void]() var result = _inet_pton(address_family.value, src.as_c_string_slice().unsafe_ptr(), ip_buffer) if result == 0: - raise InetPtonInvalidAddressError() + raise InetPtonError(InetPtonInvalidAddressError()) elif result == -1: var errno = get_errno() - raise Error( + raise InetPtonError(Error( "inet_pton Error: An error occurred while converting the address. Error code: ", errno, - ) + )) return ip_buffer.bitcast[c_uint]().take_pointee() diff --git a/lightbug_http/c/socket.mojo b/lightbug_http/c/socket.mojo index a4bd4666..196c495f 100644 --- a/lightbug_http/c/socket.mojo +++ b/lightbug_http/c/socket.mojo @@ -1,15 +1,14 @@ -from sys.ffi import c_int, c_size_t, c_ssize_t, c_uchar, external_call, get_errno -from sys.info import CompilationTarget, size_of +from std.ffi import c_int, c_size_t, c_ssize_t, c_uchar, external_call, get_errno +from std.sys.info import CompilationTarget, size_of from lightbug_http.c.aliases import c_void from lightbug_http.c.network import SocketAddress, sockaddr, sockaddr_in, socklen_t from lightbug_http.c.socket_error import * -from memory import stack_allocation +from std.memory import stack_allocation @fieldwise_init -@register_passable("trivial") -struct ShutdownOption(Copyable, Equatable, Stringable, Writable): +struct ShutdownOption(Copyable, Equatable, Writable, TrivialRegisterPassable): var value: c_int comptime SHUT_RD = Self(0) comptime SHUT_WR = Self(1) @@ -37,8 +36,7 @@ comptime SOL_SOCKET = 0xFFFF # TODO: These are probably platform specific, on MacOS I have these values, but we should check on Linux. # Taken from: https://github.com/openbsd/src/blob/master/sys/sys/socket.h @fieldwise_init -@register_passable("trivial") -struct SocketOption(Copyable, Equatable, Stringable, Writable): +struct SocketOption(Copyable, Equatable, Writable, TrivialRegisterPassable): var value: c_int comptime SO_DEBUG = Self(0x0001) comptime SO_ACCEPTCONN = Self(0x0002) @@ -141,8 +139,7 @@ comptime O_CLOEXEC = 524288 # Socket Type constants @fieldwise_init -@register_passable("trivial") -struct SocketType(Copyable, Equatable, Stringable, Writable): +struct SocketType(Copyable, Equatable, Writable, TrivialRegisterPassable): var value: c_int comptime SOCK_STREAM = Self(1) comptime SOCK_DGRAM = Self(2) @@ -238,19 +235,19 @@ fn socket(domain: c_int, type: c_int, protocol: c_int) raises SocketError -> c_i if fd == -1: var errno = get_errno() if errno == errno.EACCES: - raise SocketEACCESError() + raise SocketError(SocketEACCESError()) elif errno == errno.EAFNOSUPPORT: - raise SocketEAFNOSUPPORTError() + raise SocketError(SocketEAFNOSUPPORTError()) elif errno == errno.EINVAL: - raise SocketEINVALError() + raise SocketError(SocketEINVALError()) elif errno == errno.EMFILE: - raise SocketEMFILEError() + raise SocketError(SocketEMFILEError()) elif errno == errno.ENFILE: - raise SocketENFILEError() + raise SocketError(SocketENFILEError()) elif errno in [errno.ENOBUFS, errno.ENOMEM]: - raise SocketENOBUFSError() + raise SocketError(SocketENOBUFSError()) elif errno == errno.EPROTONOSUPPORT: - raise SocketEPROTONOSUPPORTError() + raise SocketError(SocketEPROTONOSUPPORTError()) return fd @@ -326,29 +323,29 @@ fn setsockopt( * Reference: https://man7.org/linux/man-pages/man3/setsockopt.3p.html . """ var result = _setsockopt( - socket.value, + Int32(socket.value), level, option_name, UnsafePointer(to=option_value).bitcast[c_void](), - size_of[Int32](), + UInt32(size_of[Int32]()), ) if result == -1: var errno = get_errno() if errno == errno.EBADF: - raise SetsockoptEBADFError() + raise SetsockoptError(SetsockoptEBADFError()) elif errno == errno.EFAULT: - raise SetsockoptEFAULTError() + raise SetsockoptError(SetsockoptEFAULTError()) elif errno == errno.EINVAL: - raise SetsockoptEINVALError() + raise SetsockoptError(SetsockoptEINVALError()) elif errno == errno.ENOPROTOOPT: - raise SetsockoptENOPROTOOPTError() + raise SetsockoptError(SetsockoptENOPROTOOPTError()) elif errno == errno.ENOTSOCK: - raise SetsockoptENOTSOCKError() + raise SetsockoptError(SetsockoptENOTSOCKError()) else: - raise Error( + raise SetsockoptError(Error( "SetsockoptError: An error occurred while setting the socket option. Error code: ", errno, - ) + )) fn _getsockopt[ @@ -357,7 +354,7 @@ fn _getsockopt[ socket: c_int, level: c_int, option_name: c_int, - option_value: ImmutUnsafePointer[c_void], + option_value: ImmutUnsafePointer[c_void, _], option_len: Pointer[socklen_t, origin], ) -> c_int: """Libc POSIX `getsockopt` function. @@ -425,32 +422,32 @@ fn getsockopt( * Reference: https://man7.org/linux/man-pages/man3/getsockopt.3p.html . """ var option_value = stack_allocation[1, c_void]() - var option_len: socklen_t = size_of[Int]() - var result = _getsockopt(socket.value, level, option_name, option_value, Pointer(to=option_len)) + var option_len: socklen_t = socklen_t(size_of[Int]()) + var result = _getsockopt(Int32(socket.value), level, option_name, option_value, Pointer(to=option_len)) if result == -1: var errno = get_errno() if errno == errno.EBADF: - raise GetsockoptEBADFError() + raise GetsockoptError(GetsockoptEBADFError()) elif errno == errno.EFAULT: - raise GetsockoptEFAULTError() + raise GetsockoptError(GetsockoptEFAULTError()) elif errno == errno.EINVAL: - raise GetsockoptEINVALError() + raise GetsockoptError(GetsockoptEINVALError()) elif errno == errno.ENOPROTOOPT: - raise GetsockoptENOPROTOOPTError() + raise GetsockoptError(GetsockoptENOPROTOOPTError()) elif errno == errno.ENOTSOCK: - raise GetsockoptENOTSOCKError() + raise GetsockoptError(GetsockoptENOTSOCKError()) else: - raise Error( + raise GetsockoptError(Error( "GetsockoptError: An error occurred while getting the socket option. Error code: ", errno, - ) + )) return option_value.bitcast[Int]().take_pointee() fn _getsockname[ origin: MutOrigin -](socket: c_int, address: MutUnsafePointer[sockaddr], address_len: Pointer[socklen_t, origin],) -> c_int: +](socket: c_int, address: MutUnsafePointer[sockaddr, _], address_len: Pointer[socklen_t, origin],) -> c_int: """Libc POSIX `getsockname` function. Args: @@ -502,24 +499,24 @@ fn getsockname(socket: FileDescriptor, mut address: SocketAddress) raises Getsoc * Reference: https://man7.org/linux/man-pages/man3/getsockname.3p.html . """ var sockaddr_size = address.SIZE - var result = _getsockname(socket.value, address.unsafe_ptr(), Pointer(to=sockaddr_size)) + var result = _getsockname(Int32(socket.value), address.unsafe_ptr(), Pointer(to=sockaddr_size)) if result == -1: var errno = get_errno() if errno == errno.EBADF: - raise GetsocknameEBADFError() + raise GetsocknameError(GetsocknameEBADFError()) elif errno == errno.EFAULT: - raise GetsocknameEFAULTError() + raise GetsocknameError(GetsocknameEFAULTError()) elif errno == errno.EINVAL: - raise GetsocknameEINVALError() + raise GetsocknameError(GetsocknameEINVALError()) elif errno == errno.ENOBUFS: - raise GetsocknameENOBUFSError() + raise GetsocknameError(GetsocknameENOBUFSError()) elif errno == errno.ENOTSOCK: - raise GetsocknameENOTSOCKError() + raise GetsocknameError(GetsocknameENOTSOCKError()) fn _getpeername[ origin: MutOrigin -](sockfd: c_int, addr: MutUnsafePointer[sockaddr], address_len: Pointer[socklen_t, origin],) -> c_int: +](sockfd: c_int, addr: MutUnsafePointer[sockaddr, _], address_len: Pointer[socklen_t, origin],) -> c_int: """Libc POSIX `getpeername` function. Args: @@ -573,24 +570,24 @@ fn getpeername(file_descriptor: FileDescriptor) raises GetpeernameError -> Socke var remote_address = SocketAddress() var sockaddr_size = remote_address.SIZE var result = _getpeername( - file_descriptor.value, + Int32(file_descriptor.value), remote_address.unsafe_ptr(), Pointer(to=sockaddr_size), ) if result == -1: var errno = get_errno() if errno == errno.EBADF: - raise GetpeernameEBADFError() + raise GetpeernameError(GetpeernameEBADFError()) elif errno == errno.EFAULT: - raise GetpeernameEFAULTError() + raise GetpeernameError(GetpeernameEFAULTError()) elif errno == errno.EINVAL: - raise GetpeernameEINVALError() + raise GetpeernameError(GetpeernameEINVALError()) elif errno == errno.ENOBUFS: - raise GetpeernameENOBUFSError() + raise GetpeernameError(GetpeernameENOBUFSError()) elif errno == errno.ENOTCONN: - raise GetpeernameENOTCONNError() + raise GetpeernameError(GetpeernameENOTCONNError()) elif errno == errno.ENOTSOCK: - raise GetpeernameENOTSOCKError() + raise GetpeernameError(GetpeernameENOTSOCKError()) return remote_address^ @@ -655,29 +652,29 @@ fn bind(socket: FileDescriptor, mut address: SocketAddress) raises BindError: #### Notes: * Reference: https://man7.org/linux/man-pages/man3/bind.3p.html . """ - var result = _bind(socket.value, Pointer(to=address.as_sockaddr_in()), address.SIZE) + var result = _bind(Int32(socket.value), Pointer(to=address.as_sockaddr_in()), address.SIZE) if result == -1: var errno = get_errno() if errno == errno.EACCES: - raise BindEACCESError() + raise BindError(BindEACCESError()) elif errno == errno.EADDRINUSE: - raise BindEADDRINUSEError() + raise BindError(BindEADDRINUSEError()) elif errno == errno.EBADF: - raise BindEBADFError() + raise BindError(BindEBADFError()) elif errno == errno.EINVAL: - raise BindEINVALError() + raise BindError(BindEINVALError()) elif errno == errno.ENOTSOCK: - raise BindENOTSOCKError() + raise BindError(BindENOTSOCKError()) # The following errors are specific to UNIX domain (AF_UNIX) sockets. TODO: Pass address_family when unix sockets supported. # if address_family == AF_UNIX: # if errno == errno.EACCES: # raise BindEACCESError() - raise Error( + raise BindError(Error( "bind: An error occurred while binding the socket. Error code: ", errno, - ) + )) fn _listen(socket: c_int, backlog: c_int) -> c_int: @@ -723,17 +720,17 @@ fn listen(socket: FileDescriptor, backlog: c_int) raises ListenError: #### Notes: * Reference: https://man7.org/linux/man-pages/man3/listen.3p.html . """ - var result = _listen(socket.value, backlog) + var result = _listen(Int32(socket.value), backlog) if result == -1: var errno = get_errno() if errno == errno.EADDRINUSE: - raise ListenEADDRINUSEError() + raise ListenError(ListenEADDRINUSEError()) elif errno == errno.EBADF: - raise ListenEBADFError() + raise ListenError(ListenEBADFError()) elif errno == errno.ENOTSOCK: - raise ListenENOTSOCKError() + raise ListenError(ListenENOTSOCKError()) elif errno == errno.EOPNOTSUPP: - raise ListenEOPNOTSUPPError() + raise ListenError(ListenEOPNOTSUPPError()) fn _accept[ @@ -797,38 +794,37 @@ fn accept(socket: FileDescriptor) raises AcceptError -> FileDescriptor: var remote_address = sockaddr() # TODO: Should this be sizeof sockaddr? var buffer_size = socklen_t(size_of[socklen_t]()) - var result = _accept(socket.value, Pointer(to=remote_address), Pointer(to=buffer_size)) + var result = _accept(Int32(socket.value), Pointer(to=remote_address), Pointer(to=buffer_size)) if result == -1: var errno = get_errno() if errno in [errno.EAGAIN, errno.EWOULDBLOCK]: - raise AcceptEAGAINError() + raise AcceptError(AcceptEAGAINError()) elif errno == errno.EBADF: - raise AcceptEBADFError() + raise AcceptError(AcceptEBADFError()) elif errno == errno.ECONNABORTED: - raise AcceptECONNABORTEDError() + raise AcceptError(AcceptECONNABORTEDError()) elif errno == errno.EFAULT: - raise AcceptEFAULTError() + raise AcceptError(AcceptEFAULTError()) elif errno == errno.EINTR: - raise AcceptEINTRError() + raise AcceptError(AcceptEINTRError()) elif errno == errno.EINVAL: - raise AcceptEINVALError() + raise AcceptError(AcceptEINVALError()) elif errno == errno.EMFILE: - raise AcceptEMFILEError() + raise AcceptError(AcceptEMFILEError()) elif errno == errno.ENFILE: - raise AcceptENFILEError() + raise AcceptError(AcceptENFILEError()) elif errno in [errno.ENOBUFS, errno.ENOMEM]: - raise AcceptENOBUFSError() + raise AcceptError(AcceptENOBUFSError()) elif errno == errno.ENOTSOCK: - raise AcceptENOTSOCKError() + raise AcceptError(AcceptENOTSOCKError()) elif errno == errno.EOPNOTSUPP: - raise AcceptEOPNOTSUPPError() + raise AcceptError(AcceptEOPNOTSUPPError()) elif errno == errno.EPROTO: - raise AcceptEPROTOError() + raise AcceptError(AcceptEPROTOError()) - @parameter - if CompilationTarget.is_linux(): + comptime if CompilationTarget.is_linux(): if errno == errno.EPERM: - raise AcceptEPERMError() + raise AcceptError(AcceptEPERMError()) return FileDescriptor(Int(result)) @@ -893,42 +889,42 @@ fn connect(socket: FileDescriptor, mut address: SocketAddress) raises ConnectErr #### Notes: * Reference: https://man7.org/linux/man-pages/man3/connect.3p.html . """ - var result = _connect(socket.value, Pointer(to=address.as_sockaddr_in()), address.SIZE) + var result = _connect(Int32(socket.value), Pointer(to=address.as_sockaddr_in()), address.SIZE) if result == -1: var errno = get_errno() if errno == errno.EACCES: - raise ConnectEACCESError() + raise ConnectError(ConnectEACCESError()) elif errno == errno.EADDRINUSE: - raise ConnectEADDRINUSEError() + raise ConnectError(ConnectEADDRINUSEError()) elif errno == errno.EAGAIN: - raise ConnectEAGAINError() + raise ConnectError(ConnectEAGAINError()) elif errno == errno.EALREADY: - raise ConnectEALREADYError() + raise ConnectError(ConnectEALREADYError()) elif errno == errno.EBADF: - raise ConnectEBADFError() + raise ConnectError(ConnectEBADFError()) elif errno == errno.ECONNREFUSED: - raise ConnectECONNREFUSEDError() + raise ConnectError(ConnectECONNREFUSEDError()) elif errno == errno.EFAULT: - raise ConnectEFAULTError() + raise ConnectError(ConnectEFAULTError()) elif errno == errno.EINPROGRESS: - raise ConnectEINPROGRESSError() + raise ConnectError(ConnectEINPROGRESSError()) elif errno == errno.EINTR: - raise ConnectEINTRError() + raise ConnectError(ConnectEINTRError()) elif errno == errno.EISCONN: - raise ConnectEISCONNError() + raise ConnectError(ConnectEISCONNError()) elif errno == errno.ENETUNREACH: - raise ConnectENETUNREACHError() + raise ConnectError(ConnectENETUNREACHError()) elif errno == errno.ENOTSOCK: - raise ConnectENOTSOCKError() + raise ConnectError(ConnectENOTSOCKError()) elif errno == errno.EAFNOSUPPORT: - raise ConnectEAFNOSUPPORTError() + raise ConnectError(ConnectEAFNOSUPPORTError()) elif errno == errno.ETIMEDOUT: - raise ConnectETIMEDOUTError() + raise ConnectError(ConnectETIMEDOUTError()) fn _recv( socket: c_int, - buffer: MutUnsafePointer[c_void], + buffer: MutUnsafePointer[c_void, _], length: c_size_t, flags: c_int, ) -> c_ssize_t: @@ -986,28 +982,28 @@ fn recv[ #### Notes: * Reference: https://man7.org/linux/man-pages/man3/recv.3p.html . """ - var result = _recv(socket.value, buffer.unsafe_ptr().bitcast[c_void](), length, flags) + var result = _recv(Int32(socket.value), buffer.unsafe_ptr().bitcast[c_void](), length, flags) if result == -1: var errno = get_errno() if errno in [errno.EAGAIN, errno.EWOULDBLOCK]: - raise RecvEAGAINError() + raise RecvError(RecvEAGAINError()) elif errno == errno.EBADF: - raise RecvEBADFError() + raise RecvError(RecvEBADFError()) elif errno == errno.ECONNREFUSED: - raise RecvECONNREFUSEDError() + raise RecvError(RecvECONNREFUSEDError()) elif errno == errno.EFAULT: - raise RecvEFAULTError() + raise RecvError(RecvEFAULTError()) elif errno == errno.EINTR: - raise RecvEINTRError() + raise RecvError(RecvEINTRError()) elif errno == errno.ENOTCONN: - raise RecvENOTCONNError() + raise RecvError(RecvENOTCONNError()) elif errno == errno.ENOTSOCK: - raise RecvENOTSOCKError() + raise RecvError(RecvENOTSOCKError()) else: - raise Error( + raise RecvError(Error( "RecvError: An error occurred while attempting to receive data from the socket. Error code: ", errno, - ) + )) return UInt(result) @@ -1016,10 +1012,10 @@ fn _recvfrom[ origin: MutOrigin ]( socket: c_int, - buffer: MutUnsafePointer[c_void], + buffer: MutUnsafePointer[c_void, _], length: c_size_t, flags: c_int, - address: MutUnsafePointer[sockaddr], + address: MutUnsafePointer[sockaddr, _], address_len: Pointer[socklen_t, origin], ) -> c_ssize_t: """Libc POSIX `recvfrom` function. @@ -1102,7 +1098,7 @@ fn recvfrom[ """ var address_buffer_size = address.SIZE var result = _recvfrom( - socket.value, + Int32(socket.value), buffer.unsafe_ptr().bitcast[c_void](), length, flags, @@ -1112,41 +1108,41 @@ fn recvfrom[ if result == -1: var errno = get_errno() if errno in [errno.EAGAIN, errno.EWOULDBLOCK]: - raise RecvfromEAGAINError() + raise RecvfromError(RecvfromEAGAINError()) elif errno == errno.EBADF: - raise RecvfromEBADFError() + raise RecvfromError(RecvfromEBADFError()) elif errno == errno.ECONNRESET: - raise RecvfromECONNRESETError() + raise RecvfromError(RecvfromECONNRESETError()) elif errno == errno.EINTR: - raise RecvfromEINTRError() + raise RecvfromError(RecvfromEINTRError()) elif errno == errno.EINVAL: - raise RecvfromEINVALError() + raise RecvfromError(RecvfromEINVALError()) elif errno == errno.ENOTCONN: - raise RecvfromENOTCONNError() + raise RecvfromError(RecvfromENOTCONNError()) elif errno == errno.ENOTSOCK: - raise RecvfromENOTSOCKError() + raise RecvfromError(RecvfromENOTSOCKError()) elif errno == errno.EOPNOTSUPP: - raise RecvfromEOPNOTSUPPError() + raise RecvfromError(RecvfromEOPNOTSUPPError()) elif errno == errno.ETIMEDOUT: - raise RecvfromETIMEDOUTError() + raise RecvfromError(RecvfromETIMEDOUTError()) elif errno == errno.EIO: - raise RecvfromEIOError() + raise RecvfromError(RecvfromEIOError()) elif errno == errno.ENOBUFS: - raise RecvfromENOBUFSError() + raise RecvfromError(RecvfromENOBUFSError()) elif errno == errno.ENOMEM: - raise RecvfromENOMEMError() + raise RecvfromError(RecvfromENOMEMError()) else: - raise Error( + raise RecvfromError(Error( "RecvfromError: An error occurred while attempting to receive data from the socket. Error code: ", errno, - ) + )) return UInt(result) fn _send( socket: c_int, - buffer: ImmutUnsafePointer[c_void], + buffer: ImmutUnsafePointer[c_void, _], length: c_size_t, flags: c_int, ) -> c_ssize_t: @@ -1220,52 +1216,52 @@ fn send[ #### Notes: * Reference: https://man7.org/linux/man-pages/man3/send.3p.html . """ - var result = _send(socket.value, buffer.unsafe_ptr().bitcast[c_void](), length, flags) + var result = _send(Int32(socket.value), buffer.unsafe_ptr().bitcast[c_void](), length, flags) if result == -1: var errno = get_errno() if errno in [errno.EAGAIN, errno.EWOULDBLOCK]: - raise SendEAGAINError() + raise SendError(SendEAGAINError()) elif errno == errno.EBADF: - raise SendEBADFError() + raise SendError(SendEBADFError()) elif errno == errno.ECONNRESET: - raise SendECONNRESETError() + raise SendError(SendECONNRESETError()) elif errno == errno.EDESTADDRREQ: - raise SendEDESTADDRREQError() + raise SendError(SendEDESTADDRREQError()) elif errno == errno.ECONNREFUSED: - raise SendECONNREFUSEDError() + raise SendError(SendECONNREFUSEDError()) elif errno == errno.EFAULT: - raise SendEFAULTError() + raise SendError(SendEFAULTError()) elif errno == errno.EINTR: - raise SendEINTRError() + raise SendError(SendEINTRError()) elif errno == errno.EINVAL: - raise SendEINVALError() + raise SendError(SendEINVALError()) elif errno == errno.EISCONN: - raise SendEISCONNError() + raise SendError(SendEISCONNError()) elif errno == errno.ENOBUFS: - raise SendENOBUFSError() + raise SendError(SendENOBUFSError()) elif errno == errno.ENOMEM: - raise SendENOMEMError() + raise SendError(SendENOMEMError()) elif errno == errno.ENOTCONN: - raise SendENOTCONNError() + raise SendError(SendENOTCONNError()) elif errno == errno.ENOTSOCK: - raise SendENOTSOCKError() + raise SendError(SendENOTSOCKError()) elif errno == errno.EOPNOTSUPP: - raise SendEOPNOTSUPPError() + raise SendError(SendEOPNOTSUPPError()) else: - raise Error( + raise SendError(Error( "SendError: An error occurred while attempting to send data to the socket. Error code: ", errno, - ) + )) return UInt(result) fn _sendto( socket: c_int, - message: ImmutUnsafePointer[c_void], + message: ImmutUnsafePointer[c_void, _], length: c_size_t, flags: c_int, - dest_addr: ImmutUnsafePointer[sockaddr], + dest_addr: ImmutUnsafePointer[sockaddr, _], dest_len: socklen_t, ) -> c_ssize_t: """Libc POSIX `sendto` function @@ -1344,7 +1340,7 @@ fn sendto[ """ var result = _sendto( - socket.value, + Int32(socket.value), message.unsafe_ptr().bitcast[c_void](), length, flags, @@ -1354,52 +1350,52 @@ fn sendto[ if result == -1: var errno = get_errno() if errno == errno.EAFNOSUPPORT: - raise SendtoEAFNOSUPPORTError() + raise SendtoError(SendtoEAFNOSUPPORTError()) elif errno in [errno.EAGAIN, errno.EWOULDBLOCK]: - raise SendtoEAGAINError() + raise SendtoError(SendtoEAGAINError()) elif errno == errno.EBADF: - raise SendtoEBADFError() + raise SendtoError(SendtoEBADFError()) elif errno == errno.ECONNRESET: - raise SendtoECONNRESETError() + raise SendtoError(SendtoECONNRESETError()) elif errno == errno.EINTR: - raise SendtoEINTRError() + raise SendtoError(SendtoEINTRError()) elif errno == errno.EMSGSIZE: - raise SendtoEMSGSIZEError() + raise SendtoError(SendtoEMSGSIZEError()) elif errno == errno.ENOTCONN: - raise SendtoENOTCONNError() + raise SendtoError(SendtoENOTCONNError()) elif errno == errno.ENOTSOCK: - raise SendtoENOTSOCKError() + raise SendtoError(SendtoENOTSOCKError()) elif errno == errno.EPIPE: - raise SendtoEPIPEError() + raise SendtoError(SendtoEPIPEError()) elif errno == errno.EACCES: - raise SendtoEACCESError() + raise SendtoError(SendtoEACCESError()) elif errno == errno.EDESTADDRREQ: - raise SendtoEDESTADDRREQError() + raise SendtoError(SendtoEDESTADDRREQError()) elif errno == errno.EHOSTUNREACH: - raise SendtoEHOSTUNREACHError() + raise SendtoError(SendtoEHOSTUNREACHError()) elif errno == errno.EINVAL: - raise SendtoEINVALError() + raise SendtoError(SendtoEINVALError()) elif errno == errno.EIO: - raise SendtoEIOError() + raise SendtoError(SendtoEIOError()) elif errno == errno.EISCONN: - raise SendtoEISCONNError() + raise SendtoError(SendtoEISCONNError()) elif errno == errno.ENETDOWN: - raise SendtoENETDOWNError() + raise SendtoError(SendtoENETDOWNError()) elif errno == errno.ENETUNREACH: - raise SendtoENETUNREACHError() + raise SendtoError(SendtoENETUNREACHError()) elif errno == errno.ENOBUFS: - raise SendtoENOBUFSError() + raise SendtoError(SendtoENOBUFSError()) elif errno == errno.ENOMEM: - raise SendtoENOMEMError() + raise SendtoError(SendtoENOMEMError()) elif errno == errno.ELOOP: - raise SendtoELOOPError() + raise SendtoError(SendtoELOOPError()) elif errno == errno.ENAMETOOLONG: - raise SendtoENAMETOOLONGError() + raise SendtoError(SendtoENAMETOOLONGError()) else: - raise Error( + raise SendtoError(Error( "SendtoError: An error occurred while attempting to send data to the socket. Error code: ", errno, - ) + )) return UInt(result) @@ -1447,17 +1443,17 @@ fn shutdown(socket: FileDescriptor, how: ShutdownOption) raises ShutdownError: #### Notes: * Reference: https://man7.org/linux/man-pages/man3/shutdown.3p.html . """ - var result = _shutdown(socket.value, how.value) + var result = _shutdown(Int32(socket.value), how.value) if result == -1: var errno = get_errno() if errno == errno.EBADF: - raise ShutdownEBADFError() + raise ShutdownError(ShutdownEBADFError()) elif errno == errno.EINVAL: - raise ShutdownEINVALError() + raise ShutdownError(ShutdownEINVALError()) elif errno == errno.ENOTCONN: - raise ShutdownENOTCONNError() + raise ShutdownError(ShutdownENOTCONNError()) elif errno == errno.ENOTSOCK: - raise ShutdownENOTSOCKError() + raise ShutdownError(ShutdownENOTSOCKError()) fn _close(fildes: c_int) -> c_int: @@ -1505,13 +1501,13 @@ fn close(file_descriptor: FileDescriptor) raises CloseError: #### Notes: * Reference: https://man7.org/linux/man-pages/man3/close.3p.html . """ - if _close(file_descriptor.value) == -1: + if _close(Int32(file_descriptor.value)) == -1: var errno = get_errno() if errno == errno.EBADF: - raise CloseEBADFError() + raise CloseError(CloseEBADFError()) elif errno == errno.EINTR: - raise CloseEINTRError() + raise CloseError(CloseEINTRError()) elif errno == errno.EIO: - raise CloseEIOError() + raise CloseError(CloseEIOError()) elif errno in [errno.ENOSPC, errno.EDQUOT]: - raise CloseENOSPCError() + raise CloseError(CloseENOSPCError()) diff --git a/lightbug_http/c/socket_error.mojo b/lightbug_http/c/socket_error.mojo index 284fce88..4d6de853 100644 --- a/lightbug_http/c/socket_error.mojo +++ b/lightbug_http/c/socket_error.mojo @@ -4,16 +4,13 @@ Generated from socket.mojo error handling patterns. Follows the pattern from typed_errors.mojo. """ -from sys.ffi import c_int, external_call, get_errno - from lightbug_http.utils.error import CustomError -from utils import Variant +from std.utils import Variant # Accept errors @fieldwise_init -@register_passable("trivial") -struct AcceptEBADFError(CustomError): +struct AcceptEBADFError(CustomError, TrivialRegisterPassable): comptime message = "accept (EBADF): socket is not a valid descriptor." fn write_to[W: Writer, //](self, mut writer: W): @@ -24,8 +21,7 @@ struct AcceptEBADFError(CustomError): @fieldwise_init -@register_passable("trivial") -struct AcceptEINTRError(CustomError): +struct AcceptEINTRError(CustomError, TrivialRegisterPassable): comptime message = "accept (EINTR): The system call was interrupted by a signal that was caught before a valid connection arrived." fn write_to[W: Writer, //](self, mut writer: W): @@ -36,8 +32,7 @@ struct AcceptEINTRError(CustomError): @fieldwise_init -@register_passable("trivial") -struct AcceptEAGAINError(CustomError): +struct AcceptEAGAINError(CustomError, TrivialRegisterPassable): comptime message = "accept (EAGAIN/EWOULDBLOCK): The socket is marked nonblocking and no connections are present to be accepted." fn write_to[W: Writer, //](self, mut writer: W): @@ -48,8 +43,7 @@ struct AcceptEAGAINError(CustomError): @fieldwise_init -@register_passable("trivial") -struct AcceptECONNABORTEDError(CustomError): +struct AcceptECONNABORTEDError(CustomError, TrivialRegisterPassable): comptime message = "accept (ECONNABORTED): A connection has been aborted." fn write_to[W: Writer, //](self, mut writer: W): @@ -60,8 +54,7 @@ struct AcceptECONNABORTEDError(CustomError): @fieldwise_init -@register_passable("trivial") -struct AcceptEFAULTError(CustomError): +struct AcceptEFAULTError(CustomError, TrivialRegisterPassable): comptime message = "accept (EFAULT): The address argument is not in a writable part of the user address space." fn write_to[W: Writer, //](self, mut writer: W): @@ -72,8 +65,7 @@ struct AcceptEFAULTError(CustomError): @fieldwise_init -@register_passable("trivial") -struct AcceptEINVALError(CustomError): +struct AcceptEINVALError(CustomError, TrivialRegisterPassable): comptime message = "accept (EINVAL): Socket is not listening for connections, or address_len is invalid." fn write_to[W: Writer, //](self, mut writer: W): @@ -84,8 +76,7 @@ struct AcceptEINVALError(CustomError): @fieldwise_init -@register_passable("trivial") -struct AcceptEMFILEError(CustomError): +struct AcceptEMFILEError(CustomError, TrivialRegisterPassable): comptime message = "accept (EMFILE): The per-process limit of open file descriptors has been reached." fn write_to[W: Writer, //](self, mut writer: W): @@ -96,8 +87,7 @@ struct AcceptEMFILEError(CustomError): @fieldwise_init -@register_passable("trivial") -struct AcceptENFILEError(CustomError): +struct AcceptENFILEError(CustomError, TrivialRegisterPassable): comptime message = "accept (ENFILE): The system limit on the total number of open files has been reached." fn write_to[W: Writer, //](self, mut writer: W): @@ -108,8 +98,7 @@ struct AcceptENFILEError(CustomError): @fieldwise_init -@register_passable("trivial") -struct AcceptENOBUFSError(CustomError): +struct AcceptENOBUFSError(CustomError, TrivialRegisterPassable): comptime message = "accept (ENOBUFS): Not enough free memory." fn write_to[W: Writer, //](self, mut writer: W): @@ -120,8 +109,7 @@ struct AcceptENOBUFSError(CustomError): @fieldwise_init -@register_passable("trivial") -struct AcceptENOTSOCKError(CustomError): +struct AcceptENOTSOCKError(CustomError, TrivialRegisterPassable): comptime message = "accept (ENOTSOCK): socket is a descriptor for a file, not a socket." fn write_to[W: Writer, //](self, mut writer: W): @@ -132,8 +120,7 @@ struct AcceptENOTSOCKError(CustomError): @fieldwise_init -@register_passable("trivial") -struct AcceptEOPNOTSUPPError(CustomError): +struct AcceptEOPNOTSUPPError(CustomError, TrivialRegisterPassable): comptime message = "accept (EOPNOTSUPP): The referenced socket is not of type SOCK_STREAM." fn write_to[W: Writer, //](self, mut writer: W): @@ -144,8 +131,7 @@ struct AcceptEOPNOTSUPPError(CustomError): @fieldwise_init -@register_passable("trivial") -struct AcceptEPERMError(CustomError): +struct AcceptEPERMError(CustomError, TrivialRegisterPassable): comptime message = "accept (EPERM): Firewall rules forbid connection." fn write_to[W: Writer, //](self, mut writer: W): @@ -156,8 +142,7 @@ struct AcceptEPERMError(CustomError): @fieldwise_init -@register_passable("trivial") -struct AcceptEPROTOError(CustomError): +struct AcceptEPROTOError(CustomError, TrivialRegisterPassable): comptime message = "accept (EPROTO): Protocol error." fn write_to[W: Writer, //](self, mut writer: W): @@ -169,8 +154,7 @@ struct AcceptEPROTOError(CustomError): # Bind errors @fieldwise_init -@register_passable("trivial") -struct BindEACCESError(CustomError): +struct BindEACCESError(CustomError, TrivialRegisterPassable): comptime message = "bind (EACCES): The address is protected, and the user is not the superuser." fn write_to[W: Writer, //](self, mut writer: W): @@ -181,8 +165,7 @@ struct BindEACCESError(CustomError): @fieldwise_init -@register_passable("trivial") -struct BindEADDRINUSEError(CustomError): +struct BindEADDRINUSEError(CustomError, TrivialRegisterPassable): comptime message = "bind (EADDRINUSE): The given address is already in use." fn write_to[W: Writer, //](self, mut writer: W): @@ -193,8 +176,7 @@ struct BindEADDRINUSEError(CustomError): @fieldwise_init -@register_passable("trivial") -struct BindEBADFError(CustomError): +struct BindEBADFError(CustomError, TrivialRegisterPassable): comptime message = "bind (EBADF): socket is not a valid descriptor." fn write_to[W: Writer, //](self, mut writer: W): @@ -205,8 +187,7 @@ struct BindEBADFError(CustomError): @fieldwise_init -@register_passable("trivial") -struct BindEFAULTError(CustomError): +struct BindEFAULTError(CustomError, TrivialRegisterPassable): comptime message = "bind (EFAULT): address points outside the user's accessible address space." fn write_to[W: Writer, //](self, mut writer: W): @@ -217,8 +198,7 @@ struct BindEFAULTError(CustomError): @fieldwise_init -@register_passable("trivial") -struct BindEINVALError(CustomError): +struct BindEINVALError(CustomError, TrivialRegisterPassable): comptime message = "bind (EINVAL): The socket is already bound to an address." fn write_to[W: Writer, //](self, mut writer: W): @@ -229,8 +209,7 @@ struct BindEINVALError(CustomError): @fieldwise_init -@register_passable("trivial") -struct BindELOOPError(CustomError): +struct BindELOOPError(CustomError, TrivialRegisterPassable): comptime message = "bind (ELOOP): Too many symbolic links were encountered in resolving address." fn write_to[W: Writer, //](self, mut writer: W): @@ -241,8 +220,7 @@ struct BindELOOPError(CustomError): @fieldwise_init -@register_passable("trivial") -struct BindENAMETOOLONGError(CustomError): +struct BindENAMETOOLONGError(CustomError, TrivialRegisterPassable): comptime message = "bind (ENAMETOOLONG): address is too long." fn write_to[W: Writer, //](self, mut writer: W): @@ -253,8 +231,7 @@ struct BindENAMETOOLONGError(CustomError): @fieldwise_init -@register_passable("trivial") -struct BindENOMEMError(CustomError): +struct BindENOMEMError(CustomError, TrivialRegisterPassable): comptime message = "bind (ENOMEM): Insufficient kernel memory was available." fn write_to[W: Writer, //](self, mut writer: W): @@ -265,8 +242,7 @@ struct BindENOMEMError(CustomError): @fieldwise_init -@register_passable("trivial") -struct BindENOTSOCKError(CustomError): +struct BindENOTSOCKError(CustomError, TrivialRegisterPassable): comptime message = "bind (ENOTSOCK): socket is a descriptor for a file, not a socket." fn write_to[W: Writer, //](self, mut writer: W): @@ -278,8 +254,7 @@ struct BindENOTSOCKError(CustomError): # Close errors @fieldwise_init -@register_passable("trivial") -struct CloseEBADFError(CustomError): +struct CloseEBADFError(CustomError, TrivialRegisterPassable): comptime message = "close (EBADF): The file_descriptor argument is not a valid open file descriptor." fn write_to[W: Writer, //](self, mut writer: W): @@ -290,8 +265,7 @@ struct CloseEBADFError(CustomError): @fieldwise_init -@register_passable("trivial") -struct CloseEINTRError(CustomError): +struct CloseEINTRError(CustomError, TrivialRegisterPassable): comptime message = "close (EINTR): The close() function was interrupted by a signal." fn write_to[W: Writer, //](self, mut writer: W): @@ -302,8 +276,7 @@ struct CloseEINTRError(CustomError): @fieldwise_init -@register_passable("trivial") -struct CloseEIOError(CustomError): +struct CloseEIOError(CustomError, TrivialRegisterPassable): comptime message = "close (EIO): An I/O error occurred while reading from or writing to the file system." fn write_to[W: Writer, //](self, mut writer: W): @@ -314,8 +287,7 @@ struct CloseEIOError(CustomError): @fieldwise_init -@register_passable("trivial") -struct CloseENOSPCError(CustomError): +struct CloseENOSPCError(CustomError, TrivialRegisterPassable): comptime message = "close (ENOSPC or EDQUOT): On NFS, these errors are not normally reported against the first write which exceeds the available storage space, but instead against a subsequent write, fsync, or close." fn write_to[W: Writer, //](self, mut writer: W): @@ -327,8 +299,7 @@ struct CloseENOSPCError(CustomError): # Connect errors @fieldwise_init -@register_passable("trivial") -struct ConnectEACCESError(CustomError): +struct ConnectEACCESError(CustomError, TrivialRegisterPassable): comptime message = "connect (EACCES): Write permission is denied on the socket file, or search permission is denied for one of the directories in the path prefix." fn write_to[W: Writer, //](self, mut writer: W): @@ -339,8 +310,7 @@ struct ConnectEACCESError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ConnectEADDRINUSEError(CustomError): +struct ConnectEADDRINUSEError(CustomError, TrivialRegisterPassable): comptime message = "connect (EADDRINUSE): Local address is already in use." fn write_to[W: Writer, //](self, mut writer: W): @@ -351,8 +321,7 @@ struct ConnectEADDRINUSEError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ConnectEAFNOSUPPORTError(CustomError): +struct ConnectEAFNOSUPPORTError(CustomError, TrivialRegisterPassable): comptime message = "connect (EAFNOSUPPORT): The passed address didn't have the correct address family in its sa_family field." fn write_to[W: Writer, //](self, mut writer: W): @@ -363,8 +332,7 @@ struct ConnectEAFNOSUPPORTError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ConnectEAGAINError(CustomError): +struct ConnectEAGAINError(CustomError, TrivialRegisterPassable): comptime message = "connect (EAGAIN): No more free local ports or insufficient entries in the routing cache." fn write_to[W: Writer, //](self, mut writer: W): @@ -375,8 +343,7 @@ struct ConnectEAGAINError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ConnectEALREADYError(CustomError): +struct ConnectEALREADYError(CustomError, TrivialRegisterPassable): comptime message = "connect (EALREADY): The socket is nonblocking and a previous connection attempt has not yet been completed." fn write_to[W: Writer, //](self, mut writer: W): @@ -387,8 +354,7 @@ struct ConnectEALREADYError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ConnectEBADFError(CustomError): +struct ConnectEBADFError(CustomError, TrivialRegisterPassable): comptime message = "connect (EBADF): The file descriptor is not a valid index in the descriptor table." fn write_to[W: Writer, //](self, mut writer: W): @@ -399,8 +365,7 @@ struct ConnectEBADFError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ConnectECONNREFUSEDError(CustomError): +struct ConnectECONNREFUSEDError(CustomError, TrivialRegisterPassable): comptime message = "connect (ECONNREFUSED): No-one listening on the remote address." fn write_to[W: Writer, //](self, mut writer: W): @@ -411,8 +376,7 @@ struct ConnectECONNREFUSEDError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ConnectEFAULTError(CustomError): +struct ConnectEFAULTError(CustomError, TrivialRegisterPassable): comptime message = "connect (EFAULT): The socket structure address is outside the user's address space." fn write_to[W: Writer, //](self, mut writer: W): @@ -423,8 +387,7 @@ struct ConnectEFAULTError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ConnectEINPROGRESSError(CustomError): +struct ConnectEINPROGRESSError(CustomError, TrivialRegisterPassable): comptime message = "connect (EINPROGRESS): The socket is nonblocking and the connection cannot be completed immediately. It is possible to select(2) or poll(2) for completion by selecting the socket for writing. After select(2) indicates writability, use getsockopt(2) to read the SO_ERROR option at level SOL_SOCKET to determine whether connect() completed successfully (SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual error codes listed here, explaining the reason for the failure)." fn write_to[W: Writer, //](self, mut writer: W): @@ -435,8 +398,7 @@ struct ConnectEINPROGRESSError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ConnectEINTRError(CustomError): +struct ConnectEINTRError(CustomError, TrivialRegisterPassable): comptime message = "connect (EINTR): The system call was interrupted by a signal that was caught." fn write_to[W: Writer, //](self, mut writer: W): @@ -447,8 +409,7 @@ struct ConnectEINTRError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ConnectEISCONNError(CustomError): +struct ConnectEISCONNError(CustomError, TrivialRegisterPassable): comptime message = "connect (EISCONN): The socket is already connected." fn write_to[W: Writer, //](self, mut writer: W): @@ -459,8 +420,7 @@ struct ConnectEISCONNError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ConnectENETUNREACHError(CustomError): +struct ConnectENETUNREACHError(CustomError, TrivialRegisterPassable): comptime message = "connect (ENETUNREACH): Network is unreachable." fn write_to[W: Writer, //](self, mut writer: W): @@ -471,8 +431,7 @@ struct ConnectENETUNREACHError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ConnectENOTSOCKError(CustomError): +struct ConnectENOTSOCKError(CustomError, TrivialRegisterPassable): comptime message = "connect (ENOTSOCK): The file descriptor is not associated with a socket." fn write_to[W: Writer, //](self, mut writer: W): @@ -483,8 +442,7 @@ struct ConnectENOTSOCKError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ConnectETIMEDOUTError(CustomError): +struct ConnectETIMEDOUTError(CustomError, TrivialRegisterPassable): comptime message = "connect (ETIMEDOUT): Timeout while attempting connection." fn write_to[W: Writer, //](self, mut writer: W): @@ -496,8 +454,7 @@ struct ConnectETIMEDOUTError(CustomError): # Getpeername errors @fieldwise_init -@register_passable("trivial") -struct GetpeernameEBADFError(CustomError): +struct GetpeernameEBADFError(CustomError, TrivialRegisterPassable): comptime message = "getpeername (EBADF): socket is not a valid descriptor." fn write_to[W: Writer, //](self, mut writer: W): @@ -508,8 +465,7 @@ struct GetpeernameEBADFError(CustomError): @fieldwise_init -@register_passable("trivial") -struct GetpeernameEFAULTError(CustomError): +struct GetpeernameEFAULTError(CustomError, TrivialRegisterPassable): comptime message = "getpeername (EFAULT): The address argument points to memory not in a valid part of the process address space." fn write_to[W: Writer, //](self, mut writer: W): @@ -520,8 +476,7 @@ struct GetpeernameEFAULTError(CustomError): @fieldwise_init -@register_passable("trivial") -struct GetpeernameEINVALError(CustomError): +struct GetpeernameEINVALError(CustomError, TrivialRegisterPassable): comptime message = "getpeername (EINVAL): address_len is invalid (e.g., is negative)." fn write_to[W: Writer, //](self, mut writer: W): @@ -532,8 +487,7 @@ struct GetpeernameEINVALError(CustomError): @fieldwise_init -@register_passable("trivial") -struct GetpeernameENOBUFSError(CustomError): +struct GetpeernameENOBUFSError(CustomError, TrivialRegisterPassable): comptime message = "getpeername (ENOBUFS): Insufficient resources were available in the system to perform the operation." fn write_to[W: Writer, //](self, mut writer: W): @@ -544,8 +498,7 @@ struct GetpeernameENOBUFSError(CustomError): @fieldwise_init -@register_passable("trivial") -struct GetpeernameENOTCONNError(CustomError): +struct GetpeernameENOTCONNError(CustomError, TrivialRegisterPassable): comptime message = "getpeername (ENOTCONN): The socket is not connected." fn write_to[W: Writer, //](self, mut writer: W): @@ -556,8 +509,7 @@ struct GetpeernameENOTCONNError(CustomError): @fieldwise_init -@register_passable("trivial") -struct GetpeernameENOTSOCKError(CustomError): +struct GetpeernameENOTSOCKError(CustomError, TrivialRegisterPassable): comptime message = "getpeername (ENOTSOCK): The argument socket is not a socket." fn write_to[W: Writer, //](self, mut writer: W): @@ -569,8 +521,7 @@ struct GetpeernameENOTSOCKError(CustomError): # Getsockname errors @fieldwise_init -@register_passable("trivial") -struct GetsocknameEBADFError(CustomError): +struct GetsocknameEBADFError(CustomError, TrivialRegisterPassable): comptime message = "getsockname (EBADF): socket is not a valid descriptor." fn write_to[W: Writer, //](self, mut writer: W): @@ -581,8 +532,7 @@ struct GetsocknameEBADFError(CustomError): @fieldwise_init -@register_passable("trivial") -struct GetsocknameEFAULTError(CustomError): +struct GetsocknameEFAULTError(CustomError, TrivialRegisterPassable): comptime message = "getsockname (EFAULT): The address argument points to memory not in a valid part of the process address space." fn write_to[W: Writer, //](self, mut writer: W): @@ -593,8 +543,7 @@ struct GetsocknameEFAULTError(CustomError): @fieldwise_init -@register_passable("trivial") -struct GetsocknameEINVALError(CustomError): +struct GetsocknameEINVALError(CustomError, TrivialRegisterPassable): comptime message = "getsockname (EINVAL): address_len is invalid (e.g., is negative)." fn write_to[W: Writer, //](self, mut writer: W): @@ -605,8 +554,7 @@ struct GetsocknameEINVALError(CustomError): @fieldwise_init -@register_passable("trivial") -struct GetsocknameENOBUFSError(CustomError): +struct GetsocknameENOBUFSError(CustomError, TrivialRegisterPassable): comptime message = "getsockname (ENOBUFS): Insufficient resources were available in the system to perform the operation." fn write_to[W: Writer, //](self, mut writer: W): @@ -617,8 +565,7 @@ struct GetsocknameENOBUFSError(CustomError): @fieldwise_init -@register_passable("trivial") -struct GetsocknameENOTSOCKError(CustomError): +struct GetsocknameENOTSOCKError(CustomError, TrivialRegisterPassable): comptime message = "getsockname (ENOTSOCK): The argument socket is a file, not a socket." fn write_to[W: Writer, //](self, mut writer: W): @@ -630,8 +577,7 @@ struct GetsocknameENOTSOCKError(CustomError): # Getsockopt errors @fieldwise_init -@register_passable("trivial") -struct GetsockoptEBADFError(CustomError): +struct GetsockoptEBADFError(CustomError, TrivialRegisterPassable): comptime message = "getsockopt (EBADF): The argument socket is not a valid descriptor." fn write_to[W: Writer, //](self, mut writer: W): @@ -642,8 +588,7 @@ struct GetsockoptEBADFError(CustomError): @fieldwise_init -@register_passable("trivial") -struct GetsockoptEFAULTError(CustomError): +struct GetsockoptEFAULTError(CustomError, TrivialRegisterPassable): comptime message = "getsockopt (EFAULT): The argument option_value points outside the process's allocated address space." fn write_to[W: Writer, //](self, mut writer: W): @@ -654,8 +599,7 @@ struct GetsockoptEFAULTError(CustomError): @fieldwise_init -@register_passable("trivial") -struct GetsockoptEINVALError(CustomError): +struct GetsockoptEINVALError(CustomError, TrivialRegisterPassable): comptime message = "getsockopt (EINVAL): The argument option_len is invalid." fn write_to[W: Writer, //](self, mut writer: W): @@ -666,8 +610,7 @@ struct GetsockoptEINVALError(CustomError): @fieldwise_init -@register_passable("trivial") -struct GetsockoptENOPROTOOPTError(CustomError): +struct GetsockoptENOPROTOOPTError(CustomError, TrivialRegisterPassable): comptime message = "getsockopt (ENOPROTOOPT): The option is unknown at the level indicated." fn write_to[W: Writer, //](self, mut writer: W): @@ -678,8 +621,7 @@ struct GetsockoptENOPROTOOPTError(CustomError): @fieldwise_init -@register_passable("trivial") -struct GetsockoptENOTSOCKError(CustomError): +struct GetsockoptENOTSOCKError(CustomError, TrivialRegisterPassable): comptime message = "getsockopt (ENOTSOCK): The argument socket is not a socket." fn write_to[W: Writer, //](self, mut writer: W): @@ -691,8 +633,7 @@ struct GetsockoptENOTSOCKError(CustomError): # Listen errors @fieldwise_init -@register_passable("trivial") -struct ListenEADDRINUSEError(CustomError): +struct ListenEADDRINUSEError(CustomError, TrivialRegisterPassable): comptime message = "listen (EADDRINUSE): Another socket is already listening on the same port." fn write_to[W: Writer, //](self, mut writer: W): @@ -703,8 +644,7 @@ struct ListenEADDRINUSEError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ListenEBADFError(CustomError): +struct ListenEBADFError(CustomError, TrivialRegisterPassable): comptime message = "listen (EBADF): socket is not a valid descriptor." fn write_to[W: Writer, //](self, mut writer: W): @@ -715,8 +655,7 @@ struct ListenEBADFError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ListenENOTSOCKError(CustomError): +struct ListenENOTSOCKError(CustomError, TrivialRegisterPassable): comptime message = "listen (ENOTSOCK): socket is a descriptor for a file, not a socket." fn write_to[W: Writer, //](self, mut writer: W): @@ -727,8 +666,7 @@ struct ListenENOTSOCKError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ListenEOPNOTSUPPError(CustomError): +struct ListenEOPNOTSUPPError(CustomError, TrivialRegisterPassable): comptime message = "listen (EOPNOTSUPP): The socket is not of a type that supports the listen() operation." fn write_to[W: Writer, //](self, mut writer: W): @@ -740,8 +678,7 @@ struct ListenEOPNOTSUPPError(CustomError): # Recv errors @fieldwise_init -@register_passable("trivial") -struct RecvEAGAINError(CustomError): +struct RecvEAGAINError(CustomError, TrivialRegisterPassable): comptime message = "recv (EAGAIN/EWOULDBLOCK): The socket is marked nonblocking and the receive operation would block." fn write_to[W: Writer, //](self, mut writer: W): @@ -752,8 +689,7 @@ struct RecvEAGAINError(CustomError): @fieldwise_init -@register_passable("trivial") -struct RecvEBADFError(CustomError): +struct RecvEBADFError(CustomError, TrivialRegisterPassable): comptime message = "recv (EBADF): The argument socket is an invalid descriptor." fn write_to[W: Writer, //](self, mut writer: W): @@ -764,8 +700,7 @@ struct RecvEBADFError(CustomError): @fieldwise_init -@register_passable("trivial") -struct RecvECONNREFUSEDError(CustomError): +struct RecvECONNREFUSEDError(CustomError, TrivialRegisterPassable): comptime message = "recv (ECONNREFUSED): The remote host refused to allow the network connection." fn write_to[W: Writer, //](self, mut writer: W): @@ -776,8 +711,7 @@ struct RecvECONNREFUSEDError(CustomError): @fieldwise_init -@register_passable("trivial") -struct RecvEFAULTError(CustomError): +struct RecvEFAULTError(CustomError, TrivialRegisterPassable): comptime message = "recv (EFAULT): buffer points outside the process's address space." fn write_to[W: Writer, //](self, mut writer: W): @@ -788,8 +722,7 @@ struct RecvEFAULTError(CustomError): @fieldwise_init -@register_passable("trivial") -struct RecvEINTRError(CustomError): +struct RecvEINTRError(CustomError, TrivialRegisterPassable): comptime message = "recv (EINTR): The receive was interrupted by delivery of a signal before any data were available." fn write_to[W: Writer, //](self, mut writer: W): @@ -800,8 +733,7 @@ struct RecvEINTRError(CustomError): @fieldwise_init -@register_passable("trivial") -struct RecvENOTCONNError(CustomError): +struct RecvENOTCONNError(CustomError, TrivialRegisterPassable): comptime message = "recv (ENOTCONN): The socket is not connected." fn write_to[W: Writer, //](self, mut writer: W): @@ -812,8 +744,7 @@ struct RecvENOTCONNError(CustomError): @fieldwise_init -@register_passable("trivial") -struct RecvENOTSOCKError(CustomError): +struct RecvENOTSOCKError(CustomError, TrivialRegisterPassable): comptime message = "recv (ENOTSOCK): The file descriptor is not associated with a socket." fn write_to[W: Writer, //](self, mut writer: W): @@ -825,8 +756,7 @@ struct RecvENOTSOCKError(CustomError): # Recvfrom errors @fieldwise_init -@register_passable("trivial") -struct RecvfromEAGAINError(CustomError): +struct RecvfromEAGAINError(CustomError, TrivialRegisterPassable): comptime message = "recvfrom (EAGAIN/EWOULDBLOCK): The socket is marked nonblocking and the receive operation would block." fn write_to[W: Writer, //](self, mut writer: W): @@ -837,8 +767,7 @@ struct RecvfromEAGAINError(CustomError): @fieldwise_init -@register_passable("trivial") -struct RecvfromEBADFError(CustomError): +struct RecvfromEBADFError(CustomError, TrivialRegisterPassable): comptime message = "recvfrom (EBADF): The argument socket is an invalid descriptor." fn write_to[W: Writer, //](self, mut writer: W): @@ -849,8 +778,7 @@ struct RecvfromEBADFError(CustomError): @fieldwise_init -@register_passable("trivial") -struct RecvfromECONNRESETError(CustomError): +struct RecvfromECONNRESETError(CustomError, TrivialRegisterPassable): comptime message = "recvfrom (ECONNRESET): A connection was forcibly closed by a peer." fn write_to[W: Writer, //](self, mut writer: W): @@ -861,8 +789,7 @@ struct RecvfromECONNRESETError(CustomError): @fieldwise_init -@register_passable("trivial") -struct RecvfromEINTRError(CustomError): +struct RecvfromEINTRError(CustomError, TrivialRegisterPassable): comptime message = "recvfrom (EINTR): The receive was interrupted by delivery of a signal." fn write_to[W: Writer, //](self, mut writer: W): @@ -873,8 +800,7 @@ struct RecvfromEINTRError(CustomError): @fieldwise_init -@register_passable("trivial") -struct RecvfromEINVALError(CustomError): +struct RecvfromEINVALError(CustomError, TrivialRegisterPassable): comptime message = "recvfrom (EINVAL): Invalid argument passed." fn write_to[W: Writer, //](self, mut writer: W): @@ -885,8 +811,7 @@ struct RecvfromEINVALError(CustomError): @fieldwise_init -@register_passable("trivial") -struct RecvfromEIOError(CustomError): +struct RecvfromEIOError(CustomError, TrivialRegisterPassable): comptime message = "recvfrom (EIO): An I/O error occurred." fn write_to[W: Writer, //](self, mut writer: W): @@ -897,8 +822,7 @@ struct RecvfromEIOError(CustomError): @fieldwise_init -@register_passable("trivial") -struct RecvfromENOBUFSError(CustomError): +struct RecvfromENOBUFSError(CustomError, TrivialRegisterPassable): comptime message = "recvfrom (ENOBUFS): Insufficient resources were available in the system to perform the operation." fn write_to[W: Writer, //](self, mut writer: W): @@ -909,8 +833,7 @@ struct RecvfromENOBUFSError(CustomError): @fieldwise_init -@register_passable("trivial") -struct RecvfromENOMEMError(CustomError): +struct RecvfromENOMEMError(CustomError, TrivialRegisterPassable): comptime message = "recvfrom (ENOMEM): Insufficient memory was available to fulfill the request." fn write_to[W: Writer, //](self, mut writer: W): @@ -921,8 +844,7 @@ struct RecvfromENOMEMError(CustomError): @fieldwise_init -@register_passable("trivial") -struct RecvfromENOTCONNError(CustomError): +struct RecvfromENOTCONNError(CustomError, TrivialRegisterPassable): comptime message = "recvfrom (ENOTCONN): The socket is not connected." fn write_to[W: Writer, //](self, mut writer: W): @@ -933,8 +855,7 @@ struct RecvfromENOTCONNError(CustomError): @fieldwise_init -@register_passable("trivial") -struct RecvfromENOTSOCKError(CustomError): +struct RecvfromENOTSOCKError(CustomError, TrivialRegisterPassable): comptime message = "recvfrom (ENOTSOCK): The file descriptor is not associated with a socket." fn write_to[W: Writer, //](self, mut writer: W): @@ -945,8 +866,7 @@ struct RecvfromENOTSOCKError(CustomError): @fieldwise_init -@register_passable("trivial") -struct RecvfromEOPNOTSUPPError(CustomError): +struct RecvfromEOPNOTSUPPError(CustomError, TrivialRegisterPassable): comptime message = "recvfrom (EOPNOTSUPP): The specified flags are not supported for this socket type or protocol." fn write_to[W: Writer, //](self, mut writer: W): @@ -957,8 +877,7 @@ struct RecvfromEOPNOTSUPPError(CustomError): @fieldwise_init -@register_passable("trivial") -struct RecvfromETIMEDOUTError(CustomError): +struct RecvfromETIMEDOUTError(CustomError, TrivialRegisterPassable): comptime message = "recvfrom (ETIMEDOUT): The connection timed out." fn write_to[W: Writer, //](self, mut writer: W): @@ -970,8 +889,7 @@ struct RecvfromETIMEDOUTError(CustomError): # Send errors @fieldwise_init -@register_passable("trivial") -struct SendEAGAINError(CustomError): +struct SendEAGAINError(CustomError, TrivialRegisterPassable): comptime message = "send (EAGAIN/EWOULDBLOCK): The socket is marked nonblocking and the send operation would block." fn write_to[W: Writer, //](self, mut writer: W): @@ -982,8 +900,7 @@ struct SendEAGAINError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendEBADFError(CustomError): +struct SendEBADFError(CustomError, TrivialRegisterPassable): comptime message = "send (EBADF): The argument socket is an invalid descriptor." fn write_to[W: Writer, //](self, mut writer: W): @@ -994,8 +911,7 @@ struct SendEBADFError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendECONNREFUSEDError(CustomError): +struct SendECONNREFUSEDError(CustomError, TrivialRegisterPassable): comptime message = "send (ECONNREFUSED): The remote host refused to allow the network connection." fn write_to[W: Writer, //](self, mut writer: W): @@ -1006,8 +922,7 @@ struct SendECONNREFUSEDError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendECONNRESETError(CustomError): +struct SendECONNRESETError(CustomError, TrivialRegisterPassable): comptime message = "send (ECONNRESET): Connection reset by peer." fn write_to[W: Writer, //](self, mut writer: W): @@ -1018,8 +933,7 @@ struct SendECONNRESETError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendEDESTADDRREQError(CustomError): +struct SendEDESTADDRREQError(CustomError, TrivialRegisterPassable): comptime message = "send (EDESTADDRREQ): The socket is not connection-mode, and no peer address is set." fn write_to[W: Writer, //](self, mut writer: W): @@ -1030,8 +944,7 @@ struct SendEDESTADDRREQError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendEFAULTError(CustomError): +struct SendEFAULTError(CustomError, TrivialRegisterPassable): comptime message = "send (EFAULT): buffer points outside the process's address space." fn write_to[W: Writer, //](self, mut writer: W): @@ -1042,8 +955,7 @@ struct SendEFAULTError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendEINTRError(CustomError): +struct SendEINTRError(CustomError, TrivialRegisterPassable): comptime message = "send (EINTR): The send was interrupted by delivery of a signal." fn write_to[W: Writer, //](self, mut writer: W): @@ -1054,8 +966,7 @@ struct SendEINTRError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendEINVALError(CustomError): +struct SendEINVALError(CustomError, TrivialRegisterPassable): comptime message = "send (EINVAL): Invalid argument passed." fn write_to[W: Writer, //](self, mut writer: W): @@ -1066,8 +977,7 @@ struct SendEINVALError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendEISCONNError(CustomError): +struct SendEISCONNError(CustomError, TrivialRegisterPassable): comptime message = "send (EISCONN): The connection-mode socket was connected already but a recipient was specified." fn write_to[W: Writer, //](self, mut writer: W): @@ -1078,8 +988,7 @@ struct SendEISCONNError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendENOBUFSError(CustomError): +struct SendENOBUFSError(CustomError, TrivialRegisterPassable): comptime message = "send (ENOBUFS): The output queue for a network interface was full." fn write_to[W: Writer, //](self, mut writer: W): @@ -1090,8 +999,7 @@ struct SendENOBUFSError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendENOMEMError(CustomError): +struct SendENOMEMError(CustomError, TrivialRegisterPassable): comptime message = "send (ENOMEM): No memory available." fn write_to[W: Writer, //](self, mut writer: W): @@ -1102,8 +1010,7 @@ struct SendENOMEMError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendENOTCONNError(CustomError): +struct SendENOTCONNError(CustomError, TrivialRegisterPassable): comptime message = "send (ENOTCONN): The socket is not connected." fn write_to[W: Writer, //](self, mut writer: W): @@ -1114,8 +1021,7 @@ struct SendENOTCONNError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendENOTSOCKError(CustomError): +struct SendENOTSOCKError(CustomError, TrivialRegisterPassable): comptime message = "send (ENOTSOCK): The file descriptor is not associated with a socket." fn write_to[W: Writer, //](self, mut writer: W): @@ -1126,8 +1032,7 @@ struct SendENOTSOCKError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendEOPNOTSUPPError(CustomError): +struct SendEOPNOTSUPPError(CustomError, TrivialRegisterPassable): comptime message = "send (EOPNOTSUPP): Some bit in the flags argument is inappropriate for the socket type." fn write_to[W: Writer, //](self, mut writer: W): @@ -1139,8 +1044,7 @@ struct SendEOPNOTSUPPError(CustomError): # Sendto errors @fieldwise_init -@register_passable("trivial") -struct SendtoEACCESError(CustomError): +struct SendtoEACCESError(CustomError, TrivialRegisterPassable): comptime message = "sendto (EACCES): Write access to the named socket is denied." fn write_to[W: Writer, //](self, mut writer: W): @@ -1151,8 +1055,7 @@ struct SendtoEACCESError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoEAFNOSUPPORTError(CustomError): +struct SendtoEAFNOSUPPORTError(CustomError, TrivialRegisterPassable): comptime message = "sendto (EAFNOSUPPORT): Addresses in the specified address family cannot be used with this socket." fn write_to[W: Writer, //](self, mut writer: W): @@ -1163,8 +1066,7 @@ struct SendtoEAFNOSUPPORTError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoEAGAINError(CustomError): +struct SendtoEAGAINError(CustomError, TrivialRegisterPassable): comptime message = "sendto (EAGAIN/EWOULDBLOCK): The socket's file descriptor is marked O_NONBLOCK and the requested operation would block." fn write_to[W: Writer, //](self, mut writer: W): @@ -1175,8 +1077,7 @@ struct SendtoEAGAINError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoEBADFError(CustomError): +struct SendtoEBADFError(CustomError, TrivialRegisterPassable): comptime message = "sendto (EBADF): The argument socket is an invalid descriptor." fn write_to[W: Writer, //](self, mut writer: W): @@ -1187,8 +1088,7 @@ struct SendtoEBADFError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoECONNRESETError(CustomError): +struct SendtoECONNRESETError(CustomError, TrivialRegisterPassable): comptime message = "sendto (ECONNRESET): A connection was forcibly closed by a peer." fn write_to[W: Writer, //](self, mut writer: W): @@ -1199,8 +1099,7 @@ struct SendtoECONNRESETError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoEDESTADDRREQError(CustomError): +struct SendtoEDESTADDRREQError(CustomError, TrivialRegisterPassable): comptime message = "sendto (EDESTADDRREQ): The socket is not connection-mode and does not have its peer address set, and no destination address was specified." fn write_to[W: Writer, //](self, mut writer: W): @@ -1211,8 +1110,7 @@ struct SendtoEDESTADDRREQError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoEHOSTUNREACHError(CustomError): +struct SendtoEHOSTUNREACHError(CustomError, TrivialRegisterPassable): comptime message = "sendto (EHOSTUNREACH): The destination host cannot be reached." fn write_to[W: Writer, //](self, mut writer: W): @@ -1223,8 +1121,7 @@ struct SendtoEHOSTUNREACHError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoEINTRError(CustomError): +struct SendtoEINTRError(CustomError, TrivialRegisterPassable): comptime message = "sendto (EINTR): The send was interrupted by delivery of a signal." fn write_to[W: Writer, //](self, mut writer: W): @@ -1235,8 +1132,7 @@ struct SendtoEINTRError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoEINVALError(CustomError): +struct SendtoEINVALError(CustomError, TrivialRegisterPassable): comptime message = "sendto (EINVAL): Invalid argument passed." fn write_to[W: Writer, //](self, mut writer: W): @@ -1247,8 +1143,7 @@ struct SendtoEINVALError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoEIOError(CustomError): +struct SendtoEIOError(CustomError, TrivialRegisterPassable): comptime message = "sendto (EIO): An I/O error occurred." fn write_to[W: Writer, //](self, mut writer: W): @@ -1259,8 +1154,7 @@ struct SendtoEIOError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoEISCONNError(CustomError): +struct SendtoEISCONNError(CustomError, TrivialRegisterPassable): comptime message = "sendto (EISCONN): A destination address was specified and the socket is already connected." fn write_to[W: Writer, //](self, mut writer: W): @@ -1271,8 +1165,7 @@ struct SendtoEISCONNError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoELOOPError(CustomError): +struct SendtoELOOPError(CustomError, TrivialRegisterPassable): comptime message = "sendto (ELOOP): More than SYMLOOP_MAX symbolic links were encountered during resolution of the pathname in the socket address." fn write_to[W: Writer, //](self, mut writer: W): @@ -1283,8 +1176,7 @@ struct SendtoELOOPError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoEMSGSIZEError(CustomError): +struct SendtoEMSGSIZEError(CustomError, TrivialRegisterPassable): comptime message = "sendto (EMSGSIZE): The message is too large to be sent all at once, as the socket requires." fn write_to[W: Writer, //](self, mut writer: W): @@ -1295,8 +1187,7 @@ struct SendtoEMSGSIZEError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoENAMETOOLONGError(CustomError): +struct SendtoENAMETOOLONGError(CustomError, TrivialRegisterPassable): comptime message = "sendto (ENAMETOOLONG): The length of a pathname exceeds PATH_MAX." fn write_to[W: Writer, //](self, mut writer: W): @@ -1307,8 +1198,7 @@ struct SendtoENAMETOOLONGError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoENETDOWNError(CustomError): +struct SendtoENETDOWNError(CustomError, TrivialRegisterPassable): comptime message = "sendto (ENETDOWN): The local network interface used to reach the destination is down." fn write_to[W: Writer, //](self, mut writer: W): @@ -1319,8 +1209,7 @@ struct SendtoENETDOWNError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoENETUNREACHError(CustomError): +struct SendtoENETUNREACHError(CustomError, TrivialRegisterPassable): comptime message = "sendto (ENETUNREACH): No route to the network is present." fn write_to[W: Writer, //](self, mut writer: W): @@ -1331,8 +1220,7 @@ struct SendtoENETUNREACHError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoENOBUFSError(CustomError): +struct SendtoENOBUFSError(CustomError, TrivialRegisterPassable): comptime message = "sendto (ENOBUFS): Insufficient resources were available in the system to perform the operation." fn write_to[W: Writer, //](self, mut writer: W): @@ -1343,8 +1231,7 @@ struct SendtoENOBUFSError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoENOMEMError(CustomError): +struct SendtoENOMEMError(CustomError, TrivialRegisterPassable): comptime message = "sendto (ENOMEM): Insufficient memory was available to fulfill the request." fn write_to[W: Writer, //](self, mut writer: W): @@ -1355,8 +1242,7 @@ struct SendtoENOMEMError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoENOTCONNError(CustomError): +struct SendtoENOTCONNError(CustomError, TrivialRegisterPassable): comptime message = "sendto (ENOTCONN): The socket is not connected." fn write_to[W: Writer, //](self, mut writer: W): @@ -1367,8 +1253,7 @@ struct SendtoENOTCONNError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoENOTSOCKError(CustomError): +struct SendtoENOTSOCKError(CustomError, TrivialRegisterPassable): comptime message = "sendto (ENOTSOCK): The file descriptor is not associated with a socket." fn write_to[W: Writer, //](self, mut writer: W): @@ -1379,8 +1264,7 @@ struct SendtoENOTSOCKError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SendtoEPIPEError(CustomError): +struct SendtoEPIPEError(CustomError, TrivialRegisterPassable): comptime message = "sendto (EPIPE): The socket is shut down for writing, or the socket is connection-mode and is no longer connected." fn write_to[W: Writer, //](self, mut writer: W): @@ -1392,8 +1276,7 @@ struct SendtoEPIPEError(CustomError): # Setsockopt errors @fieldwise_init -@register_passable("trivial") -struct SetsockoptEBADFError(CustomError): +struct SetsockoptEBADFError(CustomError, TrivialRegisterPassable): comptime message = "setsockopt (EBADF): The argument socket is not a valid descriptor." fn write_to[W: Writer, //](self, mut writer: W): @@ -1404,8 +1287,7 @@ struct SetsockoptEBADFError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SetsockoptEFAULTError(CustomError): +struct SetsockoptEFAULTError(CustomError, TrivialRegisterPassable): comptime message = "setsockopt (EFAULT): The argument option_value points outside the process's allocated address space." fn write_to[W: Writer, //](self, mut writer: W): @@ -1416,8 +1298,7 @@ struct SetsockoptEFAULTError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SetsockoptEINVALError(CustomError): +struct SetsockoptEINVALError(CustomError, TrivialRegisterPassable): comptime message = "setsockopt (EINVAL): The argument option_len is invalid." fn write_to[W: Writer, //](self, mut writer: W): @@ -1428,8 +1309,7 @@ struct SetsockoptEINVALError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SetsockoptENOPROTOOPTError(CustomError): +struct SetsockoptENOPROTOOPTError(CustomError, TrivialRegisterPassable): comptime message = "setsockopt (ENOPROTOOPT): The option is unknown at the level indicated." fn write_to[W: Writer, //](self, mut writer: W): @@ -1440,8 +1320,7 @@ struct SetsockoptENOPROTOOPTError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SetsockoptENOTSOCKError(CustomError): +struct SetsockoptENOTSOCKError(CustomError, TrivialRegisterPassable): comptime message = "setsockopt (ENOTSOCK): The argument socket is not a socket." fn write_to[W: Writer, //](self, mut writer: W): @@ -1453,8 +1332,7 @@ struct SetsockoptENOTSOCKError(CustomError): # Shutdown errors @fieldwise_init -@register_passable("trivial") -struct ShutdownEBADFError(CustomError): +struct ShutdownEBADFError(CustomError, TrivialRegisterPassable): comptime message = "shutdown (EBADF): The argument socket is an invalid descriptor." fn write_to[W: Writer, //](self, mut writer: W): @@ -1465,8 +1343,7 @@ struct ShutdownEBADFError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ShutdownEINVALError(CustomError): +struct ShutdownEINVALError(CustomError, TrivialRegisterPassable): comptime message = "shutdown (EINVAL): Invalid argument passed." fn write_to[W: Writer, //](self, mut writer: W): @@ -1477,8 +1354,7 @@ struct ShutdownEINVALError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ShutdownENOTCONNError(CustomError): +struct ShutdownENOTCONNError(CustomError, TrivialRegisterPassable): comptime message = "shutdown (ENOTCONN): The socket is not connected." fn write_to[W: Writer, //](self, mut writer: W): @@ -1489,8 +1365,7 @@ struct ShutdownENOTCONNError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ShutdownENOTSOCKError(CustomError): +struct ShutdownENOTSOCKError(CustomError, TrivialRegisterPassable): comptime message = "shutdown (ENOTSOCK): The file descriptor is not associated with a socket." fn write_to[W: Writer, //](self, mut writer: W): @@ -1502,8 +1377,7 @@ struct ShutdownENOTSOCKError(CustomError): # Socket errors @fieldwise_init -@register_passable("trivial") -struct SocketEACCESError(CustomError): +struct SocketEACCESError(CustomError, TrivialRegisterPassable): comptime message = "socket (EACCES): Permission to create a socket of the specified type and/or protocol is denied." fn write_to[W: Writer, //](self, mut writer: W): @@ -1514,8 +1388,7 @@ struct SocketEACCESError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SocketEAFNOSUPPORTError(CustomError): +struct SocketEAFNOSUPPORTError(CustomError, TrivialRegisterPassable): comptime message = "socket (EAFNOSUPPORT): The implementation does not support the specified address family." fn write_to[W: Writer, //](self, mut writer: W): @@ -1526,8 +1399,7 @@ struct SocketEAFNOSUPPORTError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SocketEINVALError(CustomError): +struct SocketEINVALError(CustomError, TrivialRegisterPassable): comptime message = "socket (EINVAL): Invalid flags in type, unknown protocol, or protocol family not available." fn write_to[W: Writer, //](self, mut writer: W): @@ -1538,8 +1410,7 @@ struct SocketEINVALError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SocketEMFILEError(CustomError): +struct SocketEMFILEError(CustomError, TrivialRegisterPassable): comptime message = "socket (EMFILE): The per-process limit on the number of open file descriptors has been reached." fn write_to[W: Writer, //](self, mut writer: W): @@ -1550,8 +1421,7 @@ struct SocketEMFILEError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SocketENFILEError(CustomError): +struct SocketENFILEError(CustomError, TrivialRegisterPassable): comptime message = "socket (ENFILE): The system-wide limit on the total number of open files has been reached." fn write_to[W: Writer, //](self, mut writer: W): @@ -1562,8 +1432,7 @@ struct SocketENFILEError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SocketENOBUFSError(CustomError): +struct SocketENOBUFSError(CustomError, TrivialRegisterPassable): comptime message = "socket (ENOBUFS): Insufficient memory is available. The socket cannot be created until sufficient resources are freed." fn write_to[W: Writer, //](self, mut writer: W): @@ -1574,8 +1443,7 @@ struct SocketENOBUFSError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SocketEPROTONOSUPPORTError(CustomError): +struct SocketEPROTONOSUPPORTError(CustomError, TrivialRegisterPassable): comptime message = "socket (EPROTONOSUPPORT): The protocol type or the specified protocol is not supported within this domain." fn write_to[W: Writer, //](self, mut writer: W): @@ -1585,1266 +1453,186 @@ struct SocketEPROTONOSUPPORTError(CustomError): return Self.message -@fieldwise_init -struct AcceptError(Movable, Stringable, Writable): - """Typed error variant for accept() function.""" - - comptime type = Variant[ - AcceptEBADFError, - AcceptEINTRError, - AcceptEAGAINError, - AcceptECONNABORTEDError, - AcceptEFAULTError, - AcceptEINVALError, - AcceptEMFILEError, - AcceptENFILEError, - AcceptENOBUFSError, - AcceptENOTSOCKError, - AcceptEOPNOTSUPPError, - AcceptEPERMError, - AcceptEPROTOError, - Error, - ] - var value: Self.type - - @implicit - fn __init__(out self, value: AcceptEBADFError): - self.value = value - - @implicit - fn __init__(out self, value: AcceptEINTRError): - self.value = value - - @implicit - fn __init__(out self, value: AcceptEAGAINError): - self.value = value - - @implicit - fn __init__(out self, value: AcceptECONNABORTEDError): - self.value = value - - @implicit - fn __init__(out self, value: AcceptEFAULTError): - self.value = value - - @implicit - fn __init__(out self, value: AcceptEINVALError): - self.value = value - - @implicit - fn __init__(out self, value: AcceptEMFILEError): - self.value = value - - @implicit - fn __init__(out self, value: AcceptENFILEError): - self.value = value - - @implicit - fn __init__(out self, value: AcceptENOBUFSError): - self.value = value - - @implicit - fn __init__(out self, value: AcceptENOTSOCKError): - self.value = value - - @implicit - fn __init__(out self, value: AcceptEOPNOTSUPPError): - self.value = value - - @implicit - fn __init__(out self, value: AcceptEPERMError): - self.value = value - - @implicit - fn __init__(out self, value: AcceptEPROTOError): - self.value = value - - @implicit - fn __init__(out self, var value: Error): - self.value = value^ - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[AcceptEBADFError](): - writer.write(self.value[AcceptEBADFError]) - elif self.value.isa[AcceptEINTRError](): - writer.write(self.value[AcceptEINTRError]) - elif self.value.isa[AcceptEAGAINError](): - writer.write(self.value[AcceptEAGAINError]) - elif self.value.isa[AcceptECONNABORTEDError](): - writer.write(self.value[AcceptECONNABORTEDError]) - elif self.value.isa[AcceptEFAULTError](): - writer.write(self.value[AcceptEFAULTError]) - elif self.value.isa[AcceptEINVALError](): - writer.write(self.value[AcceptEINVALError]) - elif self.value.isa[AcceptEMFILEError](): - writer.write(self.value[AcceptEMFILEError]) - elif self.value.isa[AcceptENFILEError](): - writer.write(self.value[AcceptENFILEError]) - elif self.value.isa[AcceptENOBUFSError](): - writer.write(self.value[AcceptENOBUFSError]) - elif self.value.isa[AcceptENOTSOCKError](): - writer.write(self.value[AcceptENOTSOCKError]) - elif self.value.isa[AcceptEOPNOTSUPPError](): - writer.write(self.value[AcceptEOPNOTSUPPError]) - elif self.value.isa[AcceptEPERMError](): - writer.write(self.value[AcceptEPERMError]) - elif self.value.isa[AcceptEPROTOError](): - writer.write(self.value[AcceptEPROTOError]) - elif self.value.isa[Error](): - writer.write(self.value[Error]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) - - -@fieldwise_init -struct BindError(Movable, Stringable, Writable): - """Typed error variant for bind() function.""" - - comptime type = Variant[ - BindEACCESError, - BindEADDRINUSEError, - BindEBADFError, - BindEFAULTError, - BindEINVALError, - BindELOOPError, - BindENAMETOOLONGError, - BindENOMEMError, - BindENOTSOCKError, - Error, - ] - var value: Self.type - - @implicit - fn __init__(out self, value: BindEACCESError): - self.value = value - - @implicit - fn __init__(out self, value: BindEADDRINUSEError): - self.value = value - - @implicit - fn __init__(out self, value: BindEBADFError): - self.value = value - - @implicit - fn __init__(out self, value: BindEFAULTError): - self.value = value - - @implicit - fn __init__(out self, value: BindEINVALError): - self.value = value - - @implicit - fn __init__(out self, value: BindELOOPError): - self.value = value - - @implicit - fn __init__(out self, value: BindENAMETOOLONGError): - self.value = value - - @implicit - fn __init__(out self, value: BindENOMEMError): - self.value = value - - @implicit - fn __init__(out self, value: BindENOTSOCKError): - self.value = value - - @implicit - fn __init__(out self, var value: Error): - self.value = value^ - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[BindEACCESError](): - writer.write(self.value[BindEACCESError]) - elif self.value.isa[BindEADDRINUSEError](): - writer.write(self.value[BindEADDRINUSEError]) - elif self.value.isa[BindEBADFError](): - writer.write(self.value[BindEBADFError]) - elif self.value.isa[BindEFAULTError](): - writer.write(self.value[BindEFAULTError]) - elif self.value.isa[BindEINVALError](): - writer.write(self.value[BindEINVALError]) - elif self.value.isa[BindELOOPError](): - writer.write(self.value[BindELOOPError]) - elif self.value.isa[BindENAMETOOLONGError](): - writer.write(self.value[BindENAMETOOLONGError]) - elif self.value.isa[BindENOMEMError](): - writer.write(self.value[BindENOMEMError]) - elif self.value.isa[BindENOTSOCKError](): - writer.write(self.value[BindENOTSOCKError]) - elif self.value.isa[Error](): - writer.write(self.value[Error]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) - - -@fieldwise_init -struct CloseError(Movable, Stringable, Writable): - """Typed error variant for close() function.""" - - comptime type = Variant[CloseEBADFError, CloseEINTRError, CloseEIOError, CloseENOSPCError] - var value: Self.type - - @implicit - fn __init__(out self, value: CloseEBADFError): - self.value = value - - @implicit - fn __init__(out self, value: CloseEINTRError): - self.value = value - - @implicit - fn __init__(out self, value: CloseEIOError): - self.value = value - - @implicit - fn __init__(out self, value: CloseENOSPCError): - self.value = value - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[CloseEBADFError](): - writer.write(self.value[CloseEBADFError]) - elif self.value.isa[CloseEINTRError](): - writer.write(self.value[CloseEINTRError]) - elif self.value.isa[CloseEIOError](): - writer.write(self.value[CloseEIOError]) - elif self.value.isa[CloseENOSPCError](): - writer.write(self.value[CloseENOSPCError]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) - - -@fieldwise_init -struct ConnectError(Movable, Stringable, Writable): - """Typed error variant for connect() function.""" - - comptime type = Variant[ - ConnectEACCESError, - ConnectEADDRINUSEError, - ConnectEAFNOSUPPORTError, - ConnectEAGAINError, - ConnectEALREADYError, - ConnectEBADFError, - ConnectECONNREFUSEDError, - ConnectEFAULTError, - ConnectEINPROGRESSError, - ConnectEINTRError, - ConnectEISCONNError, - ConnectENETUNREACHError, - ConnectENOTSOCKError, - ConnectETIMEDOUTError, - Error, - ] - var value: Self.type - - @implicit - fn __init__(out self, value: ConnectEACCESError): - self.value = value - - @implicit - fn __init__(out self, value: ConnectEADDRINUSEError): - self.value = value - - @implicit - fn __init__(out self, value: ConnectEAFNOSUPPORTError): - self.value = value - - @implicit - fn __init__(out self, value: ConnectEAGAINError): - self.value = value - - @implicit - fn __init__(out self, value: ConnectEALREADYError): - self.value = value - - @implicit - fn __init__(out self, value: ConnectEBADFError): - self.value = value - - @implicit - fn __init__(out self, value: ConnectECONNREFUSEDError): - self.value = value - - @implicit - fn __init__(out self, value: ConnectEFAULTError): - self.value = value - - @implicit - fn __init__(out self, value: ConnectEINPROGRESSError): - self.value = value - - @implicit - fn __init__(out self, value: ConnectEINTRError): - self.value = value - - @implicit - fn __init__(out self, value: ConnectEISCONNError): - self.value = value - - @implicit - fn __init__(out self, value: ConnectENETUNREACHError): - self.value = value - - @implicit - fn __init__(out self, value: ConnectENOTSOCKError): - self.value = value - - @implicit - fn __init__(out self, value: ConnectETIMEDOUTError): - self.value = value - - @implicit - fn __init__(out self, var value: Error): - self.value = value^ - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[ConnectEACCESError](): - writer.write(self.value[ConnectEACCESError]) - elif self.value.isa[ConnectEADDRINUSEError](): - writer.write(self.value[ConnectEADDRINUSEError]) - elif self.value.isa[ConnectEAFNOSUPPORTError](): - writer.write(self.value[ConnectEAFNOSUPPORTError]) - elif self.value.isa[ConnectEAGAINError](): - writer.write(self.value[ConnectEAGAINError]) - elif self.value.isa[ConnectEALREADYError](): - writer.write(self.value[ConnectEALREADYError]) - elif self.value.isa[ConnectEBADFError](): - writer.write(self.value[ConnectEBADFError]) - elif self.value.isa[ConnectECONNREFUSEDError](): - writer.write(self.value[ConnectECONNREFUSEDError]) - elif self.value.isa[ConnectEFAULTError](): - writer.write(self.value[ConnectEFAULTError]) - elif self.value.isa[ConnectEINPROGRESSError](): - writer.write(self.value[ConnectEINPROGRESSError]) - elif self.value.isa[ConnectEINTRError](): - writer.write(self.value[ConnectEINTRError]) - elif self.value.isa[ConnectEISCONNError](): - writer.write(self.value[ConnectEISCONNError]) - elif self.value.isa[ConnectENETUNREACHError](): - writer.write(self.value[ConnectENETUNREACHError]) - elif self.value.isa[ConnectENOTSOCKError](): - writer.write(self.value[ConnectENOTSOCKError]) - elif self.value.isa[ConnectETIMEDOUTError](): - writer.write(self.value[ConnectETIMEDOUTError]) - elif self.value.isa[Error](): - writer.write(self.value[Error]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) - - -@fieldwise_init -struct GetpeernameError(Movable, Stringable, Writable): - """Typed error variant for getpeername() function.""" - - comptime type = Variant[ - GetpeernameEBADFError, - GetpeernameEFAULTError, - GetpeernameEINVALError, - GetpeernameENOBUFSError, - GetpeernameENOTCONNError, - GetpeernameENOTSOCKError, - ] - var value: Self.type - - @implicit - fn __init__(out self, value: GetpeernameEBADFError): - self.value = value - - @implicit - fn __init__(out self, value: GetpeernameEFAULTError): - self.value = value - - @implicit - fn __init__(out self, value: GetpeernameEINVALError): - self.value = value - - @implicit - fn __init__(out self, value: GetpeernameENOBUFSError): - self.value = value - - @implicit - fn __init__(out self, value: GetpeernameENOTCONNError): - self.value = value - - @implicit - fn __init__(out self, value: GetpeernameENOTSOCKError): - self.value = value - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[GetpeernameEBADFError](): - writer.write(self.value[GetpeernameEBADFError]) - elif self.value.isa[GetpeernameEFAULTError](): - writer.write(self.value[GetpeernameEFAULTError]) - elif self.value.isa[GetpeernameEINVALError](): - writer.write(self.value[GetpeernameEINVALError]) - elif self.value.isa[GetpeernameENOBUFSError](): - writer.write(self.value[GetpeernameENOBUFSError]) - elif self.value.isa[GetpeernameENOTCONNError](): - writer.write(self.value[GetpeernameENOTCONNError]) - elif self.value.isa[GetpeernameENOTSOCKError](): - writer.write(self.value[GetpeernameENOTSOCKError]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) - - -@fieldwise_init -struct GetsocknameError(Movable, Stringable, Writable): - """Typed error variant for getsockname() function.""" - - comptime type = Variant[ - GetsocknameEBADFError, - GetsocknameEFAULTError, - GetsocknameEINVALError, - GetsocknameENOBUFSError, - GetsocknameENOTSOCKError, - ] - var value: Self.type - - @implicit - fn __init__(out self, value: GetsocknameEBADFError): - self.value = value - - @implicit - fn __init__(out self, value: GetsocknameEFAULTError): - self.value = value - - @implicit - fn __init__(out self, value: GetsocknameEINVALError): - self.value = value - - @implicit - fn __init__(out self, value: GetsocknameENOBUFSError): - self.value = value - - @implicit - fn __init__(out self, value: GetsocknameENOTSOCKError): - self.value = value - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[GetsocknameEBADFError](): - writer.write(self.value[GetsocknameEBADFError]) - elif self.value.isa[GetsocknameEFAULTError](): - writer.write(self.value[GetsocknameEFAULTError]) - elif self.value.isa[GetsocknameEINVALError](): - writer.write(self.value[GetsocknameEINVALError]) - elif self.value.isa[GetsocknameENOBUFSError](): - writer.write(self.value[GetsocknameENOBUFSError]) - elif self.value.isa[GetsocknameENOTSOCKError](): - writer.write(self.value[GetsocknameENOTSOCKError]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) - - -@fieldwise_init -struct GetsockoptError(Movable, Stringable, Writable): - """Typed error variant for getsockopt() function.""" - - comptime type = Variant[ - GetsockoptEBADFError, - GetsockoptEFAULTError, - GetsockoptEINVALError, - GetsockoptENOPROTOOPTError, - GetsockoptENOTSOCKError, - Error, - ] - var value: Self.type - - @implicit - fn __init__(out self, value: GetsockoptEBADFError): - self.value = value - - @implicit - fn __init__(out self, value: GetsockoptEFAULTError): - self.value = value - - @implicit - fn __init__(out self, value: GetsockoptEINVALError): - self.value = value - - @implicit - fn __init__(out self, value: GetsockoptENOPROTOOPTError): - self.value = value - - @implicit - fn __init__(out self, value: GetsockoptENOTSOCKError): - self.value = value - - @implicit - fn __init__(out self, var value: Error): - self.value = value^ - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[GetsockoptEBADFError](): - writer.write(self.value[GetsockoptEBADFError]) - elif self.value.isa[GetsockoptEFAULTError](): - writer.write(self.value[GetsockoptEFAULTError]) - elif self.value.isa[GetsockoptEINVALError](): - writer.write(self.value[GetsockoptEINVALError]) - elif self.value.isa[GetsockoptENOPROTOOPTError](): - writer.write(self.value[GetsockoptENOPROTOOPTError]) - elif self.value.isa[GetsockoptENOTSOCKError](): - writer.write(self.value[GetsockoptENOTSOCKError]) - elif self.value.isa[Error](): - writer.write(self.value[Error]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) - - -@fieldwise_init -struct ListenError(Movable, Stringable, Writable): - """Typed error variant for listen() function.""" - - comptime type = Variant[ListenEADDRINUSEError, ListenEBADFError, ListenENOTSOCKError, ListenEOPNOTSUPPError] - var value: Self.type - - @implicit - fn __init__(out self, value: ListenEADDRINUSEError): - self.value = value - - @implicit - fn __init__(out self, value: ListenEBADFError): - self.value = value - - @implicit - fn __init__(out self, value: ListenENOTSOCKError): - self.value = value - - @implicit - fn __init__(out self, value: ListenEOPNOTSUPPError): - self.value = value - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[ListenEADDRINUSEError](): - writer.write(self.value[ListenEADDRINUSEError]) - elif self.value.isa[ListenEBADFError](): - writer.write(self.value[ListenEBADFError]) - elif self.value.isa[ListenENOTSOCKError](): - writer.write(self.value[ListenENOTSOCKError]) - elif self.value.isa[ListenEOPNOTSUPPError](): - writer.write(self.value[ListenEOPNOTSUPPError]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) - - -@fieldwise_init -struct RecvError(Movable, Stringable, Writable): - """Typed error variant for recv() function.""" - - comptime type = Variant[ - RecvEAGAINError, - RecvEBADFError, - RecvECONNREFUSEDError, - RecvEFAULTError, - RecvEINTRError, - RecvENOTCONNError, - RecvENOTSOCKError, - Error, - ] - var value: Self.type - - @implicit - fn __init__(out self, value: RecvEAGAINError): - self.value = value - - @implicit - fn __init__(out self, value: RecvEBADFError): - self.value = value - - @implicit - fn __init__(out self, value: RecvECONNREFUSEDError): - self.value = value - - @implicit - fn __init__(out self, value: RecvEFAULTError): - self.value = value - - @implicit - fn __init__(out self, value: RecvEINTRError): - self.value = value - - @implicit - fn __init__(out self, value: RecvENOTCONNError): - self.value = value - - @implicit - fn __init__(out self, value: RecvENOTSOCKError): - self.value = value - - @implicit - fn __init__(out self, var value: Error): - self.value = value^ - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[RecvEAGAINError](): - writer.write(self.value[RecvEAGAINError]) - elif self.value.isa[RecvEBADFError](): - writer.write(self.value[RecvEBADFError]) - elif self.value.isa[RecvECONNREFUSEDError](): - writer.write(self.value[RecvECONNREFUSEDError]) - elif self.value.isa[RecvEFAULTError](): - writer.write(self.value[RecvEFAULTError]) - elif self.value.isa[RecvEINTRError](): - writer.write(self.value[RecvEINTRError]) - elif self.value.isa[RecvENOTCONNError](): - writer.write(self.value[RecvENOTCONNError]) - elif self.value.isa[RecvENOTSOCKError](): - writer.write(self.value[RecvENOTSOCKError]) - elif self.value.isa[Error](): - writer.write(self.value[Error]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) - - -@fieldwise_init -struct RecvfromError(Movable, Stringable, Writable): - """Typed error variant for recvfrom() function.""" - - comptime type = Variant[ - RecvfromEAGAINError, - RecvfromEBADFError, - RecvfromECONNRESETError, - RecvfromEINTRError, - RecvfromEINVALError, - RecvfromEIOError, - RecvfromENOBUFSError, - RecvfromENOMEMError, - RecvfromENOTCONNError, - RecvfromENOTSOCKError, - RecvfromEOPNOTSUPPError, - RecvfromETIMEDOUTError, - Error, - ] - var value: Self.type - - @implicit - fn __init__(out self, value: RecvfromEAGAINError): - self.value = value - - @implicit - fn __init__(out self, value: RecvfromEBADFError): - self.value = value - - @implicit - fn __init__(out self, value: RecvfromECONNRESETError): - self.value = value - - @implicit - fn __init__(out self, value: RecvfromEINTRError): - self.value = value - - @implicit - fn __init__(out self, value: RecvfromEINVALError): - self.value = value - - @implicit - fn __init__(out self, value: RecvfromEIOError): - self.value = value - - @implicit - fn __init__(out self, value: RecvfromENOBUFSError): - self.value = value - - @implicit - fn __init__(out self, value: RecvfromENOMEMError): - self.value = value - - @implicit - fn __init__(out self, value: RecvfromENOTCONNError): - self.value = value - - @implicit - fn __init__(out self, value: RecvfromENOTSOCKError): - self.value = value - - @implicit - fn __init__(out self, value: RecvfromEOPNOTSUPPError): - self.value = value - - @implicit - fn __init__(out self, value: RecvfromETIMEDOUTError): - self.value = value - - @implicit - fn __init__(out self, var value: Error): - self.value = value^ - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[RecvfromEAGAINError](): - writer.write(self.value[RecvfromEAGAINError]) - elif self.value.isa[RecvfromEBADFError](): - writer.write(self.value[RecvfromEBADFError]) - elif self.value.isa[RecvfromECONNRESETError](): - writer.write(self.value[RecvfromECONNRESETError]) - elif self.value.isa[RecvfromEINTRError](): - writer.write(self.value[RecvfromEINTRError]) - elif self.value.isa[RecvfromEINVALError](): - writer.write(self.value[RecvfromEINVALError]) - elif self.value.isa[RecvfromEIOError](): - writer.write(self.value[RecvfromEIOError]) - elif self.value.isa[RecvfromENOBUFSError](): - writer.write(self.value[RecvfromENOBUFSError]) - elif self.value.isa[RecvfromENOMEMError](): - writer.write(self.value[RecvfromENOMEMError]) - elif self.value.isa[RecvfromENOTCONNError](): - writer.write(self.value[RecvfromENOTCONNError]) - elif self.value.isa[RecvfromENOTSOCKError](): - writer.write(self.value[RecvfromENOTSOCKError]) - elif self.value.isa[RecvfromEOPNOTSUPPError](): - writer.write(self.value[RecvfromEOPNOTSUPPError]) - elif self.value.isa[RecvfromETIMEDOUTError](): - writer.write(self.value[RecvfromETIMEDOUTError]) - elif self.value.isa[Error](): - writer.write(self.value[Error]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) - - -@fieldwise_init -struct SendError(Movable, Stringable, Writable): - """Typed error variant for send() function.""" - - comptime type = Variant[ - SendEAGAINError, - SendEBADFError, - SendECONNREFUSEDError, - SendECONNRESETError, - SendEDESTADDRREQError, - SendEFAULTError, - SendEINTRError, - SendEINVALError, - SendEISCONNError, - SendENOBUFSError, - SendENOMEMError, - SendENOTCONNError, - SendENOTSOCKError, - SendEOPNOTSUPPError, - Error, - ] - var value: Self.type - - @implicit - fn __init__(out self, value: SendEAGAINError): - self.value = value - - @implicit - fn __init__(out self, value: SendEBADFError): - self.value = value - - @implicit - fn __init__(out self, value: SendECONNREFUSEDError): - self.value = value - - @implicit - fn __init__(out self, value: SendECONNRESETError): - self.value = value - - @implicit - fn __init__(out self, value: SendEDESTADDRREQError): - self.value = value - - @implicit - fn __init__(out self, value: SendEFAULTError): - self.value = value - - @implicit - fn __init__(out self, value: SendEINTRError): - self.value = value - - @implicit - fn __init__(out self, value: SendEINVALError): - self.value = value - - @implicit - fn __init__(out self, value: SendEISCONNError): - self.value = value - - @implicit - fn __init__(out self, value: SendENOBUFSError): - self.value = value - - @implicit - fn __init__(out self, value: SendENOMEMError): - self.value = value - - @implicit - fn __init__(out self, value: SendENOTCONNError): - self.value = value - - @implicit - fn __init__(out self, value: SendENOTSOCKError): - self.value = value - - @implicit - fn __init__(out self, value: SendEOPNOTSUPPError): - self.value = value - - @implicit - fn __init__(out self, var value: Error): - self.value = value^ - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[SendEAGAINError](): - writer.write(self.value[SendEAGAINError]) - elif self.value.isa[SendEBADFError](): - writer.write(self.value[SendEBADFError]) - elif self.value.isa[SendECONNREFUSEDError](): - writer.write(self.value[SendECONNREFUSEDError]) - elif self.value.isa[SendECONNRESETError](): - writer.write(self.value[SendECONNRESETError]) - elif self.value.isa[SendEDESTADDRREQError](): - writer.write(self.value[SendEDESTADDRREQError]) - elif self.value.isa[SendEFAULTError](): - writer.write(self.value[SendEFAULTError]) - elif self.value.isa[SendEINTRError](): - writer.write(self.value[SendEINTRError]) - elif self.value.isa[SendEINVALError](): - writer.write(self.value[SendEINVALError]) - elif self.value.isa[SendEISCONNError](): - writer.write(self.value[SendEISCONNError]) - elif self.value.isa[SendENOBUFSError](): - writer.write(self.value[SendENOBUFSError]) - elif self.value.isa[SendENOMEMError](): - writer.write(self.value[SendENOMEMError]) - elif self.value.isa[SendENOTCONNError](): - writer.write(self.value[SendENOTCONNError]) - elif self.value.isa[SendENOTSOCKError](): - writer.write(self.value[SendENOTSOCKError]) - elif self.value.isa[SendEOPNOTSUPPError](): - writer.write(self.value[SendEOPNOTSUPPError]) - elif self.value.isa[Error](): - writer.write(self.value[Error]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) - - -@fieldwise_init -struct SendtoError(Movable, Stringable, Writable): - """Typed error variant for sendto() function.""" - - comptime type = Variant[ - SendtoEACCESError, - SendtoEAFNOSUPPORTError, - SendtoEAGAINError, - SendtoEBADFError, - SendtoECONNRESETError, - SendtoEDESTADDRREQError, - SendtoEHOSTUNREACHError, - SendtoEINTRError, - SendtoEINVALError, - SendtoEIOError, - SendtoEISCONNError, - SendtoELOOPError, - SendtoEMSGSIZEError, - SendtoENAMETOOLONGError, - SendtoENETDOWNError, - SendtoENETUNREACHError, - SendtoENOBUFSError, - SendtoENOMEMError, - SendtoENOTCONNError, - SendtoENOTSOCKError, - SendtoEPIPEError, - Error, - ] - var value: Self.type - - @implicit - fn __init__(out self, value: SendtoEACCESError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoEAFNOSUPPORTError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoEAGAINError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoEBADFError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoECONNRESETError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoEDESTADDRREQError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoEHOSTUNREACHError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoEINTRError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoEINVALError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoEIOError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoEISCONNError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoELOOPError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoEMSGSIZEError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoENAMETOOLONGError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoENETDOWNError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoENETUNREACHError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoENOBUFSError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoENOMEMError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoENOTCONNError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoENOTSOCKError): - self.value = value - - @implicit - fn __init__(out self, value: SendtoEPIPEError): - self.value = value - - @implicit - fn __init__(out self, var value: Error): - self.value = value^ - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[SendtoEACCESError](): - writer.write(self.value[SendtoEACCESError]) - elif self.value.isa[SendtoEAFNOSUPPORTError](): - writer.write(self.value[SendtoEAFNOSUPPORTError]) - elif self.value.isa[SendtoEAGAINError](): - writer.write(self.value[SendtoEAGAINError]) - elif self.value.isa[SendtoEBADFError](): - writer.write(self.value[SendtoEBADFError]) - elif self.value.isa[SendtoECONNRESETError](): - writer.write(self.value[SendtoECONNRESETError]) - elif self.value.isa[SendtoEDESTADDRREQError](): - writer.write(self.value[SendtoEDESTADDRREQError]) - elif self.value.isa[SendtoEHOSTUNREACHError](): - writer.write(self.value[SendtoEHOSTUNREACHError]) - elif self.value.isa[SendtoEINTRError](): - writer.write(self.value[SendtoEINTRError]) - elif self.value.isa[SendtoEINVALError](): - writer.write(self.value[SendtoEINVALError]) - elif self.value.isa[SendtoEIOError](): - writer.write(self.value[SendtoEIOError]) - elif self.value.isa[SendtoEISCONNError](): - writer.write(self.value[SendtoEISCONNError]) - elif self.value.isa[SendtoELOOPError](): - writer.write(self.value[SendtoELOOPError]) - elif self.value.isa[SendtoEMSGSIZEError](): - writer.write(self.value[SendtoEMSGSIZEError]) - elif self.value.isa[SendtoENAMETOOLONGError](): - writer.write(self.value[SendtoENAMETOOLONGError]) - elif self.value.isa[SendtoENETDOWNError](): - writer.write(self.value[SendtoENETDOWNError]) - elif self.value.isa[SendtoENETUNREACHError](): - writer.write(self.value[SendtoENETUNREACHError]) - elif self.value.isa[SendtoENOBUFSError](): - writer.write(self.value[SendtoENOBUFSError]) - elif self.value.isa[SendtoENOMEMError](): - writer.write(self.value[SendtoENOMEMError]) - elif self.value.isa[SendtoENOTCONNError](): - writer.write(self.value[SendtoENOTCONNError]) - elif self.value.isa[SendtoENOTSOCKError](): - writer.write(self.value[SendtoENOTSOCKError]) - elif self.value.isa[SendtoEPIPEError](): - writer.write(self.value[SendtoEPIPEError]) - elif self.value.isa[Error](): - writer.write(self.value[Error]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) - - -@fieldwise_init -struct SetsockoptError(Movable, Stringable, Writable): - """Typed error variant for setsockopt() function.""" - - comptime type = Variant[ - SetsockoptEBADFError, - SetsockoptEFAULTError, - SetsockoptEINVALError, - SetsockoptENOPROTOOPTError, - SetsockoptENOTSOCKError, - Error, - ] - var value: Self.type - - @implicit - fn __init__(out self, value: SetsockoptEBADFError): - self.value = value - - @implicit - fn __init__(out self, value: SetsockoptEFAULTError): - self.value = value - - @implicit - fn __init__(out self, value: SetsockoptEINVALError): - self.value = value - - @implicit - fn __init__(out self, value: SetsockoptENOPROTOOPTError): - self.value = value - - @implicit - fn __init__(out self, value: SetsockoptENOTSOCKError): - self.value = value - - @implicit - fn __init__(out self, var value: Error): - self.value = value^ - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[SetsockoptEBADFError](): - writer.write(self.value[SetsockoptEBADFError]) - elif self.value.isa[SetsockoptEFAULTError](): - writer.write(self.value[SetsockoptEFAULTError]) - elif self.value.isa[SetsockoptEINVALError](): - writer.write(self.value[SetsockoptEINVALError]) - elif self.value.isa[SetsockoptENOPROTOOPTError](): - writer.write(self.value[SetsockoptENOPROTOOPTError]) - elif self.value.isa[SetsockoptENOTSOCKError](): - writer.write(self.value[SetsockoptENOTSOCKError]) - elif self.value.isa[Error](): - writer.write(self.value[Error]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) - - -@fieldwise_init -struct ShutdownError(Movable, Stringable, Writable): - """Typed error variant for shutdown() function.""" - - comptime type = Variant[ShutdownEBADFError, ShutdownEINVALError, ShutdownENOTCONNError, ShutdownENOTSOCKError] - var value: Self.type - - @implicit - fn __init__(out self, value: ShutdownEBADFError): - self.value = value - - @implicit - fn __init__(out self, value: ShutdownEINVALError): - self.value = value - - @implicit - fn __init__(out self, value: ShutdownENOTCONNError): - self.value = value - - @implicit - fn __init__(out self, value: ShutdownENOTSOCKError): - self.value = value - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[ShutdownEBADFError](): - writer.write(self.value[ShutdownEBADFError]) - elif self.value.isa[ShutdownEINVALError](): - writer.write(self.value[ShutdownEINVALError]) - elif self.value.isa[ShutdownENOTCONNError](): - writer.write(self.value[ShutdownENOTCONNError]) - elif self.value.isa[ShutdownENOTSOCKError](): - writer.write(self.value[ShutdownENOTSOCKError]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) - - -@fieldwise_init -struct SocketError(Movable, Stringable, Writable): - """Typed error variant for socket() function.""" - - comptime type = Variant[ - SocketEACCESError, - SocketEAFNOSUPPORTError, - SocketEINVALError, - SocketEMFILEError, - SocketENFILEError, - SocketENOBUFSError, - SocketEPROTONOSUPPORTError, - Error, - ] - var value: Self.type - - @implicit - fn __init__(out self, value: SocketEACCESError): - self.value = value - - @implicit - fn __init__(out self, value: SocketEAFNOSUPPORTError): - self.value = value - - @implicit - fn __init__(out self, value: SocketEINVALError): - self.value = value - - @implicit - fn __init__(out self, value: SocketEMFILEError): - self.value = value - - @implicit - fn __init__(out self, value: SocketENFILEError): - self.value = value - - @implicit - fn __init__(out self, value: SocketENOBUFSError): - self.value = value - - @implicit - fn __init__(out self, value: SocketEPROTONOSUPPORTError): - self.value = value - - @implicit - fn __init__(out self, var value: Error): - self.value = value^ - - fn write_to[W: Writer, //](self, mut writer: W): - if self.value.isa[SocketEACCESError](): - writer.write(self.value[SocketEACCESError]) - elif self.value.isa[SocketEAFNOSUPPORTError](): - writer.write(self.value[SocketEAFNOSUPPORTError]) - elif self.value.isa[SocketEINVALError](): - writer.write(self.value[SocketEINVALError]) - elif self.value.isa[SocketEMFILEError](): - writer.write(self.value[SocketEMFILEError]) - elif self.value.isa[SocketENFILEError](): - writer.write(self.value[SocketENFILEError]) - elif self.value.isa[SocketENOBUFSError](): - writer.write(self.value[SocketENOBUFSError]) - elif self.value.isa[SocketEPROTONOSUPPORTError](): - writer.write(self.value[SocketEPROTONOSUPPORTError]) - elif self.value.isa[Error](): - writer.write(self.value[Error]) - - fn isa[T: AnyType](self) -> Bool: - return self.value.isa[T]() - - fn __getitem__[T: AnyType](self) -> ref [self.value] T: - return self.value[T] - - fn __str__(self) -> String: - return String.write(self) +comptime AcceptError = Variant[ + AcceptEBADFError, + AcceptEINTRError, + AcceptEAGAINError, + AcceptECONNABORTEDError, + AcceptEFAULTError, + AcceptEINVALError, + AcceptEMFILEError, + AcceptENFILEError, + AcceptENOBUFSError, + AcceptENOTSOCKError, + AcceptEOPNOTSUPPError, + AcceptEPERMError, + AcceptEPROTOError, + Error, +] + + +comptime BindError = Variant[ + BindEACCESError, + BindEADDRINUSEError, + BindEBADFError, + BindEFAULTError, + BindEINVALError, + BindELOOPError, + BindENAMETOOLONGError, + BindENOMEMError, + BindENOTSOCKError, + Error, +] + + +comptime CloseError = Variant[CloseEBADFError, CloseEINTRError, CloseEIOError, CloseENOSPCError] + + +comptime ConnectError = Variant[ + ConnectEACCESError, + ConnectEADDRINUSEError, + ConnectEAFNOSUPPORTError, + ConnectEAGAINError, + ConnectEALREADYError, + ConnectEBADFError, + ConnectECONNREFUSEDError, + ConnectEFAULTError, + ConnectEINPROGRESSError, + ConnectEINTRError, + ConnectEISCONNError, + ConnectENETUNREACHError, + ConnectENOTSOCKError, + ConnectETIMEDOUTError, + Error, +] + + +comptime GetpeernameError = Variant[ + GetpeernameEBADFError, + GetpeernameEFAULTError, + GetpeernameEINVALError, + GetpeernameENOBUFSError, + GetpeernameENOTCONNError, + GetpeernameENOTSOCKError, +] + + +comptime GetsocknameError = Variant[ + GetsocknameEBADFError, + GetsocknameEFAULTError, + GetsocknameEINVALError, + GetsocknameENOBUFSError, + GetsocknameENOTSOCKError, +] + + +comptime GetsockoptError = Variant[ + GetsockoptEBADFError, + GetsockoptEFAULTError, + GetsockoptEINVALError, + GetsockoptENOPROTOOPTError, + GetsockoptENOTSOCKError, + Error, +] + + +comptime ListenError = Variant[ListenEADDRINUSEError, ListenEBADFError, ListenENOTSOCKError, ListenEOPNOTSUPPError] + + +comptime RecvError = Variant[ + RecvEAGAINError, + RecvEBADFError, + RecvECONNREFUSEDError, + RecvEFAULTError, + RecvEINTRError, + RecvENOTCONNError, + RecvENOTSOCKError, + Error, +] + + +comptime RecvfromError = Variant[ + RecvfromEAGAINError, + RecvfromEBADFError, + RecvfromECONNRESETError, + RecvfromEINTRError, + RecvfromEINVALError, + RecvfromEIOError, + RecvfromENOBUFSError, + RecvfromENOMEMError, + RecvfromENOTCONNError, + RecvfromENOTSOCKError, + RecvfromEOPNOTSUPPError, + RecvfromETIMEDOUTError, + Error, +] + + +comptime SendError = Variant[ + SendEAGAINError, + SendEBADFError, + SendECONNREFUSEDError, + SendECONNRESETError, + SendEDESTADDRREQError, + SendEFAULTError, + SendEINTRError, + SendEINVALError, + SendEISCONNError, + SendENOBUFSError, + SendENOMEMError, + SendENOTCONNError, + SendENOTSOCKError, + SendEOPNOTSUPPError, + Error, +] + + +comptime SendtoError = Variant[ + SendtoEACCESError, + SendtoEAFNOSUPPORTError, + SendtoEAGAINError, + SendtoEBADFError, + SendtoECONNRESETError, + SendtoEDESTADDRREQError, + SendtoEHOSTUNREACHError, + SendtoEINTRError, + SendtoEINVALError, + SendtoEIOError, + SendtoEISCONNError, + SendtoELOOPError, + SendtoEMSGSIZEError, + SendtoENAMETOOLONGError, + SendtoENETDOWNError, + SendtoENETUNREACHError, + SendtoENOBUFSError, + SendtoENOMEMError, + SendtoENOTCONNError, + SendtoENOTSOCKError, + SendtoEPIPEError, + Error, +] + + +comptime SetsockoptError = Variant[ + SetsockoptEBADFError, + SetsockoptEFAULTError, + SetsockoptEINVALError, + SetsockoptENOPROTOOPTError, + SetsockoptENOTSOCKError, + Error, +] + + +comptime ShutdownError = Variant[ShutdownEBADFError, ShutdownEINVALError, ShutdownENOTCONNError, ShutdownENOTSOCKError] + + +comptime SocketError = Variant[ + SocketEACCESError, + SocketEAFNOSUPPORTError, + SocketEINVALError, + SocketEMFILEError, + SocketENFILEError, + SocketENOBUFSError, + SocketEPROTONOSUPPORTError, + Error, +] diff --git a/lightbug_http/connection.mojo b/lightbug_http/connection.mojo index 18f34437..ab894839 100644 --- a/lightbug_http/connection.mojo +++ b/lightbug_http/connection.mojo @@ -1,5 +1,5 @@ -from sys.info import CompilationTarget -from time import sleep +from std.sys.info import CompilationTarget +from std.time import sleep from lightbug_http.address import HostPort, NetworkType, ParseError, TCPAddr, UDPAddr, parse_address from lightbug_http.c.address import AddressFamily @@ -31,7 +31,7 @@ from lightbug_http.socket import ( UDPSocket, ) from lightbug_http.utils.error import CustomError -from utils import Variant +from std.utils import Variant comptime default_buffer_size = 4096 @@ -41,8 +41,7 @@ comptime default_tcp_keep_alive = Duration(15 * 1000 * 1000 * 1000) # 15 second @fieldwise_init -@register_passable("trivial") -struct AddressParseError(CustomError): +struct AddressParseError(CustomError, TrivialRegisterPassable): comptime message = "ListenerError: Failed to parse listen address" fn write_to[W: Writer, //](self, mut writer: W): @@ -53,8 +52,7 @@ struct AddressParseError(CustomError): @fieldwise_init -@register_passable("trivial") -struct SocketCreationError(CustomError): +struct SocketCreationError(CustomError, TrivialRegisterPassable): comptime message = "ListenerError: Failed to create socket" fn write_to[W: Writer, //](self, mut writer: W): @@ -65,8 +63,7 @@ struct SocketCreationError(CustomError): @fieldwise_init -@register_passable("trivial") -struct BindFailedError(CustomError): +struct BindFailedError(CustomError, TrivialRegisterPassable): comptime message = "ListenerError: Failed to bind socket to address" fn write_to[W: Writer, //](self, mut writer: W): @@ -77,8 +74,7 @@ struct BindFailedError(CustomError): @fieldwise_init -@register_passable("trivial") -struct ListenFailedError(CustomError): +struct ListenFailedError(CustomError, TrivialRegisterPassable): comptime message = "ListenerError: Failed to listen on socket" fn write_to[W: Writer, //](self, mut writer: W): @@ -89,7 +85,7 @@ struct ListenFailedError(CustomError): @fieldwise_init -struct ListenerError(Movable, Stringable, Writable): +struct ListenerError(Movable, Writable): """Error variant for listener creation operations. Represents failures during address parsing, socket creation, binding, or listening. @@ -357,7 +353,7 @@ struct TCPConnection[network: NetworkType = NetworkType.tcp4]: """ return self.socket.receive(buf) - fn write(self, buf: Span[Byte]) raises SendError -> UInt: + fn write(self, buf: Span[Byte, _]) raises SendError -> UInt: """Write all data to the TCP connection, handling partial sends. Args: @@ -465,7 +461,7 @@ struct UDPConnection[ return self.socket.receive_from(dest) - fn write_to(mut self, src: Span[Byte], mut address: UDPAddr) raises SendtoError -> UInt: + fn write_to(mut self, src: Span[Byte, _], mut address: UDPAddr) raises SendtoError -> UInt: """Writes data to the underlying file descriptor. Args: @@ -481,7 +477,7 @@ struct UDPConnection[ return self.socket.send_to(src, address.ip, address.port) - fn write_to(mut self, src: Span[Byte], mut host: String, port: UInt16) raises SendtoError -> UInt: + fn write_to(mut self, src: Span[Byte, _], mut host: String, port: UInt16) raises SendtoError -> UInt: """Writes data to the underlying file descriptor. Args: @@ -533,7 +529,7 @@ struct UDPConnection[ @fieldwise_init -struct CreateConnectionError(Movable, Stringable, Writable): +struct CreateConnectionError(Movable, Writable): """Error variant for create_connection operations. Can be CSocketError from socket creation or SocketConnectError from connect. """ diff --git a/lightbug_http/cookie/cookie.mojo b/lightbug_http/cookie/cookie.mojo index dbc38378..40994228 100644 --- a/lightbug_http/cookie/cookie.mojo +++ b/lightbug_http/cookie/cookie.mojo @@ -1,10 +1,9 @@ from lightbug_http.header import HeaderKey -from utils import Variant +from std.utils import Variant @fieldwise_init -@register_passable("trivial") -struct InvalidCookieError(Movable, Stringable, Writable): +struct InvalidCookieError(Movable, Writable, TrivialRegisterPassable): """Error raised when a cookie is invalid.""" fn write_to[W: Writer, //](self, mut writer: W): @@ -100,29 +99,29 @@ struct Cookie(Copyable): fn __str__(self) -> String: return String.write("Name: ", self.name, " Value: ", self.value) - fn __copyinit__(out self: Cookie, existing: Cookie): - self.name = existing.name - self.value = existing.value - self.max_age = existing.max_age - self.expires = existing.expires.copy() - self.domain = existing.domain - self.path = existing.path - self.secure = existing.secure - self.http_only = existing.http_only - self.same_site = existing.same_site - self.partitioned = existing.partitioned - - fn __moveinit__(out self: Cookie, deinit existing: Cookie): - self.name = existing.name^ - self.value = existing.value^ - self.max_age = existing.max_age^ - self.expires = existing.expires.copy() - self.domain = existing.domain^ - self.path = existing.path^ - self.secure = existing.secure - self.http_only = existing.http_only - self.same_site = existing.same_site^ - self.partitioned = existing.partitioned + fn __copyinit__(out self: Cookie, copy: Cookie): + self.name = copy.name + self.value = copy.value + self.max_age = copy.max_age + self.expires = copy.expires.copy() + self.domain = copy.domain + self.path = copy.path + self.secure = copy.secure + self.http_only = copy.http_only + self.same_site = copy.same_site + self.partitioned = copy.partitioned + + fn __moveinit__(out self: Cookie, deinit take: Cookie): + self.name = take.name + self.value = take.value + self.max_age = take.max_age + self.expires = take.expires.copy() + self.domain = take.domain + self.path = take.path + self.secure = take.secure + self.http_only = take.http_only + self.same_site = take.same_site + self.partitioned = take.partitioned fn clear_cookie(mut self): self.max_age = Optional[Duration](None) diff --git a/lightbug_http/cookie/duration.mojo b/lightbug_http/cookie/duration.mojo index bd5f298b..429d4e47 100644 --- a/lightbug_http/cookie/duration.mojo +++ b/lightbug_http/cookie/duration.mojo @@ -1,5 +1,5 @@ @fieldwise_init -struct Duration(Copyable): +struct Duration(Copyable, ImplicitlyCopyable): var total_seconds: Int fn __init__( diff --git a/lightbug_http/cookie/expiration.mojo b/lightbug_http/cookie/expiration.mojo index 2c24a573..25d8573e 100644 --- a/lightbug_http/cookie/expiration.mojo +++ b/lightbug_http/cookie/expiration.mojo @@ -1,4 +1,4 @@ -from collections import Optional +from std.collections import Optional from small_time.small_time import SmallTime, parse_time_with_format diff --git a/lightbug_http/cookie/request_cookie_jar.mojo b/lightbug_http/cookie/request_cookie_jar.mojo index 7436acd7..28fac47c 100644 --- a/lightbug_http/cookie/request_cookie_jar.mojo +++ b/lightbug_http/cookie/request_cookie_jar.mojo @@ -6,7 +6,7 @@ from small_time.small_time import parse_time_with_format @fieldwise_init -struct RequestCookieJar(Copyable, Stringable, Writable): +struct RequestCookieJar(Copyable, Writable): var _inner: Dict[String, String] fn __init__(out self): diff --git a/lightbug_http/cookie/response_cookie_jar.mojo b/lightbug_http/cookie/response_cookie_jar.mojo index cf17cba1..6feebf36 100644 --- a/lightbug_http/cookie/response_cookie_jar.mojo +++ b/lightbug_http/cookie/response_cookie_jar.mojo @@ -1,16 +1,15 @@ -from collections import KeyElement -from hashlib.hash import Hasher +from std.collections import KeyElement +from std.hashlib.hash import Hasher from lightbug_http.header import HeaderKey, write_header from lightbug_http.io.bytes import ByteWriter -from utils import Variant +from std.utils import Variant from lightbug_http.cookie.cookie import InvalidCookieError @fieldwise_init -@register_passable("trivial") -struct CookieParseError(Movable, Stringable, Writable): +struct CookieParseError(Movable, Writable, TrivialRegisterPassable): """Error raised when a cookie header string fails to parse.""" fn write_to[W: Writer, //](self, mut writer: W): @@ -42,22 +41,22 @@ struct ResponseCookieKey(ImplicitlyCopyable, KeyElement): fn __eq__(self: Self, other: Self) -> Bool: return self.name == other.name and self.domain == other.domain and self.path == other.path - fn __moveinit__(out self: Self, deinit existing: Self): - self.name = existing.name - self.domain = existing.domain - self.path = existing.path + fn __moveinit__(out self: ResponseCookieKey, deinit take: ResponseCookieKey): + self.name = take.name + self.domain = take.domain + self.path = take.path - fn __copyinit__(out self: Self, existing: Self): - self.name = existing.name - self.domain = existing.domain - self.path = existing.path + fn __copyinit__(out self: ResponseCookieKey, copy: ResponseCookieKey): + self.name = copy.name + self.domain = copy.domain + self.path = copy.path fn __hash__[H: Hasher](self: Self, mut hasher: H): hasher.update(self.name + "~" + self.domain + "~" + self.path) @fieldwise_init -struct ResponseCookieJar(Copyable, Sized, Stringable, Writable): +struct ResponseCookieJar(Copyable, Sized, Writable): var _inner: Dict[ResponseCookieKey, Cookie] fn __init__(out self): diff --git a/lightbug_http/cookie/same_site.mojo b/lightbug_http/cookie/same_site.mojo index 76d91aaa..b909ac2b 100644 --- a/lightbug_http/cookie/same_site.mojo +++ b/lightbug_http/cookie/same_site.mojo @@ -1,5 +1,5 @@ @fieldwise_init -struct SameSite(Copyable, Stringable): +struct SameSite(Copyable, ImplicitlyCopyable, Writable): var value: UInt8 comptime none = SameSite(0) @@ -23,10 +23,13 @@ struct SameSite(Copyable, Stringable): fn __eq__(self, other: Self) -> Bool: return self.value == other.value - fn __str__(self) -> String: + fn write_to[W: Writer, //](self, mut writer: W): if self.value == 0: - return materialize[SameSite.NONE]() + writer.write(SameSite.NONE) elif self.value == 1: - return materialize[SameSite.LAX]() + writer.write(SameSite.LAX) else: - return materialize[SameSite.STRICT]() + writer.write(SameSite.STRICT) + + fn __str__(self) -> String: + return String.write(self) diff --git a/lightbug_http/header.mojo b/lightbug_http/header.mojo index 81a5c913..71ec44bd 100644 --- a/lightbug_http/header.mojo +++ b/lightbug_http/header.mojo @@ -6,8 +6,8 @@ from lightbug_http.http.parsing import ( ) from lightbug_http.io.bytes import ByteReader, Bytes, ByteWriter, byte, is_newline, is_space from lightbug_http.strings import CR, LF, BytesConstant, lineBreak -from memory import Span -from utils import Variant +from std.memory import Span +from std.utils import Variant struct HeaderKey: @@ -109,8 +109,7 @@ struct HeaderKey: @fieldwise_init -@register_passable("trivial") -struct HeaderKeyNotFoundError(Movable, Stringable, Writable): +struct HeaderKeyNotFoundError(Movable, Writable, TrivialRegisterPassable): """Error raised when a header key is not found.""" fn write_to[W: Writer, //](self, mut writer: W): @@ -121,8 +120,7 @@ struct HeaderKeyNotFoundError(Movable, Stringable, Writable): @fieldwise_init -@register_passable("trivial") -struct InvalidHTTPRequestError(Movable, Stringable, Writable): +struct InvalidHTTPRequestError(Movable, Writable, TrivialRegisterPassable): """Error raised when the HTTP request is malformed.""" fn write_to[W: Writer, //](self, mut writer: W): @@ -133,8 +131,7 @@ struct InvalidHTTPRequestError(Movable, Stringable, Writable): @fieldwise_init -@register_passable("trivial") -struct IncompleteHTTPRequestError(Movable, Stringable, Writable): +struct IncompleteHTTPRequestError(Movable, Writable, TrivialRegisterPassable): """Error raised when the HTTP request is incomplete (need more data).""" fn write_to[W: Writer, //](self, mut writer: W): @@ -145,8 +142,7 @@ struct IncompleteHTTPRequestError(Movable, Stringable, Writable): @fieldwise_init -@register_passable("trivial") -struct InvalidHTTPResponseError(Movable, Stringable, Writable): +struct InvalidHTTPResponseError(Movable, Writable, TrivialRegisterPassable): """Error raised when the HTTP response is malformed.""" fn write_to[W: Writer, //](self, mut writer: W): @@ -157,8 +153,7 @@ struct InvalidHTTPResponseError(Movable, Stringable, Writable): @fieldwise_init -@register_passable("trivial") -struct IncompleteHTTPResponseError(Movable, Stringable, Writable): +struct IncompleteHTTPResponseError(Movable, Writable, TrivialRegisterPassable): """Error raised when the HTTP response is incomplete.""" fn write_to[W: Writer, //](self, mut writer: W): @@ -169,8 +164,7 @@ struct IncompleteHTTPResponseError(Movable, Stringable, Writable): @fieldwise_init -@register_passable("trivial") -struct EmptyBufferError(Movable, Stringable, Writable): +struct EmptyBufferError(Movable, Writable, TrivialRegisterPassable): """Error raised when buffer has no data available.""" fn write_to[W: Writer, //](self, mut writer: W): @@ -181,7 +175,7 @@ struct EmptyBufferError(Movable, Stringable, Writable): @fieldwise_init -struct RequestParseError(Movable, Stringable, Writable): +struct RequestParseError(Movable, Writable): """Error variant for HTTP request parsing. Can be InvalidHTTPRequestError, IncompleteHTTPRequestError, or EmptyBufferError. @@ -225,7 +219,7 @@ struct RequestParseError(Movable, Stringable, Writable): @fieldwise_init -struct ResponseParseError(Movable, Stringable, Writable): +struct ResponseParseError(Movable, Writable): """Error variant for HTTP response parsing.""" comptime type = Variant[InvalidHTTPResponseError, IncompleteHTTPResponseError, EmptyBufferError] @@ -310,7 +304,7 @@ struct ParsedResponseHeaders(Movable): @fieldwise_init -struct Header(Copyable, Stringable, Writable): +struct Header(Copyable, Writable): """A single HTTP header key-value pair.""" var key: String @@ -392,7 +386,7 @@ fn write_header_latin1(mut writer: ByteWriter, key: String, value: String): @fieldwise_init -struct Headers(Copyable, Stringable, Writable): +struct Headers(Copyable, Writable): """Collection of HTTP headers. Header keys are normalized to lowercase for case-insensitive lookup. @@ -464,7 +458,7 @@ struct Headers(Copyable, Stringable, Writable): fn parse_request_headers( - buffer: Span[Byte], + buffer: Span[Byte, _], last_len: Int = 0, ) raises RequestParseError -> ParsedRequestHeaders: """Parse HTTP request headers from a buffer. @@ -537,7 +531,7 @@ fn parse_request_headers( fn parse_response_headers( - buffer: Span[Byte], + buffer: Span[Byte, _], last_len: Int = 0, ) raises ResponseParseError -> ParsedResponseHeaders: """Parse HTTP response headers from a buffer. @@ -616,7 +610,7 @@ fn parse_response_headers( ) -fn find_header_end(buffer: Span[Byte], search_start: Int = 0) -> Optional[Int]: +fn find_header_end(buffer: Span[Byte, _], search_start: Int = 0) -> Optional[Int]: """Find the end of HTTP headers in a buffer. Searches for the \\r\\n\\r\\n sequence that marks the end of headers. diff --git a/lightbug_http/http/__init__.mojo b/lightbug_http/http/__init__.mojo index 8ddd77fd..d21df412 100644 --- a/lightbug_http/http/__init__.mojo +++ b/lightbug_http/http/__init__.mojo @@ -1,4 +1,5 @@ from .common_response import * +from .json import * from .request import * from .response import * diff --git a/lightbug_http/http/chunked.mojo b/lightbug_http/http/chunked.mojo index 7afbab70..224f4d18 100644 --- a/lightbug_http/http/chunked.mojo +++ b/lightbug_http/http/chunked.mojo @@ -1,9 +1,9 @@ -import sys -from sys import size_of +import std.sys +from std.sys import size_of -from lightbug_http.io.bytes import Bytes, memmove +from lightbug_http.io.bytes import Bytes from lightbug_http.strings import BytesConstant -from memory import memcpy +from std.memory import memcpy # Chunked decoder states @@ -129,18 +129,16 @@ struct HTTPChunkedDecoder(Defaultable): var avail = buffer_len - src if avail < self.bytes_left_in_chunk: if dst != src: - memmove(buf.unsafe_ptr() + dst, buf.unsafe_ptr() + src, avail) + for _i in range(avail): + buf[dst + _i] = buf[src + _i] src += avail dst += avail self.bytes_left_in_chunk -= avail break if dst != src: - memmove( - buf.unsafe_ptr() + dst, - buf.unsafe_ptr() + src, - self.bytes_left_in_chunk, - ) + for _i in range(self.bytes_left_in_chunk): + buf[dst + _i] = buf[src + _i] src += self.bytes_left_in_chunk dst += self.bytes_left_in_chunk @@ -197,7 +195,8 @@ struct HTTPChunkedDecoder(Defaultable): # Move remaining data to beginning of buffer if dst != src and src < buffer_len: - memmove(buf.unsafe_ptr() + dst, buf.unsafe_ptr() + src, buffer_len - src) + for _i in range(buffer_len - src): + buf[dst + _i] = buf[src + _i] var new_bufsz = dst diff --git a/lightbug_http/http/common_response.mojo b/lightbug_http/http/common_response.mojo index 81138ea9..250b43f4 100644 --- a/lightbug_http/http/common_response.mojo +++ b/lightbug_http/http/common_response.mojo @@ -1,6 +1,11 @@ +from lightbug_http.http.json import Json from lightbug_http.io.bytes import Bytes +fn OK(var body: Json) -> HTTPResponse: + return HTTPResponse(body^) + + fn OK(body: String, content_type: String = "text/plain") -> HTTPResponse: return HTTPResponse( headers=Headers(Header(HeaderKey.CONTENT_TYPE, content_type)), diff --git a/lightbug_http/http/json.mojo b/lightbug_http/http/json.mojo new file mode 100644 index 00000000..8b363a86 --- /dev/null +++ b/lightbug_http/http/json.mojo @@ -0,0 +1,53 @@ +from emberjson import ( + parse, + deserialize, + try_deserialize, + serialize, + Value, + JsonSerializable, + JsonDeserializable, +) +from lightbug_http.http.request import HTTPRequest + + +struct Json: + """Pre-serialized JSON value for use as an HTTP response body.""" + + var _serialized: String + + fn __init__[T: AnyType](out self, value: T): + self._serialized = serialize(value) + + +fn json_decode(req: HTTPRequest) raises -> Value: + """Parse the request body as untyped JSON. + + Args: + req: The HTTP request to extract JSON from. + + Returns: + A parsed JSON value. + + Raises: + An error if the body is not valid JSON. + """ + return parse(req.get_body()) + + +fn json_decode[T: Movable & ImplicitlyDestructible](req: HTTPRequest) raises -> T: + """Deserialize the request body into a typed struct. + + Parameters: + T: Any struct conforming to Movable & ImplicitlyDestructible. Types with + fields that have non-trivial destructors must also conform to Defaultable. + + Args: + req: The HTTP request to deserialize JSON from. + + Returns: + The deserialized value. + + Raises: + An error if the body is not valid JSON or doesn't match the expected schema. + """ + return deserialize[T](String(req.get_body())) diff --git a/lightbug_http/http/parsing.mojo b/lightbug_http/http/parsing.mojo index d3700de5..4f51c921 100644 --- a/lightbug_http/http/parsing.mojo +++ b/lightbug_http/http/parsing.mojo @@ -1,6 +1,6 @@ from lightbug_http.io.bytes import ByteReader, Bytes, create_string_from_ptr from lightbug_http.strings import BytesConstant, is_printable_ascii, is_token_char -from utils import Variant +from std.utils import Variant struct HTTPHeader(Copyable): @@ -17,8 +17,7 @@ struct HTTPHeader(Copyable): @fieldwise_init -@register_passable("trivial") -struct ParseError(Movable, Stringable, Writable): +struct ParseError(Movable, Writable, TrivialRegisterPassable): """Invalid HTTP syntax error.""" fn write_to[W: Writer, //](self, mut writer: W): @@ -29,8 +28,7 @@ struct ParseError(Movable, Stringable, Writable): @fieldwise_init -@register_passable("trivial") -struct IncompleteError(Movable, Stringable, Writable): +struct IncompleteError(Movable, Writable, TrivialRegisterPassable): """Need more data to complete parsing.""" fn write_to[W: Writer, //](self, mut writer: W): @@ -41,7 +39,7 @@ struct IncompleteError(Movable, Stringable, Writable): @fieldwise_init -struct HTTPParseError(Movable, Stringable, Writable): +struct HTTPParseError(Movable, Writable): """Error variant for HTTP parsing operations.""" comptime type = Variant[ParseError, IncompleteError] @@ -283,13 +281,13 @@ fn parse_headers[ get_token_to_eol(buf, value, value_len) while value_len > 0: - var c = value[value_len - 1 : value_len] + var c = value[byte=value_len - 1 : value_len] ref c_byte = c.as_bytes()[0] if c_byte != BytesConstant.whitespace and c_byte != BytesConstant.TAB: break value_len -= 1 - headers[num_headers].value = String(value[:value_len]) if value_len < len(value) else value + headers[num_headers].value = String(value[byte=:value_len]) if value_len < len(value) else value headers[num_headers].value_len = value_len num_headers += 1 @@ -469,13 +467,13 @@ fn http_parse_response_headers[ get_token_to_eol(buf, msg, msg_len) - if msg_len > 0 and msg[0:1] == " ": + if msg_len > 0 and msg[byte=0:1] == " ": var i = 0 - while i < msg_len and msg[i : i + 1] == " ": + while i < msg_len and msg[byte=i : i + 1] == " ": i += 1 - msg = String(msg[i:]) + msg = String(msg[byte=i:]) msg_len -= i - elif msg_len > 0 and msg[0:1] != String(" "): + elif msg_len > 0 and msg[byte=0:1] != String(" "): return -1 parse_headers(buf, headers, num_headers, max_headers) diff --git a/lightbug_http/http/request.mojo b/lightbug_http/http/request.mojo index c43f7ee2..ae3728fd 100644 --- a/lightbug_http/http/request.mojo +++ b/lightbug_http/http/request.mojo @@ -3,7 +3,7 @@ from lightbug_http.io.bytes import Bytes, ByteWriter from lightbug_http.io.sync import Duration from lightbug_http.strings import lineBreak, strHttp11, whitespace from lightbug_http.uri import URI -from utils import Variant +from std.utils import Variant from lightbug_http.cookie import RequestCookieJar @@ -69,7 +69,7 @@ comptime strSlash = "/" @fieldwise_init -struct HTTPRequest(Copyable, Encodable, Stringable, Writable): +struct HTTPRequest(Copyable, Encodable, Writable): """Represents a parsed HTTP request. This type is constructed from already-parsed components. The server is responsible @@ -246,7 +246,7 @@ struct HTTPRequest(Copyable, Encodable, Stringable, Writable): and self.uri == other.uri and self.headers == other.headers and self.cookies == other.cookies - and self.body_raw.__str__() == other.body_raw.__str__() + and String(self.body_raw) == String(other.body_raw) ) fn __isnot__(self, other: HTTPRequest) -> Bool: diff --git a/lightbug_http/http/response.mojo b/lightbug_http/http/response.mojo index bba97b38..ca5005e9 100644 --- a/lightbug_http/http/response.mojo +++ b/lightbug_http/http/response.mojo @@ -1,11 +1,12 @@ from lightbug_http.connection import TCPConnection, default_buffer_size +from lightbug_http.http.json import Json from lightbug_http.header import ParsedResponseHeaders, parse_response_headers from lightbug_http.http.chunked import HTTPChunkedDecoder from lightbug_http.http.date import http_date_now from lightbug_http.io.bytes import ByteReader, Bytes, ByteWriter, byte from lightbug_http.strings import CR, LF, http, lineBreak, strHttp11, whitespace from lightbug_http.uri import URI -from utils import Variant +from std.utils import Variant @fieldwise_init @@ -123,7 +124,7 @@ struct StatusCode: @fieldwise_init -struct HTTPResponse(Encodable, Movable, Sized, Stringable, Writable): +struct HTTPResponse(Encodable, Movable, Sized, Writable): var headers: Headers var cookies: ResponseCookieJar var body_raw: Bytes @@ -133,7 +134,7 @@ struct HTTPResponse(Encodable, Movable, Sized, Stringable, Writable): var protocol: String @staticmethod - fn from_bytes(b: Span[Byte]) raises ResponseParseError -> HTTPResponse: + fn from_bytes(b: Span[Byte, _]) raises ResponseParseError -> HTTPResponse: var cookies = ResponseCookieJar() var properties: ParsedResponseHeaders @@ -167,7 +168,7 @@ struct HTTPResponse(Encodable, Movable, Sized, Stringable, Writable): raise ResponseParseError(ResponseBodyReadError(detail=String(body_err))) @staticmethod - fn from_bytes(b: Span[Byte], conn: TCPConnection) raises ResponseParseError -> HTTPResponse: + fn from_bytes(b: Span[Byte, _], conn: TCPConnection) raises ResponseParseError -> HTTPResponse: var cookies = ResponseCookieJar() var properties: ParsedResponseHeaders @@ -267,7 +268,7 @@ struct HTTPResponse(Encodable, Movable, Sized, Stringable, Writable): fn __init__( out self, - body_bytes: Span[Byte], + body_bytes: Span[Byte, _], headers: Headers = Headers(), cookies: ResponseCookieJar = ResponseCookieJar(), status_code: Int = 200, @@ -289,6 +290,17 @@ struct HTTPResponse(Encodable, Movable, Sized, Stringable, Writable): if HeaderKey.DATE not in self.headers: self.headers[HeaderKey.DATE] = http_date_now() + fn __init__(out self, var body: Json): + """Serialize a typed value as JSON and return a 200 OK response. + + Args: + body: The Json-wrapped value to serialize. + """ + self = HTTPResponse( + body_bytes=body._serialized.as_bytes(), + headers=Headers(Header(HeaderKey.CONTENT_TYPE, "application/json")), + ) + fn __init__( out self, mut reader: ByteReader, @@ -365,7 +377,7 @@ struct HTTPResponse(Encodable, Movable, Sized, Stringable, Writable): except e: raise Error(String(e)) - fn read_chunks(mut self, chunks: Span[Byte]) raises: + fn read_chunks(mut self, chunks: Span[Byte, _]) raises: var reader = ByteReader(chunks) while True: var size = atol(String(reader.read_line()), 16) diff --git a/lightbug_http/io/bytes.mojo b/lightbug_http/io/bytes.mojo index 3f659751..0b1cc8df 100644 --- a/lightbug_http/io/bytes.mojo +++ b/lightbug_http/io/bytes.mojo @@ -1,9 +1,9 @@ -from sys import size_of +from std.sys import size_of from lightbug_http.connection import default_buffer_size from lightbug_http.strings import BytesConstant -from memory import memcpy -from memory.span import ContiguousSlice, _SpanIter +from std.memory import memcpy +from std.memory.span import ContiguousSlice, _SpanIter comptime Bytes = List[Byte] @@ -11,7 +11,7 @@ comptime Bytes = List[Byte] @always_inline fn byte[s: StringSlice]() -> Byte: - __comptime_assert len(s) == 1, "StringSlice must be of length 1 to convert to Byte." + comptime assert len(s) == 1, "StringSlice must be of length 1 to convert to Byte." return s.as_bytes()[0] @@ -32,7 +32,7 @@ struct ByteWriter(Writer): self._inner = Bytes(capacity=capacity) @always_inline - fn write_bytes(mut self, bytes: Span[Byte]) -> None: + fn write_string(mut self, bytes: Span[Byte, _]) -> None: """Writes the contents of `bytes` into the internal buffer. Args: @@ -58,8 +58,7 @@ struct ByteWriter(Writer): args: The data to write. """ - @parameter - for i in range(args.__len__()): + comptime for i in range(args.__len__()): args[i].write_to(self) @always_inline @@ -70,7 +69,7 @@ struct ByteWriter(Writer): return self._inner^ -struct ByteView[origin: ImmutOrigin](Boolable, Copyable, Equatable, Sized, Stringable): +struct ByteView[origin: ImmutOrigin](Boolable, Copyable, Equatable, Sized, Writable): """Convenience wrapper around a Span of Bytes.""" var _inner: Span[Byte, Self.origin] @@ -91,7 +90,7 @@ struct ByteView[origin: ImmutOrigin](Boolable, Copyable, Equatable, Sized, Strin return True return False - fn __contains__(self, b: Span[Byte]) -> Bool: + fn __contains__(self, b: Span[Byte, _]) -> Bool: if len(b) > len(self._inner): return False @@ -111,8 +110,11 @@ struct ByteView[origin: ImmutOrigin](Boolable, Copyable, Equatable, Sized, Strin fn __getitem__(self, slc: ContiguousSlice) -> Self: return Self(self._inner[slc]) + fn write_to[W: Writer, //](self, mut writer: W): + writer.write(StringSlice(unsafe_from_utf8=self._inner)) + fn __str__(self) -> String: - return String(unsafe_from_utf8=self._inner) + return String.write(self) fn __eq__(self, other: Self) -> Bool: # both empty @@ -126,7 +128,7 @@ struct ByteView[origin: ImmutOrigin](Boolable, Copyable, Equatable, Sized, Strin return False return True - fn __eq__(self, other: Span[Byte]) -> Bool: + fn __eq__(self, other: Span[Byte, _]) -> Bool: # both empty if not self._inner and not other: return True @@ -149,7 +151,7 @@ struct ByteView[origin: ImmutOrigin](Boolable, Copyable, Equatable, Sized, Strin return False return True - fn __ne__(self, other: Span[Byte]) -> Bool: + fn __ne__(self, other: Span[Byte, _]) -> Bool: return not self == other fn __iter__(self) -> _SpanIter[Byte, Self.origin]: @@ -175,7 +177,7 @@ struct ByteView[origin: ImmutOrigin](Boolable, Copyable, Equatable, Sized, Strin @fieldwise_init -struct OutOfBoundsError(Stringable, Writable): +struct OutOfBoundsError(Writable): var message: String fn __init__(out self): @@ -189,7 +191,7 @@ struct OutOfBoundsError(Stringable, Writable): @fieldwise_init -struct EndOfReaderError(Stringable, Writable): +struct EndOfReaderError(Writable): var message: String fn __init__(out self): @@ -306,46 +308,6 @@ struct ByteReader[origin: ImmutOrigin](Copyable, Sized): fn consume(var self, bytes_len: Int = -1) -> Bytes: return Bytes(self^._inner[self.read_pos : self.read_pos + len(self) + 1]) - -fn memmove[ - T: Copyable, dest_origin: MutOrigin, src_origin: MutOrigin -](dest: UnsafePointer[T, dest_origin], src: UnsafePointer[T, src_origin], count: Int,): - """ - Copies count elements from src to dest, handling overlapping memory regions safely. - """ - if count <= 0: - return - - if dest == src: - return - - # Check if memory regions overlap - var dest_addr = Int(dest) - var src_addr = Int(src) - var element_size = size_of[T]() - var total_bytes = count * element_size - - var dest_end = dest_addr + total_bytes - var src_end = src_addr + total_bytes - - # Check for overlap: regions overlap if one starts before the other ends - var overlaps = (dest_addr < src_end) and (src_addr < dest_end) - - if not overlaps: - # No overlap - use fast memcpy - memcpy(dest=dest, src=src, count=count) - elif dest_addr < src_addr: - # Destination is before source - copy forwards (left to right) - for i in range(count): - (dest + i).init_pointee_copy((src + i)[]) - else: - # Destination is after source - copy backwards (right to left) - var i = count - 1 - while i >= 0: - (dest + i).init_pointee_copy((src + i)[]) - i -= 1 - - fn create_string_from_ptr[origin: ImmutOrigin](ptr: UnsafePointer[UInt8, origin], length: Int) -> String: """Create a String from a pointer and length. @@ -360,7 +322,7 @@ fn create_string_from_ptr[origin: ImmutOrigin](ptr: UnsafePointer[UInt8, origin] # for i in range(length): # buf.append(ptr[i]) - result.write_bytes(Span(ptr=ptr, length=length)) + result.write_string(StringSlice(unsafe_from_utf8=Span(ptr=ptr, length=length))) return result^ diff --git a/lightbug_http/server.mojo b/lightbug_http/server.mojo index 41794e59..f8a7a720 100644 --- a/lightbug_http/server.mojo +++ b/lightbug_http/server.mojo @@ -20,13 +20,13 @@ from lightbug_http.service import HTTPService from lightbug_http.socket import EOF, FatalCloseError, SocketAcceptError, SocketClosedError, SocketRecvError from lightbug_http.utils.error import CustomError from lightbug_http.utils.owning_list import OwningList -from utils import Variant +from std.utils import Variant from lightbug_http.http import HTTPRequest, HTTPResponse, encode @fieldwise_init -struct ServerError(Movable, Stringable, Writable): +struct ServerError(Movable, Writable): """Error variant for server operations.""" comptime type = Variant[ @@ -192,8 +192,7 @@ struct ConnectionProvision(Movable): @fieldwise_init -@register_passable("trivial") -struct ProvisionPoolExhaustedError(CustomError): +struct ProvisionPoolExhaustedError(CustomError, TrivialRegisterPassable): comptime message = "ProvisionError: Connection provision pool exhausted" fn write_to[W: Writer, //](self, mut writer: W): @@ -204,7 +203,7 @@ struct ProvisionPoolExhaustedError(CustomError): @fieldwise_init -struct ProvisionError(Movable, Stringable, Writable): +struct ProvisionError(Movable, Writable): """Error variant for provision pool operations.""" comptime type = Variant[ProvisionPoolExhaustedError] @@ -332,10 +331,7 @@ fn handle_connection[ provision.last_parse_len, ) except parse_err: - if parse_err.isa[RequestParseError](): - # TODO: Differentiate errors - _send_error_response(conn, BadRequest()) - else: + if not parse_err.is_incomplete(): _send_error_response(conn, BadRequest()) provision.state = ConnectionState.closed() break diff --git a/lightbug_http/socket.mojo b/lightbug_http/socket.mojo index 94671102..f064c347 100644 --- a/lightbug_http/socket.mojo +++ b/lightbug_http/socket.mojo @@ -1,5 +1,5 @@ -from sys.ffi import c_uint -from sys.info import CompilationTarget +from std.ffi import c_uint +from std.sys.info import CompilationTarget from lightbug_http.address import ( Addr, @@ -59,24 +59,21 @@ from lightbug_http.c.socket_error import ( from lightbug_http.c.socket_error import SocketError as CSocketError from lightbug_http.connection import default_buffer_size from lightbug_http.io.bytes import Bytes -from utils import Variant +from std.utils import Variant @fieldwise_init -@register_passable("trivial") -struct SocketClosedError(Movable): +struct SocketClosedError(Movable, TrivialRegisterPassable): pass @fieldwise_init -@register_passable("trivial") -struct EOF(Movable): +struct EOF(Movable, TrivialRegisterPassable): pass @fieldwise_init -@register_passable("trivial") -struct InvalidCloseErrorConversionError(Movable, Stringable, Writable): +struct InvalidCloseErrorConversionError(Movable, Writable, TrivialRegisterPassable): fn write_to[W: Writer, //](self, mut writer: W): writer.write("InvalidCloseErrorConversionError: Cannot convert EBADF to FatalCloseError") @@ -85,12 +82,13 @@ struct InvalidCloseErrorConversionError(Movable, Stringable, Writable): @fieldwise_init -struct SocketRecvError(Movable, Stringable, Writable): +struct SocketRecvError(Movable, Writable): """Error variant for socket receive operations. - Can be RecvError from the syscall or EOF if connection closed cleanly. + Can be RecvError from the syscall, EOF if connection closed cleanly, + or SocketClosedError if the socket was already closed. """ - comptime type = Variant[RecvError, EOF] + comptime type = Variant[RecvError, EOF, SocketClosedError] var value: Self.type @implicit @@ -101,11 +99,17 @@ struct SocketRecvError(Movable, Stringable, Writable): fn __init__(out self, value: EOF): self.value = value + @implicit + fn __init__(out self, value: SocketClosedError): + self.value = value + fn write_to[W: Writer, //](self, mut writer: W): if self.value.isa[RecvError](): writer.write(self.value[RecvError]) elif self.value.isa[EOF](): writer.write("EOF") + elif self.value.isa[SocketClosedError](): + writer.write("SocketClosedError") fn isa[T: AnyType](self) -> Bool: return self.value.isa[T]() @@ -118,7 +122,7 @@ struct SocketRecvError(Movable, Stringable, Writable): @fieldwise_init -struct SocketRecvfromError(Movable, Stringable, Writable): +struct SocketRecvfromError(Movable, Writable): """Error variant for socket recvfrom operations. Can be RecvfromError from the syscall or EOF if connection closed cleanly. """ @@ -151,7 +155,7 @@ struct SocketRecvfromError(Movable, Stringable, Writable): @fieldwise_init -struct SocketAcceptError(Movable, Stringable, Writable): +struct SocketAcceptError(Movable, Writable): """Error variant for socket accept operations. Can be AcceptError or GetpeernameError from the syscall, SocketClosedError, or InetNtopError from binary_ip_to_string. """ @@ -196,7 +200,7 @@ struct SocketAcceptError(Movable, Stringable, Writable): @fieldwise_init -struct SocketBindError(Movable, Stringable, Writable): +struct SocketBindError(Movable, Writable): """Error variant for socket bind operations. Can be BindError from bind(), SocketGetsocknameError from get_sock_name(), or InetPtonError from inet_pton. """ @@ -235,7 +239,7 @@ struct SocketBindError(Movable, Stringable, Writable): @fieldwise_init -struct SocketConnectError(Movable, Stringable, Writable): +struct SocketConnectError(Movable, Writable): """Error variant for socket connect operations. Can be ConnectError from the syscall or SocketAcceptError from get_peer_name. """ @@ -268,7 +272,7 @@ struct SocketConnectError(Movable, Stringable, Writable): @fieldwise_init -struct SocketGetsocknameError(Movable, Stringable, Writable): +struct SocketGetsocknameError(Movable, Writable): """Error variant for socket getsockname operations. Can be GetsocknameError from the syscall, SocketClosedError, or InetNtopError from binary_ip_to_string. """ @@ -307,7 +311,7 @@ struct SocketGetsocknameError(Movable, Stringable, Writable): @fieldwise_init -struct FatalCloseError(Movable, Stringable, Writable): +struct FatalCloseError(Movable, Writable): """Error type for Socket.close() that excludes EBADF. EBADF is excluded because it indicates the socket is already closed, @@ -364,7 +368,7 @@ struct Socket[ address: Addr, sock_type: SocketType = SocketType.SOCK_STREAM, address_family: AddressFamily = AddressFamily.AF_INET, -](Movable, Representable, Stringable, Writable): +](Movable, Writable): """Represents a network file descriptor. Wraps around a file descriptor and provides network functions. Parameters: @@ -608,7 +612,7 @@ struct Socket[ Raises: SetsockoptError: If setting the socket option fails. """ - setsockopt(self.fd, SOL_SOCKET, option_name.value, option_value) + setsockopt(self.fd, SOL_SOCKET, option_name.value, Int32(option_value)) fn connect(mut self, mut ip_address: String, port: UInt16) raises -> None: """Connect to a remote socket at address. @@ -627,10 +631,10 @@ struct Socket[ var remote = self.get_peer_name() self.remote_address = Self.address(remote[0], remote[1]) - fn send(self, buffer: Span[Byte]) raises SendError -> UInt: + fn send(self, buffer: Span[Byte, _]) raises SendError -> UInt: return send(self.fd, buffer, UInt(len(buffer)), 0) - fn send_to(self, src: Span[Byte], mut host: String, port: UInt16) raises -> UInt: + fn send_to(self, src: Span[Byte, _], mut host: String, port: UInt16) raises -> UInt: """Send data to the a remote address by connecting to the remote socket before sending. The socket must be not already be connected to a remote socket. @@ -661,7 +665,10 @@ struct Socket[ Raises: RecvError: If reading data from the socket fails. EOF: If 0 bytes are received. + SocketClosedError: If the socket is already closed. """ + if self._closed: + raise SocketClosedError() var bytes_received: UInt var size = len(buffer) bytes_received = recv( @@ -821,9 +828,9 @@ struct Socket[ """ # SO_RCVTIMEO requires a timeval struct: {tv_sec: Int64, tv_usec: Int64} # (16 bytes on both macOS and Linux 64-bit). - var timeval = InlineArray[Int64, 2](seconds, 0) + var timeval: InlineArray[Int64, 2] = [Int64(seconds), 0] _ = _setsockopt( - self.fd.value, + Int32(self.fd.value), SOL_SOCKET, SocketOption.SO_RCVTIMEO.value, UnsafePointer(to=timeval).bitcast[c_void](), diff --git a/lightbug_http/uri.mojo b/lightbug_http/uri.mojo index 212b1f0c..539a0370 100644 --- a/lightbug_http/uri.mojo +++ b/lightbug_http/uri.mojo @@ -1,4 +1,4 @@ -from hashlib.hash import Hasher +from std.hashlib.hash import Hasher from lightbug_http.io.bytes import ByteReader, Bytes, ByteView from lightbug_http.strings import find_all, http, https, strHttp10, strHttp11 @@ -19,7 +19,7 @@ fn unquote[expand_plus: Bool = False](input_str: String, disallowed_escapes: Lis var str_bytes = List[UInt8]() while current_idx < len(percent_idxs): var slice_end = percent_idxs[current_idx] - sub_strings.append(String(encoded_str[slice_start:slice_end])) + sub_strings.append(String(encoded_str[byte=slice_start:slice_end])) var current_offset = slice_end while current_idx < len(percent_idxs): @@ -29,10 +29,10 @@ fn unquote[expand_plus: Bool = False](input_str: String, disallowed_escapes: Lis try: char_byte = atol( - encoded_str[current_offset + 1 : current_offset + 3], + encoded_str[byte=current_offset + 1 : current_offset + 3], base=16, ) - str_bytes.append(char_byte) + str_bytes.append(UInt8(char_byte)) except: break @@ -45,7 +45,7 @@ fn unquote[expand_plus: Bool = False](input_str: String, disallowed_escapes: Lis if len(str_bytes) > 0: var sub_str_from_bytes = String() - sub_str_from_bytes.write_bytes(str_bytes) + sub_str_from_bytes.write_string(StringSlice(unsafe_from_utf8=str_bytes)) for disallowed in disallowed_escapes: sub_str_from_bytes = sub_str_from_bytes.replace(disallowed, "") sub_strings.append(sub_str_from_bytes) @@ -54,7 +54,7 @@ fn unquote[expand_plus: Bool = False](input_str: String, disallowed_escapes: Lis slice_start = current_offset current_idx += 1 - sub_strings.append(String(encoded_str[slice_start:])) + sub_strings.append(String(encoded_str[byte=slice_start:])) return StaticString("").join(sub_strings) @@ -80,12 +80,12 @@ struct URIDelimiters: struct PortBounds: - comptime NINE: UInt8 = ord("9") - comptime ZERO: UInt8 = ord("0") + comptime NINE: UInt8 = UInt8(ord("9")) + comptime ZERO: UInt8 = UInt8(ord("0")) @fieldwise_init -struct Scheme(Equatable, Hashable, ImplicitlyCopyable, Representable, Stringable, Writable): +struct Scheme(Equatable, Hashable, ImplicitlyCopyable, Writable): var value: UInt8 comptime HTTP = Self(0) comptime HTTPS = Self(1) @@ -109,7 +109,7 @@ struct Scheme(Equatable, Hashable, ImplicitlyCopyable, Representable, Stringable return String.write(self) -struct URIParseError(Stringable, Writable): +struct URIParseError(Writable): var message: String fn __init__(out self, var message: String): @@ -123,7 +123,7 @@ struct URIParseError(Stringable, Writable): @fieldwise_init -struct URI(Copyable, Representable, Stringable, Writable): +struct URI(Copyable, Writable): var _original_path: String var scheme: String var path: String @@ -151,7 +151,7 @@ struct URI(Copyable, Representable, Stringable, Writable): # Assume http if no scheme is provided, fairly safe given the context of lightbug. var scheme: String = "http" if "://" in uri: - scheme = String(reader.read_until(ord(URIDelimiters.SCHEME))) + scheme = String(reader.read_until(UInt8(ord(URIDelimiters.SCHEME)))) var scheme_delimiter: ByteView[origin_of(uri)] try: scheme_delimiter = reader.read_bytes(3) @@ -170,8 +170,8 @@ struct URI(Copyable, Representable, Stringable, Writable): # Parse the user info, if exists. # TODO (@thatstoasty): Store the user information (username and password) if it exists. - if ord(URIDelimiters.AUTHORITY) in reader: - _ = reader.read_until(ord(URIDelimiters.AUTHORITY)) + if UInt8(ord(URIDelimiters.AUTHORITY)) in reader: + _ = reader.read_until(UInt8(ord(URIDelimiters.AUTHORITY))) reader.increment(1) # TODOs (@thatstoasty) @@ -179,8 +179,8 @@ struct URI(Copyable, Representable, Stringable, Writable): # Handle string host # A query right after the domain is a valid uri, but it's equivalent to example.com/?query # so we should add the normalization of paths - var host_and_port = reader.read_until(ord(URIDelimiters.PATH)) - colon = host_and_port.find(ord(URIDelimiters.SCHEME)) + var host_and_port = reader.read_until(UInt8(ord(URIDelimiters.PATH))) + colon = host_and_port.find(UInt8(ord(URIDelimiters.SCHEME))) var host: String var port: Optional[UInt16] = None if colon != -1: @@ -206,7 +206,7 @@ struct URI(Copyable, Representable, Stringable, Writable): # Reads until either the start of the query string, or the end of the uri. var unquote_reader = reader.copy() - var original_path_bytes = unquote_reader.read_until(ord(URIDelimiters.QUERY)) + var original_path_bytes = unquote_reader.read_until(UInt8(ord(URIDelimiters.QUERY))) var original_path: String if not original_path_bytes: original_path = "/" @@ -237,14 +237,14 @@ struct URI(Copyable, Representable, Stringable, Writable): var path: String = "/" var request_uri: String = "/" - if path_delimiter == ord(URIDelimiters.PATH): + if path_delimiter == UInt8(ord(URIDelimiters.PATH)): # Copy the remaining bytes to read the request uri. var request_uri_reader = reader.copy() request_uri = String(request_uri_reader.read_bytes()) # Read until the query string, or the end if there is none. path = unquote( - String(reader.read_until(ord(URIDelimiters.QUERY))), + String(reader.read_until(UInt8(ord(URIDelimiters.QUERY)))), disallowed_escapes=["/"], ) @@ -259,7 +259,7 @@ struct URI(Copyable, Representable, Stringable, Writable): return result^ var query: String = "" - if query_delimiter == ord(URIDelimiters.QUERY): + if query_delimiter == UInt8(ord(URIDelimiters.QUERY)): # TODO: Handle fragments for anchors query = String(reader.read_bytes()[1:]) diff --git a/lightbug_http/utils/error.mojo b/lightbug_http/utils/error.mojo index a2321986..b2f2e037 100644 --- a/lightbug_http/utils/error.mojo +++ b/lightbug_http/utils/error.mojo @@ -1,4 +1,4 @@ -trait CustomError(Movable, Stringable, Writable): +trait CustomError(Movable, Writable): """Trait for error marker structs with comptime messages. Provides default implementations for write_to and __str__ that use diff --git a/lightbug_http/utils/owning_list.mojo b/lightbug_http/utils/owning_list.mojo index 32441656..3bbfc4b4 100644 --- a/lightbug_http/utils/owning_list.mojo +++ b/lightbug_http/utils/owning_list.mojo @@ -1,10 +1,10 @@ -from collections import Optional -from collections._asan_annotations import __sanitizer_annotate_contiguous_container -from os import abort -from sys import size_of -from sys.intrinsics import _type_is_eq +from std.collections import Optional +from std.collections._asan_annotations import __sanitizer_annotate_contiguous_container +from std.os import abort +from std.sys import size_of +from std.sys.intrinsics import _type_is_eq -from memory import Pointer, Span, memcpy +from std.memory import Pointer, Span, memcpy # ===-----------------------------------------------------------------------===# @@ -124,7 +124,7 @@ struct OwningList[T: Movable & ImplicitlyDestructible](Boolable, Movable, Sized) # Operator dunders # ===-------------------------------------------------------------------===# - fn __contains__[U: Equatable & Movable, //](self: OwningList[U, *_], value: U) -> Bool: + fn __contains__[U: Equatable & Movable, //](self: OwningList[U, ...], value: U) -> Bool: """Verify if a given value is present in the list. Parameters: @@ -171,7 +171,7 @@ struct OwningList[T: Movable & ImplicitlyDestructible](Boolable, Movable, Sized) return len(self) > 0 @no_inline - fn __str__[U: Representable & Movable, //](self: OwningList[U, *_]) -> String: + fn __str__[U: Writable & Movable, //](self: OwningList[U, ...]) -> String: """Returns a string representation of a `List`. When the compiler supports conditional methods, then a simple `String(my_list)` will @@ -181,7 +181,7 @@ struct OwningList[T: Movable & ImplicitlyDestructible](Boolable, Movable, Sized) Parameters: U: The type of the elements in the list. Must implement the - traits `Representable` and `Movable`. + traits `Writable` and `Movable`. Returns: A string representation of the list. @@ -191,12 +191,12 @@ struct OwningList[T: Movable & ImplicitlyDestructible](Boolable, Movable, Sized) return output^ @no_inline - fn write_to[W: Writer, U: Representable & Movable, //](self: OwningList[U, *_], mut writer: W): + fn write_to[W: Writer, U: Writable & Movable, //](self: OwningList[U, ...], mut writer: W): """Write `my_list.__str__()` to a `Writer`. Parameters: W: A type conforming to the Writable trait. - U: The type of the List elements. Must have the trait `Representable & Movable`. + U: The type of the List elements. Must have the trait `Writable & Movable`. Args: writer: The object to write to. @@ -209,7 +209,7 @@ struct OwningList[T: Movable & ImplicitlyDestructible](Boolable, Movable, Sized) writer.write("]") @no_inline - fn __repr__[U: Representable & Movable, //](self: OwningList[U, *_]) -> String: + fn __repr__[U: Writable & Movable, //](self: OwningList[U, ...]) -> String: """Returns a string representation of a `List`. Note that since we can't condition methods on a trait yet, @@ -227,7 +227,7 @@ struct OwningList[T: Movable & ImplicitlyDestructible](Boolable, Movable, Sized) Parameters: U: The type of the elements in the list. Must implement the - traits `Representable` and `Movable`. + traits `Writable` and `Movable`. Returns: A string representation of the list. @@ -250,8 +250,7 @@ struct OwningList[T: Movable & ImplicitlyDestructible](Boolable, Movable, Sized) fn _realloc(mut self, new_capacity: Int): var new_data = alloc[Self.T](new_capacity) - @parameter - if Self.T.__moveinit__is_trivial: + comptime if Self.T.__move_ctor_is_trivial: memcpy(dest=new_data, src=self.data, count=len(self)) else: for i in range(len(self)): @@ -304,7 +303,7 @@ struct OwningList[T: Movable & ImplicitlyDestructible](Boolable, Movable, Sized) earlier_idx -= 1 later_idx -= 1 - fn extend(mut self, var other: OwningList[Self.T, *_]): + fn extend(mut self, var other: OwningList[Self.T, ...]): """Extends this list by consuming the elements of `other`. Args: @@ -405,7 +404,7 @@ struct OwningList[T: Movable & ImplicitlyDestructible](Boolable, Movable, Sized) # TODO: Remove explicit self type when issue 1876 is resolved. fn index[ C: Equatable & Movable, // - ](ref self: OwningList[C, *_], value: C, start: Int = 0, stop: Optional[Int] = None,) raises -> Int: + ](ref self: OwningList[C, ...], value: C, start: Int = 0, stop: Optional[Int] = None,) raises -> Int: """ Returns the index of the first occurrence of a value in a list restricted by the range given the start and stop bounds. diff --git a/pixi.lock b/pixi.lock index aff95d36..4c175144 100644 --- a/pixi.lock +++ b/pixi.lock @@ -3,351 +3,369 @@ environments: bench: channels: - url: https://conda.anaconda.org/conda-forge/ + - url: https://repo.prefix.dev/mojo-community/ - url: https://conda.modular.com/max/ - url: https://repo.prefix.dev/modular-community/ - - url: https://repo.prefix.dev/mojo-community/ + options: + pypi-prerelease-mode: if-necessary-or-explicit packages: linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: https://repo.prefix.dev/modular-community/linux-64/emberjson-0.3.1-hb0f4dca_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.1.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.11-hc97d973_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.11-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://repo.prefix.dev/mojo-community/linux-64/small_time-26.1.0-hb0f4dca_0.conda + - conda: https://repo.prefix.dev/mojo-community/linux-64/small_time-26.2.0-hb0f4dca_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py313h07c4f96_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h59595ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda linux-aarch64: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: https://repo.prefix.dev/modular-community/linux-aarch64/emberjson-0.3.1-he8cfe8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.5-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.18-hb9de7d4_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.2-h10b116e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.21-h80f16a2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.1.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.11-h4c0d347_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.12-h4c0d347_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.11-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312h4552c38_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312hdf0a211_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://repo.prefix.dev/mojo-community/linux-aarch64/small_time-26.1.0-he8cfe8b_0.conda + - conda: https://repo.prefix.dev/mojo-community/linux-aarch64/small_time-26.2.0-he8cfe8b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.3-py313he149459_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.5-py313he149459_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h2f0025b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hc0523f8_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: https://repo.prefix.dev/modular-community/osx-arm64/emberjson-0.3.1-h60d57d3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.18-h27ca646_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.1.0-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.1.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.11-hfc2f54d_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.11-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312hd65ceae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://repo.prefix.dev/mojo-community/osx-arm64/small_time-26.1.0-h60d57d3_0.conda + - conda: https://repo.prefix.dev/mojo-community/osx-arm64/small_time-26.2.0-h60d57d3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py313h6535dbc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.5-py313h0997733_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hebf3989_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda default: channels: - url: https://conda.anaconda.org/conda-forge/ + - url: https://repo.prefix.dev/mojo-community/ - url: https://conda.modular.com/max/ - url: https://repo.prefix.dev/modular-community/ - - url: https://repo.prefix.dev/mojo-community/ + options: + pypi-prerelease-mode: if-necessary-or-explicit packages: linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: https://repo.prefix.dev/modular-community/linux-64/emberjson-0.3.1-hb0f4dca_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.1.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.11-hc97d973_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.11-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://repo.prefix.dev/mojo-community/linux-64/small_time-26.1.0-hb0f4dca_0.conda + - conda: https://repo.prefix.dev/mojo-community/linux-64/small_time-26.2.0-hb0f4dca_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py313h07c4f96_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h59595ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda linux-aarch64: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: https://repo.prefix.dev/modular-community/linux-aarch64/emberjson-0.3.1-he8cfe8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.5-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.18-hb9de7d4_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.2-h10b116e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.21-h80f16a2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.1.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.11-h4c0d347_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.12-h4c0d347_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.11-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312h4552c38_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312hdf0a211_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://repo.prefix.dev/mojo-community/linux-aarch64/small_time-26.1.0-he8cfe8b_0.conda + - conda: https://repo.prefix.dev/mojo-community/linux-aarch64/small_time-26.2.0-he8cfe8b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.3-py313he149459_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.5-py313he149459_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h2f0025b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hc0523f8_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: https://repo.prefix.dev/modular-community/osx-arm64/emberjson-0.3.1-h60d57d3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.18-h27ca646_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.1.0-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.1.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.11-hfc2f54d_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.11-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312hd65ceae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://repo.prefix.dev/mojo-community/osx-arm64/small_time-26.1.0-h60d57d3_0.conda + - conda: https://repo.prefix.dev/mojo-community/osx-arm64/small_time-26.2.0-h60d57d3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py313h6535dbc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.5-py313h0997733_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hebf3989_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda integration-tests: channels: - url: https://conda.anaconda.org/conda-forge/ + - url: https://repo.prefix.dev/mojo-community/ - url: https://conda.modular.com/max/ - url: https://repo.prefix.dev/modular-community/ - - url: https://repo.prefix.dev/mojo-community/ indexes: - https://pypi.org/simple + options: + pypi-prerelease-mode: if-necessary-or-explicit packages: linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py313h18e8e13_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-with-filecache-0.14.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cleo-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/crashtest-0.4.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.4-py313heb322e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.5-py313heb322e3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dulwich-0.21.7-py313h536fd9c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.3.0-hd8ed1ab_0.conda + - conda: https://repo.prefix.dev/modular-community/linux-64/emberjson-0.3.1-hb0f4dca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.127.1-h4d8500f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.20-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-core-0.127.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda @@ -355,9 +373,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/httptools-0.7.1-py313h07c4f96_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhcf101f3_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda @@ -365,48 +383,49 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-24.3.1-pyha804496_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.3-h6548e54_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_0.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.1.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_1.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max/linux-64/mojo-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.1.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py313h7037e92_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.1-py313hf6604e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py313hf6604e3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.12.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/poetry-1.8.5-pyha804496_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/poetry-core-1.9.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/poetry-plugin-export-1.8.0-pyhd8ed1ab_1.conda @@ -414,91 +433,90 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py313h843e2db_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-extra-types-2.11.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.12.0-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-extra-types-2.11.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.13.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.11-hc97d973_101_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.2-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.11-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-installer-0.7.0-pyhff2d567_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.22-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rapidfuzz-3.14.3-py313h7033f15_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.17.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.19.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.1-py313h78bf25f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://repo.prefix.dev/mojo-community/linux-64/small_time-26.1.0-hb0f4dca_0.conda + - conda: https://repo.prefix.dev/mojo-community/linux-64/small_time-26.2.0-hb0f4dca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.50.0-pyhfdc7a7d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.14.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py313h07c4f96_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2026.1.14.14-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.21.1-pyhf8876ea_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.21.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.21.1-h378290b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.24.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.40.0-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.40.0-h4cd5af1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.42.0-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.42.0-h76e4700_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.22.1-py313h07c4f96_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.39.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.1.1-py313h5c7d99a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-16.0-py313h54dd161_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h59595ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - pypi: https://files.pythonhosted.org/packages/e0/2e/815384e25cdade147af784ad5a0f71fe10602c5e0a1d35a9c9040a72248b/abnf-2.4.1-py3-none-any.whl linux-aarch64: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/backports.zstd-1.3.0-py313h3d57138_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py313hb260801_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-with-filecache-0.14.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.0.0-py313h897158f_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cleo-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/crashtest-0.4.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-46.0.4-py313h2e85185_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-46.0.5-py313h2e85185_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.16.2-h70963c4_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dulwich-0.21.7-py313h31d5739_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.3.0-hd8ed1ab_0.conda + - conda: https://repo.prefix.dev/modular-community/linux-aarch64/emberjson-0.3.1-he8cfe8b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.127.1-h4d8500f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.20-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-core-0.127.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda @@ -506,9 +524,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/httptools-0.7.1-py313h6194ac5_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhcf101f3_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda @@ -516,48 +534,49 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-24.3.1-pyha804496_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-5_haddc8a3_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-5_hd72aa62_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-6_haddc8a3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-6_hd72aa62_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.5-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.3-hf53f6bf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-5_h88aeb00_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-6_h88aeb00_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.18-hb9de7d4_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.2-h10b116e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.32-pthreads_h9d3fd7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.21-h80f16a2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py313hfa222a2_0.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.1.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py313hfa222a2_1.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.1.0-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/msgpack-python-1.1.2-py313he6111f0_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.1-py313h11e5ff7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.3-py313h11e5ff7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.12.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/poetry-1.8.5-pyha804496_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/poetry-core-1.9.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/poetry-plugin-export-1.8.0-pyhd8ed1ab_1.conda @@ -565,56 +584,54 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.41.5-py313h5e7b836_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-extra-types-2.11.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.12.0-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-extra-types-2.11.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.13.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.11-h4c0d347_101_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.12-h4c0d347_100_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.2-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.11-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-installer-0.7.0-pyhff2d567_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.22-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312h4552c38_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312hdf0a211_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rapidfuzz-3.14.3-py313he352c24_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.17.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.19.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/secretstorage-3.4.1-py313h1258fbd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://repo.prefix.dev/mojo-community/linux-aarch64/small_time-26.1.0-he8cfe8b_0.conda + - conda: https://repo.prefix.dev/mojo-community/linux-aarch64/small_time-26.2.0-he8cfe8b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.50.0-pyhfdc7a7d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.14.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.3-py313he149459_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.5-py313he149459_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2026.1.14.14-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.21.1-pyhf8876ea_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.21.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.21.1-h378290b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.24.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.40.0-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.40.0-h4cd5af1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.42.0-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.42.0-h76e4700_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvloop-0.22.1-py313h6194ac5_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.39.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/watchfiles-1.1.1-py313he77ad87_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/websockets-16.0-py313h62ef0ea_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h2f0025b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hc0523f8_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - pypi: https://files.pythonhosted.org/packages/e0/2e/815384e25cdade147af784ad5a0f71fe10602c5e0a1d35a9c9040a72248b/abnf-2.4.1-py3-none-any.whl @@ -623,31 +640,32 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/backports.zstd-1.3.0-py313h48bb75e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py313hde1f3bb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-with-filecache-0.14.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cleo-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/crashtest-0.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dulwich-0.21.7-py313h63a2874_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.3.0-hd8ed1ab_0.conda + - conda: https://repo.prefix.dev/modular-community/osx-arm64/emberjson-0.3.1-h60d57d3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.127.1-h4d8500f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.20-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.23-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-core-0.127.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda @@ -655,50 +673,52 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/httptools-0.7.1-py313h6535dbc_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhcf101f3_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-24.3.1-pyh534df25_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-6_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-6_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.18-h27ca646_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.1-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py313h7d74516_0.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.1.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py313h65a2061_1.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.1.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.1.2-py313ha61f8ec_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.1-py313h16eae64_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py313he4a34aa_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.12.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/poetry-1.8.5-pyh534df25_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/poetry-core-1.9.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/poetry-plugin-export-1.8.0-pyhd8ed1ab_1.conda @@ -706,403 +726,410 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py313h2c089d5_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-extra-types-2.11.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.12.0-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-extra-types-2.11.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.13.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.11-hfc2f54d_101_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.2-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.11-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-installer-0.7.0-pyhff2d567_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.22-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312hd65ceae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h65a2061_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rapidfuzz-3.14.3-py313h0e822ff_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.17.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.19.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://repo.prefix.dev/mojo-community/osx-arm64/small_time-26.1.0-h60d57d3_0.conda + - conda: https://repo.prefix.dev/mojo-community/osx-arm64/small_time-26.2.0-h60d57d3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.50.0-pyhfdc7a7d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.14.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py313h6535dbc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.5-py313h0997733_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2026.1.14.14-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.21.1-pyhf8876ea_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.21.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.21.1-h378290b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.24.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.40.0-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.40.0-h4cd5af1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.42.0-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.42.0-h76e4700_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.22.1-py313h6535dbc_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.39.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.1.1-py313h0b74987_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-16.0-py313h6688731_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xattr-1.3.0-py313h41b806d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hebf3989_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - pypi: https://files.pythonhosted.org/packages/e0/2e/815384e25cdade147af784ad5a0f71fe10602c5e0a1d35a9c9040a72248b/abnf-2.4.1-py3-none-any.whl unit-tests: channels: - url: https://conda.anaconda.org/conda-forge/ + - url: https://repo.prefix.dev/mojo-community/ - url: https://conda.modular.com/max/ - url: https://repo.prefix.dev/modular-community/ - - url: https://repo.prefix.dev/mojo-community/ + options: + pypi-prerelease-mode: if-necessary-or-explicit packages: linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: https://repo.prefix.dev/modular-community/linux-64/emberjson-0.3.1-hb0f4dca_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.1.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.11-hc97d973_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.11-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://repo.prefix.dev/mojo-community/linux-64/small_time-26.1.0-hb0f4dca_0.conda + - conda: https://repo.prefix.dev/mojo-community/linux-64/small_time-26.2.0-hb0f4dca_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py313h07c4f96_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h59595ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda linux-aarch64: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: https://repo.prefix.dev/modular-community/linux-aarch64/emberjson-0.3.1-he8cfe8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.5-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.18-hb9de7d4_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.2-h10b116e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.21-h80f16a2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.1.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.11-h4c0d347_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.12-h4c0d347_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.11-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312h4552c38_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312hdf0a211_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://repo.prefix.dev/mojo-community/linux-aarch64/small_time-26.1.0-he8cfe8b_0.conda + - conda: https://repo.prefix.dev/mojo-community/linux-aarch64/small_time-26.2.0-he8cfe8b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.3-py313he149459_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.5-py313he149459_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h2f0025b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hc0523f8_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: https://repo.prefix.dev/modular-community/osx-arm64/emberjson-0.3.1-h60d57d3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.18-h27ca646_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.1.0-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.1.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.11-hfc2f54d_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.11-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312hd65ceae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://repo.prefix.dev/mojo-community/osx-arm64/small_time-26.1.0-h60d57d3_0.conda + - conda: https://repo.prefix.dev/mojo-community/osx-arm64/small_time-26.2.0-h60d57d3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py313h6535dbc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.5-py313h0997733_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hebf3989_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda util: channels: - url: https://conda.anaconda.org/conda-forge/ + - url: https://repo.prefix.dev/mojo-community/ - url: https://conda.modular.com/max/ - url: https://repo.prefix.dev/modular-community/ - - url: https://repo.prefix.dev/mojo-community/ + options: + pypi-prerelease-mode: if-necessary-or-explicit packages: linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: https://repo.prefix.dev/modular-community/linux-64/emberjson-0.3.1-hb0f4dca_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isort-7.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.1.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.11-hc97d973_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.11-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://repo.prefix.dev/mojo-community/linux-64/small_time-26.1.0-hb0f4dca_0.conda + - conda: https://repo.prefix.dev/mojo-community/linux-64/small_time-26.2.0-hb0f4dca_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py313h07c4f96_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h59595ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda linux-aarch64: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: https://repo.prefix.dev/modular-community/linux-aarch64/emberjson-0.3.1-he8cfe8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isort-7.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.5-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.18-hb9de7d4_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.2-h10b116e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.21-h80f16a2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.1.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.11-h4c0d347_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.12-h4c0d347_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.11-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312h4552c38_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312hdf0a211_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://repo.prefix.dev/mojo-community/linux-aarch64/small_time-26.1.0-he8cfe8b_0.conda + - conda: https://repo.prefix.dev/mojo-community/linux-aarch64/small_time-26.2.0-he8cfe8b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.3-py313he149459_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.5-py313he149459_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h2f0025b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hc0523f8_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: https://repo.prefix.dev/modular-community/osx-arm64/emberjson-0.3.1-h60d57d3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isort-7.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-hf6b4638_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.18-h27ca646_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.modular.com/max/noarch/mblack-26.1.0-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.26.1.0-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.1.0-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.26.2.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.11-hfc2f54d_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.11-h4df99d1_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312hd65ceae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://repo.prefix.dev/mojo-community/osx-arm64/small_time-26.1.0-h60d57d3_0.conda + - conda: https://repo.prefix.dev/mojo-community/osx-arm64/small_time-26.2.0-h60d57d3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py313h6535dbc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.5-py313h0997733_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hebf3989_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda packages: -- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 - md5: d7c89558ba9fa0495403155b64376d81 - license: None - purls: [] - size: 2562 - timestamp: 1578324546067 -- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - build_number: 16 - sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 - md5: 73aaf86a425cc6e73fcf236a5a46396d - depends: - - _libgcc_mutex 0.1 conda_forge +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + build_number: 20 + sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 + md5: a9f577daf3de00bca7c3c76c0ecbd1de + depends: + - __glibc >=2.17,<3.0.a0 - libgomp >=7.5.0 constrains: - - openmp_impl 9999 + - openmp_impl <0.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 23621 - timestamp: 1650670423406 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - build_number: 16 - sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 - md5: 6168d71addc746e8f2b8d57dfd2edcea + size: 28948 + timestamp: 1770939786096 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda + build_number: 20 + sha256: a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068 + md5: 468fd3bb9e1f671d36c2cbc677e56f1d depends: - libgomp >=7.5.0 constrains: - - openmp_impl 9999 + - openmp_impl <0.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 23712 - timestamp: 1650670790230 + size: 28926 + timestamp: 1770939656741 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda build_number: 7 sha256: 7acaa2e0782cad032bdaf756b536874346ac1375745fb250e9bdd6a48a7ab3cd @@ -1164,9 +1191,9 @@ packages: - pkg:pypi/annotated-types?source=hash-mapping size: 18074 timestamp: 1733247158254 -- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda - sha256: eb0c4e2b24f1fbefaf96ce6c992c6bd64340bc3c06add4d7415ab69222b201da - md5: 11a2b8c732d215d977998ccd69a9d5e8 +- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda + sha256: f09aed24661cd45ba54a43772504f05c0698248734f9ae8cd289d314ac89707e + md5: af2df4b9108808da3dc76710fe50eae2 depends: - exceptiongroup >=1.0.2 - idna >=2.8 @@ -1175,13 +1202,14 @@ packages: - python constrains: - trio >=0.32.0 - - uvloop >=0.21 + - uvloop >=0.22.1 + - winloop >=0.2.3 license: MIT license_family: MIT purls: - pkg:pypi/anyio?source=compressed-mapping - size: 145175 - timestamp: 1767719033569 + size: 146764 + timestamp: 1774359453364 - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py313h18e8e13_0.conda sha256: 9552afbec37c4d8d0e83a5c4c6b3c7f4b8785f935094ce3881e0a249045909ce md5: d9e90792551a527200637e23a915dd79 @@ -1275,46 +1303,46 @@ packages: - pkg:pypi/brotli?source=hash-mapping size: 359568 timestamp: 1764018359470 -- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 - md5: 51a19bba1b8ebfb60df25cde030b7ebc +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 + md5: d2ffd7602c02f2b316fd921d39876885 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: bzip2-1.0.6 license_family: BSD purls: [] - size: 260341 - timestamp: 1757437258798 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda - sha256: d2a296aa0b5f38ed9c264def6cf775c0ccb0f110ae156fcde322f3eccebf2e01 - md5: 2921ac0b541bf37c69e66bd6d9a43bca + size: 260182 + timestamp: 1771350215188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda + sha256: b3495077889dde6bb370938e7db82be545c73e8589696ad0843a32221520ad4c + md5: 840d8fc0d7b3209be93080bc20e07f2d depends: - libgcc >=14 license: bzip2-1.0.6 license_family: BSD purls: [] - size: 192536 - timestamp: 1757437302703 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - sha256: b456200636bd5fecb2bec63f7e0985ad2097cf1b83d60ce0b6968dffa6d02aa1 - md5: 58fd217444c2a5701a44244faf518206 + size: 192412 + timestamp: 1771350241232 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df + md5: 620b85a3f45526a8bc4d23fd78fc22f0 depends: - __osx >=11.0 license: bzip2-1.0.6 license_family: BSD purls: [] - size: 125061 - timestamp: 1757437486465 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - sha256: b5974ec9b50e3c514a382335efa81ed02b05906849827a34061c496f4defa0b2 - md5: bddacf101bb4dd0e51811cb69c7790e2 + size: 124834 + timestamp: 1771350416561 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc + md5: 4492fd26db29495f0ba23f146cd5638d depends: - __unix license: ISC purls: [] - size: 146519 - timestamp: 1767500828366 + size: 147413 + timestamp: 1772006283803 - conda: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.14.3-pyha770c72_0.conda sha256: ec791bb6f1ef504411f87b28946a7ae63ed1f3681cefc462cf1dfdaf0790b6a9 md5: 241ef6e3db47a143ac34c21bfba510f1 @@ -1340,16 +1368,16 @@ packages: purls: [] size: 7203 timestamp: 1746103018780 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - sha256: 110338066d194a715947808611b763857c15458f8b3b97197387356844af9450 - md5: eacc711330cd46939f66cd401ff9c44b +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda + sha256: a6b118fd1ed6099dc4fc03f9c492b88882a780fadaef4ed4f93dc70757713656 + md5: 765c4d97e877cdbbb88ff33152b86125 depends: - python >=3.10 license: ISC purls: - pkg:pypi/certifi?source=compressed-mapping - size: 150969 - timestamp: 1767500900768 + size: 151445 + timestamp: 1772001170301 - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda sha256: 2162a91819945c826c6ef5efe379e88b1df0fe9a387eeba23ddcf7ebeacd5bd6 md5: d0616e7935acab407d1543b28c446f6f @@ -1397,17 +1425,17 @@ packages: - pkg:pypi/cffi?source=hash-mapping size: 291376 timestamp: 1761203583358 -- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - sha256: b32f8362e885f1b8417bac2b3da4db7323faa12d5db62b7fd6691c02d60d6f59 - md5: a22d1fd9bf98827e280a02875d9a007a +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda + sha256: d86dfd428b2e3c364fa90e07437c8405d635aa4ef54b25ab51d9c712be4112a5 + md5: 49ee13eb9b8f44d63879c69b8a40a74b depends: - python >=3.10 license: MIT license_family: MIT purls: - - pkg:pypi/charset-normalizer?source=hash-mapping - size: 50965 - timestamp: 1760437331772 + - pkg:pypi/charset-normalizer?source=compressed-mapping + size: 58510 + timestamp: 1773660086450 - conda: https://conda.anaconda.org/conda-forge/noarch/cleo-2.1.0-pyhd8ed1ab_1.conda sha256: efed3fcc0cf751b27d7f493654c5f2fba664a263664bcde9bc3a7424c080c20a md5: 0bbf06825d478dc823a7cea431b9108c @@ -1445,17 +1473,17 @@ packages: - pkg:pypi/colorama?source=hash-mapping size: 27011 timestamp: 1733218222191 -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.11-py313hd8ed1ab_101.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda noarch: generic - sha256: f851800da77f360e39235383d685b6e3be4edf28fe233f3bcf09c45293f39ae1 - md5: c74a6b9e8694e5122949f611d1552df5 + sha256: 7636809bda35add7af66cda1fee156136fcba0a1e24bbef1d591ee859df755a8 + md5: 9a4b8a37303b933b847c14a310f0557b depends: - python >=3.13,<3.14.0a0 - python_abi * *_cp313 license: Python-2.0 purls: [] - size: 48249 - timestamp: 1769471321757 + size: 48648 + timestamp: 1770270374831 - conda: https://conda.anaconda.org/conda-forge/noarch/crashtest-0.4.1-pyhd8ed1ab_1.conda sha256: af1622b15f8c7411d9c14b8adf970cec16fec8a28b98069fdf42b1cd2259ccc9 md5: e036e2f76d9c9aebc12510ed23352b6c @@ -1467,9 +1495,9 @@ packages: - pkg:pypi/crashtest?source=hash-mapping size: 11619 timestamp: 1733564888371 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.4-py313heb322e3_0.conda - sha256: f92d767380fa956d1d0e5d3e454463fb104cd85e1315c626948ba3f4c0dc8c40 - md5: 8831066b7226ee1c5c75e8d0832517e6 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.5-py313heb322e3_0.conda + sha256: 553f4ee18ad755d690ad63fa8e00d89598ecc4945ec046a8af808ddee5bb1ca0 + md5: 964f25e322b16cae073da8f5b7adf123 depends: - __glibc >=2.17,<3.0.a0 - cffi >=1.14 @@ -1483,11 +1511,11 @@ packages: license_family: BSD purls: - pkg:pypi/cryptography?source=hash-mapping - size: 1718294 - timestamp: 1769650497266 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-46.0.4-py313h2e85185_0.conda - sha256: 3eb24431c0d1d6a368481d61352a156601967e8d283f074abc0a6ccf0e04317f - md5: 227e5e1ede4a2856e99dd0c25b4ac926 + size: 1718868 + timestamp: 1770772833949 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-46.0.5-py313h2e85185_0.conda + sha256: f799fc4ceb2b20bce5b7bbe4038c4fc273fb49d8ccc5d4bd7d34b434fd790ed0 + md5: 9f017a0f98d0efb83e04a5ce9f01598e depends: - cffi >=1.14 - libgcc >=14 @@ -1501,8 +1529,8 @@ packages: license_family: BSD purls: - pkg:pypi/cryptography?source=hash-mapping - size: 1709772 - timestamp: 1769650456870 + size: 1710168 + timestamp: 1770772502541 - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda sha256: 8bb557af1b2b7983cf56292336a1a1853f26555d9c6cecf1e5b2b96838c9da87 md5: ce96f2f470d39bd96ce03945af92e280 @@ -1628,6 +1656,30 @@ packages: purls: [] size: 7077 timestamp: 1756221480651 +- conda: https://repo.prefix.dev/modular-community/linux-64/emberjson-0.3.1-hb0f4dca_0.conda + sha256: 58c9da88a2443fe1ae8f38a8730248bafc7783e9dee2026fb6b0a38bfd434ca2 + md5: 73f92508b896490acb866af97ae51158 + depends: + - mojo-compiler >=0.26.2.0,<1.0a0 + license: Apache-2.0 + size: 11734456 + timestamp: 1774189159890 +- conda: https://repo.prefix.dev/modular-community/linux-aarch64/emberjson-0.3.1-he8cfe8b_0.conda + sha256: c185b1c1e2b895df1b8af446e8ddcc3577b27c2d975f70873a80ec5e903f6f8f + md5: 9f06f1593eae8ccd1cee6a8cd424f360 + depends: + - mojo-compiler >=0.26.2.0,<1.0a0 + license: Apache-2.0 + size: 11735430 + timestamp: 1774188948168 +- conda: https://repo.prefix.dev/modular-community/osx-arm64/emberjson-0.3.1-h60d57d3_0.conda + sha256: a1b804d4d7fa3841f589364bdcb1d3b00947f4f851ed11daf92de4f58b5f0744 + md5: 1e949858744193640145757df6afbd88 + depends: + - mojo-compiler >=0.26.2.0,<1.0a0 + license: Apache-2.0 + size: 11733418 + timestamp: 1774188963598 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144 md5: 8e662bd460bda79b1ea39194e3c4c9ab @@ -1636,7 +1688,7 @@ packages: - typing_extensions >=4.6.0 license: MIT and PSF-2.0 purls: - - pkg:pypi/exceptiongroup?source=compressed-mapping + - pkg:pypi/exceptiongroup?source=hash-mapping size: 21333 timestamp: 1763918099466 - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.127.1-h4d8500f_0.conda @@ -1657,9 +1709,9 @@ packages: purls: [] size: 4807 timestamp: 1766768870506 -- conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.20-pyhcf101f3_0.conda - sha256: 284cae62b2061a9f423b468f720deeff98783eccff6bf3b32965afb21a53e349 - md5: e2b464522fa49c5948c4da6c8d8ea9b3 +- conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.23-pyhcf101f3_0.conda + sha256: cb60fc8c96dcd2a6335914d4d6d7d5f5549c9e1ff4533be28ba699e648babf37 + md5: 442ec6511754418c87a84bc1dc0c5384 depends: - python >=3.10 - rich-toolkit >=0.14.8 @@ -1670,9 +1722,9 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/fastapi-cli?source=compressed-mapping - size: 18993 - timestamp: 1766435117562 + - pkg:pypi/fastapi-cli?source=hash-mapping + size: 18920 + timestamp: 1771293215825 - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-core-0.127.1-pyhcf101f3_0.conda sha256: f9059587f6161f0cbd62c600f17d9164aa1e6062fda2f7a68f010dbf257b7c56 md5: 8d9e16861f5a037242d78e194c8d0b57 @@ -1698,16 +1750,16 @@ packages: - pkg:pypi/fastapi?source=hash-mapping size: 89283 timestamp: 1766768870504 -- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda - sha256: 8b90dc21f00167a7e58abb5141a140bdb31a7c5734fe1361b5f98f4a4183fd32 - md5: 2cfaaccf085c133a477f0a7a8657afe9 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda + sha256: dddea9ec53d5e179de82c24569d41198f98db93314f0adae6b15195085d5567f + md5: f58064cec97b12a7136ebb8a6f8a129b depends: - python >=3.10 license: Unlicense purls: - - pkg:pypi/filelock?source=hash-mapping - size: 18661 - timestamp: 1768022315929 + - pkg:pypi/filelock?source=compressed-mapping + size: 25845 + timestamp: 1773314012590 - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda sha256: 96cac6573fd35ae151f4d6979bab6fbc90cb6b1fb99054ba19eb075da9822fcb md5: b8993c19b0c32a2f7b66cbb58ca27069 @@ -1718,7 +1770,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/h11?source=hash-mapping + - pkg:pypi/h11?source=compressed-mapping size: 39069 timestamp: 1767729720872 - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -1831,9 +1883,9 @@ packages: - pkg:pypi/hyperframe?source=hash-mapping size: 17397 timestamp: 1737618427549 -- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - sha256: 142a722072fa96cf16ff98eaaf641f54ab84744af81754c292cb81e0881c0329 - md5: 186a18e3ba246eccfc7cff00cd19a870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a + md5: c80d8a3b84358cb967fa81e7075fbc8a depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -1841,29 +1893,29 @@ packages: license: MIT license_family: MIT purls: [] - size: 12728445 - timestamp: 1767969922681 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda - sha256: 09f7f9213eb68e7e4291cd476e72b37f3ded99ed957528567f32f5ba6b611043 - md5: 15b35dc33e185e7d2aac1cfcd6778627 + size: 12723451 + timestamp: 1773822285671 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda + sha256: 49ba6aed2c6b482bb0ba41078057555d29764299bc947b990708617712ef6406 + md5: 546da38c2fa9efacf203e2ad3f987c59 depends: - libgcc >=14 - libstdcxx >=14 license: MIT license_family: MIT purls: [] - size: 12852963 - timestamp: 1767975394622 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda - sha256: d4cefbca587429d1192509edc52c88de52bc96c2447771ddc1f8bee928aed5ef - md5: 1e93aca311da0210e660d2247812fa02 + size: 12837286 + timestamp: 1773822650615 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + sha256: 3a7907a17e9937d3a46dfd41cffaf815abad59a569440d1e25177c15fd0684e5 + md5: f1182c91c0de31a7abd40cedf6a5ebef depends: - __osx >=11.0 license: MIT license_family: MIT purls: [] - size: 12358010 - timestamp: 1767970350308 + size: 12361647 + timestamp: 1773822915649 - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 md5: 53abe63df7e10a6ba605dc5f9f961d36 @@ -1875,19 +1927,19 @@ packages: - pkg:pypi/idna?source=hash-mapping size: 50721 timestamp: 1760286526795 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - sha256: c18ab120a0613ada4391b15981d86ff777b5690ca461ea7e9e49531e8f374745 - md5: 63ccfdc3a3ce25b027b8767eb722fca8 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda + sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 + md5: 080594bf4493e6bae2607e65390c520a depends: - - python >=3.9 + - python >=3.10 - zipp >=3.20 - python license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/importlib-metadata?source=hash-mapping - size: 34641 - timestamp: 1747934053147 + - pkg:pypi/importlib-metadata?source=compressed-mapping + size: 34387 + timestamp: 1773931568510 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda sha256: acc1d991837c0afb67c75b77fdc72b4bf022aac71fedd8b9ea45918ac9b08a80 md5: c85c76dc67d75619a92f51dfbce06992 @@ -2018,177 +2070,272 @@ packages: - pkg:pypi/keyring?source=hash-mapping size: 36220 timestamp: 1728574952762 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda - sha256: 1027bd8aa0d5144e954e426ab6218fd5c14e54a98f571985675468b339c808ca - md5: 3ec0aa5037d39b06554109a01e6fb0c6 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 + md5: b38117a3c920364aff79f870c984b4a3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-or-later + purls: [] + size: 134088 + timestamp: 1754905959823 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + sha256: 5ce830ca274b67de11a7075430a72020c1fb7d486161a82839be15c2b84e9988 + md5: e7df0aab10b9cbb73ab2a467ebfaf8c7 + depends: + - libgcc >=13 + license: LGPL-2.1-or-later + purls: [] + size: 129048 + timestamp: 1754906002667 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 + md5: fb53fb07ce46a575c5d004bbc96032c2 + depends: + - __glibc >=2.17,<3.0.a0 + - keyutils >=1.6.3,<2.0a0 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1386730 + timestamp: 1769769569681 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda + sha256: b53999d888dda53c506b264e8c02b5f5c8e022c781eda0718f007339e6bc90ba + md5: d9ca108bd680ea86a963104b6b3e95ca + depends: + - keyutils >=1.6.3,<2.0a0 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1517436 + timestamp: 1769773395215 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda + sha256: c0a0bf028fe7f3defcdcaa464e536cf1b202d07451e18ad83fdd169d15bef6ed + md5: e446e1822f4da8e5080a9de93474184d + depends: + - __osx >=11.0 + - libcxx >=19 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1160828 + timestamp: 1769770119811 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c + md5: 18335a698559cdbcd86150a48bf54ba6 depends: - __glibc >=2.17,<3.0.a0 - zstd >=1.5.7,<1.6.0a0 constrains: - - binutils_impl_linux-64 2.45 + - binutils_impl_linux-64 2.45.1 license: GPL-3.0-only license_family: GPL purls: [] - size: 730831 - timestamp: 1766513089214 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_105.conda - sha256: 12e7341b89e9ea319a3b4de03d02cd988fa02b8a678f4e46779515009b5e475c - md5: 849c4cbbf8dd1d71e66c13afed1d2f12 + size: 728002 + timestamp: 1774197446916 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda + sha256: 7abd913d81a9bf00abb699e8987966baa2065f5132e37e815f92d90fc6bba530 + md5: a21644fc4a83da26452a718dc9468d5f depends: - zstd >=1.5.7,<1.6.0a0 constrains: - - binutils_impl_linux-aarch64 2.45 + - binutils_impl_linux-aarch64 2.45.1 license: GPL-3.0-only license_family: GPL purls: [] - size: 876257 - timestamp: 1766513180236 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - build_number: 5 - sha256: 18c72545080b86739352482ba14ba2c4815e19e26a7417ca21a95b76ec8da24c - md5: c160954f7418d7b6e87eaf05a8913fa9 - depends: - - libopenblas >=0.3.30,<0.3.31.0a0 - - libopenblas >=0.3.30,<1.0a0 + size: 875596 + timestamp: 1774197520746 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda + build_number: 6 + sha256: 7bfe936dbb5db04820cf300a9cc1f5ee8d5302fc896c2d66e30f1ee2f20fbfd6 + md5: 6d6d225559bfa6e2f3c90ee9c03d4e2e + depends: + - libopenblas >=0.3.32,<0.3.33.0a0 + - libopenblas >=0.3.32,<1.0a0 constrains: + - blas 2.306 openblas + - liblapack 3.11.0 6*_openblas + - liblapacke 3.11.0 6*_openblas + - libcblas 3.11.0 6*_openblas - mkl <2026 - - liblapack 3.11.0 5*_openblas - - libcblas 3.11.0 5*_openblas - - blas 2.305 openblas - - liblapacke 3.11.0 5*_openblas license: BSD-3-Clause - license_family: BSD purls: [] - size: 18213 - timestamp: 1765818813880 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-5_haddc8a3_openblas.conda - build_number: 5 - sha256: 700f3c03d0fba8e687a345404a45fbabe781c1cf92242382f62cef2948745ec4 - md5: 5afcea37a46f76ec1322943b3c4dfdc0 - depends: - - libopenblas >=0.3.30,<0.3.31.0a0 - - libopenblas >=0.3.30,<1.0a0 + size: 18621 + timestamp: 1774503034895 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-6_haddc8a3_openblas.conda + build_number: 6 + sha256: 7374c744c37786bfa4cfd30bbbad13469882e5d9f32ed792922b447b7e369554 + md5: 652bb20bb4618cacd11e17ae070f47ce + depends: + - libopenblas >=0.3.32,<0.3.33.0a0 + - libopenblas >=0.3.32,<1.0a0 constrains: + - blas 2.306 openblas - mkl <2026 - - libcblas 3.11.0 5*_openblas - - liblapack 3.11.0 5*_openblas - - liblapacke 3.11.0 5*_openblas - - blas 2.305 openblas + - liblapack 3.11.0 6*_openblas + - liblapacke 3.11.0 6*_openblas + - libcblas 3.11.0 6*_openblas license: BSD-3-Clause - license_family: BSD purls: [] - size: 18369 - timestamp: 1765818610617 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - build_number: 5 - sha256: 620a6278f194dcabc7962277da6835b1e968e46ad0c8e757736255f5ddbfca8d - md5: bcc025e2bbaf8a92982d20863fe1fb69 - depends: - - libopenblas >=0.3.30,<0.3.31.0a0 - - libopenblas >=0.3.30,<1.0a0 + size: 18682 + timestamp: 1774503047392 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-6_h51639a9_openblas.conda + build_number: 6 + sha256: 979227fc03628925037ab2dfda008eb7b5592644d9c2c21dd285cefe8c42553d + md5: e551103471911260488a02155cef9c94 + depends: + - libopenblas >=0.3.32,<0.3.33.0a0 + - libopenblas >=0.3.32,<1.0a0 constrains: - - libcblas 3.11.0 5*_openblas - - liblapack 3.11.0 5*_openblas - - liblapacke 3.11.0 5*_openblas - - blas 2.305 openblas + - liblapacke 3.11.0 6*_openblas + - liblapack 3.11.0 6*_openblas + - blas 2.306 openblas + - libcblas 3.11.0 6*_openblas - mkl <2026 license: BSD-3-Clause - license_family: BSD purls: [] - size: 18546 - timestamp: 1765819094137 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - build_number: 5 - sha256: 0cbdcc67901e02dc17f1d19e1f9170610bd828100dc207de4d5b6b8ad1ae7ad8 - md5: 6636a2b6f1a87572df2970d3ebc87cc0 - depends: - - libblas 3.11.0 5_h4a7cf45_openblas + size: 18859 + timestamp: 1774504387211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda + build_number: 6 + sha256: 57edafa7796f6fa3ebbd5367692dd4c7f552be42109c2dd1a7c89b55089bf374 + md5: 36ae340a916635b97ac8a0655ace2a35 + depends: + - libblas 3.11.0 6_h4a7cf45_openblas constrains: - - liblapacke 3.11.0 5*_openblas - - blas 2.305 openblas - - liblapack 3.11.0 5*_openblas + - blas 2.306 openblas + - liblapack 3.11.0 6*_openblas + - liblapacke 3.11.0 6*_openblas license: BSD-3-Clause - license_family: BSD purls: [] - size: 18194 - timestamp: 1765818837135 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-5_hd72aa62_openblas.conda - build_number: 5 - sha256: 3fad5c9de161dccb4e42c8b1ae8eccb33f4ed56bccbcced9cbb0956ae7869e61 - md5: 0b2f1143ae2d0aa4c991959d0daaf256 - depends: - - libblas 3.11.0 5_haddc8a3_openblas + size: 18622 + timestamp: 1774503050205 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-6_hd72aa62_openblas.conda + build_number: 6 + sha256: 5dd9e872cf8ebd632f31cd3a5ca6d3cb331f4d3a90bfafbe572093afeb77632b + md5: 939e300b110db241a96a1bed438c315b + depends: + - libblas 3.11.0 6_haddc8a3_openblas constrains: - - liblapack 3.11.0 5*_openblas - - liblapacke 3.11.0 5*_openblas - - blas 2.305 openblas + - blas 2.306 openblas + - liblapack 3.11.0 6*_openblas + - liblapacke 3.11.0 6*_openblas license: BSD-3-Clause - license_family: BSD purls: [] - size: 18371 - timestamp: 1765818618899 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - build_number: 5 - sha256: 38809c361bbd165ecf83f7f05fae9b791e1baa11e4447367f38ae1327f402fc0 - md5: efd8bd15ca56e9d01748a3beab8404eb - depends: - - libblas 3.11.0 5_h51639a9_openblas + size: 18689 + timestamp: 1774503058069 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-6_hb0561ab_openblas.conda + build_number: 6 + sha256: 2e6b3e9b1ab672133b70fc6730e42290e952793f132cb5e72eee22835463eba0 + md5: 805c6d31c5621fd75e53dfcf21fb243a + depends: + - libblas 3.11.0 6_h51639a9_openblas constrains: - - liblapacke 3.11.0 5*_openblas - - liblapack 3.11.0 5*_openblas - - blas 2.305 openblas + - liblapacke 3.11.0 6*_openblas + - blas 2.306 openblas + - liblapack 3.11.0 6*_openblas license: BSD-3-Clause - license_family: BSD purls: [] - size: 18548 - timestamp: 1765819108956 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda - sha256: ce1049fa6fda9cf08ff1c50fb39573b5b0ea6958375d8ea7ccd8456ab81a0bcb - md5: e9c56daea841013e7774b5cd46f41564 + size: 18863 + timestamp: 1774504433388 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.2-h55c6f16_0.conda + sha256: d1402087c8792461bfc081629e8aa97e6e577a31ae0b84e6b9cc144a18f48067 + md5: 4280e0a7fd613b271e022e60dea0138c depends: - __osx >=11.0 license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 568910 - timestamp: 1772001095642 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - sha256: 1e1b08f6211629cbc2efe7a5bca5953f8f6b3cae0eeb04ca4dacee1bd4e2db2f - md5: 8b09ae86839581147ef2e5c5e229d164 + size: 568094 + timestamp: 1774439202359 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda + sha256: e8c2b57f6aacabdf2f1b0924bd4831ce5071ba080baa4a9e8c0d720588b6794c + md5: 49f570f3bc4c874a06ea69b7225753af depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: - - expat 2.7.3.* + - expat 2.7.5.* license: MIT license_family: MIT purls: [] - size: 76643 - timestamp: 1763549731408 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - sha256: cc2581a78315418cc2e0bb2a273d37363203e79cefe78ba6d282fed546262239 - md5: b414e36fbb7ca122030276c75fa9c34a + size: 76624 + timestamp: 1774719175983 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.5-hfae3067_0.conda + sha256: 6d438fc0bfdb263c24654fe49c09b31f06ec78eb709eb386392d2499af105f85 + md5: 05d1e0b30acd816a192c03dc6e164f4d depends: - libgcc >=14 constrains: - - expat 2.7.3.* + - expat 2.7.5.* license: MIT license_family: MIT purls: [] - size: 76201 - timestamp: 1763549910086 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - sha256: fce22610ecc95e6d149e42a42fbc3cc9d9179bd4eb6232639a60f06e080eec98 - md5: b79875dbb5b1db9a4a22a4520f918e1a + size: 76523 + timestamp: 1774719129371 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.5-hf6b4638_0.conda + sha256: 06780dec91dd25770c8cf01e158e1062fbf7c576b1406427475ce69a8af75b7e + md5: a32123f93e168eaa4080d87b0fb5da8a depends: - __osx >=11.0 constrains: - - expat 2.7.3.* + - expat 2.7.5.* license: MIT license_family: MIT purls: [] - size: 67800 - timestamp: 1763549994166 + size: 68192 + timestamp: 1774719211725 - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 md5: a360c33a5abe61c07959e449fa1453eb @@ -2220,105 +2367,85 @@ packages: purls: [] size: 40979 timestamp: 1769456747661 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda - sha256: 6eed58051c2e12b804d53ceff5994a350c61baf117ec83f5f10c953a3f311451 - md5: 6d0363467e6ed84f11435eb309f2ff06 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda + sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 + md5: 0aa00f03f9e39fb9876085dee11a85d4 depends: - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 constrains: - - libgcc-ng ==15.2.0=*_16 - - libgomp 15.2.0 he0feb66_16 + - libgcc-ng ==15.2.0=*_18 + - libgomp 15.2.0 he0feb66_18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 1042798 - timestamp: 1765256792743 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_16.conda - sha256: 44bfc6fe16236babb271e0c693fe7fd978f336542e23c9c30e700483796ed30b - md5: cf9cd6739a3b694dcf551d898e112331 + size: 1041788 + timestamp: 1771378212382 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda + sha256: 43df385bedc1cab11993c4369e1f3b04b4ca5d0ea16cba6a0e7f18dbc129fcc9 + md5: 552567ea2b61e3a3035759b2fdb3f9a6 depends: - _openmp_mutex >=4.5 constrains: - - libgomp 15.2.0 h8acb6b2_16 - - libgcc-ng ==15.2.0=*_16 + - libgcc-ng ==15.2.0=*_18 + - libgomp 15.2.0 h8acb6b2_18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 620637 - timestamp: 1765256938043 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_16.conda - sha256: 646c91dbc422fe92a5f8a3a5409c9aac66549f4ce8f8d1cab7c2aa5db789bb69 - md5: 8b216bac0de7a9d60f3ddeba2515545c + size: 622900 + timestamp: 1771378128706 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda + sha256: 1d9c4f35586adb71bcd23e31b68b7f3e4c4ab89914c26bed5f2859290be5560e + md5: 92df6107310b1fff92c4cc84f0de247b depends: - _openmp_mutex constrains: - - libgcc-ng ==15.2.0=*_16 - - libgomp 15.2.0 16 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 402197 - timestamp: 1765258985740 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda - sha256: 5f07f9317f596a201cc6e095e5fc92621afca64829785e483738d935f8cab361 - md5: 5a68259fac2da8f2ee6f7bfe49c9eb8b - depends: - - libgcc 15.2.0 he0feb66_16 + - libgcc-ng ==15.2.0=*_18 + - libgomp 15.2.0 18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 27256 - timestamp: 1765256804124 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_16.conda - sha256: 22d7e63a00c880bd14fbbc514ec6f553b9325d705f08582e9076c7e73c93a2e1 - md5: 3e54a6d0f2ff0172903c0acfda9efc0e + size: 401974 + timestamp: 1771378877463 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda + sha256: d2c9fad338fd85e4487424865da8e74006ab2e2475bd788f624d7a39b2a72aee + md5: 9063115da5bc35fdc3e1002e69b9ef6e depends: - - libgcc 15.2.0 h8acb6b2_16 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 27356 - timestamp: 1765256948637 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda - sha256: 8a7b01e1ee1c462ad243524d76099e7174ebdd94ff045fe3e9b1e58db196463b - md5: 40d9b534410403c821ff64f00d0adc22 - depends: - - libgfortran5 15.2.0 h68bc16d_16 + - libgfortran5 15.2.0 h68bc16d_18 constrains: - - libgfortran-ng ==15.2.0=*_16 + - libgfortran-ng ==15.2.0=*_18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 27215 - timestamp: 1765256845586 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_16.conda - sha256: 02fa489a333ee4bb5483ae6bf221386b67c25d318f2f856237821a7c9333d5be - md5: 776cca322459d09aad229a49761c0654 + size: 27523 + timestamp: 1771378269450 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda + sha256: 7dcd7dff2505d56fd5272a6e712ec912f50a46bf07dc6873a7e853694304e6e4 + md5: 41f261f5e4e2e8cbd236c2f1f15dae1b depends: - - libgfortran5 15.2.0 h1b7bec0_16 + - libgfortran5 15.2.0 h1b7bec0_18 constrains: - - libgfortran-ng ==15.2.0=*_16 + - libgfortran-ng ==15.2.0=*_18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 27314 - timestamp: 1765256989755 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda - sha256: 68a6c1384d209f8654112c4c57c68c540540dd8e09e17dd1facf6cf3467798b5 - md5: 11e09edf0dde4c288508501fe621bab4 + size: 27587 + timestamp: 1771378169244 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda + sha256: 63f89087c3f0c8621c5c89ecceec1e56e5e1c84f65fc9c5feca33a07c570a836 + md5: 26981599908ed2205366e8fc91b37fc6 depends: - - libgfortran5 15.2.0 hdae7583_16 + - libgfortran5 15.2.0 hdae7583_18 constrains: - - libgfortran-ng ==15.2.0=*_16 + - libgfortran-ng ==15.2.0=*_18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 138630 - timestamp: 1765259217400 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda - sha256: d0e974ebc937c67ae37f07a28edace978e01dc0f44ee02f29ab8a16004b8148b - md5: 39183d4e0c05609fd65f130633194e37 + size: 138973 + timestamp: 1771379054939 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda + sha256: 539b57cf50ec85509a94ba9949b7e30717839e4d694bc94f30d41c9d34de2d12 + md5: 646855f357199a12f02a87382d429b75 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=15.2.0 @@ -2327,11 +2454,11 @@ packages: license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 2480559 - timestamp: 1765256819588 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_16.conda - sha256: bde541944566254147aab746e66014682e37a259c9a57a0516cf5d05ec343d14 - md5: 87b4ffedaba8b4d675479313af74f612 + size: 2482475 + timestamp: 1771378241063 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda + sha256: 85347670dfb4a8d4c13cd7cae54138dcf2b1606b6bede42eef5507bf5f9660c6 + md5: 574d88ce3348331e962cfa5ed451b247 depends: - libgcc >=15.2.0 constrains: @@ -2339,11 +2466,11 @@ packages: license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 1485817 - timestamp: 1765256963205 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda - sha256: 9fb7f4ff219e3fb5decbd0ee90a950f4078c90a86f5d8d61ca608c913062f9b0 - md5: 265a9d03461da24884ecc8eb58396d57 + size: 1486341 + timestamp: 1771378148102 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda + sha256: 91033978ba25e6a60fb86843cf7e1f7dc8ad513f9689f991c9ddabfaf0361e7e + md5: c4a6f7989cffb0544bfd9207b6789971 depends: - libgcc >=15.2.0 constrains: @@ -2351,11 +2478,11 @@ packages: license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 598291 - timestamp: 1765258993165 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.3-h6548e54_0.conda - sha256: 82d6c2ee9f548c84220fb30fb1b231c64a53561d6e485447394f0a0eeeffe0e6 - md5: 034bea55a4feef51c98e8449938e9cee + size: 598634 + timestamp: 1771378886363 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + sha256: a27e44168a1240b15659888ce0d9b938ed4bdb49e9ea68a7c1ff27bcea8b55ce + md5: bb26456332b07f68bf3b7622ed71c0da depends: - __glibc >=2.17,<3.0.a0 - libffi >=3.5.2,<3.6.0a0 @@ -2364,14 +2491,14 @@ packages: - libzlib >=1.3.1,<2.0a0 - pcre2 >=10.47,<10.48.0a0 constrains: - - glib 2.86.3 *_0 + - glib 2.86.4 *_1 license: LGPL-2.1-or-later purls: [] - size: 3946542 - timestamp: 1765221858705 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.3-hf53f6bf_0.conda - sha256: 35f4262131e4d42514787fdc3d45c836e060e18fcb2441abd9dd8ecd386214f4 - md5: f226b9798c6c176d2a94eea1350b3b6b + size: 4398701 + timestamp: 1771863239578 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_1.conda + sha256: afc503dbd04a5bf2709aa9d8318a03a8c4edb389f661ff280c3494bfef4341ec + md5: 4ac4372fc4d7f20630a91314cdac8afd depends: - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 @@ -2379,29 +2506,29 @@ packages: - libzlib >=1.3.1,<2.0a0 - pcre2 >=10.47,<10.48.0a0 constrains: - - glib 2.86.3 *_0 + - glib 2.86.4 *_1 license: LGPL-2.1-or-later purls: [] - size: 4041779 - timestamp: 1765221790843 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda - sha256: 5b3e5e4e9270ecfcd48f47e3a68f037f5ab0f529ccb223e8e5d5ac75a58fc687 - md5: 26c46f90d0e727e95c6c9498a33a09f3 + size: 4512186 + timestamp: 1771863220969 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda + sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 + md5: 239c5e9546c38a1e884d69effcf4c882 depends: - __glibc >=2.17,<3.0.a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 603284 - timestamp: 1765256703881 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_16.conda - sha256: 0a9d77c920db691eb42b78c734d70c5a1d00b3110c0867cfff18e9dd69bc3c29 - md5: 4d2f224e8186e7881d53e3aead912f6c + size: 603262 + timestamp: 1771378117851 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda + sha256: fc716f11a6a8525e27a5d332ef6a689210b0d2a4dd1133edc0f530659aa9faa6 + md5: 4faa39bf919939602e594253bd673958 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 587924 - timestamp: 1765256821307 + size: 588060 + timestamp: 1771378040807 - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f md5: 915f5995e94f60e9a4826e0b0920ee88 @@ -2421,51 +2548,48 @@ packages: purls: [] size: 791226 timestamp: 1754910975665 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda - build_number: 5 - sha256: c723b6599fcd4c6c75dee728359ef418307280fa3e2ee376e14e85e5bbdda053 - md5: b38076eb5c8e40d0106beda6f95d7609 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda + build_number: 6 + sha256: 371f517eb7010b21c6cc882c7606daccebb943307cb9a3bf2c70456a5c024f7d + md5: 881d801569b201c2e753f03c84b85e15 depends: - - libblas 3.11.0 5_h4a7cf45_openblas + - libblas 3.11.0 6_h4a7cf45_openblas constrains: - - blas 2.305 openblas - - liblapacke 3.11.0 5*_openblas - - libcblas 3.11.0 5*_openblas + - blas 2.306 openblas + - liblapacke 3.11.0 6*_openblas + - libcblas 3.11.0 6*_openblas license: BSD-3-Clause - license_family: BSD purls: [] - size: 18200 - timestamp: 1765818857876 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-5_h88aeb00_openblas.conda - build_number: 5 - sha256: 692222d186d3ffbc99eaf04b5b20181fd26aee1edec1106435a0a755c57cce86 - md5: 88d1e4133d1182522b403e9ba7435f04 - depends: - - libblas 3.11.0 5_haddc8a3_openblas + size: 18624 + timestamp: 1774503065378 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-6_h88aeb00_openblas.conda + build_number: 6 + sha256: 67472a3cb761ff95527387ea0367883a22f9fbda1283b9880e5ad644fafd0735 + md5: e23a27b52fb320687239e2c5ae4d7540 + depends: + - libblas 3.11.0 6_haddc8a3_openblas constrains: - - liblapacke 3.11.0 5*_openblas - - blas 2.305 openblas - - libcblas 3.11.0 5*_openblas + - blas 2.306 openblas + - liblapacke 3.11.0 6*_openblas + - libcblas 3.11.0 6*_openblas license: BSD-3-Clause - license_family: BSD purls: [] - size: 18392 - timestamp: 1765818627104 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda - build_number: 5 - sha256: 735a6e6f7d7da6f718b6690b7c0a8ae4815afb89138aa5793abe78128e951dbb - md5: ca9d752201b7fa1225bca036ee300f2b - depends: - - libblas 3.11.0 5_h51639a9_openblas + size: 18702 + timestamp: 1774503068721 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-6_hd9741b5_openblas.conda + build_number: 6 + sha256: 21606b7346810559e259807497b86f438950cf19e71838e44ebaf4bd2b35b549 + md5: ee33d2d05a7c5ea1f67653b37eb74db1 + depends: + - libblas 3.11.0 6_h51639a9_openblas constrains: - - libcblas 3.11.0 5*_openblas - - blas 2.305 openblas - - liblapacke 3.11.0 5*_openblas + - liblapacke 3.11.0 6*_openblas + - libcblas 3.11.0 6*_openblas + - blas 2.306 openblas license: BSD-3-Clause - license_family: BSD purls: [] - size: 18551 - timestamp: 1765819121855 + size: 18863 + timestamp: 1774504467905 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb md5: c7c83eecbb72d88b940c249af56c8b17 @@ -2531,78 +2655,78 @@ packages: purls: [] size: 73690 timestamp: 1769482560514 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - sha256: 199d79c237afb0d4780ccd2fbf829cea80743df60df4705202558675e07dd2c5 - md5: be43915efc66345cccb3c310b6ed0374 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda + sha256: 6dc30b28f32737a1c52dada10c8f3a41bc9e021854215efca04a7f00487d09d9 + md5: 89d61bc91d3f39fda0ca10fcd3c68594 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 constrains: - - openblas >=0.3.30,<0.3.31.0a0 + - openblas >=0.3.32,<0.3.33.0a0 license: BSD-3-Clause - license_family: BSD purls: [] - size: 5927939 - timestamp: 1763114673331 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda - sha256: 794a7270ea049ec931537874cd8d2de0ef4b3cef71c055cfd8b4be6d2f4228b0 - md5: 11d7d57b7bdd01da745bbf2b67020b2e + size: 5928890 + timestamp: 1774471724897 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.32-pthreads_h9d3fd7e_0.conda + sha256: 51fcf5eb1fc43bfeca5bf3aa3f51546e92e5a92047ba47146dcea555142e30f8 + md5: 5d2ce5cf40443d055ec6d33840192265 depends: - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 constrains: - - openblas >=0.3.30,<0.3.31.0a0 + - openblas >=0.3.32,<0.3.33.0a0 license: BSD-3-Clause - license_family: BSD purls: [] - size: 4959359 - timestamp: 1763114173544 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda - sha256: ebbbc089b70bcde87c4121a083c724330f02a690fb9d7c6cd18c30f1b12504fa - md5: a6f6d3a31bb29e48d37ce65de54e2df0 + size: 5122134 + timestamp: 1774471612323 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.32-openmp_he657e61_0.conda + sha256: 713e453bde3531c22a660577e59bf91ef578dcdfd5edb1253a399fa23514949a + md5: 3a1111a4b6626abebe8b978bb5a323bf depends: - __osx >=11.0 - libgfortran - libgfortran5 >=14.3.0 - llvm-openmp >=19.1.7 constrains: - - openblas >=0.3.30,<0.3.31.0a0 + - openblas >=0.3.32,<0.3.33.0a0 license: BSD-3-Clause - license_family: BSD purls: [] - size: 4284132 - timestamp: 1768547079205 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2 - sha256: 53da0c8b79659df7b53eebdb80783503ce72fb4b10ed6e9e05cc0e9e4207a130 - md5: c3788462a6fbddafdb413a9f9053e58d + size: 4308797 + timestamp: 1774472508546 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda + sha256: 64e5c80cbce4680a2d25179949739a6def695d72c40ca28f010711764e372d97 + md5: 7af961ef4aa2c1136e11dd43ded245ab depends: - - libgcc-ng >=7.5.0 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 license: ISC purls: [] - size: 374999 - timestamp: 1605135674116 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.18-hb9de7d4_1.tar.bz2 - sha256: 9ee442d889242c633bc3ce3f50ae89e6d8ebf12e04d943c371c0a56913fa069b - md5: d09ab3c60eebb6f14eb4d07e172775cc + size: 277661 + timestamp: 1772479381288 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.21-h80f16a2_3.conda + sha256: d6112f3a7e7ffcd726ce653724f979b528cb8a19675fc06016a5d360ef94e9a4 + md5: 9e1fe4202543fa5b6ab58dbf12d34ced depends: - - libgcc-ng >=7.5.0 + - libgcc >=14 license: ISC purls: [] - size: 237003 - timestamp: 1605135724993 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.18-h27ca646_1.tar.bz2 - sha256: 1d95fe5e5e6a0700669aab454b2a32f97289c9ed8d1f7667c2ba98327a6f05bc - md5: 90859688dbca4735b74c02af14c4c793 + size: 272649 + timestamp: 1772479384085 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda + sha256: df603472ea1ebd8e7d4fb71e4360fe48d10b11c240df51c129de1da2ff9e8227 + md5: 7cc5247987e6d115134ebab15186bc13 + depends: + - __osx >=11.0 license: ISC purls: [] - size: 324912 - timestamp: 1605135878892 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda - sha256: 04596fcee262a870e4b7c9807224680ff48d4d0cc0dac076a602503d3dc6d217 - md5: da5be73701eecd0e8454423fd6ffcf30 + size: 248039 + timestamp: 1772479570912 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda + sha256: d716847b7deca293d2e49ed1c8ab9e4b9e04b9d780aea49a97c26925b28a7993 + md5: fd893f6a3002a635b5e50ceb9dd2c0f4 depends: - __glibc >=2.17,<3.0.a0 - icu >=78.2,<79.0a0 @@ -2610,75 +2734,55 @@ packages: - libzlib >=1.3.1,<2.0a0 license: blessing purls: [] - size: 942808 - timestamp: 1768147973361 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.2-h10b116e_0.conda - sha256: 5f8230ccaf9ffaab369adc894ef530699e96111dac0a8ff9b735a871f8ba8f8b - md5: 4e3ba0d5d192f99217b85f07a0761e64 + size: 951405 + timestamp: 1772818874251 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda + sha256: 1ddaf91b44fae83856276f4cb7ce544ffe41d4b55c1e346b504c6b45f19098d6 + md5: 77891484f18eca74b8ad83694da9815e depends: - icu >=78.2,<79.0a0 - libgcc >=14 - libzlib >=1.3.1,<2.0a0 license: blessing purls: [] - size: 944688 - timestamp: 1768147991301 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.2-h1ae2325_0.conda - sha256: 6e9b9f269732cbc4698c7984aa5b9682c168e2a8d1e0406e1ff10091ca046167 - md5: 4b0bf313c53c3e89692f020fb55d5f2c + size: 952296 + timestamp: 1772818881550 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.52.0-h1ae2325_0.conda + sha256: beb0fd5594d6d7c7cd42c992b6bb4d66cbb39d6c94a8234f15956da99a04306c + md5: f6233a3fddc35a2ec9f617f79d6f3d71 depends: - __osx >=11.0 - icu >=78.2,<79.0a0 - libzlib >=1.3.1,<2.0a0 license: blessing purls: [] - size: 909777 - timestamp: 1768148320535 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda - sha256: 813427918316a00c904723f1dfc3da1bbc1974c5cfe1ed1e704c6f4e0798cbc6 - md5: 68f68355000ec3f1d6f26ea13e8f525f + size: 918420 + timestamp: 1772819478684 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda + sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e + md5: 1b08cd684f34175e4514474793d44bcb depends: - __glibc >=2.17,<3.0.a0 - - libgcc 15.2.0 he0feb66_16 + - libgcc 15.2.0 he0feb66_18 constrains: - - libstdcxx-ng ==15.2.0=*_16 + - libstdcxx-ng ==15.2.0=*_18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 5856456 - timestamp: 1765256838573 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_16.conda - sha256: 4db11a903707068ae37aa6909511c68e9af6a2e97890d1b73b0a8d87cb74aba9 - md5: 52d9df8055af3f1665ba471cce77da48 + size: 5852330 + timestamp: 1771378262446 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda + sha256: 31fdb9ffafad106a213192d8319b9f810e05abca9c5436b60e507afb35a6bc40 + md5: f56573d05e3b735cb03efeb64a15f388 depends: - - libgcc 15.2.0 h8acb6b2_16 + - libgcc 15.2.0 h8acb6b2_18 constrains: - - libstdcxx-ng ==15.2.0=*_16 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 5541149 - timestamp: 1765256980783 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda - sha256: 81f2f246c7533b41c5e0c274172d607829019621c4a0823b5c0b4a8c7028ee84 - md5: 1b3152694d236cf233b76b8c56bf0eae - depends: - - libstdcxx 15.2.0 h934c35e_16 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 27300 - timestamp: 1765256885128 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_16.conda - sha256: dd5c813ae5a4dac6fa946352674e0c21b1847994a717ef67bd6cc77bc15920be - md5: 20b7f96f58ccbe8931c3a20778fb3b32 - depends: - - libstdcxx 15.2.0 hef695bb_16 + - libstdcxx-ng ==15.2.0=*_18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 27376 - timestamp: 1765257033344 + size: 5541411 + timestamp: 1771378162499 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee md5: db409b7c1720428638e7c0d509d3e1b5 @@ -2731,56 +2835,53 @@ packages: purls: [] size: 421195 timestamp: 1753948426421 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 - md5: edb0dca6bc32e4f4789199455a1dbeb8 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 + md5: d87ff7921124eccd67248aa483c23fec depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 constrains: - - zlib 1.3.1 *_2 + - zlib 1.3.2 *_2 license: Zlib license_family: Other purls: [] - size: 60963 - timestamp: 1727963148474 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 - md5: 08aad7cbe9f5a6b460d0976076b6ae64 - depends: - - libgcc >=13 + size: 63629 + timestamp: 1774072609062 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda + sha256: eb111e32e5a7313a5bf799c7fb2419051fa2fe7eff74769fac8d5a448b309f7f + md5: 502006882cf5461adced436e410046d1 constrains: - - zlib 1.3.1 *_2 + - zlib 1.3.2 *_2 license: Zlib license_family: Other purls: [] - size: 66657 - timestamp: 1727963199518 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b - md5: 369964e85dc26bfe78f41399b366c435 + size: 69833 + timestamp: 1774072605429 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + sha256: 361415a698514b19a852f5d1123c5da746d4642139904156ddfca7c922d23a05 + md5: bc5a5721b6439f2f62a84f2548136082 depends: - __osx >=11.0 constrains: - - zlib 1.3.1 *_2 + - zlib 1.3.2 *_2 license: Zlib license_family: Other purls: [] - size: 46438 - timestamp: 1727963202283 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda - sha256: 56bcd20a0a44ddd143b6ce605700fdf876bcf5c509adc50bf27e76673407a070 - md5: 206ad2df1b5550526e386087bef543c7 + size: 47759 + timestamp: 1774072956767 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.1-hc7d1edf_0.conda + sha256: c6f67e928f47603aca7e4b83632d8f3e82bd698051c7c0b34fcce3796eb9b63c + md5: 5a44f53783d87427790fc8692542f1bb depends: - __osx >=11.0 constrains: - - openmp 21.1.8|21.1.8.* - intel-openmp <0.0a0 + - openmp 22.1.1|22.1.1.* license: Apache-2.0 WITH LLVM-exception license_family: APACHE purls: [] - size: 285974 - timestamp: 1765964756583 + size: 285912 + timestamp: 1774349644882 - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e md5: 5b5203189eb668f042ac2b0826244964 @@ -2793,9 +2894,9 @@ packages: - pkg:pypi/markdown-it-py?source=hash-mapping size: 64736 timestamp: 1754951288511 -- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_0.conda - sha256: a530a411bdaaf0b1e4de8869dfaca46cb07407bc7dc0702a9e231b0e5ce7ca85 - md5: c14389156310b8ed3520d84f854be1ee +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_1.conda + sha256: 72ed7c0216541d65a17b171bf2eec4a3b81e9158d8ed48e59e1ecd3ae302d263 + md5: aeb9b9da79fd0258b3db091d1fefcd71 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -2807,11 +2908,11 @@ packages: license_family: BSD purls: - pkg:pypi/markupsafe?source=hash-mapping - size: 25909 - timestamp: 1759055357045 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py313hfa222a2_0.conda - sha256: c03eb8f5a4659ce31e698a328372f6b0357644d557ea0dc01fe0c5897c231c48 - md5: 59fc93a010d6e8a08a4fa32424d86a82 + size: 26100 + timestamp: 1772445154165 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py313hfa222a2_1.conda + sha256: e17b67ce69e04c9ac2b4d1e5458c924226cc8fba590f26c49983a2285879df56 + md5: ff5f5c0af92d01fff0aff006a8eb78a8 depends: - libgcc >=14 - python >=3.13,<3.14.0a0 @@ -2822,11 +2923,11 @@ packages: license_family: BSD purls: - pkg:pypi/markupsafe?source=hash-mapping - size: 26403 - timestamp: 1759056219797 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py313h7d74516_0.conda - sha256: e06902a1bf370fdd4ada0a8c81c504868fdb7e9971b72c6bd395aa4e5a497bd2 - md5: 3df5979cc0b761dda0053ffdb0bca3ea + size: 26561 + timestamp: 1772446359098 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py313h65a2061_1.conda + sha256: f62892a42948c61aa0a13d9a36ff811651f0a1102331223594aecf3cc042bece + md5: 0195d558b0c0ab8f4af3089af83067c5 depends: - __osx >=11.0 - python >=3.13,<3.14.0a0 @@ -2838,11 +2939,12 @@ packages: license_family: BSD purls: - pkg:pypi/markupsafe?source=hash-mapping - size: 25778 - timestamp: 1759055530601 -- conda: https://conda.modular.com/max/noarch/mblack-26.1.0-release.conda + size: 26009 + timestamp: 1772445537524 +- conda: https://conda.modular.com/max/noarch/mblack-26.2.0-release.conda noarch: python - sha256: 6ccec52fe7354f44be93a41a122d2214ecdb030e6362afe8e7876eab35472e62 + sha256: 3c2fceb89cefca899dcd7c8f26a6202acacb2a073e4cb2ef365514a465d01dcd + md5: dd13667299b9b66b8b314dc8d95b54a3 depends: - python >=3.10 - click >=8.0.0 @@ -2851,10 +2953,9 @@ packages: - pathspec >=0.9.0 - platformdirs >=2 - tomli >=1.1.0 - - python - license: MIT - size: 135743 - timestamp: 1769478151312 + license: LicenseRef-Modular-Proprietary + size: 133798 + timestamp: 1773780198354 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -2866,65 +2967,72 @@ packages: - pkg:pypi/mdurl?source=hash-mapping size: 14465 timestamp: 1733255681319 -- conda: https://conda.modular.com/max/linux-64/mojo-0.26.1.0-release.conda - sha256: e945e8fbff0fdd2064ea193b26fb4ba95ab782367cfd2a2c4522350066434494 +- conda: https://conda.modular.com/max/linux-64/mojo-0.26.2.0-release.conda + sha256: 4d7047466c13d92b1c8eb19c6d203a8503afbd2b1ad63eb5289a8f4bbf4d2945 + md5: 61318988733a695066b39704f6e08bd2 depends: - python >=3.10 - - mojo-compiler ==0.26.1.0 release - - mblack ==26.1.0 release + - mojo-compiler ==0.26.2.0 + - mblack ==26.2.0 - jupyter_client >=8.6.2,<8.7 license: LicenseRef-Modular-Proprietary - size: 89061870 - timestamp: 1769478151312 -- conda: https://conda.modular.com/max/linux-aarch64/mojo-0.26.1.0-release.conda - sha256: c005fee1f6973692f2902b425396eb54ab3fced145844b37757403b3a66ad977 + size: 89753715 + timestamp: 1773797215278 +- conda: https://conda.modular.com/max/linux-aarch64/mojo-0.26.2.0-release.conda + sha256: 12c7912b10e3eae7681c811bcffd50b3f5338affd334b944329e29ebb8aa5ea7 + md5: b8ae42f497c077d8473006280b4dcbfd depends: - python >=3.10 - - mojo-compiler ==0.26.1.0 release - - mblack ==26.1.0 release + - mojo-compiler ==0.26.2.0 + - mblack ==26.2.0 - jupyter_client >=8.6.2,<8.7 license: LicenseRef-Modular-Proprietary - size: 87625190 - timestamp: 1769478094501 -- conda: https://conda.modular.com/max/osx-arm64/mojo-0.26.1.0-release.conda - sha256: ba205a5bb4fafc47abee5db87fd58dee091b104d20651363f3dc1e6ca60e1d21 + size: 88482960 + timestamp: 1773797133971 +- conda: https://conda.modular.com/max/osx-arm64/mojo-0.26.2.0-release.conda + sha256: e35b8d34564b30189c5a985990466b4283f9e1d897baf23fe9ddbcbc9283459c + md5: 12e4d8397c451b7c8a55ff5a759ce00b depends: - python >=3.10 - - mojo-compiler ==0.26.1.0 release - - mblack ==26.1.0 release + - mojo-compiler ==0.26.2.0 + - mblack ==26.2.0 - jupyter_client >=8.6.2,<8.7 license: LicenseRef-Modular-Proprietary - size: 75217574 - timestamp: 1769480882531 -- conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.26.1.0-release.conda - sha256: aad6cf9e55824ada1147acaee8b37c68ef1973b208a4a4182f7ac85bc20e690c + size: 81534498 + timestamp: 1773797099755 +- conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.26.2.0-release.conda + sha256: e53f30d72a65e6b0a67745e6988f978d8f6ecc14531420631c9719eb9c7b9c2b + md5: e3a673daa0ddf3ca6af297daee4ceab5 depends: - - mojo-python ==0.26.1.0 release + - mojo-python ==0.26.2.0 license: LicenseRef-Modular-Proprietary - size: 85722183 - timestamp: 1769478151311 -- conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.26.1.0-release.conda - sha256: 5c1271c8bab4bafbc25053a2344b3a76b2b0cc0287999a7a43a2675db5f3a948 + size: 89091679 + timestamp: 1773797216619 +- conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.26.2.0-release.conda + sha256: 411c03f7c144546627935f9f9723f56000930cba15958863bbae7a9df00694a8 + md5: 875d529084aac8f9ac3d725bc28c5b5b depends: - - mojo-python ==0.26.1.0 release + - mojo-python ==0.26.2.0 license: LicenseRef-Modular-Proprietary - size: 83633893 - timestamp: 1769478094500 -- conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.26.1.0-release.conda - sha256: 335323a29c632adaf75958366a93352082f2e6a8bee43353269e86eefa86a2cf + size: 86460703 + timestamp: 1773797163008 +- conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.26.2.0-release.conda + sha256: e82cb7ce1a756876a233d364d5397adca5ad7e20fff5204c1c7e93aefe4549b5 + md5: 96e3ec50a2ea4abdb9fc4f3f89dc874b depends: - - mojo-python ==0.26.1.0 release + - mojo-python ==0.26.2.0 license: LicenseRef-Modular-Proprietary - size: 65952232 - timestamp: 1769480882531 -- conda: https://conda.modular.com/max/noarch/mojo-python-0.26.1.0-release.conda + size: 67499721 + timestamp: 1773797103208 +- conda: https://conda.modular.com/max/noarch/mojo-python-0.26.2.0-release.conda noarch: python - sha256: 9bccbc9045984961426038832c8657198f8ef238d95e00d9bdcff2dd139b7fdf + sha256: 2d9e350cfe7a0ae5d96dea13c082b09f21aac8ac4caa3e5def6b075930348fa1 + md5: 67a4fc0d47e84d3a91c4f12cc912c7ac depends: - - python + - python >=3.10 license: LicenseRef-Modular-Proprietary - size: 24169 - timestamp: 1769478151311 + size: 22936 + timestamp: 1773780198161 - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhcf101f3_1.conda sha256: 449609f0d250607a300754474350a3b61faf45da183d3071e9720e453c765b8a md5: 32f78e9d06e8593bc4bbf1338da06f5f @@ -3021,37 +3129,37 @@ packages: purls: [] size: 797030 timestamp: 1738196177597 -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.1-py313hf6604e3_0.conda - sha256: 4333872cc068f1ba559026ce805a25a91c2ae4e4f804691cf7fa0f43682e9b3a - md5: 7d51e3bef1a4b00bde1861d85ba2f874 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py313hf6604e3_0.conda + sha256: bcf75998ea3ae133df3580fb427d1054b006b093799430f499fd7ce8207d34c7 + md5: c4a9d2e77eb9fee983a70cf5f047c202 depends: - python - - libgcc >=14 - libstdcxx >=14 + - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - liblapack >=3.9.0,<4.0a0 - - libblas >=3.9.0,<4.0a0 - python_abi 3.13.* *_cp313 - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/numpy?source=compressed-mapping - size: 8854901 - timestamp: 1768085657805 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.1-py313h11e5ff7_0.conda - sha256: 7f31df32fa82a51c9274a381b6c8c77eaec07daf2a812b6e9c1444b86ab3d699 - md5: 55c6ff5b0ce94eec9869e268ea6f640f + size: 8857056 + timestamp: 1773839226294 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.3-py313h11e5ff7_0.conda + sha256: 35a3ea7b8d2963920ef45acecf983c24c165e32d8592bac8728515d741e7af44 + md5: b9bfd5cc1515f36131b1aa087a24e574 depends: - python - - python 3.13.* *_cp313 - - libstdcxx >=14 - libgcc >=14 + - libstdcxx >=14 + - python 3.13.* *_cp313 - liblapack >=3.9.0,<4.0a0 - - python_abi 3.13.* *_cp313 - libcblas >=3.9.0,<4.0a0 + - python_abi 3.13.* *_cp313 - libblas >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 @@ -3059,28 +3167,28 @@ packages: license_family: BSD purls: - pkg:pypi/numpy?source=hash-mapping - size: 7929057 - timestamp: 1768085735194 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.1-py313h16eae64_0.conda - sha256: 409a1f254ff025f0567d3444f2a82cd65c10d403f27a66f219f51a082b2a7699 - md5: 527abeb3c3f65345d9c337fb49e32d51 + size: 7930822 + timestamp: 1773839278435 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py313he4a34aa_0.conda + sha256: d55c3f4b13486bf8e3cadaf731a5d9b67aa9deb51f7c30e381b948a9ada20ef0 + md5: 03b99caf1270c27febfcceb4f1090af7 depends: - python + - python 3.13.* *_cp313 - __osx >=11.0 - libcxx >=19 - - python 3.13.* *_cp313 - - libcblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 - - python_abi 3.13.* *_cp313 - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - python_abi 3.13.* *_cp313 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/numpy?source=compressed-mapping - size: 6925404 - timestamp: 1768085588288 + size: 6924384 + timestamp: 1773839167287 - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c md5: f61eb8cd60ff9057122a3d338b99c00f @@ -3135,7 +3243,7 @@ packages: license: MPL-2.0 license_family: MOZILLA purls: - - pkg:pypi/pathspec?source=compressed-mapping + - pkg:pypi/pathspec?source=hash-mapping size: 53739 timestamp: 1769677743677 - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda @@ -3185,18 +3293,18 @@ packages: - pkg:pypi/pkginfo?source=hash-mapping size: 30536 timestamp: 1739984682585 -- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - sha256: 04c64fb78c520e5c396b6e07bc9082735a5cc28175dbe23138201d0a9441800b - md5: 1bd2e65c8c7ef24f4639ae6e850dacc2 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda + sha256: 0289f0a38337ee201d984f8f31f11f6ef076cfbbfd0ab9181d12d9d1d099bf46 + md5: 82c1787f2a65c0155ef9652466ee98d6 depends: - python >=3.10 - python license: MIT license_family: MIT purls: - - pkg:pypi/platformdirs?source=hash-mapping - size: 23922 - timestamp: 1764950726246 + - pkg:pypi/platformdirs?source=compressed-mapping + size: 25646 + timestamp: 1773199142345 - conda: https://conda.anaconda.org/conda-forge/noarch/poetry-1.8.5-pyh534df25_0.conda sha256: c5ab8a98f25d6416ef40761db1d8f5cea3ea67a28051d3d17829347c63dede67 md5: 669f9224d31f304bc632f346734d987a @@ -3384,29 +3492,30 @@ packages: - pkg:pypi/pydantic-core?source=hash-mapping size: 1778337 timestamp: 1762989007829 -- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-extra-types-2.11.0-pyhd8ed1ab_0.conda - sha256: e984052b8922b8996add05d595b68430e4f28b7d93846693b2729dc1e0504685 - md5: b74145c95d910d3dd4195cf7d7567c35 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-extra-types-2.11.1-pyhcf101f3_0.conda + sha256: 385a900cf5d1d39dafab6088537c58a32d572fd237d7c4598def92c4c1120cb8 + md5: 96513760035d70917819a2840155d23a depends: - - pydantic >=2.5.2 - python >=3.10 + - pydantic >=2.5.2 + - python constrains: - - python-ulid >=1,<3 - phonenumbers >=8,<9 - - pytz >=2024.1 - pycountry >=23 - - tzdata >=2024a - - pendulum >=3.0.0,<4.0.0 - semver >=3.0.2,<4 + - python-ulid >=1,<4 + - pendulum >=3.0.0,<4.0.0 + - pytz >=2024.1 + - tzdata >=2024a license: MIT license_family: MIT purls: - pkg:pypi/pydantic-extra-types?source=compressed-mapping - size: 64099 - timestamp: 1767221123687 -- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.12.0-pyh3cfb1c2_0.conda - sha256: 17d552dd19501909d626ff50cd23753d56e03ab670ce9096f1c4068e1eb90f2a - md5: 0a3042ce18b785982c64a8567cc3e512 + size: 72040 + timestamp: 1773664659868 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.13.1-pyhd8ed1ab_0.conda + sha256: 343988d65c08477a87268d4fbeba59d0295514143965d2755ac4519b73155479 + md5: cc0da73801948100ae97383b8da12993 depends: - pydantic >=2.7.0 - python >=3.10 @@ -3416,8 +3525,8 @@ packages: license_family: MIT purls: - pkg:pypi/pydantic-settings?source=hash-mapping - size: 43752 - timestamp: 1762786342653 + size: 49319 + timestamp: 1771527313149 - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a md5: 6b6ece66ebcae2d5f326c77ef2c5a066 @@ -3453,10 +3562,10 @@ packages: - pkg:pypi/pysocks?source=hash-mapping size: 21085 timestamp: 1733217331982 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.11-hc97d973_101_cp313.conda - build_number: 101 - sha256: c9625638f32f4ee27a506e8cefc56a78110c4c54867663f56d91dc721df9dc7f - md5: aa23b675b860f2566af2dfb3ffdf3b8c +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda + build_number: 100 + sha256: 8a08fe5b7cb5a28aa44e2994d18dbf77f443956990753a4ca8173153ffb6eb56 + md5: 4c875ed0e78c2d407ec55eadffb8cf3d depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 @@ -3470,20 +3579,20 @@ packages: - libuuid >=2.41.3,<3.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 - python_abi 3.13.* *_cp313 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata license: Python-2.0 purls: [] - size: 37170676 - timestamp: 1769473304794 + size: 37364553 + timestamp: 1770272309861 python_site_packages_path: lib/python3.13/site-packages -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.11-h4c0d347_101_cp313.conda - build_number: 101 - sha256: f702bf51730c4c2235fb36e52937da11385e801558db9beb8b4fbcf9be21eec1 - md5: 6299d23cea618a9ac10bbc126d8d04f5 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.12-h4c0d347_100_cp313.conda + build_number: 100 + sha256: a6bdf48a245d70526b4e6a277a4b344ec3f7c787b358e5377d544ac9a303c111 + md5: 732a86d6786402b95e1dc68c32022500 depends: - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-aarch64 >=2.36.1 @@ -3496,20 +3605,20 @@ packages: - libuuid >=2.41.3,<3.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 - python_abi 3.13.* *_cp313 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata license: Python-2.0 purls: [] - size: 33898728 - timestamp: 1769471851659 + size: 33986700 + timestamp: 1770270924894 python_site_packages_path: lib/python3.13/site-packages -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.11-hfc2f54d_101_cp313.conda - build_number: 101 - sha256: 8565d451dff3cda5e55fabdbae2751033c2b08b3fd3833526f8dbf3c08bcb3cf - md5: 8f2ac152fe98c22af0f4b479cf11c845 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.12-h20e6be0_100_cp313.conda + build_number: 100 + sha256: 9a4f16a64def0853f0a7b6a7beb40d498fd6b09bee10b90c3d6069b664156817 + md5: 179c0f5ae4f22bc3be567298ed0b17b9 depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 @@ -3520,34 +3629,34 @@ packages: - libsqlite >=3.51.2,<4.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 - python_abi 3.13.* *_cp313 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata license: Python-2.0 purls: [] - size: 12806076 - timestamp: 1769472806227 + size: 12770674 + timestamp: 1770272314517 python_site_packages_path: lib/python3.13/site-packages -- conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.0-pyh332efcf_0.conda - sha256: 195e483a12bcec40b817f4001d4d4b8ea1cb2de66a62aeabfff6e32e29b3f407 - md5: dbbb75958b0b03842dcf9be2f200fc10 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.2-pyhc364b38_1.conda + sha256: 3f76a55e524728cd4092d78dd01107c8c3e91a66842317b49c7c8209a332c4f1 + md5: 09971b38d49f16c47a8769aeb171ef3d depends: + - python >=3.9 - colorama - importlib-metadata >=4.6 - - packaging >=19.0 + - packaging >=24.0 - pyproject_hooks - - python >=3.10 - tomli >=1.1.0 + - python constrains: - build <0 license: MIT - license_family: MIT purls: - pkg:pypi/build?source=hash-mapping - size: 26687 - timestamp: 1767988747352 + size: 28291 + timestamp: 1774469084833 - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 md5: 5b8d21249ff20967101ffa321cab24e8 @@ -3561,18 +3670,17 @@ packages: - pkg:pypi/python-dateutil?source=hash-mapping size: 233310 timestamp: 1751104122689 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.1-pyhcf101f3_0.conda - sha256: aa98e0b1f5472161318f93224f1cfec1355ff69d2f79f896c0b9e033e4a6caf9 - md5: 083725d6cd3dc007f06d04bcf1e613a2 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda + sha256: 74e417a768f59f02a242c25e7db0aa796627b5bc8c818863b57786072aeb85e5 + md5: 130584ad9f3a513cdd71b1fdc1244e9c depends: - python >=3.10 - - python license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/python-dotenv?source=hash-mapping - size: 26922 - timestamp: 1761503229008 + - pkg:pypi/python-dotenv?source=compressed-mapping + size: 27848 + timestamp: 1772388605021 - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda sha256: df9aa74e9e28e8d1309274648aac08ec447a92512c33f61a8de0afa9ce32ebe8 md5: 23029aae904a2ba587daba708208012f @@ -3585,16 +3693,16 @@ packages: - pkg:pypi/fastjsonschema?source=hash-mapping size: 244628 timestamp: 1755304154927 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.11-h4df99d1_101.conda - sha256: c17676be5479d9032b54fea09024fc2cdeb689639070b25fa9bd85b32c531a7a - md5: 4af7a72062bddcb57dea6b236e1b245e +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda + sha256: f306304235197434494355351ac56020a65b7c5c56ff10ca1ed53356d575557a + md5: 3d92938d5b83c49162ade038aab58a59 depends: - - cpython 3.13.11.* + - cpython 3.13.12.* - python_abi * *_cp313 license: Python-2.0 purls: [] - size: 48231 - timestamp: 1769471383908 + size: 48618 + timestamp: 1770270436560 - conda: https://conda.anaconda.org/conda-forge/noarch/python-installer-0.7.0-pyhff2d567_1.conda sha256: f1fc3e9561b6d3bee2f738f5b1818b51124f45a2b28b3bf6c2174d629276e069 md5: e27480eebcdf247209e90da706ebef8d @@ -3629,9 +3737,9 @@ packages: purls: [] size: 7002 timestamp: 1752805902938 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda - sha256: 40dcd6718dce5fbee8aabdd0519f23d456d8feb2e15ac352eaa88bbfd3a881af - md5: 4794ea0adaebd9f844414e594b142cb2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda + sha256: ef7df29b38ef04ec67a8888a4aa039973eaa377e8c4b59a7be0a1c50cd7e4ac6 + md5: f256753e840c3cd3766488c9437a8f8b depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -3641,12 +3749,12 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pyyaml?source=hash-mapping - size: 207109 - timestamp: 1758892173548 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_0.conda - sha256: 4aca079224068d1a7fa2d2cbdb6efe11eec76737472c01f02d9e147c5237c37d - md5: cd0891668088a005cb45b344d84a3955 + - pkg:pypi/pyyaml?source=compressed-mapping + size: 201616 + timestamp: 1770223543730 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_1.conda + sha256: 9dbfdb53af5d27ac2eec5db4995979fdaaea76766d4f01cd3524dd7d24f79fb9 + md5: 14b86e046b0c5c5508602165287dd01c depends: - libgcc >=14 - python >=3.13,<3.14.0a0 @@ -3657,11 +3765,11 @@ packages: license_family: MIT purls: - pkg:pypi/pyyaml?source=hash-mapping - size: 198001 - timestamp: 1758891959168 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda - sha256: f5be0d84f72a567b7333b9efa74a65bfa44a25658cf107ffa3fc65d3ae6660d7 - md5: 0e8e3235217b4483a7461b63dca5826b + size: 194182 + timestamp: 1770223431084 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h65a2061_1.conda + sha256: 950725516f67c9691d81bb8dde8419581c5332c5da3da10c9ba8cbb1698b825d + md5: 5d0c8b92128c93027632ca8f8dc1190f depends: - __osx >=11.0 - python >=3.13,<3.14.0a0 @@ -3672,30 +3780,30 @@ packages: license_family: MIT purls: - pkg:pypi/pyyaml?source=hash-mapping - size: 191630 - timestamp: 1758892258120 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda + size: 188763 + timestamp: 1770224094408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda noarch: python - sha256: a00a41b66c12d9c60e66b391e9a4832b7e28743348cf4b48b410b91927cd7819 - md5: 3399d43f564c905250c1aea268ebb935 + sha256: be66c1f85c3b48137200d62c12d918f4f8ad329423daef04fed292818efd3c28 + md5: 082985717303dab433c976986c674b35 depends: - python - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - libgcc >=14 + - libstdcxx >=14 + - __glibc >=2.17,<3.0.a0 + - zeromq >=4.3.5,<4.4.0a0 - _python_abi3_support 1.* - cpython >=3.12 - - zeromq >=4.3.5,<4.4.0a0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pyzmq?source=hash-mapping - size: 212218 - timestamp: 1757387023399 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312h4552c38_0.conda + size: 211567 + timestamp: 1771716961404 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-27.1.0-py312hdf0a211_2.conda noarch: python - sha256: 54e4ce37719ae513c199b8ab06ca89f8c4a0945b0c51d60ec952f5866ae1687e - md5: c9aadf2edd39b56ad34dc5f775626d5b + sha256: afdff66cb54e22d0d2c682731e08bb8f319dfd93f3cdcff4a4640cb5a8ae2460 + md5: 130d781798bb24a0b86290e65acd50d8 depends: - python - libstdcxx >=14 @@ -3707,16 +3815,16 @@ packages: license_family: BSD purls: - pkg:pypi/pyzmq?source=hash-mapping - size: 213723 - timestamp: 1757387032833 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312hd65ceae_0.conda + size: 212585 + timestamp: 1771716963309 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_2.conda noarch: python - sha256: ef33812c71eccf62ea171906c3e7fc1c8921f31e9cc1fbc3f079f3f074702061 - md5: bbd22b0f0454a5972f68a5f200643050 + sha256: 2f31f799a46ed75518fae0be75ecc8a1b84360dbfd55096bc2fe8bd9c797e772 + md5: 2f6b79700452ef1e91f45a99ab8ffe5a depends: - python - - __osx >=11.0 - libcxx >=19 + - __osx >=11.0 - _python_abi3_support 1.* - cpython >=3.12 - zeromq >=4.3.5,<4.4.0a0 @@ -3724,8 +3832,8 @@ packages: license_family: BSD purls: - pkg:pypi/pyzmq?source=hash-mapping - size: 191115 - timestamp: 1757387128258 + size: 191641 + timestamp: 1771717073430 - conda: https://conda.anaconda.org/conda-forge/linux-64/rapidfuzz-3.14.3-py313h7033f15_1.conda sha256: 010b7b1a9d05583c9a5e025247308c2fdb990f413367fc1414846d94b630e553 md5: 87ec3a86d3c910b1d64ec7116e156d40 @@ -3808,24 +3916,23 @@ packages: purls: [] size: 313930 timestamp: 1765813902568 -- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - sha256: 7813c38b79ae549504b2c57b3f33394cea4f2ad083f0994d2045c2e24cb538c5 - md5: c65df89a0b2e321045a9e01d1337b182 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.0-pyhcf101f3_0.conda + sha256: fbc7183778e1f9976ae7d812986c227f9d43f841326ac03b5f43f1ac93fa8f3b + md5: bee5ed456361bfe8af502beaf5db82e2 depends: - python >=3.10 - - certifi >=2017.4.17 + - certifi >=2023.5.7 - charset-normalizer >=2,<4 - idna >=2.5,<4 - - urllib3 >=1.21.1,<3 + - urllib3 >=1.26,<3 - python constrains: - chardet >=3.0.2,<6 license: Apache-2.0 - license_family: APACHE purls: - pkg:pypi/requests?source=compressed-mapping - size: 63602 - timestamp: 1766926974520 + size: 63788 + timestamp: 1774462091279 - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda sha256: c0b815e72bb3f08b67d60d5e02251bbb0164905b5f72942ff5b6d2a339640630 md5: 66de8645e324fda0ea6ef28c2f99a2ab @@ -3838,9 +3945,9 @@ packages: - pkg:pypi/requests-toolbelt?source=hash-mapping size: 44285 timestamp: 1733734886897 -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.1-pyhcf101f3_0.conda - sha256: 8d9c9c52bb4d3684d467a6e31814d8c9fccdacc8c50eb1e3e5025e88d6d57cb4 - md5: 83d94f410444da5e2f96e5742b7a4973 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda + sha256: b06ce84d6a10c266811a7d3adbfa1c11f13393b91cc6f8a5b468277d90be9590 + md5: 7a6289c50631d620652f5045a63eb573 depends: - markdown-it-py >=2.2.0 - pygments >=2.13.0,<3.0.0 @@ -3851,11 +3958,11 @@ packages: license_family: MIT purls: - pkg:pypi/rich?source=compressed-mapping - size: 208244 - timestamp: 1769302653091 -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.17.2-pyhcf101f3_0.conda - sha256: f554f07756524948d85399403e7fd6da90e872f7d6760f124c6e62225aabdb57 - md5: 088fca8d836cc7cbefeaed39064aac4f + size: 208472 + timestamp: 1771572730357 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.19.7-pyhcf101f3_0.conda + sha256: 9cf3b9a083ebdee70ef5a48fbe409d91d2a8c4eed3c581a7b33b4d5ca7c813be + md5: 8b1a4d854f9a4ea1e4abc93ccab0ded9 depends: - python >=3.10 - rich >=13.7.1 @@ -3865,9 +3972,9 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/rich-toolkit?source=compressed-mapping - size: 31488 - timestamp: 1769737531318 + - pkg:pypi/rich-toolkit?source=hash-mapping + size: 32484 + timestamp: 1771977622605 - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.1-py313h78bf25f_0.conda sha256: 43ea89b53cbede879e57ac9dd20153c5cd2bb9575228e7faf5a8764aa6c201b7 md5: 013a7d73eaef154f0dc5e415ffa8ff87 @@ -3921,24 +4028,27 @@ packages: - pkg:pypi/six?source=hash-mapping size: 18455 timestamp: 1753199211006 -- conda: https://repo.prefix.dev/mojo-community/linux-64/small_time-26.1.0-hb0f4dca_0.conda - sha256: 5151a9d2519c977783e16534ae83020cffa9faf673e19ff8ad6452b204e06bca - depends: - - mojo-compiler >=0.26.1.0,<0.26.2.0 - size: 1353910 - timestamp: 1769803061847 -- conda: https://repo.prefix.dev/mojo-community/linux-aarch64/small_time-26.1.0-he8cfe8b_0.conda - sha256: 606c115b3635005abeed7316353f48e4356e30930776593f7a291d00de44c9e5 - depends: - - mojo-compiler >=0.26.1.0,<0.26.2.0 - size: 1352700 - timestamp: 1769803067312 -- conda: https://repo.prefix.dev/mojo-community/osx-arm64/small_time-26.1.0-h60d57d3_0.conda - sha256: acf22a5360837bb01c60398fda7d9c2e69e5288877c0727b2da711442d5a52ae - depends: - - mojo-compiler >=0.26.1.0,<0.26.2.0 - size: 1353357 - timestamp: 1769803155962 +- conda: https://repo.prefix.dev/mojo-community/linux-64/small_time-26.2.0-hb0f4dca_0.conda + sha256: 64a5d6ae8adb01afa41234094401dcd7c65d55866594801643d73f4135528d59 + md5: 1a8a43216fa2529565c3490e2e60e8fb + depends: + - mojo-compiler >=0.26.2.0,<0.26.3.0 + size: 1449284 + timestamp: 1774654897636 +- conda: https://repo.prefix.dev/mojo-community/linux-aarch64/small_time-26.2.0-he8cfe8b_0.conda + sha256: bb846d95be9fddebc2d1d9e4deb03f570d2c7607fe3de3c07e84955f4121e179 + md5: 75825d50cb9c4b063785ee0fc0599db1 + depends: + - mojo-compiler >=0.26.2.0,<0.26.3.0 + size: 1449288 + timestamp: 1774654907863 +- conda: https://repo.prefix.dev/mojo-community/osx-arm64/small_time-26.2.0-h60d57d3_0.conda + sha256: 06ceb84bc03ab9c99f2a96183f5dc222c52fc64769bee7a06eca240a897a5ea1 + md5: efca4a5328269879a92bfb6dfe2541fa + depends: + - mojo-compiler >=0.26.2.0,<0.26.3.0 + size: 1449709 + timestamp: 1774654896487 - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda sha256: dce518f45e24cd03f401cb0616917773159a210c19d601c5f2d4e0e5879d30ad md5: 03fe290994c5e4ec17293cfb6bdce520 @@ -3947,7 +4057,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/sniffio?source=compressed-mapping + - pkg:pypi/sniffio?source=hash-mapping size: 15698 timestamp: 1762941572482 - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.50.0-pyhfdc7a7d_0.conda @@ -4002,18 +4112,17 @@ packages: purls: [] size: 3127137 timestamp: 1769460817696 -- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - sha256: 62940c563de45790ba0f076b9f2085a842a65662268b02dd136a8e9b1eaf47a8 - md5: 72e780e9aa2d0a3295f59b1874e3768b +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + sha256: 91cafdb64268e43e0e10d30bd1bef5af392e69f00edd34dfaf909f69ab2da6bd + md5: b5325cf06a000c5b14970462ff5e4d58 depends: - python >=3.10 - python license: MIT - license_family: MIT purls: - - pkg:pypi/tomli?source=compressed-mapping - size: 21453 - timestamp: 1768146676791 + - pkg:pypi/tomli?source=hash-mapping + size: 21561 + timestamp: 1774492402955 - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.14.0-pyha770c72_0.conda sha256: b35082091c8efd084e51bc3a4a2d3b07897eff232aaf58cbc0f959b6291a6a93 md5: 385dca77a8b0ec6fa9b92cb62d09b43b @@ -4022,12 +4131,12 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/tomlkit?source=compressed-mapping + - pkg:pypi/tomlkit?source=hash-mapping size: 39224 timestamp: 1768476626454 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py313h07c4f96_0.conda - sha256: 6006d4e5a6ff99be052c939e43adee844a38f2dc148f44a7c11aa0011fd3d811 - md5: 82da2dcf1ea3e298f2557b50459809e0 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py313h07c4f96_0.conda + sha256: 9e8497e1ecca77d03c6be2d3b5f901dfe0ab99686af4fb94ab418b7d449ac547 + md5: 6c0b0ae017b5bfd9c8d718217efd8f14 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -4036,12 +4145,12 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado?source=hash-mapping - size: 878109 - timestamp: 1765458900582 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.3-py313he149459_0.conda - sha256: 06e69d338c1724a1340dc374c758fb75c36b069caa5a1994fbf461ae2d42e4fd - md5: 236667bf319279d8d0a9581ebb4337f0 + - pkg:pypi/tornado?source=compressed-mapping + size: 882996 + timestamp: 1774358035145 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.5-py313he149459_0.conda + sha256: a7e81ec39fdbf383eae736e90b14c2ca8c4135898d8591e38e548199e1e8cd0d + md5: 72cdaf3d2963ec20c0b54154fe871985 depends: - libgcc >=14 - python >=3.13,<3.14.0a0 @@ -4049,12 +4158,12 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado?source=hash-mapping - size: 879449 - timestamp: 1765460007029 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py313h6535dbc_0.conda - sha256: a8130a361b7bc21190836ba8889276cc263fcb09f52bf22efcaed1de98179948 - md5: 67a85c1b5c17124eaf9194206afd5159 + - pkg:pypi/tornado?source=compressed-mapping + size: 883411 + timestamp: 1774359392374 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.5-py313h0997733_0.conda + sha256: c5b0ee042d8a0b88a3823226dc95b794c042c498aee330aa9b4d78bfad01d099 + md5: 303333dd882dfeb303cc8bfac178464b depends: - __osx >=11.0 - python >=3.13,<3.14.0a0 @@ -4064,8 +4173,8 @@ packages: license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping - size: 877647 - timestamp: 1765836696426 + size: 883472 + timestamp: 1774358832451 - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 md5: 019a7385be9af33791c989871317e1ed @@ -4085,52 +4194,25 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/trove-classifiers?source=compressed-mapping + - pkg:pypi/trove-classifiers?source=hash-mapping size: 19707 timestamp: 1768550221435 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.21.1-pyhf8876ea_0.conda - sha256: 62b359b76ae700ef4a4f074a196bc8953f2188a2784222029d0b3d19cdea59f9 - md5: 7f66f45c1bb6eb774abf6d2f02ccae9d +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.24.0-pyhcf101f3_0.conda + sha256: e1116d08e6a55b2b42a090130c268f75211ad8e6a8e7749e977924de3864d487 + md5: 10870929f587540c5802cd9b071cba5c depends: - - typer-slim-standard ==0.21.1 h378290b_0 + - annotated-doc >=0.0.2 + - click >=8.2.1 - python >=3.10 + - rich >=12.3.0 + - shellingham >=1.3.0 - python license: MIT license_family: MIT purls: - pkg:pypi/typer?source=hash-mapping - size: 82073 - timestamp: 1767711188310 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.21.1-pyhcf101f3_0.conda - sha256: 9ef3c1b5ea2b355904b94323fc3fc95a37584ef09c6c86aafe472da156aa4d70 - md5: 3f64f1c7f9a23bead591884648949622 - depends: - - python >=3.10 - - click >=8.0.0 - - typing_extensions >=3.7.4.3 - - python - constrains: - - typer 0.21.1.* - - rich >=10.11.0 - - shellingham >=1.3.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/typer-slim?source=compressed-mapping - size: 48131 - timestamp: 1767711188309 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.21.1-h378290b_0.conda - sha256: 6a300a4e8d1e30b7926a966e805201ec08d4a5ab97c03a7d0f927996413249d7 - md5: f08a1f489c4d07cfd4a9983963073480 - depends: - - typer-slim ==0.21.1 pyhcf101f3_0 - - rich - - shellingham - license: MIT - license_family: MIT - purls: [] - size: 5322 - timestamp: 1767711188310 + size: 117860 + timestamp: 1771292312899 - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c md5: edd329d7d3a4ab45dcf905899a7a6115 @@ -4150,7 +4232,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/typing-inspection?source=compressed-mapping + - pkg:pypi/typing-inspection?source=hash-mapping size: 18923 timestamp: 1764158430324 - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -4187,9 +4269,9 @@ packages: - pkg:pypi/urllib3?source=hash-mapping size: 103172 timestamp: 1767817860341 -- conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.40.0-pyhc90fa1f_0.conda - sha256: 9cb6777bc67d43184807f8c57bdf8c917830240dd95e66fa9dbb7d65fa81f68e - md5: eb8fdfa0a193cfe804970d1a5470246d +- conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.42.0-pyhc90fa1f_0.conda + sha256: f6522b921e7434775cd283c9b2382e5344db226e58bd36b294a1553700d0d1f9 + md5: c6ad593e48d81ab822b7ac6b9b054a0d depends: - __unix - click >=7.0 @@ -4200,26 +4282,26 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/uvicorn?source=hash-mapping - size: 54972 - timestamp: 1766332899903 -- conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.40.0-h4cd5af1_0.conda - sha256: 0476363e52d50f7c6075d06f309a54a9dc9b8828c00b4ed572b78d5f1374fccb - md5: 8c7fcf5c22f9342caf554be590f6fee9 + - pkg:pypi/uvicorn?source=compressed-mapping + size: 54908 + timestamp: 1773659868807 +- conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.42.0-h76e4700_0.conda + sha256: 98f2619d66c477745272b8ec10dd4737055848372a007af3228bb9fb1547e894 + md5: 6eb0881849490cee741779c698f68d45 depends: - __unix - - uvicorn ==0.40.0 pyhc90fa1f_0 + - uvicorn ==0.42.0 pyhc90fa1f_0 - websockets >=10.4 - httptools >=0.6.3 - - watchfiles >=0.13 + - watchfiles >=0.20 - python-dotenv >=0.13 - pyyaml >=5.1 - - uvloop >=0.14.0,!=0.15.0,!=0.15.1 + - uvloop >=0.15.1 license: BSD-3-Clause license_family: BSD purls: [] - size: 4119 - timestamp: 1766332899904 + size: 4141 + timestamp: 1773659868807 - conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.22.1-py313h07c4f96_1.conda sha256: 77a220ecf6c1467f94d6adda5fb1296f558f3f3044842dc0a52881eab5908dc0 md5: 266caaa8701a13482ea924a77897b1e4 @@ -4262,21 +4344,23 @@ packages: - pkg:pypi/uvloop?source=hash-mapping size: 487912 timestamp: 1762473054199 -- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.1-pyhd8ed1ab_0.conda - sha256: fa0a21fdcd0a8e6cf64cc8cd349ed6ceb373f09854fd3c4365f0bc4586dccf9a - md5: 6b0259cea8ffa6b66b35bae0ca01c447 +- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.39.0-pyhcf101f3_0.conda + sha256: de93eed364f14f08f78ff41994dfe22ff018521c4702e432630d10c0eb0eff6b + md5: e73db224203e56b25e040446fa1584db depends: + - python >=3.10 - distlib >=0.3.7,<1 - - filelock >=3.20.1,<4 - platformdirs >=3.9.1,<5 - - python >=3.10 - typing_extensions >=4.13.2 + - importlib-metadata >=6.6 + - filelock >=3.24.2,<4 + - python license: MIT license_family: MIT purls: - pkg:pypi/virtualenv?source=hash-mapping - size: 4404318 - timestamp: 1768069793682 + size: 4657721 + timestamp: 1771967166128 - conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.1.1-py313h5c7d99a_0.conda sha256: 11a07764137af9bcf29e9e26671c1be1ea1302f7dd7075a4d41481489883eaff md5: 9373034735566df29779429f0c0de511 @@ -4367,7 +4451,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/websockets?source=compressed-mapping + - pkg:pypi/websockets?source=hash-mapping size: 371508 timestamp: 1768087394531 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xattr-1.3.0-py313h41b806d_1.conda @@ -4416,41 +4500,46 @@ packages: purls: [] size: 83386 timestamp: 1753484079473 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h59595ed_1.conda - sha256: 3bec658f5c23abf5e200d98418add7a20ff7b45c928ad4560525bef899496256 - md5: 7fc9d3288d2420bb3637647621018000 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda + sha256: 325d370b28e2b9cc1f765c5b4cdb394c91a5d958fbd15da1a14607a28fee09f6 + md5: 755b096086851e1193f3b10347415d7c depends: - - libgcc-ng >=12 - - libsodium >=1.0.18,<1.0.19.0a0 - - libstdcxx-ng >=12 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - krb5 >=1.22.2,<1.23.0a0 + - libsodium >=1.0.21,<1.0.22.0a0 license: MPL-2.0 license_family: MOZILLA purls: [] - size: 343438 - timestamp: 1709135220800 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h2f0025b_1.conda - sha256: 8591087451100ed4a71d2025d0e3d0d24c213a13e017bbc41741c642012742cf - md5: 2788863355609f0de396ac6e9c6b59f7 - depends: - - libgcc-ng >=12 - - libsodium >=1.0.18,<1.0.19.0a0 - - libstdcxx-ng >=12 + size: 311150 + timestamp: 1772476812121 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hc0523f8_10.conda + sha256: 32f77d565687a8241ebfb66fe630dcb197efc84f6a8b59df8260b1191b7deb2c + md5: ac79d51c73c8fbe6ef6e9067191b7f1a + depends: + - libgcc >=14 + - libstdcxx >=14 + - libsodium >=1.0.21,<1.0.22.0a0 + - krb5 >=1.22.2,<1.23.0a0 license: MPL-2.0 license_family: MOZILLA purls: [] - size: 374640 - timestamp: 1709141219352 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hebf3989_1.conda - sha256: caf6df12d793600faec21b7e6025e2e8fb8de26672cce499f9471b99b6776eb1 - md5: 19cff1c627ff58429701113bf35300c8 - depends: - - libcxx >=16 - - libsodium >=1.0.18,<1.0.19.0a0 + size: 350773 + timestamp: 1772476818466 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda + sha256: 2705360c72d4db8de34291493379ffd13b09fd594d0af20c9eefa8a3f060d868 + md5: e85dcd3bde2b10081cdcaeae15797506 + depends: + - __osx >=11.0 + - libcxx >=19 + - krb5 >=1.22.2,<1.23.0a0 + - libsodium >=1.0.21,<1.0.22.0a0 license: MPL-2.0 license_family: MOZILLA purls: [] - size: 288572 - timestamp: 1709135728486 + size: 245246 + timestamp: 1772476886668 - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae md5: 30cd29cb87d819caead4d55184c1d115 @@ -4460,7 +4549,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/zipp?source=compressed-mapping + - pkg:pypi/zipp?source=hash-mapping size: 24194 timestamp: 1764460141901 - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda diff --git a/pixi.toml b/pixi.toml index 210df9a4..86654faa 100644 --- a/pixi.toml +++ b/pixi.toml @@ -1,6 +1,6 @@ [workspace] authors = ["saviorand"] -channels = ["conda-forge", "https://conda.modular.com/max", "https://repo.prefix.dev/modular-community", "https://repo.prefix.dev/mojo-community"] +channels = ["conda-forge", "https://repo.prefix.dev/mojo-community", "https://conda.modular.com/max", "https://repo.prefix.dev/modular-community"] description = "Simple and fast HTTP framework for Mojo!" platforms = ["osx-arm64", "linux-64", "linux-aarch64"] license = "MIT" @@ -34,26 +34,30 @@ build_and_publish = [{ task = "build" }, { task = "publish" }] [package] name = "lightbug_http" -version = "0.26.1.2" +version = "0.26.2.0" [package.build] backend = { name = "pixi-build-mojo", version = "*" } [dependencies] -mojo = ">=0.26.1.0,<0.26.2.0" -small_time = ">=26.1.0,<26.2.0" +mojo = ">=0.26.2.0,<0.26.3.0" +small_time = ">=26.2.0,<26.3" +emberjson = ">=0.3.1,<0.4" [package.host-dependencies] -mojo-compiler = ">=0.26.1.0,<0.26.2.0" -small_time = ">=26.1.0,<26.2.0" +mojo-compiler = ">=0.26.2.0,<0.26.3.0" +small_time = ">=26.2.0,<26.3" +emberjson = ">=0.3.1,<0.4" [package.build-dependencies] -mojo-compiler = ">=0.26.1.0,<0.26.2.0" -small_time = ">=26.1.0,<26.2.0" +mojo-compiler = ">=0.26.2.0,<0.26.3.0" +small_time = ">=26.2.0,<26.3" +emberjson = ">=0.3.1,<0.4" [package.run-dependencies] -mojo-compiler = ">=0.26.1.0,<0.26.2.0" -small_time = ">=26.1.0,<26.2.0" +mojo-compiler = ">=0.26.2.0,<0.26.3.0" +small_time = ">=26.2.0,<26.3" +emberjson = ">=0.3.1,<0.4" [feature.util.dependencies] isort = ">=7.0.0,<8" diff --git a/recipes/recipe.yaml b/recipes/recipe.yaml index db7627a3..8f75ad3b 100644 --- a/recipes/recipe.yaml +++ b/recipes/recipe.yaml @@ -1,11 +1,11 @@ # yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json context: - version: "0.26.1.2" + version: "0.26.2.0" package: name: "lightbug_http" - version: 0.26.1.2 + version: 0.26.2.0 source: - path: ../lightbug_http @@ -18,8 +18,9 @@ build: requirements: run: - - max >=0.26.1.0,<0.26.2.0 - - small_time >=26.1.0,<26.2.0 + - max >=0.26.2.0,<0.26.3 + - small_time >=26.2.0,<26.3 + - emberjson >=0.3.1,<0.4 about: homepage: https://github.com/saviorand/lightbug_http diff --git a/tests/integration/test_server.mojo b/tests/integration/test_server.mojo index 9ced8dfa..a107f86d 100644 --- a/tests/integration/test_server.mojo +++ b/tests/integration/test_server.mojo @@ -1,5 +1,5 @@ -from testing import TestSuite +from std.testing import TestSuite -def main(): +def main() raises: TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/integration/test_socket.mojo b/tests/integration/test_socket.mojo index 9ced8dfa..a107f86d 100644 --- a/tests/integration/test_socket.mojo +++ b/tests/integration/test_socket.mojo @@ -1,5 +1,5 @@ -from testing import TestSuite +from std.testing import TestSuite -def main(): +def main() raises: TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/lightbug_http/cookie/test_cookie.mojo b/tests/lightbug_http/cookie/test_cookie.mojo index e239c70a..7ac661c5 100644 --- a/tests/lightbug_http/cookie/test_cookie.mojo +++ b/tests/lightbug_http/cookie/test_cookie.mojo @@ -1,7 +1,7 @@ -from collections import Optional +from std.collections import Optional from small_time.small_time import SmallTime, now -from testing import TestSuite, assert_equal, assert_true +from std.testing import TestSuite, assert_equal, assert_true from lightbug_http.cookie import Cookie, Duration, Expiration, SameSite @@ -46,5 +46,5 @@ fn test_expires_http_timestamp_format() raises: assert_equal(expected, http_date.value()) -def main(): +def main() raises: TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/lightbug_http/cookie/test_cookie_jar.mojo b/tests/lightbug_http/cookie/test_cookie_jar.mojo index 9ced8dfa..a107f86d 100644 --- a/tests/lightbug_http/cookie/test_cookie_jar.mojo +++ b/tests/lightbug_http/cookie/test_cookie_jar.mojo @@ -1,5 +1,5 @@ -from testing import TestSuite +from std.testing import TestSuite -def main(): +def main() raises: TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/lightbug_http/cookie/test_duration.mojo b/tests/lightbug_http/cookie/test_duration.mojo index 8845e376..1978740f 100644 --- a/tests/lightbug_http/cookie/test_duration.mojo +++ b/tests/lightbug_http/cookie/test_duration.mojo @@ -2,16 +2,16 @@ import testing from lightbug_http.cookie.duration import Duration -def test_from_string(): +def test_from_string() raises: testing.assert_equal(Duration.from_string("10").value().total_seconds, 10) testing.assert_false(Duration.from_string("10s").__bool__()) -def test_ctor(): +def test_ctor() raises: testing.assert_equal( Duration(seconds=1, minutes=1, hours=1, days=1).total_seconds, 90061 ) -def main(): +def main() raises: testing.TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/lightbug_http/cookie/test_expiration.mojo b/tests/lightbug_http/cookie/test_expiration.mojo index 4ac4dbcb..b8d7ef89 100644 --- a/tests/lightbug_http/cookie/test_expiration.mojo +++ b/tests/lightbug_http/cookie/test_expiration.mojo @@ -3,7 +3,7 @@ from lightbug_http.cookie.expiration import Expiration from small_time import SmallTime -def test_ctors(): +def test_ctors() raises: # TODO: The string parsing is not correct, possibly a smalltime bug. I will look into it later. (@thatstoasty) # print(Expiration.from_string("Thu, 22 Jan 2037 12:00:10 GMT").value().datetime.value(), Expiration.from_datetime(SmallTime(2037, 1, 22, 12, 0, 10, 0)).datetime.value()) # testing.assert_true(Expiration.from_string("Thu, 22 Jan 2037 12:00:10 GMT").value() == Expiration.from_datetime(SmallTime(2037, 1, 22, 12, 0, 10, 0))) @@ -12,5 +12,5 @@ def test_ctors(): pass -def main(): +def main() raises: testing.TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/lightbug_http/http/test_chunked.mojo b/tests/lightbug_http/http/test_chunked.mojo index 5825be88..8aed8624 100644 --- a/tests/lightbug_http/http/test_chunked.mojo +++ b/tests/lightbug_http/http/test_chunked.mojo @@ -1,5 +1,5 @@ from lightbug_http.http.chunked import HTTPChunkedDecoder -from testing import TestSuite, assert_equal, assert_false, assert_true +from std.testing import TestSuite, assert_equal, assert_false, assert_true fn chunked_at_once_test( diff --git a/tests/lightbug_http/http/test_http.mojo b/tests/lightbug_http/http/test_http.mojo index dc75e767..8b34d56b 100644 --- a/tests/lightbug_http/http/test_http.mojo +++ b/tests/lightbug_http/http/test_http.mojo @@ -1,10 +1,10 @@ -from collections import Dict, List +from std.collections import Dict, List import testing from lightbug_http.header import Header, HeaderKey, Headers from lightbug_http.io.bytes import Bytes from lightbug_http.uri import URI -from testing import assert_equal, assert_false, assert_true +from std.testing import assert_equal, assert_false, assert_true from lightbug_http.cookie import Cookie, Duration, RequestCookieJar, ResponseCookieJar, ResponseCookieKey from lightbug_http.http import HTTPRequest, HTTPResponse, encode @@ -13,7 +13,7 @@ from lightbug_http.http import HTTPRequest, HTTPResponse, encode comptime default_server_conn_string = "http://localhost:8080" -def test_encode_http_request(): +def test_encode_http_request() raises: var uri: URI try: uri = URI.parse(default_server_conn_string + "/foobar?baz") @@ -51,7 +51,7 @@ def test_encode_http_request(): testing.assert_equal(req_encoded, as_str) -def test_encode_http_response(): +def test_encode_http_response() raises: var res = HTTPResponse("Hello, World!".as_bytes()) res.headers[HeaderKey.DATE] = "2024-06-02T13:41:50.766880+00:00" @@ -82,7 +82,7 @@ def test_encode_http_response(): testing.assert_equal(res_encoded, as_str) -def test_decoding_http_response(): +def test_decoding_http_response() raises: var res = String( "HTTP/1.1 200 OK\r\n" "server: lightbug_http\r\n" @@ -123,7 +123,7 @@ def test_decoding_http_response(): # testing.assert_equal(v2._v, 2) -def test_header_iso8859_encoding_regression(): +def test_header_iso8859_encoding_regression() raises: """Regression: header values must be ISO-8859-1 encoded on the wire, not raw UTF-8. Before the fix, a header value containing 'é' (U+00E9), which Mojo stores @@ -151,7 +151,7 @@ def test_header_iso8859_encoding_regression(): assert_false(utf8_lead_found) -def test_request_header_iso8859_encoding_regression(): +def test_request_header_iso8859_encoding_regression() raises: """Regression: request header values must be ISO-8859-1 encoded on the wire, not raw UTF-8. Mirrors test_header_iso8859_encoding_regression but for HTTPRequest.encode(), @@ -179,5 +179,5 @@ def test_request_header_iso8859_encoding_regression(): assert_false(utf8_lead_found) -def main(): +def main() raises: testing.TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/lightbug_http/http/test_json.mojo b/tests/lightbug_http/http/test_json.mojo new file mode 100644 index 00000000..52d37505 --- /dev/null +++ b/tests/lightbug_http/http/test_json.mojo @@ -0,0 +1,59 @@ +import std.testing as testing +from std.testing import assert_equal, assert_true + +from emberjson import parse, deserialize +from lightbug_http.header import HeaderKey +from lightbug_http.http import OK, HTTPResponse +from lightbug_http.http.json import Json + + +@fieldwise_init +struct Message(Movable, Defaultable): + var text: String + + fn __init__(out self): + self.text = "" + + +@fieldwise_init +struct Point(Movable, Defaultable): + var x: Int + var y: Int + + fn __init__(out self): + self.x = 0 + self.y = 0 + + +def test_json_response_status_and_content_type() raises: + var res = HTTPResponse(Json(Message("hello"))) + assert_equal(res.status_code, 200) + assert_equal(res.headers[HeaderKey.CONTENT_TYPE], "application/json") + + +def test_json_response_body_is_valid_json() raises: + var res = HTTPResponse(Json(Message("hello"))) + var body = String(res.get_body()) + var parsed = parse(body) + assert_equal(String(parsed["text"]), '"hello"') + + +def test_json_response_multiple_fields() raises: + var res = HTTPResponse(Json(Point(3, 7))) + var body = String(res.get_body()) + var parsed = parse(body) + assert_equal(parsed["x"].int(), 3) + assert_equal(parsed["y"].int(), 7) + + +def test_json_ok_string_passthrough() raises: + # Pre-serialized JSON strings go through OK directly + var body = '{"key": "value"}' + var res = OK(body, "application/json") + assert_equal(res.status_code, 200) + assert_equal(res.headers[HeaderKey.CONTENT_TYPE], "application/json") + assert_equal(String(res.get_body()), body) + + +def main() raises: + testing.TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/lightbug_http/http/test_parsing.mojo b/tests/lightbug_http/http/test_parsing.mojo index 7bd60edf..2f71e65f 100644 --- a/tests/lightbug_http/http/test_parsing.mojo +++ b/tests/lightbug_http/http/test_parsing.mojo @@ -4,7 +4,7 @@ from lightbug_http.http.parsing import ( http_parse_request_headers, http_parse_response_headers, ) -from testing import TestSuite, assert_equal, assert_false, assert_true +from std.testing import TestSuite, assert_equal, assert_false, assert_true # Test helper structures diff --git a/tests/lightbug_http/http/test_request.mojo b/tests/lightbug_http/http/test_request.mojo index 6df71e88..561c0a50 100644 --- a/tests/lightbug_http/http/test_request.mojo +++ b/tests/lightbug_http/http/test_request.mojo @@ -10,7 +10,7 @@ comptime default_max_request_body_size = 4 * 1024 * 1024 # 4MB comptime default_max_request_uri_length = 8192 -def test_request_from_bytes(): +def test_request_from_bytes() raises: comptime data = "GET /redirect HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nUser-Agent: python-requests/2.32.3\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nAccept: */*\r\nconnection: keep-alive\r\n\r\n" var parsed = parse_request_headers(data.as_bytes()) var request: HTTPRequest @@ -38,7 +38,7 @@ def test_request_from_bytes(): testing.assert_true(request.connection_close()) -def test_read_body(): +def test_read_body() raises: comptime data = "GET /redirect HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nUser-Agent: python-requests/2.32.3\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nAccept: */*\r\nContent-Length: 17\r\nconnection: keep-alive\r\n\r\nThis is the body!" # Parse headers first var data_span = data.as_bytes() @@ -74,9 +74,9 @@ def test_read_body(): ) -def test_encode(): +def test_encode() raises: ... -def main(): +def main() raises: testing.TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/lightbug_http/http/test_response.mojo b/tests/lightbug_http/http/test_response.mojo index dda6da22..138947be 100644 --- a/tests/lightbug_http/http/test_response.mojo +++ b/tests/lightbug_http/http/test_response.mojo @@ -3,7 +3,7 @@ import testing from lightbug_http.http import HTTPResponse, StatusCode -def test_response_from_bytes(): +def test_response_from_bytes() raises: comptime data = "HTTP/1.1 200 OK\r\nServer: example.com\r\nUser-Agent: Mozilla/5.0\r\nContent-Type: text/html\r\nContent-Encoding: gzip\r\nContent-Length: 17\r\n\r\nThis is the body!" var response: HTTPResponse try: @@ -33,7 +33,7 @@ def test_response_from_bytes(): ) -def test_is_redirect(): +def test_is_redirect() raises: comptime data = "HTTP/1.1 200 OK\r\nServer: example.com\r\nUser-Agent: Mozilla/5.0\r\nContent-Type: text/html\r\nContent-Encoding: gzip\r\nContent-Length: 17\r\n\r\nThis is the body!" var response: HTTPResponse try: @@ -57,17 +57,17 @@ def test_is_redirect(): testing.assert_true(response.is_redirect()) -def test_read_body(): +def test_read_body() raises: ... -def test_read_chunks(): +def test_read_chunks() raises: ... -def test_encode(): +def test_encode() raises: ... -def main(): +def main() raises: testing.TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/lightbug_http/io/test_byte_reader.mojo b/tests/lightbug_http/io/test_byte_reader.mojo index 6017f5b5..7ec80c22 100644 --- a/tests/lightbug_http/io/test_byte_reader.mojo +++ b/tests/lightbug_http/io/test_byte_reader.mojo @@ -5,7 +5,7 @@ from lightbug_http.io.bytes import ByteReader, Bytes, EndOfReaderError comptime example = "Hello, World!" -def test_peek(): +def test_peek() raises: var r = ByteReader("H".as_bytes()) var b: Byte try: @@ -31,7 +31,7 @@ def test_peek(): testing.assert_true(raised, "Expected EndOfReaderError") -def test_read_until(): +def test_read_until() raises: var r = ByteReader(example.as_bytes()) var result: List[Byte] = [72, 101, 108, 108, 111] testing.assert_equal(r.read_pos, 0) @@ -41,7 +41,7 @@ def test_read_until(): testing.assert_equal(r.read_pos, 5) -def test_read_bytes(): +def test_read_bytes() raises: var r = ByteReader(example.as_bytes()) var result: List[Byte] = [ 72, @@ -78,7 +78,7 @@ def test_read_bytes(): ) -def test_read_word(): +def test_read_word() raises: var r = ByteReader(example.as_bytes()) var result: List[Byte] = [72, 101, 108, 108, 111, 44] testing.assert_equal(r.read_pos, 0) @@ -88,7 +88,7 @@ def test_read_word(): testing.assert_equal(r.read_pos, 6) -def test_read_line(): +def test_read_line() raises: # No newline, go to end of line var r = ByteReader(example.as_bytes()) var result: List[Byte] = [ @@ -127,7 +127,7 @@ def test_read_line(): testing.assert_equal(r2.read_pos, 13) -def test_skip_whitespace(): +def test_skip_whitespace() raises: var r = ByteReader(" Hola".as_bytes()) var result: List[Byte] = [72, 111, 108, 97] r.skip_whitespace() @@ -137,7 +137,7 @@ def test_skip_whitespace(): ) -def test_skip_carriage_return(): +def test_skip_carriage_return() raises: var r = ByteReader("\r\nHola".as_bytes()) var result: List[Byte] = [72, 111, 108, 97] r.skip_carriage_return() @@ -151,7 +151,7 @@ def test_skip_carriage_return(): testing.assert_equal(String(unsafe_from_utf8=bytes), String(unsafe_from_utf8=result)) -def test_consume(): +def test_consume() raises: var r = ByteReader(example.as_bytes()) var result: List[Byte] = [ 72, @@ -171,5 +171,5 @@ def test_consume(): testing.assert_equal(String(unsafe_from_utf8=r^.consume()), String(unsafe_from_utf8=result)) -def main(): +def main() raises: testing.TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/lightbug_http/io/test_byte_writer.mojo b/tests/lightbug_http/io/test_byte_writer.mojo index 2639afb4..63e8b548 100644 --- a/tests/lightbug_http/io/test_byte_writer.mojo +++ b/tests/lightbug_http/io/test_byte_writer.mojo @@ -12,7 +12,7 @@ from lightbug_http.io.bytes import Bytes, ByteWriter # testing.assert_equal(to_string(w^.consume()), to_string(Bytes(2))) -def test_consuming_write(): +def test_consuming_write() raises: var w = ByteWriter() var my_string: String = "World" w.consuming_write(List[Byte]("Hello ".as_bytes())) @@ -22,10 +22,10 @@ def test_consuming_write(): testing.assert_equal(String(unsafe_from_utf8=result^), "Hello World") -def test_write(): +def test_write() raises: var w = ByteWriter() w.write("Hello", ", ") - w.write_bytes("World!".as_bytes()) + w.write_string("World!".as_bytes()) var result: List[Byte] = [ 72, 101, @@ -44,5 +44,5 @@ def test_write(): testing.assert_equal(String(unsafe_from_utf8=w^.consume()), String(unsafe_from_utf8=Span(result))) -def main(): +def main() raises: testing.TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/lightbug_http/io/test_bytes.mojo b/tests/lightbug_http/io/test_bytes.mojo index 3cf9c6ef..aed57a10 100644 --- a/tests/lightbug_http/io/test_bytes.mojo +++ b/tests/lightbug_http/io/test_bytes.mojo @@ -86,5 +86,5 @@ fn test_string_to_bytes() raises: testing.assert_equal(c.key, String(unsafe_from_utf8=c.value)) -def main(): +def main() raises: testing.TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/lightbug_http/test_header.mojo b/tests/lightbug_http/test_header.mojo index cb403bb1..50e8e6d7 100644 --- a/tests/lightbug_http/test_header.mojo +++ b/tests/lightbug_http/test_header.mojo @@ -1,9 +1,9 @@ from lightbug_http.header import Header, Headers, encode_latin1_header_value, write_header_latin1 from lightbug_http.io.bytes import ByteReader, Bytes, ByteWriter -from testing import TestSuite, assert_equal, assert_true +from std.testing import TestSuite, assert_equal, assert_true -def test_header_case_insensitive(): +def test_header_case_insensitive() raises: var headers = Headers(Header("Host", "SomeHost")) assert_true("host" in headers) assert_true("HOST" in headers) @@ -43,7 +43,7 @@ def test_header_case_insensitive(): # assert_equal(header["Trailer"], "end-of-message") -def test_encode_latin1_ascii(): +def test_encode_latin1_ascii() raises: """ASCII values are passed through unchanged.""" var result = encode_latin1_header_value("hello, world") assert_equal(len(result), 12) @@ -51,7 +51,7 @@ def test_encode_latin1_ascii(): assert_equal(result[5], UInt8(0x2C)) -def test_encode_latin1_supplement(): +def test_encode_latin1_supplement() raises: """UTF-8 codepoints U+0080–U+00FF are transcoded to single ISO-8859-1 bytes.""" # "é" = U+00E9, UTF-8: 0xC3 0xA9 → ISO-8859-1: 0xE9 var result = encode_latin1_header_value("é") @@ -69,7 +69,7 @@ def test_encode_latin1_supplement(): assert_equal(result[3], UInt8(0xE9)) -def test_encode_latin1_obs_text(): +def test_encode_latin1_obs_text() raises: """Raw obs-text bytes (0x80–0xFF, not part of a valid UTF-8 sequence) pass through as-is.""" # 0xA2 alone is not a valid UTF-8 lead byte → treated as obs-text var result = encode_latin1_header_value("c\xa2y") @@ -79,7 +79,7 @@ def test_encode_latin1_obs_text(): assert_equal(result[2], UInt8(0x79)) -def test_encode_latin1_above_latin1(): +def test_encode_latin1_above_latin1() raises: """Codepoints above U+00FF fall back to raw UTF-8 bytes (best-effort).""" # "€" = U+20AC, UTF-8: 0xE2 0x82 0xAC — codepoint > 0xFF → raw passthrough var result = encode_latin1_header_value("€") @@ -89,7 +89,7 @@ def test_encode_latin1_above_latin1(): assert_equal(result[2], UInt8(0xAC)) -def test_write_header_latin1_encodes_value(): +def test_write_header_latin1_encodes_value() raises: """Values with Latin-1 supplement characters are encoded as single bytes on the wire.""" var writer = ByteWriter() write_header_latin1(writer, "x-test", "café") @@ -101,7 +101,7 @@ def test_write_header_latin1_encodes_value(): assert_equal(bytes[13], UInt8(0x0A)) -def test_headers_write_latin1_to(): +def test_headers_write_latin1_to() raises: """Headers.write_latin1_to transcodes values for HTTP wire format.""" var headers = Headers(Header("x-lang", "café")) var writer = ByteWriter() @@ -112,5 +112,5 @@ def test_headers_write_latin1_to(): assert_equal(bytes[11], UInt8(0xE9)) # single Latin-1 byte for 'é' -def main(): +def main() raises: TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/lightbug_http/test_host_port.mojo b/tests/lightbug_http/test_host_port.mojo index e59c7a67..17f00611 100644 --- a/tests/lightbug_http/test_host_port.mojo +++ b/tests/lightbug_http/test_host_port.mojo @@ -1,5 +1,5 @@ from lightbug_http.address import HostPort, NetworkType, ParseError, TCPAddr, join_host_port, parse_address -from testing import TestSuite, assert_equal, assert_false, assert_raises, assert_true +from std.testing import TestSuite, assert_equal, assert_false, assert_raises, assert_true fn test_split_host_port_tcp4() raises: @@ -167,7 +167,7 @@ fn test_split_host_port_error_missing_bracket() raises: _ = parse_address[NetworkType.tcp6]("[::1:8080") -def test_join_host_port(): +def test_join_host_port() raises: # IPv4 assert_equal(join_host_port("127.0.0.1", "8080"), "127.0.0.1:8080") diff --git a/tests/lightbug_http/test_server.mojo b/tests/lightbug_http/test_server.mojo index db4d6907..3ac0d403 100644 --- a/tests/lightbug_http/test_server.mojo +++ b/tests/lightbug_http/test_server.mojo @@ -2,7 +2,7 @@ import testing from lightbug_http.server import Server -def test_server_defaults_to_keep_alive_off(): +def test_server_defaults_to_keep_alive_off() raises: var server = Server() testing.assert_false( server.tcp_keep_alive, @@ -10,5 +10,5 @@ def test_server_defaults_to_keep_alive_off(): ) -def main(): +def main() raises: testing.TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/lightbug_http/test_uri.mojo b/tests/lightbug_http/test_uri.mojo index d823a6a2..00126b27 100644 --- a/tests/lightbug_http/test_uri.mojo +++ b/tests/lightbug_http/test_uri.mojo @@ -1,5 +1,5 @@ from lightbug_http.uri import URI -from testing import TestSuite, assert_equal, assert_false, assert_raises, assert_true +from std.testing import TestSuite, assert_equal, assert_false, assert_raises, assert_true fn test_uri_no_parse_defaults() raises: