diff --git a/lightbug_http/_libc.mojo b/lightbug_http/_libc.mojo index 87c9648e..e506855f 100644 --- a/lightbug_http/_libc.mojo +++ b/lightbug_http/_libc.mojo @@ -1,7 +1,7 @@ from utils import StaticTuple from sys.ffi import external_call, c_char, c_int, c_size_t, c_ssize_t, c_uchar, c_ushort, c_uint from sys.info import size_of, CompilationTarget -from memory import memcpy, UnsafePointer, stack_allocation +from memory import memcpy, LegacyUnsafePointer, stack_allocation from lightbug_http.io.bytes import Bytes alias IPPROTO_IPV6 = 41 @@ -391,9 +391,9 @@ struct addrinfo: var ai_socktype: c_int var ai_protocol: c_int var ai_addrlen: socklen_t - var ai_addr: UnsafePointer[sockaddr] - var ai_canonname: UnsafePointer[c_char] - var ai_next: UnsafePointer[c_void] + var ai_addr: LegacyUnsafePointer[sockaddr] + var ai_canonname: LegacyUnsafePointer[c_char] + var ai_next: LegacyUnsafePointer[c_void] fn __init__(out self): self.ai_flags = 0 @@ -401,9 +401,9 @@ struct addrinfo: self.ai_socktype = 0 self.ai_protocol = 0 self.ai_addrlen = 0 - self.ai_addr = UnsafePointer[sockaddr]() - self.ai_canonname = UnsafePointer[c_char]() - self.ai_next = UnsafePointer[c_void]() + self.ai_addr = LegacyUnsafePointer[sockaddr]() + self.ai_canonname = LegacyUnsafePointer[c_char]() + self.ai_next = LegacyUnsafePointer[c_void]() # --- ( Network Related Syscalls & Structs )------------------------------------ @@ -491,20 +491,20 @@ fn ntohs(netshort: c_ushort) -> c_ushort: fn _inet_ntop( af: c_int, - src: UnsafePointer[c_void, mut=False], - dst: UnsafePointer[c_char], + src: LegacyUnsafePointer[c_void, mut=False], + dst: LegacyUnsafePointer[c_char], size: socklen_t, -) raises -> UnsafePointer[c_char, mut=False]: +) raises -> LegacyUnsafePointer[c_char, mut=False]: """Libc POSIX `inet_ntop` function. Args: af: Address Family see AF_ aliases. - src: A UnsafePointer to a binary address. - dst: A UnsafePointer to a buffer to store the result. + src: A LegacyUnsafePointer to a binary address. + dst: A LegacyUnsafePointer to a buffer to store the result. size: The size of the buffer. Returns: - A UnsafePointer to the buffer containing the result. + A LegacyUnsafePointer to the buffer containing the result. #### C Function ```c @@ -516,10 +516,10 @@ fn _inet_ntop( """ return external_call[ "inet_ntop", - UnsafePointer[c_char, mut=False], # FnName, RetType + LegacyUnsafePointer[c_char, mut=False], # FnName, RetType c_int, - UnsafePointer[c_void, mut=False], - UnsafePointer[c_char], + LegacyUnsafePointer[c_void, mut=False], + LegacyUnsafePointer[c_char], socklen_t, # Args ](af, src, dst, size) @@ -557,10 +557,10 @@ fn inet_ntop[address_family: AddressFamily, address_length: AddressLength](ip_ad # TODO: For some reason, using a pointer instead of a String here leads to a "tried to free invalid ptr crash". # Ideally we should try not to modify private members of the String. - var dst = UnsafePointer[c_char].alloc(address_length.value + 1) + var dst = LegacyUnsafePointer[c_char].alloc(address_length.value + 1) var result = _inet_ntop( address_family.value, - UnsafePointer(to=ip_address).bitcast[c_void](), + LegacyUnsafePointer(to=ip_address).bitcast[c_void](), dst, address_length.value, ) @@ -588,7 +588,7 @@ fn inet_ntop[address_family: AddressFamily, address_length: AddressLength](ip_ad return String(StringSlice(ptr=dst.bitcast[c_uchar](), length=i)) -fn _inet_pton(af: c_int, src: UnsafePointer[c_char, mut=False], dst: UnsafePointer[c_void]) -> c_int: +fn _inet_pton(af: c_int, src: LegacyUnsafePointer[c_char, mut=False], dst: LegacyUnsafePointer[c_void]) -> c_int: """Libc POSIX `inet_pton` function. Converts a presentation format address (that is, printable form as held in a character string) to network format (usually a struct in_addr or some other internal binary representation, in network byte order). It returns 1 if the address was valid for the specified address family, or 0 if the address was not parseable in the specified address family, @@ -596,8 +596,8 @@ fn _inet_pton(af: c_int, src: UnsafePointer[c_char, mut=False], dst: UnsafePoint Args: af: Address Family: `AF_INET` or `AF_INET6`. - src: A UnsafePointer to a string containing the address. - dst: A UnsafePointer to a buffer to store the result. + src: A LegacyUnsafePointer to a string containing the address. + dst: A LegacyUnsafePointer to a buffer to store the result. Returns: 1 on success, 0 if the input is not a valid address, -1 on error. @@ -614,8 +614,8 @@ fn _inet_pton(af: c_int, src: UnsafePointer[c_char, mut=False], dst: UnsafePoint "inet_pton", c_int, c_int, - UnsafePointer[c_char, mut=False], - UnsafePointer[c_void], + LegacyUnsafePointer[c_char, mut=False], + LegacyUnsafePointer[c_void], ](af, src, dst) @@ -627,7 +627,7 @@ fn inet_pton[address_family: AddressFamily](var src: String) raises -> c_uint: address_family: Address Family: `AF_INET` or `AF_INET6`. Args: - src: A UnsafePointer to a string containing the address. + src: A LegacyUnsafePointer to a string containing the address. Returns: The binary representation of the ip address. @@ -648,7 +648,7 @@ fn inet_pton[address_family: AddressFamily](var src: String) raises -> c_uint: address_family in [AddressFamily.AF_INET, AddressFamily.AF_INET6], "Address family must be either AF_INET or AF_INET6.", ]() - var ip_buffer: UnsafePointer[c_void] + var ip_buffer: LegacyUnsafePointer[c_void] @parameter if address_family == AddressFamily.AF_INET6: @@ -656,7 +656,7 @@ fn inet_pton[address_family: AddressFamily](var src: String) raises -> c_uint: else: ip_buffer = stack_allocation[4, c_void]() - var result = _inet_pton(address_family.value, src.unsafe_cstr_ptr().origin_cast[False](), ip_buffer) + var result = _inet_pton(address_family.value, src.unsafe_cstr_ptr(), ip_buffer) if result == 0: raise Error("inet_pton Error: The input is not a valid address.") elif result == -1: @@ -755,7 +755,7 @@ fn socket(domain: c_int, type: c_int, protocol: c_int) raises -> c_int: fn _setsockopt[ - origin: ImmutableOrigin + origin: ImmutOrigin ]( socket: c_int, level: c_int, @@ -806,7 +806,7 @@ fn setsockopt( socket: A File Descriptor. level: The protocol level. option_name: The option to set. - option_value: A UnsafePointer to the value to set. + option_value: A LegacyUnsafePointer to the value to set. Raises: Error: If an error occurs while setting the socket option. @@ -849,7 +849,7 @@ fn _getsockopt[ socket: c_int, level: c_int, option_name: c_int, - option_value: UnsafePointer[c_void, mut=False], + option_value: LegacyUnsafePointer[c_void, mut=False], option_len: Pointer[socklen_t, len_origin], ) -> c_int: """Libc POSIX `setsockopt` function. @@ -878,7 +878,7 @@ fn _getsockopt[ c_int, c_int, c_int, - UnsafePointer[c_void, mut=False], + LegacyUnsafePointer[c_void, mut=False], Pointer[socklen_t, len_origin], # Args ](socket, level, option_name, option_value, option_len) @@ -939,13 +939,13 @@ fn getsockopt( fn _getsockname[ origin: Origin -](socket: c_int, address: UnsafePointer[sockaddr], address_len: Pointer[socklen_t, origin],) -> c_int: +](socket: c_int, address: LegacyUnsafePointer[sockaddr], address_len: Pointer[socklen_t, origin],) -> c_int: """Libc POSIX `getsockname` function. Args: socket: A File Descriptor. - address: A UnsafePointer to a buffer to store the address of the peer. - address_len: A UnsafePointer to the size of the buffer. + address: A LegacyUnsafePointer to a buffer to store the address of the peer. + address_len: A LegacyUnsafePointer to the size of the buffer. Returns: 0 on success, -1 on error. @@ -962,20 +962,20 @@ fn _getsockname[ "getsockname", c_int, # FnName, RetType c_int, - UnsafePointer[sockaddr], + LegacyUnsafePointer[sockaddr], Pointer[socklen_t, origin], # Args ](socket, address, address_len) fn getsockname[ origin: Origin -](socket: c_int, address: UnsafePointer[sockaddr], address_len: Pointer[socklen_t, origin],) raises: +](socket: c_int, address: LegacyUnsafePointer[sockaddr], address_len: Pointer[socklen_t, origin],) raises: """Libc POSIX `getsockname` function. Args: socket: A File Descriptor. - address: A UnsafePointer to a buffer to store the address of the peer. - address_len: A UnsafePointer to the size of the buffer. + address: A LegacyUnsafePointer to a buffer to store the address of the peer. + address_len: A LegacyUnsafePointer to the size of the buffer. Raises: Error: If an error occurs while getting the socket name. @@ -1014,13 +1014,13 @@ fn getsockname[ fn _getpeername[ origin: Origin -](sockfd: c_int, addr: UnsafePointer[sockaddr], address_len: Pointer[socklen_t, origin],) -> c_int: +](sockfd: c_int, addr: LegacyUnsafePointer[sockaddr], address_len: Pointer[socklen_t, origin],) -> c_int: """Libc POSIX `getpeername` function. Args: sockfd: A File Descriptor. - addr: A UnsafePointer to a buffer to store the address of the peer. - address_len: A UnsafePointer to the size of the buffer. + addr: A LegacyUnsafePointer to a buffer to store the address of the peer. + address_len: A LegacyUnsafePointer to the size of the buffer. Returns: 0 on success, -1 on error. @@ -1037,7 +1037,7 @@ fn _getpeername[ "getpeername", c_int, # FnName, RetType c_int, - UnsafePointer[sockaddr], + LegacyUnsafePointer[sockaddr], Pointer[socklen_t, origin], # Args ](sockfd, addr, address_len) @@ -1091,14 +1091,14 @@ fn getpeername(file_descriptor: c_int) raises -> sockaddr_in: fn _bind[ - origin: ImmutableOrigin + origin: ImmutOrigin ](socket: c_int, address: Pointer[sockaddr_in, origin], address_len: socklen_t) -> c_int: """Libc POSIX `bind` function. Assigns the address specified by `address` to the socket referred to by the file descriptor `socket`. Args: socket: A File Descriptor. - address: A UnsafePointer to the address to bind to. + address: A LegacyUnsafePointer to the address to bind to. address_len: The size of the address. Returns: @@ -1120,7 +1120,7 @@ fn bind(socket: c_int, address: sockaddr_in) raises: Args: socket: A File Descriptor. - address: A UnsafePointer to the address to bind to. + address: A LegacyUnsafePointer to the address to bind to. Raises: Error: If an error occurs while binding the socket. @@ -1249,14 +1249,14 @@ fn listen(socket: c_int, backlog: c_int) raises: fn _accept[ - address_origin: MutableOrigin, len_origin: Origin + address_origin: MutOrigin, len_origin: Origin ](socket: c_int, address: Pointer[sockaddr, address_origin], address_len: Pointer[socklen_t, len_origin],) -> c_int: """Libc POSIX `accept` function. Args: socket: A File Descriptor. - address: A UnsafePointer to a buffer to store the address of the peer. - address_len: A UnsafePointer to the size of the buffer. + address: A LegacyUnsafePointer to a buffer to store the address of the peer. + address_len: A LegacyUnsafePointer to the size of the buffer. Returns: A File Descriptor or -1 in case of failure. @@ -1357,12 +1357,12 @@ fn accept(socket: c_int) raises -> c_int: fn _connect[ - origin: ImmutableOrigin + origin: ImmutOrigin ](socket: c_int, address: Pointer[sockaddr_in, origin], address_len: socklen_t) -> c_int: """Libc POSIX `connect` function. Args: socket: A File Descriptor. - address: A UnsafePointer to the address to connect to. + address: A LegacyUnsafePointer to the address to connect to. address_len: The size of the address. Returns: 0 on success, -1 on error. @@ -1460,7 +1460,7 @@ fn connect(socket: c_int, address: sockaddr_in) raises: fn _recv( socket: c_int, - buffer: UnsafePointer[UInt8], + buffer: LegacyUnsafePointer[UInt8], length: c_size_t, flags: c_int, ) -> c_ssize_t: @@ -1468,7 +1468,7 @@ fn _recv( Args: socket: A File Descriptor. - buffer: A UnsafePointer to the buffer to store the received data. + buffer: A LegacyUnsafePointer to the buffer to store the received data. length: The size of the buffer. flags: Flags to control the behaviour of the function. @@ -1487,7 +1487,7 @@ fn _recv( "recv", c_ssize_t, # FnName, RetType c_int, - UnsafePointer[UInt8], + LegacyUnsafePointer[UInt8], c_size_t, c_int, # Args ](socket, buffer, length, flags) @@ -1495,15 +1495,15 @@ fn _recv( fn recv( socket: c_int, - buffer: UnsafePointer[UInt8], + buffer: LegacyUnsafePointer[UInt8], length: c_size_t, flags: c_int, -) raises -> c_ssize_t: +) raises -> c_size_t: """Libc POSIX `recv` function. Args: socket: A File Descriptor. - buffer: A UnsafePointer to the buffer to store the received data. + buffer: A LegacyUnsafePointer to the buffer to store the received data. length: The size of the buffer. flags: Flags to control the behaviour of the function. @@ -1549,17 +1549,17 @@ fn recv( + String(errno) ) - return result + return UInt(result) fn _recvfrom[ origin: Origin ]( socket: c_int, - buffer: UnsafePointer[c_void], + buffer: LegacyUnsafePointer[c_void], length: c_size_t, flags: c_int, - address: UnsafePointer[sockaddr], + address: LegacyUnsafePointer[sockaddr], address_len: Pointer[socklen_t, origin], ) -> c_ssize_t: """Libc POSIX `recvfrom` function. @@ -1594,20 +1594,20 @@ fn _recvfrom[ "recvfrom", c_ssize_t, c_int, - UnsafePointer[c_void], + LegacyUnsafePointer[c_void], c_size_t, c_int, - UnsafePointer[sockaddr], + LegacyUnsafePointer[sockaddr], Pointer[socklen_t, origin], ](socket, buffer, length, flags, address, address_len) fn recvfrom( socket: c_int, - buffer: UnsafePointer[c_void], + buffer: LegacyUnsafePointer[c_void], length: c_size_t, flags: c_int, - address: UnsafePointer[sockaddr], + address: LegacyUnsafePointer[sockaddr], ) raises -> c_size_t: """Libc POSIX `recvfrom` function. @@ -1664,19 +1664,19 @@ fn recvfrom( elif errno == ENOMEM: raise "ReceiveError: Insufficient memory was available to fulfill the request." else: - raise "ReceiveError: An error occurred while attempting to receive data from the socket. Error code: " + String( + raise Error("ReceiveError: An error occurred while attempting to receive data from the socket. Error code: " + String( errno - ) + )) - return result + return UInt(result) -fn _send(socket: c_int, buffer: UnsafePointer[c_void, mut=False], length: c_size_t, flags: c_int) -> c_ssize_t: +fn _send(socket: c_int, buffer: LegacyUnsafePointer[c_void, mut=False], length: c_size_t, flags: c_int) -> c_ssize_t: """Libc POSIX `send` function. Args: socket: A File Descriptor. - buffer: A UnsafePointer to the buffer to send. + buffer: A LegacyUnsafePointer to the buffer to send. length: The size of the buffer. flags: Flags to control the behaviour of the function. @@ -1694,12 +1694,12 @@ fn _send(socket: c_int, buffer: UnsafePointer[c_void, mut=False], length: c_size return external_call["send", c_ssize_t](socket, buffer, length, flags) -fn send(socket: c_int, buffer: UnsafePointer[c_void, mut=False], length: c_size_t, flags: c_int) raises -> c_size_t: +fn send(socket: c_int, buffer: LegacyUnsafePointer[c_void, mut=False], length: c_size_t, flags: c_int) raises -> c_size_t: """Libc POSIX `send` function. Args: socket: A File Descriptor. - buffer: A UnsafePointer to the buffer to send. + buffer: A LegacyUnsafePointer to the buffer to send. length: The size of the buffer. flags: Flags to control the behaviour of the function. @@ -1793,15 +1793,15 @@ fn send(socket: c_int, buffer: UnsafePointer[c_void, mut=False], length: c_size_ + String(errno) ) - return result + return UInt(result) fn _sendto( socket: c_int, - message: UnsafePointer[c_void, mut=False], + message: LegacyUnsafePointer[c_void, mut=False], length: c_size_t, flags: c_int, - dest_addr: UnsafePointer[sockaddr, mut=False], + dest_addr: LegacyUnsafePointer[sockaddr, mut=False], dest_len: socklen_t, ) -> c_ssize_t: """Libc POSIX `sendto` function @@ -1835,20 +1835,20 @@ fn _sendto( "sendto", c_ssize_t, c_int, - UnsafePointer[c_void, mut=False], + LegacyUnsafePointer[c_void, mut=False], c_size_t, c_int, - UnsafePointer[sockaddr, mut=False], + LegacyUnsafePointer[sockaddr, mut=False], socklen_t, ](socket, message, length, flags, dest_addr, dest_len) fn sendto( socket: c_int, - message: UnsafePointer[c_void], + message: LegacyUnsafePointer[c_void], length: c_size_t, flags: c_int, - dest_addr: UnsafePointer[sockaddr], + dest_addr: LegacyUnsafePointer[sockaddr], ) raises -> c_size_t: """Libc POSIX `sendto` function. @@ -1943,11 +1943,11 @@ fn sendto( elif errno == ENAMETOOLONG: raise "SendToError (ENAMETOOLONG): The length of a pathname exceeds `PATH_MAX`, or pathname resolution of a symbolic link produced an intermediate result with a length that exceeds `PATH_MAX`." else: - raise "SendToError: An error occurred while attempting to send data to the socket. Error code: " + String( + raise Error("SendToError: An error occurred while attempting to send data to the socket. Error code: " + String( errno - ) + )) - return result + return UInt(result) fn _shutdown(socket: c_int, how: c_int) -> c_int: @@ -2017,14 +2017,14 @@ fn shutdown(socket: c_int, how: c_int) raises: ) -fn gai_strerror(ecode: c_int) -> UnsafePointer[c_char, mut=False]: +fn gai_strerror(ecode: c_int) -> UnsafePointer[mut=True, c_char, MutAnyOrigin]: """Libc POSIX `gai_strerror` function. Args: ecode: The error code. Returns: - A UnsafePointer to a string describing the error. + An UnsafePointer to a string describing the error. #### C Function ```c @@ -2034,7 +2034,7 @@ fn gai_strerror(ecode: c_int) -> UnsafePointer[c_char, mut=False]: #### Notes: * Reference: https://man7.org/linux/man-pages/man3/gai_strerror.3p.html . """ - return external_call["gai_strerror", UnsafePointer[c_char, mut=False], c_int](ecode) + return external_call["gai_strerror", UnsafePointer[mut=True, c_char, MutAnyOrigin], c_int](ecode) # --- ( File Related Syscalls & Structs )--------------------------------------- @@ -2117,10 +2117,11 @@ fn get_errno() -> c_int: """ @parameter - if CompilationTarget.is_windows(): + if CompilationTarget.is_linux(): + return external_call["__errno_location", LegacyUnsafePointer[c_int]]()[] + elif CompilationTarget.is_macos(): + return external_call["__error", LegacyUnsafePointer[c_int]]()[] + else: var errno = stack_allocation[1, c_int]() _ = external_call["_get_errno", c_void](errno) return errno[] - else: - alias loc = "__error" if CompilationTarget.is_macos() else "__errno_location" - return external_call[loc, UnsafePointer[c_int]]()[] diff --git a/lightbug_http/_owning_list.mojo b/lightbug_http/_owning_list.mojo index f963e5df..93a27c61 100644 --- a/lightbug_http/_owning_list.mojo +++ b/lightbug_http/_owning_list.mojo @@ -2,7 +2,7 @@ from os import abort from sys import size_of from sys.intrinsics import _type_is_eq -from memory import Pointer, UnsafePointer, memcpy, Span +from memory import Pointer, LegacyUnsafePointer, memcpy, Span from collections import Optional @@ -70,7 +70,7 @@ struct OwningList[T: Movable](Movable, Sized, Boolable): """ # Fields - var data: UnsafePointer[T] + var data: LegacyUnsafePointer[T] """The underlying storage for the list.""" var size: Int """The number of elements in the list.""" @@ -83,7 +83,7 @@ struct OwningList[T: Movable](Movable, Sized, Boolable): fn __init__(out self): """Constructs an empty list.""" - self.data = UnsafePointer[T]() + self.data = LegacyUnsafePointer[T]() self.size = 0 self.capacity = 0 @@ -93,7 +93,7 @@ struct OwningList[T: Movable](Movable, Sized, Boolable): Args: capacity: The requested capacity of the list. """ - self.data = UnsafePointer[T].alloc(capacity) + self.data = LegacyUnsafePointer[T].alloc(capacity) self.size = 0 self.capacity = capacity @@ -135,7 +135,7 @@ struct OwningList[T: Movable](Movable, Sized, Boolable): return True return False - fn __iter__(ref self) -> _OwningListIter[T, __origin_of(self)]: + fn __iter__(ref self) -> _OwningListIter[T, origin_of(self)]: """Iterate over elements of the list, returning immutable references. Returns: @@ -240,7 +240,7 @@ struct OwningList[T: Movable](Movable, Sized, Boolable): return len(self) * size_of[T]() fn _realloc(mut self, new_capacity: Int): - var new_data = UnsafePointer[T].alloc(new_capacity) + var new_data = LegacyUnsafePointer[T].alloc(new_capacity) _move_pointee_into_many_elements( dest=new_data, @@ -449,14 +449,14 @@ struct OwningList[T: Movable](Movable, Sized, Boolable): (self.data + i).destroy_pointee() self.size = 0 - fn steal_data(mut self) -> UnsafePointer[T]: + fn steal_data(mut self) -> LegacyUnsafePointer[T]: """Take ownership of the underlying pointer from the list. Returns: The underlying data. """ var ptr = self.data - self.data = UnsafePointer[T]() + self.data = LegacyUnsafePointer[T]() self.size = 0 self.capacity = 0 return ptr @@ -486,11 +486,11 @@ struct OwningList[T: Movable](Movable, Sized, Boolable): return (self.data + normalized_idx)[] @always_inline - fn unsafe_ptr(self) -> UnsafePointer[T]: + fn unsafe_ptr(self) -> LegacyUnsafePointer[T]: """Retrieves a pointer to the underlying memory. Returns: - The UnsafePointer to the underlying memory. + The LegacyUnsafePointer to the underlying memory. """ return self.data @@ -499,7 +499,7 @@ fn _clip(value: Int, start: Int, end: Int) -> Int: return max(start, min(value, end)) -fn _move_pointee_into_many_elements[T: Movable](dest: UnsafePointer[T], src: UnsafePointer[T], size: Int): +fn _move_pointee_into_many_elements[T: Movable](dest: LegacyUnsafePointer[T], src: LegacyUnsafePointer[T], size: Int): for i in range(size): (dest + i).init_pointee_move_from(src + i) # (src + i).move_pointee_into(dest + i) diff --git a/lightbug_http/address.mojo b/lightbug_http/address.mojo index 36b874ea..11c4e187 100644 --- a/lightbug_http/address.mojo +++ b/lightbug_http/address.mojo @@ -1,4 +1,4 @@ -from memory import UnsafePointer, Span +from memory import LegacyUnsafePointer, Span from collections import Optional from sys.ffi import external_call from lightbug_http.strings import to_string @@ -131,8 +131,8 @@ struct NetworkType(EqualityComparable, Movable, ImplicitlyCopyable): return self in (NetworkType.tcp6, NetworkType.udp6, NetworkType.ip6) -@fieldwise_init -struct TCPAddr[network: NetworkType = NetworkType.tcp4](Addr, ImplicitlyCopyable): +# @fieldwise_init +struct TCPAddr[Network: NetworkType = NetworkType.tcp4](Addr, ImplicitlyCopyable): alias _type = "TCPAddr" var ip: String var port: UInt16 @@ -148,27 +148,27 @@ struct TCPAddr[network: NetworkType = NetworkType.tcp4](Addr, ImplicitlyCopyable self.port = port self.zone = "" - fn __init__(out self, network: NetworkType, ip: String, port: UInt16, zone: String = ""): + fn __init__(out self, ip: String, port: UInt16, zone: String): self.ip = ip self.port = port self.zone = zone @always_inline fn address_family(self) -> Int: - if network == NetworkType.tcp4: + if Network == NetworkType.tcp4: return Int(AddressFamily.AF_INET.value) - elif network == NetworkType.tcp6: + elif Network == NetworkType.tcp6: return Int(AddressFamily.AF_INET6.value) else: return Int(AddressFamily.AF_UNSPEC.value) @always_inline fn is_v4(self) -> Bool: - return network == NetworkType.tcp4 + return Network == NetworkType.tcp4 @always_inline fn is_v6(self) -> Bool: - return network == NetworkType.tcp6 + return Network == NetworkType.tcp6 @always_inline fn is_unix(self) -> Bool: @@ -193,7 +193,7 @@ struct TCPAddr[network: NetworkType = NetworkType.tcp4](Addr, ImplicitlyCopyable @fieldwise_init -struct UDPAddr[network: NetworkType = NetworkType.udp4](Addr, ImplicitlyCopyable): +struct UDPAddr[Network: NetworkType = NetworkType.udp4](Addr, ImplicitlyCopyable): alias _type = "UDPAddr" var ip: String var port: UInt16 @@ -209,27 +209,22 @@ struct UDPAddr[network: NetworkType = NetworkType.udp4](Addr, ImplicitlyCopyable self.port = port self.zone = "" - fn __init__(out self, network: NetworkType, ip: String, port: UInt16): - self.ip = ip - self.port = port - self.zone = "" - @always_inline fn address_family(self) -> Int: - if network == NetworkType.tcp4: + if Network == NetworkType.udp4: return Int(AddressFamily.AF_INET.value) - elif network == NetworkType.tcp6: + elif Network == NetworkType.udp6: return Int(AddressFamily.AF_INET6.value) else: return Int(AddressFamily.AF_UNSPEC.value) @always_inline fn is_v4(self) -> Bool: - return network == NetworkType.udp4 + return Network == NetworkType.udp4 @always_inline fn is_v6(self) -> Bool: - return network == NetworkType.udp6 + return Network == NetworkType.udp6 @always_inline fn is_unix(self) -> Bool: @@ -266,9 +261,9 @@ struct addrinfo_macos(AnAddrInfo): var ai_socktype: c_int var ai_protocol: c_int var ai_addrlen: socklen_t - var ai_canonname: UnsafePointer[c_char] - var ai_addr: UnsafePointer[sockaddr] - var ai_next: OpaquePointer + var ai_canonname: UnsafePointer[c_char, MutOrigin.external] + var ai_addr: UnsafePointer[sockaddr, MutOrigin.external] + var ai_next: LegacyOpaquePointer fn __init__( out self, @@ -283,9 +278,9 @@ struct addrinfo_macos(AnAddrInfo): self.ai_socktype = ai_socktype self.ai_protocol = ai_protocol self.ai_addrlen = ai_addrlen - self.ai_canonname = UnsafePointer[c_char]() - self.ai_addr = UnsafePointer[sockaddr]() - self.ai_next = OpaquePointer() + self.ai_canonname = {} + self.ai_addr = {} + self.ai_next = {} fn get_ip_address(self, host: String) raises -> in_addr: """Returns an IP address based on the host. @@ -297,7 +292,7 @@ struct addrinfo_macos(AnAddrInfo): Returns: The IP address. """ - var result = UnsafePointer[Self]() + var result = UnsafePointer[Self, MutOrigin.external]() var hints = Self(ai_flags=0, ai_family=AddressFamily.AF_INET.value, ai_socktype=SOCK_STREAM, ai_protocol=0) try: getaddrinfo(host, String(), hints, result) @@ -326,9 +321,9 @@ struct addrinfo_unix(AnAddrInfo): var ai_socktype: c_int var ai_protocol: c_int var ai_addrlen: socklen_t - var ai_addr: UnsafePointer[sockaddr] - var ai_canonname: UnsafePointer[c_char] - var ai_next: OpaquePointer + var ai_addr: UnsafePointer[sockaddr, MutOrigin.external] + var ai_canonname: UnsafePointer[c_char, MutOrigin.external] + var ai_next: LegacyOpaquePointer fn __init__( out self, @@ -343,9 +338,9 @@ struct addrinfo_unix(AnAddrInfo): self.ai_socktype = ai_socktype self.ai_protocol = ai_protocol self.ai_addrlen = ai_addrlen - self.ai_addr = UnsafePointer[sockaddr]() - self.ai_canonname = UnsafePointer[c_char]() - self.ai_next = OpaquePointer() + self.ai_addr = {} + self.ai_canonname = {} + self.ai_next = {} fn get_ip_address(self, host: String) raises -> in_addr: """Returns an IP address based on the host. @@ -357,7 +352,7 @@ struct addrinfo_unix(AnAddrInfo): Returns: The IP address. """ - var result = UnsafePointer[Self]() + var result = UnsafePointer[Self, MutOrigin.external]() var hints = Self(ai_flags=0, ai_family=AddressFamily.AF_INET.value, ai_socktype=SOCK_STREAM, ai_protocol=0) try: getaddrinfo(host, String(), hints, result) @@ -390,8 +385,8 @@ fn is_ipv6(network: NetworkType) -> Bool: fn parse_ipv6_bracketed_address[ - origin: ImmutableOrigin -](address: StringSlice[origin]) raises -> (StringSlice[origin], UInt16): + origin: ImmutOrigin +](address: StringSlice[origin]) raises -> Tuple[StringSlice[origin], UInt16]: """Parse an IPv6 address enclosed in brackets. Returns: @@ -415,7 +410,7 @@ fn parse_ipv6_bracketed_address[ fn validate_no_brackets[ - origin: ImmutableOrigin + origin: ImmutOrigin ](address: StringSlice[origin], start_idx: UInt16, end_idx: Optional[UInt16] = None) raises: """Validate that the address segment contains no brackets.""" var segment: StringSlice[origin] @@ -431,7 +426,7 @@ fn validate_no_brackets[ raise Error("unexpected ']' in address") -fn parse_port[origin: ImmutableOrigin](port_str: StringSlice[origin]) raises -> UInt16: +fn parse_port[origin: ImmutOrigin](port_str: StringSlice[origin]) raises -> UInt16: """Parse and validate port number.""" if port_str == AddressConstants.EMPTY: raise MissingPortError @@ -443,7 +438,7 @@ fn parse_port[origin: ImmutableOrigin](port_str: StringSlice[origin]) raises -> return UInt16(port) -fn parse_address[origin: ImmutableOrigin](network: NetworkType, address: StringSlice[origin]) raises -> (String, UInt16): +fn parse_address[origin: ImmutOrigin](network: NetworkType, address: StringSlice[origin]) raises -> Tuple[String, UInt16]: """Parse an address string into a host and port. Args: @@ -551,12 +546,12 @@ fn binary_ip_to_string[address_family: AddressFamily](var ip_address: UInt32) ra fn _getaddrinfo[ - T: AnAddrInfo, hints_origin: ImmutableOrigin, result_origin: MutableOrigin, // + T: AnAddrInfo, node_origin: ImmutOrigin, serv_origin: ImmutOrigin, hints_origin: ImmutOrigin, result_origin: MutOrigin, // ]( - nodename: UnsafePointer[c_char, mut=False], - servname: UnsafePointer[c_char, mut=False], + nodename: UnsafePointer[mut=False, c_char, node_origin], + servname: UnsafePointer[mut=False, c_char, serv_origin], hints: Pointer[T, hints_origin], - res: Pointer[UnsafePointer[T], result_origin], + res: Pointer[UnsafePointer[T, MutOrigin.external], result_origin], ) -> c_int: """Libc POSIX `getaddrinfo` function. @@ -564,7 +559,7 @@ fn _getaddrinfo[ nodename: The node name. servname: The service name. hints: A Pointer to the hints. - res: A UnsafePointer to the result. + res: A LegacyUnsafePointer to the result. Returns: 0 on success, an error code on failure. @@ -579,24 +574,20 @@ fn _getaddrinfo[ """ return external_call[ "getaddrinfo", - c_int, # FnName, RetType - UnsafePointer[c_char, mut=False], - UnsafePointer[c_char, mut=False], - Pointer[T, hints_origin], # Args - Pointer[UnsafePointer[T], result_origin], # Args + c_int, ](nodename, servname, hints, res) fn getaddrinfo[ T: AnAddrInfo, // -](var node: String, var service: String, hints: T, mut res: UnsafePointer[T]) raises: +](var node: String, var service: String, hints: T, mut res: UnsafePointer[T, MutOrigin.external]) raises: """Libc POSIX `getaddrinfo` function. Args: node: The node name. service: The service name. hints: A Pointer to the hints. - res: A UnsafePointer to the result. + res: A LegacyUnsafePointer to the result. Raises: Error: If an error occurs while attempting to receive data from the socket. @@ -619,23 +610,16 @@ fn getaddrinfo[ * Reference: https://man7.org/linux/man-pages/man3/getaddrinfo.3p.html. """ var result = _getaddrinfo( - node.unsafe_cstr_ptr().origin_cast[False](), - service.unsafe_cstr_ptr().origin_cast[False](), + node.unsafe_cstr_ptr(), + service.unsafe_cstr_ptr(), Pointer(to=hints), Pointer(to=res), ) - if result != 0: - # gai_strerror returns a char buffer that we don't know the length of. - var err = gai_strerror(result) - var msg = String() - var i = 0 - while err[i] != 0: - i += 1 - msg.write_bytes(Span[Byte, __origin_of(err)](ptr=err.bitcast[c_uchar](), length=i)) - raise Error("getaddrinfo: ", msg) + if result != 0: + raise Error("getaddrinfo: ", String(gai_strerror(result))) fn freeaddrinfo[T: AnAddrInfo, //](ptr: UnsafePointer[T]): """Free the memory allocated by `getaddrinfo`.""" - external_call["freeaddrinfo", NoneType, UnsafePointer[T]](ptr) + external_call["freeaddrinfo", NoneType](ptr) diff --git a/lightbug_http/connection.mojo b/lightbug_http/connection.mojo index cf519d05..1d499417 100644 --- a/lightbug_http/connection.mojo +++ b/lightbug_http/connection.mojo @@ -29,10 +29,10 @@ alias default_tcp_keep_alive = Duration(15 * 1000 * 1000 * 1000) # 15 seconds trait Connection(Movable): - fn read(self, mut buf: Bytes) raises -> Int: + fn read(self, mut buf: Bytes) raises -> UInt: ... - fn write(self, buf: Span[Byte]) raises -> Int: + fn write(self, buf: Span[Byte]) raises -> UInt: ... fn close(mut self) raises: @@ -88,8 +88,8 @@ struct ListenConfig: self._keep_alive = keep_alive fn listen[network: NetworkType = NetworkType.tcp4](mut self, address: String) raises -> NoTLSListener: - var local = parse_address[__origin_of(address)](network, address) - var addr = TCPAddr(String(local[0]), local[1]) + var local = parse_address[origin_of(address)](network, address) + var addr = TCPAddr(ip=String(local[0]), port=local[1]) var socket: Socket[TCPAddr] try: socket = Socket[TCPAddr]() @@ -148,7 +148,7 @@ struct TCPConnection(Connection): fn __moveinit__(out self, deinit existing: Self): self.socket = existing.socket^ - fn read(self, mut buf: Bytes) raises -> Int: + fn read(self, mut buf: Bytes) raises -> UInt: try: return self.socket.receive(buf) except e: @@ -158,7 +158,7 @@ struct TCPConnection(Connection): logger.error(e) raise Error("TCPConnection.read: Failed to read data from connection.") - fn write(self, buf: Span[Byte]) raises -> Int: + fn write(self, buf: Span[Byte]) raises -> UInt: try: return self.socket.send(buf) except e: @@ -194,7 +194,7 @@ struct UDPConnection[network: NetworkType]: fn __moveinit__(out self, deinit existing: Self): self.socket = existing.socket^ - fn read_from(mut self, size: Int = default_buffer_size) raises -> (Bytes, String, UInt16): + fn read_from(mut self, size: Int = default_buffer_size) raises -> Tuple[Bytes, String, UInt16]: """Reads data from the underlying file descriptor. Args: @@ -208,7 +208,7 @@ struct UDPConnection[network: NetworkType]: """ return self.socket.receive_from(size) - fn read_from(mut self, mut dest: Bytes) raises -> (UInt, String, UInt16): + fn read_from(mut self, mut dest: Bytes) raises -> Tuple[UInt, String, UInt16]: """Reads data from the underlying file descriptor. Args: @@ -222,7 +222,7 @@ struct UDPConnection[network: NetworkType]: """ return self.socket.receive_from(dest) - fn write_to(mut self, src: Span[Byte], address: UDPAddr) raises -> Int: + fn write_to(mut self, src: Span[Byte], address: UDPAddr) raises -> UInt: """Writes data to the underlying file descriptor. Args: @@ -237,7 +237,7 @@ struct UDPConnection[network: NetworkType]: """ return self.socket.send_to(src, address.ip, address.port) - fn write_to(mut self, src: Span[Byte], host: String, port: UInt16) raises -> Int: + fn write_to(mut self, src: Span[Byte], host: String, port: UInt16) raises -> UInt: """Writes data to the underlying file descriptor. Args: diff --git a/lightbug_http/external/small_time/c.mojo b/lightbug_http/external/small_time/c.mojo index 7a3b8277..052a0fb3 100644 --- a/lightbug_http/external/small_time/c.mojo +++ b/lightbug_http/external/small_time/c.mojo @@ -2,7 +2,7 @@ # https://github.com/thatstoasty/small-time/ from sys import external_call from sys.ffi import c_uchar -from memory import UnsafePointer, Pointer, stack_allocation +from memory import LegacyUnsafePointer, Pointer, stack_allocation @register_passable("trivial") @@ -94,7 +94,7 @@ fn localtime(var tv_sec: Int) -> Tm: Returns: Broken down local time. """ - return external_call["localtime", UnsafePointer[Tm]](UnsafePointer(to=tv_sec)).take_pointee() + return external_call["localtime", LegacyUnsafePointer[Tm]](LegacyUnsafePointer(to=tv_sec)).take_pointee() fn strptime(time_str: String, time_format: String) -> Tm: @@ -108,7 +108,7 @@ fn strptime(time_str: String, time_format: String) -> Tm: Broken down time. """ var tm = stack_allocation[1, Tm]() - _ = external_call["strptime", NoneType, UnsafePointer[c_uchar], UnsafePointer[c_uchar], UnsafePointer[Tm]]( + _ = external_call["strptime", NoneType, LegacyUnsafePointer[c_uchar], LegacyUnsafePointer[c_uchar], LegacyUnsafePointer[Tm]]( time_str.unsafe_ptr(), time_format.unsafe_ptr(), tm ) return tm.take_pointee() @@ -123,4 +123,4 @@ fn gmtime(var tv_sec: Int) -> Tm: Returns: Broken down UTC time. """ - return external_call["gmtime", UnsafePointer[Tm]](Pointer(to=tv_sec)).take_pointee() + return external_call["gmtime", LegacyUnsafePointer[Tm]](Pointer(to=tv_sec)).take_pointee() diff --git a/lightbug_http/header.mojo b/lightbug_http/header.mojo index 53f9e337..5e82d5c8 100644 --- a/lightbug_http/header.mojo +++ b/lightbug_http/header.mojo @@ -83,7 +83,7 @@ struct Headers(Writable, Stringable, Copyable, Movable): except: return 0 - fn parse_raw(mut self, mut r: ByteReader) raises -> (String, String, String, List[String]): + fn parse_raw(mut self, mut r: ByteReader) raises -> Tuple[String, String, String, List[String]]: var first_byte = r.peek() if not first_byte: raise Error("Headers.parse_raw: Failed to read first byte from response header") diff --git a/lightbug_http/http/request.mojo b/lightbug_http/http/request.mojo index 8c59fe10..d1bf936f 100644 --- a/lightbug_http/http/request.mojo +++ b/lightbug_http/http/request.mojo @@ -111,7 +111,7 @@ struct HTTPRequest(Writable, Stringable, Encodable, Movable, Copyable): else: self.headers[HeaderKey.HOST] = uri.host - fn get_body(self) -> StringSlice[__origin_of(self.body_raw)]: + fn get_body(self) -> StringSlice[origin_of(self.body_raw)]: return StringSlice(unsafe_from_utf8=Span(self.body_raw)) fn set_connection_close(mut self): diff --git a/lightbug_http/http/response.mojo b/lightbug_http/http/response.mojo index 327b7db6..65fa2452 100644 --- a/lightbug_http/http/response.mojo +++ b/lightbug_http/http/response.mojo @@ -182,7 +182,7 @@ struct HTTPResponse(Writable, Stringable, Encodable, Sized, Movable): fn __len__(self) -> Int: return len(self.body_raw) - fn get_body(self) -> StringSlice[__origin_of(self.body_raw)]: + fn get_body(self) -> StringSlice[origin_of(self.body_raw)]: return StringSlice(unsafe_from_utf8=Span(self.body_raw)) @always_inline diff --git a/lightbug_http/server.mojo b/lightbug_http/server.mojo index c724bf61..4ca4c360 100644 --- a/lightbug_http/server.mojo +++ b/lightbug_http/server.mojo @@ -24,11 +24,11 @@ struct Server(Movable): var name: String var _address: String - var max_concurrent_connections: UInt - var max_requests_per_connection: UInt + var max_concurrent_connections: Int + var max_requests_per_connection: Int - var _max_request_body_size: UInt - var _max_request_uri_length: UInt + var _max_request_body_size: Int + var _max_request_uri_length: Int var tcp_keep_alive: Bool fn __init__( @@ -36,10 +36,10 @@ struct Server(Movable): error_handler: ErrorHandler = ErrorHandler(), name: String = "lightbug_http", address: String = "127.0.0.1", - max_concurrent_connections: UInt = 1000, - max_requests_per_connection: UInt = 0, - max_request_body_size: UInt = default_max_request_body_size, - max_request_uri_length: UInt = default_max_request_uri_length, + max_concurrent_connections: Int = 1000, + max_requests_per_connection: Int = 0, + max_request_body_size: Int = default_max_request_body_size, + max_request_uri_length: Int = default_max_request_uri_length, tcp_keep_alive: Bool = False, ) raises: self.error_handler = error_handler.copy() @@ -70,19 +70,19 @@ struct Server(Movable): fn set_address(mut self, own_address: String) -> None: self._address = own_address - fn max_request_body_size(self) -> UInt: + fn max_request_body_size(self) -> Int: return self._max_request_body_size - fn set_max_request_body_size(mut self, size: UInt) -> None: + fn set_max_request_body_size(mut self, size: Int) -> None: self._max_request_body_size = size - fn max_request_uri_length(self) -> UInt: + fn max_request_uri_length(self) -> Int: return self._max_request_uri_length - fn set_max_request_uri_length(mut self, length: UInt) -> None: + fn set_max_request_uri_length(mut self, length: Int) -> None: self._max_request_uri_length = length - fn get_concurrency(self) -> UInt: + fn get_concurrency(self) -> Int: """Retrieve the concurrency level which is either the configured `max_concurrent_connections` or the `DefaultConcurrency`. diff --git a/lightbug_http/socket.mojo b/lightbug_http/socket.mojo index 6ec552f8..6fef133f 100644 --- a/lightbug_http/socket.mojo +++ b/lightbug_http/socket.mojo @@ -2,7 +2,7 @@ from memory import stack_allocation from utils import StaticTuple from sys import size_of, external_call from sys.info import CompilationTarget -from memory import Pointer, UnsafePointer +from memory import Pointer, LegacyUnsafePointer from lightbug_http._libc import ( socket, connect, @@ -324,7 +324,7 @@ struct Socket[AddrType: Addr & ImplicitlyCopyable, address_family: AddressFamily var local = self.get_sock_name() self._local_address = AddrType(local[0], local[1]) - fn get_sock_name(self) raises -> (String, UInt16): + fn get_sock_name(self) raises -> Tuple[String, UInt16]: """Return the address of the socket. Returns: @@ -353,7 +353,7 @@ struct Socket[AddrType: Addr & ImplicitlyCopyable, address_family: AddressFamily binary_port_to_int(addr_in.sin_port) ) - fn get_peer_name(self) raises -> (String, UInt16): + fn get_peer_name(self) raises -> Tuple[String, UInt16]: """Return the address of the peer connected to the socket. Returns: @@ -440,9 +440,9 @@ struct Socket[AddrType: Addr & ImplicitlyCopyable, address_family: AddressFamily var remote = self.get_peer_name() self._remote_address = AddrType(remote[0], remote[1]) - fn send(self, buffer: Span[Byte]) raises -> Int: + fn send(self, buffer: Span[Byte]) raises -> UInt: try: - return send(self.fd, buffer.unsafe_ptr(), len(buffer), 0) + return send(self.fd, buffer.unsafe_ptr(), UInt(len(buffer)), 0) except e: logger.error("Socket.send: Failed to write data to connection.") raise e @@ -465,7 +465,7 @@ struct Socket[AddrType: Addr & ImplicitlyCopyable, address_family: AddressFamily if attempts > max_attempts: raise Error("Failed to send message after " + String(max_attempts) + " attempts.") - var sent: Int + var sent: UInt try: sent = self.send(src[total_bytes_sent:]) except e: @@ -476,7 +476,7 @@ struct Socket[AddrType: Addr & ImplicitlyCopyable, address_family: AddressFamily + "bytes before failing." ) - total_bytes_sent += sent + total_bytes_sent += Int(sent) attempts += 1 fn send_to(mut self, src: Span[Byte], address: String, port: UInt16) raises -> UInt: @@ -502,7 +502,7 @@ struct Socket[AddrType: Addr & ImplicitlyCopyable, address_family: AddressFamily ip = addrinfo_unix().get_ip_address(address) var addr = sockaddr_in(address_family=Int(address_family.value), port=port, binary_ip=ip.s_addr) - bytes_sent = sendto(self.fd, src.unsafe_ptr(), len(src), 0, UnsafePointer(to=addr).bitcast[sockaddr]()) + bytes_sent = sendto(self.fd, src.unsafe_ptr(), UInt(len(src)), 0, LegacyUnsafePointer(to=addr).bitcast[sockaddr]()) return bytes_sent @@ -519,16 +519,16 @@ struct Socket[AddrType: Addr & ImplicitlyCopyable, address_family: AddressFamily Error: If reading data from the socket fails. EOF: If 0 bytes are received, return EOF. """ - var bytes_received: Int + var bytes_received: UInt var size = len(buffer) try: bytes_received = recv( self.fd, buffer.unsafe_ptr().offset(size), - buffer.capacity - len(buffer), + UInt(buffer.capacity - len(buffer)), 0, ) - buffer._len += bytes_received + buffer._len += Int(bytes_received) except e: logger.error(e) raise Error("Socket.receive: Failed to read data from connection.") @@ -566,7 +566,7 @@ struct Socket[AddrType: Addr & ImplicitlyCopyable, address_family: AddressFamily """ return self._receive(buffer) - fn _receive_from(self, mut buffer: Bytes) raises -> (UInt, String, UInt16): + fn _receive_from(self, mut buffer: Bytes) raises -> Tuple[UInt, String, UInt16]: """Receive data from the socket into the buffer. Args: @@ -584,9 +584,9 @@ struct Socket[AddrType: Addr & ImplicitlyCopyable, address_family: AddressFamily try: var size = len(buffer) bytes_received = recvfrom( - self.fd, buffer.unsafe_ptr().offset(size), buffer.capacity - len(buffer), 0, remote_address + self.fd, buffer.unsafe_ptr().offset(size), UInt(buffer.capacity - len(buffer)), 0, remote_address ) - buffer._len += bytes_received + buffer._len += Int(bytes_received) except e: logger.error(e) raise Error("Socket._receive_from: Failed to read data from connection.") @@ -601,7 +601,7 @@ struct Socket[AddrType: Addr & ImplicitlyCopyable, address_family: AddressFamily UInt16(binary_port_to_int(addr_in.sin_port)), ) - fn receive_from(mut self, size: Int = default_buffer_size) raises -> (List[Byte], String, UInt16): + fn receive_from(mut self, size: Int = default_buffer_size) raises -> Tuple[List[Byte], String, UInt16]: """Receive data from the socket into the buffer dest. Args: @@ -617,7 +617,7 @@ struct Socket[AddrType: Addr & ImplicitlyCopyable, address_family: AddressFamily _, host, port = self._receive_from(buffer) return buffer^, host, port - fn receive_from(mut self, mut dest: List[Byte]) raises -> (UInt, String, UInt16): + fn receive_from(mut self, mut dest: List[Byte]) raises -> Tuple[UInt, String, UInt16]: """Receive data from the socket into the buffer dest. Args: diff --git a/pixi.lock b/pixi.lock index 15af46c8..07350fb1 100644 --- a/pixi.lock +++ b/pixi.lock @@ -11,153 +11,158 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - 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-2025.10.5-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.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/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.44-h1aa0949_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.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.1-hecca717_0.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/libffi-3.5.2-h9ec8514_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - 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.50.4-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_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-25.6.1-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.6.1-release.conda + - conda: https://conda.modular.com/max/noarch/mblack-25.7.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.7.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/patchelf-0.17.2-h58526e2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.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.9-h4df99d1_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.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/rattler-build-0.53.0-he64ecbb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py314h5bd0f2a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-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-2025b-h78e105d_0.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-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.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-h3691f8a_4.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/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-2025.10.5-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.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/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.44-hd32f0e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.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.1-hfae3067_0.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/libffi-3.5.2-hd65408f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - 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.50.4-h022381a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_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-25.6.1-release.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.6.1-release.conda + - conda: https://conda.modular.com/max/noarch/mblack-25.7.0-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.7.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.4-h8e36d6e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/patchelf-0.17.2-h884eca8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.0-hb06a95a_102_cp314.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.9-h4df99d1_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.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/rattler-build-0.53.0-hb434046_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py313he149459_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py314hafb4487_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-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-2025b-h78e105d_0.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-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_2.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-hefd9da6_4.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-2025.10.5-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.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-21.1.4-hf598326_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_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.1-hec049ff_0.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/libffi-3.5.2-he5f378a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - 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.50.4-h4237e3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_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-25.6.1-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.6.1-release.conda + - conda: https://conda.modular.com/max/noarch/mblack-25.7.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.7.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.4-h5503f6c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.0-h40d2674_102_cp314.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.9-h4df99d1_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.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/rattler-build-0.53.0-h8d80559_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313hcdf3177_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py314h0612a62_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-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-2025b-h78e105d_0.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-pyhd8ed1ab_0.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-hd0aec43_4.conda default: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -169,153 +174,158 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - 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-2025.10.5-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.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/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.44-h1aa0949_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.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.1-hecca717_0.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/libffi-3.5.2-h9ec8514_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - 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.50.4-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_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-25.6.1-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.6.1-release.conda + - conda: https://conda.modular.com/max/noarch/mblack-25.7.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.7.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/patchelf-0.17.2-h58526e2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.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.9-h4df99d1_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.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/rattler-build-0.53.0-he64ecbb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py314h5bd0f2a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-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-2025b-h78e105d_0.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-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.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-h3691f8a_4.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/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-2025.10.5-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.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/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.44-hd32f0e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.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.1-hfae3067_0.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/libffi-3.5.2-hd65408f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - 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.50.4-h022381a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_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-25.6.1-release.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.6.1-release.conda + - conda: https://conda.modular.com/max/noarch/mblack-25.7.0-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.7.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.4-h8e36d6e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/patchelf-0.17.2-h884eca8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.0-hb06a95a_102_cp314.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.9-h4df99d1_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.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/rattler-build-0.53.0-hb434046_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py313he149459_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py314hafb4487_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-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-2025b-h78e105d_0.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-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_2.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-hefd9da6_4.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-2025.10.5-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.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-21.1.4-hf598326_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_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.1-hec049ff_0.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/libffi-3.5.2-he5f378a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - 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.50.4-h4237e3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_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-25.6.1-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.6.1-release.conda + - conda: https://conda.modular.com/max/noarch/mblack-25.7.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.7.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.4-h5503f6c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.0-h40d2674_102_cp314.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.9-h4df99d1_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.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/rattler-build-0.53.0-h8d80559_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313hcdf3177_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py314h0612a62_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-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-2025b-h78e105d_0.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-pyhd8ed1ab_0.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-hd0aec43_4.conda integration-tests: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -327,27 +337,27 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - 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-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py313h7033f15_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_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-2025.10.5-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-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/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_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/click-8.3.0-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.3.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.116.2-hf7056cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.13-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.16-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-core-0.116.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.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 - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/httptools-0.7.1-py313h07c4f96_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/httptools-0.7.1-py314h5bd0f2a_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/noarch/idna-3.11-pyhd8ed1ab_0.conda @@ -357,103 +367,105 @@ environments: - 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/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.44-h1aa0949_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.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.1-hecca717_0.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/libffi-3.5.2-h9ec8514_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - 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.50.4-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_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-25.6.1-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda + - conda: https://conda.modular.com/max/noarch/mblack-25.7.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max/linux-64/mojo-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.6.1-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.7.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/patchelf-0.17.2-h58526e2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - 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.3-pyh3cfb1c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.4-py313h843e2db_0.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-py314h2e6c369_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.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.9-hc97d973_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.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.1.1-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.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-gil-3.14.0-h4df99d1_102.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_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/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_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/rattler-build-0.53.0-he64ecbb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.15.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.17.0-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://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.48.0-pyhfdc7a7d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py314h5bd0f2a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.20.0-pyhdb1f59b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.20.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.20.0-h65a100f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.20.0-pyhefaf540_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.20.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.20.0-h4daf872_1.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_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-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.38.0-pyh31011fe_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.38.0-h31011fe_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.22.1-py313h07c4f96_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-15.0.1-py313h54dd161_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.22.1-py314h5bd0f2a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.1.1-py314ha5689aa_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-15.0.1-py314h31f8a6b_2.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-h387f397_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.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/zstandard-0.25.0-py314h0f05182_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-h3691f8a_4.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/noarch/_python_abi3_support-1.0-hd8ed1ab_2.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.11.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py313he352c24_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_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-2025.10.5-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-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/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.0.0-py314h0bd77cf_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/click-8.3.0-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.3.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.116.2-hf7056cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.13-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.16-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-core-0.116.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.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 - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/httptools-0.7.1-py313h6194ac5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/httptools-0.7.1-py314h51f160d_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/noarch/idna-3.11-pyhd8ed1ab_0.conda @@ -463,177 +475,179 @@ environments: - 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/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.44-hd32f0e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.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.1-hfae3067_0.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/libffi-3.5.2-hd65408f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - 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.50.4-h022381a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_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-25.6.1-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda + - conda: https://conda.modular.com/max/noarch/mblack-25.7.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.6.1-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.7.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.4-h8e36d6e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/patchelf-0.17.2-h884eca8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - 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.3-pyh3cfb1c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.41.4-py313h5e7b836_0.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-py314h451b6cc_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.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.9-h4c0d347_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.0-hb06a95a_102_cp314.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.1.1-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.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-gil-3.14.0-h4df99d1_102.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_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/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_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/rattler-build-0.53.0-hb434046_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.15.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.17.0-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://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.48.0-pyhfdc7a7d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py313he149459_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py314hafb4487_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.20.0-pyhdb1f59b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.20.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.20.0-h65a100f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.20.0-pyhefaf540_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.20.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.20.0-h4daf872_1.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_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-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.38.0-pyh31011fe_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.38.0-h31011fe_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvloop-0.22.1-py313h6194ac5_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-15.0.1-py313h62ef0ea_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvloop-0.22.1-py314h51f160d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/watchfiles-1.1.1-py314hfe60d44_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/websockets-15.0.1-py314hc032435_2.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-hefbcea8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.25.0-py313h62ef0ea_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_2.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/zstandard-0.25.0-py314h2e8dab5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.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/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py313hb4b7877_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_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-2025.10.5-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-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/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_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/click-8.3.0-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.3.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.116.2-hf7056cc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.13-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.16-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-core-0.116.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.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 - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/httptools-0.7.1-py313h6535dbc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/httptools-0.7.1-py314h0612a62_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-75.1-hfee45f7_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/jinja2-3.1.6-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-21.1.4-hf598326_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_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.1-hec049ff_0.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/libffi-3.5.2-he5f378a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - 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.50.4-h4237e3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_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/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-25.6.1-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda + - conda: https://conda.modular.com/max/noarch/mblack-25.7.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.6.1-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.7.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.4-h5503f6c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - 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.3-pyh3cfb1c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.4-py313h2c089d5_0.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-py314haad56a0_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.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.9-hfc2f54d_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.0-h40d2674_102_cp314.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.1.1-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.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-gil-3.14.0-h4df99d1_102.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_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/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_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/rattler-build-0.53.0-h8d80559_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.15.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.17.0-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://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.48.0-pyhfdc7a7d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313hcdf3177_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py314h0612a62_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.20.0-pyhdb1f59b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.20.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.20.0-h65a100f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.20.0-pyhefaf540_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.20.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.20.0-h4daf872_1.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_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-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.38.0-pyh31011fe_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.38.0-h31011fe_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.22.1-py313h6535dbc_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-15.0.1-py313h5b5ffa7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.22.1-py314h0612a62_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.1.1-py314h8d4a433_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-15.0.1-py314hf17b0b1_2.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-h888dc83_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.25.0-py313h9734d34_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.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/zstandard-0.25.0-py314h9d33bd4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda unit-tests: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -645,153 +659,158 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - 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-2025.10.5-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.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/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.44-h1aa0949_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.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.1-hecca717_0.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/libffi-3.5.2-h9ec8514_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - 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.50.4-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_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-25.6.1-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.6.1-release.conda + - conda: https://conda.modular.com/max/noarch/mblack-25.7.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.7.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/patchelf-0.17.2-h58526e2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.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.9-h4df99d1_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.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/rattler-build-0.53.0-he64ecbb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py314h5bd0f2a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-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-2025b-h78e105d_0.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-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.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-h3691f8a_4.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/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-2025.10.5-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.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/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.44-hd32f0e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.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.1-hfae3067_0.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/libffi-3.5.2-hd65408f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - 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.50.4-h022381a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_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-25.6.1-release.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.6.1-release.conda + - conda: https://conda.modular.com/max/noarch/mblack-25.7.0-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.7.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.4-h8e36d6e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/patchelf-0.17.2-h884eca8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.0-hb06a95a_102_cp314.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.9-h4df99d1_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.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/rattler-build-0.53.0-hb434046_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py313he149459_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py314hafb4487_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-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-2025b-h78e105d_0.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-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_2.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-hefd9da6_4.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-2025.10.5-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.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-21.1.4-hf598326_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_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.1-hec049ff_0.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/libffi-3.5.2-he5f378a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - 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.50.4-h4237e3c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_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-25.6.1-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.25.6.1-release.conda - - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.6.1-release.conda + - conda: https://conda.modular.com/max/noarch/mblack-25.7.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.25.7.0-release.conda + - conda: https://conda.modular.com/max/noarch/mojo-python-0.25.7.0-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.4-h5503f6c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.0-h40d2674_102_cp314.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.9-h4df99d1_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.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/rattler-build-0.53.0-h8d80559_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313hcdf3177_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py314h0612a62_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-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-2025b-h78e105d_0.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-pyhd8ed1ab_0.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-hd0aec43_4.conda packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 @@ -844,68 +863,67 @@ packages: license_family: MIT size: 18074 timestamp: 1733247158254 -- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda - sha256: 7378b5b9d81662d73a906fabfc2fb81daddffe8dc0680ed9cda7a9562af894b0 - md5: 814472b61da9792fae28156cb9ee54f5 +- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.0-pyhcf101f3_0.conda + sha256: 830fc81970cd9d19869909b9b16d241f4d557e4f201a1030aa6ed87c6aa8b930 + md5: 9958d4a1ee7e9c768fe8f4fb51bd07ea depends: - exceptiongroup >=1.0.2 - idna >=2.8 - python >=3.10 - - sniffio >=1.1 - typing_extensions >=4.5 - python constrains: - - trio >=0.31.0 + - trio >=0.32.0 - uvloop >=0.21 license: MIT license_family: MIT - size: 138159 - timestamp: 1758634638734 -- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py313h7033f15_4.conda - sha256: b1941426e564d326097ded7af8b525540be219be7a88ca961d58a8d4fc116db2 - md5: bc8624c405856b1d047dd0a81829b08c + size: 144702 + timestamp: 1764375386926 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda + sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0 + md5: 8910d2c46f7e7b519129f486e0fe927a depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 constrains: - - libbrotlicommon 1.1.0 hb03c661_4 + - libbrotlicommon 1.2.0 hb03c661_1 license: MIT license_family: MIT - size: 353639 - timestamp: 1756599425945 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py313he352c24_4.conda - sha256: 41f8e857f91fcc0e731dd02d44e8b730750c76dd00bedd0939e25fac7fbf8572 - md5: d5993a664b52718233b0d7d8c72f71aa + size: 367376 + timestamp: 1764017265553 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda + sha256: 5a5b0cdcd7ed89c6a8fb830924967f6314a2b71944bc1ebc2c105781ba97aa75 + md5: a1b5c571a0923a205d663d8678df4792 depends: - libgcc >=14 - libstdcxx >=14 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 constrains: - - libbrotlicommon 1.1.0 he30d5cf_4 + - libbrotlicommon 1.2.0 he30d5cf_1 license: MIT license_family: MIT - size: 358241 - timestamp: 1756599658209 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py313hb4b7877_4.conda - sha256: a6402a7186ace5c3eb21ed4ce50eda3592c44ce38ab4e9a7ddd57d72b1e61fb3 - md5: 9518cd948fc334d66119c16a2106a959 + size: 373193 + timestamp: 1764017486851 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda + sha256: 5c2e471fd262fcc3c5a9d5ea4dae5917b885e0e9b02763dbd0f0d9635ed4cb99 + md5: f9501812fe7c66b6548c7fcaa1c1f252 depends: - __osx >=11.0 - libcxx >=19 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 constrains: - - libbrotlicommon 1.1.0 h6caf38d_4 + - libbrotlicommon 1.2.0 hc919400_1 license: MIT license_family: MIT - size: 341104 - timestamp: 1756600117644 + size: 359854 + timestamp: 1764018178608 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 md5: 51a19bba1b8ebfb60df25cde030b7ebc @@ -934,63 +952,63 @@ packages: license_family: BSD size: 125061 timestamp: 1757437486465 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda - sha256: 3b5ad78b8bb61b6cdc0978a6a99f8dfb2cc789a451378d054698441005ecbdb6 - md5: f9e5fbc24009179e8b0409624691758a +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + sha256: b986ba796d42c9d3265602bc038f6f5264095702dd546c14bc684e60c385e773 + md5: f0991f0f84902f6b6009b4d2350a83aa depends: - __unix license: ISC - size: 155907 - timestamp: 1759649036195 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda - sha256: 955bac31be82592093f6bc006e09822cd13daf52b28643c9a6abd38cd5f4a306 - md5: 257ae203f1d204107ba389607d375ded + size: 152432 + timestamp: 1762967197890 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda + sha256: 083a2bdad892ccf02b352ecab38ee86c3e610ba9a4b11b073ea769d55a115d32 + md5: 96a02a5c1a65470a7e4eedb644c872fd depends: - python >=3.10 license: ISC - size: 160248 - timestamp: 1759648987029 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda - sha256: 2162a91819945c826c6ef5efe379e88b1df0fe9a387eeba23ddcf7ebeacd5bd6 - md5: d0616e7935acab407d1543b28c446f6f + size: 157131 + timestamp: 1762976260320 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda + sha256: c6339858a0aaf5d939e00d345c98b99e4558f285942b27232ac098ad17ac7f8e + md5: cf45f4278afd6f4e6d03eda0f435d527 depends: - __glibc >=2.17,<3.0.a0 - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 - pycparser - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 298357 - timestamp: 1761202966461 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.0.0-py313h897158f_1.conda - sha256: 10f6ca0e48bbed90b252fca49b188df0016b7033a9fcb472479585056fd38433 - md5: 59837145ebd94715f75b0f0aef732d5c + size: 300271 + timestamp: 1761203085220 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.0.0-py314h0bd77cf_1.conda + sha256: 728e55b32bf538e792010308fbe55d26d02903ddc295fbe101167903a123dd6f + md5: f333c475896dbc8b15efd8f7c61154c7 depends: - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 - pycparser - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 316294 - timestamp: 1761203943693 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py313h224173a_1.conda - sha256: 1fa69651f5e81c25d48ac42064db825ed1a3e53039629db69f86b952f5ce603c - md5: 050374657d1c7a4f2ea443c0d0cbd9a0 + size: 318357 + timestamp: 1761203973223 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda + sha256: 5b5ee5de01eb4e4fd2576add5ec9edfc654fbaf9293e7b7ad2f893a67780aa98 + md5: 10dd19e4c797b8f8bdb1ec1fbb6821d7 depends: - __osx >=11.0 - libffi >=3.5.2,<3.6.0a0 - pycparser - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 291376 - timestamp: 1761203583358 + size: 292983 + timestamp: 1761203354051 - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda sha256: b32f8362e885f1b8417bac2b3da4db7323faa12d5db62b7fd6691c02d60d6f59 md5: a22d1fd9bf98827e280a02875d9a007a @@ -1000,26 +1018,26 @@ packages: license_family: MIT size: 50965 timestamp: 1760437331772 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda - sha256: c6567ebc27c4c071a353acaf93eb82bb6d9a6961e40692a359045a89a61d02c0 - md5: e76c4ba9e1837847679421b8d549b784 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda + sha256: 970b12fb186c3451eee9dd0f10235aeb75fb570b0e9dc83250673c2f0b196265 + md5: 9ba00b39e03a0afb2b1cc0767d4c6175 depends: - __unix - python >=3.10 license: BSD-3-Clause license_family: BSD - size: 91622 - timestamp: 1758270534287 -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.9-py313hd8ed1ab_101.conda + size: 92604 + timestamp: 1763248639281 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.conda noarch: generic - sha256: 31da683e8a15e2062adfb29c9fb23d4253550a0b3c9be1cd45530f88796b4644 - md5: 367133808e89325690562099851529c8 + sha256: 8e2a33b36d36820698840bf0c1ed50e5dd4bdeaa434c7b4f5e13d421225b0414 + md5: ff3061d315c4a988fa1c29c543800780 depends: - - python >=3.13,<3.14.0a0 - - python_abi * *_cp313 + - python >=3.14,<3.15.0a0 + - python_abi * *_cp314 license: Python-2.0 - size: 48397 - timestamp: 1761175097707 + size: 49003 + timestamp: 1761175499490 - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda sha256: ef1e7b8405997ed3d6e2b6722bd7088d4a8adf215e7c88335582e65651fb4e05 md5: d73fdc05f10693b518f52c994d748c19 @@ -1057,15 +1075,15 @@ packages: license: Unlicense size: 7077 timestamp: 1756221480651 -- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - sha256: ce61f4f99401a4bd455b89909153b40b9c823276aefcbb06f2044618696009ca - md5: 72e42d28960d875c7654614f8b50939a +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144 + md5: 8e662bd460bda79b1ea39194e3c4c9ab depends: - - python >=3.9 + - python >=3.10 - typing_extensions >=4.6.0 license: MIT and PSF-2.0 - size: 21284 - timestamp: 1746947398083 + size: 21333 + timestamp: 1763918099466 - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.116.2-hf7056cc_0.conda sha256: beb8f5d6837c5ca03da964cd731c4facd715ecef4fa07ad8f789efed39dd1c27 md5: f08a119ee16e8bdb8dbd77e9e6a945e1 @@ -1081,19 +1099,20 @@ packages: license_family: MIT size: 4772 timestamp: 1758060755059 -- conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.13-pyhcf101f3_0.conda - sha256: 178a205d4b6636cb9f40f999bf2e6f559e9cbc53f1dcd8cd3f7e5fd78f193a54 - md5: ac56247bdee6912941229d8e897672af +- conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.16-pyhcf101f3_1.conda + sha256: 4136b0c277188b205332983278c7b278ea946dc1c78a381e0f5bc79204b8ac97 + md5: 4f82a266e2d5b199db16cdb42341d785 depends: - python >=3.10 - rich-toolkit >=0.14.8 + - tomli >=2.0.0 - typer >=0.15.1 - uvicorn-standard >=0.15.0 - python license: MIT license_family: MIT - size: 17616 - timestamp: 1758405759695 + size: 19029 + timestamp: 1763068963965 - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-core-0.116.2-pyhcf101f3_0.conda sha256: f9bb5893b3488c5d1573ea1e48b2e4ff26ff8f8aecb60b3a62d5493e4b914f2f md5: 3d70154459d784b1b3bc9a163af21e19 @@ -1160,42 +1179,42 @@ packages: license_family: BSD size: 49483 timestamp: 1745602916758 -- conda: https://conda.anaconda.org/conda-forge/linux-64/httptools-0.7.1-py313h07c4f96_0.conda - sha256: 8cc52b62fef866aee5896f480d877a3a3859ecabda88e1b795f98deec04325c9 - md5: 3e3480697d894bebc7bc59b1bc241f72 +- conda: https://conda.anaconda.org/conda-forge/linux-64/httptools-0.7.1-py314h5bd0f2a_1.conda + sha256: 91bfdf1dad0fa57efc2404ca00f5fee8745ad9b56ec1d0df298fd2882ad39806 + md5: 067a52c66f453b97771650bbb131e2b5 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 99019 - timestamp: 1760071055358 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/httptools-0.7.1-py313h6194ac5_0.conda - sha256: fb585845202945d023ad606615bf95d1dd8d7c4c87e2f3cb9c3250dbffd28464 - md5: 869db738d41b7b4402a504f6d9afd2ee + size: 99037 + timestamp: 1762504051423 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/httptools-0.7.1-py314h51f160d_1.conda + sha256: 03c1f6045b7716e00661de60af73b4c2322d82b4b5e51b7501cba99802655165 + md5: 2606ceda023d864f6f22c93f59898199 depends: - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 96828 - timestamp: 1760071029135 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/httptools-0.7.1-py313h6535dbc_0.conda - sha256: 62f49e29a7c543fc6e37e2eee0590c7ef41344a7bfa2916b25ab887c203a19f7 - md5: c6444841703ad90fe43bb362d1ad3b5e + size: 97521 + timestamp: 1762504099185 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/httptools-0.7.1-py314h0612a62_1.conda + sha256: 042343211aafabab79120d0deda73358ddd3cb61b9ad55307108a275976fccfa + md5: 0ca03669a236fee8ce414e166d0bbf23 depends: - __osx >=11.0 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT - size: 89425 - timestamp: 1760071349415 + size: 90384 + timestamp: 1762504632522 - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda sha256: cd0f1de3697b252df95f98383e9edb1d00386bfdd03fdf607fa42fe5fcb09950 md5: d6989ead454181f4f9bc987d3dc4e285 @@ -1218,15 +1237,6 @@ packages: license_family: MIT size: 17397 timestamp: 1737618427549 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 - md5: 5eb22c1d7b3fc4abb50d92d621583137 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - size: 11857802 - timestamp: 1720853997952 - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 md5: 53abe63df7e10a6ba605dc5f9f961d36 @@ -1346,36 +1356,38 @@ packages: license_family: MIT size: 1155530 timestamp: 1719463474401 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_3.conda - sha256: e26f4435c372264136a9c71e19f7620ec7f107abe73134ff305d26bfaeabb0b3 - md5: 72cc69c30de0b6d39c7f97f501fdbb1c +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda + sha256: 9e191baf2426a19507f1d0a17be0fdb7aa155cdf0f61d5a09c808e0a69464312 + md5: a6abd2796fc332536735f68ba23f7901 depends: - __glibc >=2.17,<3.0.a0 - zstd >=1.5.7,<1.6.0a0 constrains: - - binutils_impl_linux-64 2.44 + - binutils_impl_linux-64 2.45 license: GPL-3.0-only - size: 741904 - timestamp: 1761248509961 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.44-hd32f0e1_3.conda - sha256: dd393e43e07c23c78c102d8a29ad2f565fa76d723fce087bf44691478bc02301 - md5: 39e1b0c3a528ca75c40a10d9c5d47635 + license_family: GPL + size: 725545 + timestamp: 1764007826689 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda + sha256: 7a13072581fa23f658a04f62f62c4677c57d3c9696fbc01cc954a88fc354b44d + md5: 28035705fe0c977ea33963489cd008ad depends: - zstd >=1.5.7,<1.6.0a0 constrains: - - binutils_impl_linux-aarch64 2.44 + - binutils_impl_linux-aarch64 2.45 license: GPL-3.0-only - size: 782756 - timestamp: 1761248459726 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.4-hf598326_0.conda - sha256: df55e80dda21f2581366f66cf18a6c11315d611f6fb01e56011c5199f983c0d9 - md5: 6002a2ba796f1387b6a5c6d77051d1db + license_family: GPL + size: 875534 + timestamp: 1764007911054 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda + sha256: 6c8d5c50f398035c39f118a6decf91b11d2461c88aef99f81e5c5de200d2a7fa + md5: 3ea79e55a64bff6c3cbd4588c89a527a depends: - __osx >=11.0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 567892 - timestamp: 1761043967532 + size: 569823 + timestamp: 1763470498512 - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 md5: c277e0a4d549b03ac1e9d6cbbe3d017b @@ -1410,40 +1422,40 @@ packages: license_family: BSD size: 107691 timestamp: 1738479560845 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda - sha256: da2080da8f0288b95dd86765c801c6e166c4619b910b11f9a8446fb852438dc2 - md5: 4211416ecba1866fab0c6470986c22d6 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + sha256: 1e1b08f6211629cbc2efe7a5bca5953f8f6b3cae0eeb04ca4dacee1bd4e2db2f + md5: 8b09ae86839581147ef2e5c5e229d164 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: - - expat 2.7.1.* + - expat 2.7.3.* license: MIT license_family: MIT - size: 74811 - timestamp: 1752719572741 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.1-hfae3067_0.conda - sha256: 378cabff44ea83ce4d9f9c59f47faa8d822561d39166608b3e65d1e06c927415 - md5: f75d19f3755461db2eb69401f5514f4c + size: 76643 + timestamp: 1763549731408 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + sha256: cc2581a78315418cc2e0bb2a273d37363203e79cefe78ba6d282fed546262239 + md5: b414e36fbb7ca122030276c75fa9c34a depends: - libgcc >=14 constrains: - - expat 2.7.1.* + - expat 2.7.3.* license: MIT license_family: MIT - size: 74309 - timestamp: 1752719762749 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda - sha256: 8fbb17a56f51e7113ed511c5787e0dec0d4b10ef9df921c4fd1cccca0458f648 - md5: b1ca5f21335782f71a8bd69bdc093f67 + size: 76201 + timestamp: 1763549910086 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + sha256: fce22610ecc95e6d149e42a42fbc3cc9d9179bd4eb6232639a60f06e080eec98 + md5: b79875dbb5b1db9a4a22a4520f918e1a depends: - __osx >=11.0 constrains: - - expat 2.7.1.* + - expat 2.7.3.* license: MIT license_family: MIT - size: 65971 - timestamp: 1752719657566 + size: 67800 + timestamp: 1763549994166 - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 md5: 35f29eec58405aaf55e01cb470d8c26a @@ -1472,65 +1484,65 @@ packages: license_family: MIT size: 40251 timestamp: 1760295839166 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda - sha256: 08f9b87578ab981c7713e4e6a7d935e40766e10691732bba376d4964562bcb45 - md5: c0374badb3a5d4b1372db28d19462c53 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda + sha256: 947bfbe5e47cd5d0cbdb0926d4baadb3e9be25caca7c6c6ef516f7ef85052cec + md5: 550dceb769d23bcf0e2f97fd4062d720 depends: - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 constrains: - - libgomp 15.2.0 h767d61c_7 - - libgcc-ng ==15.2.0=*_7 + - libgomp 15.2.0 he0feb66_14 + - libgcc-ng ==15.2.0=*_14 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 822552 - timestamp: 1759968052178 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda - sha256: 616f5960930ad45b48c57f49c3adddefd9423674b331887ef0e69437798c214b - md5: afa05d91f8d57dd30985827a09c21464 + size: 1041047 + timestamp: 1764277103389 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_14.conda + sha256: 827a0848aa93221e078522a933b6de498aad0c52ab568f935bcc19060b995dbb + md5: 43ff19fcf6f6737770018bb20bb2a9f9 depends: - _openmp_mutex >=4.5 constrains: - - libgomp 15.2.0 he277a41_7 - - libgcc-ng ==15.2.0=*_7 + - libgomp 15.2.0 h8acb6b2_14 + - libgcc-ng ==15.2.0=*_14 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 510719 - timestamp: 1759967448307 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda - sha256: 2045066dd8e6e58aaf5ae2b722fb6dfdbb57c862b5f34ac7bfb58c40ef39b6ad - md5: 280ea6eee9e2ddefde25ff799c4f0363 + size: 620723 + timestamp: 1764276398571 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda + sha256: 48a77fde940b4b877c0ed24efd562c135170a46d100c07cd2d7b67e842e30642 + md5: 6c13aaae36d7514f28bd5544da1a7bb8 depends: - - libgcc 15.2.0 h767d61c_7 + - libgcc 15.2.0 he0feb66_14 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 29313 - timestamp: 1759968065504 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda - sha256: 7d98979b2b5698330007b0146b8b4b95b3790378de12129ce13c9fc88c1ef45a - md5: a5ce1f0a32f02c75c11580c5b2f9258a + size: 27157 + timestamp: 1764277114484 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_14.conda + sha256: 7b25d20e9cf637520e71b3382db89d8457aec38bf0d1f8ed20d50eb2457f0131 + md5: acd92c808b9f95f5b28db20054306ba7 depends: - - libgcc 15.2.0 he277a41_7 + - libgcc 15.2.0 h8acb6b2_14 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 29261 - timestamp: 1759967452303 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda - sha256: e9fb1c258c8e66ee278397b5822692527c5f5786d372fe7a869b900853f3f5ca - md5: f7b4d76975aac7e5d9e6ad13845f92fe + size: 27086 + timestamp: 1764276407434 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda + sha256: 2017cbc0f0f3b1d15df9ca681960eef015f9f58ba0d6e841694277a9f7eae0fc + md5: 91349c276f84f590487e4c7f6e90e077 depends: - __glibc >=2.17,<3.0.a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 447919 - timestamp: 1759967942498 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda - sha256: 0a024f1e4796f5d90fb8e8555691dad1b3bdfc6ac3c2cd14d876e30f805fcac7 - md5: 34cef4753287c36441f907d5fdd78d42 + size: 604220 + timestamp: 1764277020855 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_14.conda + sha256: 230da4c881c7af77644cac52648da2a7799c7bf7c250983bbb64c1d793e42215 + md5: f08c95adda42a8f04c2ce888a36be575 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 450308 - timestamp: 1759967379407 + size: 587557 + timestamp: 1764276303166 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 md5: 1a580f7796c7bf6393fddb8bbbde58dc @@ -1614,76 +1626,75 @@ packages: license: ISC size: 164972 timestamp: 1716828607917 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda - sha256: 6d9c32fc369af5a84875725f7ddfbfc2ace795c28f246dc70055a79f9b2003da - md5: 0b367fad34931cb79e0d6b7e5c06bb1c +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda + sha256: 6f0e8a812e8e33a4d8b7a0e595efe28373080d27b78ee4828aa4f6649a088454 + md5: 2e1b84d273b01835256e53fd938de355 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libzlib >=1.3.1,<2.0a0 license: blessing - size: 932581 - timestamp: 1753948484112 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.50.4-h022381a_0.conda - sha256: a361dc926f232e7f3aa664dbd821f12817601c07d2c8751a0668c2fb07d0e202 - md5: 0ad1b73a3df7e3376c14efe6dabe6987 + size: 938979 + timestamp: 1764359444435 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.1-h022381a_0.conda + sha256: e394dd772b71dbcd653d078f3aacf6e26e3478bd6736a687ab86e463a2f153a8 + md5: 233efdd411317d2dc5fde72464b3df7a depends: - libgcc >=14 - libzlib >=1.3.1,<2.0a0 license: blessing - size: 931661 - timestamp: 1753948557036 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.50.4-h4237e3c_0.conda - sha256: 802ebe62e6bc59fc26b26276b793e0542cfff2d03c086440aeaf72fb8bbcec44 - md5: 1dcb0468f5146e38fae99aef9656034b + size: 939207 + timestamp: 1764359457549 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.1-h9a5124b_0.conda + sha256: a46b167447e2a9e38586320c30b29e3b68b6f7e6b873c18d6b1aa2efd2626917 + md5: 67e50e5bd4e5e2310d66b88c4da50096 depends: - __osx >=11.0 - - icu >=75.1,<76.0a0 - libzlib >=1.3.1,<2.0a0 license: blessing - size: 902645 - timestamp: 1753948599139 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda - sha256: 1b981647d9775e1cdeb2fab0a4dd9cd75a6b0de2963f6c3953dbd712f78334b3 - md5: 5b767048b1b3ee9a954b06f4084f93dc + size: 906292 + timestamp: 1764359907797 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda + sha256: bbeb7cf8b7eff000b2cb5ffb9a40d98fbb8f39c94768afaec38408c3097cde0d + md5: 8e96fe9b17d5871b5cf9d312cab832f6 depends: - __glibc >=2.17,<3.0.a0 - - libgcc 15.2.0 h767d61c_7 + - libgcc 15.2.0 he0feb66_14 constrains: - - libstdcxx-ng ==15.2.0=*_7 + - libstdcxx-ng ==15.2.0=*_14 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 3898269 - timestamp: 1759968103436 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda - sha256: 4c6d1a2ae58044112233a57103bbf06000bd4c2aad44a0fd3b464b05fa8df514 - md5: 6a2f0ee17851251a85fbebafbe707d2d + size: 5856715 + timestamp: 1764277148231 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_14.conda + sha256: 21fd0d4381167fc625e7ab4bf4839934fe9b79290a1684c90c8eb0f3a4d77c25 + md5: 83f466be64f6bc1f7ece406c009e0586 depends: - - libgcc 15.2.0 he277a41_7 + - libgcc 15.2.0 h8acb6b2_14 constrains: - - libstdcxx-ng ==15.2.0=*_7 + - libstdcxx-ng ==15.2.0=*_14 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 3831785 - timestamp: 1759967470295 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda - sha256: 024fd46ac3ea8032a5ec3ea7b91c4c235701a8bf0e6520fe5e6539992a6bd05f - md5: f627678cf829bd70bccf141a19c3ad3e + size: 5542572 + timestamp: 1764276435572 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda + sha256: 63336f51b88029a9557a430aecbb08a11365aa03ec47ec8d14e542fec5dc80fb + md5: 9531f671a13eec0597941fa19e489b96 depends: - - libstdcxx 15.2.0 h8f9b012_7 + - libstdcxx 15.2.0 h934c35e_14 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 29343 - timestamp: 1759968157195 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda - sha256: 26fc1bdb39042f27302b363785fea6f6b9607f9c2f5eb949c6ae0bdbb8599574 - md5: 9e5deec886ad32f3c6791b3b75c78681 + size: 27200 + timestamp: 1764277193585 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_14.conda + sha256: 16c15e293306429b6a014ac0106145c397f022e734a2a60bebd27a3d8166593e + md5: 410b06d8a2f7dd0cc1b6acdfbcf101c6 depends: - - libstdcxx 15.2.0 h3f4de04_7 + - libstdcxx 15.2.0 hef695bb_14 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 29341 - timestamp: 1759967498023 + size: 27126 + timestamp: 1764276483709 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda sha256: e5ec6d2ad7eef538ddcb9ea62ad4346fde70a4736342c4ad87bd713641eb9808 md5: 80c07c68d2f6870250959dcc95b209d1 @@ -1775,52 +1786,24 @@ packages: license_family: MIT size: 64736 timestamp: 1754951288511 -- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_0.conda - sha256: a530a411bdaaf0b1e4de8869dfaca46cb07407bc7dc0702a9e231b0e5ce7ca85 - md5: c14389156310b8ed3520d84f854be1ee - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - size: 25909 - timestamp: 1759055357045 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py313hfa222a2_0.conda - sha256: c03eb8f5a4659ce31e698a328372f6b0357644d557ea0dc01fe0c5897c231c48 - md5: 59fc93a010d6e8a08a4fa32424d86a82 - depends: - - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - size: 26403 - timestamp: 1759056219797 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py313h7d74516_0.conda - sha256: e06902a1bf370fdd4ada0a8c81c504868fdb7e9971b72c6bd395aa4e5a497bd2 - md5: 3df5979cc0b761dda0053ffdb0bca3ea +- conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda + sha256: e0cbfea51a19b3055ca19428bd9233a25adca956c208abb9d00b21e7259c7e03 + md5: fab1be106a50e20f10fe5228fd1d1651 depends: - - __osx >=11.0 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - python >=3.10 constrains: - jinja2 >=3.0.0 + track_features: + - markupsafe_no_compile license: BSD-3-Clause license_family: BSD - size: 25778 - timestamp: 1759055530601 -- conda: https://conda.modular.com/max/noarch/mblack-25.6.1-release.conda + size: 15499 + timestamp: 1759055275624 +- conda: https://conda.modular.com/max/noarch/mblack-25.7.0-release.conda noarch: python - sha256: 8fffe19d16bc99e847ec628b3bc34cd2c7915d864d77e1f86eef32e242d83259 + sha256: 1cc8fea28ed794435b78985f5d9dd0d030ee2b36c9ee5fc54a1a769053811ab1 depends: - - python >=3.9 + - python >=3.10 - click >=8.0.0 - mypy_extensions >=0.4.3 - packaging >=22.0 @@ -1830,8 +1813,8 @@ packages: - typing_extensions >=v4.12.2 - python license: MIT - size: 131737 - timestamp: 1759935767584 + size: 138148 + timestamp: 1763510771731 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -1841,65 +1824,65 @@ packages: license_family: MIT size: 14465 timestamp: 1733255681319 -- conda: https://conda.modular.com/max/linux-64/mojo-0.25.6.1-release.conda - sha256: 786115cbeafb5526f1940441feb5a4cdd15ee85b460726ee9f4887074b8695d2 +- conda: https://conda.modular.com/max/linux-64/mojo-0.25.7.0-release.conda + sha256: 9a702420138ef31b77f58e64b6e8a4cf4bff768c1476787b98d72cde73d72982 depends: - - python >=3.9 - - mojo-compiler ==0.25.6.1 release - - mblack ==25.6.1 release + - python >=3.10 + - mojo-compiler ==0.25.7.0 release + - mblack ==25.7.0 release - jupyter_client >=8.6.2,<8.7 license: LicenseRef-Modular-Proprietary - size: 90581961 - timestamp: 1759935725498 -- conda: https://conda.modular.com/max/linux-aarch64/mojo-0.25.6.1-release.conda - sha256: 5c0d5be7256ce699abcb8bf2bf8f062d547fb3aca4183ab3646a69d5c169b51a + size: 89019701 + timestamp: 1763510721866 +- conda: https://conda.modular.com/max/linux-aarch64/mojo-0.25.7.0-release.conda + sha256: 147ad89ffcbb7d27c6d1f83c51657b12cf64117b778c46a1248d8bb058c99311 depends: - - python >=3.9 - - mojo-compiler ==0.25.6.1 release - - mblack ==25.6.1 release + - python >=3.10 + - mojo-compiler ==0.25.7.0 release + - mblack ==25.7.0 release - jupyter_client >=8.6.2,<8.7 license: LicenseRef-Modular-Proprietary - size: 90612135 - timestamp: 1759935767584 -- conda: https://conda.modular.com/max/osx-arm64/mojo-0.25.6.1-release.conda - sha256: 988eed659749827db744e57667820674186f8702ef1cc878d564d59ee9c1e84a + size: 89064299 + timestamp: 1763510771732 +- conda: https://conda.modular.com/max/osx-arm64/mojo-0.25.7.0-release.conda + sha256: 1ebf6b78e85e8bcd01e427d01790b72e3805e6ea7475cdbdbefeb6aaa4ca5c83 depends: - - python >=3.9 - - mojo-compiler ==0.25.6.1 release - - mblack ==25.6.1 release + - python >=3.10 + - mojo-compiler ==0.25.7.0 release + - mblack ==25.7.0 release - jupyter_client >=8.6.2,<8.7 license: LicenseRef-Modular-Proprietary - size: 76528067 - timestamp: 1759935537296 -- conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.25.6.1-release.conda - sha256: 9e99e25e5986393deab8cbd3ff6e6440c5cea2e36a0579f91ffd982a5db9f3eb + size: 75228880 + timestamp: 1763511077693 +- conda: https://conda.modular.com/max/linux-64/mojo-compiler-0.25.7.0-release.conda + sha256: 7d8e2cb28ce54cc8fc0e3f3340b403c8b41125e7f2a649f437e69c56e52bb1ed depends: - - mojo-python ==0.25.6.1 release + - mojo-python ==0.25.7.0 release license: LicenseRef-Modular-Proprietary - size: 85406509 - timestamp: 1759935725498 -- conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.25.6.1-release.conda - sha256: 95dd839b3d5262472f7f5dfa0982d73408a4df249411ffde3a4169896fa26875 + size: 88690196 + timestamp: 1763510721865 +- conda: https://conda.modular.com/max/linux-aarch64/mojo-compiler-0.25.7.0-release.conda + sha256: 0408180fcbf00319f4adafc738b477f52301624b13cf82b8f8ae72f3ef96b81e depends: - - mojo-python ==0.25.6.1 release + - mojo-python ==0.25.7.0 release license: LicenseRef-Modular-Proprietary - size: 84358297 - timestamp: 1759935767584 -- conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.25.6.1-release.conda - sha256: 189031e3dfe1f9341ed1336e35017b298a1d22bf31eba4f0c473f2ff5e489471 + size: 87553526 + timestamp: 1763510771731 +- conda: https://conda.modular.com/max/osx-arm64/mojo-compiler-0.25.7.0-release.conda + sha256: 2ac7a3a23d7a0d14fdfc7efc65166afba06567c5060687c3cce14ed64e71a5b4 depends: - - mojo-python ==0.25.6.1 release + - mojo-python ==0.25.7.0 release license: LicenseRef-Modular-Proprietary - size: 64003259 - timestamp: 1759935537296 -- conda: https://conda.modular.com/max/noarch/mojo-python-0.25.6.1-release.conda + size: 63177739 + timestamp: 1763511077693 +- conda: https://conda.modular.com/max/noarch/mojo-python-0.25.7.0-release.conda noarch: python - sha256: e4df400b7eead948cf7c32356fbdb887f06bb8c8c596c1784a4c96ca02b4be97 + sha256: 020a6cdde091d210a731216fa107472fdd3c5e790fea4c20af646b0ccb5be44e depends: - python license: LicenseRef-Modular-Proprietary - size: 17894 - timestamp: 1759935767584 + size: 24689 + timestamp: 1763510771731 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda sha256: 6ed158e4e5dd8f6a10ad9e525631e35cee8557718f83de7a4e3966b1f772c4b1 md5: e9c622e0d00fa24a6292279af3ab6d06 @@ -1934,37 +1917,37 @@ packages: license: X11 AND BSD-3-Clause size: 797030 timestamp: 1738196177597 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda - sha256: e807f3bad09bdf4075dbb4168619e14b0c0360bacb2e12ef18641a834c8c5549 - md5: 14edad12b59ccbfa3910d42c72adc2a0 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + sha256: a47271202f4518a484956968335b2521409c8173e123ab381e775c358c67fe6d + md5: 9ee58d5c534af06558933af3c845a780 depends: - __glibc >=2.17,<3.0.a0 - ca-certificates - libgcc >=14 license: Apache-2.0 license_family: Apache - size: 3119624 - timestamp: 1759324353651 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.4-h8e36d6e_0.conda - sha256: a24b318733c98903e2689adc7ef73448e27cbb10806852032c023f0ea4446fc5 - md5: 9303e8887afe539f78517951ce25cd13 + size: 3165399 + timestamp: 1762839186699 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda + sha256: 8dd3b4c31fe176a3e51c5729b2c7f4c836a2ce3bd5c82082dc2a503ba9ee0af3 + md5: 7624c6e01aecba942e9115e0f5a2af9d depends: - ca-certificates - libgcc >=14 license: Apache-2.0 license_family: Apache - size: 3644584 - timestamp: 1759326000128 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.4-h5503f6c_0.conda - sha256: f0512629f9589392c2fb9733d11e753d0eab8fc7602f96e4d7f3bd95c783eb07 - md5: 71118318f37f717eefe55841adb172fd + size: 3705625 + timestamp: 1762841024958 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + sha256: ebe93dafcc09e099782fe3907485d4e1671296bc14f8c383cb6f3dfebb773988 + md5: b34dc4172653c13dcf453862f251af2b depends: - __osx >=11.0 - ca-certificates license: Apache-2.0 license_family: Apache - size: 3067808 - timestamp: 1759324763146 + size: 3108371 + timestamp: 1762839712322 - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda sha256: 289861ed0c13a15d7bbb408796af4de72c2fe67e2bcb0de98f4c3fce259d7991 md5: 58335b26c38bf4a20f399384c33cbcf9 @@ -1975,6 +1958,26 @@ packages: license_family: APACHE size: 62477 timestamp: 1745345660407 +- conda: https://conda.anaconda.org/conda-forge/linux-64/patchelf-0.17.2-h58526e2_0.conda + sha256: eb355ac225be2f698e19dba4dcab7cb0748225677a9799e9cc8e4cadc3cb738f + md5: ba76a6a448819560b5f8b08a9c74f415 + depends: + - libgcc-ng >=7.5.0 + - libstdcxx-ng >=7.5.0 + license: GPL-3.0-or-later + license_family: GPL + size: 94048 + timestamp: 1673473024463 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/patchelf-0.17.2-h884eca8_0.conda + sha256: 8b98158f36a7a92013a1982ab7a60947151350ac5c513c1d1575825d0fa52518 + md5: bbd8dee69c4ac2e2d07bca100b8fcc31 + depends: + - libgcc-ng >=7.5.0 + - libstdcxx-ng >=7.5.0 + license: GPL-3.0-or-later + license_family: GPL + size: 101306 + timestamp: 1673473812166 - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee md5: 617f15191456cc6a13db418a275435e5 @@ -2004,65 +2007,66 @@ packages: license_family: BSD size: 110100 timestamp: 1733195786147 -- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.3-pyh3cfb1c2_0.conda - sha256: 6a940747e8445653224dcff95fadf1060c66b9e544fdb0ed469b70a98c3aee7e - md5: 2cb5d62fdf68deb0263663598feb9fc5 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda + sha256: 868569d9505b7fe246c880c11e2c44924d7613a8cdcc1f6ef85d5375e892f13d + md5: c3946ed24acdb28db1b5d63321dbca7d depends: - - annotated-types >=0.6.0 - - pydantic-core 2.41.4 - - python >=3.10 - - typing-extensions >=4.6.1 - typing-inspection >=0.4.2 - typing_extensions >=4.14.1 + - python >=3.10 + - typing-extensions >=4.6.1 + - annotated-types >=0.6.0 + - pydantic-core ==2.41.5 + - python license: MIT license_family: MIT - size: 320015 - timestamp: 1760749357338 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.4-py313h843e2db_0.conda - sha256: 66bf46c1ccafe4cfa2ea64aff4f9d18fee41ac47b942d88347ed9cc5373fdc75 - md5: d42ccdecefbe670d2a50ee3ce784166b + size: 340482 + timestamp: 1764434463101 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda + sha256: 7e0ae379796e28a429f8e48f2fe22a0f232979d65ec455e91f8dac689247d39f + md5: 432b0716a1dfac69b86aa38fdd59b7e6 depends: - python - typing-extensions >=4.6.0,!=4.7.0 - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 constrains: - __glibc >=2.17 license: MIT license_family: MIT - size: 1935806 - timestamp: 1760442414544 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.41.4-py313h5e7b836_0.conda - sha256: 629de3e0b36490419ba5dcf5f53fda6e90dc0352ad41ab1fdaaaedacaf1f532f - md5: b57f95d059ea5468dd99a5c08a20f63c + size: 1943088 + timestamp: 1762988995556 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.41.5-py314h451b6cc_1.conda + sha256: f8acb2d03ebe80fed0032b9a989fc9acfb6735e3cd3f8c704b72728cb31868f6 + md5: 28f5027a1e04d67aa13fac1c5ba79693 depends: - python - typing-extensions >=4.6.0,!=4.7.0 - libgcc >=14 - - python 3.13.* *_cp313 - - python_abi 3.13.* *_cp313 + - python 3.14.* *_cp314 + - python_abi 3.14.* *_cp314 constrains: - __glibc >=2.17 license: MIT license_family: MIT - size: 1829914 - timestamp: 1760442436625 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.4-py313h2c089d5_0.conda - sha256: 86cf851a602212cde9dd65399fd2f6c60ab0e63436acae8c55ffbc1d3dd29598 - md5: 06dba210134db7650a9ddbaa42f33154 + size: 1828339 + timestamp: 1762989038561 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py314haad56a0_1.conda + sha256: dded9092d89f1d8c267d5ce8b5e21f935c51acb7a64330f507cdfb3b69a98116 + md5: 420a4b8024e9b22880f1e03b612afa7d depends: - python - typing-extensions >=4.6.0,!=4.7.0 - - python 3.13.* *_cp313 - __osx >=11.0 - - python_abi 3.13.* *_cp313 + - python 3.14.* *_cp314 + - python_abi 3.14.* *_cp314 constrains: - __osx >=11.0 license: MIT license_family: MIT - size: 1783765 - timestamp: 1760442470359 + size: 1784478 + timestamp: 1762989019956 - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a md5: 6b6ece66ebcae2d5f326c77ef2c5a066 @@ -2082,10 +2086,10 @@ packages: license_family: BSD size: 21085 timestamp: 1733217331982 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.9-hc97d973_101_cp313.conda - build_number: 101 - sha256: e89da062abd0d3e76c8d3b35d3cafc5f0d05914339dcb238f9e3675f2a58d883 - md5: 4780fe896e961722d0623fa91d0d3378 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda + build_number: 102 + sha256: 76d750045b94fded676323bfd01975a26a474023635735773d0e4d80aaa72518 + md5: 0a19d2cc6eb15881889b0c6fa7d6a78d depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 @@ -2100,18 +2104,19 @@ packages: - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.5.4,<4.0a0 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata + - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 - size: 37174029 - timestamp: 1761178179147 - python_site_packages_path: lib/python3.13/site-packages -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.9-h4c0d347_101_cp313.conda - build_number: 101 - sha256: 95f11d8f8e8007ead0927ff15401a9a48a28df92b284f41a08824955c009e974 - md5: b62a2e7c210e4bffa9aaa041f7152a25 + size: 36681389 + timestamp: 1761176838143 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.0-hb06a95a_102_cp314.conda + build_number: 102 + sha256: a930ea81356110d84993527772577276af034d689e7333f937005ee527bd11bf + md5: c2bbf19a6b366d492f9137257ad19416 depends: - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-aarch64 >=2.36.1 @@ -2125,18 +2130,19 @@ packages: - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.5.4,<4.0a0 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata + - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 - size: 33737136 - timestamp: 1761175607146 - python_site_packages_path: lib/python3.13/site-packages -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.9-hfc2f54d_101_cp313.conda - build_number: 101 - sha256: 516229f780b98783a5ef4112a5a4b5e5647d4f0177c4621e98aa60bb9bc32f98 - md5: a4241bce59eecc74d4d2396e108c93b8 + size: 37128758 + timestamp: 1761175738259 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.0-h40d2674_102_cp314.conda + build_number: 102 + sha256: 3ca1da026fe5df8a479d60e1d3ed02d9bc50fcbafd5f125d86abe70d21a34cc7 + md5: a9ff09231c555da7e30777747318321b depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 @@ -2148,14 +2154,15 @@ packages: - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.5.4,<4.0a0 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata + - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 - size: 11915380 - timestamp: 1761176793936 - python_site_packages_path: lib/python3.13/site-packages + size: 13590581 + timestamp: 1761177195716 + python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 md5: 5b8d21249ff20967101ffa321cab24e8 @@ -2167,25 +2174,25 @@ packages: license_family: APACHE size: 233310 timestamp: 1751104122689 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.1.1-pyhe01879c_0.conda - sha256: 9a90570085bedf4c6514bcd575456652c47918ff3d7b383349e26192a4805cc8 - md5: a245b3c04afa11e2e52a0db91550da7c +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.1-pyhcf101f3_0.conda + sha256: aa98e0b1f5472161318f93224f1cfec1355ff69d2f79f896c0b9e033e4a6caf9 + md5: 083725d6cd3dc007f06d04bcf1e613a2 depends: - - python >=3.9 + - python >=3.10 - python license: BSD-3-Clause license_family: BSD - size: 26031 - timestamp: 1750789290754 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.9-h4df99d1_101.conda - sha256: 7535b9cb2414e34c73ed4a97a90bcadcc76b9d47d0bb8ef5002c592d85fe022d - md5: f41e3c1125e292e6bfcea8392a3de3d8 - depends: - - cpython 3.13.9.* - - python_abi * *_cp313 + size: 26922 + timestamp: 1761503229008 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda + sha256: e68c9796fba0825ebc1338ceb94496683ab7d45dcd281b378ec2a56365d3c555 + md5: d152e423d80848fe95f0f4b43448030e + depends: + - cpython 3.14.0.* + - python_abi * *_cp314 license: Python-2.0 - size: 48385 - timestamp: 1761175154112 + size: 48968 + timestamp: 1761175555295 - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda sha256: 1b03678d145b1675b757cba165a0d9803885807792f7eb4495e48a38858c3cca md5: a28c984e0429aff3ab7386f7de56de6f @@ -2195,55 +2202,28 @@ packages: license_family: Apache size: 27913 timestamp: 1734420869885 -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda build_number: 8 - sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 - md5: 94305520c52a4aa3f6c2b1ff6008d9f8 + sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 + md5: 0539938c55b6b1a59b560e843ad864a4 constrains: - - python 3.13.* *_cp313 + - python 3.14.* *_cp314 license: BSD-3-Clause license_family: BSD - size: 7002 - timestamp: 1752805902938 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_0.conda - sha256: 40dcd6718dce5fbee8aabdd0519f23d456d8feb2e15ac352eaa88bbfd3a881af - md5: 4794ea0adaebd9f844414e594b142cb2 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - size: 207109 - timestamp: 1758892173548 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py313hd3a54cf_0.conda - sha256: 4aca079224068d1a7fa2d2cbdb6efe11eec76737472c01f02d9e147c5237c37d - md5: cd0891668088a005cb45b344d84a3955 - depends: - - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - - yaml >=0.2.5,<0.3.0a0 + size: 6989 + timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda + sha256: 828af2fd7bb66afc9ab1c564c2046be391aaf66c0215f05afaf6d7a9a270fe2a + md5: b12f41c0d7fb5ab81709fcc86579688f + depends: + - python >=3.10.* + - yaml + track_features: + - pyyaml_no_compile license: MIT license_family: MIT - size: 198001 - timestamp: 1758891959168 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py313h7d74516_0.conda - sha256: f5be0d84f72a567b7333b9efa74a65bfa44a25658cf107ffa3fc65d3ae6660d7 - md5: 0e8e3235217b4483a7461b63dca5826b - depends: - - __osx >=11.0 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - size: 191630 - timestamp: 1758892258120 + size: 45223 + timestamp: 1758891992558 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda noarch: python sha256: a00a41b66c12d9c60e66b391e9a4832b7e28743348cf4b48b410b91927cd7819 @@ -2290,6 +2270,44 @@ packages: license_family: BSD size: 191115 timestamp: 1757387128258 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rattler-build-0.53.0-he64ecbb_0.conda + sha256: b4aacfcf5792d898b0479a9eb48cb93df15d30ded5515ef9d9ea3b3edca5e0bb + md5: 3a2a4cca494b59191c80cb9e944a59b1 + depends: + - patchelf + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - openssl >=3.5.4,<4.0a0 + constrains: + - __glibc >=2.17 + license: BSD-3-Clause + license_family: BSD + size: 17360142 + timestamp: 1764285588098 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rattler-build-0.53.0-hb434046_0.conda + sha256: e21ee35505fb2304dc19e78bd1aa2945b6da05b0075dc532903247bf070e079f + md5: 2cee9e9c3263a3222901ed23cd626388 + depends: + - patchelf + - libgcc >=14 + - openssl >=3.5.4,<4.0a0 + constrains: + - __glibc >=2.17 + license: BSD-3-Clause + license_family: BSD + size: 17864268 + timestamp: 1764285615226 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rattler-build-0.53.0-h8d80559_0.conda + sha256: fdcb5d3fd7534867ffc78d84afb7d782259566e88a6fa428e588eca164574a56 + md5: 1e19797fac711f0ddbaf13ae5447883e + depends: + - __osx >=11.0 + constrains: + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + size: 14984941 + timestamp: 1764285638519 - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c md5: 283b96675859b20a825f8fa30f311446 @@ -2347,9 +2365,9 @@ packages: license_family: MIT size: 200840 timestamp: 1760026188268 -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.15.1-pyhcf101f3_0.conda - sha256: 7c8ffaa40bf4ba5fc6bb8f0e4b9da77678fe74cdb50ab82041d6a5e4a25f530b - md5: 12f69ed6e4115871451a3c7809b4651e +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.17.0-pyhcf101f3_0.conda + sha256: 1bfd53dfc4877e4613702be69f89a180fcbd31f065aba6b9024ee355fb881b82 + md5: c59bd4c924d9f3001803dc1c7c61da2d depends: - python >=3.10 - rich >=13.7.1 @@ -2358,17 +2376,17 @@ packages: - python license: MIT license_family: MIT - size: 29432 - timestamp: 1756998936181 -- conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda - sha256: 0557c090913aa63cdbe821dbdfa038a321b488e22bc80196c4b3b1aace4914ef - md5: 7c3c2a0f3ebdea2bbc35538d162b43bf + size: 31373 + timestamp: 1764252369301 +- conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda + sha256: 1d6534df8e7924d9087bd388fbac5bd868c5bf8971c36885f9f016da0657d22b + md5: 83ea3a2ddb7a75c1b09cea582aa4f106 depends: - - python >=3.9 + - python >=3.10 license: MIT license_family: MIT - size: 14462 - timestamp: 1733301007770 + size: 15018 + timestamp: 1762858315311 - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d md5: 3339e3b65d58accf4ca4fb8748ab16b3 @@ -2379,15 +2397,15 @@ packages: license_family: MIT size: 18455 timestamp: 1753199211006 -- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda - sha256: c2248418c310bdd1719b186796ae50a8a77ce555228b6acd32768e2543a15012 - md5: bf7a226e58dfb8346c70df36065d86c9 +- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + sha256: dce518f45e24cd03f401cb0616917773159a210c19d601c5f2d4e0e5879d30ad + md5: 03fe290994c5e4ec17293cfb6bdce520 depends: - - python >=3.9 + - python >=3.10 license: Apache-2.0 license_family: Apache - size: 15019 - timestamp: 1733244175724 + size: 15698 + timestamp: 1762941572482 - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.48.0-pyhfdc7a7d_0.conda sha256: 9272bccaa0d7d0b0f925e1ffdac319493c4d25a8aed81b3904f62fe38ba7b047 md5: 1549ff806d9b81492d14eaec12e3935d @@ -2400,37 +2418,41 @@ packages: license_family: BSD size: 64039 timestamp: 1757860651806 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda - sha256: a84ff687119e6d8752346d1d408d5cf360dee0badd487a472aa8ddedfdc219e1 - md5: a0116df4f4ed05c303811a837d5b39d8 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + sha256: 1544760538a40bcd8ace2b1d8ebe3eb5807ac268641f8acdc18c69c5ebfeaf64 + md5: 86bc20552bf46075e3d92b67f089172d depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libzlib >=1.3.1,<2.0a0 + constrains: + - xorg-libx11 >=1.8.12,<2.0a0 license: TCL license_family: BSD - size: 3285204 - timestamp: 1748387766691 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5688188_102.conda - sha256: 46e10488e9254092c655257c18fcec0a9864043bdfbe935a9fbf4fb2028b8514 - md5: 2562c9bfd1de3f9c590f0fe53858d85c + size: 3284905 + timestamp: 1763054914403 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda + sha256: 154e73f6269f92ad5257aa2039278b083998fd19d371e150f307483fb93c07ae + md5: 631db4799bc2bfe4daccf80bb3cbc433 depends: - libgcc >=13 - libzlib >=1.3.1,<2.0a0 + constrains: + - xorg-libx11 >=1.8.12,<2.0a0 license: TCL license_family: BSD - size: 3342845 - timestamp: 1748393219221 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_2.conda - sha256: cb86c522576fa95c6db4c878849af0bccfd3264daf0cc40dd18e7f4a7bfced0e - md5: 7362396c170252e7b7b0c8fb37fe9c78 + size: 3333495 + timestamp: 1763059192223 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + sha256: ad0c67cb03c163a109820dc9ecf77faf6ec7150e942d1e8bb13e5d39dc058ab7 + md5: a73d54a5abba6543cb2f0af1bfbd6851 depends: - __osx >=11.0 - libzlib >=1.3.1,<2.0a0 license: TCL license_family: BSD - size: 3125538 - timestamp: 1748388189063 + size: 3125484 + timestamp: 1763055028377 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda sha256: cb77c660b646c00a48ef942a9e1721ee46e90230c7c570cdeb5a893b5cce9bff md5: d2732eb636c264dc9aa4cbee404b1a53 @@ -2441,41 +2463,41 @@ packages: license_family: MIT size: 20973 timestamp: 1760014679845 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py313h07c4f96_1.conda - sha256: c8bfe883aa2d5b59cb1d962729a12b3191518f7decbe9e3505c2aacccb218692 - md5: 45821154b9cb2fb63c2b354c76086954 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.2-py314h5bd0f2a_2.conda + sha256: a4482fff049ad4e2907969b2c11242b712b33cdad9bbf88122a705e179af04da + md5: 972071a83bc345cb2a13c2c5b662ff5b depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 license: Apache-2.0 license_family: Apache - size: 877215 - timestamp: 1756855010312 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py313he149459_1.conda - sha256: 6459206092f03e69679234b7ff67230d334529576a56cbd32a44756a08dc7c0b - md5: f896700632061a8dafa2f80bb178909c + size: 902474 + timestamp: 1762506844640 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.2-py314hafb4487_2.conda + sha256: c0f0d53fa7cd70a7c29e3acb569e6af04a1cb620ea49842beebb3d212f000147 + md5: 45a0e463a2bd525db9d7561290500865 depends: - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 license: Apache-2.0 license_family: Apache - size: 877192 - timestamp: 1756855983185 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py313hcdf3177_1.conda - sha256: 30fbb92cc119595e4ac7691789d45d367f5d6850103b97ca4a130d98e8ec27f0 - md5: 728311ebaa740a1efa6fab80bbcdf335 + size: 902729 + timestamp: 1762507810940 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.2-py314h0612a62_2.conda + sha256: aec65f3c244255c75e4f6e093f094f851a8566ea5ece7d8cbfffb2af745676a3 + md5: a085241420b4c86f8efc85830b0690b6 depends: - __osx >=11.0 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 license: Apache-2.0 license_family: Apache - size: 874955 - timestamp: 1756855212446 + size: 901904 + timestamp: 1762507135570 - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 md5: 019a7385be9af33791c989871317e1ed @@ -2485,20 +2507,20 @@ packages: license_family: BSD size: 110051 timestamp: 1733367480074 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.20.0-pyhdb1f59b_0.conda - sha256: e4708f3f7f72e92511b1f6defca8cac520cef1af3cda92c3b7901731f7ddcb75 - md5: 27ec7c3f99366fa64228c3ee4ab49cbc +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.20.0-pyhefaf540_1.conda + sha256: 17a1e572939af33d709248170871d4da74f7e32b48f2e9b5abca613e201c6e64 + md5: 23a53fdefc45ba3f4e075cc0997fd13b depends: - - typer-slim-standard ==0.20.0 h65a100f_0 + - typer-slim-standard ==0.20.0 h4daf872_1 - python >=3.10 - python license: MIT license_family: MIT - size: 79367 - timestamp: 1760982314002 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.20.0-pyhcf101f3_0.conda - sha256: 08904a433b7ab6b2e0267576043a8397bb3ce7296d71aef34ae7d2506b2c192a - md5: d8ad446a00bbd434d6d03cdcc9b46524 + size: 79829 + timestamp: 1762984042927 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.20.0-pyhcf101f3_1.conda + sha256: 4b5ded929080b91367f128e7299619f6116f08bc77d9924a2f8766e2a1b18161 + md5: 4b02a515f3e882dcfe9cfbf0a1f5cd3a depends: - python >=3.10 - click >=8.0.0 @@ -2510,19 +2532,19 @@ packages: - shellingham >=1.3.0 license: MIT license_family: MIT - size: 47419 - timestamp: 1760982313997 -- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.20.0-h65a100f_0.conda - sha256: a4726dec9ec806757f5f0fee65f54f790d3f4854a869bd4cd2c2805c54b52d37 - md5: cfd4be2a44e441b12b58a7d04c9434e9 + size: 47951 + timestamp: 1762984042920 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.20.0-h4daf872_1.conda + sha256: 5027768bc9a580c8ffbf25872bb2208c058cbb79ae959b1cf2cc54b5d32c0377 + md5: 37b26aafb15a6687b31a3d8d7a1f04e7 depends: - - typer-slim ==0.20.0 pyhcf101f3_0 + - typer-slim ==0.20.0 pyhcf101f3_1 - rich - shellingham license: MIT license_family: MIT - size: 5294 - timestamp: 1760982314002 + size: 5322 + timestamp: 1762984042927 - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c md5: edd329d7d3a4ab45dcf905899a7a6115 @@ -2532,16 +2554,16 @@ packages: license_family: PSF size: 91383 timestamp: 1756220668932 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda - sha256: 8aaf69b828c2b94d0784f18f70f11aa032950d304e57e88467120b45c18c24fd - md5: 399701494e731ce73fdd86c185a3d1b4 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda + sha256: 70db27de58a97aeb7ba7448366c9853f91b21137492e0b4430251a1870aa8ff4 + md5: a0a4a3035667fc34f29bfbd5c190baa6 depends: - python >=3.10 - typing_extensions >=4.12.0 license: MIT license_family: MIT - size: 18799 - timestamp: 1759301271883 + size: 18923 + timestamp: 1764158430324 - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 md5: 0caa1af407ecff61170c9437a808404d @@ -2600,123 +2622,123 @@ packages: license_family: BSD size: 7719 timestamp: 1760803936446 -- conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.22.1-py313h07c4f96_0.conda - sha256: fc9859654f48dcdf461f6806c150d9173499c9523f08488fe77cee502841d6c9 - md5: 023e943ca41d64a98b8d7157cfeb906b +- conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.22.1-py314h5bd0f2a_1.conda + sha256: ad3058ed67e1de5f9a73622a44a5c7a51af6a4527cf4881ae22b8bb6bd30bceb + md5: 41f06d5cb2a80011c7da5a835721acdd depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libuv >=1.51.0,<2.0a0 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 license: MIT OR Apache-2.0 - size: 619830 - timestamp: 1760702353710 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvloop-0.22.1-py313h6194ac5_0.conda - sha256: d1eca2d2e9131b7926b1905a793d41b9f0b6f89016b13ae1d9fca9949cc1dbcd - md5: b61fe02809f3046035e7f20c0dd835fc + size: 593392 + timestamp: 1762472837997 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvloop-0.22.1-py314h51f160d_1.conda + sha256: aab844580f004e1f639aed2ca8da151c7f0a23442dbfd0c6ebb8a2a3db3de029 + md5: 002fa344ab1b587c6de1a5de29eff1e4 depends: - libgcc >=14 - libuv >=1.51.0,<2.0a0 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 license: MIT OR Apache-2.0 - size: 571422 - timestamp: 1760702429961 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.22.1-py313h6535dbc_0.conda - sha256: b0ccdb15fff540a813810bca95dc95b04198fdd1a987a90f744028871572c978 - md5: b7dd9a0c60fa5608b714d7d5f89a9393 + size: 552740 + timestamp: 1762472897912 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.22.1-py314h0612a62_1.conda + sha256: 7850dd9238beb14f9c7db1901229cc5d2ecd10d031cbdb712a95eba57a5d5992 + md5: 74683034f513752be1467c9232480a13 depends: - __osx >=11.0 - libuv >=1.51.0,<2.0a0 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 license: MIT OR Apache-2.0 - size: 502205 - timestamp: 1760702852264 -- conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.1.1-py313h5c7d99a_0.conda - sha256: 11a07764137af9bcf29e9e26671c1be1ea1302f7dd7075a4d41481489883eaff - md5: 9373034735566df29779429f0c0de511 + size: 492509 + timestamp: 1762473163613 +- conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.1.1-py314ha5689aa_0.conda + sha256: fcec93ca26320764c55042fc56b772a88533ed01f1c713553c985b379e174d09 + md5: fb190bbf05b3b963bea7ab7c20624d5d depends: - __glibc >=2.17,<3.0.a0 - anyio >=3.0.0 - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 constrains: - __glibc >=2.17 license: MIT license_family: MIT - size: 420641 - timestamp: 1760456759391 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/watchfiles-1.1.1-py313he77ad87_0.conda - sha256: 2bd26b15aac02063e469b2efbb7efc5499347940329011f6f8d40b287e1caa15 - md5: f276ef02ff6365c220d9f0a917c3b31f + size: 421969 + timestamp: 1760456771978 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/watchfiles-1.1.1-py314hfe60d44_0.conda + sha256: 22193a476b0a1e4ede784e9056e6dfbea70d4a0a99557b86a1353fee6a44d6d4 + md5: 712cd01395679d7be34576099ddd2732 depends: - anyio >=3.0.0 - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 constrains: - __glibc >=2.17 license: MIT license_family: MIT - size: 411329 - timestamp: 1760456814453 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.1.1-py313h0b74987_0.conda - sha256: 6c3bb78efbaa8aa616ef9fe8ddb14dd2a3d06324f6c6f38f80f4653c7961b402 - md5: c059753f94e279e722fec0532d28b390 + size: 415756 + timestamp: 1760456858941 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.1.1-py314h8d4a433_0.conda + sha256: b9446970047031e66edf76548fa427fe0ce7e81655208dc2e2a0b0bf94ebf7ba + md5: 33c8e4a66a7cb5d75ba8165a6075cd28 depends: - __osx >=11.0 - anyio >=3.0.0 - - python >=3.13,<3.14.0a0 - - python >=3.13,<3.14.0a0 *_cp313 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 constrains: - __osx >=11.0 license: MIT license_family: MIT - size: 364700 - timestamp: 1760457647108 -- conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-15.0.1-py313h54dd161_2.conda - sha256: 9de398238e7737d79a36db16f49b1e82b032c7ea7458f8af7396653c5f9bf6bc - md5: d6dccef73e6b207a6ad0095e19c7690f + size: 367150 + timestamp: 1760457260426 +- conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-15.0.1-py314h31f8a6b_2.conda + sha256: 102c0acc2301908bcc0bd0c792e059cf8a6b93fc819f56c8a3b8a6b473afe58a + md5: e05c3cce47cc4f32f886eb17091ba6e2 depends: - python - - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - python_abi 3.13.* *_cp313 + - libgcc >=14 + - python_abi 3.14.* *_cp314 license: BSD-3-Clause license_family: BSD - size: 364253 - timestamp: 1756476348604 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/websockets-15.0.1-py313h62ef0ea_2.conda - sha256: 3fe53660fab9e23c9a32deb138f3dffa60a6a813a9c127fa6d1076d5d308edf8 - md5: 30821a5393c5040053b8137c00e1e177 + size: 380425 + timestamp: 1756476367704 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/websockets-15.0.1-py314hc032435_2.conda + sha256: 9a1788a0270b90819b4ad982331a2777d99417431e1c5ee0b1bd14f5ce9f3caf + md5: 61e79b04086300695f515b2e22565884 depends: - python - libgcc >=14 - - python 3.13.* *_cp313 - - python_abi 3.13.* *_cp313 + - python 3.14.* *_cp314 + - python_abi 3.14.* *_cp314 license: BSD-3-Clause license_family: BSD - size: 368742 - timestamp: 1756476356365 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-15.0.1-py313h5b5ffa7_2.conda - sha256: f69336b39d0c0e38d1e82054de850120478cabf0e661b0042967dde6df263a1c - md5: ef9a9bc862e6b22426c2614748567b37 + size: 384954 + timestamp: 1756476376422 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-15.0.1-py314hf17b0b1_2.conda + sha256: c00677dc11e5f20e115ab7252c60893cd0bac9fc78b12678d62ba6b1b5dcb3f7 + md5: 22ef4a8d9fdd426f7fb9d5b3bf168c2a depends: - python - - python 3.13.* *_cp313 + - python 3.14.* *_cp314 - __osx >=11.0 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 license: BSD-3-Clause license_family: BSD - size: 367500 - timestamp: 1756476397592 + size: 383627 + timestamp: 1756476437332 - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad md5: a77f85f77be52ff59391544bfe73390a @@ -2783,90 +2805,87 @@ packages: license_family: MOZILLA size: 244772 timestamp: 1757371008525 -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - sha256: 7560d21e1b021fd40b65bfb72f67945a3fcb83d78ad7ccf37b8b3165ec3b68ad - md5: df5e78d904988eb55042c0c97446079f +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda + sha256: b4533f7d9efc976511a73ef7d4a2473406d7f4c750884be8e8620b0ce70f4dae + md5: 30cd29cb87d819caead4d55184c1d115 depends: - - python >=3.9 + - python >=3.10 + - python license: MIT license_family: MIT - size: 22963 - timestamp: 1749421737203 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_0.conda - sha256: 9d79d176afe50361cc3fd4366bedff20852dbea1e5b03f358b55f12aca22d60d - md5: 1fe43bd1fc86e22ad3eb0edec637f8a2 + size: 24194 + timestamp: 1764460141901 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda + sha256: e589f694b44084f2e04928cabd5dda46f20544a512be2bdb0d067d498e4ac8d0 + md5: 2930a6e1c7b3bc5f66172e324a8f5fc3 depends: - python - cffi >=1.11 - zstd >=1.5.7,<1.5.8.0a0 - - libgcc >=14 - __glibc >=2.17,<3.0.a0 + - libgcc >=14 - zstd >=1.5.7,<1.6.0a0 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 license: BSD-3-Clause license_family: BSD - size: 471152 - timestamp: 1757930114245 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.25.0-py313h62ef0ea_0.conda - sha256: b80b64093a79518adcccf997a7a55a22a2db4a0c654bacb1b1e0b105a4d2e88d - md5: fcde9124e91d6525cc8357273adc06f4 + size: 473605 + timestamp: 1762512687493 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.25.0-py314h2e8dab5_1.conda + sha256: 051f12494f28f9de8b1bf1a787646c1f675d8eba0ba0eac79ab96ef960d24746 + md5: db33d0e8888bef6ef78207c5e6106a5b depends: - python - cffi >=1.11 - zstd >=1.5.7,<1.5.8.0a0 + - python 3.14.* *_cp314 - libgcc >=14 - - python 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 - zstd >=1.5.7,<1.6.0a0 - - python_abi 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD - size: 463882 - timestamp: 1757930129231 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.25.0-py313h9734d34_0.conda - sha256: 8a1bf8a66c05f724e8a56cb1918eae70bcb467a7c5d43818e37e04d86332c513 - md5: ce17795bf104a29a2c7ed0bba7a804cb + size: 465094 + timestamp: 1762512736835 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.25.0-py314h9d33bd4_1.conda + sha256: cdeb350914094e15ec6310f4699fa81120700ca7ab7162a6b3421f9ea9c690b4 + md5: 8a92a736ab23b4633ac49dcbfcc81e14 depends: - python - cffi >=1.11 - zstd >=1.5.7,<1.5.8.0a0 + - python 3.14.* *_cp314 - __osx >=11.0 - - python 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 - zstd >=1.5.7,<1.6.0a0 - - python_abi 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD - size: 396477 - timestamp: 1757930170468 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda - sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb - md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + size: 397786 + timestamp: 1762512730914 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-h3691f8a_4.conda + sha256: 58e0344d81520c8734533fff64a28a5be7edf84618341fc70d3e20bd0a1fdc3e + md5: af7715829219de9043fcc5575e66d22e depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD - size: 567578 - timestamp: 1742433379869 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_2.conda - sha256: 0812e7b45f087cfdd288690ada718ce5e13e8263312e03b643dd7aa50d08b51b - md5: 5be90c5a3e4b43c53e38f50a85e11527 + size: 559888 + timestamp: 1764431250718 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hefd9da6_4.conda + sha256: a01724931d47d49264bea98cbc5c8e747f55d323361b2389509bc2db45e5d9bf + md5: 68a63e1ba896c15344e33eacb11e1311 depends: - - libgcc >=13 - - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD - size: 551176 - timestamp: 1742433378347 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda - sha256: 0d02046f57f7a1a3feae3e9d1aa2113788311f3cf37a3244c71e61a93177ba67 - md5: e6f69c7bcccdefa417f056fa593b40f0 + size: 552788 + timestamp: 1764431387803 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hd0aec43_4.conda + sha256: 3bfc4928755b76a0bbf364f9c042d89f2e60dea7325802f62e75e3345d1ed4f7 + md5: 93345396269a7f456f2e80de6bda540d depends: - __osx >=11.0 - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD - size: 399979 - timestamp: 1742433432699 + size: 400086 + timestamp: 1764431655348 diff --git a/pixi.toml b/pixi.toml index 64c09b00..5f5cd4ad 100644 --- a/pixi.toml +++ b/pixi.toml @@ -1,10 +1,10 @@ -[project] +[workspace] authors = ["saviorand"] channels = ["conda-forge", "https://conda.modular.com/max", "https://repo.prefix.dev/modular-community"] description = "Simple and fast HTTP framework for Mojo!" name = "lightbug_http" platforms = ["osx-arm64", "linux-64", "linux-aarch64"] -version = "0.25.6" +version = "0.25.7" [tasks] build = { cmd = "rattler-build build --recipe recipes -c https://conda.modular.com/max -c conda-forge --skip-existing=all", env = {MODULAR_MOJO_IMPORT_PATH = "$CONDA_PREFIX/lib/mojo"} } @@ -12,11 +12,11 @@ publish = { cmd = "bash scripts/publish.sh", env = { PREFIX_API_KEY = "$PREFIX_A format = { cmd = "mojo format -l 120 lightbug_http" } [feature.unit-tests.tasks] -test = { cmd = "mojo test -I . tests/lightbug_http" } +test = { cmd = "bash scripts/mojo_tests.sh tests/lightbug_http" } [feature.integration-tests.tasks] integration_tests_py = { cmd = "bash scripts/integration_test.sh" } -integration_tests_external = { cmd = "mojo test -I . tests/integration" } +integration_tests_external = { cmd = "bash scripts/mojo_tests.sh tests/integration" } integration_tests_udp = { cmd = "bash scripts/udp_test.sh" } [feature.bench.tasks] @@ -24,7 +24,8 @@ bench = { cmd = "mojo -I . benchmark/bench.mojo" } bench_server = { cmd = "bash scripts/bench_server.sh" } [dependencies] -mojo = ">=0.25.6,<0.26" +mojo = ">=0.25.7,<0.26" +rattler-build = ">=0.27.0,<1" [feature.integration-tests.dependencies] requests = ">=2.32.3,<3" diff --git a/scripts/mojo_tests.sh b/scripts/mojo_tests.sh new file mode 100755 index 00000000..8f4e5a40 --- /dev/null +++ b/scripts/mojo_tests.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +set -e + +# Get test directory from first argument +if [ -z "$1" ]; then + echo "Error: Test directory not provided" + echo "Usage: $0 " + exit 1 +fi +test_dir="$1" + +any_failed=false +echo "### ------------------------------------------------------------- ###" +while IFS= read -r test_file; do + if ! mojo run -I . "$test_file"; then + any_failed=true + fi + echo "### ------------------------------------------------------------- ###" +done < <(find "$test_dir" -name "test_*.mojo" -type f | sort) + +if [ "$any_failed" = true ]; then + exit 1 +fi + diff --git a/tests/integration/test_client.mojo b/tests/integration/test_client.mojo index 96995d1f..26c53cb2 100644 --- a/tests/integration/test_client.mojo +++ b/tests/integration/test_client.mojo @@ -91,3 +91,6 @@ fn test_mojo_client_lightbug_external_req_200() raises: except e: print(e) raise + +fn main() raises: + testing.TestSuite.discover_tests[__functions_in_module()]().run() \ No newline at end of file diff --git a/tests/integration/test_pool_manager.mojo b/tests/integration/test_pool_manager.mojo index e69de29b..cecadd50 100644 --- a/tests/integration/test_pool_manager.mojo +++ b/tests/integration/test_pool_manager.mojo @@ -0,0 +1,6 @@ +from testing import TestSuite + + +def main(): + TestSuite.discover_tests[__functions_in_module()]().run() + diff --git a/tests/integration/test_server.mojo b/tests/integration/test_server.mojo index e69de29b..cecadd50 100644 --- a/tests/integration/test_server.mojo +++ b/tests/integration/test_server.mojo @@ -0,0 +1,6 @@ +from testing import TestSuite + + +def main(): + TestSuite.discover_tests[__functions_in_module()]().run() + diff --git a/tests/integration/test_socket.mojo b/tests/integration/test_socket.mojo index e69de29b..cecadd50 100644 --- a/tests/integration/test_socket.mojo +++ b/tests/integration/test_socket.mojo @@ -0,0 +1,6 @@ +from testing import TestSuite + + +def main(): + TestSuite.discover_tests[__functions_in_module()]().run() + diff --git a/tests/integration/udp/udp_client.mojo b/tests/integration/udp/udp_client.mojo index 90badd25..7800f2cd 100644 --- a/tests/integration/udp/udp_client.mojo +++ b/tests/integration/udp/udp_client.mojo @@ -15,8 +15,7 @@ fn main() raises: _ = udp.write_to(String(test_string[i]).as_bytes(), host, port) try: - response, _, _ = udp.read_from(16) - print("Response received:", StringSlice(unsafe_from_utf8=response)) + print("Response received:", StringSlice(unsafe_from_utf8=udp.read_from(16)[0])) except e: if String(e) != String("EOF"): raise e diff --git a/tests/integration/udp/udp_server.mojo b/tests/integration/udp/udp_server.mojo index f808a617..cb20bd7c 100644 --- a/tests/integration/udp/udp_server.mojo +++ b/tests/integration/udp/udp_server.mojo @@ -6,9 +6,9 @@ fn main() raises: var listener = listen_udp("127.0.0.1", 12000) while True: - response, host, port = listener.read_from(16) - var message = StringSlice(unsafe_from_utf8=response) + var response_host_port = listener.read_from(16) + var message = StringSlice(unsafe_from_utf8=response_host_port[0]) print("Message received:", message) # Response with the same message in uppercase - _ = listener.write_to(String.upper(String(message)).as_bytes(), host, port) + _ = listener.write_to(String.upper(String(message)).as_bytes(), response_host_port[1], response_host_port[2]) diff --git a/tests/lightbug_http/cookie/test_cookie.mojo b/tests/lightbug_http/cookie/test_cookie.mojo index ee938768..6cac2d66 100644 --- a/tests/lightbug_http/cookie/test_cookie.mojo +++ b/tests/lightbug_http/cookie/test_cookie.mojo @@ -1,6 +1,6 @@ from lightbug_http.cookie import SameSite, Cookie, Duration, Expiration from lightbug_http.external.small_time.small_time import SmallTime, now -from testing import assert_true, assert_equal +from testing import assert_true, assert_equal, TestSuite from collections import Optional @@ -38,3 +38,6 @@ fn test_expires_http_timestamp_format() raises: var http_date = Expiration.from_datetime(SmallTime(2037, 1, 22, 12, 0, 10, 0)).http_date_timestamp() assert_true(http_date is not None, msg="Http date is None") assert_equal(expected, http_date.value()) + +def main(): + TestSuite.discover_tests[__functions_in_module()]().run() \ No newline at end of file diff --git a/tests/lightbug_http/cookie/test_cookie_jar.mojo b/tests/lightbug_http/cookie/test_cookie_jar.mojo index e69de29b..cecadd50 100644 --- a/tests/lightbug_http/cookie/test_cookie_jar.mojo +++ b/tests/lightbug_http/cookie/test_cookie_jar.mojo @@ -0,0 +1,6 @@ +from testing import TestSuite + + +def main(): + TestSuite.discover_tests[__functions_in_module()]().run() + diff --git a/tests/lightbug_http/cookie/test_duration.mojo b/tests/lightbug_http/cookie/test_duration.mojo index d5e22ec0..cce9a9b6 100644 --- a/tests/lightbug_http/cookie/test_duration.mojo +++ b/tests/lightbug_http/cookie/test_duration.mojo @@ -9,3 +9,6 @@ def test_from_string(): def test_ctor(): testing.assert_equal(Duration(seconds=1, minutes=1, hours=1, days=1).total_seconds, 90061) + +def main(): + testing.TestSuite.discover_tests[__functions_in_module()]().run() \ No newline at end of file diff --git a/tests/lightbug_http/cookie/test_expiration.mojo b/tests/lightbug_http/cookie/test_expiration.mojo index 069a3344..e487d6e3 100644 --- a/tests/lightbug_http/cookie/test_expiration.mojo +++ b/tests/lightbug_http/cookie/test_expiration.mojo @@ -10,3 +10,7 @@ def test_ctors(): # Failure returns None # testing.assert_false(Expiration.from_string("abc").__bool__()) pass + + +def main(): + testing.TestSuite.discover_tests[__functions_in_module()]().run() \ No newline at end of file diff --git a/tests/lightbug_http/http/test_http.mojo b/tests/lightbug_http/http/test_http.mojo index bc57b986..cc4f9677 100644 --- a/tests/lightbug_http/http/test_http.mojo +++ b/tests/lightbug_http/http/test_http.mojo @@ -78,3 +78,7 @@ def test_http_version_parse(): testing.assert_equal(v1._v, 1) var v2 = HttpVersion("HTTP/2") testing.assert_equal(v2._v, 2) + + +def main(): + testing.TestSuite.discover_tests[__functions_in_module()]().run() \ No newline at end of file diff --git a/tests/lightbug_http/http/test_request.mojo b/tests/lightbug_http/http/test_request.mojo index 9198cf5f..7f061ed5 100644 --- a/tests/lightbug_http/http/test_request.mojo +++ b/tests/lightbug_http/http/test_request.mojo @@ -43,3 +43,7 @@ def test_read_body(): def test_encode(): ... + + +def main(): + testing.TestSuite.discover_tests[__functions_in_module()]().run() \ No newline at end of file diff --git a/tests/lightbug_http/http/test_response.mojo b/tests/lightbug_http/http/test_response.mojo index 54a7b5f5..ba5edea2 100644 --- a/tests/lightbug_http/http/test_response.mojo +++ b/tests/lightbug_http/http/test_response.mojo @@ -53,3 +53,7 @@ def test_read_chunks(): def test_encode(): ... + + +def main(): + testing.TestSuite.discover_tests[__functions_in_module()]().run() \ No newline at end of file diff --git a/tests/lightbug_http/io/test_byte_reader.mojo b/tests/lightbug_http/io/test_byte_reader.mojo index 8f96cbc9..c5814758 100644 --- a/tests/lightbug_http/io/test_byte_reader.mojo +++ b/tests/lightbug_http/io/test_byte_reader.mojo @@ -72,3 +72,6 @@ def test_skip_carriage_return(): def test_consume(): var r = ByteReader(example.as_bytes()) testing.assert_equal(to_string(r^.consume()), to_string(Bytes(72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33))) + +def main(): + testing.TestSuite.discover_tests[__functions_in_module()]().run() \ No newline at end of file diff --git a/tests/lightbug_http/io/test_byte_writer.mojo b/tests/lightbug_http/io/test_byte_writer.mojo index 16b24dd8..05f0fdbc 100644 --- a/tests/lightbug_http/io/test_byte_writer.mojo +++ b/tests/lightbug_http/io/test_byte_writer.mojo @@ -30,3 +30,6 @@ def test_write(): testing.assert_equal( to_string(w^.consume()), to_string(Bytes(72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33)) ) + +def main(): + testing.TestSuite.discover_tests[__functions_in_module()]().run() \ No newline at end of file diff --git a/tests/lightbug_http/io/test_bytes.mojo b/tests/lightbug_http/io/test_bytes.mojo index 2a244f43..ffa72049 100644 --- a/tests/lightbug_http/io/test_bytes.mojo +++ b/tests/lightbug_http/io/test_bytes.mojo @@ -28,3 +28,6 @@ fn test_string_to_bytes() raises: for c in cases.items(): testing.assert_equal(to_string(Bytes(c.key.as_bytes())), to_string(c.copy().value.copy())) + +def main(): + testing.TestSuite.discover_tests[__functions_in_module()]().run() \ No newline at end of file diff --git a/tests/lightbug_http/test_header.mojo b/tests/lightbug_http/test_header.mojo index d7900062..63a9d726 100644 --- a/tests/lightbug_http/test_header.mojo +++ b/tests/lightbug_http/test_header.mojo @@ -1,4 +1,4 @@ -from testing import assert_equal, assert_true +from testing import assert_equal, assert_true, TestSuite from memory import Span from lightbug_http.header import Headers, Header from lightbug_http.io.bytes import Bytes, bytes, ByteReader @@ -50,3 +50,6 @@ def test_parse_response_header(): assert_equal(header["Content-Length"], "1234") assert_equal(header["Connection"], "close") assert_equal(header["Trailer"], "end-of-message") + +def main(): + TestSuite.discover_tests[__functions_in_module()]().run() \ No newline at end of file diff --git a/tests/lightbug_http/test_host_port.mojo b/tests/lightbug_http/test_host_port.mojo index e80d9970..74c1bdda 100644 --- a/tests/lightbug_http/test_host_port.mojo +++ b/tests/lightbug_http/test_host_port.mojo @@ -1,115 +1,118 @@ -import testing +from testing import assert_equal, assert_false, assert_raises, assert_true, TestSuite from lightbug_http.address import TCPAddr, NetworkType, join_host_port, parse_address def test_split_host_port(): # TCP4 var hp = parse_address(NetworkType.tcp4, "127.0.0.1:8080") - testing.assert_equal(hp[0], "127.0.0.1") - testing.assert_equal(hp[1], 8080) + assert_equal(hp[0], "127.0.0.1") + assert_equal(hp[1], 8080) # TCP4 with localhost hp = parse_address(NetworkType.tcp4, "localhost:8080") - testing.assert_equal(hp[0], "127.0.0.1") - testing.assert_equal(hp[1], 8080) + assert_equal(hp[0], "127.0.0.1") + assert_equal(hp[1], 8080) # TCP6 hp = parse_address(NetworkType.tcp6, "[::1]:8080") - testing.assert_equal(hp[0], "::1") - testing.assert_equal(hp[1], 8080) + assert_equal(hp[0], "::1") + assert_equal(hp[1], 8080) # TCP6 with localhost hp = parse_address(NetworkType.tcp6, "localhost:8080") - testing.assert_equal(hp[0], "::1") - testing.assert_equal(hp[1], 8080) + assert_equal(hp[0], "::1") + assert_equal(hp[1], 8080) # UDP4 hp = parse_address(NetworkType.udp4, "192.168.1.1:53") - testing.assert_equal(hp[0], "192.168.1.1") - testing.assert_equal(hp[1], 53) + assert_equal(hp[0], "192.168.1.1") + assert_equal(hp[1], 53) # UDP4 with localhost hp = parse_address(NetworkType.udp4, "localhost:53") - testing.assert_equal(hp[0], "127.0.0.1") - testing.assert_equal(hp[1], 53) + assert_equal(hp[0], "127.0.0.1") + assert_equal(hp[1], 53) # UDP6 hp = parse_address(NetworkType.udp6, "[2001:db8::1]:53") - testing.assert_equal(hp[0], "2001:db8::1") - testing.assert_equal(hp[1], 53) + assert_equal(hp[0], "2001:db8::1") + assert_equal(hp[1], 53) # UDP6 with localhost hp = parse_address(NetworkType.udp6, "localhost:53") - testing.assert_equal(hp[0], "::1") - testing.assert_equal(hp[1], 53) + assert_equal(hp[0], "::1") + assert_equal(hp[1], 53) # IP4 (no port) hp = parse_address(NetworkType.ip4, "192.168.1.1") - testing.assert_equal(hp[0], "192.168.1.1") - testing.assert_equal(hp[1], 0) + assert_equal(hp[0], "192.168.1.1") + assert_equal(hp[1], 0) # IP4 with localhost hp = parse_address(NetworkType.ip4, "localhost") - testing.assert_equal(hp[0], "127.0.0.1") - testing.assert_equal(hp[1], 0) + assert_equal(hp[0], "127.0.0.1") + assert_equal(hp[1], 0) # IP6 (no port) hp = parse_address(NetworkType.ip6, "2001:db8::1") - testing.assert_equal(hp[0], "2001:db8::1") - testing.assert_equal(hp[1], 0) + assert_equal(hp[0], "2001:db8::1") + assert_equal(hp[1], 0) # IP6 with localhost hp = parse_address(NetworkType.ip6, "localhost") - testing.assert_equal(hp[0], "::1") - testing.assert_equal(hp[1], 0) + assert_equal(hp[0], "::1") + assert_equal(hp[1], 0) # TODO: IPv6 long form - Not supported yet. # hp = parse_address("0:0:0:0:0:0:0:1:8080") - # testing.assert_equal(hp[0], "0:0:0:0:0:0:0:1") - # testing.assert_equal(hp[1], 8080) + # assert_equal(hp[0], "0:0:0:0:0:0:0:1") + # assert_equal(hp[1], 8080) # Error cases # IP protocol with port try: _ = parse_address(NetworkType.ip4, "192.168.1.1:80") - testing.assert_false("Should have raised an error for IP protocol with port") + assert_false("Should have raised an error for IP protocol with port") except Error: - testing.assert_true(True) + assert_true(True) # Missing port try: _ = parse_address(NetworkType.tcp4, "192.168.1.1") - testing.assert_false("Should have raised MissingPortError") + assert_false("Should have raised MissingPortError") except MissingPortError: - testing.assert_true(True) + assert_true(True) # Missing port try: _ = parse_address(NetworkType.tcp6, "[::1]") - testing.assert_false("Should have raised MissingPortError") + assert_false("Should have raised MissingPortError") except MissingPortError: - testing.assert_true(True) + assert_true(True) # Port out of range try: _ = parse_address(NetworkType.tcp4, "192.168.1.1:70000") - testing.assert_false("Should have raised error for invalid port") + assert_false("Should have raised error for invalid port") except Error: - testing.assert_true(True) + assert_true(True) # Missing closing bracket try: _ = parse_address(NetworkType.tcp6, "[::1:8080") - testing.assert_false("Should have raised error for missing bracket") + assert_false("Should have raised error for missing bracket") except Error: - testing.assert_true(True) + assert_true(True) def test_join_host_port(): # IPv4 - testing.assert_equal(join_host_port("127.0.0.1", "8080"), "127.0.0.1:8080") + assert_equal(join_host_port("127.0.0.1", "8080"), "127.0.0.1:8080") # IPv6 - testing.assert_equal(join_host_port("::1", "8080"), "[::1]:8080") + assert_equal(join_host_port("::1", "8080"), "[::1]:8080") # TODO: IPv6 long form - Not supported yet. + +def main(): + TestSuite.discover_tests[__functions_in_module()]().run() \ No newline at end of file diff --git a/tests/lightbug_http/test_owning_list.mojo b/tests/lightbug_http/test_owning_list.mojo index 0aed5e77..855853c1 100644 --- a/tests/lightbug_http/test_owning_list.mojo +++ b/tests/lightbug_http/test_owning_list.mojo @@ -1,8 +1,8 @@ from lightbug_http._owning_list import OwningList from sys.info import size_of -from memory import UnsafePointer, Span -from testing import assert_equal, assert_false, assert_raises, assert_true +from memory import LegacyUnsafePointer, Span +from testing import assert_equal, assert_false, assert_raises, assert_true, TestSuite def test_mojo_issue_698(): @@ -430,8 +430,8 @@ def test_indexing(): l.append(2) l.append(3) assert_equal(l[Int(1)], 2) - assert_equal(l[False], 1) - assert_equal(l[True], 2) + # assert_equal(l[False], 1) + # assert_equal(l[True], 2) assert_equal(l[2], 3) @@ -492,3 +492,6 @@ def test_list_repr(): assert_equal(l.__repr__(), "[1, 2, 3]") var empty = OwningList[Int]() assert_equal(empty.__repr__(), "[]") + +def main(): + TestSuite.discover_tests[__functions_in_module()]().run() \ No newline at end of file diff --git a/tests/lightbug_http/test_server.mojo b/tests/lightbug_http/test_server.mojo index ac0d504f..87468512 100644 --- a/tests/lightbug_http/test_server.mojo +++ b/tests/lightbug_http/test_server.mojo @@ -1,4 +1,4 @@ -from testing import assert_equal +from testing import assert_equal, TestSuite from lightbug_http.server import Server @@ -12,3 +12,7 @@ from lightbug_http.server import Server # server = Server(max_concurrent_connections=10) # assert_equal(server.get_concurrency(), 10) + + +def main(): + TestSuite.discover_tests[__functions_in_module()]().run() diff --git a/tests/lightbug_http/test_service.mojo b/tests/lightbug_http/test_service.mojo index 17753b8c..e29f2343 100644 --- a/tests/lightbug_http/test_service.mojo +++ b/tests/lightbug_http/test_service.mojo @@ -20,3 +20,6 @@ def test_tech_empower_router(): def test_counter(): pass + +def main(): + testing.TestSuite.discover_tests[__functions_in_module()]().run() \ No newline at end of file diff --git a/tests/lightbug_http/test_uri.mojo b/tests/lightbug_http/test_uri.mojo index 553aa4f2..4a3481be 100644 --- a/tests/lightbug_http/test_uri.mojo +++ b/tests/lightbug_http/test_uri.mojo @@ -1,4 +1,4 @@ -import testing +from testing import assert_equal, assert_false, assert_raises, assert_true, TestSuite from lightbug_http.uri import URI from lightbug_http.strings import empty_string, to_string from lightbug_http.io.bytes import Bytes @@ -6,180 +6,183 @@ from lightbug_http.io.bytes import Bytes def test_uri_no_parse_defaults(): var uri = URI.parse("http://example.com") - testing.assert_equal(uri.full_uri, "http://example.com") - testing.assert_equal(uri.scheme, "http") - testing.assert_equal(uri.path, "/") + assert_equal(uri.full_uri, "http://example.com") + assert_equal(uri.scheme, "http") + assert_equal(uri.path, "/") def test_uri_parse_http_with_port(): var uri = URI.parse("http://example.com:8080/index.html") - testing.assert_equal(uri.scheme, "http") - testing.assert_equal(uri.host, "example.com") - testing.assert_equal(uri.port.value(), 8080) - testing.assert_equal(uri.path, "/index.html") - testing.assert_equal(uri._original_path, "/index.html") - testing.assert_equal(uri.request_uri, "/index.html") - testing.assert_equal(uri.is_https(), False) - testing.assert_equal(uri.is_http(), True) - testing.assert_equal(uri.query_string, empty_string) + assert_equal(uri.scheme, "http") + assert_equal(uri.host, "example.com") + assert_equal(uri.port.value(), 8080) + assert_equal(uri.path, "/index.html") + assert_equal(uri._original_path, "/index.html") + assert_equal(uri.request_uri, "/index.html") + assert_equal(uri.is_https(), False) + assert_equal(uri.is_http(), True) + assert_equal(uri.query_string, empty_string) def test_uri_parse_https_with_port(): var uri = URI.parse("https://example.com:8080/index.html") - testing.assert_equal(uri.scheme, "https") - testing.assert_equal(uri.host, "example.com") - testing.assert_equal(uri.port.value(), 8080) - testing.assert_equal(uri.path, "/index.html") - testing.assert_equal(uri._original_path, "/index.html") - testing.assert_equal(uri.request_uri, "/index.html") - testing.assert_equal(uri.is_https(), True) - testing.assert_equal(uri.is_http(), False) - testing.assert_equal(uri.query_string, empty_string) + assert_equal(uri.scheme, "https") + assert_equal(uri.host, "example.com") + assert_equal(uri.port.value(), 8080) + assert_equal(uri.path, "/index.html") + assert_equal(uri._original_path, "/index.html") + assert_equal(uri.request_uri, "/index.html") + assert_equal(uri.is_https(), True) + assert_equal(uri.is_http(), False) + assert_equal(uri.query_string, empty_string) def test_uri_parse_http_with_path(): var uri = URI.parse("http://example.com/index.html") - testing.assert_equal(uri.scheme, "http") - testing.assert_equal(uri.host, "example.com") - testing.assert_equal(uri.path, "/index.html") - testing.assert_equal(uri._original_path, "/index.html") - testing.assert_equal(uri.request_uri, "/index.html") - testing.assert_equal(uri.is_https(), False) - testing.assert_equal(uri.is_http(), True) - testing.assert_equal(uri.query_string, empty_string) + assert_equal(uri.scheme, "http") + assert_equal(uri.host, "example.com") + assert_equal(uri.path, "/index.html") + assert_equal(uri._original_path, "/index.html") + assert_equal(uri.request_uri, "/index.html") + assert_equal(uri.is_https(), False) + assert_equal(uri.is_http(), True) + assert_equal(uri.query_string, empty_string) def test_uri_parse_https_with_path(): var uri = URI.parse("https://example.com/index.html") - testing.assert_equal(uri.scheme, "https") - testing.assert_equal(uri.host, "example.com") - testing.assert_equal(uri.path, "/index.html") - testing.assert_equal(uri._original_path, "/index.html") - testing.assert_equal(uri.request_uri, "/index.html") - testing.assert_equal(uri.is_https(), True) - testing.assert_equal(uri.is_http(), False) - testing.assert_equal(uri.query_string, empty_string) + assert_equal(uri.scheme, "https") + assert_equal(uri.host, "example.com") + assert_equal(uri.path, "/index.html") + assert_equal(uri._original_path, "/index.html") + assert_equal(uri.request_uri, "/index.html") + assert_equal(uri.is_https(), True) + assert_equal(uri.is_http(), False) + assert_equal(uri.query_string, empty_string) def test_uri_parse_path_with_encoding(): var uri = URI.parse("https://example.com/test%20test/index.html") - testing.assert_equal(uri.path, "/test test/index.html") + assert_equal(uri.path, "/test test/index.html") def test_uri_parse_path_with_encoding_ignore_slashes(): var uri = URI.parse("https://example.com/trying_to%2F_be_clever/42.html") - testing.assert_equal(uri.path, "/trying_to_be_clever/42.html") + assert_equal(uri.path, "/trying_to_be_clever/42.html") def test_uri_parse_http_basic(): var uri = URI.parse("http://example.com") - testing.assert_equal(uri.scheme, "http") - testing.assert_equal(uri.host, "example.com") - testing.assert_equal(uri.path, "/") - testing.assert_equal(uri._original_path, "/") - testing.assert_equal(uri.request_uri, "/") - testing.assert_equal(uri.query_string, empty_string) + assert_equal(uri.scheme, "http") + assert_equal(uri.host, "example.com") + assert_equal(uri.path, "/") + assert_equal(uri._original_path, "/") + assert_equal(uri.request_uri, "/") + assert_equal(uri.query_string, empty_string) def test_uri_parse_http_basic_www(): var uri = URI.parse("http://www.example.com") - testing.assert_equal(uri.scheme, "http") - testing.assert_equal(uri.host, "www.example.com") - testing.assert_equal(uri.path, "/") - testing.assert_equal(uri._original_path, "/") - testing.assert_equal(uri.request_uri, "/") - testing.assert_equal(uri.query_string, empty_string) + assert_equal(uri.scheme, "http") + assert_equal(uri.host, "www.example.com") + assert_equal(uri.path, "/") + assert_equal(uri._original_path, "/") + assert_equal(uri.request_uri, "/") + assert_equal(uri.query_string, empty_string) def test_uri_parse_http_with_query_string(): var uri = URI.parse("http://www.example.com/job?title=engineer") - testing.assert_equal(uri.scheme, "http") - testing.assert_equal(uri.host, "www.example.com") - testing.assert_equal(uri.path, "/job") - testing.assert_equal(uri._original_path, "/job") - testing.assert_equal(uri.request_uri, "/job?title=engineer") - testing.assert_equal(uri.query_string, "title=engineer") - testing.assert_equal(uri.queries["title"], "engineer") + assert_equal(uri.scheme, "http") + assert_equal(uri.host, "www.example.com") + assert_equal(uri.path, "/job") + assert_equal(uri._original_path, "/job") + assert_equal(uri.request_uri, "/job?title=engineer") + assert_equal(uri.query_string, "title=engineer") + assert_equal(uri.queries["title"], "engineer") def test_uri_parse_multiple_query_parameters(): var uri = URI.parse("http://example.com/search?q=python&page=1&limit=20") - testing.assert_equal(uri.scheme, "http") - testing.assert_equal(uri.host, "example.com") - testing.assert_equal(uri.path, "/search") - testing.assert_equal(uri.query_string, "q=python&page=1&limit=20") - testing.assert_equal(uri.queries["q"], "python") - testing.assert_equal(uri.queries["page"], "1") - testing.assert_equal(uri.queries["limit"], "20") - testing.assert_equal(uri.request_uri, "/search?q=python&page=1&limit=20") + assert_equal(uri.scheme, "http") + assert_equal(uri.host, "example.com") + assert_equal(uri.path, "/search") + assert_equal(uri.query_string, "q=python&page=1&limit=20") + assert_equal(uri.queries["q"], "python") + assert_equal(uri.queries["page"], "1") + assert_equal(uri.queries["limit"], "20") + assert_equal(uri.request_uri, "/search?q=python&page=1&limit=20") def test_uri_parse_query_with_special_characters(): var uri = URI.parse("https://example.com/path?name=John+Doe&email=john%40example.com&escaped%40%20name=42") - testing.assert_equal(uri.scheme, "https") - testing.assert_equal(uri.host, "example.com") - testing.assert_equal(uri.path, "/path") - testing.assert_equal(uri.query_string, "name=John+Doe&email=john%40example.com&escaped%40%20name=42") - testing.assert_equal(uri.queries["name"], "John Doe") - testing.assert_equal(uri.queries["email"], "john@example.com") - testing.assert_equal(uri.queries["escaped@ name"], "42") + assert_equal(uri.scheme, "https") + assert_equal(uri.host, "example.com") + assert_equal(uri.path, "/path") + assert_equal(uri.query_string, "name=John+Doe&email=john%40example.com&escaped%40%20name=42") + assert_equal(uri.queries["name"], "John Doe") + assert_equal(uri.queries["email"], "john@example.com") + assert_equal(uri.queries["escaped@ name"], "42") def test_uri_parse_empty_query_values(): var uri = URI.parse("http://example.com/api?key=&token=&empty") - testing.assert_equal(uri.query_string, "key=&token=&empty") - testing.assert_equal(uri.queries["key"], "") - testing.assert_equal(uri.queries["token"], "") - testing.assert_equal(uri.queries["empty"], "") + assert_equal(uri.query_string, "key=&token=&empty") + assert_equal(uri.queries["key"], "") + assert_equal(uri.queries["token"], "") + assert_equal(uri.queries["empty"], "") def test_uri_parse_complex_query(): var uri = URI.parse("https://example.com/search?q=test&filter[category]=books&filter[price]=10-20&sort=desc&page=1") - testing.assert_equal(uri.scheme, "https") - testing.assert_equal(uri.host, "example.com") - testing.assert_equal(uri.path, "/search") - testing.assert_equal(uri.query_string, "q=test&filter[category]=books&filter[price]=10-20&sort=desc&page=1") - testing.assert_equal(uri.queries["q"], "test") - testing.assert_equal(uri.queries["filter[category]"], "books") - testing.assert_equal(uri.queries["filter[price]"], "10-20") - testing.assert_equal(uri.queries["sort"], "desc") - testing.assert_equal(uri.queries["page"], "1") + assert_equal(uri.scheme, "https") + assert_equal(uri.host, "example.com") + assert_equal(uri.path, "/search") + assert_equal(uri.query_string, "q=test&filter[category]=books&filter[price]=10-20&sort=desc&page=1") + assert_equal(uri.queries["q"], "test") + assert_equal(uri.queries["filter[category]"], "books") + assert_equal(uri.queries["filter[price]"], "10-20") + assert_equal(uri.queries["sort"], "desc") + assert_equal(uri.queries["page"], "1") def test_uri_parse_query_with_unicode(): var uri = URI.parse("http://example.com/search?q=%E2%82%AC&lang=%F0%9F%87%A9%F0%9F%87%AA") - testing.assert_equal(uri.query_string, "q=%E2%82%AC&lang=%F0%9F%87%A9%F0%9F%87%AA") - testing.assert_equal(uri.queries["q"], "€") - testing.assert_equal(uri.queries["lang"], "🇩🇪") + assert_equal(uri.query_string, "q=%E2%82%AC&lang=%F0%9F%87%A9%F0%9F%87%AA") + assert_equal(uri.queries["q"], "€") + assert_equal(uri.queries["lang"], "🇩🇪") # def test_uri_parse_query_with_fragments(): # var uri = URI.parse("http://example.com/page?id=123#section1") -# testing.assert_equal(uri.query_string, "id=123") -# testing.assert_equal(uri.queries["id"], "123") -# testing.assert_equal(...) - how do we treat fragments? +# assert_equal(uri.query_string, "id=123") +# assert_equal(uri.queries["id"], "123") +# assert_equal(...) - how do we treat fragments? def test_uri_parse_no_scheme(): var uri = URI.parse("www.example.com") - testing.assert_equal(uri.scheme, "http") - testing.assert_equal(uri.host, "www.example.com") + assert_equal(uri.scheme, "http") + assert_equal(uri.host, "www.example.com") def test_uri_ip_address_no_scheme(): var uri = URI.parse("168.22.0.1/path/to/favicon.ico") - testing.assert_equal(uri.scheme, "http") - testing.assert_equal(uri.host, "168.22.0.1") - testing.assert_equal(uri.path, "/path/to/favicon.ico") + assert_equal(uri.scheme, "http") + assert_equal(uri.host, "168.22.0.1") + assert_equal(uri.path, "/path/to/favicon.ico") def test_uri_ip_address(): var uri = URI.parse("http://168.22.0.1:8080/path/to/favicon.ico") - testing.assert_equal(uri.scheme, "http") - testing.assert_equal(uri.host, "168.22.0.1") - testing.assert_equal(uri.path, "/path/to/favicon.ico") - testing.assert_equal(uri.port.value(), 8080) + assert_equal(uri.scheme, "http") + assert_equal(uri.host, "168.22.0.1") + assert_equal(uri.path, "/path/to/favicon.ico") + assert_equal(uri.port.value(), 8080) # def test_uri_parse_http_with_hash(): # ... + +def main(): + TestSuite.discover_tests[__functions_in_module()]().run() \ No newline at end of file