diff --git a/lightbug_http/__init__.mojo b/lightbug_http/__init__.mojo index 65fed45f..d7fee55e 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, JsonOK, json_decode, JsonError, JsonSerializable, JsonDeserializable diff --git a/lightbug_http/address.mojo b/lightbug_http/address.mojo index 2f992c38..bd730b38 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 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 @@ -266,8 +266,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 +306,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. """ @@ -374,10 +372,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 +396,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 +425,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 +436,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 +447,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 +458,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 +469,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 +480,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 +491,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 +502,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 +513,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 +524,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 +535,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 +546,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 +556,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 - @implicit - fn __init__(out self, value: ParseEmptyAddressError): - self.value = value +comptime GetIPAddressError = Variant[GetaddrinfoError, GetaddrinfoNullAddrError] - @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,19 +582,19 @@ fn parse_ipv6_bracketed_address[ Returns: Tuple of (host, colon_index_offset). """ - if address[0:1] != "[": + if address[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[colon_index : colon_index + 1] != StringSlice(":"): + raise ParseError(ParseMissingPortError()) return address[1:end_bracket_index], UInt16(end_bracket_index + 1) @@ -728,24 +611,24 @@ fn validate_no_brackets[ segment = address[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 +657,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 @@ -811,13 +692,12 @@ fn parse_address[ else: host = address[:colon_index] if host.find(":") != -1: - raise ParseTooManyColonsError() + raise ParseError(ParseTooManyColonsError()) port = parse_port(address[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 +737,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..6371102e 100644 --- a/lightbug_http/c/address.mojo +++ b/lightbug_http/c/address.mojo @@ -1,11 +1,10 @@ -from sys.ffi import c_int +from 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, Stringable, 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, Stringable, 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, Stringable, Writable, TrivialRegisterPassable): var value: Int comptime INET_ADDRSTRLEN = Self(16) comptime INET6_ADDRSTRLEN = Self(46) diff --git a/lightbug_http/c/network.mojo b/lightbug_http/c/network.mojo index d3ceb4c8..cc8137c8 100644 --- a/lightbug_http/c/network.mojo +++ b/lightbug_http/c/network.mojo @@ -1,4 +1,4 @@ -from sys.ffi import c_char, c_int, c_uint, c_ushort, external_call, get_errno +from ffi import c_char, c_int, c_uint, c_ushort, external_call, get_errno from sys.info import size_of from lightbug_http.c.address import AddressFamily, AddressLength @@ -9,8 +9,7 @@ from 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 @@ -398,19 +327,19 @@ 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()) @@ -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..71474d93 100644 --- a/lightbug_http/c/socket.mojo +++ b/lightbug_http/c/socket.mojo @@ -1,4 +1,4 @@ -from sys.ffi import c_int, c_size_t, c_ssize_t, c_uchar, external_call, get_errno +from ffi import c_int, c_size_t, c_ssize_t, c_uchar, external_call, get_errno from sys.info import CompilationTarget, size_of from lightbug_http.c.aliases import c_void @@ -8,8 +8,7 @@ from memory import stack_allocation @fieldwise_init -@register_passable("trivial") -struct ShutdownOption(Copyable, Equatable, Stringable, Writable): +struct ShutdownOption(Copyable, Equatable, Stringable, 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, Stringable, 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, Stringable, 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[ @@ -430,20 +427,20 @@ fn getsockopt( 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() @@ -502,19 +499,19 @@ 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[ @@ -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)) @@ -897,33 +893,33 @@ fn connect(socket: FileDescriptor, mut address: SocketAddress) raises ConnectErr 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( @@ -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) @@ -1112,34 +1108,34 @@ 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) @@ -1220,42 +1216,42 @@ 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) @@ -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..edb0609b 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 # 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..5e46f581 100644 --- a/lightbug_http/connection.mojo +++ b/lightbug_http/connection.mojo @@ -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): diff --git a/lightbug_http/cookie/cookie.mojo b/lightbug_http/cookie/cookie.mojo index dbc38378..953f1f96 100644 --- a/lightbug_http/cookie/cookie.mojo +++ b/lightbug_http/cookie/cookie.mojo @@ -3,8 +3,7 @@ from utils import Variant @fieldwise_init -@register_passable("trivial") -struct InvalidCookieError(Movable, Stringable, Writable): +struct InvalidCookieError(Movable, Stringable, 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/response_cookie_jar.mojo b/lightbug_http/cookie/response_cookie_jar.mojo index cf17cba1..29bf533f 100644 --- a/lightbug_http/cookie/response_cookie_jar.mojo +++ b/lightbug_http/cookie/response_cookie_jar.mojo @@ -9,8 +9,7 @@ from lightbug_http.cookie.cookie import InvalidCookieError @fieldwise_init -@register_passable("trivial") -struct CookieParseError(Movable, Stringable, Writable): +struct CookieParseError(Movable, Stringable, Writable, TrivialRegisterPassable): """Error raised when a cookie header string fails to parse.""" fn write_to[W: Writer, //](self, mut writer: W): @@ -42,15 +41,15 @@ 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) diff --git a/lightbug_http/header.mojo b/lightbug_http/header.mojo index 81a5c913..5ad834a2 100644 --- a/lightbug_http/header.mojo +++ b/lightbug_http/header.mojo @@ -109,8 +109,7 @@ struct HeaderKey: @fieldwise_init -@register_passable("trivial") -struct HeaderKeyNotFoundError(Movable, Stringable, Writable): +struct HeaderKeyNotFoundError(Movable, Stringable, 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, Stringable, 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, Stringable, 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, Stringable, 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, Stringable, 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, Stringable, Writable, TrivialRegisterPassable): """Error raised when buffer has no data available.""" fn write_to[W: Writer, //](self, mut writer: W): 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..4673a8de 100644 --- a/lightbug_http/http/chunked.mojo +++ b/lightbug_http/http/chunked.mojo @@ -1,7 +1,7 @@ import sys from 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 @@ -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/json.mojo b/lightbug_http/http/json.mojo new file mode 100644 index 00000000..91ceb717 --- /dev/null +++ b/lightbug_http/http/json.mojo @@ -0,0 +1,84 @@ +from emberjson import ( + parse, + to_string, + serialize, + deserialize, + try_deserialize, + JSON, + JsonSerializable, + JsonDeserializable, +) +from lightbug_http.header import Header, HeaderKey, Headers +from lightbug_http.http.common_response import OK +from lightbug_http.http.response import HTTPResponse +from lightbug_http.http.request import HTTPRequest + + +fn JsonOK(body: String) -> HTTPResponse: + """Return a 200 OK response with JSON content type. + + Args: + body: A pre-serialized JSON string. + """ + return OK(body, "application/json") + + +fn JsonOK[T: AnyType](value: T) -> HTTPResponse: + """Return a 200 OK response, serializing the value to JSON. + + Parameters: + T: Any struct type. Types with fields that have non-trivial destructors + must also conform to Defaultable. + + Args: + value: The value to serialize to JSON. + """ + return OK(serialize(value), "application/json") + + +fn json_decode(req: HTTPRequest) raises -> JSON: + """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())) + + +fn JsonError(message: String) -> HTTPResponse: + """Return a 400 Bad Request response with a JSON error body. + + Args: + message: The error message to include. + """ + return HTTPResponse( + String('{"error": "', message, '"}').as_bytes(), + headers=Headers(Header(HeaderKey.CONTENT_TYPE, "application/json")), + status_code=400, + status_text="Bad Request", + ) diff --git a/lightbug_http/http/parsing.mojo b/lightbug_http/http/parsing.mojo index d3700de5..edf1988f 100644 --- a/lightbug_http/http/parsing.mojo +++ b/lightbug_http/http/parsing.mojo @@ -17,8 +17,7 @@ struct HTTPHeader(Copyable): @fieldwise_init -@register_passable("trivial") -struct ParseError(Movable, Stringable, Writable): +struct ParseError(Movable, Stringable, 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, Stringable, Writable, TrivialRegisterPassable): """Need more data to complete parsing.""" fn write_to[W: Writer, //](self, mut writer: W): diff --git a/lightbug_http/io/bytes.mojo b/lightbug_http/io/bytes.mojo index 3f659751..bf6a6462 100644 --- a/lightbug_http/io/bytes.mojo +++ b/lightbug_http/io/bytes.mojo @@ -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 @@ -306,46 +305,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 +319,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..98840f25 100644 --- a/lightbug_http/server.mojo +++ b/lightbug_http/server.mojo @@ -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): diff --git a/lightbug_http/service.mojo b/lightbug_http/service.mojo index c3a2bb4a..3ec244fd 100644 --- a/lightbug_http/service.mojo +++ b/lightbug_http/service.mojo @@ -1,7 +1,7 @@ from lightbug_http.header import HeaderKey from lightbug_http.io.bytes import Bytes -from lightbug_http.http import OK, HTTPRequest, HTTPResponse, NotFound +from lightbug_http.http import OK, HTTPRequest, HTTPResponse, NotFound, JsonOK trait HTTPService: @@ -58,7 +58,7 @@ struct TechEmpowerRouter(HTTPService): if req.uri.path == "/plaintext": return OK("Hello, World!", "text/plain") elif req.uri.path == "/json": - return OK('{"message": "Hello, World!"}', "application/json") + return JsonOK('{"message": "Hello, World!"}') return OK("Hello world!") # text/plain is the default diff --git a/lightbug_http/socket.mojo b/lightbug_http/socket.mojo index 94671102..6c9535a4 100644 --- a/lightbug_http/socket.mojo +++ b/lightbug_http/socket.mojo @@ -1,4 +1,4 @@ -from sys.ffi import c_uint +from ffi import c_uint from sys.info import CompilationTarget from lightbug_http.address import ( @@ -63,20 +63,17 @@ from 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, Stringable, Writable, TrivialRegisterPassable): fn write_to[W: Writer, //](self, mut writer: W): writer.write("InvalidCloseErrorConversionError: Cannot convert EBADF to FatalCloseError") @@ -608,7 +605,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. @@ -821,7 +818,7 @@ 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] = [seconds, 0] _ = _setsockopt( self.fd.value, SOL_SOCKET, diff --git a/lightbug_http/uri.mojo b/lightbug_http/uri.mojo index 212b1f0c..d1de1b5c 100644 --- a/lightbug_http/uri.mojo +++ b/lightbug_http/uri.mojo @@ -32,7 +32,7 @@ fn unquote[expand_plus: Bool = False](input_str: String, disallowed_escapes: Lis encoded_str[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) @@ -80,8 +80,8 @@ 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 @@ -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/owning_list.mojo b/lightbug_http/utils/owning_list.mojo index 32441656..7ed1db0e 100644 --- a/lightbug_http/utils/owning_list.mojo +++ b/lightbug_http/utils/owning_list.mojo @@ -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)): diff --git a/pixi.lock b/pixi.lock index aff95d36..2a1f7669 100644 --- a/pixi.lock +++ b/pixi.lock @@ -3,351 +3,393 @@ environments: bench: channels: - url: https://conda.anaconda.org/conda-forge/ + - url: https://repo.prefix.dev/mojo-community/ + - url: https://conda.modular.com/max-nightly/ - 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/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + build: hb0f4dca_0 - 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/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.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.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.4-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/libgcc-ng-15.2.0-h69a702a_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/libsodium-1.0.20-h4ab18f5_0.conda - 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/libstdcxx-15.2.0-h934c35e_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_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.modular.com/max-nightly/noarch/mblack-26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/mojo-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-0.26.2.0.dev2026030105-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.2-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: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + build: hb0f4dca_0 - 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/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-h387f397_9.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/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + build: he8cfe8b_0 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hcab7f73_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/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.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_101.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.4-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/libgcc-ng-15.2.0-he9431aa_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/libsodium-1.0.20-h68df207_0.conda - 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/libstdcxx-15.2.0-hef695bb_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_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.modular.com/max-nightly/noarch/mblack-26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/mojo-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-0.26.2.0.dev2026030105-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.2-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: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + build: he8cfe8b_0 - 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/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-hefbcea8_9.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/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + build: h60d57d3_0 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-hef89b57_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/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/krb5-1.21.3-h237132a_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/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-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/libsodium-1.0.20-h99b78c6_0.conda - 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.modular.com/max-nightly/noarch/mblack-26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-0.26.2.0.dev2026030105-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.2-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: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + build: h60d57d3_0 - 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/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-h888dc83_9.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-nightly/ - 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/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + build: hb0f4dca_0 - 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/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.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.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.4-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/libgcc-ng-15.2.0-h69a702a_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/libsodium-1.0.20-h4ab18f5_0.conda - 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/libstdcxx-15.2.0-h934c35e_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_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.modular.com/max-nightly/noarch/mblack-26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/mojo-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-0.26.2.0.dev2026030105-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.2-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: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + build: hb0f4dca_0 - 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/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-h387f397_9.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/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + build: he8cfe8b_0 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hcab7f73_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/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.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_101.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.4-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/libgcc-ng-15.2.0-he9431aa_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/libsodium-1.0.20-h68df207_0.conda - 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/libstdcxx-15.2.0-hef695bb_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_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.modular.com/max-nightly/noarch/mblack-26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/mojo-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-0.26.2.0.dev2026030105-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.2-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: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + build: he8cfe8b_0 - 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/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-hefbcea8_9.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/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + build: h60d57d3_0 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-hef89b57_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/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/krb5-1.21.3-h237132a_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/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-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/libsodium-1.0.20-h99b78c6_0.conda - 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.modular.com/max-nightly/noarch/mblack-26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-0.26.2.0.dev2026030105-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.2-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: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + build: h60d57d3_0 - 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/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-h888dc83_9.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-nightly/ - 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/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/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: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + build: hb0f4dca_0 - 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.24.3-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 @@ -365,48 +407,51 @@ 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/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.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/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-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/libgcc-ng-15.2.0-h69a702a_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/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/libsodium-1.0.20-h4ab18f5_0.conda - 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/libstdcxx-15.2.0-h934c35e_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_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/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.modular.com/max-nightly/noarch/mblack-26.2.0.dev2026030105-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-nightly/linux-64/mojo-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-0.26.2.0.dev2026030105-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.2-py313hf6604e3_1.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.2-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,32 +459,33 @@ 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.0-pyhcf101f3_1.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/linux-64/python-3.13.12-hc97d973_100_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/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-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-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: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + build: hb0f4dca_0 - 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 @@ -448,57 +494,57 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-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.41.0-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.41.0-he9f3e0c_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-h387f397_9.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/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/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: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + build: he8cfe8b_0 - 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.24.3-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,7 +552,7 @@ 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.2-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_resources-6.5.2-pyhd8ed1ab_0.conda @@ -516,48 +562,51 @@ 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/keyutils-1.6.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_101.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/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-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/libgcc-ng-15.2.0-he9431aa_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/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/libsodium-1.0.20-h68df207_0.conda - 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/libstdcxx-15.2.0-hef695bb_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_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/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.modular.com/max-nightly/noarch/mblack-26.2.0.dev2026030105-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-nightly/linux-aarch64/mojo-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-0.26.2.0.dev2026030105-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.2-py313h11e5ff7_1.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.2-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,32 +614,33 @@ 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.0-pyhcf101f3_1.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/linux-aarch64/python-3.13.12-h4c0d347_100_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/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-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-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: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + build: he8cfe8b_0 - 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 @@ -599,22 +649,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.3-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.41.0-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.41.0-he9f3e0c_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-hefbcea8_9.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 @@ -626,28 +674,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-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/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: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + build: h60d57d3_0 - 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.24.3-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,7 +705,7 @@ 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.2-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_resources-6.5.2-pyhd8ed1ab_0.conda @@ -664,41 +714,43 @@ 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-pyh534df25_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.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/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-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/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-5_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/libsodium-1.0.20-h99b78c6_0.conda - 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/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/llvm-openmp-22.1.0-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.modular.com/max-nightly/noarch/mblack-26.2.0.dev2026030105-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-nightly/osx-arm64/mojo-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-0.26.2.0.dev2026030105-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.2-py313h16eae64_1.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.2-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,31 +758,32 @@ 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.0-pyhcf101f3_1.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/osx-arm64/python-3.13.12-h20e6be0_100_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/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-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-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: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + build: h60d57d3_0 - 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 @@ -739,370 +792,399 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py313h6535dbc_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.41.0-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.41.0-he9f3e0c_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-h888dc83_9.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-nightly/ - 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/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + build: hb0f4dca_0 - 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/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.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.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.4-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/libgcc-ng-15.2.0-h69a702a_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/libsodium-1.0.20-h4ab18f5_0.conda - 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/libstdcxx-15.2.0-h934c35e_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_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.modular.com/max-nightly/noarch/mblack-26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/mojo-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-0.26.2.0.dev2026030105-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.2-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: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + build: hb0f4dca_0 - 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/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-h387f397_9.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/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + build: he8cfe8b_0 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hcab7f73_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/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.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_101.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.4-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/libgcc-ng-15.2.0-he9431aa_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/libsodium-1.0.20-h68df207_0.conda - 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/libstdcxx-15.2.0-hef695bb_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_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.modular.com/max-nightly/noarch/mblack-26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/mojo-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-0.26.2.0.dev2026030105-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.2-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: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + build: he8cfe8b_0 - 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/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-hefbcea8_9.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/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + build: h60d57d3_0 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-hef89b57_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/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/krb5-1.21.3-h237132a_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/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-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/libsodium-1.0.20-h99b78c6_0.conda - 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.modular.com/max-nightly/noarch/mblack-26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-0.26.2.0.dev2026030105-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.2-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: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + build: h60d57d3_0 - 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/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-h888dc83_9.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-nightly/ - 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/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + build: hb0f4dca_0 - 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/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.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.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.4-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/libgcc-ng-15.2.0-h69a702a_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/libsodium-1.0.20-h4ab18f5_0.conda - 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/libstdcxx-15.2.0-h934c35e_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_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.modular.com/max-nightly/noarch/mblack-26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/mojo-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-0.26.2.0.dev2026030105-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.2-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: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + build: hb0f4dca_0 - 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/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-h387f397_9.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/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + build: he8cfe8b_0 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hcab7f73_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/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.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_101.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.4-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/libgcc-ng-15.2.0-he9431aa_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/libsodium-1.0.20-h68df207_0.conda - 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/libstdcxx-15.2.0-hef695bb_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_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.modular.com/max-nightly/noarch/mblack-26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/mojo-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-0.26.2.0.dev2026030105-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.2-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: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + build: he8cfe8b_0 - 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/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-hefbcea8_9.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/cpython-3.13.12-py313hd8ed1ab_100.conda + - conda: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + build: h60d57d3_0 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-hef89b57_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/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/krb5-1.21.3-h237132a_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/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-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/libsodium-1.0.20-h99b78c6_0.conda - 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.modular.com/max-nightly/noarch/mblack-26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-python-0.26.2.0.dev2026030105-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.2-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: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + build: h60d57d3_0 - 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/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-h888dc83_9.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 @@ -1275,46 +1357,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 +1422,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 @@ -1445,17 +1527,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 +1549,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 @@ -1482,12 +1564,12 @@ packages: license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT 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 + - pkg:pypi/cryptography?source=compressed-mapping + 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 +1583,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 +1710,36 @@ packages: purls: [] size: 7077 timestamp: 1756221480651 +- conda: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + name: emberjson + version: 0.3.1 + build: h60d57d3_0 + subdir: osx-arm64 + variants: + target_platform: osx-arm64 + depends: + - mojo-compiler >=0.26.2.0.dev2026020205,<0.27 + channel: null +- conda: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + name: emberjson + version: 0.3.1 + build: hb0f4dca_0 + subdir: linux-64 + variants: + target_platform: linux-64 + depends: + - mojo-compiler >=0.26.2.0.dev2026020205,<0.27 + channel: null +- conda: git+https://github.com/bgreni/emberjson?rev=583a72d#583a72da339c6ee252dce157af4689601b645985 + name: emberjson + version: 0.3.1 + build: he8cfe8b_0 + subdir: linux-aarch64 + variants: + target_platform: linux-aarch64 + depends: + - mojo-compiler >=0.26.2.0.dev2026020205,<0.27 + channel: null - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144 md5: 8e662bd460bda79b1ea39194e3c4c9ab @@ -1636,7 +1748,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 +1769,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 +1782,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 +1810,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.24.3-pyhd8ed1ab_0.conda + sha256: 6d576ed3bd0e7c57b1144f0b2014de9ea3fab9786316bc3e748105d44e0140a0 + md5: 9dbb20eec24beb026291c20a35ce1ff9 depends: - python >=3.10 license: Unlicense purls: - - pkg:pypi/filelock?source=hash-mapping - size: 18661 - timestamp: 1768022315929 + - pkg:pypi/filelock?source=compressed-mapping + size: 24808 + timestamp: 1771468713029 - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda sha256: 96cac6573fd35ae151f4d6979bab6fbc90cb6b1fb99054ba19eb075da9822fcb md5: b8993c19b0c32a2f7b66cbb58ca27069 @@ -1718,7 +1830,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 @@ -1843,27 +1955,27 @@ packages: purls: [] size: 12728445 timestamp: 1767969922681 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hb1525cb_0.conda - sha256: 09f7f9213eb68e7e4291cd476e72b37f3ded99ed957528567f32f5ba6b611043 - md5: 15b35dc33e185e7d2aac1cfcd6778627 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hcab7f73_0.conda + sha256: dcbaa3042084ac58685e3ef4547e4c4be9d37dc52b92ea18581288af95e48b52 + md5: 998ee7d53e32f7ab57fc35707285527e 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: 12851689 + timestamp: 1772208964788 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-hef89b57_0.conda + sha256: 24bc62335106c30fecbcc1dba62c5eba06d18b90ea1061abd111af7b9c89c2d7 + md5: 114e6bfe7c5ad2525eb3597acdbf2300 depends: - __osx >=11.0 license: MIT license_family: MIT purls: [] - size: 12358010 - timestamp: 1767970350308 + size: 12389400 + timestamp: 1772209104304 - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 md5: 53abe63df7e10a6ba605dc5f9f961d36 @@ -2018,31 +2130,94 @@ 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.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda + sha256: 565941ac1f8b0d2f2e8f02827cbca648f4d18cd461afc31f15604cd291b5c5f3 + md5: 12bd9a3f089ee6c9266a37dab82afabd 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: 725507 + timestamp: 1770267139900 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_101.conda + sha256: 44527364aa333be631913451c32eb0cae1e09343827e9ce3ccabd8d962584226 + md5: 35b2ae7fadf364b8e5fb8185aaeb80e5 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 + size: 875924 + timestamp: 1770267209884 - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda build_number: 5 sha256: 18c72545080b86739352482ba14ba2c4815e19e26a7417ca21a95b76ec8da24c @@ -2152,43 +2327,80 @@ packages: 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 +- 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.4-hecca717_0.conda + sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5 + md5: e7f7ce06ec24cfcfb9e36d28cf82ba57 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: - - expat 2.7.3.* + - expat 2.7.4.* 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: 76798 + timestamp: 1771259418166 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda + sha256: 995ce3ad96d0f4b5ed6296b051a0d7b6377718f325bc0e792fbb96b0e369dad7 + md5: 57f3b3da02a50a1be2a6fe847515417d depends: - libgcc >=14 constrains: - - expat 2.7.3.* + - expat 2.7.4.* 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: 76564 + timestamp: 1771259530958 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + sha256: 03887d8080d6a8fe02d75b80929271b39697ecca7628f0657d7afaea87761edf + md5: a92e310ae8dfc206ff449f362fc4217f depends: - __osx >=11.0 constrains: - - expat 2.7.3.* + - expat 2.7.4.* license: MIT license_family: MIT purls: [] - size: 67800 - timestamp: 1763549994166 + size: 68199 + timestamp: 1771260020767 - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 md5: a360c33a5abe61c07959e449fa1453eb @@ -2220,105 +2432,105 @@ 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 + - 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: 402197 - timestamp: 1765258985740 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda - sha256: 5f07f9317f596a201cc6e095e5fc92621afca64829785e483738d935f8cab361 - md5: 5a68259fac2da8f2ee6f7bfe49c9eb8b + size: 401974 + timestamp: 1771378877463 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda + sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 + md5: d5e96b1ed75ca01906b3d2469b4ce493 depends: - - libgcc 15.2.0 he0feb66_16 + - libgcc 15.2.0 he0feb66_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: 27526 + timestamp: 1771378224552 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda + sha256: 83bb0415f59634dccfa8335d4163d1f6db00a27b36666736f9842b650b92cf2f + md5: 4feebd0fbf61075a1a9c2e9b3936c257 depends: - - libgcc 15.2.0 h8acb6b2_16 + - libgcc 15.2.0 h8acb6b2_18 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 + size: 27568 + timestamp: 1771378136019 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda + sha256: d2c9fad338fd85e4487424865da8e74006ab2e2475bd788f624d7a39b2a72aee + md5: 9063115da5bc35fdc3e1002e69b9ef6e 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 +2539,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 +2551,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 +2563,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 +2576,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 +2591,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 @@ -2575,31 +2787,33 @@ packages: 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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 depends: - - libgcc-ng >=7.5.0 + - libgcc-ng >=12 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: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a depends: - - libgcc-ng >=7.5.0 + - libgcc-ng >=12 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: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 license: ISC purls: [] - size: 324912 - timestamp: 1605135878892 + size: 164972 + timestamp: 1716828607917 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda sha256: 04596fcee262a870e4b7c9807224680ff48d4d0cc0dac076a602503d3dc6d217 md5: da5be73701eecd0e8454423fd6ffcf30 @@ -2634,51 +2848,51 @@ packages: 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 +- 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 + - libstdcxx-ng ==15.2.0=*_18 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 + size: 5541411 + timestamp: 1771378162499 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda + sha256: 3c902ffd673cb3c6ddde624cdb80f870b6c835f8bf28384b0016e7d444dd0145 + md5: 6235adb93d064ecdf3d44faee6f468de depends: - - libstdcxx 15.2.0 h934c35e_16 + - libstdcxx 15.2.0 h934c35e_18 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 + size: 27575 + timestamp: 1771378314494 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_18.conda + sha256: 035a31cde134e706e30029a837a31f729ad32b7c5bca023271dfe91a8ba6c896 + md5: 699d294376fe18d80b7ce7876c3a875d depends: - - libstdcxx 15.2.0 hef695bb_16 + - libstdcxx 15.2.0 hef695bb_18 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 27376 - timestamp: 1765257033344 + size: 27645 + timestamp: 1771378204663 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee md5: db409b7c1720428638e7c0d509d3e1b5 @@ -2768,19 +2982,19 @@ packages: 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 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda + sha256: 0daeedb3872ad0fdd6f0d7e7165c63488e8a315d7057907434145fba0c1e7b3d + md5: ff0820b5588b20be3b858552ecf8ffae depends: - __osx >=11.0 constrains: - - openmp 21.1.8|21.1.8.* + - openmp 22.1.0|22.1.0.* - intel-openmp <0.0a0 license: Apache-2.0 WITH LLVM-exception license_family: APACHE purls: [] - size: 285974 - timestamp: 1765964756583 + size: 285558 + timestamp: 1772028716784 - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e md5: 5b5203189eb668f042ac2b0826244964 @@ -2840,9 +3054,10 @@ packages: - pkg:pypi/markupsafe?source=hash-mapping size: 25778 timestamp: 1759055530601 -- conda: https://conda.modular.com/max/noarch/mblack-26.1.0-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mblack-26.2.0.dev2026030105-release.conda noarch: python - sha256: 6ccec52fe7354f44be93a41a122d2214ecdb030e6362afe8e7876eab35472e62 + sha256: 4d4e6512d54bd5f299b685c54f1c909c278df9c5d93dc8c5c71c40ac7e1a8b61 + md5: 8a5a2f5809c6bc50d9e80647d301585c depends: - python >=3.10 - click >=8.0.0 @@ -2851,10 +3066,9 @@ packages: - pathspec >=0.9.0 - platformdirs >=2 - tomli >=1.1.0 - - python license: MIT - size: 135743 - timestamp: 1769478151312 + size: 137589 + timestamp: 1772343706785 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -2866,65 +3080,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-nightly/linux-64/mojo-0.26.2.0.dev2026030105-release.conda + sha256: e58e1fbc54e6f9ece751526f28224fb7984f484e3f232e87b293ddfd575baa3b + md5: d1db5028e44c4436ba88323ad5bf13b9 depends: - python >=3.10 - - mojo-compiler ==0.26.1.0 release - - mblack ==26.1.0 release + - mojo-compiler ==0.26.2.0.dev2026030105 release + - mblack ==26.2.0.dev2026030105 release - 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: 89045624 + timestamp: 1772343706785 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/mojo-0.26.2.0.dev2026030105-release.conda + sha256: bc4ee00ffa9985e3dd890065464bb3bc6435e48062d6be6f6d980a4662d45b2f + md5: de383975aca82c1f4af93b1789b5b8b3 depends: - python >=3.10 - - mojo-compiler ==0.26.1.0 release - - mblack ==26.1.0 release + - mojo-compiler ==0.26.2.0.dev2026030105 release + - mblack ==26.2.0.dev2026030105 release - 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: 87719705 + timestamp: 1772343753750 +- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-0.26.2.0.dev2026030105-release.conda + sha256: 0d97392aa8c4cf771840d95ac77b8a77840d23da8b121ec6976dddb444ac49ed + md5: 8a2b686bfc4acf992b617c374af37900 depends: - python >=3.10 - - mojo-compiler ==0.26.1.0 release - - mblack ==26.1.0 release + - mojo-compiler ==0.26.2.0.dev2026030105 release + - mblack ==26.2.0.dev2026030105 release - 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: 75810301 + timestamp: 1772343746570 +- conda: https://conda.modular.com/max-nightly/linux-64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + sha256: 6ab238cd1de8bc1df836dcbc647373a0298fdbeb37db732a0542898b5bf499e2 + md5: 9b6de160b4199860cfd3b6cd4fd5c198 depends: - - mojo-python ==0.26.1.0 release + - mojo-python ==0.26.2.0.dev2026030105 release 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: 87989870 + timestamp: 1772343706784 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + sha256: 462e8fff80d2511ce5b404ce7c9da3d8a254282c5480c6e81516aaf555f0d36e + md5: 2d3b66073f675e48f7ab11dfe655743f depends: - - mojo-python ==0.26.1.0 release + - mojo-python ==0.26.2.0.dev2026030105 release 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: 85191114 + timestamp: 1772343753747 +- conda: https://conda.modular.com/max-nightly/osx-arm64/mojo-compiler-0.26.2.0.dev2026030105-release.conda + sha256: 9255a2a07631f879f0b04e7ec3b60b7ef2b290e60faad7a5da202fe74ffb273b + md5: 0d915ccf1a28f30570bbe6c6902aca49 depends: - - mojo-python ==0.26.1.0 release + - mojo-python ==0.26.2.0.dev2026030105 release license: LicenseRef-Modular-Proprietary - size: 65952232 - timestamp: 1769480882531 -- conda: https://conda.modular.com/max/noarch/mojo-python-0.26.1.0-release.conda + size: 66494667 + timestamp: 1772343746562 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-python-0.26.2.0.dev2026030105-release.conda noarch: python - sha256: 9bccbc9045984961426038832c8657198f8ef238d95e00d9bdcff2dd139b7fdf + sha256: 7086cbbeb4a0c485183ac2107dd743d6aab24dd14c7c4c30214fa931a1ae0b1d + md5: deb99d3185900e51408d3aaf4e50e3f8 depends: - python license: LicenseRef-Modular-Proprietary - size: 24169 - timestamp: 1769478151311 + size: 681903 + timestamp: 1772343706781 - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhcf101f3_1.conda sha256: 449609f0d250607a300754474350a3b61faf45da183d3071e9720e453c765b8a md5: 32f78e9d06e8593bc4bbf1338da06f5f @@ -3021,37 +3242,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.2-py313hf6604e3_1.conda + sha256: 2eb8be25a7504f058a153a84be70471e0ebbf6bd0411ae2b6d34904b89d86fe3 + md5: ca9c6ba4beac38cb3d0a85afde27f94c depends: - python - libgcc >=14 - - libstdcxx >=14 - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 - liblapack >=3.9.0,<4.0a0 - - libblas >=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 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 + - pkg:pypi/numpy?source=hash-mapping + size: 8857152 + timestamp: 1770098515258 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.2-py313h11e5ff7_1.conda + sha256: 7acd65fef10bb9bb6385e154e3a55c60b3320b0886005bf93ef14f3ea027d4e9 + md5: b40ed3c04212930574f77fc500436106 depends: - python - - python 3.13.* *_cp313 - - libstdcxx >=14 - libgcc >=14 - - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=14 + - python 3.13.* *_cp313 - 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 @@ -3059,28 +3280,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: 7931090 + timestamp: 1770098524373 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.2-py313h16eae64_1.conda + sha256: 3e23ed9eb63d9ce4dc585aad6b65e0197d7e9f28877acf7114cc64f33763a420 + md5: e34e9c58a0ee3eca3def3bb477797621 depends: - python - __osx >=11.0 - - libcxx >=19 - python 3.13.* *_cp313 - - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 - 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 + - pkg:pypi/numpy?source=hash-mapping + size: 6925963 + timestamp: 1770098439599 - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c md5: f61eb8cd60ff9057122a3d338b99c00f @@ -3135,7 +3356,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 +3406,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.2-pyhcf101f3_0.conda + sha256: 7f263219cecf0ba6d74c751efa60c4676ce823157ca90aa43ebba5ac615ca0fa + md5: 4fefefb892ce9cc1539405bec2f1a6cd 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: 25643 + timestamp: 1771233827084 - conda: https://conda.anaconda.org/conda-forge/noarch/poetry-1.8.5-pyh534df25_0.conda sha256: c5ab8a98f25d6416ef40761db1d8f5cea3ea67a28051d3d17829347c63dede67 md5: 669f9224d31f304bc632f346734d987a @@ -3384,29 +3605,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.0-pyhcf101f3_1.conda + sha256: 6a25f3b7a92833534eb9d09e3b4ba00195fbf459ec608d15dc9e31f81b67e972 + md5: 83984e3edee8f7312c0aa860682ee145 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 + - pkg:pypi/pydantic-extra-types?source=hash-mapping + size: 68665 + timestamp: 1770023146886 +- 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 +3638,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 +3675,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 +3692,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 +3718,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,15 +3742,15 @@ 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 @@ -3585,16 +3807,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 +3851,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 +3863,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 @@ -3656,12 +3878,12 @@ packages: license: MIT 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 + - pkg:pypi/pyyaml?source=compressed-mapping + 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 @@ -3671,31 +3893,31 @@ packages: license: MIT 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 + - pkg:pypi/pyyaml?source=compressed-mapping + 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 + - pkg:pypi/pyzmq?source=compressed-mapping + 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 @@ -3706,26 +3928,26 @@ packages: license: BSD-3-Clause 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 + - pkg:pypi/pyzmq?source=compressed-mapping + 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 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/pyzmq?source=hash-mapping - size: 191115 - timestamp: 1757387128258 + - pkg:pypi/pyzmq?source=compressed-mapping + size: 191641 + timestamp: 1771717073430 - conda: https://conda.anaconda.org/conda-forge/linux-64/rapidfuzz-3.14.3-py313h7033f15_1.conda sha256: 010b7b1a9d05583c9a5e025247308c2fdb990f413367fc1414846d94b630e553 md5: 87ec3a86d3c910b1d64ec7116e156d40 @@ -3838,9 +4060,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 +4073,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 @@ -3866,8 +4088,8 @@ packages: license_family: MIT purls: - pkg:pypi/rich-toolkit?source=compressed-mapping - size: 31488 - timestamp: 1769737531318 + 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 +4143,36 @@ 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 +- conda: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + name: small_time + version: 26.2.0 + build: h60d57d3_0 + subdir: osx-arm64 + variants: + target_platform: osx-arm64 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 + channel: null +- conda: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + name: small_time + version: 26.2.0 + build: hb0f4dca_0 + subdir: linux-64 + variants: + target_platform: linux-64 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 + channel: null +- conda: git+https://github.com/thatstoasty/small-time?branch=26.2#1b64590486bde08b53062018a515424ab781cc1e + name: small_time + version: 26.2.0 + build: he8cfe8b_0 + subdir: linux-aarch64 + variants: + target_platform: linux-aarch64 depends: - mojo-compiler >=0.26.1.0,<0.26.2.0 - size: 1353357 - timestamp: 1769803155962 + channel: null - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda sha256: dce518f45e24cd03f401cb0616917773159a210c19d601c5f2d4e0e5879d30ad md5: 03fe290994c5e4ec17293cfb6bdce520 @@ -3947,7 +4181,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 @@ -4022,7 +4256,7 @@ 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 @@ -4085,52 +4319,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 +4357,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 +4394,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.41.0-pyhc90fa1f_0.conda + sha256: 199731b8a86d18d89a9236225cf3e618aef467f628bc6f6bb2875a28f24f3dd4 + md5: 10d80692c8c9c05b7d4b0a1531208ad7 depends: - __unix - click >=7.0 @@ -4201,25 +4408,25 @@ packages: 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 + size: 54913 + timestamp: 1771328143244 +- conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.41.0-he9f3e0c_0.conda + sha256: 034d62c37fadadafe8b5c923beaed2279d0f4ad8df731f3e86d12760fa33ccbc + md5: 2ada177289a251ffcfeae37e9f28dc3a depends: - __unix - - uvicorn ==0.40.0 pyhc90fa1f_0 + - uvicorn ==0.41.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: 4145 + timestamp: 1771328143246 - conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.22.1-py313h07c4f96_1.conda sha256: 77a220ecf6c1467f94d6adda5fb1296f558f3f3044842dc0a52881eab5908dc0 md5: 266caaa8701a13482ea924a77897b1e4 @@ -4262,21 +4469,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 +4576,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 +4625,47 @@ 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-h387f397_9.conda + sha256: 47cfe31255b91b4a6fa0e9dbaf26baa60ac97e033402dbc8b90ba5fee5ffe184 + md5: 8035e5b54c08429354d5d64027041cad depends: - - libgcc-ng >=12 - - libsodium >=1.0.18,<1.0.19.0a0 - - libstdcxx-ng >=12 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libsodium >=1.0.20,<1.0.21.0a0 + - krb5 >=1.21.3,<1.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 + size: 310648 + timestamp: 1757370847287 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hefbcea8_9.conda + sha256: 8a1efaf97a00d62d68939abe40f7a35ace8910eec777d5535b8c32d0079750bd + md5: 5676806bba055c901a62f969cb3fbe02 depends: - - libgcc-ng >=12 - - libsodium >=1.0.18,<1.0.19.0a0 - - libstdcxx-ng >=12 + - libstdcxx >=14 + - libgcc >=14 + - krb5 >=1.21.3,<1.22.0a0 + - libsodium >=1.0.20,<1.0.21.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 + size: 350254 + timestamp: 1757370867477 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h888dc83_9.conda + sha256: b6f9c130646e5971f6cad708e1eee278f5c7eea3ca97ec2fdd36e7abb764a7b8 + md5: 26f39dfe38a2a65437c29d69906a0f68 depends: - - libcxx >=16 - - libsodium >=1.0.18,<1.0.19.0a0 + - __osx >=11.0 + - libcxx >=19 + - libsodium >=1.0.20,<1.0.21.0a0 + - krb5 >=1.21.3,<1.22.0a0 license: MPL-2.0 license_family: MOZILLA purls: [] - size: 288572 - timestamp: 1709135728486 + size: 244772 + timestamp: 1757371008525 - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae md5: 30cd29cb87d819caead4d55184c1d115 @@ -4460,7 +4675,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..b21b55e7 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-nightly/", "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" @@ -40,20 +40,24 @@ version = "0.26.1.2" 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.dev2026020205,<0.27" +small_time = {git = "https://github.com/thatstoasty/small-time.git", branch = "26.2"} +emberjson = {git = "https://github.com/bgreni/EmberJson.git", rev = "583a72d"} [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.dev2026020205,<0.27" +small_time = {git = "https://github.com/thatstoasty/small-time.git", branch = "26.2"} +emberjson = {git = "https://github.com/bgreni/EmberJson.git", rev = "583a72d"} [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.dev2026020205,<0.27" +small_time = {git = "https://github.com/thatstoasty/small-time.git", branch = "26.2"} +emberjson = {git = "https://github.com/bgreni/EmberJson.git", rev = "583a72d"} [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.dev2026020205,<0.27" +small_time = {git = "https://github.com/thatstoasty/small-time.git", branch = "26.2"} +emberjson = {git = "https://github.com/bgreni/EmberJson.git", rev = "583a72d"} [feature.util.dependencies] isort = ">=7.0.0,<8" diff --git a/test.mojo b/test.mojo new file mode 100644 index 00000000..4f91e285 --- /dev/null +++ b/test.mojo @@ -0,0 +1,20 @@ +from lightbug_http.http.json import JsonOK, json_decode, JsonError +from emberjson import deserialize + +@fieldwise_init +struct Message(Movable, Defaultable): + var message: String + + fn __init__(out self): + self.message = "" + +fn main() raises: + # Test serialization via JsonOK + var msg = Message("Hello, World!") + var res = JsonOK(msg) + print("status:", res.status_code) + print("body:", String(res.get_body())) + + # Test deserialization + var parsed = deserialize[Message]('{"message": "from JSON"}') + print("deserialized:", parsed.message) \ No newline at end of file diff --git a/tests/lightbug_http/http/test_json.mojo b/tests/lightbug_http/http/test_json.mojo new file mode 100644 index 00000000..ac550fac --- /dev/null +++ b/tests/lightbug_http/http/test_json.mojo @@ -0,0 +1,49 @@ +climport testing +from testing import assert_equal, assert_true + +from emberjson import parse +from lightbug_http.header import HeaderKey +from lightbug_http.http.json import JsonOK, JsonError + + +def test_json_ok_status_and_content_type(): + var res = JsonOK('{"message": "hello"}') + assert_equal(res.status_code, 200) + assert_equal(res.headers[HeaderKey.CONTENT_TYPE], "application/json") + + +def test_json_ok_preserves_body(): + var body = '{"key": "value", "num": 42}' + var res = JsonOK(body) + assert_equal(String(res.get_body()), body) + + +def test_json_ok_empty_object(): + var res = JsonOK("{}") + assert_equal(String(res.get_body()), "{}") + assert_equal(res.headers[HeaderKey.CONTENT_TYPE], "application/json") + + +def test_json_error_status_and_content_type(): + var res = JsonError("invalid input") + assert_equal(res.status_code, 400) + assert_equal(res.headers[HeaderKey.CONTENT_TYPE], "application/json") + + +def test_json_error_contains_message(): + var res = JsonError("bad request") + var body = String(res.get_body()) + assert_true("bad request" in body, "error body should contain the message") + assert_true("error" in body, "error body should contain 'error' key") + + +def test_json_error_is_valid_json(): + var res = JsonError("something went wrong") + var body = String(res.get_body()) + # Verify the error response body is parseable JSON + var json = parse(body) + assert_equal(String(json["error"]), '"something went wrong"') + + +def main(): + 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..47efd08c 100644 --- a/tests/lightbug_http/io/test_byte_writer.mojo +++ b/tests/lightbug_http/io/test_byte_writer.mojo @@ -25,7 +25,7 @@ def test_consuming_write(): def test_write(): var w = ByteWriter() w.write("Hello", ", ") - w.write_bytes("World!".as_bytes()) + w.write_string("World!".as_bytes()) var result: List[Byte] = [ 72, 101,