From ded9a683a3ea33b0bc27d91608f3d28212913c1d Mon Sep 17 00:00:00 2001 From: Joshua James Venter Date: Tue, 9 Jul 2024 22:45:36 +0200 Subject: [PATCH 01/39] Refactor `atol`: StringRef to StringSlice and reusability - StringRef to StringSlice - Introduce _handle_base_prefix & _trim_and_handle_sign - Changed var to alias Signed-off-by: Joshua James Venter --- stdlib/src/builtin/int.mojo | 34 +++-- stdlib/src/builtin/string.mojo | 180 ++++++++++++++++--------- stdlib/src/builtin/string_literal.mojo | 2 +- stdlib/src/utils/stringref.mojo | 2 +- 4 files changed, 141 insertions(+), 77 deletions(-) diff --git a/stdlib/src/builtin/int.mojo b/stdlib/src/builtin/int.mojo index 31e0e4c234..524ea57d84 100644 --- a/stdlib/src/builtin/int.mojo +++ b/stdlib/src/builtin/int.mojo @@ -218,21 +218,39 @@ fn int[T: IntableRaising](value: T) raises -> Int: fn int(value: String, base: Int = 10) raises -> Int: - """Parses the given string as an integer in the given base and returns that value. + """Parses and returns the given string as an integer in the given base. - For example, `atol("19")` returns `19`. If the given string cannot be parsed - as an integer value, an error is raised. For example, `atol("hi")` raises an - error. - - If base is 0 the the string is parsed as an Integer literal, - see: https://docs.python.org/3/reference/lexical_analysis.html#integers + If base is set to 0, the string is parsed as an Integer literal, with the + following considerations: + - '0b' or '0B' prefix indicates binary (base 2) + - '0o' or '0O' prefix indicates octal (base 8) + - '0x' or '0X' prefix indicates hexadecimal (base 16) + - Without a prefix, it's treated as decimal (base 10) Args: value: A string to be parsed as an integer in the given base. base: Base used for conversion, value must be between 2 and 36, or 0. Returns: - An integer value that represents the string, or otherwise raises. + An integer value that represents the string. + + Raises: + If the given string cannot be parsed as an integer value or if an + incorrect base is provided. + + Examples: + >>> int("32") + 32 + >>> int("FF", 16) + 255 + >>> int("0xFF", 0) + 255 + >>> int("0b1010", 0) + 10 + + Notes: + This follows [Python's integer literals]( + https://docs.python.org/3/reference/lexical_analysis.html#integers). """ return atol(value, base) diff --git a/stdlib/src/builtin/string.mojo b/stdlib/src/builtin/string.mojo index adf369e9ff..be05982b2d 100644 --- a/stdlib/src/builtin/string.mojo +++ b/stdlib/src/builtin/string.mojo @@ -212,15 +212,15 @@ fn ascii(value: String) -> String: # ===----------------------------------------------------------------------=== # -fn _atol(str_ref: StringRef, base: Int = 10) raises -> Int: - """Implementation of `atol` for StringRef inputs. +fn _atol(str_slice: StringSlice, base: Int = 10) raises -> Int: + """Implementation of `atol` for StringSlice inputs. Please see its docstring for details. """ if (base != 0) and (base < 2 or base > 36): raise Error("Base must be >= 2 and <= 36, or 0.") - if not str_ref: - raise Error(_atol_error(base, str_ref)) + if not str_slice: + raise Error(_str_to_base_error(base, str_slice)) var real_base: Int var ord_num_max: Int @@ -230,53 +230,23 @@ fn _atol(str_ref: StringRef, base: Int = 10) raises -> Int: var is_negative: Bool = False var has_prefix: Bool = False var start: Int = 0 - var str_len = len(str_ref) - var buff = str_ref.unsafe_ptr() - - for pos in range(start, str_len): - if _isspace(buff[pos]): - continue - - if str_ref[pos] == "-": - is_negative = True - start = pos + 1 - elif str_ref[pos] == "+": - start = pos + 1 - else: - start = pos - break + var str_len = len(str_slice) - if str_ref[start] == "0" and start + 1 < str_len: - if base == 2 and ( - str_ref[start + 1] == "b" or str_ref[start + 1] == "B" - ): - start += 2 - has_prefix = True - elif base == 8 and ( - str_ref[start + 1] == "o" or str_ref[start + 1] == "O" - ): - start += 2 - has_prefix = True - elif base == 16 and ( - str_ref[start + 1] == "x" or str_ref[start + 1] == "X" - ): - start += 2 - has_prefix = True + start, is_negative = _trim_and_handle_sign(str_slice, str_len) alias ord_0 = ord("0") - # FIXME: - # Change this to `alias` after fixing support for __getitem__ of alias. - var ord_letter_min = (ord("a"), ord("A")) + alias ord_letter_min = (ord("a"), ord("A")) alias ord_underscore = ord("_") if base == 0: - var real_base_new_start = _identify_base(str_ref, start) + var real_base_new_start = _identify_base(str_slice, start) real_base = real_base_new_start[0] start = real_base_new_start[1] has_prefix = real_base != 10 if real_base == -1: - raise Error(_atol_error(base, str_ref)) + raise Error(_str_to_base_error(base, str_slice)) else: + start, has_prefix = _handle_base_prefix(start, str_slice, str_len, base) real_base = base if real_base <= 10: @@ -288,21 +258,23 @@ fn _atol(str_ref: StringRef, base: Int = 10) raises -> Int: ord("A") + (real_base - 11), ) + var buff = str_slice.unsafe_ptr() var found_valid_chars_after_start = False var has_space_after_number = False + # Prefixed integer literals with real_base 2, 8, 16 may begin with leading # underscores under the conditions they have a prefix - var was_last_digit_undescore = not (real_base in (2, 8, 16) and has_prefix) + var was_last_digit_underscore = not (real_base in (2, 8, 16) and has_prefix) for pos in range(start, str_len): var ord_current = int(buff[pos]) if ord_current == ord_underscore: - if was_last_digit_undescore: - raise Error(_atol_error(base, str_ref)) + if was_last_digit_underscore: + raise Error(_str_to_base_error(base, str_slice)) else: - was_last_digit_undescore = True + was_last_digit_underscore = True continue else: - was_last_digit_undescore = False + was_last_digit_underscore = False if ord_0 <= ord_current <= ord_num_max: result += ord_current - ord_0 found_valid_chars_after_start = True @@ -317,45 +289,101 @@ fn _atol(str_ref: StringRef, base: Int = 10) raises -> Int: start = pos + 1 break else: - raise Error(_atol_error(base, str_ref)) + raise Error(_str_to_base_error(base, str_slice)) if pos + 1 < str_len and not _isspace(buff[pos + 1]): var nextresult = result * real_base if nextresult < result: raise Error( - _atol_error(base, str_ref) + _str_to_base_error(base, str_slice) + " String expresses an integer too large to store in Int." ) result = nextresult - if was_last_digit_undescore or (not found_valid_chars_after_start): - raise Error(_atol_error(base, str_ref)) + if was_last_digit_underscore or (not found_valid_chars_after_start): + raise Error(_str_to_base_error(base, str_slice)) if has_space_after_number: for pos in range(start, str_len): if not _isspace(buff[pos]): - raise Error(_atol_error(base, str_ref)) + raise Error(_str_to_base_error(base, str_slice)) if is_negative: result = -result return result -fn _atol_error(base: Int, str_ref: StringRef) -> String: +@always_inline +fn _trim_and_handle_sign(str_slice: StringSlice, str_len: Int) -> (Int, Bool): + """Trims leading whitespace, handles the sign of the number in the string. + + Args: + str_slice: A StringSlice containing the number to parse. + str_len: The length of the string. + + Returns: + A tuple containing: + - The starting index of the number after whitespace and sign. + - A boolean indicating whether the number is negative. + """ + var buff = str_slice.unsafe_ptr() + var start: Int = 0 + while start < str_len and _isspace(buff[start]): + start += 1 + var p: Bool = buff[start] == ord("+") + var n: Bool = buff[start] == ord("-") + return start + (p or n), n + + +@always_inline +fn _handle_base_prefix( + pos: Int, str_slice: StringSlice, str_len: Int, base: Int +) -> (Int, Bool): + """Adjusts the starting position if a valid base prefix is present. + + Handles "0b"/"0B" for base 2, "0o"/"0O" for base 8, and "0x"/"0X" for base + 16. Only adjusts if the base matches the prefix. + + Args: + pos: Current position in the string. + str_slice: The input StringSlice. + str_len: Length of the input string. + base: The specified base. + + Returns: + A tuple containing: + - Updated position after the prefix, if applicable. + - A boolean indicating if the prefix was valid for the given base. + """ + var start = pos + var buff = str_slice.unsafe_ptr() + if start + 1 < str_len: + var prefix_char = chr(int(buff[start + 1])) + if buff[start] == ord("0") and ( + (base == 2 and (prefix_char == "b" or prefix_char == "B")) + or (base == 8 and (prefix_char == "o" or prefix_char == "O")) + or (base == 16 and (prefix_char == "x" or prefix_char == "X")) + ): + start += 2 + return start, start != pos + + +fn _str_to_base_error(base: Int, str_slice: StringSlice) -> String: return ( "String is not convertible to integer with base " + str(base) + ": '" - + str(str_ref) + + str(str_slice) + "'" ) -fn _identify_base(str_ref: StringRef, start: Int) -> Tuple[Int, Int]: - var length = len(str_ref) +fn _identify_base(str_slice: StringSlice, start: Int) -> Tuple[Int, Int]: + var length = len(str_slice) + var buff = str_slice.unsafe_ptr() # just 1 digit, assume base 10 if start == (length - 1): return 10, start - if str_ref[start] == "0": - var second_digit = str_ref[start + 1] + if buff[start] == ord("0"): + var second_digit = chr(int(buff[start + 1])) if second_digit == "b" or second_digit == "B": return 2, start + 2 if second_digit == "o" or second_digit == "O": @@ -365,7 +393,7 @@ fn _identify_base(str_ref: StringRef, start: Int) -> Tuple[Int, Int]: # checking for special case of all "0", "_" are also allowed var was_last_character_underscore = False for i in range(start + 1, length): - if str_ref[i] == "_": + if buff[i] == ord("_"): if was_last_character_underscore: return -1, -1 else: @@ -373,9 +401,9 @@ fn _identify_base(str_ref: StringRef, start: Int) -> Tuple[Int, Int]: continue else: was_last_character_underscore = False - if str_ref[i] != "0": + if buff[i] != ord("0"): return -1, -1 - elif ord("1") <= ord(str_ref[start]) <= ord("9"): + elif ord("1") <= int(buff[start]) <= ord("9"): return 10, start else: return -1, -1 @@ -386,21 +414,39 @@ fn _identify_base(str_ref: StringRef, start: Int) -> Tuple[Int, Int]: fn atol(str: String, base: Int = 10) raises -> Int: """Parses and returns the given string as an integer in the given base. - For example, `atol("19")` returns `19`. If base is 0 the the string is - parsed as an Integer literal, see: https://docs.python.org/3/reference/lexical_analysis.html#integers. - - Raises: - If the given string cannot be parsed as an integer value. For example in - `atol("hi")`. + If base is set to 0, the string is parsed as an Integer literal, with the + following considerations: + - '0b' or '0B' prefix indicates binary (base 2) + - '0o' or '0O' prefix indicates octal (base 8) + - '0x' or '0X' prefix indicates hexadecimal (base 16) + - Without a prefix, it's treated as decimal (base 10) Args: str: A string to be parsed as an integer in the given base. base: Base used for conversion, value must be between 2 and 36, or 0. Returns: - An integer value that represents the string, or otherwise raises. + An integer value that represents the string. + + Raises: + If the given string cannot be parsed as an integer value or if an + incorrect base is provided. + + Examples: + >>> atol("32") + 32 + >>> atol("FF", 16) + 255 + >>> atol("0xFF", 0) + 255 + >>> atol("0b1010", 0) + 10 + + Notes: + This follows [Python's integer literals]( + https://docs.python.org/3/reference/lexical_analysis.html#integers). """ - return _atol(str._strref_dangerous(), base) + return _atol(str.as_string_slice(), base) fn _atof_error(str_ref: StringRef) -> Error: diff --git a/stdlib/src/builtin/string_literal.mojo b/stdlib/src/builtin/string_literal.mojo index 650904b235..438e973213 100644 --- a/stdlib/src/builtin/string_literal.mojo +++ b/stdlib/src/builtin/string_literal.mojo @@ -210,7 +210,7 @@ struct StringLiteral( Returns: An integer value that represents the string, or otherwise raises. """ - return _atol(self) + return _atol(self.as_string_slice()) @no_inline fn __str__(self) -> String: diff --git a/stdlib/src/utils/stringref.mojo b/stdlib/src/utils/stringref.mojo index 13becfa999..8a4276a738 100644 --- a/stdlib/src/utils/stringref.mojo +++ b/stdlib/src/utils/stringref.mojo @@ -365,7 +365,7 @@ struct StringRef( Returns: An integer value that represents the string, or otherwise raises. """ - return _atol(self) + return atol(self) @always_inline fn __len__(self) -> Int: From 6de98ee97d744c50f102559145aee2068a307e09 Mon Sep 17 00:00:00 2001 From: Joshua James Venter Date: Thu, 4 Jul 2024 20:08:58 +0200 Subject: [PATCH 02/39] Add `stol` function, mirroring `atol` with additional functionality This commit introduces the `stol` (string to long) function, which closely follows the implementation of `atol` while providing extended functionality: - Parses integer literals following `atol`'s logic and base handling (2-36) - Maintains consistency with `atol` in handling base prefixes (0b, 0o, 0x) - Extends `atol` by returning both the parsed integer and remaining string - Stops at the first invalid character instead of raising an error Key differences from `atol`: - Returns a tuple (parsed_int, remaining_string) instead of just an int - Does not raise an error for partially valid inputs This function provides a more flexible parsing option while maintaining consistency with existing string-to-integer conversion in the standard library. Signed-off-by: Joshua James Venter --- stdlib/src/builtin/string.mojo | 321 +++++++++++++++++++++++---- stdlib/test/builtin/test_string.mojo | 147 ++++++++++++ 2 files changed, 429 insertions(+), 39 deletions(-) diff --git a/stdlib/src/builtin/string.mojo b/stdlib/src/builtin/string.mojo index ab9c216543..22611091d3 100644 --- a/stdlib/src/builtin/string.mojo +++ b/stdlib/src/builtin/string.mojo @@ -213,6 +213,198 @@ fn ascii(value: String) -> String: # ===----------------------------------------------------------------------=== # +@always_inline +fn _stol(str_ref: StringRef, base: Int = 10) raises -> (Int, StringRef): + """Implementation if `stol` for StringRef inputs. + + Please see its docstring for details. + """ + if (base != 0) and (base < 2 or base > 36): + raise Error("Base must be >= 2 and <= 36, or 0.") + + if not str_ref: + raise Error("Cannot convert empty string to integer.") + + var result: Int = 0 + var real_base: Int + var start: Int = 0 + var is_negative: Bool = False + var str_len = len(str_ref) + var buff = str_ref.unsafe_ptr() + + start, is_negative = _trim_and_handle_sign(str_ref, str_len) + + if start == str_len or not _is_valid_digit(int(buff[start]), base): + return 0, str_ref + + start = _handle_base_prefix(start, str_ref, str_len, base) + + if base == 0: + if start == (str_len - 1): + real_base = 10 + elif str_ref[start] == "0" and start + 1 < str_len: + var second_digit = str_ref[start + 1] + if second_digit == "b" or second_digit == "B": + real_base = 2 + start += 1 # Move past the '0', but not the 'b' + elif second_digit == "o" or second_digit == "O": + real_base = 8 + start += 1 + elif second_digit == "x" or second_digit == "X": + real_base = 16 + start += 1 + else: + real_base = 10 + + # Check if the character after the prefix is valid + if real_base != 10: + if start + 1 < str_len and _is_valid_digit( + int(buff[start + 1]), real_base + ): + start += 1 # Move past the prefix character + else: + # Invalid prefix or digit after prefix + return 0, StringRef( + str_ref.unsafe_ptr() + start, str_len - start + ) + else: + real_base = 10 + else: + real_base = base + + var ord_num_max: Int + var ord_letter_max = (-1, -1) + alias ord_0 = ord("0") + var ord_letter_min = (ord("a"), ord("A")) + alias ord_underscore = ord("_") + + if real_base <= 10: + ord_num_max = ord(str(real_base - 1)) + else: + ord_num_max = ord("9") + ord_letter_max = ( + ord("a") + (real_base - 11), + ord("A") + (real_base - 11), + ) + + var was_last_digit_underscore = True + var prev_result: Int = 0 + for pos in range(start, str_len): + prev_result = result + var ord_current = int(buff[pos]) + if ord_current == ord_underscore and was_last_digit_underscore: + break # Break out as apposed to raising exception + if ord_current == ord_underscore: + was_last_digit_underscore = True + continue + + was_last_digit_underscore = False + + var digit_value: Int + if ord_0 <= ord_current <= ord_num_max: + digit_value = ord_current - ord_0 + elif ord_letter_min[0] <= ord_current <= ord_letter_max[0]: + digit_value = ord_current - ord_letter_min[0] + 10 + elif ord_letter_min[1] <= ord_current <= ord_letter_max[1]: + digit_value = ord_current - ord_letter_min[1] + 10 + else: + break + + if digit_value >= real_base: + break + + var new_result = result * real_base + digit_value + if new_result < result: + raise Error( + _str_to_base_error(real_base, str_ref) + + " String expresses an integer too large to store in Int." + ) + result = new_result + start = pos + 1 + + if is_negative: + result = -result + + return result, StringRef(str_ref.unsafe_ptr() + start, str_len - start) + + +fn stol(str: String, base: Int = 10) raises -> (Int, String): + """Convert a string to a integer and return the remaining unparsed string. + + Similar to `atol`, but `stol` parses only a portion of the string and returns + both the parsed integer and the remaining unparsed part. For example, `stol("32abc")` returns `(32, "abc")`. + + If base is 0, the string is parsed as an [Integer literal][1], with the following considerations: + - '0b' or '0B' prefix indicates binary (base 2) + - '0o' or '0O' prefix indicates octal (base 8) + - '0x' or '0X' prefix indicates hexadecimal (base 16) + - Without a prefix, it's treated as decimal (base 10) + + Raises: + If the base is invalid or if the string is empty. + + Args: + str: A string to be parsed as an integer in the given base. + base: Base used for conversion, value must be between 2 and 36, or 0. + + Returns: + A tuple containing: + - An integer value representing the parsed part of the string. + - The remaining unparsed part of the string. + + Examples: + >>> stol("19abc") + (19, "abc") + >>> stol("0xFF hello", 16) + (255, " hello") + >>> stol("0x123ghi", 0) + (291, "ghi") + >>> stol("0b1010 binary", 0) + (10, " binary") + >>> stol("0o123 octal", 0) + (83, " octal") + + See Also: + `atol`: A similar function that parses the entire string and returns an integer. + + [1]: https://docs.python.org/3/reference/lexical_analysis.html#integers. + + """ + var result: Int + var remaining: StringRef + result, remaining = _stol(str._strref_dangerous(), base) + + return result, String(remaining) + + +@always_inline +fn _is_valid_digit(char: UInt8, base: Int) -> Bool: + """Checks if a character is a valid digit for the given base. + + Args: + char: The character to check, as a UInt8. + base: The numeric base (0-36, where 0 is special case). + + Returns: + True if the character is a valid digit for the given base, False otherwise. + """ + if base == 0: + # For base 0, we need to allow 0-9 and a-f/A-F for potential hex numbers + if char >= ord("0") and char <= ord("9"): + return True + var upper_char = char & ~32 # Convert to uppercase + return upper_char >= ord("A") and upper_char <= ord("F") + + if char >= ord("0") and char <= ord("9"): + return (char - ord("0")) < base + if base <= 10: + return False + var upper_char = char & ~32 # Convert to uppercase + if upper_char >= ord("A") and upper_char <= ord("Z"): + return (upper_char - ord("A") + 10) < base + return False + + fn _atol(str_ref: StringRef, base: Int = 10) raises -> Int: """Implementation of `atol` for StringRef inputs. @@ -221,7 +413,7 @@ fn _atol(str_ref: StringRef, base: Int = 10) raises -> Int: if (base != 0) and (base < 2 or base > 36): raise Error("Base must be >= 2 and <= 36, or 0.") if not str_ref: - raise Error(_atol_error(base, str_ref)) + raise Error(_str_to_base_error(base, str_ref)) var real_base: Int var ord_num_max: Int @@ -234,35 +426,10 @@ fn _atol(str_ref: StringRef, base: Int = 10) raises -> Int: var str_len = len(str_ref) var buff = str_ref.unsafe_ptr() - for pos in range(start, str_len): - if _isspace(buff[pos]): - continue + start, is_negative = _trim_and_handle_sign(str_ref, str_len) - if str_ref[pos] == "-": - is_negative = True - start = pos + 1 - elif str_ref[pos] == "+": - start = pos + 1 - else: - start = pos - break - if str_ref[start] == "0" and start + 1 < str_len: - if base == 2 and ( - str_ref[start + 1] == "b" or str_ref[start + 1] == "B" - ): - start += 2 - has_prefix = True - elif base == 8 and ( - str_ref[start + 1] == "o" or str_ref[start + 1] == "O" - ): - start += 2 - has_prefix = True - elif base == 16 and ( - str_ref[start + 1] == "x" or str_ref[start + 1] == "X" - ): - start += 2 - has_prefix = True + start = _handle_base_prefix(start, str_ref, str_len, base) alias ord_0 = ord("0") # FIXME: @@ -276,7 +443,7 @@ fn _atol(str_ref: StringRef, base: Int = 10) raises -> Int: start = real_base_new_start[1] has_prefix = real_base != 10 if real_base == -1: - raise Error(_atol_error(base, str_ref)) + raise Error(_str_to_base_error(base, str_ref)) else: real_base = base @@ -298,7 +465,7 @@ fn _atol(str_ref: StringRef, base: Int = 10) raises -> Int: var ord_current = int(buff[pos]) if ord_current == ord_underscore: if was_last_digit_undescore: - raise Error(_atol_error(base, str_ref)) + raise Error(_str_to_base_error(base, str_ref)) else: was_last_digit_undescore = True continue @@ -318,29 +485,96 @@ fn _atol(str_ref: StringRef, base: Int = 10) raises -> Int: start = pos + 1 break else: - raise Error(_atol_error(base, str_ref)) + raise Error(_str_to_base_error(base, str_ref)) if pos + 1 < str_len and not _isspace(buff[pos + 1]): var nextresult = result * real_base if nextresult < result: raise Error( - _atol_error(base, str_ref) + _str_to_base_error(base, str_ref) + " String expresses an integer too large to store in Int." ) result = nextresult if was_last_digit_undescore or (not found_valid_chars_after_start): - raise Error(_atol_error(base, str_ref)) + raise Error(_str_to_base_error(base, str_ref)) if has_space_after_number: for pos in range(start, str_len): if not _isspace(buff[pos]): - raise Error(_atol_error(base, str_ref)) + raise Error(_str_to_base_error(base, str_ref)) if is_negative: result = -result return result -fn _atol_error(base: Int, str_ref: StringRef) -> String: +@always_inline +fn _trim_and_handle_sign(str_ref: StringRef, str_len: Int) -> (Int, Bool): + """Trims leading whitespace and handles the sign of the number in the string. + + Args: + str_ref: A StringRef containing the number to parse. + str_len: The length of the string. + + Returns: + A tuple containing: + - The starting index of the number after whitespace and sign. + - A boolean indicating whether the number is negative. + """ + var buff = str_ref.unsafe_ptr() + var is_negative: Bool = False + var start: Int = 0 + for pos in range(start, str_len): + if _isspace(buff[pos]): + continue + + if str_ref[pos] == "-": + is_negative = True + start = pos + 1 + elif str_ref[pos] == "+": + start = pos + 1 + else: + start = pos + break + + return start, is_negative + + +@always_inline +fn _handle_base_prefix( + pos: Int, str_ref: StringRef, str_len: Int, base: Int +) -> Int: + """Adjusts the starting position if a valid base prefix is present. + + Handles "0b"/"0B" for base 2, "0o"/"0O" for base 8, and "0x"/"0X" for base 16. + Only adjusts if the base matches the prefix. + + Args: + pos: Current position in the string. + str_ref: The input string. + str_len: Length of the input string. + base: The specified base. + + Returns: + Updated position after the prefix, if applicable. + """ + var start = pos + if str_ref[start] == "0" and start + 1 < str_len: + if base == 2 and ( + str_ref[start + 1] == "b" or str_ref[start + 1] == "B" + ): + start += 2 + elif base == 8 and ( + str_ref[start + 1] == "o" or str_ref[start + 1] == "O" + ): + start += 2 + elif base == 16 and ( + str_ref[start + 1] == "x" or str_ref[start + 1] == "X" + ): + start += 2 + return start + + +fn _str_to_base_error(base: Int, str_ref: StringRef) -> String: return ( "String is not convertible to integer with base " + str(base) @@ -387,12 +621,16 @@ fn _identify_base(str_ref: StringRef, start: Int) -> Tuple[Int, Int]: fn atol(str: String, base: Int = 10) raises -> Int: """Parses and returns the given string as an integer in the given base. - For example, `atol("19")` returns `19`. If base is 0 the the string is - parsed as an Integer literal, see: https://docs.python.org/3/reference/lexical_analysis.html#integers. + For example, `atol("32")` returns `32`. If base is 0, the string is parsed as an [Integer literal][1], with the following considerations: + - '0b' or '0B' prefix indicates binary (base 2) + - '0o' or '0O' prefix indicates octal (base 8) + - '0x' or '0X' prefix indicates hexadecimal (base 16) + - Without a prefix, it's treated as decimal (base 10) Raises: - If the given string cannot be parsed as an integer value. For example in - `atol("hi")`. + - If the given string cannot be parsed as an integer value. For example in + `atol("Mojo")`, + - Incorrect base is provided. Args: str: A string to be parsed as an integer in the given base. @@ -400,6 +638,11 @@ fn atol(str: String, base: Int = 10) raises -> Int: Returns: An integer value that represents the string, or otherwise raises. + + See Also: + `stol`: A similar function that returns both the parsed integer and the remaining unparsed string. + + [1]: https://docs.python.org/3/reference/lexical_analysis.html#integers. """ return _atol(str._strref_dangerous(), base) diff --git a/stdlib/test/builtin/test_string.mojo b/stdlib/test/builtin/test_string.mojo index 6341bce169..08b6a0912a 100644 --- a/stdlib/test/builtin/test_string.mojo +++ b/stdlib/test/builtin/test_string.mojo @@ -341,6 +341,151 @@ def test_string_indexing(): assert_equal("H", str[-50::50]) +def test_stol(): + var result: Int + var remaining: String + + # base 10 + result, remaining = stol(String("375 ABC")) + assert_equal(375, result) + assert_equal(" ABC", remaining) + result, remaining = stol(String(" 005")) + assert_equal(5, result) + assert_equal("", remaining) + result, remaining = stol(String(" 013 ")) + assert_equal(13, result) + assert_equal(" ", remaining) + result, remaining = stol(String("-89")) + assert_equal(-89, result) + assert_equal("", remaining) + result, remaining = stol(String(" -52")) + assert_equal(-52, result) + assert_equal("", remaining) + + # other bases + result, remaining = stol(" FF", 16) + assert_equal(255, result) + assert_equal("", remaining) + result, remaining = stol(" 0xff ", 16) + assert_equal(255, result) + assert_equal(" ", remaining) + result, remaining = stol("10010eighteen18", 2) + assert_equal(18, result) + assert_equal("eighteen18", remaining) + result, remaining = stol("0b10010", 2) + assert_equal(18, result) + assert_equal("", remaining) + result, remaining = stol("0o12", 8) + assert_equal(10, result) + assert_equal("", remaining) + result, remaining = stol("Z", 36) + assert_equal(35, result) + assert_equal("", remaining) + + # test with trailing characters + result, remaining = stol("123abc") + assert_equal(123, result) + assert_equal("abc", remaining) + result, remaining = stol("-45def") + assert_equal(-45, result) + assert_equal("def", remaining) + result, remaining = stol("0xffghi", 0) + assert_equal(255, result) + assert_equal("ghi", remaining) + + result, remaining = stol(" ") + assert_equal(0, result) + assert_equal(" ", remaining) + + result, remaining = stol("123.456", 10) + assert_equal(123, result) + assert_equal(".456", remaining) + result, remaining = stol("--123", 10) + assert_equal(0, result) + assert_equal("--123", remaining) + + result, remaining = stol("12a34", 10) + assert_equal(12, result) + assert_equal("a34", remaining) + result, remaining = stol("1G5", 16) + assert_equal(1, result) + assert_equal("G5", remaining) + + result, remaining = stol("-1A", 16) + assert_equal(-26, result) + assert_equal("", remaining) + result, remaining = stol("-110", 2) + assert_equal(-6, result) + assert_equal("", remaining) + + result, remaining = stol("Mojo!") + assert_equal(0, result) + assert_equal("Mojo!", remaining) + + # Negative Cases + with assert_raises(contains="Cannot convert empty string to integer."): + _ = stol("") + + with assert_raises(contains="Base must be >= 2 and <= 36, or 0."): + _ = stol("Bad Base", 42) + + with assert_raises( + contains="String expresses an integer too large to store in Int." + ): + _ = stol(String("9223372036854775832"), 10) + + +def test_stol_base_0(): + var result: Int + var remaining: String + + result, remaining = stol("155_155", 0) + assert_equal(155155, result) + assert_equal("", remaining) + result, remaining = stol("1_2_3_4_5", 0) + assert_equal(12345, result) + assert_equal("", remaining) + result, remaining = stol("1_2_3_4_5_", 0) + assert_equal(12345, result) + assert_equal("_", remaining) + result, remaining = stol("0b1_0_1_0", 0) + assert_equal(10, result) + assert_equal("", remaining) + result, remaining = stol("0o1_2_3", 0) + assert_equal(83, result) + assert_equal("", remaining) + result, remaining = stol("0x1_A_B", 0) + assert_equal(427, result) + assert_equal("", remaining) + result, remaining = stol("123_", 0) + assert_equal(123, result) + assert_equal("_", remaining) + result, remaining = stol("_123", 0) + assert_equal(0, result) + assert_equal("_123", remaining) + result, remaining = stol("123__456", 0) + assert_equal(123, result) + assert_equal("__456", remaining) + result, remaining = stol("0x_123", 0) + assert_equal(0, result) + assert_equal("x_123", remaining) + result, remaining = stol("0x1_23", 0) + assert_equal(291, result) + assert_equal("", remaining) + result, remaining = stol("0_123", 0) + assert_equal(123, result) + assert_equal("", remaining) + result, remaining = stol("0z123", 0) + assert_equal(0, result) + assert_equal("z123", remaining) + result, remaining = stol("Mojo!", 0) + assert_equal(0, result) + assert_equal("Mojo!", remaining) + result, remaining = stol("0o123 octal", 0) + assert_equal(83, result) + assert_equal(" octal", remaining) + + def test_atol(): # base 10 assert_equal(375, atol(String("375"))) @@ -1602,6 +1747,8 @@ def main(): test_ord() test_chr() test_string_indexing() + test_stol() + test_stol_base_0() test_atol() test_atol_base_0() test_atof() From 2ad996567723843553e44ec0b2cefb83eb9c74ff Mon Sep 17 00:00:00 2001 From: Joshua James Venter <67124214+jjvraw@users.noreply.github.com> Date: Fri, 5 Jul 2024 22:28:19 +0200 Subject: [PATCH 03/39] Apply suggestions from @martinvuyk Co-authored-by: martinvuyk <110240700+martinvuyk@users.noreply.github.com> Signed-off-by: Joshua James Venter <67124214+jjvraw@users.noreply.github.com> --- stdlib/src/builtin/string.mojo | 16 ++++++++++++---- stdlib/test/builtin/test_string.mojo | 21 ++++++++++++++++++--- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/stdlib/src/builtin/string.mojo b/stdlib/src/builtin/string.mojo index 22611091d3..ad0a60e01f 100644 --- a/stdlib/src/builtin/string.mojo +++ b/stdlib/src/builtin/string.mojo @@ -287,10 +287,8 @@ fn _stol(str_ref: StringRef, base: Int = 10) raises -> (Int, StringRef): ord("A") + (real_base - 11), ) - var was_last_digit_underscore = True - var prev_result: Int = 0 + var was_last_digit_underscore = True if real_base == 10 else False for pos in range(start, str_len): - prev_result = result var ord_current = int(buff[pos]) if ord_current == ord_underscore and was_last_digit_underscore: break # Break out as apposed to raising exception @@ -314,7 +312,7 @@ fn _stol(str_ref: StringRef, base: Int = 10) raises -> (Int, StringRef): break var new_result = result * real_base + digit_value - if new_result < result: + if new_result <= result and result > 0: raise Error( _str_to_base_error(real_base, str_ref) + " String expresses an integer too large to store in Int." @@ -339,6 +337,9 @@ fn stol(str: String, base: Int = 10) raises -> (Int, String): - '0o' or '0O' prefix indicates octal (base 8) - '0x' or '0X' prefix indicates hexadecimal (base 16) - Without a prefix, it's treated as decimal (base 10) + Notes: + This follows [Python's integer literals](\ + https://docs.python.org/3/reference/lexical_analysis.html#integers) Raises: If the base is invalid or if the string is empty. @@ -353,6 +354,13 @@ fn stol(str: String, base: Int = 10) raises -> (Int, String): - The remaining unparsed part of the string. Examples: + ```mojo + print(stol("19abc")) # (19, "abc") + print(stol("0xFF hello", 16)) # (255, " hello") + print(stol("0x123ghi", 0)) # (291, "ghi") + print(stol("0b1010 binary", 0)) # (10, " binary") + print(stol("0o123 octal", 0)) # (83, " octal") + ``` >>> stol("19abc") (19, "abc") >>> stol("0xFF hello", 16) diff --git a/stdlib/test/builtin/test_string.mojo b/stdlib/test/builtin/test_string.mojo index 08b6a0912a..a35da14aba 100644 --- a/stdlib/test/builtin/test_string.mojo +++ b/stdlib/test/builtin/test_string.mojo @@ -374,9 +374,21 @@ def test_stol(): assert_equal("eighteen18", remaining) result, remaining = stol("0b10010", 2) assert_equal(18, result) + result, remaining = stol("0b_10010", 2) + assert_equal(18, result) + result, remaining = stol("0b_0010010", 2) + assert_equal(18, result) + result, remaining = stol("0b0000_0_010010", 2) + assert_equal(18, result) assert_equal("", remaining) result, remaining = stol("0o12", 8) assert_equal(10, result) + result, remaining = stol("0o_12", 8) + assert_equal(10, result) + result, remaining = stol("0o_012", 8) + assert_equal(10, result) + result, remaining = stol("0o0000_0_0012", 8) + assert_equal(10, result) assert_equal("", remaining) result, remaining = stol("Z", 36) assert_equal(35, result) @@ -391,6 +403,12 @@ def test_stol(): assert_equal("def", remaining) result, remaining = stol("0xffghi", 0) assert_equal(255, result) + result, remaining = stol("0x_ffghi", 0) + assert_equal(255, result) + result, remaining = stol("0x_0ffghi", 0) + assert_equal(255, result) + result, remaining = stol("0x0000_0_00ffghi", 0) + assert_equal(255, result) assert_equal("ghi", remaining) result, remaining = stol(" ") @@ -466,9 +484,6 @@ def test_stol_base_0(): result, remaining = stol("123__456", 0) assert_equal(123, result) assert_equal("__456", remaining) - result, remaining = stol("0x_123", 0) - assert_equal(0, result) - assert_equal("x_123", remaining) result, remaining = stol("0x1_23", 0) assert_equal(291, result) assert_equal("", remaining) From 4500c21648ea313a99565f26f84eaafcbb566507 Mon Sep 17 00:00:00 2001 From: Joshua James Venter Date: Fri, 2 Aug 2024 10:33:34 +0200 Subject: [PATCH 04/39] format Signed-off-by: Joshua James Venter --- stdlib/src/builtin/string.mojo | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/stdlib/src/builtin/string.mojo b/stdlib/src/builtin/string.mojo index 7b6de43dfe..74050c22a8 100644 --- a/stdlib/src/builtin/string.mojo +++ b/stdlib/src/builtin/string.mojo @@ -263,9 +263,7 @@ fn _stol(str_slice: StringSlice, base: Int = 10) raises -> (Int, String): start += 1 # Move past the prefix character else: # Invalid prefix or digit after prefix - return 0, String( - str_slice.unsafe_ptr() + start - ) + return 0, String(str_slice.unsafe_ptr() + start) else: real_base = 10 has_prefix = real_base != 10 From d7328b7f0fda2c6786812c24d5402fc8a620f422 Mon Sep 17 00:00:00 2001 From: Joshua James Venter Date: Sat, 30 Nov 2024 20:10:22 +0200 Subject: [PATCH 05/39] clean up with identiy_base Signed-off-by: Joshua James Venter --- stdlib/src/collections/string.mojo | 43 +++++++++--------------------- 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/stdlib/src/collections/string.mojo b/stdlib/src/collections/string.mojo index 6afbcd47a3..ae89a57603 100644 --- a/stdlib/src/collections/string.mojo +++ b/stdlib/src/collections/string.mojo @@ -235,7 +235,7 @@ fn ascii(value: String) -> String: @always_inline fn _stol(str_slice: StringSlice, base: Int = 10) raises -> (Int, String): - """Implementation if `stol` for StringRef inputs. + """Implementation if `stol` for StringSlice inputs. Please see its docstring for details. """ @@ -259,37 +259,20 @@ fn _stol(str_slice: StringSlice, base: Int = 10) raises -> (Int, String): return 0, String(str_slice) if base == 0: - if start == (str_len - 1): + var real_base_new_start = _identify_base(str_slice, start) + real_base = real_base_new_start[0] + + # If identify_base returns error but starts with 0, treat as base 10 + if real_base == -1 and buff[start] == ord("0"): real_base = 10 - elif buff[start] == ord("0") and start + 1 < str_len: - var second_digit = chr(int(buff[start + 1])) - if second_digit == "b" or second_digit == "B": - real_base = 2 - start += 1 # Move past the '0', but not the 'b' - elif second_digit == "o" or second_digit == "O": - real_base = 8 - start += 1 - elif second_digit == "x" or second_digit == "X": - real_base = 16 - start += 1 - else: - real_base = 10 - - # Check if the character after the prefix is valid - if real_base != 10: - if start + 1 < str_len and _is_valid_digit( - int(buff[start + 1]), real_base - ): - start += 1 # Move past the prefix character - else: - # Invalid prefix or digit after prefix - return 0, String( - StringSlice( - unsafe_from_utf8=str_slice.as_bytes()[start:] - ) - ) + # Keep original start position for base 10 else: - real_base = 10 + # For valid prefixes, use the new start position + if real_base != -1: + start = real_base_new_start[1] + else: + return 0, String(str_slice) + has_prefix = real_base != 10 else: start, has_prefix = _handle_base_prefix(start, str_slice, str_len, base) From 890c56e6770756d7819fc18cf00251437605258a Mon Sep 17 00:00:00 2001 From: Joshua James Venter Date: Sat, 30 Nov 2024 20:12:32 +0200 Subject: [PATCH 06/39] typo Signed-off-by: Joshua James Venter --- stdlib/src/collections/string.mojo | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/stdlib/src/collections/string.mojo b/stdlib/src/collections/string.mojo index ae89a57603..d9fdb5a8eb 100644 --- a/stdlib/src/collections/string.mojo +++ b/stdlib/src/collections/string.mojo @@ -235,7 +235,7 @@ fn ascii(value: String) -> String: @always_inline fn _stol(str_slice: StringSlice, base: Int = 10) raises -> (Int, String): - """Implementation if `stol` for StringSlice inputs. + """Implementation of `stol` for StringSlice inputs. Please see its docstring for details. """ @@ -424,7 +424,6 @@ fn _atol(str_slice: StringSlice, base: Int = 10) raises -> Int: """ if (base != 0) and (base < 2 or base > 36): raise Error("Base must be >= 2 and <= 36, or 0.") - if not str_slice: raise Error(_str_to_base_error(base, str_slice)) @@ -512,10 +511,8 @@ fn _atol(str_slice: StringSlice, base: Int = 10) raises -> Int: for pos in range(start, str_len): if not _isspace(buff[pos]): raise Error(_str_to_base_error(base, str_slice)) - if is_negative: result = -result - return result From 3f0624b8a64489b07478487bed05f0d50bdaa0ee Mon Sep 17 00:00:00 2001 From: Joshua James Venter Date: Sun, 1 Dec 2024 09:08:29 +0200 Subject: [PATCH 07/39] clean up Signed-off-by: Joshua James Venter --- stdlib/src/collections/string.mojo | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/stdlib/src/collections/string.mojo b/stdlib/src/collections/string.mojo index d9fdb5a8eb..b896b534e8 100644 --- a/stdlib/src/collections/string.mojo +++ b/stdlib/src/collections/string.mojo @@ -268,10 +268,7 @@ fn _stol(str_slice: StringSlice, base: Int = 10) raises -> (Int, String): # Keep original start position for base 10 else: # For valid prefixes, use the new start position - if real_base != -1: - start = real_base_new_start[1] - else: - return 0, String(str_slice) + start = real_base_new_start[1] has_prefix = real_base != 10 else: From 43e2bbc1a732231c2e98878a894c13e7cbfb45ec Mon Sep 17 00:00:00 2001 From: Joshua James Venter Date: Wed, 15 Jan 2025 18:05:38 +0200 Subject: [PATCH 08/39] Collapse `_stol` into `stol` --- stdlib/src/collections/string/string.mojo | 99 ++++++++++------------- 1 file changed, 43 insertions(+), 56 deletions(-) diff --git a/stdlib/src/collections/string/string.mojo b/stdlib/src/collections/string/string.mojo index 07d2328700..ee0341a141 100644 --- a/stdlib/src/collections/string/string.mojo +++ b/stdlib/src/collections/string/string.mojo @@ -186,11 +186,50 @@ fn ascii(value: StringSlice) -> String: # ===----------------------------------------------------------------------=== # -@always_inline -fn _stol(str_slice: StringSlice, base: Int = 10) raises -> (Int, String): - """Implementation of `stol` for StringSlice inputs. +fn stol(str_slice: StringSlice, base: Int = 10) raises -> (Int, String): + """Convert a string to a integer and return the remaining unparsed string. + + Similar to `atol`, but `stol` parses only a portion of the string and returns + both the parsed integer and the remaining unparsed part. For example, `stol("32abc")` returns `(32, "abc")`. + + If base is 0, the string is parsed as an [Integer literal][1], with the following considerations: + - '0b' or '0B' prefix indicates binary (base 2) + - '0o' or '0O' prefix indicates octal (base 8) + - '0x' or '0X' prefix indicates hexadecimal (base 16) + - Without a prefix, it's treated as decimal (base 10) + Notes: + This follows [Python's integer literals](\ + https://docs.python.org/3/reference/lexical_analysis.html#integers) + + Raises: + If the base is invalid or if the string is empty. + + Args: + str_slice: A string to be parsed as an integer in the given base. + base: Base used for conversion, value must be between 2 and 36, or 0. + + Returns: + A tuple containing: + - An integer value representing the parsed part of the string. + - The remaining unparsed part of the string. + + Examples: + >>> stol("19abc") + (19, "abc") + >>> stol("0xFF hello", 16) + (255, " hello") + >>> stol("0x123ghi", 0) + (291, "ghi") + >>> stol("0b1010 binary", 0) + (10, " binary") + >>> stol("0o123 octal", 0) + (83, " octal") + + See Also: + `atol`: A similar function that parses the entire string and returns an integer. + + [1]: https://docs.python.org/3/reference/lexical_analysis.html#integers. - Please see its docstring for details. """ if (base != 0) and (base < 2 or base > 36): raise Error("Base must be >= 2 and <= 36, or 0.") @@ -284,58 +323,6 @@ fn _stol(str_slice: StringSlice, base: Int = 10) raises -> (Int, String): ) -fn stol(str: String, base: Int = 10) raises -> (Int, String): - """Convert a string to a integer and return the remaining unparsed string. - - Similar to `atol`, but `stol` parses only a portion of the string and returns - both the parsed integer and the remaining unparsed part. For example, `stol("32abc")` returns `(32, "abc")`. - - If base is 0, the string is parsed as an [Integer literal][1], with the following considerations: - - '0b' or '0B' prefix indicates binary (base 2) - - '0o' or '0O' prefix indicates octal (base 8) - - '0x' or '0X' prefix indicates hexadecimal (base 16) - - Without a prefix, it's treated as decimal (base 10) - Notes: - This follows [Python's integer literals](\ - https://docs.python.org/3/reference/lexical_analysis.html#integers) - - Raises: - If the base is invalid or if the string is empty. - - Args: - str: A string to be parsed as an integer in the given base. - base: Base used for conversion, value must be between 2 and 36, or 0. - - Returns: - A tuple containing: - - An integer value representing the parsed part of the string. - - The remaining unparsed part of the string. - - Examples: - >>> stol("19abc") - (19, "abc") - >>> stol("0xFF hello", 16) - (255, " hello") - >>> stol("0x123ghi", 0) - (291, "ghi") - >>> stol("0b1010 binary", 0) - (10, " binary") - >>> stol("0o123 octal", 0) - (83, " octal") - - See Also: - `atol`: A similar function that parses the entire string and returns an integer. - - [1]: https://docs.python.org/3/reference/lexical_analysis.html#integers. - - """ - var result: Int - var remaining: String - result, remaining = _stol(str.as_string_slice(), base) - - return result, remaining - - @always_inline fn _is_valid_digit(char: UInt8, base: Int) -> Bool: """Checks if a character is a valid digit for the given base. From 18ad6df0bc662dbb72f24b3bec1ad4af94497422 Mon Sep 17 00:00:00 2001 From: Joshua James Venter Date: Thu, 16 Jan 2025 11:37:06 +0200 Subject: [PATCH 09/39] fix integer literal parsing --- stdlib/src/collections/string/string.mojo | 27 +++++++------------ .../test/collections/string/test_string.mojo | 6 ++--- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/stdlib/src/collections/string/string.mojo b/stdlib/src/collections/string/string.mojo index ee0341a141..01e80cdcfb 100644 --- a/stdlib/src/collections/string/string.mojo +++ b/stdlib/src/collections/string/string.mojo @@ -250,29 +250,22 @@ fn stol(str_slice: StringSlice, base: Int = 10) raises -> (Int, String): if start == str_len or not _is_valid_digit(Int(buff[start]), base): return 0, String(str_slice) - if base == 0: - var real_base_new_start = _identify_base(str_slice, start) - real_base = real_base_new_start[0] + var ord_num_max: Int + alias ord_0 = ord("0") + var ord_letter_max = (-1, -1) + alias ord_letter_min = (ord("a"), ord("A")) + alias ord_underscore = ord("_") - # If identify_base returns error but starts with 0, treat as base 10 - if real_base == -1 and buff[start] == ord("0"): - real_base = 10 - # Keep original start position for base 10 - else: - # For valid prefixes, use the new start position - start = real_base_new_start[1] + if base == 0: + real_base, start = _identify_base(str_slice, start) + if real_base == -1: + return 0, String(str_slice) has_prefix = real_base != 10 else: start, has_prefix = _handle_base_prefix(start, str_slice, str_len, base) real_base = base - var ord_num_max: Int - var ord_letter_max = (-1, -1) - alias ord_0 = ord("0") - var ord_letter_min = (ord("a"), ord("A")) - alias ord_underscore = ord("_") - if real_base <= 10: ord_num_max = ord(str(real_base - 1)) else: @@ -286,7 +279,7 @@ fn stol(str_slice: StringSlice, base: Int = 10) raises -> (Int, String): for pos in range(start, str_len): var ord_current = Int(buff[pos]) if ord_current == ord_underscore and was_last_digit_underscore: - break # Break out as apposed to raising exception + break # Break out as opposed to raising exception as in `atol` if ord_current == ord_underscore: was_last_digit_underscore = True continue diff --git a/stdlib/test/collections/string/test_string.mojo b/stdlib/test/collections/string/test_string.mojo index 5deca9aaee..b4d7046936 100644 --- a/stdlib/test/collections/string/test_string.mojo +++ b/stdlib/test/collections/string/test_string.mojo @@ -432,11 +432,11 @@ def test_stol_base_0(): assert_equal(291, result) assert_equal("", remaining) result, remaining = stol("0_123", 0) - assert_equal(123, result) - assert_equal("", remaining) + assert_equal(0, result) + assert_equal("0_123", remaining) result, remaining = stol("0z123", 0) assert_equal(0, result) - assert_equal("z123", remaining) + assert_equal("0z123", remaining) result, remaining = stol("Mojo!", 0) assert_equal(0, result) assert_equal("Mojo!", remaining) From 06a2534ab0c8129ce1b326ad5b83988f64042d48 Mon Sep 17 00:00:00 2001 From: Rasool Sharifi Date: Tue, 14 Jan 2025 12:08:04 -0500 Subject: [PATCH 10/39] [stdlib] Add fp32 to fp8 conversions Add fp32 to fp8 conversions MODULAR_ORIG_COMMIT_REV_ID: 49f0d7d4a19daf3bf54d10bbe68b84100cbc818f Signed-off-by: Joshua James Venter --- stdlib/src/builtin/simd.mojo | 184 +++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) diff --git a/stdlib/src/builtin/simd.mojo b/stdlib/src/builtin/simd.mojo index e1f8f186d7..8debd181dc 100644 --- a/stdlib/src/builtin/simd.mojo +++ b/stdlib/src/builtin/simd.mojo @@ -57,6 +57,7 @@ from utils import IndexList, StaticTuple from utils._visualizers import lldb_formatter_wrapping_type from utils.numerics import FPUtils from utils.numerics import isnan as _isnan +from utils.numerics import isinf as _isinf from utils.numerics import max_finite as _max_finite from utils.numerics import max_or_inf as _max_or_inf from utils.numerics import min_finite as _min_finite @@ -1831,6 +1832,15 @@ struct SIMD[type: DType, size: Int]( # use the optimizations defined above. return self.cast[DType.float32]().cast[target]() + @parameter + if type is DType.float32 and target in ( + DType.float8e4m3, + DType.float8e5m2, + ): + return _convert_f32_to_float8[size=size, target=target]( + rebind[SIMD[DType.float32, size]](self) + ) + @parameter if type in (DType.float8e4m3, DType.float8e5m2): constrained[ @@ -3284,6 +3294,180 @@ fn _convert_float8_to_f16[ ]() +@always_inline +fn _convert_f32_to_float8[ + type: DType, + target: DType, + size: Int, +](val: SIMD[type, size],) -> SIMD[target, size]: + @parameter + if is_nvidia_gpu() and _is_sm_9x(): + alias asm_prefix = "cvt.rn.satfinite.e4m3x2.f32" if target is DType.float8e4m3 else "cvt.rn.satfinite.e5m2x2.f32" + + @parameter + if size > 1: + var res = SIMD[target, size]() + + @parameter + for i in range(0, size, 2): + var f8x2_f32x2 = inlined_assembly[ + asm_prefix + " $0, $1, $2;", + Scalar[DType.uint16], + constraints="=h,f,f", + has_side_effect=False, + ](val[i + 1], val[i]) + var ui8x2 = bitcast[target, 2](f8x2_f32x2) + res = res.insert[offset=i](ui8x2) + return res + else: + var f8x2_f32x2 = inlined_assembly[ + asm_prefix + " $0, $1, $2;", + Scalar[DType.uint16], + constraints="=h,f,f", + has_side_effect=False, + ](Float32(0.0), val[0]) + var ui8x2 = bitcast[target, 2](f8x2_f32x2) + return ui8x2[0] + else: + + @always_inline + @parameter + fn wrapper_fn[ + input_type: DType, result_type: DType + ](val: Scalar[input_type]) capturing -> Scalar[result_type]: + return rebind[Scalar[result_type]]( + _convert_f32_to_float8_scaler[type, result_type]( + rebind[Scalar[type]](val) + ) + ) + + return _simd_apply[wrapper_fn, target, size](val) + + +@always_inline +fn _convert_f32_to_float8_scaler[ + type: DType, + target: DType, +](x: Scalar[type]) -> Scalar[target]: + # software implementation rounds toward nearest even + + alias IS_E4M3 = target is DType.float8e4m3 + alias FP8_NUM_MANTISSA_BITS = FPUtils[target].mantissa_width() + alias FP8_NUM_EXPONENT_BITS = FPUtils[target].exponent_width() + alias FP32_NUM_BITS = bitwidthof[type]() + alias FP8_EXPONENT_MASK: UInt8 = (1 << FP8_NUM_EXPONENT_BITS) - 1 + alias FP8_MANTISSA_MASK: UInt8 = (1 << FP8_NUM_MANTISSA_BITS) - 1 + alias FP8_MAX_EXPONENT = FPUtils[target].exponent_bias() + var FP8_MIN_EXPONENT = -6 if IS_E4M3 else -14 + alias FP8_EXPONENT_BIAS = FPUtils[target].exponent_bias() + alias FP32_EXPONENT_BIAS = FPUtils[type].exponent_bias() + alias FP32_NUM_MANTISSA_BITS = FPUtils[type].mantissa_width() + alias FP8_MAX_FLT: UInt8 = 0x7E if IS_E4M3 else 0x7B + + # Extract the bits in the FP32 type + var sign: UInt8 = 0x80 if FPUtils[type].get_sign(x) else 0x00 + var exp = Int32(FPUtils[type].get_exponent_biased(x)) - FP32_EXPONENT_BIAS + var mantissa = Int32(FPUtils[type].get_mantissa(x)) + var u: UInt8 = 0 + + var kF8_NaN: UInt8 = 0x7F + + # NaN => NaN + if _isnan(x): + return bitcast[target](kF8_NaN) + + # Inf => MAX_FLT (satfinite) + if _isinf(x): + return bitcast[target](sign | FP8_MAX_FLT) + + # Special handling + if exp == -128: + # int8 range is from -128 to 127 + # So 255(inf) - 127(bias) = 128 - will show up as -128 + + # satfinite + return bitcast[target](sign | FP8_MAX_FLT) + + var sticky_bit: Int32 = 0 + + var skip_sign = False + var may_be_nan = False + + if exp >= FP8_MIN_EXPONENT and exp <= FP8_MAX_EXPONENT: + # normal fp32 to normal fp8 + exp += FP8_EXPONENT_BIAS + u = ( + ( + (exp).cast[DType.uint32]() + & FP8_EXPONENT_MASK.cast[DType.uint32]() + ) + << FP8_NUM_MANTISSA_BITS + ).cast[DType.uint8]() + u = ( + u + | ( + mantissa >> (FP32_NUM_MANTISSA_BITS - FP8_NUM_MANTISSA_BITS) + ).cast[DType.uint8]() + ) + elif exp < FP8_MIN_EXPONENT: + # normal single-precision to subnormal float8-precision representation + var rshift: Int32 = FP8_MIN_EXPONENT - exp + if rshift < FP32_NUM_BITS: + mantissa |= 1 << FP32_NUM_MANTISSA_BITS + sticky_bit = ((mantissa & ((1 << rshift) - 1)) != 0).cast[ + DType.int32 + ]() + mantissa = mantissa >> rshift + u = ( + mantissa >> (FP32_NUM_MANTISSA_BITS - FP8_NUM_MANTISSA_BITS) + ).cast[DType.uint8]() & FP8_MANTISSA_MASK + else: + mantissa = 0 + u = 0 + # Exponent > FP8_MAX_EXPONENT - this is a special case done to match HW + # 0x4380_0000 to 0x43e0_0000 - maps from 256 to 448, and does not saturate / inf. + else: + if exp == (FP8_MAX_EXPONENT + 1): + var mantissa_tmp: UInt8 = ( + mantissa >> (FP32_NUM_MANTISSA_BITS - FP8_NUM_MANTISSA_BITS) + ).cast[DType.uint8]() + if mantissa_tmp < FP8_MANTISSA_MASK: + exp = exp + FP8_EXPONENT_BIAS + u = ((exp).cast[DType.uint32]() << FP8_NUM_MANTISSA_BITS).cast[ + DType.uint8 + ]() | mantissa_tmp + may_be_nan = mantissa_tmp == (FP8_MANTISSA_MASK - 1) + else: + # satfinite + return bitcast[target](sign | FP8_MAX_FLT) + else: + # satfinite + return bitcast[target](sign | FP8_MAX_FLT) + + # round to nearest even + var NUM_BITS_SHIFT: Int32 = FP32_NUM_MANTISSA_BITS - ( + FP8_NUM_MANTISSA_BITS + 1 + ) + var round_bit: Int32 = ((mantissa >> NUM_BITS_SHIFT) & 1) + sticky_bit |= ((mantissa & ((1 << NUM_BITS_SHIFT) - 1)) != 0).cast[ + DType.int32 + ]() + + if (round_bit and sticky_bit) or (round_bit and (u & 1)): + u = (u + 1).cast[DType.uint8]() + if may_be_nan: + skip_sign = True + + if u > FP8_MAX_FLT: + # satfinite + u = sign | FP8_MAX_FLT + + if not skip_sign: + u |= sign + + return bitcast[target](u) + + # ===----------------------------------------------------------------------=== # # bfloat16 # ===----------------------------------------------------------------------=== # From 76bc768000dd0600e393ea662d4596fa60d1dcba Mon Sep 17 00:00:00 2001 From: Owen Hilyard Date: Tue, 14 Jan 2025 09:46:42 -0800 Subject: [PATCH 11/39] [External] [stdlib] Make atomics sharable (#53867) [External] [stdlib] Make atomics sharable Prior to this, most atomic operations required a mutable reference, which meant you had statically guarenteed mutual exclusion, which means you don't need atomics. This fixes those operations to only require an immutable reference, allowing them to be used in multiple threads. Co-authored-by: Owen Hilyard Closes modularml/mojo#3943 MODULAR_ORIG_COMMIT_REV_ID: ba2460225e7243f65d80ea397c97c9c0a77f26f6 Signed-off-by: Joshua James Venter --- stdlib/src/os/atomic.mojo | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/stdlib/src/os/atomic.mojo b/stdlib/src/os/atomic.mojo index 5b34c70298..3b1088fcce 100644 --- a/stdlib/src/os/atomic.mojo +++ b/stdlib/src/os/atomic.mojo @@ -53,7 +53,7 @@ struct Atomic[type: DType, *, scope: StringLiteral = ""]: self.value = value @always_inline - fn load(mut self) -> Scalar[type]: + fn load(self) -> Scalar[type]: """Loads the current value from the atomic. Returns: @@ -139,7 +139,7 @@ struct Atomic[type: DType, *, scope: StringLiteral = ""]: ) @always_inline - fn fetch_add(mut self, rhs: Scalar[type]) -> Scalar[type]: + fn fetch_add(self, rhs: Scalar[type]) -> Scalar[type]: """Performs atomic in-place add. Atomically replaces the current value with the result of arithmetic @@ -158,7 +158,7 @@ struct Atomic[type: DType, *, scope: StringLiteral = ""]: return Self._fetch_add(value_addr, rhs) @always_inline - fn __iadd__(mut self, rhs: Scalar[type]): + fn __iadd__(self, rhs: Scalar[type]): """Performs atomic in-place add. Atomically replaces the current value with the result of arithmetic @@ -173,7 +173,7 @@ struct Atomic[type: DType, *, scope: StringLiteral = ""]: _ = self.fetch_add(rhs) @always_inline - fn fetch_sub(mut self, rhs: Scalar[type]) -> Scalar[type]: + fn fetch_sub(self, rhs: Scalar[type]) -> Scalar[type]: """Performs atomic in-place sub. Atomically replaces the current value with the result of arithmetic @@ -197,7 +197,7 @@ struct Atomic[type: DType, *, scope: StringLiteral = ""]: ](value_addr.address, rhs.value) @always_inline - fn __isub__(mut self, rhs: Scalar[type]): + fn __isub__(self, rhs: Scalar[type]): """Performs atomic in-place sub. Atomically replaces the current value with the result of arithmetic @@ -213,7 +213,7 @@ struct Atomic[type: DType, *, scope: StringLiteral = ""]: @always_inline fn compare_exchange_weak( - mut self, mut expected: Scalar[type], desired: Scalar[type] + self, mut expected: Scalar[type], desired: Scalar[type] ) -> Bool: """Atomically compares the self value with that of the expected value. If the values are equal, then the self value is replaced with the @@ -271,7 +271,7 @@ struct Atomic[type: DType, *, scope: StringLiteral = ""]: _max_impl[scope=scope](ptr, rhs) @always_inline - fn max(mut self, rhs: Scalar[type]): + fn max(self, rhs: Scalar[type]): """Performs atomic in-place max. Atomically replaces the current value with the result of max of the @@ -311,7 +311,7 @@ struct Atomic[type: DType, *, scope: StringLiteral = ""]: _min_impl[scope=scope](ptr, rhs) @always_inline - fn min(mut self, rhs: Scalar[type]): + fn min(self, rhs: Scalar[type]): """Performs atomic in-place min. Atomically replaces the current value with the result of min of the From 0413f70a7d51fbaf8e9cb97ba054d1984d3aeff0 Mon Sep 17 00:00:00 2001 From: Nikolay Panchenko Date: Tue, 14 Jan 2025 14:28:05 -0500 Subject: [PATCH 12/39] [stdlib] Limit size of the SIMD to 2^15 Matching LLVM's expectations of a vector size allowed in Clang and CodeGen. After fix of the https://github.com/llvm/llvm-project/issues/122571 limit can be increased if needed. MODULAR_ORIG_COMMIT_REV_ID: 1e1f830425adfad2b1460cfb6c8fd9dee731d987 Signed-off-by: Joshua James Venter --- stdlib/src/builtin/simd.mojo | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/stdlib/src/builtin/simd.mojo b/stdlib/src/builtin/simd.mojo index 8debd181dc..e97cb3c9bf 100644 --- a/stdlib/src/builtin/simd.mojo +++ b/stdlib/src/builtin/simd.mojo @@ -174,7 +174,7 @@ fn _simd_construction_checks[type: DType, size: Int](): Parameters: type: The data type of SIMD vector elements. - size: The number of elements in the SIMD vector. + size: The number of elements in the SIMD vector. The size must not be greater than 2**15. """ constrained[ type is not DType.invalid, "simd type cannot be DType.invalid" @@ -185,6 +185,16 @@ fn _simd_construction_checks[type: DType, size: Int](): not (type is DType.bfloat16 and has_neon()), "bf16 is not supported for ARM architectures", ]() + # MOCO-1388: Until LLVM's issue #122571 is fixed, LLVM's SelectionDAG has + # a limit of 2^15 for the number of operands of the instruction. + # NOTE: Even after the limit increases in LLVM, compile time might be 3x + # slower than with GCC, therefore until we have a real use case for large + # SIMD, we better to keep limit at 2^15. + # NOTE: Might need to revisit the limit for targets that use GlobalISel + # as it does have smaller limit now. + constrained[ + size <= 2**15, "simd size is too large and must be less than 2^15" + ]() @always_inline("nodebug") From 42530364bec1c209d1041a4a69bde76f56515bbe Mon Sep 17 00:00:00 2001 From: Connor Gray Date: Tue, 14 Jan 2025 13:36:17 -0600 Subject: [PATCH 13/39] [stdlib][NFC] cleanup: Factor out codepoint test data MODULAR_ORIG_COMMIT_REV_ID: ebb0b89772d7462416c97559b41e4f4cd198a74f Signed-off-by: Joshua James Venter --- stdlib/test/builtin/test_char.mojo | 93 +++++++++++++++--------------- 1 file changed, 45 insertions(+), 48 deletions(-) diff --git a/stdlib/test/builtin/test_char.mojo b/stdlib/test/builtin/test_char.mojo index 346467d3e2..c8c083a82a 100644 --- a/stdlib/test/builtin/test_char.mojo +++ b/stdlib/test/builtin/test_char.mojo @@ -95,6 +95,42 @@ def test_char_is_posix_space(): assert_false(Char.ord(".").is_posix_space()) +alias SIGNIFICANT_CODEPOINTS = List[Tuple[Int, List[Byte]]]( + # -------------------------- + # 1-byte (ASCII) codepoints + # -------------------------- + # Smallest 1-byte codepoint value + (0, List[Byte](0)), + (1, List[Byte](1)), + (32, List[Byte](32)), # First non-control character + (0b0111_1111, List[Byte](127)), # 127 + # ------------------ + # 2-byte codepoints -- 0b110x_xxxx 0b10xx_xxxx (11 x's) + # ------------------ + # Smallest 2-byte codepoint + (128, List[Byte](0b1100_0010, 0b1000_0000)), + # Largest 2-byte codepoint -- 2^11 - 1 == 2047 + (2**11 - 1, List[Byte](0b1101_1111, 0b1011_1111)), + # ------------------ + # 3-byte codepoints -- 0b1110_xxxx 0b10xx_xxxx 0b10xx_xxxx (16 x's) + # ------------------ + # Smallest 3-byte codepoint -- 2^11 == 2048 + (2**11, List[Byte](0b1110_0000, 0b1010_0000, 0b1000_0000)), + # Largest 3-byte codepoint -- 2^16 - 1 == 65535 == 0xFFFF + (2**16 - 1, List[Byte](0b1110_1111, 0b1011_1111, 0b1011_1111)), + # ------------------ + # 4-byte codepoints 0b1111_0xxx 0b10xx_xxxx 0b10xx_xxxx 0b10xx_xxxx (21 x's) + # ------------------ + # Smallest 4-byte codepoint + (2**16, List[Byte](0b1111_0000, 0b1001_0000, 0b1000_0000, 0b1000_0000)), + # Largest 4-byte codepoint -- Maximum Unicode codepoint + ( + 0x10FFFF, + List[Byte](0b1111_0100, 0b1000_1111, 0b1011_1111, 0b1011_1111), + ), +) + + fn assert_utf8_bytes(codepoint: UInt32, owned expected: List[Byte]) raises: var char_opt = Char.from_u32(codepoint) var char = char_opt.value() @@ -123,60 +159,21 @@ fn assert_utf8_bytes(codepoint: UInt32, owned expected: List[Byte]) raises: def test_char_utf8_encoding(): - assert_utf8_bytes(0, List[Byte](0)) - assert_utf8_bytes(1, List[Byte](1)) - assert_utf8_bytes(127, List[Byte](127)) - - # Smallest 2-byte codepoint - assert_utf8_bytes(128, List[Byte](0b1100_0010, 0b1000_0000)) - # Largest 2-byte codepoint - assert_utf8_bytes(2**11 - 1, List[Byte](0b1101_1111, 0b1011_1111)) - - # Smallest 3-byte codepoint -- 2^11 == 2048 - assert_utf8_bytes( - 2**11, List[Byte](0b1110_0000, 0b1010_0000, 0b1000_0000) - ) - # Largest 3-byte codepoint -- 2^16 - 1 == 65535 == 0xFFFF - assert_utf8_bytes( - 2**16 - 1, List[Byte](0b1110_1111, 0b1011_1111, 0b1011_1111) - ) + for entry in SIGNIFICANT_CODEPOINTS: + var codepoint = entry[][0] + var expected_utf8 = entry[][1] - # Smallest 4-byte codepoint - assert_utf8_bytes( - 2**16, List[Byte](0b1111_0000, 0b1001_0000, 0b1000_0000, 0b1000_0000) - ) - # Largest 4-byte codepoint -- Maximum Unicode codepoint - assert_utf8_bytes( - 0x10FFFF, List[Byte](0b1111_0100, 0b1000_1111, 0b1011_1111, 0b1011_1111) - ) + assert_utf8_bytes(codepoint, expected_utf8) def test_char_utf8_byte_length(): - fn codepoint_len(cp: UInt32) -> Int: - return Char.from_u32(cp).value().utf8_byte_length() + for entry in SIGNIFICANT_CODEPOINTS: + var codepoint = entry[][0] + var expected_utf8 = entry[][1] - # 1-byte (ASCII) codepoints - assert_equal(codepoint_len(0), 1) - assert_equal(codepoint_len(32), 1) - assert_equal(codepoint_len(127), 1) + var computed_len = Char.from_u32(codepoint).value().utf8_byte_length() - # 2-byte codepoints -- 0b110x_xxxx 0b10xx_xxxx (11 x's) - # Smallest 2-byte codepoint - assert_equal(codepoint_len(128), 2) - # Largest 2-byte codepoint - assert_equal(codepoint_len(2**11 - 1), 2) # 2^11 - 1 == 2047 - - # 3-byte codepoints -- 0b1110_xxxx 0b10xx_xxxx 0b10xx_xxxx (16 x's) - # Smallest 3-byte codepoint - assert_equal(codepoint_len(2**11), 3) # 2^11 == 2048 - # Largest 3-byte codepoint - assert_equal(codepoint_len(2**16 - 1), 3) # 2^16 - 1 == 65535 == 0xFFFF - - # 4-byte codepoints 0b1111_0xxx 0b10xx_xxxx 0b10xx_xxxx 0b10xx_xxxx (21 x's) - # Smallest 4-byte codepoint - assert_equal(codepoint_len(2**16), 4) - # Largest 4-byte codepoint - assert_equal(codepoint_len(0x10FFFF), 4) # Maximum Unicode codepoint + assert_equal(computed_len, len(expected_utf8)) def test_char_comptime(): From ba814a34e2a1efedc7745ed50dee5503feb828cd Mon Sep 17 00:00:00 2001 From: Rasool Sharifi Date: Tue, 14 Jan 2025 15:30:44 -0500 Subject: [PATCH 14/39] [******][GPU] Add conversion from all floating point types to fp8 Add conversion from all floating point types to fp8. MODULAR_ORIG_COMMIT_REV_ID: 6c8a09290a6a9b67ea2e95167ceb8e9673125ded Signed-off-by: Joshua James Venter --- stdlib/src/builtin/simd.mojo | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/stdlib/src/builtin/simd.mojo b/stdlib/src/builtin/simd.mojo index e97cb3c9bf..c01370d2cb 100644 --- a/stdlib/src/builtin/simd.mojo +++ b/stdlib/src/builtin/simd.mojo @@ -1843,12 +1843,14 @@ struct SIMD[type: DType, size: Int]( return self.cast[DType.float32]().cast[target]() @parameter - if type is DType.float32 and target in ( - DType.float8e4m3, - DType.float8e5m2, - ): - return _convert_f32_to_float8[size=size, target=target]( - rebind[SIMD[DType.float32, size]](self) + if target in (DType.float8e4m3, DType.float8e5m2): + # TODO(KERN-1488): use gpu (H100) instruction to convert from fp16 to fp8 + return rebind[SIMD[target, size]]( + _convert_f32_to_float8[size=size, target=target]( + rebind[SIMD[DType.float32, size]]( + self.cast[DType.float32]() + ) + ) ) @parameter From 9ab0fc0cee0664c89bb684603db7146942f14ff2 Mon Sep 17 00:00:00 2001 From: Connor Gray Date: Tue, 14 Jan 2025 15:38:12 -0600 Subject: [PATCH 15/39] [stdlib] feat: Add `StringSlice.char_length()` + use `StringSlice` in low-level utils This is part of preparing the way to change `StringSlice.__len__()` to return the string length in bytes instead of codepoints. MODULAR_ORIG_COMMIT_REV_ID: 05955b1974e7682b8d9da1214049e850a2278e21 Signed-off-by: Joshua James Venter --- docs/changelog.md | 9 ++++ .../src/collections/string/string_slice.mojo | 48 +++++++++++++------ .../collections/string/test_string_slice.mojo | 28 +++++++++-- 3 files changed, 67 insertions(+), 18 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index b1e027026d..fc57571237 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -149,6 +149,15 @@ what we publish. has narrower comparison methods that support comparing only with `StringSlice`'s with the exact same origin. +- Added `StringSlice.char_length()` method, to pair with the existing + `StringSlice.byte_length()` method. + + In a future version of Mojo, `StringSlice.__len__()` may be changed to return + the length in bytes, matching the convention of string length methods in + languages like C++ and Rust. Callers that know they need the length in + Unicode codepoints should update to calling `StringSlice.char_length()` + instead. + - Removed `@implicit` decorator from some standard library initializer methods that perform allocation. This reduces places where Mojo code could implicitly allocate where the user may not be aware. diff --git a/stdlib/src/collections/string/string_slice.mojo b/stdlib/src/collections/string/string_slice.mojo index 974f2a4e6e..fd1eeae585 100644 --- a/stdlib/src/collections/string/string_slice.mojo +++ b/stdlib/src/collections/string/string_slice.mojo @@ -36,10 +36,10 @@ alias StaticString = StringSlice[StaticConstantOrigin] """An immutable static string slice.""" -fn _count_utf8_continuation_bytes(span: Span[Byte]) -> Int: +fn _count_utf8_continuation_bytes(str_slice: StringSlice) -> Int: alias sizes = (256, 128, 64, 32, 16, 8) - var ptr = span.unsafe_ptr() - var num_bytes = len(span) + var ptr = str_slice.unsafe_ptr() + var num_bytes = str_slice.byte_length() var amnt: Int = 0 var processed = 0 @@ -181,17 +181,16 @@ struct _StringSliceIter[ fn __len__(self) -> Int: @parameter if forward: - remaining = self.length - self.index - cont = _count_utf8_continuation_bytes( - Span[Byte, ImmutableAnyOrigin]( - ptr=self.ptr + self.index, length=remaining - ) + var remaining = self.length - self.index + var span = Span[Byte, ImmutableAnyOrigin]( + ptr=self.ptr + self.index, length=remaining ) - return remaining - cont + return StringSlice(unsafe_from_utf8=span).char_length() else: - return self.index - _count_utf8_continuation_bytes( - Span[Byte, ImmutableAnyOrigin](ptr=self.ptr, length=self.index) + var span = Span[Byte, ImmutableAnyOrigin]( + ptr=self.ptr, length=self.index ) + return StringSlice(unsafe_from_utf8=span).char_length() @value @@ -408,10 +407,7 @@ struct StringSlice[mut: Bool, //, origin: Origin[mut]]( Returns: The length in Unicode codepoints. """ - var b_len = self.byte_length() - alias S = Span[Byte, StaticConstantOrigin] - var s = S(ptr=self.unsafe_ptr(), length=b_len) - return b_len - _count_utf8_continuation_bytes(s) + return self.char_length() fn write_to[W: Writer](self, mut writer: W): """Formats this string slice to the provided `Writer`. @@ -806,6 +802,28 @@ struct StringSlice[mut: Bool, //, origin: Origin[mut]]( return len(self.as_bytes()) + fn char_length(self) -> UInt: + """Returns the length in Unicode codepoints. + + This returns the number of `Char` codepoint values encoded in the UTF-8 + representation of this string. + + Note: To get the length in bytes, use `StringSlice.byte_length()`. + + Returns: + The length in Unicode codepoints. + """ + # Every codepoint is encoded as one leading byte + 0 to 3 continuation + # bytes. + # The total number of codepoints is equal the number of leading bytes. + # So we can compute the number of leading bytes (and thereby codepoints) + # by subtracting the number of continuation bytes length from the + # overall length in bytes. + # For a visual explanation of how this UTF-8 codepoint counting works: + # https://connorgray.com/ephemera/project-log#2025-01-13 + var continuation_count = _count_utf8_continuation_bytes(self) + return self.byte_length() - continuation_count + fn get_immutable( self, ) -> StringSlice[ImmutableOrigin.cast_from[origin].result]: diff --git a/stdlib/test/collections/string/test_string_slice.mojo b/stdlib/test/collections/string/test_string_slice.mojo index 4b4618bd11..556128a19e 100644 --- a/stdlib/test/collections/string/test_string_slice.mojo +++ b/stdlib/test/collections/string/test_string_slice.mojo @@ -170,6 +170,26 @@ fn test_slice_len() raises: assert_equal(1, len(slice5)) +fn test_slice_char_length() raises: + var s0 = StringSlice("") + assert_equal(s0.byte_length(), 0) + assert_equal(s0.char_length(), 0) + + var s1 = StringSlice("foo") + assert_equal(s1.byte_length(), 3) + assert_equal(s1.char_length(), 3) + + # This string contains 1-, 2-, 3-, and 4-byte codepoint sequences. + var s2 = StringSlice("߷കൈ🔄!") + assert_equal(s2.byte_length(), 13) + assert_equal(s2.char_length(), 5) + + # Just a bit of Zalgo text. + var s3 = StringSlice("H̵͙̖̼̬̬̲̱͊̇̅͂̍͐͌͘͜͝") + assert_equal(s3.byte_length(), 37) + assert_equal(s3.char_length(), 19) + + fn test_slice_eq() raises: var str1: String = "12345" var str2: String = "12345" @@ -460,9 +480,10 @@ def test_count_utf8_continuation_bytes(): alias b4 = UInt8(0b1111_0000) def _test(amnt: Int, items: List[UInt8]): - p = items.unsafe_ptr() - span = Span[Byte, StaticConstantOrigin](ptr=p, length=len(items)) - assert_equal(amnt, _count_utf8_continuation_bytes(span)) + var p = items.unsafe_ptr() + var span = Span[Byte, StaticConstantOrigin](ptr=p, length=len(items)) + var str_slice = StringSlice(unsafe_from_utf8=span) + assert_equal(amnt, _count_utf8_continuation_bytes(str_slice)) _test(5, List[UInt8](c, c, c, c, c)) _test(2, List[UInt8](b2, c, b2, c, b1)) @@ -699,6 +720,7 @@ def main(): test_string_byte_span() test_heap_string_from_string_slice() test_slice_len() + test_slice_char_length() test_slice_eq() test_slice_bool() test_slice_repr() From 58c3e6a876926a52a851c95e1b77162738c5cdfe Mon Sep 17 00:00:00 2001 From: Lukas Hermann <1734032+lsh@users.noreply.github.com> Date: Tue, 14 Jan 2025 13:42:28 -0800 Subject: [PATCH 16/39] [stdlib] Get print working on multithreads `StaticTuple` has some issues that `InlineArray` fixes. By switching to `InlineArray` the payload copies behave properly. One side effect of this change is that we have to get rid of the `address_space` tag on the `payload_t` pointers, since non-trivial types (`InlineArray`) can't be copied across address spaces. MODULAR_ORIG_COMMIT_REV_ID: f48eedfc43db45c3465508390aa9ae2421c52bdd Signed-off-by: Joshua James Venter --- stdlib/src/sys/_amdgpu.mojo | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/stdlib/src/sys/_amdgpu.mojo b/stdlib/src/sys/_amdgpu.mojo index 7e3f2ca06a..169ddcd9f5 100644 --- a/stdlib/src/sys/_amdgpu.mojo +++ b/stdlib/src/sys/_amdgpu.mojo @@ -23,7 +23,6 @@ from sys.intrinsics import ( ) from time import sleep from collections import InlineArray -from utils import StaticTuple # NOTE: MOST OF THE CODE HERE IS ADAPTED FROM # AMD'S `device-libs`. @@ -547,12 +546,11 @@ struct Header: me: UInt32, low: UInt32, ): + var active = ballot[DType.int64](True).cast[DType.uint64]() if me == low: var control = set_ready_flag(0) self._handle[].control = control - self._handle[].activemask = ballot[DType.int64](True).cast[ - DType.uint64 - ]() + self._handle[].activemask = active self._handle[].service = service_id payload[Int(me), 0] = arg0 @@ -605,7 +603,7 @@ struct Header: sleep(UInt(1)) - var ptr = payload._handle[].slots[Int(me)] + var ptr = payload._handle[].slots[Int(me) * 8] var value0 = ptr[0] var value1 = ptr[1] return value0, value1 @@ -627,9 +625,7 @@ struct header_t: @value @register_passable("trivial") struct Payload: - var _handle: UnsafePointer[ - payload_t, address_space = _GPUAddressSpace.GLOBAL - ] + var _handle: UnsafePointer[payload_t] @always_inline fn __setitem__(mut self, idx0: Int, idx1: Int, value: UInt64): @@ -641,9 +637,8 @@ struct Payload: # but this is actually just conforming to the ABI of: # https://github.com/ROCm/clr/blob/f5b2516f5d8a44b06ad1907594db1be25a9fe57b/rocclr/device/devhostcall.hpp#L99 @value -@register_passable("trivial") struct payload_t: - var slots: StaticTuple[StaticTuple[UInt64, 8], 64] + var slots: InlineArray[InlineArray[UInt64, 8], 64] @value @@ -752,9 +747,7 @@ struct buffer_t: var headers: UnsafePointer[ header_t, address_space = _GPUAddressSpace.GLOBAL ] - var payloads: UnsafePointer[ - payload_t, address_space = _GPUAddressSpace.GLOBAL - ] + var payloads: UnsafePointer[payload_t] var doorbell: UInt64 var free_stack: UInt64 var ready_stack: UInt64 From c011c901172fae9f684154cd1066e40a70738fc0 Mon Sep 17 00:00:00 2001 From: Connor Gray Date: Tue, 14 Jan 2025 17:06:33 -0600 Subject: [PATCH 17/39] [stdlib] feat: Add `String.chars()` and `CharsIter` iterator type In many cases, code that currently iterates over `String` using it's `__iter__()` method that return single-character substring slice as `StringSlice` elements, would instead be more readable if it was written instead using a `Char` iterator. This will enable us to do that refactoring. MODULAR_ORIG_COMMIT_REV_ID: 1f9a40abee881a7438707b4e6159fac7b42206f9 Signed-off-by: Joshua James Venter --- docs/changelog.md | 4 + .../src/collections/string/string_slice.mojo | 183 ++++++++++++++++++ .../collections/string/test_string_slice.mojo | 74 +++++++ 3 files changed, 261 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index fc57571237..0e24712deb 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -119,6 +119,10 @@ what we publish. a `StringSlice` from a buffer containing UTF-8 encoded data. This method will raise if the buffer contents are not valid UTF-8. +- Added `StringSlice.chars()` which returns an iterator over `Char`s. This is a + compliant UTF-8 decoder that returns each Unicode codepoint encoded in the + string. + - Several standard library functions have been changed to take `StringSlice` instead of `String`. This generalizes them to be used for any appropriately encoded string in memory, without requiring that the string be heap allocated. diff --git a/stdlib/src/collections/string/string_slice.mojo b/stdlib/src/collections/string/string_slice.mojo index fd1eeae585..910fa02883 100644 --- a/stdlib/src/collections/string/string_slice.mojo +++ b/stdlib/src/collections/string/string_slice.mojo @@ -193,6 +193,144 @@ struct _StringSliceIter[ return StringSlice(unsafe_from_utf8=span).char_length() +@value +struct CharsIter[mut: Bool, //, origin: Origin[mut]]: + """Iterator over the `Char`s in a string slice, constructed by + `StringSlice.chars()`. + + Parameters: + mut: Mutability of the underlying string data. + origin: Origin of the underlying string data. + """ + + var _slice: StringSlice[origin] + """String slice containing the bytes that have not been read yet. + + When this iterator advances, the pointer in `_slice` is advanced by the + byte length of each read character, and the slice length is decremented by + the same amount. + """ + + # Note: + # Marked private since `StringSlice.chars()` is the intended public way to + # construct this type. + @doc_private + fn __init__(out self, str_slice: StringSlice[origin]): + self._slice = str_slice + + # ===-------------------------------------------------------------------===# + # Trait implementations + # ===-------------------------------------------------------------------===# + + @doc_private + fn __iter__(self) -> Self: + return self + + fn __next__(mut self) -> Char: + """Get the next character in the underlying string slice. + + This returns the next `Char` encoded in the underlying string, and + advances the iterator state. + + This function will abort if this iterator has been exhausted. + + Returns: + The next character in the string. + """ + + return self.next().value() + + @always_inline + fn __has_next__(self) -> Bool: + """Returns True if there are still elements in this iterator. + + Returns: + A boolean indicating if there are still elements in this iterator. + """ + return bool(self.peek_next()) + + @always_inline + fn __len__(self) -> Int: + """Returns the remaining length of this iterator in `Char`s. + + The value returned from this method indicates the number of subsequent + calls to `next()` that will return a value. + + Returns: + Number of codepoints remaining in this iterator. + """ + return self._slice.char_length() + + # ===-------------------------------------------------------------------===# + # Methods + # ===-------------------------------------------------------------------===# + + fn peek_next(self) -> Optional[Char]: + """Check what the next character in this iterator is, without advancing + the iterator state. + + Repeated calls to this method will return the same value. + + Returns: + The next character in the underlying string, or None if the string + is empty. + + # Examples + + `peek_next()` does not advance the iterator, so repeated calls will + return the same value: + + ```mojo + from collections.string import StringSlice + from testing import assert_equal + + var input = StringSlice("123") + var iter = input.chars() + + assert_equal(iter.peek_next().value(), Char.ord("1")) + assert_equal(iter.peek_next().value(), Char.ord("1")) + assert_equal(iter.peek_next().value(), Char.ord("1")) + + # A call to `next()` return the same value as `peek_next()` had, + # but also advance the iterator. + assert_equal(iter.next().value(), Char.ord("1")) + + # Later `peek_next()` calls will return the _new_ next character: + assert_equal(iter.peek_next().value(), Char.ord("2")) + ``` + . + """ + if len(self._slice) > 0: + # SAFETY: Will not read out of bounds because `_slice` is guaranteed + # to contain valid UTF-8. + char, _ = Char.unsafe_decode_utf8_char(self._slice.unsafe_ptr()) + return char + else: + return None + + fn next(mut self) -> Optional[Char]: + """Get the next character in the underlying string slice, or None if + the iterator is empty. + + This returns the next `Char` encoded in the underlying string, and + advances the iterator state. + + Returns: + A character if the string is not empty, otherwise None. + """ + var result: Optional[Char] = self.peek_next() + + if result: + # SAFETY: We just checked that `result` holds a value + var char_len = result.unsafe_value().utf8_byte_length() + # Advance the pointer in _slice. + self._slice._slice._data += char_len + # Decrement the byte-length of _slice. + self._slice._slice._len -= char_len + + return result + + @value @register_passable("trivial") struct StringSlice[mut: Bool, //, origin: Origin[mut]]( @@ -772,6 +910,51 @@ struct StringSlice[mut: Bool, //, origin: Origin[mut]]( l_idx += 1 return Self(unsafe_from_utf8=self.as_bytes()[l_idx:]) + @always_inline + fn chars(self) -> CharsIter[origin]: + """Returns an iterator over the `Char`s encoded in this string slice. + + Returns: + An iterator type that returns successive `Char` values stored in + this string slice. + + # Examples + + Print the characters in a string: + + ```mojo + from collections.string import StringSlice + from testing import assert_equal + + var s = StringSlice("abc") + var iter = s.chars() + assert_equal(iter.__next__(), Char.ord("a")) + assert_equal(iter.__next__(), Char.ord("b")) + assert_equal(iter.__next__(), Char.ord("c")) + assert_equal(iter.__has_next__(), False) + ``` + + `chars()` iterates over Unicode codepoints, and supports multibyte + codepoints: + + ```mojo + from collections.string import StringSlice + from testing import assert_equal + + # A visual character composed of a combining sequence of 2 codepoints. + var s = StringSlice("á") + assert_equal(s.byte_length(), 3) + + var iter = s.chars() + assert_equal(iter.__next__(), Char.ord("a")) + # U+0301 Combining Acute Accent + assert_equal(iter.__next__().to_u32(), 0x0301) + assert_equal(iter.__has_next__(), False) + ``` + . + """ + return CharsIter(self) + @always_inline fn as_bytes(self) -> Span[Byte, origin]: """Get the sequence of encoded bytes of the underlying string. diff --git a/stdlib/test/collections/string/test_string_slice.mojo b/stdlib/test/collections/string/test_string_slice.mojo index 556128a19e..8a94cb024f 100644 --- a/stdlib/test/collections/string/test_string_slice.mojo +++ b/stdlib/test/collections/string/test_string_slice.mojo @@ -714,6 +714,79 @@ def test_count(): assert_equal(StringSlice("aaaaaa").count("aa"), 3) +def test_chars_iter(): + # Test `for` loop iteration support + for char in StringSlice("abc").chars(): + assert_true(char in (Char.ord("a"), Char.ord("b"), Char.ord("c"))) + + # Test empty string chars + var s0 = StringSlice("") + var s0_iter = s0.chars() + + assert_false(s0_iter.__has_next__()) + assert_true(s0_iter.peek_next() is None) + assert_true(s0_iter.next() is None) + + # Test simple ASCII string chars + var s1 = StringSlice("abc") + var s1_iter = s1.chars() + + assert_equal(s1_iter.next().value(), Char.ord("a")) + assert_equal(s1_iter.next().value(), Char.ord("b")) + assert_equal(s1_iter.next().value(), Char.ord("c")) + assert_true(s1_iter.next() is None) + + # Multibyte character decoding: A visual character composed of a combining + # sequence of 2 codepoints. + var s2 = StringSlice("á") + assert_equal(s2.byte_length(), 3) + assert_equal(s2.char_length(), 2) + + var iter = s2.chars() + assert_equal(iter.__next__(), Char.ord("a")) + # U+0301 Combining Acute Accent + assert_equal(iter.__next__().to_u32(), 0x0301) + assert_equal(iter.__has_next__(), False) + + # A piece of text containing, 1-byte, 2-byte, 3-byte, and 4-byte codepoint + # sequences. + # For a visualization of this sequence, see: + # https://connorgray.com/ephemera/project-log#2025-01-13 + var s3 = StringSlice("߷കൈ🔄!") + assert_equal(s3.byte_length(), 13) + assert_equal(s3.char_length(), 5) + var s3_iter = s3.chars() + + # Iterator __len__ returns length in codepoints, not bytes. + assert_equal(s3_iter.__len__(), 5) + assert_equal(s3_iter._slice.byte_length(), 13) + assert_equal(s3_iter.__has_next__(), True) + assert_equal(s3_iter.__next__(), Char.ord("߷")) + + assert_equal(s3_iter.__len__(), 4) + assert_equal(s3_iter._slice.byte_length(), 11) + assert_equal(s3_iter.__next__(), Char.ord("ക")) + + # Combining character, visually comes first, but codepoint-wise comes + # after the character it combines with. + assert_equal(s3_iter.__len__(), 3) + assert_equal(s3_iter._slice.byte_length(), 8) + assert_equal(s3_iter.__next__(), Char.ord("ൈ")) + + assert_equal(s3_iter.__len__(), 2) + assert_equal(s3_iter._slice.byte_length(), 5) + assert_equal(s3_iter.__next__(), Char.ord("🔄")) + + assert_equal(s3_iter.__len__(), 1) + assert_equal(s3_iter._slice.byte_length(), 1) + assert_equal(s3_iter.__has_next__(), True) + assert_equal(s3_iter.__next__(), Char.ord("!")) + + assert_equal(s3_iter.__len__(), 0) + assert_equal(s3_iter._slice.byte_length(), 0) + assert_equal(s3_iter.__has_next__(), False) + + def main(): test_string_slice_layout() test_string_literal_byte_span() @@ -742,3 +815,4 @@ def main(): test_strip() test_startswith() test_endswith() + test_chars_iter() From 8ee72d709ebeb6956f7c3fc59ed21711908c6ffd Mon Sep 17 00:00:00 2001 From: Jack Clayton Date: Tue, 14 Jan 2025 18:37:20 -0500 Subject: [PATCH 18/39] [stdlib] Add deprecation warnings to `int` function Phase in removal of `int` with a deprecation warning. MODULAR_ORIG_COMMIT_REV_ID: 8d6dee6333592145c3a7945a1a6f8624fc32326b Signed-off-by: Joshua James Venter --- docs/changelog.md | 7 +- stdlib/src/builtin/int.mojo | 103 ++++++++++++++++++ stdlib/src/prelude/__init__.mojo | 1 + .../builtin/test_deprecation_warnings.mojo | 19 ++++ 4 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 stdlib/test/builtin/test_deprecation_warnings.mojo diff --git a/docs/changelog.md b/docs/changelog.md index 0e24712deb..c62f9a5adc 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -44,10 +44,11 @@ what we publish. ### Standard library changes -- The `int` function to construct an `Int` has been removed, this was a +- The `int` function to construct an `Int` has been deprecated, this was a temporary workaround when Mojo didn't have a way to distinguish between - implicit and explicit constructors. You can do a search and replace for `int(` - to `Int(` to update your programs. + implicit and explicit constructors. You can do a search and replace from + `int(` to `Int(` to update your programs, the `int` function will be removed + in the next release. - `UnsafePointer`'s `bitcast` method has now been split into `bitcast` for changing the type, `origin_cast` for changing mutability, diff --git a/stdlib/src/builtin/int.mojo b/stdlib/src/builtin/int.mojo index f21bb325fa..abc536abb9 100644 --- a/stdlib/src/builtin/int.mojo +++ b/stdlib/src/builtin/int.mojo @@ -204,6 +204,109 @@ trait ImplicitlyIntable(Intable): ... +# ===----------------------------------------------------------------------=== # +# int +# ===----------------------------------------------------------------------=== # + + +# FIXME(25.1): Move `int` deprecation warnings to a compiler error +@deprecated( + "the `int` function is deprecated, use the `Int` constructor instead." +) +@always_inline +fn int[T: Intable](value: T) -> Int: + """Get the Int representation of the value. + + Parameters: + T: The Intable type. + + Args: + value: The object to get the integral representation of. + + Returns: + The integral representation of the value. + """ + return value.__int__() + + +@deprecated( + "the `int` function is deprecated, use the `Int` constructor instead." +) +@always_inline +fn int[T: IntableRaising](value: T) raises -> Int: + """Get the Int representation of the value. + + Parameters: + T: The Intable type. + + Args: + value: The object to get the integral representation of. + + Returns: + The integral representation of the value. + + Raises: + If the type does not have an integral representation. + """ + return value.__int__() + + +@deprecated( + "the `int` function is deprecated, use the `Int` constructor instead." +) +fn int(value: StringSlice, base: Int = 10) raises -> Int: + """Parses and returns the given string as an integer in the given base. + + If base is set to 0, the string is parsed as an Integer literal, with the + following considerations: + - '0b' or '0B' prefix indicates binary (base 2) + - '0o' or '0O' prefix indicates octal (base 8) + - '0x' or '0X' prefix indicates hexadecimal (base 16) + - Without a prefix, it's treated as decimal (base 10) + + Args: + value: A string to be parsed as an integer in the given base. + base: Base used for conversion, value must be between 2 and 36, or 0. + + Returns: + An integer value that represents the string. + + Raises: + If the given string cannot be parsed as an integer value or if an + incorrect base is provided. + + Examples: + >>> int("32") + 32 + >>> int("FF", 16) + 255 + >>> int("0xFF", 0) + 255 + >>> int("0b1010", 0) + 10 + + Notes: + This follows [Python's integer literals]( + https://docs.python.org/3/reference/lexical_analysis.html#integers). + """ + return atol(value, base) + + +@deprecated( + "the `int` function is deprecated, use the `Int` constructor instead." +) +fn int(value: UInt) -> Int: + """Get the Int representation of the value. + + Args: + value: The object to get the integral representation of. + + Returns: + The integral representation of the value. + """ + return value.value + + # ===----------------------------------------------------------------------=== # # Int # ===----------------------------------------------------------------------=== # diff --git a/stdlib/src/prelude/__init__.mojo b/stdlib/src/prelude/__init__.mojo index a2daad0c48..2979521b03 100644 --- a/stdlib/src/prelude/__init__.mojo +++ b/stdlib/src/prelude/__init__.mojo @@ -67,6 +67,7 @@ from builtin.int import ( ImplicitlyIntable, IntableRaising, index, + int, ) from builtin.int_literal import IntLiteral from builtin.io import input, print diff --git a/stdlib/test/builtin/test_deprecation_warnings.mojo b/stdlib/test/builtin/test_deprecation_warnings.mojo new file mode 100644 index 0000000000..d7a36cdecb --- /dev/null +++ b/stdlib/test/builtin/test_deprecation_warnings.mojo @@ -0,0 +1,19 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2024, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +# RUN: %mojo %s 2>&1 1>/dev/null | FileCheck %s --check-prefix=CHECK-STDERR + + +fn main(): + # FIXME(25.1): Move `int` deprecation warnings to a compiler error + # CHECK-STDERR: warning: the `int` function is deprecated, use the `Int` constructor instead + _ = int(42) From a789ceb9eb13f3aa260eca141ec484d62a8392d4 Mon Sep 17 00:00:00 2001 From: Lukas Hermann <1734032+lsh@users.noreply.github.com> Date: Tue, 14 Jan 2025 15:58:42 -0800 Subject: [PATCH 19/39] [stdlib] Fix GPU Indexing bug Accidentally multiplying by chunk size. MODULAR_ORIG_COMMIT_REV_ID: 26a6cb4c7a2546794ef3f63728a71097326a2b50 Signed-off-by: Joshua James Venter --- stdlib/src/sys/_amdgpu.mojo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/src/sys/_amdgpu.mojo b/stdlib/src/sys/_amdgpu.mojo index 169ddcd9f5..b8cbb9a876 100644 --- a/stdlib/src/sys/_amdgpu.mojo +++ b/stdlib/src/sys/_amdgpu.mojo @@ -603,7 +603,7 @@ struct Header: sleep(UInt(1)) - var ptr = payload._handle[].slots[Int(me) * 8] + var ptr = payload._handle[].slots[Int(me)] var value0 = ptr[0] var value1 = ptr[1] return value0, value1 From cdd06b2591d009f7c8bfbb84620dd24ba4c04489 Mon Sep 17 00:00:00 2001 From: Connor Gray Date: Tue, 14 Jan 2025 18:44:45 -0600 Subject: [PATCH 20/39] [stdlib] feat: Add `Char.is_python_space()` + cleanup `StringSlice.isspace()` This adds a new `Char.is_python_space()` utility function, and cleans up `StringSlice.isspace()` to use the it, along with the recently added character iterator. MODULAR_ORIG_COMMIT_REV_ID: 0739c7a540cedefec7e31ced1550310b5a6a56e2 Signed-off-by: Joshua James Venter --- docs/changelog.md | 2 + stdlib/src/builtin/char.mojo | 42 +++++++++++++++ .../src/collections/string/string_slice.mojo | 54 +++++++++---------- .../test/collections/string/test_string.mojo | 2 + 4 files changed, 72 insertions(+), 28 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index c62f9a5adc..b1bfb3c91a 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -112,6 +112,8 @@ what we publish. `Stringable`. - Added `String` constructor from `Char` - `Char` can be converted to `UInt32` via `Char.to_u32()`. + - `Char` provides methods for categorizing character types, including: + `Char.is_ascii()`, `Char.is_posix_space()`, `Char.is_python_space()`. - `chr(Int)` will now abort if given a codepoint value that is not a valid `Char`. diff --git a/stdlib/src/builtin/char.mojo b/stdlib/src/builtin/char.mojo index 863a046442..0a48f7cdc6 100644 --- a/stdlib/src/builtin/char.mojo +++ b/stdlib/src/builtin/char.mojo @@ -272,6 +272,48 @@ struct Char(CollectionElement, EqualityComparable, Intable, Stringable): """ return self._scalar_value <= 0b0111_1111 + @always_inline + fn is_python_space(self) -> Bool: + """Determines whether this character is a Python whitespace string. + + This corresponds to Python's [universal separators]( + https://docs.python.org/3/library/stdtypes.html#str.splitlines): + `" \\t\\n\\v\\f\\r\\x1c\\x1d\\x1e\\x85\\u2028\\u2029"`. + + Returns: + True if this character is one of the whitespace characters listed + above, otherwise False. + + # Examples + + Check if a string contains only whitespace: + + ```mojo + from testing import assert_true, assert_false + + # ASCII space characters + assert_true(Char.ord(" ").is_python_space()) + assert_true(Char.ord("\t").is_python_space()) + + # Unicode paragraph separator: + assert_true(Char.from_u32(0x2029).value().is_python_space()) + + # Letters are not space characters + assert_fales(Char.ord("a").is_python_space()) + ``` + . + """ + + alias next_line = Char.from_u32(0x85).value() + alias unicode_line_sep = Char.from_u32(0x2028).value() + alias unicode_paragraph_sep = Char.from_u32(0x2029).value() + + return self.is_posix_space() or self in ( + next_line, + unicode_line_sep, + unicode_paragraph_sep, + ) + fn is_posix_space(self) -> Bool: """Returns True if this `Char` is a **space** character according to the [POSIX locale][1]. diff --git a/stdlib/src/collections/string/string_slice.mojo b/stdlib/src/collections/string/string_slice.mojo index 910fa02883..5a48b47b5e 100644 --- a/stdlib/src/collections/string/string_slice.mojo +++ b/stdlib/src/collections/string/string_slice.mojo @@ -1201,44 +1201,42 @@ struct StringSlice[mut: Bool, //, origin: Origin[mut]]( fn isspace(self) -> Bool: """Determines whether every character in the given StringSlice is a python whitespace String. This corresponds to Python's - [universal separators:]( - https://docs.python.org/3/library/stdtypes.html#str.splitlines) - `" \\t\\n\\v\\f\\r\\x1c\\x1d\\x1e\\x85\\u2028\\u2029"`. + [universal separators]( + https://docs.python.org/3/library/stdtypes.html#str.splitlines): + `" \\t\\n\\v\\f\\r\\x1c\\x1d\\x1e\\x85\\u2028\\u2029"`. Returns: True if the whole StringSlice is made up of whitespace characters listed above, otherwise False. + + Examples: + + Check if a string contains only whitespace: + + ```mojo + from collections.string import StringSlice + from testing import assert_true, assert_false + + # An empty string is not considered to contain only whitespace chars: + assert_false(StringSlice("").isspace()) + + # ASCII space characters + assert_true(StringSlice(" ").isspace()) + assert_true(StringSlice("\t").isspace()) + + # Contains non-space characters + assert_false(StringSlice(" abc ").isspace()) + ``` + . """ if self.byte_length() == 0: return False - # TODO add line and paragraph separator as stringliteral - # once Unicode escape sequences are accepted - var next_line = List[UInt8](0xC2, 0x85) - """TODO: \\x85""" - var unicode_line_sep = List[UInt8](0xE2, 0x80, 0xA8) - """TODO: \\u2028""" - var unicode_paragraph_sep = List[UInt8](0xE2, 0x80, 0xA9) - """TODO: \\u2029""" - - for s in self: - var no_null_len = s.byte_length() - var ptr = s.unsafe_ptr() - if no_null_len == 1 and Char(ptr[0]).is_posix_space(): - continue - elif ( - no_null_len == 2 and memcmp(ptr, next_line.unsafe_ptr(), 2) == 0 - ): - continue - elif no_null_len == 3 and ( - memcmp(ptr, unicode_line_sep.unsafe_ptr(), 3) == 0 - or memcmp(ptr, unicode_paragraph_sep.unsafe_ptr(), 3) == 0 - ): - continue - else: + for s in self.chars(): + if not s.is_python_space(): return False - _ = next_line, unicode_line_sep, unicode_paragraph_sep + return True fn isnewline[single_character: Bool = False](self) -> Bool: diff --git a/stdlib/test/collections/string/test_string.mojo b/stdlib/test/collections/string/test_string.mojo index b4d7046936..9d6ddae76e 100644 --- a/stdlib/test/collections/string/test_string.mojo +++ b/stdlib/test/collections/string/test_string.mojo @@ -1036,6 +1036,8 @@ def test_upper(): def test_isspace(): + assert_false(String("").isspace()) + # test all utf8 and unicode separators # 0 is to build a String with null terminator alias next_line = List[UInt8](0xC2, 0x85, 0) From 43ca599e2d3730833634fad2a74d6b4692f01bbe Mon Sep 17 00:00:00 2001 From: Judy Heflin Date: Tue, 14 Jan 2025 18:51:48 -0800 Subject: [PATCH 21/39] Add Mojo manual links about Mojo and Python dictionaries to the Dict API. MODULAR_ORIG_COMMIT_REV_ID: bcc8fb2803ffa8e234a27467ad18c422c5990aa1 Signed-off-by: Joshua James Venter --- stdlib/src/collections/dict.mojo | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/stdlib/src/collections/dict.mojo b/stdlib/src/collections/dict.mojo index 31ea5bc0e4..27b7f42a3f 100644 --- a/stdlib/src/collections/dict.mojo +++ b/stdlib/src/collections/dict.mojo @@ -22,6 +22,11 @@ Its implementation closely mirrors Python's `dict` implementation: - Insertion order is implicitly preserved. Iteration over keys, values, and items have a deterministic order based on insertion. +- For more information on the Mojo `Dict` type, see the + [Mojo `Dict` manual](/mojo/manual/types/#dict). To learn more about using + Python dictionaries from Mojo, see + [Python types in Mojo](/mojo/manual/python/types/#python-types-in-mojo). + Key elements must implement the `KeyElement` trait, which encompasses Movable, Hashable, and EqualityComparable. It also includes CollectionElement and Copyable until we push references through the standard library types. @@ -380,6 +385,11 @@ struct Dict[K: KeyElement, V: CollectionElement]( K: The type of the dictionary key. Must be Hashable and EqualityComparable so we can find the key in the map. V: The value type of the dictionary. Currently must be CollectionElement. + + For more information on the Mojo `Dict` type, see the + [Mojo `Dict` manual](/mojo/manual/types/#dict). To learn more about using + Python dictionaries from Mojo, see + [Python types in Mojo](/mojo/manual/python/types/#python-types-in-mojo). """ # Implementation: From b75c3d7059cb9fee5e6c2b8412ee9dc7aaddb564 Mon Sep 17 00:00:00 2001 From: modularbot Date: Wed, 15 Jan 2025 17:02:29 +0000 Subject: [PATCH 22/39] Update lockfiles to point to latest nightly version: 25.1.0.dev2025011505 Signed-off-by: Joshua James Venter --- examples/life/magic.lock | 191 +++++++++++++++--------------- examples/magic.lock | 191 +++++++++++++++--------------- examples/notebooks/magic.lock | 216 +++++++++++++++++----------------- examples/operators/magic.lock | 191 +++++++++++++++--------------- magic.lock | 142 +++++++++++----------- 5 files changed, 467 insertions(+), 464 deletions(-) diff --git a/examples/life/magic.lock b/examples/life/magic.lock index 49b4b05dfd..dd001a3484 100644 --- a/examples/life/magic.lock +++ b/examples/life/magic.lock @@ -170,12 +170,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011405-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda @@ -266,7 +266,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.21.0-py312h66e93f0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.0.4-py312h12e396e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-14.1-py312h66e93f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.1-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.5-he73a12e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda @@ -446,12 +446,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011405-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpg123-1.32.9-h65af167_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py312hdd3e373_1.conda @@ -542,7 +542,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvloop-0.21.0-py312hb2c0f52_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/watchfiles-1.0.4-py312h8cbf658_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/websockets-14.1-py312hb2c0f52_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.1-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.2-py312hb2c0f52_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.5-h0808dbd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.10-hca56bd8_1.conda @@ -657,7 +657,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-26_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.11.1-h73640d1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20240808-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda @@ -705,12 +705,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011405-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpg123-1.32.9-hf642e45_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda @@ -799,7 +799,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.21.0-py312h0bf5046_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.0.4-py312hcd83bfe_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-14.1-py312hea69d52_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.1-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.2-py312hea69d52_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.2-hb547adb_0.conda @@ -4067,17 +4067,17 @@ packages: license_family: MIT size: 385098 timestamp: 1734000160270 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda - sha256: 2b2443404503cd862385fd2f2a2c73f9624686fd1e5a45050b4034cfc06904ec - md5: ce5252d8db110cdb4ae4173d0a63c7c5 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 depends: - __osx >=11.0 arch: arm64 platform: osx license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 520992 - timestamp: 1734494699681 + size: 523505 + timestamp: 1736877862502 - conda: https://conda.anaconda.org/conda-forge/linux-64/libdb-6.2.32-h9c3ff4c_0.tar.bz2 sha256: 21fac1012ff05b131d4b5d284003dbbe7b5c4c652aa9e401b46279ed5a784372 md5: 3f3258d8f841fbac63b36b75bdac1afd @@ -6174,47 +6174,47 @@ packages: license_family: BSD size: 24048 timestamp: 1733219945697 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda noarch: python - sha256: eb52c601b49e24ffc270abd164d923de1cd7641ccc0c6d7457f51ae60d11e8db - md5: 11ccc7657b121e4c65ede378c793112f + sha256: fb653b1206a459970561cb99277971b809ef23dfbabb08067cf87ecc5316d144 + md5: 36d10ca6747cea3051f98f6c4340bdde depends: - - max-core ==25.1.0.dev2025011405 release - - max-python >=25.1.0.dev2025011405,<26.0a0 - - mojo-jupyter ==25.1.0.dev2025011405 release - - mblack ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release + - max-python >=25.1.0.dev2025011505,<26.0a0 + - mojo-jupyter ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 9916 - timestamp: 1736831822162 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011405-release.conda - sha256: 6b70fb0b3ff451c344e75541912480a23f7f66ec4e823fb67215c55210bc238f - md5: 73aeefc77fbbd11c37f794e61bedcbce + size: 9920 + timestamp: 1736918190337 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda + sha256: 5de02f267a7821eb30275253c0f03317e45befb2291b4c164d217e4a0be08489 + md5: e084403c468c3736de7b93e85ac55ca5 depends: - - mblack ==25.1.0.dev2025011405 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 244270660 - timestamp: 1736831822160 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011405-release.conda - sha256: b790059d25a546964ec54600d606cf507f046685f8b93768af09306e2789763d - md5: 8284a53ad8867fbebf5ff5872afcc683 + size: 244663428 + timestamp: 1736918190336 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda + sha256: b90cccb4ff28d8680f0221b696cfe260c3263afc92fcc90bae9e3e0205f6649a + md5: 6b38ab0cddf2d8d6ea3de50fa06daccf depends: - - mblack ==25.1.0.dev2025011405 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 247897740 - timestamp: 1736831760973 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011405-release.conda - sha256: e3f0a7f45a58997e93c62de0b02d657f5788074ed274c73ba42c8dbe4e4254ee - md5: 948b2059736f978eb8ef29e011c478aa + size: 247150310 + timestamp: 1736918170378 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda + sha256: 8e443193c3efccf88a1f335f56803cc8252a6087ceb570847fbc7d54373436dd + md5: 380f01b398f4026fa6d362bcd535bcce depends: - - mblack ==25.1.0.dev2025011405 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 206428789 - timestamp: 1736832175871 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011405-3.12release.conda - sha256: 2ba61ee7777506ce94849a69fb0a10281208327ad12298cb399d7c143740a23a - md5: 4d373580ea92e6372951421273e89dbe + size: 206696883 + timestamp: 1736918528488 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.12release.conda + sha256: 8ffaf65c9e533d1c05e63208e5929f7047232682d71e241a8d078bd40784c070 + md5: 979326be6e37f9d08a2af9d3b5f5b173 depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python 3.12.* - fastapi - httpx @@ -6235,13 +6235,13 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 124186493 - timestamp: 1736831822171 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011405-3.12release.conda - sha256: 9f35e2f3c0aa425ab3b15f1aa141e498b2fb22f671823d4758116954a5f47ac0 - md5: 95a8013bcaf7a89866ca36ba40b0477d + size: 124404054 + timestamp: 1736918190345 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.12release.conda + sha256: d29135e77b8d7da7fc1e7fe00b6cefb5faded5da911430a1ff9090377cde6a0f + md5: 7ab99f094af5a6e10444022febf6158f depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python 3.12.* - fastapi - httpx @@ -6262,13 +6262,13 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 127955783 - timestamp: 1736831760983 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011405-3.12release.conda - sha256: bae7c656efa518c6ba652cf66b20b07b11054e6b3c7f5c4997a319138152b10b - md5: 38fdc325152b22296dc03d3574837998 + size: 127116659 + timestamp: 1736918170389 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.12release.conda + sha256: f21679607c9939017d447c50d2732c8e842dcb29d18907390f5cd85254370ccf + md5: 112c450c08f0af99073a4dc4aae82576 depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python 3.12.* - fastapi - httpx @@ -6289,12 +6289,12 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 110548095 - timestamp: 1736832175874 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + size: 110626067 + timestamp: 1736918528491 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda noarch: python - sha256: f22466f25b437c46a5e05b93ae7213639abdf1ddf8c48e8d2fc0f0a091cfd5a2 - md5: f588562602f7e3a17c1983f53eee1056 + sha256: f1dab48a1791a810711d1c7e484ea1c5340297d09f9493cd99604978a3c43717 + md5: d4a97c4b5ee27717785df58abcef3fb3 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -6304,8 +6304,8 @@ packages: - platformdirs >=2 - python license: MIT - size: 130814 - timestamp: 1736831822166 + size: 130819 + timestamp: 1736918190341 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -6315,18 +6315,18 @@ packages: license_family: MIT size: 14465 timestamp: 1733255681319 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda noarch: python - sha256: a973705b113aa88f9769a5a5e21bb4bff6b86e77c4f66db1aac3be794c1ece88 - md5: 3a6fea9465e1a4ee3501f24fc1bbef98 + sha256: 87baffbf376e8562b6bde06c50c57d907ec9a6f6f338f342bddfad4fa83403e4 + md5: c14f190fae020526fc6559130272f1f8 depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22933 - timestamp: 1736831822167 + size: 22931 + timestamp: 1736918190342 - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda sha256: 39c4700fb3fbe403a77d8cc27352fa72ba744db487559d5d44bf8411bb4ea200 md5: c7f302fd11eeb0987a6a5e1f3aed6a21 @@ -6882,6 +6882,7 @@ packages: arch: aarch64 platform: linux license: BSD-3-Clause + license_family: BSD size: 15162992 timestamp: 1736811533875 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda @@ -8930,9 +8931,9 @@ packages: license_family: BSD size: 243131 timestamp: 1731498944076 -- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.1-py312h66e93f0_0.conda - sha256: 8d5114497ca237b4a41f381a474571cfbd874b357a57005e1ef891fbe961e927 - md5: 31e36a1c68a03c501542a6c454963ffe +- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda + sha256: ed3a1700ecc5d38c7e7dc7d2802df1bc1da6ba3d6f6017448b8ded0affb4ae00 + md5: 669e63af87710f8d52fdec9d4d63b404 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -8942,11 +8943,11 @@ packages: platform: linux license: BSD-2-Clause license_family: BSD - size: 63794 - timestamp: 1736757851335 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.1-py312hb2c0f52_0.conda - sha256: 105f16fa8db777bbda7ec195025007e0d591db3080536fbfbcd81eba230cd8e4 - md5: 6f091288846887f19f845688c3d7ca1e + size: 63590 + timestamp: 1736869574299 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.2-py312hb2c0f52_0.conda + sha256: cc28914462a21b2f64d9b763a9733bfcbc811dd2975d0d2e6e429e35f5b6d59c + md5: 8a5c6e3f809bae085be369b62dc5d06a depends: - libgcc >=13 - python >=3.12,<3.13.0a0 @@ -8956,11 +8957,11 @@ packages: platform: linux license: BSD-2-Clause license_family: BSD - size: 64616 - timestamp: 1736757911835 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.1-py312hea69d52_0.conda - sha256: 213a18609ccfdde862a8fcf9d96b9133cc6ca0abf5953ed148b35a9c8eb27a9c - md5: e3a62bb92c2e71e95f0e3be67a5ff351 + size: 63967 + timestamp: 1736869675870 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.2-py312hea69d52_0.conda + sha256: 6a3e68b57de29802e8703d1791dcacb7613bfdc17bbb087c6b2ea2796e6893ef + md5: e49608c832fcf438f70cbcae09c3adc5 depends: - __osx >=11.0 - python >=3.12,<3.13.0a0 @@ -8970,8 +8971,8 @@ packages: platform: osx license: BSD-2-Clause license_family: BSD - size: 61365 - timestamp: 1736758030632 + size: 61198 + timestamp: 1736869673767 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b md5: fb901ff28063514abb6046c9ec2c4a45 diff --git a/examples/magic.lock b/examples/magic.lock index c8d3938c86..f4e0cda51b 100644 --- a/examples/magic.lock +++ b/examples/magic.lock @@ -131,12 +131,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011405-3.11release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.11release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py311h2dc5d0c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py311h459d7ec_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -213,7 +213,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.21.0-py311h9ecbd09_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.0.4-py311h9e33e62_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-14.1-py311h9ecbd09_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.1-py311h9ecbd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py311h9ecbd09_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda @@ -349,12 +349,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py311ha09ea12_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011405-3.11release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.11release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py311h58d527c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py311hcd402e7_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -431,7 +431,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvloop-0.21.0-py311ha879c10_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/watchfiles-1.0.4-py311h0ca61a2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/websockets-14.1-py311ha879c10_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.1-py311ha879c10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.2-py311ha879c10_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.2-h31becfc_0.conda @@ -521,7 +521,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-26_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.11.1-h73640d1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20240808-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda @@ -558,12 +558,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h4921393_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011405-3.11release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.11release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py311h30e7462_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py311heffc1b2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -639,7 +639,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.21.0-py311hae2e1ce_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.0.4-py311h3ff9189_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-14.1-py311h917b07b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.1-py311h917b07b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.2-py311h917b07b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.2-hb547adb_0.conda @@ -3125,17 +3125,17 @@ packages: license_family: MIT size: 385098 timestamp: 1734000160270 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda - sha256: 2b2443404503cd862385fd2f2a2c73f9624686fd1e5a45050b4034cfc06904ec - md5: ce5252d8db110cdb4ae4173d0a63c7c5 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 depends: - __osx >=11.0 arch: arm64 platform: osx license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 520992 - timestamp: 1734494699681 + size: 523505 + timestamp: 1736877862502 - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda sha256: 511d801626d02f4247a04fff957cc6e9ec4cc7e8622bd9acd076bcdc5de5fe66 md5: 8dfae1d2e74767e9ce36d5fa0d8605db @@ -4752,47 +4752,47 @@ packages: license_family: BSD size: 24976 timestamp: 1733219849253 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda noarch: python - sha256: eb52c601b49e24ffc270abd164d923de1cd7641ccc0c6d7457f51ae60d11e8db - md5: 11ccc7657b121e4c65ede378c793112f + sha256: fb653b1206a459970561cb99277971b809ef23dfbabb08067cf87ecc5316d144 + md5: 36d10ca6747cea3051f98f6c4340bdde depends: - - max-core ==25.1.0.dev2025011405 release - - max-python >=25.1.0.dev2025011405,<26.0a0 - - mojo-jupyter ==25.1.0.dev2025011405 release - - mblack ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release + - max-python >=25.1.0.dev2025011505,<26.0a0 + - mojo-jupyter ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 9916 - timestamp: 1736831822162 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011405-release.conda - sha256: 6b70fb0b3ff451c344e75541912480a23f7f66ec4e823fb67215c55210bc238f - md5: 73aeefc77fbbd11c37f794e61bedcbce + size: 9920 + timestamp: 1736918190337 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda + sha256: 5de02f267a7821eb30275253c0f03317e45befb2291b4c164d217e4a0be08489 + md5: e084403c468c3736de7b93e85ac55ca5 depends: - - mblack ==25.1.0.dev2025011405 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 244270660 - timestamp: 1736831822160 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011405-release.conda - sha256: b790059d25a546964ec54600d606cf507f046685f8b93768af09306e2789763d - md5: 8284a53ad8867fbebf5ff5872afcc683 + size: 244663428 + timestamp: 1736918190336 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda + sha256: b90cccb4ff28d8680f0221b696cfe260c3263afc92fcc90bae9e3e0205f6649a + md5: 6b38ab0cddf2d8d6ea3de50fa06daccf depends: - - mblack ==25.1.0.dev2025011405 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 247897740 - timestamp: 1736831760973 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011405-release.conda - sha256: e3f0a7f45a58997e93c62de0b02d657f5788074ed274c73ba42c8dbe4e4254ee - md5: 948b2059736f978eb8ef29e011c478aa + size: 247150310 + timestamp: 1736918170378 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda + sha256: 8e443193c3efccf88a1f335f56803cc8252a6087ceb570847fbc7d54373436dd + md5: 380f01b398f4026fa6d362bcd535bcce depends: - - mblack ==25.1.0.dev2025011405 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 206428789 - timestamp: 1736832175871 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011405-3.11release.conda - sha256: b8bfb77cd0cfc82806c5c617da959641b4c91d5ab46935bfee55c99583c8de0f - md5: 705f4e4fc003b13c7a23e7478c1be9ca + size: 206696883 + timestamp: 1736918528488 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.11release.conda + sha256: c854f3fd876d1804109ff3cd42522ac689bebfe0725f2dc1fa6f770b511da929 + md5: 1b35513e522bd6148f1b11c52b959147 depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python 3.11.* - fastapi - httpx @@ -4813,13 +4813,13 @@ packages: - uvicorn - python_abi 3.11.* *_cp311 license: LicenseRef-Modular-Proprietary - size: 124202693 - timestamp: 1736831822168 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011405-3.11release.conda - sha256: 302c03fb71dfe486302339dc1e499cf4ca5da16a04611650a844393217bf7c44 - md5: b712cc1995d5acc5c827fdcfb0be301d + size: 124416691 + timestamp: 1736918190343 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.11release.conda + sha256: 69533b14861d61ccdc7d39c18c8df35d40e3b85f6cf7b8aefc588c9b856665de + md5: 4fbf6154c783c385488ff5d2e589207f depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python 3.11.* - fastapi - httpx @@ -4840,13 +4840,13 @@ packages: - uvicorn - python_abi 3.11.* *_cp311 license: LicenseRef-Modular-Proprietary - size: 128005742 - timestamp: 1736831760981 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011405-3.11release.conda - sha256: 3050a237e8ea52c62c2ece10dfc34fbe556c84e84b550c76bdf6bbe104c103ec - md5: 15e93133522e46eba973591025576482 + size: 127141652 + timestamp: 1736918170387 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.11release.conda + sha256: bcde9541c0308926d88b06a289e62ade7e9ce5fd09c7af125a74ce902562c154 + md5: fe268f18e7f099aaa136b235f44970d4 depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python 3.11.* - fastapi - httpx @@ -4867,12 +4867,12 @@ packages: - uvicorn - python_abi 3.11.* *_cp311 license: LicenseRef-Modular-Proprietary - size: 110606719 - timestamp: 1736832175873 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + size: 110638602 + timestamp: 1736918528490 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda noarch: python - sha256: f22466f25b437c46a5e05b93ae7213639abdf1ddf8c48e8d2fc0f0a091cfd5a2 - md5: f588562602f7e3a17c1983f53eee1056 + sha256: f1dab48a1791a810711d1c7e484ea1c5340297d09f9493cd99604978a3c43717 + md5: d4a97c4b5ee27717785df58abcef3fb3 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -4882,8 +4882,8 @@ packages: - platformdirs >=2 - python license: MIT - size: 130814 - timestamp: 1736831822166 + size: 130819 + timestamp: 1736918190341 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -4893,18 +4893,18 @@ packages: license_family: MIT size: 14465 timestamp: 1733255681319 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda noarch: python - sha256: a973705b113aa88f9769a5a5e21bb4bff6b86e77c4f66db1aac3be794c1ece88 - md5: 3a6fea9465e1a4ee3501f24fc1bbef98 + sha256: 87baffbf376e8562b6bde06c50c57d907ec9a6f6f338f342bddfad4fa83403e4 + md5: c14f190fae020526fc6559130272f1f8 depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22933 - timestamp: 1736831822167 + size: 22931 + timestamp: 1736918190342 - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py311h2dc5d0c_2.conda sha256: afaab7a028281d8b5336db2b994fd3f9694862b6ca372c079dc4e84ad768c20a md5: bb8ca118919836624d920b4c44383a15 @@ -5382,6 +5382,7 @@ packages: arch: aarch64 platform: linux license: BSD-3-Clause + license_family: BSD size: 15432560 timestamp: 1736811218050 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py311h9cb3ce9_1.conda @@ -6908,9 +6909,9 @@ packages: license_family: BSD size: 240817 timestamp: 1731498829166 -- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.1-py311h9ecbd09_0.conda - sha256: 42e23f6efabc2f6c50885b6f5e6e0a87472df9ebb86e86999a7c7c85331e2704 - md5: c03c07d4b22381d61e57cb08735b9b1c +- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py311h9ecbd09_0.conda + sha256: e383de6512e65b5a227e7b0e1a34ffc441484044096a23ca4d3b6eb53a64d261 + md5: c4bb961f5a2020837fe3f7f30fadc2e1 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -6920,11 +6921,11 @@ packages: platform: linux license: BSD-2-Clause license_family: BSD - size: 65109 - timestamp: 1736757891787 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.1-py311ha879c10_0.conda - sha256: a4ac2f68f462519be3fd03adcc7b30361135688fd70f742c35faf702fc0955fb - md5: f4a445d2759099c9cf1b955f99ca2039 + size: 64880 + timestamp: 1736869605707 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.2-py311ha879c10_0.conda + sha256: ef2c09b8c62a195120dcf6d2dc32c349fe957167dca98765babb9a3be6f87d92 + md5: 4d4f5aa0b7ed545efca6597c6ae5259d depends: - libgcc >=13 - python >=3.11,<3.12.0a0 @@ -6934,11 +6935,11 @@ packages: platform: linux license: BSD-2-Clause license_family: BSD - size: 65715 - timestamp: 1736757912446 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.1-py311h917b07b_0.conda - sha256: 1dc5ceaa3838ecfa242626dda0300b28d7a827d80d6b6e624bcb2791f3f004d9 - md5: e3bcd6e81efe9134070cd635569cb48f + size: 65830 + timestamp: 1736869702140 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.2-py311h917b07b_0.conda + sha256: 121396c6f75ffcbf4d2296ad0ad9190a62aff0ae22ed4080a39827a6275cdf1b + md5: 40fa235e40013f4e5400f1d01add07dc depends: - __osx >=11.0 - python >=3.11,<3.12.0a0 @@ -6948,8 +6949,8 @@ packages: platform: osx license: BSD-2-Clause license_family: BSD - size: 62043 - timestamp: 1736757968574 + size: 62401 + timestamp: 1736869710495 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 diff --git a/examples/notebooks/magic.lock b/examples/notebooks/magic.lock index 5af81c01f9..bbacdb7fc4 100644 --- a/examples/notebooks/magic.lock +++ b/examples/notebooks/magic.lock @@ -167,13 +167,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011405-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -286,7 +286,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-14.1-py312h66e93f0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.1-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda @@ -458,13 +458,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011405-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py312hdd3e373_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -577,7 +577,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/websockets-14.1-py312hb2c0f52_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.1-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.2-py312hb2c0f52_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.2-h31becfc_0.conda @@ -703,7 +703,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-26_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.11.1-h73640d1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20240808-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda @@ -741,13 +741,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011405-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -796,8 +796,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.7.1-pyh3cfb1c2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyinstrument-5.0.0-py312h0bf5046_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-10.3.2-py312hb9d441b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-10.3.2-py312hb9d441b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.0-py312hb9d441b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.0-py312hb9d441b_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.12.8-hc22306f_1_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda @@ -861,7 +861,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.8.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-14.1-py312hea69d52_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.1-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.2-py312hea69d52_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.2-hb547adb_0.conda @@ -3912,17 +3912,17 @@ packages: license_family: MIT size: 385098 timestamp: 1734000160270 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda - sha256: 2b2443404503cd862385fd2f2a2c73f9624686fd1e5a45050b4034cfc06904ec - md5: ce5252d8db110cdb4ae4173d0a63c7c5 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 depends: - __osx >=11.0 arch: arm64 platform: osx license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 520992 - timestamp: 1734494699681 + size: 523505 + timestamp: 1736877862502 - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda sha256: 511d801626d02f4247a04fff957cc6e9ec4cc7e8622bd9acd076bcdc5de5fe66 md5: 8dfae1d2e74767e9ce36d5fa0d8605db @@ -5549,47 +5549,47 @@ packages: license_family: BSD size: 14467 timestamp: 1733417051523 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda noarch: python - sha256: eb52c601b49e24ffc270abd164d923de1cd7641ccc0c6d7457f51ae60d11e8db - md5: 11ccc7657b121e4c65ede378c793112f + sha256: fb653b1206a459970561cb99277971b809ef23dfbabb08067cf87ecc5316d144 + md5: 36d10ca6747cea3051f98f6c4340bdde depends: - - max-core ==25.1.0.dev2025011405 release - - max-python >=25.1.0.dev2025011405,<26.0a0 - - mojo-jupyter ==25.1.0.dev2025011405 release - - mblack ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release + - max-python >=25.1.0.dev2025011505,<26.0a0 + - mojo-jupyter ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 9916 - timestamp: 1736831822162 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011405-release.conda - sha256: 6b70fb0b3ff451c344e75541912480a23f7f66ec4e823fb67215c55210bc238f - md5: 73aeefc77fbbd11c37f794e61bedcbce + size: 9920 + timestamp: 1736918190337 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda + sha256: 5de02f267a7821eb30275253c0f03317e45befb2291b4c164d217e4a0be08489 + md5: e084403c468c3736de7b93e85ac55ca5 depends: - - mblack ==25.1.0.dev2025011405 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 244270660 - timestamp: 1736831822160 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011405-release.conda - sha256: b790059d25a546964ec54600d606cf507f046685f8b93768af09306e2789763d - md5: 8284a53ad8867fbebf5ff5872afcc683 + size: 244663428 + timestamp: 1736918190336 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda + sha256: b90cccb4ff28d8680f0221b696cfe260c3263afc92fcc90bae9e3e0205f6649a + md5: 6b38ab0cddf2d8d6ea3de50fa06daccf depends: - - mblack ==25.1.0.dev2025011405 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 247897740 - timestamp: 1736831760973 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011405-release.conda - sha256: e3f0a7f45a58997e93c62de0b02d657f5788074ed274c73ba42c8dbe4e4254ee - md5: 948b2059736f978eb8ef29e011c478aa + size: 247150310 + timestamp: 1736918170378 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda + sha256: 8e443193c3efccf88a1f335f56803cc8252a6087ceb570847fbc7d54373436dd + md5: 380f01b398f4026fa6d362bcd535bcce depends: - - mblack ==25.1.0.dev2025011405 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 206428789 - timestamp: 1736832175871 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011405-3.12release.conda - sha256: 2ba61ee7777506ce94849a69fb0a10281208327ad12298cb399d7c143740a23a - md5: 4d373580ea92e6372951421273e89dbe + size: 206696883 + timestamp: 1736918528488 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.12release.conda + sha256: 8ffaf65c9e533d1c05e63208e5929f7047232682d71e241a8d078bd40784c070 + md5: 979326be6e37f9d08a2af9d3b5f5b173 depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python 3.12.* - fastapi - httpx @@ -5610,13 +5610,13 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 124186493 - timestamp: 1736831822171 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011405-3.12release.conda - sha256: 9f35e2f3c0aa425ab3b15f1aa141e498b2fb22f671823d4758116954a5f47ac0 - md5: 95a8013bcaf7a89866ca36ba40b0477d + size: 124404054 + timestamp: 1736918190345 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.12release.conda + sha256: d29135e77b8d7da7fc1e7fe00b6cefb5faded5da911430a1ff9090377cde6a0f + md5: 7ab99f094af5a6e10444022febf6158f depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python 3.12.* - fastapi - httpx @@ -5637,13 +5637,13 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 127955783 - timestamp: 1736831760983 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011405-3.12release.conda - sha256: bae7c656efa518c6ba652cf66b20b07b11054e6b3c7f5c4997a319138152b10b - md5: 38fdc325152b22296dc03d3574837998 + size: 127116659 + timestamp: 1736918170389 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.12release.conda + sha256: f21679607c9939017d447c50d2732c8e842dcb29d18907390f5cd85254370ccf + md5: 112c450c08f0af99073a4dc4aae82576 depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python 3.12.* - fastapi - httpx @@ -5664,12 +5664,12 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 110548095 - timestamp: 1736832175874 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + size: 110626067 + timestamp: 1736918528491 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda noarch: python - sha256: f22466f25b437c46a5e05b93ae7213639abdf1ddf8c48e8d2fc0f0a091cfd5a2 - md5: f588562602f7e3a17c1983f53eee1056 + sha256: f1dab48a1791a810711d1c7e484ea1c5340297d09f9493cd99604978a3c43717 + md5: d4a97c4b5ee27717785df58abcef3fb3 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -5679,8 +5679,8 @@ packages: - platformdirs >=2 - python license: MIT - size: 130814 - timestamp: 1736831822166 + size: 130819 + timestamp: 1736918190341 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -5700,18 +5700,18 @@ packages: license_family: BSD size: 68803 timestamp: 1735686983426 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda noarch: python - sha256: a973705b113aa88f9769a5a5e21bb4bff6b86e77c4f66db1aac3be794c1ece88 - md5: 3a6fea9465e1a4ee3501f24fc1bbef98 + sha256: 87baffbf376e8562b6bde06c50c57d907ec9a6f6f338f342bddfad4fa83403e4 + md5: c14f190fae020526fc6559130272f1f8 depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22933 - timestamp: 1736831822167 + size: 22931 + timestamp: 1736918190342 - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda sha256: b05bc8252a6e957bf4a776ed5e0e61d1ba88cdc46ccb55890c72cc58b10371f4 md5: 5b5e3267d915a107eca793d52e1b780a @@ -6857,9 +6857,9 @@ packages: license_family: BSD size: 181512 timestamp: 1728714205508 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-10.3.2-py312hb9d441b_0.conda - sha256: 6c110c64e7cc0a28416414446698ab310a9261525a6aa630b2c4f50891867719 - md5: 663e894deb5a24c8931fd8224f19a1fd +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-11.0-py312hb9d441b_0.conda + sha256: 7805d910dd6ac686e2f780c879a986f35d7a4c73f4236c956c03bdcb26bec421 + md5: 0726db04477a28c51d1a260afb356b67 depends: - __osx >=11.0 - libffi >=3.4,<4.0a0 @@ -6871,15 +6871,15 @@ packages: platform: osx license: MIT license_family: MIT - size: 484571 - timestamp: 1732987487536 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-10.3.2-py312hb9d441b_0.conda - sha256: 5a78f97cb7414cb4b78b777dcfcffb08da42ced866e8ef6455a57c2230908bfe - md5: 41e4f28d545565e48f1f819cf8dac5c7 + size: 478921 + timestamp: 1736891272846 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-11.0-py312hb9d441b_0.conda + sha256: 53d099865f8f758029708f4365ee7c9184d9ffcc8fc8210971b723a3936f9c00 + md5: dc263e6e18b32318a43252dbb0596ad4 depends: - __osx >=11.0 - libffi >=3.4,<4.0a0 - - pyobjc-core 10.3.2.* + - pyobjc-core 11.0.* - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 @@ -6887,8 +6887,8 @@ packages: platform: osx license: MIT license_family: MIT - size: 380414 - timestamp: 1733168930888 + size: 383608 + timestamp: 1736927118445 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 md5: 461219d1a5bd61342293efa2c0c90eac @@ -8178,9 +8178,9 @@ packages: license_family: MIT size: 62931 timestamp: 1733130309598 -- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.1-py312h66e93f0_0.conda - sha256: 8d5114497ca237b4a41f381a474571cfbd874b357a57005e1ef891fbe961e927 - md5: 31e36a1c68a03c501542a6c454963ffe +- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda + sha256: ed3a1700ecc5d38c7e7dc7d2802df1bc1da6ba3d6f6017448b8ded0affb4ae00 + md5: 669e63af87710f8d52fdec9d4d63b404 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -8190,11 +8190,11 @@ packages: platform: linux license: BSD-2-Clause license_family: BSD - size: 63794 - timestamp: 1736757851335 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.1-py312hb2c0f52_0.conda - sha256: 105f16fa8db777bbda7ec195025007e0d591db3080536fbfbcd81eba230cd8e4 - md5: 6f091288846887f19f845688c3d7ca1e + size: 63590 + timestamp: 1736869574299 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.2-py312hb2c0f52_0.conda + sha256: cc28914462a21b2f64d9b763a9733bfcbc811dd2975d0d2e6e429e35f5b6d59c + md5: 8a5c6e3f809bae085be369b62dc5d06a depends: - libgcc >=13 - python >=3.12,<3.13.0a0 @@ -8204,11 +8204,11 @@ packages: platform: linux license: BSD-2-Clause license_family: BSD - size: 64616 - timestamp: 1736757911835 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.1-py312hea69d52_0.conda - sha256: 213a18609ccfdde862a8fcf9d96b9133cc6ca0abf5953ed148b35a9c8eb27a9c - md5: e3a62bb92c2e71e95f0e3be67a5ff351 + size: 63967 + timestamp: 1736869675870 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.2-py312hea69d52_0.conda + sha256: 6a3e68b57de29802e8703d1791dcacb7613bfdc17bbb087c6b2ea2796e6893ef + md5: e49608c832fcf438f70cbcae09c3adc5 depends: - __osx >=11.0 - python >=3.12,<3.13.0a0 @@ -8218,8 +8218,8 @@ packages: platform: osx license: BSD-2-Clause license_family: BSD - size: 61365 - timestamp: 1736758030632 + size: 61198 + timestamp: 1736869673767 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 diff --git a/examples/operators/magic.lock b/examples/operators/magic.lock index 0072b9f004..befd8a737f 100644 --- a/examples/operators/magic.lock +++ b/examples/operators/magic.lock @@ -131,12 +131,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011405-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -213,7 +213,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.21.0-py312h66e93f0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.0.4-py312h12e396e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-14.1-py312h66e93f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.1-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda @@ -349,12 +349,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011405-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py312hdd3e373_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -431,7 +431,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvloop-0.21.0-py312hb2c0f52_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/watchfiles-1.0.4-py312h8cbf658_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/websockets-14.1-py312hb2c0f52_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.1-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.2-py312hb2c0f52_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.2-h31becfc_0.conda @@ -521,7 +521,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-26_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.11.1-h73640d1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20240808-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda @@ -558,12 +558,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011405-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -639,7 +639,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.21.0-py312h0bf5046_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.0.4-py312hcd83bfe_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-14.1-py312hea69d52_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.1-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.2-py312hea69d52_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.2-hb547adb_0.conda @@ -3125,17 +3125,17 @@ packages: license_family: MIT size: 385098 timestamp: 1734000160270 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda - sha256: 2b2443404503cd862385fd2f2a2c73f9624686fd1e5a45050b4034cfc06904ec - md5: ce5252d8db110cdb4ae4173d0a63c7c5 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 depends: - __osx >=11.0 arch: arm64 platform: osx license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 520992 - timestamp: 1734494699681 + size: 523505 + timestamp: 1736877862502 - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda sha256: 511d801626d02f4247a04fff957cc6e9ec4cc7e8622bd9acd076bcdc5de5fe66 md5: 8dfae1d2e74767e9ce36d5fa0d8605db @@ -4752,47 +4752,47 @@ packages: license_family: BSD size: 24048 timestamp: 1733219945697 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda noarch: python - sha256: eb52c601b49e24ffc270abd164d923de1cd7641ccc0c6d7457f51ae60d11e8db - md5: 11ccc7657b121e4c65ede378c793112f + sha256: fb653b1206a459970561cb99277971b809ef23dfbabb08067cf87ecc5316d144 + md5: 36d10ca6747cea3051f98f6c4340bdde depends: - - max-core ==25.1.0.dev2025011405 release - - max-python >=25.1.0.dev2025011405,<26.0a0 - - mojo-jupyter ==25.1.0.dev2025011405 release - - mblack ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release + - max-python >=25.1.0.dev2025011505,<26.0a0 + - mojo-jupyter ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 9916 - timestamp: 1736831822162 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011405-release.conda - sha256: 6b70fb0b3ff451c344e75541912480a23f7f66ec4e823fb67215c55210bc238f - md5: 73aeefc77fbbd11c37f794e61bedcbce + size: 9920 + timestamp: 1736918190337 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda + sha256: 5de02f267a7821eb30275253c0f03317e45befb2291b4c164d217e4a0be08489 + md5: e084403c468c3736de7b93e85ac55ca5 depends: - - mblack ==25.1.0.dev2025011405 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 244270660 - timestamp: 1736831822160 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011405-release.conda - sha256: b790059d25a546964ec54600d606cf507f046685f8b93768af09306e2789763d - md5: 8284a53ad8867fbebf5ff5872afcc683 + size: 244663428 + timestamp: 1736918190336 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda + sha256: b90cccb4ff28d8680f0221b696cfe260c3263afc92fcc90bae9e3e0205f6649a + md5: 6b38ab0cddf2d8d6ea3de50fa06daccf depends: - - mblack ==25.1.0.dev2025011405 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 247897740 - timestamp: 1736831760973 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011405-release.conda - sha256: e3f0a7f45a58997e93c62de0b02d657f5788074ed274c73ba42c8dbe4e4254ee - md5: 948b2059736f978eb8ef29e011c478aa + size: 247150310 + timestamp: 1736918170378 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda + sha256: 8e443193c3efccf88a1f335f56803cc8252a6087ceb570847fbc7d54373436dd + md5: 380f01b398f4026fa6d362bcd535bcce depends: - - mblack ==25.1.0.dev2025011405 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 206428789 - timestamp: 1736832175871 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011405-3.12release.conda - sha256: 2ba61ee7777506ce94849a69fb0a10281208327ad12298cb399d7c143740a23a - md5: 4d373580ea92e6372951421273e89dbe + size: 206696883 + timestamp: 1736918528488 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.12release.conda + sha256: 8ffaf65c9e533d1c05e63208e5929f7047232682d71e241a8d078bd40784c070 + md5: 979326be6e37f9d08a2af9d3b5f5b173 depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python 3.12.* - fastapi - httpx @@ -4813,13 +4813,13 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 124186493 - timestamp: 1736831822171 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011405-3.12release.conda - sha256: 9f35e2f3c0aa425ab3b15f1aa141e498b2fb22f671823d4758116954a5f47ac0 - md5: 95a8013bcaf7a89866ca36ba40b0477d + size: 124404054 + timestamp: 1736918190345 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.12release.conda + sha256: d29135e77b8d7da7fc1e7fe00b6cefb5faded5da911430a1ff9090377cde6a0f + md5: 7ab99f094af5a6e10444022febf6158f depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python 3.12.* - fastapi - httpx @@ -4840,13 +4840,13 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 127955783 - timestamp: 1736831760983 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011405-3.12release.conda - sha256: bae7c656efa518c6ba652cf66b20b07b11054e6b3c7f5c4997a319138152b10b - md5: 38fdc325152b22296dc03d3574837998 + size: 127116659 + timestamp: 1736918170389 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.12release.conda + sha256: f21679607c9939017d447c50d2732c8e842dcb29d18907390f5cd85254370ccf + md5: 112c450c08f0af99073a4dc4aae82576 depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python 3.12.* - fastapi - httpx @@ -4867,12 +4867,12 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 110548095 - timestamp: 1736832175874 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + size: 110626067 + timestamp: 1736918528491 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda noarch: python - sha256: f22466f25b437c46a5e05b93ae7213639abdf1ddf8c48e8d2fc0f0a091cfd5a2 - md5: f588562602f7e3a17c1983f53eee1056 + sha256: f1dab48a1791a810711d1c7e484ea1c5340297d09f9493cd99604978a3c43717 + md5: d4a97c4b5ee27717785df58abcef3fb3 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -4882,8 +4882,8 @@ packages: - platformdirs >=2 - python license: MIT - size: 130814 - timestamp: 1736831822166 + size: 130819 + timestamp: 1736918190341 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -4893,18 +4893,18 @@ packages: license_family: MIT size: 14465 timestamp: 1733255681319 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda noarch: python - sha256: a973705b113aa88f9769a5a5e21bb4bff6b86e77c4f66db1aac3be794c1ece88 - md5: 3a6fea9465e1a4ee3501f24fc1bbef98 + sha256: 87baffbf376e8562b6bde06c50c57d907ec9a6f6f338f342bddfad4fa83403e4 + md5: c14f190fae020526fc6559130272f1f8 depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22933 - timestamp: 1736831822167 + size: 22931 + timestamp: 1736918190342 - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda sha256: b05bc8252a6e957bf4a776ed5e0e61d1ba88cdc46ccb55890c72cc58b10371f4 md5: 5b5e3267d915a107eca793d52e1b780a @@ -5382,6 +5382,7 @@ packages: arch: aarch64 platform: linux license: BSD-3-Clause + license_family: BSD size: 15162992 timestamp: 1736811533875 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda @@ -6908,9 +6909,9 @@ packages: license_family: BSD size: 243131 timestamp: 1731498944076 -- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.1-py312h66e93f0_0.conda - sha256: 8d5114497ca237b4a41f381a474571cfbd874b357a57005e1ef891fbe961e927 - md5: 31e36a1c68a03c501542a6c454963ffe +- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda + sha256: ed3a1700ecc5d38c7e7dc7d2802df1bc1da6ba3d6f6017448b8ded0affb4ae00 + md5: 669e63af87710f8d52fdec9d4d63b404 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -6920,11 +6921,11 @@ packages: platform: linux license: BSD-2-Clause license_family: BSD - size: 63794 - timestamp: 1736757851335 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.1-py312hb2c0f52_0.conda - sha256: 105f16fa8db777bbda7ec195025007e0d591db3080536fbfbcd81eba230cd8e4 - md5: 6f091288846887f19f845688c3d7ca1e + size: 63590 + timestamp: 1736869574299 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.2-py312hb2c0f52_0.conda + sha256: cc28914462a21b2f64d9b763a9733bfcbc811dd2975d0d2e6e429e35f5b6d59c + md5: 8a5c6e3f809bae085be369b62dc5d06a depends: - libgcc >=13 - python >=3.12,<3.13.0a0 @@ -6934,11 +6935,11 @@ packages: platform: linux license: BSD-2-Clause license_family: BSD - size: 64616 - timestamp: 1736757911835 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.1-py312hea69d52_0.conda - sha256: 213a18609ccfdde862a8fcf9d96b9133cc6ca0abf5953ed148b35a9c8eb27a9c - md5: e3a62bb92c2e71e95f0e3be67a5ff351 + size: 63967 + timestamp: 1736869675870 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.2-py312hea69d52_0.conda + sha256: 6a3e68b57de29802e8703d1791dcacb7613bfdc17bbb087c6b2ea2796e6893ef + md5: e49608c832fcf438f70cbcae09c3adc5 depends: - __osx >=11.0 - python >=3.12,<3.13.0a0 @@ -6948,8 +6949,8 @@ packages: platform: osx license: BSD-2-Clause license_family: BSD - size: 61365 - timestamp: 1736758030632 + size: 61198 + timestamp: 1736869673767 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 diff --git a/magic.lock b/magic.lock index 55c9713722..ea064f325e 100644 --- a/magic.lock +++ b/magic.lock @@ -132,12 +132,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011405-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -351,12 +351,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011405-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py312hdd3e373_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -561,12 +561,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011405-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011405-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -4764,47 +4764,47 @@ packages: license_family: BSD size: 24048 timestamp: 1733219945697 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011405-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda noarch: python - sha256: eb52c601b49e24ffc270abd164d923de1cd7641ccc0c6d7457f51ae60d11e8db - md5: 11ccc7657b121e4c65ede378c793112f + sha256: fb653b1206a459970561cb99277971b809ef23dfbabb08067cf87ecc5316d144 + md5: 36d10ca6747cea3051f98f6c4340bdde depends: - - max-core ==25.1.0.dev2025011405 release - - max-python >=25.1.0.dev2025011405,<26.0a0 - - mojo-jupyter ==25.1.0.dev2025011405 release - - mblack ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release + - max-python >=25.1.0.dev2025011505,<26.0a0 + - mojo-jupyter ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 9916 - timestamp: 1736831822162 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011405-release.conda - sha256: 6b70fb0b3ff451c344e75541912480a23f7f66ec4e823fb67215c55210bc238f - md5: 73aeefc77fbbd11c37f794e61bedcbce + size: 9920 + timestamp: 1736918190337 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda + sha256: 5de02f267a7821eb30275253c0f03317e45befb2291b4c164d217e4a0be08489 + md5: e084403c468c3736de7b93e85ac55ca5 depends: - - mblack ==25.1.0.dev2025011405 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 244270660 - timestamp: 1736831822160 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011405-release.conda - sha256: b790059d25a546964ec54600d606cf507f046685f8b93768af09306e2789763d - md5: 8284a53ad8867fbebf5ff5872afcc683 + size: 244663428 + timestamp: 1736918190336 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda + sha256: b90cccb4ff28d8680f0221b696cfe260c3263afc92fcc90bae9e3e0205f6649a + md5: 6b38ab0cddf2d8d6ea3de50fa06daccf depends: - - mblack ==25.1.0.dev2025011405 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 247897740 - timestamp: 1736831760973 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011405-release.conda - sha256: e3f0a7f45a58997e93c62de0b02d657f5788074ed274c73ba42c8dbe4e4254ee - md5: 948b2059736f978eb8ef29e011c478aa + size: 247150310 + timestamp: 1736918170378 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda + sha256: 8e443193c3efccf88a1f335f56803cc8252a6087ceb570847fbc7d54373436dd + md5: 380f01b398f4026fa6d362bcd535bcce depends: - - mblack ==25.1.0.dev2025011405 release + - mblack ==25.1.0.dev2025011505 release license: LicenseRef-Modular-Proprietary - size: 206428789 - timestamp: 1736832175871 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011405-3.12release.conda - sha256: 2ba61ee7777506ce94849a69fb0a10281208327ad12298cb399d7c143740a23a - md5: 4d373580ea92e6372951421273e89dbe + size: 206696883 + timestamp: 1736918528488 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.12release.conda + sha256: 8ffaf65c9e533d1c05e63208e5929f7047232682d71e241a8d078bd40784c070 + md5: 979326be6e37f9d08a2af9d3b5f5b173 depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python 3.12.* - fastapi - httpx @@ -4825,13 +4825,13 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 124186493 - timestamp: 1736831822171 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011405-3.12release.conda - sha256: 9f35e2f3c0aa425ab3b15f1aa141e498b2fb22f671823d4758116954a5f47ac0 - md5: 95a8013bcaf7a89866ca36ba40b0477d + size: 124404054 + timestamp: 1736918190345 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.12release.conda + sha256: d29135e77b8d7da7fc1e7fe00b6cefb5faded5da911430a1ff9090377cde6a0f + md5: 7ab99f094af5a6e10444022febf6158f depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python 3.12.* - fastapi - httpx @@ -4852,13 +4852,13 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 127955783 - timestamp: 1736831760983 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011405-3.12release.conda - sha256: bae7c656efa518c6ba652cf66b20b07b11054e6b3c7f5c4997a319138152b10b - md5: 38fdc325152b22296dc03d3574837998 + size: 127116659 + timestamp: 1736918170389 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.12release.conda + sha256: f21679607c9939017d447c50d2732c8e842dcb29d18907390f5cd85254370ccf + md5: 112c450c08f0af99073a4dc4aae82576 depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python 3.12.* - fastapi - httpx @@ -4879,12 +4879,12 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 110548095 - timestamp: 1736832175874 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011405-release.conda + size: 110626067 + timestamp: 1736918528491 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda noarch: python - sha256: f22466f25b437c46a5e05b93ae7213639abdf1ddf8c48e8d2fc0f0a091cfd5a2 - md5: f588562602f7e3a17c1983f53eee1056 + sha256: f1dab48a1791a810711d1c7e484ea1c5340297d09f9493cd99604978a3c43717 + md5: d4a97c4b5ee27717785df58abcef3fb3 depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -4894,8 +4894,8 @@ packages: - platformdirs >=2 - python license: MIT - size: 130814 - timestamp: 1736831822166 + size: 130819 + timestamp: 1736918190341 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -4905,18 +4905,18 @@ packages: license_family: MIT size: 14465 timestamp: 1733255681319 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011405-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda noarch: python - sha256: a973705b113aa88f9769a5a5e21bb4bff6b86e77c4f66db1aac3be794c1ece88 - md5: 3a6fea9465e1a4ee3501f24fc1bbef98 + sha256: 87baffbf376e8562b6bde06c50c57d907ec9a6f6f338f342bddfad4fa83403e4 + md5: c14f190fae020526fc6559130272f1f8 depends: - - max-core ==25.1.0.dev2025011405 release + - max-core ==25.1.0.dev2025011505 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22933 - timestamp: 1736831822167 + size: 22931 + timestamp: 1736918190342 - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda sha256: b05bc8252a6e957bf4a776ed5e0e61d1ba88cdc46ccb55890c72cc58b10371f4 md5: 5b5e3267d915a107eca793d52e1b780a From 5b43d195c278702a71548292412147f12865c8f0 Mon Sep 17 00:00:00 2001 From: bgreni <42788181+bgreni@users.noreply.github.com> Date: Wed, 15 Jan 2025 07:30:32 -0800 Subject: [PATCH 23/39] [External] [stdlib] Use named output for _ListIter __next__() method (#53928) [External] [stdlib] Use named output for _ListIter __next__() method Add a trivial optimization to use a named output for the `__next__()` method in `_ListIter` to save a subtraction operation on every iteration Co-authored-by: bgreni <42788181+bgreni@users.noreply.github.com> Closes modularml/mojo#3941 MODULAR_ORIG_COMMIT_REV_ID: 426ada8f07f91a0d14ffe0c6e77ae074405e52c2 Signed-off-by: Joshua James Venter --- stdlib/src/collections/list.mojo | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/stdlib/src/collections/list.mojo b/stdlib/src/collections/list.mojo index 3c488d3388..cc688f34af 100644 --- a/stdlib/src/collections/list.mojo +++ b/stdlib/src/collections/list.mojo @@ -60,16 +60,14 @@ struct _ListIter[ fn __iter__(self) -> Self: return self - fn __next__( - mut self, - ) -> Pointer[T, list_origin]: + fn __next__(mut self, out p: Pointer[T, list_origin]): @parameter if forward: + p = Pointer.address_of(self.src[][self.index]) self.index += 1 - return Pointer.address_of(self.src[][self.index - 1]) else: self.index -= 1 - return Pointer.address_of(self.src[][self.index]) + p = Pointer.address_of(self.src[][self.index]) @always_inline fn __has_next__(self) -> Bool: From f476e9e65ca15f6bdbd5bc5b1694625e2fcf2527 Mon Sep 17 00:00:00 2001 From: Joe Loser Date: Wed, 15 Jan 2025 10:31:27 -0500 Subject: [PATCH 24/39] [stdlib] Remove `bencher` docs Now that we have nightly docs, people can see the documentation for otherwise closed-source things in the standard library, such as the `benchmark` module. So, remove the temporary markdown docs we provided as an interim thing for users and contributors of the standard library. They can be read in a more up-to-date form at https://docs.modular.com/nightly/mojo/stdlib/benchmark. MODULAR_ORIG_COMMIT_REV_ID: f5dfec06fc337ca87349888e14079971d09e75b9 Signed-off-by: Joshua James Venter --- stdlib/docs/bencher/Bench.md | 174 --------------------------- stdlib/docs/bencher/BenchConfig.md | 78 ------------ stdlib/docs/bencher/BenchId.md | 62 ---------- stdlib/docs/bencher/Bencher.md | 117 ------------------ stdlib/docs/bencher/BenchmarkInfo.md | 51 -------- stdlib/docs/bencher/Mode.md | 52 -------- stdlib/docs/bencher/index.md | 39 ------ 7 files changed, 573 deletions(-) delete mode 100644 stdlib/docs/bencher/Bench.md delete mode 100644 stdlib/docs/bencher/BenchConfig.md delete mode 100644 stdlib/docs/bencher/BenchId.md delete mode 100644 stdlib/docs/bencher/Bencher.md delete mode 100644 stdlib/docs/bencher/BenchmarkInfo.md delete mode 100644 stdlib/docs/bencher/Mode.md delete mode 100644 stdlib/docs/bencher/index.md diff --git a/stdlib/docs/bencher/Bench.md b/stdlib/docs/bencher/Bench.md deleted file mode 100644 index 19133b572f..0000000000 --- a/stdlib/docs/bencher/Bench.md +++ /dev/null @@ -1,174 +0,0 @@ ---- -title: Bench -version: 0.0.0 -slug: Bench -type: struct -namespace: benchmark.bencher ---- - -
- -Defines the main Benchmark struct which executes a Benchmark and print result. - -## Fields - -- ​config (`BenchConfig`): Constructs a Benchmark object based on specific - configuration and mode. -- ​mode (`Mode`): Benchmark mode object representing benchmark or test - mode. -- ​info_vec (`List[BenchmarkInfo]`): A list containing the bencmark info. - -## Implemented traits - -`AnyType`, -`Copyable`, -`Movable` - -## Methods - -### `__init__` - -
- -
- -```mojo -__init__(out self: Self, config: Optional[BenchConfig] = #kgen.none, mode: Mode = 0) -``` - -
- -Constructs a Benchmark object based on specific configuration and mode. - -**Args:** - -- ​config (`Optional[BenchConfig]`): Benchmark configuration object to - control length and frequency of benchmarks. -- ​mode (`Mode`): Benchmark mode object representing benchmark or test - mode. - -
- -### `bench_with_input` - -
- -
- -```mojo -bench_with_input[T: AnyType, bench_fn: fn(mut Bencher, $0) capturing -> None](mut self: Self, bench_id: BenchId, input: T, throughput_elems: Optional[Int] = #kgen.none) -``` - -
- -Benchmarks an input function with input args of type AnyType. - -**Parameters:** - -- ​T (`AnyType`): Benchmark function input type. -- ​bench_fn (`fn(mut Bencher, $0) capturing -> None`): The function to - be benchmarked. - -**Args:** - -- ​bench_id (`BenchId`): The benchmark Id object used for identification. -- ​input (`T`): Represents the target function's input arguments. -- ​throughput_elems (`Optional[Int]`): Optional argument representing - algorithmic throughput. - -
- -
- -
- -```mojo -bench_with_input[T: AnyTrivialRegType, bench_fn: fn(mut Bencher, $0) capturing -> None](mut self: Self, bench_id: BenchId, input: T, throughput_elems: Optional[Int] = #kgen.none) -``` - -
- -Benchmarks an input function with input args of type AnyTrivialRegType. - -**Parameters:** - -- ​T (`AnyTrivialRegType`): Benchmark function input type. -- ​bench_fn (`fn(mut Bencher, $0) capturing -> None`): The function to - be benchmarked. - -**Args:** - -- ​bench_id (`BenchId`): The benchmark Id object used for identification. -- ​input (`T`): Represents the target function's input arguments. -- ​throughput_elems (`Optional[Int]`): Optional argument representing - algorithmic throughput. - -
- -### `bench_function` - -
- -
- -```mojo -bench_function[bench_fn: fn(mut Bencher) capturing -> None](mut self: Self, bench_id: BenchId, throughput_elems: Optional[Int] = #kgen.none) -``` - -
- -Benchmarks or Tests an input function. - -**Parameters:** - -- ​bench_fn (`fn(mut Bencher) capturing -> None`): The function to be - benchmarked. - -**Args:** - -- ​bench_id (`BenchId`): The benchmark Id object used for identification. -- ​throughput_elems (`Optional[Int]`): Optional argument representing - algorithmic throughput. - -
- -
- -
- -```mojo -bench_function[bench_fn: fn(mut Bencher) raises capturing -> None](mut self: Self, bench_id: BenchId, throughput_elems: Optional[Int] = #kgen.none) -``` - -
- -Benchmarks or Tests an input function. - -**Parameters:** - -- ​bench_fn (`fn(mut Bencher) raises capturing -> None`): The function - to be benchmarked. - -**Args:** - -- ​bench_id (`BenchId`): The benchmark Id object used for identification. -- ​throughput_elems (`Optional[Int]`): Optional argument representing - algorithmic throughput. - -
- -### `dump_report` - -
- -
- -`dump_report(self: Self)` - -
- -Prints out the report from a Benchmark execution. - -
- -
diff --git a/stdlib/docs/bencher/BenchConfig.md b/stdlib/docs/bencher/BenchConfig.md deleted file mode 100644 index 8a83984d5e..0000000000 --- a/stdlib/docs/bencher/BenchConfig.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: BenchConfig -version: 0.0.0 -slug: BenchConfig -type: struct -namespace: benchmark.bencher ---- - -
- -Defines a benchmark configuration struct to control execution times and -frequency. - -## Fields - -- ​out_file (`Optional[Path]`): Output file to write results to. -- ​min_runtime_secs (`SIMD[float64, 1]`): Lower bound on benchmarking time - in secs. -- ​max_runtime_secs (`SIMD[float64, 1]`): Upper bound on benchmarking time - in secs. -- ​min_warmuptime_secs (`SIMD[float64, 1]`): Lower bound on the warmup time - in secs. -- ​max_batch_size (`Int`): The maximum number of iterations to perform per - time measurement. -- ​max_iters (`Int`): Max number of iterations to run. -- ​num_repetitions (`Int`): Number of times the benchmark has to be - repeated. -- ​flush_denormals (`Bool`): Whether or not the denormal values are - flushed. -- ​show_progress (`Bool`): Whether or not to show the progress of each - benchmark. -- ​tabular_view (`Bool`): Whether to print results in csv readable/tabular - format. - -## Implemented traits - -`AnyType`, -`CollectionElement`, -`Copyable`, -`Movable` - -## Methods - -### `__init__` - -
- -
- -```mojo -__init__(out self: out_file: Optional[Path] = None, min_runtime_secs: SIMD[float64, 1] = 1.0, max_runtime_secs: SIMD[float64, 1] = 2.0, min_warmuptime_secs: SIMD[float64, 1] = 1.0, max_batch_size: Int = 0, max_iters: Int = 1000000000, num_repetitions: Int = 1, flush_denormals: Bool = True) -``` - -
- -Constructs and initializes Benchmark config object with default and inputted values. - -**Args:** - -- ​out_file (`Optional[Path]`): Output file to write results to. -- ​min_runtime_secs (`SIMD[float64, 1]`): Upper bound on benchmarking time - in secs (default `1.0`). -- ​max_runtime_secs (`SIMD[float64, 1]`): Lower bound on benchmarking time - in secs (default `2.0`). -- ​min_warmuptime_secs (`SIMD[float64, 1]`): Lower bound on the warmup time - in secs (default `1.0`). -- ​max_batch_size (`Int`): The maximum number of iterations to perform per - time measurement. -- ​max_iters (`Int`): Max number of iterations to run (default - `1_000_000_000`). -- ​num_repetitions (`Int`): Number of times the benchmark has to be - repeated. -- ​flush_denormals (`Bool`): Whether or not the denormal values are - flushed. - -
- -
diff --git a/stdlib/docs/bencher/BenchId.md b/stdlib/docs/bencher/BenchId.md deleted file mode 100644 index 0d215bd972..0000000000 --- a/stdlib/docs/bencher/BenchId.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: BenchId -version: 0.0.0 -slug: BenchId -type: struct -namespace: benchmark.bencher ---- - -
- -Defines a benchmark ID struct to identify and represent a particular benchmark -execution. - -## Fields - -- ​func_name (`String`): The target function name. -- ​input_id (`Optional[String]`): The target function input ID phrase. - -## Implemented traits - -`AnyType`, -`Copyable`, -`Movable` - -## Methods - -### `__init__` - -
- -
- -`__init__(out self: Self, func_name: String, input_id: String)` - -
- -Constructs a Benchmark Id object from input function name and Id phrase. - -**Args:** - -- ​func_name (`String`): The target function name. -- ​input_id (`String`): The target function input id phrase. - -
- -
- -
- -`__init__(out self: Self, func_name: String)` - -
- -Constructs a Benchmark Id object from input function name. - -**Args:** - -- ​func_name (`String`): The target function name. - -
- -
diff --git a/stdlib/docs/bencher/Bencher.md b/stdlib/docs/bencher/Bencher.md deleted file mode 100644 index 91d68e80d8..0000000000 --- a/stdlib/docs/bencher/Bencher.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: Bencher -version: 0.0.0 -slug: Bencher -type: struct -namespace: benchmark.bencher ---- - -
- -Defines a Bencher struct which facilitates the timing of a target function. - -## Fields - -- ​num_iters (`Int`): Number of iterations to run the target function. -- ​elapsed (`Int`): The total time elpased when running the target - function. - -## Implemented traits - -`AnyType`, -`Copyable`, -`Movable` - -## Methods - -### `__init__` - -
- -
- -`__init__(out self: Self, num_iters: Int)` - -
- -Constructs a Bencher object to run and time a function. - -**Args:** - -- ​num_iters (`Int`): Number of times to run the target function. - -
- -### `iter` - -
- -
- -`iter[iter_fn: fn() capturing -> None](mut self: Self)` - -
- -Returns the total elapsed time by running a target function a particular number -of times. - -**Parameters:** - -- ​iter_fn (`fn() capturing -> None`): The target function to benchmark. - -
- -
- -
- -`iter[iter_fn: fn() raises capturing -> None](mut self: Self)` - -
- -Returns the total elapsed time by running a target function a particular number -of times. - -**Parameters:** - -- ​iter_fn (`fn() raises capturing -> None`): The target function to - benchmark. - -
- -### `iter_custom` - -
- -
- -`iter_custom[iter_fn: fn(Int) capturing -> Int](mut self: Self)` - -
- -Times a target function with custom number of iterations. - -**Parameters:** - -- ​iter_fn (`fn(Int) capturing -> Int`): The target function to benchmark. - -
- -
- -
- -`iter_custom[iter_fn: fn(Int) raises capturing -> Int](mut self: Self)` - -
- -Times a target function with custom number of iterations. - -**Parameters:** - -- ​iter_fn (`fn(Int) raises capturing -> Int`): The target function to - benchmark. - -
- -
diff --git a/stdlib/docs/bencher/BenchmarkInfo.md b/stdlib/docs/bencher/BenchmarkInfo.md deleted file mode 100644 index 52b2922fa0..0000000000 --- a/stdlib/docs/bencher/BenchmarkInfo.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: BenchmarkInfo -version: 0.0.0 -slug: BenchmarkInfo -type: struct -namespace: benchmark.bencher ---- - -
- -Defines a Benchmark Info struct to record execution Statistics. - -## Fields - -- ​name (`String`): The name of the benchmark. -- ​result (`Report`): The output report after executing a benchmark. -- ​elems (`Optional[Int]`): Optional arg used to represent a specific - metric like throughput. - -## Implemented traits - -`AnyType`, -`CollectionElement`, -`Copyable`, -`Movable`, -`Stringable` - -## Methods - -### `__init__` - -
- -
- -`__init__(out self: Self, name: String, result: Report, elems: Optional[Int])` - -
- -Constructs a Benchmark Info object to return Benchmark report and Stats. - -**Args:** - -- ​name (`String`): The name of the benchmark. -- ​result (`Report`): The output report after executing a benchmark. -- ​elems (`Optional[Int]`): Optional arg used to represent a specific - metric like throughput. - -
- -
diff --git a/stdlib/docs/bencher/Mode.md b/stdlib/docs/bencher/Mode.md deleted file mode 100644 index 74efd79cc0..0000000000 --- a/stdlib/docs/bencher/Mode.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Mode -version: 0.0.0 -slug: Mode -type: struct -namespace: benchmark.bencher ---- - -
- -Defines a Benchmark Mode to distinguish between test runs and actual benchmarks. - -## Aliases - -- `Benchmark = 0`: -- `Test = 1`: - -## Fields - -- ​value (`Int`): Represents the mode type. - -## Implemented traits - -`AnyType`, -`Copyable`, -`Movable` - -## Methods - -### `__eq__` - -
- -
- -`__eq__(self: Self, other: Self) -> Bool` - -
- -Check if its Benchmark mode or test mode. - -**Args:** - -- ​other (`Self`): The mode to be compared against. - -**Returns:** - -If its a test mode or benchmark mode. - -
- -
diff --git a/stdlib/docs/bencher/index.md b/stdlib/docs/bencher/index.md deleted file mode 100644 index 0372bc6dfb..0000000000 --- a/stdlib/docs/bencher/index.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: bencher -version: 0.0.0 -type: module -namespace: benchmark ---- - -
- -
- -This is preview documentation for the `bencher` module, available in nightly -builds now. This documentation will move to -[docs.modular.com](https://docs.modular.com/mojo/stdlib/benchmark/) soon. - -You can import these APIs from the `benchmark` package. For example: - -```mojo -from benchmark import Bencher -``` - -
- -## Structs - -- [​`BenchConfig`](./BenchConfig): Defines a benchmark configuration struct to - control execution times and frequency. -- [​`BenchId`](./BenchId): Defines a benchmark Id struct to identify and - represent a particular benchmark execution. -- [​`BenchmarkInfo`](./BenchmarkInfo): Defines a Benchmark Info struct to record - execution Statistics. -- [​`Mode`](./Mode): Defines a Benchmark Mode to distinguish between test runs - and actual benchmarks. -- [​`Bench`](./Bench): Defines the main Benchmark struct which executes a - Benchmark and print result. -- [​`Bencher`](./Bencher): Defines a Bencher struct which facilitates the timing - of a target function. - -
From 5146c002db4434cad511bbdf3922f3a3c09ef27b Mon Sep 17 00:00:00 2001 From: mahiro21h Date: Wed, 15 Jan 2025 07:32:56 -0800 Subject: [PATCH 25/39] [External] [stdlib] Fix `input()` segfaults on EOF (#53925) [External] [stdlib] Fix `input()` segfaults on EOF pressing `ctrl-d` with no input when `input()` is called causes mojo to crash because `read_until_delimiter()` doesn't check the return value of the C function `getdelim()`. it assumes `getdelim()` always succeeds and so, in the case of an error, it blindly creates a `StringRef` with its length set to the return value - 1 (so the length is -2 in this case). this `StringRef` is then passed to `String()` which in turn passes the `StringRef` to `memcpy()` with a count of -2 and ultimately crashing mojo. this pr adds a check in `read_until_delimiter()` to check if `getdelim()` failed and raise an error if it does, along with a test to ensure `read_until_delimiter()` continues to behave as it should. Fixes https://github.com/modularml/mojo/issues/3908 Co-authored-by: mahiro21h Closes modularml/mojo#3919 MODULAR_ORIG_COMMIT_REV_ID: c3457f3377bfcfe0379e31fbd31e72ec53fe7516 Signed-off-by: Joshua James Venter --- stdlib/src/builtin/io.mojo | 13 ++++++++--- stdlib/test/builtin/test_issue_3908.mojo | 28 ++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 stdlib/test/builtin/test_issue_3908.mojo diff --git a/stdlib/src/builtin/io.mojo b/stdlib/src/builtin/io.mojo index 465a4cefcf..b4971adf71 100644 --- a/stdlib/src/builtin/io.mojo +++ b/stdlib/src/builtin/io.mojo @@ -68,7 +68,7 @@ struct _fdopen[mode: StringLiteral = "a"]: """Closes the file handle.""" _ = fclose(self.handle) - fn readline(self) -> String: + fn readline(self) raises -> String: """Reads an entire line from stdin or until EOF. Lines are delimited by a newline character. Returns: @@ -95,7 +95,7 @@ struct _fdopen[mode: StringLiteral = "a"]: """ return self.read_until_delimiter("\n") - fn read_until_delimiter(self, delimiter: StringSlice) -> String: + fn read_until_delimiter(self, delimiter: StringSlice) raises -> String: """Reads an entire line from a stream, up to the `delimiter`. Does not include the delimiter in the result. @@ -140,6 +140,13 @@ struct _fdopen[mode: StringLiteral = "a"]: ord(delimiter), self.handle, ) + # Per man getdelim(3), getdelim will return -1 if an error occurs + # (or the user sends EOF without providing any input). We must + # raise an error in this case because otherwise, String() will crash mojo + # if the user sends EOF with no input. + # TODO: check errno to ensure we haven't encountered EINVAL or ENOMEM instead + if bytes_read == -1: + raise Error("EOF") # Copy the buffer (excluding the delimiter itself) into a Mojo String. var s = String(StringRef(buffer, bytes_read - 1)) # Explicitly free the buffer using free() instead of the Mojo allocator. @@ -283,7 +290,7 @@ fn print[ # ===----------------------------------------------------------------------=== # -fn input(prompt: String = "") -> String: +fn input(prompt: String = "") raises -> String: """Reads a line of input from the user. Reads a line from standard input, converts it to a string, and returns that string. diff --git a/stdlib/test/builtin/test_issue_3908.mojo b/stdlib/test/builtin/test_issue_3908.mojo new file mode 100644 index 0000000000..3e468a428f --- /dev/null +++ b/stdlib/test/builtin/test_issue_3908.mojo @@ -0,0 +1,28 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2024, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +# RUN: echo -n | %mojo %s + +from builtin.io import _fdopen +from testing import testing + + +fn test_read_until_delimiter_raises_eof() raises: + var stdin = _fdopen["r"](0) + with testing.assert_raises(contains="EOF"): + # Assign to a variable to silence a warning about unused String value + # if an error wasn't raised. + var unused = stdin.read_until_delimiter("\n") + + +fn main() raises: + test_read_until_delimiter_raises_eof() From 2463c78253bee08522185751feb721f5fed94272 Mon Sep 17 00:00:00 2001 From: abdul dakkak Date: Wed, 15 Jan 2025 12:08:59 -0800 Subject: [PATCH 26/39] [Stdlib] Add basic linked list implementation MODULAR_ORIG_COMMIT_REV_ID: 639aca98351b3616d041da634ec24c456cb44f4d Signed-off-by: Joshua James Venter --- docs/changelog.md | 2 + stdlib/src/collections/__init__.mojo | 1 + stdlib/src/collections/linked_list.mojo | 326 ++++++++++++++++++ stdlib/test/collections/test_linked_list.mojo | 122 +++++++ 4 files changed, 451 insertions(+) create mode 100644 stdlib/src/collections/linked_list.mojo create mode 100644 stdlib/test/collections/test_linked_list.mojo diff --git a/docs/changelog.md b/docs/changelog.md index b1bfb3c91a..a0456c42dd 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -231,6 +231,8 @@ what we publish. - You can now use `max()` and `min()` with variadic number of arguments. +- A new `LinkedList` type has been added to the standard library. + ### Tooling changes - mblack (aka `mojo format`) no longer formats non-mojo files. This prevents diff --git a/stdlib/src/collections/__init__.mojo b/stdlib/src/collections/__init__.mojo index 97f58c9c88..123ed4db6b 100644 --- a/stdlib/src/collections/__init__.mojo +++ b/stdlib/src/collections/__init__.mojo @@ -21,3 +21,4 @@ from .list import List from .optional import Optional, OptionalReg from .set import Set from .vector import InlinedFixedVector +from .linked_list import LinkedList diff --git a/stdlib/src/collections/linked_list.mojo b/stdlib/src/collections/linked_list.mojo new file mode 100644 index 0000000000..afa3c0b624 --- /dev/null +++ b/stdlib/src/collections/linked_list.mojo @@ -0,0 +1,326 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2024, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from memory import UnsafePointer +from collections import Optional +from collections._index_normalization import normalize_index + + +trait WritableCollectionElement(CollectionElement, Writable): + """A trait that combines CollectionElement and Writable traits. + + This trait requires types to implement both CollectionElement and Writable + interfaces, allowing them to be used in collections and written to output. + """ + + pass + + +@value +struct Node[ElementType: WritableCollectionElement]: + """A node in a linked list data structure. + + Parameters: + ElementType: The type of element stored in the node. + """ + + var value: ElementType + """The value stored in this node.""" + var prev: UnsafePointer[Node[ElementType]] + """The previous node in the list.""" + var next: UnsafePointer[Node[ElementType]] + """The next node in the list.""" + + fn __init__( + out self, + owned value: ElementType, + prev: Optional[UnsafePointer[Node[ElementType]]], + next: Optional[UnsafePointer[Node[ElementType]]], + ): + """Initialize a new Node with the given value and optional prev/next + pointers. + + Args: + value: The value to store in this node. + prev: Optional pointer to the previous node. + next: Optional pointer to the next node. + """ + self.value = value^ + self.prev = prev.value() if prev else __type_of(self.prev)() + self.next = next.value() if next else __type_of(self.next)() + + fn __str__(self) -> String: + """Convert this node's value to a string representation. + + Returns: + String representation of the node's value. + """ + return String.write(self) + + @no_inline + fn write_to[W: Writer](self, mut writer: W): + """Write this node's value to the given writer. + + Parameters: + W: The type of writer to write the value to. + + Args: + writer: The writer to write the value to. + """ + writer.write(self.value) + + +struct LinkedList[ElementType: WritableCollectionElement]: + """A doubly-linked list implementation. + + A doubly-linked list is a data structure where each element points to both + the next and previous elements, allowing for efficient insertion and deletion + at any position. + + Parameters: + ElementType: The type of elements stored in the list. Must implement + WritableCollectionElement. + """ + + var _head: UnsafePointer[Node[ElementType]] + """The first node in the list.""" + var _tail: UnsafePointer[Node[ElementType]] + """The last node in the list.""" + var _size: Int + """The number of elements in the list.""" + + fn __init__(out self): + """Initialize an empty linked list.""" + self._head = __type_of(self._head)() + self._tail = __type_of(self._tail)() + self._size = 0 + + fn __init__(mut self, owned *elements: ElementType): + """Initialize a linked list with the given elements. + + Args: + elements: Variable number of elements to initialize the list with. + """ + self = Self(elements=elements^) + + fn __init__(out self, *, owned elements: VariadicListMem[ElementType, _]): + """Initialize a linked list with the given elements. + + Args: + elements: Variable number of elements to initialize the list with. + """ + self = Self() + + for elem in elements: + self.append(elem[]) + + # Do not destroy the elements when their backing storage goes away. + __mlir_op.`lit.ownership.mark_destroyed`( + __get_mvalue_as_litref(elements) + ) + + fn __copyinit__(mut self, read other: Self): + """Initialize this list as a copy of another list. + + Args: + other: The list to copy from. + """ + self._head = other._head + self._tail = other._tail + self._size = other._size + + fn __moveinit__(mut self, owned other: Self): + """Initialize this list by moving elements from another list. + + Args: + other: The list to move elements from. + """ + self._head = other._head + self._tail = other._tail + self._size = other._size + other._head = __type_of(other._head)() + other._tail = __type_of(other._tail)() + other._size = 0 + + fn __del__(owned self): + """Clean up the list by freeing all nodes.""" + var curr = self._head + while curr: + var next = curr[].next + curr[].prev = __type_of(self._head)() + curr[].next = __type_of(self._tail)() + curr.destroy_pointee() + curr.free() + curr = next + + fn append(mut self, owned value: ElementType): + """Add an element to the end of the list. + + Args: + value: The value to append. + """ + var node = Node[ElementType](value^, self._tail, None) + var addr = UnsafePointer[__type_of(node)].alloc(1) + addr.init_pointee_move(node) + if self: + self._tail[].next = addr + self._tail = addr + else: + self._head = addr + self._tail = addr + self._size += 1 + + fn prepend(mut self, owned value: ElementType): + """Add an element to the beginning of the list. + + Args: + value: The value to prepend. + """ + var node = Node[ElementType](value^, None, self._head) + var addr = UnsafePointer[__type_of(node)].alloc(1) + addr.init_pointee_move(node) + if self: + self._head[].prev = addr + self._head = addr + else: + self._head = addr + self._tail = addr + self._size += 1 + + fn reverse(mut self): + """Reverse the order of elements in the list.""" + var prev = __type_of(self._head)() + var curr = self._head + while curr: + var next = curr[].next + curr[].next = prev + prev = curr + curr = next + self._head = prev + self._tail = self._head[].prev + + fn pop(mut self) -> ElementType: + """Remove and return the first element of the list. + + Returns: + The first element in the list. + """ + var elem = self._tail + var value = elem[].value + self._tail = elem[].prev + self._size -= 1 + return value^ + + fn copy(self) -> Self: + """Create a deep copy of the list. + + Returns: + A new list containing copies of all elements. + """ + var new = Self() + var curr = self._head + while curr: + new.append(curr[].value) + curr = curr[].next + return new^ + + fn __getitem__(ref self, index: Int) -> ref [self] ElementType: + """Get the element at the specified index. + + Args: + index: The index of the element to get. + + Returns: + The element at the specified index. + """ + var curr = self._head + for _ in range( + normalize_index[container_name="LinkedList"](index, self) + ): + curr = curr[].next + return curr[].value + + fn __setitem__(mut self, index: Int, owned value: ElementType): + """Set the element at the specified index. + + Args: + index: The index of the element to set. + value: The new value to set. + """ + var curr = self._head + for _ in range( + normalize_index[container_name="LinkedList"](index, self) + ): + curr = curr[].next + curr[].value = value^ + + fn __len__(self) -> Int: + """Get the number of elements in the list. + + Returns: + The number of elements in the list. + """ + return self._size + + fn __bool__(self) -> Bool: + """Check if the list is non-empty. + + Returns: + True if the list has elements, False otherwise. + """ + return len(self) != 0 + + fn __str__(self) -> String: + """Convert the list to its string representation. + + Returns: + String representation of the list. + """ + return String.write(self) + + fn __repr__(self) -> String: + """Convert the list to its string representation. + + Returns: + String representation of the list. + """ + var writer = String() + self._write(writer, prefix="LinkedList(", suffix=")") + return writer + + fn write_to[W: Writer](self, mut writer: W): + """Write the list to the given writer. + + Parameters: + W: The type of writer to write the list to. + + Args: + writer: The writer to write the list to. + """ + self._write(writer) + + @no_inline + fn _write[ + W: Writer + ](self, mut writer: W, *, prefix: String = "[", suffix: String = "]"): + if not self: + return writer.write(prefix, suffix) + + var curr = self._head + writer.write(prefix) + for i in range(len(self)): + if i: + writer.write(", ") + writer.write(curr[]) + curr = curr[].next + writer.write(suffix) diff --git a/stdlib/test/collections/test_linked_list.mojo b/stdlib/test/collections/test_linked_list.mojo new file mode 100644 index 0000000000..fa8b12b85d --- /dev/null +++ b/stdlib/test/collections/test_linked_list.mojo @@ -0,0 +1,122 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2024, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # +# RUN: %mojo-no-debug %s + +from collections import LinkedList +from testing import assert_equal + + +def test_construction(): + var l1 = LinkedList[Int]() + assert_equal(len(l1), 0) + + var l2 = LinkedList[Int](1, 2, 3) + assert_equal(len(l2), 3) + assert_equal(l2[0], 1) + assert_equal(l2[1], 2) + assert_equal(l2[2], 3) + + +def test_append(): + var l1 = LinkedList[Int]() + l1.append(1) + l1.append(2) + l1.append(3) + assert_equal(len(l1), 3) + assert_equal(l1[0], 1) + assert_equal(l1[1], 2) + assert_equal(l1[2], 3) + + +def test_prepend(): + var l1 = LinkedList[Int]() + l1.prepend(1) + l1.prepend(2) + l1.prepend(3) + assert_equal(len(l1), 3) + assert_equal(l1[0], 3) + assert_equal(l1[1], 2) + assert_equal(l1[2], 1) + + +def test_copy(): + var l1 = LinkedList[Int](1, 2, 3) + var l2 = l1.copy() + assert_equal(len(l2), 3) + assert_equal(l2[0], 1) + assert_equal(l2[1], 2) + assert_equal(l2[2], 3) + + +def test_reverse(): + var l1 = LinkedList[Int](1, 2, 3) + l1.reverse() + assert_equal(len(l1), 3) + assert_equal(l1[0], 3) + assert_equal(l1[1], 2) + assert_equal(l1[2], 1) + + +def test_pop(): + var l1 = LinkedList[Int](1, 2, 3) + assert_equal(l1.pop(), 3) + assert_equal(len(l1), 2) + assert_equal(l1[0], 1) + assert_equal(l1[1], 2) + + +def test_getitem(): + var l1 = LinkedList[Int](1, 2, 3) + assert_equal(l1[0], 1) + assert_equal(l1[1], 2) + assert_equal(l1[2], 3) + + assert_equal(l1[-1], 3) + assert_equal(l1[-2], 2) + assert_equal(l1[-3], 1) + + +def test_setitem(): + var l1 = LinkedList[Int](1, 2, 3) + l1[0] = 4 + assert_equal(l1[0], 4) + assert_equal(l1[1], 2) + assert_equal(l1[2], 3) + + l1[-1] = 5 + assert_equal(l1[0], 4) + assert_equal(l1[1], 2) + assert_equal(l1[2], 5) + + +def test_str(): + var l1 = LinkedList[Int](1, 2, 3) + assert_equal(str(l1), "[1, 2, 3]") + + +def test_repr(): + var l1 = LinkedList[Int](1, 2, 3) + assert_equal(repr(l1), "LinkedList(1, 2, 3)") + + +def main(): + test_construction() + test_append() + test_prepend() + test_copy() + test_reverse() + test_pop() + test_getitem() + test_setitem() + test_str() + test_repr() From ed3cecbca66fd7de68231ee3be52b27939a76821 Mon Sep 17 00:00:00 2001 From: Connor Gray Date: Wed, 15 Jan 2025 14:36:28 -0600 Subject: [PATCH 27/39] [stdlib] polish: Move ASCII free function predicates like `isdigit()` to be `Char` methods MODULAR_ORIG_COMMIT_REV_ID: ea353f81276ccc4a700ec8373ee150b38f0bb17c Signed-off-by: Joshua James Venter --- docs/changelog.md | 4 +- stdlib/src/builtin/char.mojo | 46 ++++++++ stdlib/src/collections/string/__init__.mojo | 4 - stdlib/src/collections/string/string.mojo | 100 +----------------- .../src/collections/string/string_slice.mojo | 8 +- stdlib/src/prelude/__init__.mojo | 4 - stdlib/test/builtin/test_char.mojo | 47 ++++++++ .../test/collections/string/test_string.mojo | 29 ----- 8 files changed, 105 insertions(+), 137 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index a0456c42dd..1d8ca2919e 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -113,7 +113,9 @@ what we publish. - Added `String` constructor from `Char` - `Char` can be converted to `UInt32` via `Char.to_u32()`. - `Char` provides methods for categorizing character types, including: - `Char.is_ascii()`, `Char.is_posix_space()`, `Char.is_python_space()`. + `Char.is_ascii()`, `Char.is_posix_space()`, `Char.is_python_space()`, + `Char.is_ascii_digit()`, `Char.is_ascii_upper()`, `Char.is_ascii_lower()`, + `Char.is_ascii_printable()`. - `chr(Int)` will now abort if given a codepoint value that is not a valid `Char`. diff --git a/stdlib/src/builtin/char.mojo b/stdlib/src/builtin/char.mojo index 0a48f7cdc6..261fc2ffeb 100644 --- a/stdlib/src/builtin/char.mojo +++ b/stdlib/src/builtin/char.mojo @@ -272,6 +272,52 @@ struct Char(CollectionElement, EqualityComparable, Intable, Stringable): """ return self._scalar_value <= 0b0111_1111 + fn is_ascii_digit(self) -> Bool: + """Determines whether the given character is a digit [0-9]. + + Returns: + True if the character is a digit. + """ + alias ord_0 = UInt32(ord("0")) + alias ord_9 = UInt32(ord("9")) + return ord_0 <= self.to_u32() <= ord_9 + + fn is_ascii_upper(self) -> Bool: + """Determines whether the given character is an uppercase character. + + This currently only respects the default "C" locale, i.e. returns True + iff the character specified is one of "ABCDEFGHIJKLMNOPQRSTUVWXYZ". + + Returns: + True if the character is uppercase. + """ + alias ord_a = UInt32(ord("A")) + alias ord_z = UInt32(ord("Z")) + return ord_a <= self.to_u32() <= ord_z + + fn is_ascii_lower(self) -> Bool: + """Determines whether the given character is an lowercase character. + + This currently only respects the default "C" locale, i.e. returns True + iff the character specified is one of "abcdefghijklmnopqrstuvwxyz". + + Returns: + True if the character is lowercase. + """ + alias ord_a = UInt32(ord("a")) + alias ord_z = UInt32(ord("z")) + return ord_a <= self.to_u32() <= ord_z + + fn is_ascii_printable(self) -> Bool: + """Determines whether the given character is a printable character. + + Returns: + True if the character is a printable character, otherwise False. + """ + alias ord_space = UInt32(ord(" ")) + alias ord_tilde = UInt32(ord("~")) + return ord_space <= self.to_u32() <= ord_tilde + @always_inline fn is_python_space(self) -> Bool: """Determines whether this character is a Python whitespace string. diff --git a/stdlib/src/collections/string/__init__.mojo b/stdlib/src/collections/string/__init__.mojo index 4dbc5bb4f7..fbdc8942ad 100644 --- a/stdlib/src/collections/string/__init__.mojo +++ b/stdlib/src/collections/string/__init__.mojo @@ -19,10 +19,6 @@ from .string import ( atol, stol, chr, - isdigit, - islower, - isprintable, - isupper, ord, ) from .string_slice import StringSlice, StaticString diff --git a/stdlib/src/collections/string/string.mojo b/stdlib/src/collections/string/string.mojo index 01e80cdcfb..9e3aa6a853 100644 --- a/stdlib/src/collections/string/string.mojo +++ b/stdlib/src/collections/string/string.mojo @@ -140,7 +140,7 @@ fn _repr_ascii(c: UInt8) -> String: if c == ord_back_slash: return r"\\" - elif isprintable(c): + elif Char(c).is_ascii_printable(): return _chr_ascii(c) elif c == ord_tab: return r"\t" @@ -686,96 +686,6 @@ fn atof(str_slice: StringSlice) raises -> Float64: return result * sign -# ===----------------------------------------------------------------------=== # -# isdigit -# ===----------------------------------------------------------------------=== # - - -fn isdigit(c: UInt8) -> Bool: - """Determines whether the given character is a digit [0-9]. - - Args: - c: The character to check. - - Returns: - True if the character is a digit. - """ - alias ord_0 = ord("0") - alias ord_9 = ord("9") - return ord_0 <= Int(c) <= ord_9 - - -# ===----------------------------------------------------------------------=== # -# isupper -# ===----------------------------------------------------------------------=== # - - -fn isupper(c: UInt8) -> Bool: - """Determines whether the given character is an uppercase character. - - This currently only respects the default "C" locale, i.e. returns True iff - the character specified is one of "ABCDEFGHIJKLMNOPQRSTUVWXYZ". - - Args: - c: The character to check. - - Returns: - True if the character is uppercase. - """ - return _is_ascii_uppercase(c) - - -fn _is_ascii_uppercase(c: UInt8) -> Bool: - alias ord_a = ord("A") - alias ord_z = ord("Z") - return ord_a <= Int(c) <= ord_z - - -# ===----------------------------------------------------------------------=== # -# islower -# ===----------------------------------------------------------------------=== # - - -fn islower(c: UInt8) -> Bool: - """Determines whether the given character is an lowercase character. - - This currently only respects the default "C" locale, i.e. returns True iff - the character specified is one of "abcdefghijklmnopqrstuvwxyz". - - Args: - c: The character to check. - - Returns: - True if the character is lowercase. - """ - return _is_ascii_lowercase(c) - - -fn _is_ascii_lowercase(c: UInt8) -> Bool: - alias ord_a = ord("a") - alias ord_z = ord("z") - return ord_a <= Int(c) <= ord_z - - -# ===----------------------------------------------------------------------=== # -# isprintable -# ===----------------------------------------------------------------------=== # - - -fn isprintable(c: UInt8) -> Bool: - """Determines whether the given character is a printable character. - - Args: - c: The character to check. - - Returns: - True if the character is a printable character, otherwise False. - """ - alias ord_space = ord(" ") - alias ord_tilde = ord("~") - return ord_space <= Int(c) <= ord_tilde - - # ===----------------------------------------------------------------------=== # # String # ===----------------------------------------------------------------------=== # @@ -2122,8 +2032,8 @@ struct String( """ if not self: return False - for c in self: - if not isdigit(ord(c)): + for char in self.as_string_slice().chars(): + if not char.is_ascii_digit(): return False return True @@ -2155,8 +2065,8 @@ struct String( Returns: True if all characters are printable else False. """ - for c in self: - if not isprintable(ord(c)): + for char in self.as_string_slice().chars(): + if not char.is_ascii_printable(): return False return True diff --git a/stdlib/src/collections/string/string_slice.mojo b/stdlib/src/collections/string/string_slice.mojo index 5a48b47b5e..74c471f491 100644 --- a/stdlib/src/collections/string/string_slice.mojo +++ b/stdlib/src/collections/string/string_slice.mojo @@ -524,12 +524,12 @@ struct StringSlice[mut: Bool, //, origin: Origin[mut]]( elif s == "\r": result += r"\r" else: - var codepoint = ord(s) - if isprintable(codepoint): + var codepoint = Char.ord(s) + if codepoint.is_ascii_printable(): result += s - elif codepoint < 0x10: + elif codepoint.to_u32() < 0x10: result += hex(codepoint, prefix=r"\x0") - elif codepoint < 0x20 or codepoint == 0x7F: + elif codepoint.to_u32() < 0x20 or codepoint.to_u32() == 0x7F: result += hex(codepoint, prefix=r"\x") else: # multi-byte character result += s diff --git a/stdlib/src/prelude/__init__.mojo b/stdlib/src/prelude/__init__.mojo index 2979521b03..aa43517bed 100644 --- a/stdlib/src/prelude/__init__.mojo +++ b/stdlib/src/prelude/__init__.mojo @@ -22,10 +22,6 @@ from collections.string import ( atol, stol, chr, - isdigit, - islower, - isprintable, - isupper, ord, ) from hashlib.hash import Hashable, hash diff --git a/stdlib/test/builtin/test_char.mojo b/stdlib/test/builtin/test_char.mojo index c8c083a82a..b38a855051 100644 --- a/stdlib/test/builtin/test_char.mojo +++ b/stdlib/test/builtin/test_char.mojo @@ -95,6 +95,49 @@ def test_char_is_posix_space(): assert_false(Char.ord(".").is_posix_space()) +def test_char_is_lower(): + assert_true(Char.ord("a").is_ascii_lower()) + assert_true(Char.ord("b").is_ascii_lower()) + assert_true(Char.ord("y").is_ascii_lower()) + assert_true(Char.ord("z").is_ascii_lower()) + + assert_false(Char.from_u32(ord("a") - 1).value().is_ascii_lower()) + assert_false(Char.from_u32(ord("z") + 1).value().is_ascii_lower()) + + assert_false(Char.ord("!").is_ascii_lower()) + assert_false(Char.ord("0").is_ascii_lower()) + + +def test_char_is_upper(): + assert_true(Char.ord("A").is_ascii_upper()) + assert_true(Char.ord("B").is_ascii_upper()) + assert_true(Char.ord("Y").is_ascii_upper()) + assert_true(Char.ord("Z").is_ascii_upper()) + + assert_false(Char.from_u32(ord("A") - 1).value().is_ascii_upper()) + assert_false(Char.from_u32(ord("Z") + 1).value().is_ascii_upper()) + + assert_false(Char.ord("!").is_ascii_upper()) + assert_false(Char.ord("0").is_ascii_upper()) + + +def test_char_is_digit(): + assert_true(Char.ord("1").is_ascii_digit()) + assert_false(Char.ord("g").is_ascii_digit()) + + # Devanagari Digit 6 — non-ASCII digits are not "ascii digit". + assert_false(Char.ord("६").is_ascii_digit()) + + +def test_char_is_printable(): + assert_true(Char.ord("a").is_ascii_printable()) + assert_false(Char.ord("\n").is_ascii_printable()) + assert_false(Char.ord("\t").is_ascii_printable()) + + # Non-ASCII characters are not considered "ascii printable". + assert_false(Char.ord("स").is_ascii_printable()) + + alias SIGNIFICANT_CODEPOINTS = List[Tuple[Int, List[Byte]]]( # -------------------------- # 1-byte (ASCII) codepoints @@ -191,6 +234,10 @@ def main(): test_char_formatting() test_char_properties() test_char_is_posix_space() + test_char_is_lower() + test_char_is_upper() + test_char_is_digit() + test_char_is_printable() test_char_utf8_encoding() test_char_utf8_byte_length() test_char_comptime() diff --git a/stdlib/test/collections/string/test_string.mojo b/stdlib/test/collections/string/test_string.mojo index 9d6ddae76e..9e231af486 100644 --- a/stdlib/test/collections/string/test_string.mojo +++ b/stdlib/test/collections/string/test_string.mojo @@ -974,17 +974,6 @@ def test_splitlines(): def test_isupper(): - assert_true(isupper(ord("A"))) - assert_true(isupper(ord("B"))) - assert_true(isupper(ord("Y"))) - assert_true(isupper(ord("Z"))) - - assert_false(isupper(ord("A") - 1)) - assert_false(isupper(ord("Z") + 1)) - - assert_false(isupper(ord("!"))) - assert_false(isupper(ord("0"))) - assert_true(String("ASDG").isupper()) assert_false(String("AsDG").isupper()) assert_true(String("ABC123").isupper()) @@ -994,17 +983,6 @@ def test_isupper(): def test_islower(): - assert_true(islower(ord("a"))) - assert_true(islower(ord("b"))) - assert_true(islower(ord("y"))) - assert_true(islower(ord("z"))) - - assert_false(islower(ord("a") - 1)) - assert_false(islower(ord("z") + 1)) - - assert_false(islower(ord("!"))) - assert_false(islower(ord("0"))) - assert_true(String("asdfg").islower()) assert_false(String("asdFDg").islower()) assert_true(String("abc123").islower()) @@ -1585,9 +1563,6 @@ def test_format_conversion_flags(): def test_isdigit(): - assert_true(isdigit(ord("1"))) - assert_false(isdigit(ord("g"))) - assert_false(String("").isdigit()) assert_true(String("123").isdigit()) assert_false(String("asdg").isdigit()) @@ -1595,10 +1570,6 @@ def test_isdigit(): def test_isprintable(): - assert_true(isprintable(ord("a"))) - assert_false(isprintable(ord("\n"))) - assert_false(isprintable(ord("\t"))) - assert_true(String("aasdg").isprintable()) assert_false(String("aa\nae").isprintable()) assert_false(String("aa\tae").isprintable()) From 3fe01e70c4233c91b7c8e6f0f720b43424598df9 Mon Sep 17 00:00:00 2001 From: Scott Main Date: Wed, 15 Jan 2025 12:48:15 -0800 Subject: [PATCH 28/39] Add image metadata to support rendering in card stacks MODULAR_ORIG_COMMIT_REV_ID: fd1b1dafcf04683dae78ad61f7d5086db50ebd6b Signed-off-by: Joshua James Venter --- docs/manual/get-started.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/manual/get-started.mdx b/docs/manual/get-started.mdx index 8540761f2e..67bd86d592 100644 --- a/docs/manual/get-started.mdx +++ b/docs/manual/get-started.mdx @@ -3,6 +3,7 @@ title: "Get started with Mojo" sidebar_label: "Tutorial: Get started with Mojo" description: "Install Mojo and learn the language basics by building a complete Mojo program" github_url: https://github.com/modularml/mojo/tree/nightly/examples/life +images: /images/artwork/mojo-get-started.jpg --- import GetMagic from '@site/src/includes/get_magic.mdx'; From 0f626726968e02ca5a3edab9e6ae518bac4fb5e1 Mon Sep 17 00:00:00 2001 From: Scott Main Date: Wed, 15 Jan 2025 13:45:44 -0800 Subject: [PATCH 29/39] Revert adding image front matter due to build issue MODULAR_ORIG_COMMIT_REV_ID: 73f546472958e8f645c868ffa41db6b3e331ede6 Signed-off-by: Joshua James Venter --- docs/manual/get-started.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/manual/get-started.mdx b/docs/manual/get-started.mdx index 67bd86d592..8540761f2e 100644 --- a/docs/manual/get-started.mdx +++ b/docs/manual/get-started.mdx @@ -3,7 +3,6 @@ title: "Get started with Mojo" sidebar_label: "Tutorial: Get started with Mojo" description: "Install Mojo and learn the language basics by building a complete Mojo program" github_url: https://github.com/modularml/mojo/tree/nightly/examples/life -images: /images/artwork/mojo-get-started.jpg --- import GetMagic from '@site/src/includes/get_magic.mdx'; From ca29650125ac83965d4e5957586d24c54f95701f Mon Sep 17 00:00:00 2001 From: Scott Main Date: Wed, 15 Jan 2025 14:37:07 -0800 Subject: [PATCH 30/39] Add image metadata to support rendering in card stacks MODULAR_ORIG_COMMIT_REV_ID: 6df31c8fe894ab751471259dae63af76a6ace222 Signed-off-by: Joshua James Venter --- docs/manual/get-started.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/manual/get-started.mdx b/docs/manual/get-started.mdx index 8540761f2e..9a3aaeff9b 100644 --- a/docs/manual/get-started.mdx +++ b/docs/manual/get-started.mdx @@ -3,6 +3,7 @@ title: "Get started with Mojo" sidebar_label: "Tutorial: Get started with Mojo" description: "Install Mojo and learn the language basics by building a complete Mojo program" github_url: https://github.com/modularml/mojo/tree/nightly/examples/life +image: /images/artwork/mojo-get-started.jpg --- import GetMagic from '@site/src/includes/get_magic.mdx'; From bccc34262a5b38b79e94e89dc425a0344d1d7f8e Mon Sep 17 00:00:00 2001 From: Ken Jones <165197230+KenJones-Modular@users.noreply.github.com> Date: Wed, 15 Jan 2025 15:19:40 -0800 Subject: [PATCH 31/39] Adding an example to the public repo of using the Mojo testing framework MODULAR_ORIG_COMMIT_REV_ID: 111e67f7d270db6368c3b592ff5437d24c4a464c Signed-off-by: Joshua James Venter --- docs/tools/testing.mdx | 167 +++++++++++--------- examples/testing/.gitattributes | 2 + examples/testing/.gitignore | 6 + examples/testing/README.md | 68 ++++++++ examples/testing/mojoproject.toml | 16 ++ examples/testing/src/example.mojo | 26 +++ examples/testing/src/my_math/__init__.mojo | 51 ++++++ examples/testing/src/my_math/utils.mojo | 94 +++++++++++ examples/testing/test/my_math/test_dec.mojo | 28 ++++ examples/testing/test/my_math/test_inc.mojo | 28 ++++ 10 files changed, 413 insertions(+), 73 deletions(-) create mode 100644 examples/testing/.gitattributes create mode 100644 examples/testing/.gitignore create mode 100644 examples/testing/README.md create mode 100644 examples/testing/mojoproject.toml create mode 100644 examples/testing/src/example.mojo create mode 100644 examples/testing/src/my_math/__init__.mojo create mode 100644 examples/testing/src/my_math/utils.mojo create mode 100644 examples/testing/test/my_math/test_dec.mojo create mode 100644 examples/testing/test/my_math/test_inc.mojo diff --git a/docs/tools/testing.mdx b/docs/tools/testing.mdx index 287e40c690..bd67e80ec3 100644 --- a/docs/tools/testing.mdx +++ b/docs/tools/testing.mdx @@ -2,6 +2,7 @@ title: Testing sidebar_position: 2 description: Testing Mojo programs. +github_url: https://github.com/modularml/mojo/tree/nightly/examples/testing --- Mojo includes a framework for developing and executing unit tests. The framework @@ -66,7 +67,7 @@ mojo test test_quickstart.mojo You should see output similar to this (note that this example elides the full filesystem paths from the output shown): -``` +```output Testing Time: 1.193s Total Discovered Tests: 2 @@ -92,15 +93,20 @@ its error message. ### Next steps -* [The `testing` module](#the-testing-module) describes the assertion +- [The `testing` module](#the-testing-module) describes the assertion functions available to help implement tests. -* [Writing unit tests](#writing-unit-tests) shows how to write unit tests and +- [Writing unit tests](#writing-unit-tests) shows how to write unit tests and organize them into test files. -* [The `mojo test` command](#the-mojo-test-command) describes how to execute +- [The `mojo test` command](#the-mojo-test-command) describes how to execute and collect lists of tests. -* [Writing API documentation tests](#writing-api-documentation-tests) +- [Writing API documentation tests](#writing-api-documentation-tests) discusses how to use the Mojo testing framework to test code examples in your API documentation. +- The public [GitHub repo](https://github.com/modularml/mojo/tree/nightly) + contains an [example + project](https://github.com/modularml/mojo/tree/nightly/examples/testing) to + demonstrate both unit testing and docstring testing. Several of the examples + shown later are based on this project. ## The `testing` module @@ -108,15 +114,15 @@ The Mojo standard library includes a [`testing`](/mojo/stdlib/testing/testing/) module that defines several assertion functions for implementing tests. Each assertion returns `None` if its condition is met or raises an error if it isn't. -* [`assert_true()`](/mojo/stdlib/testing/testing/assert_true): +- [`assert_true()`](/mojo/stdlib/testing/testing/assert_true): Asserts that the input value is `True`. -* [`assert_false()`](/mojo/stdlib/testing/testing/assert_false): +- [`assert_false()`](/mojo/stdlib/testing/testing/assert_false): Asserts that the input value is `False`. -* [`assert_equal()`](/mojo/stdlib/testing/testing/assert_equal): +- [`assert_equal()`](/mojo/stdlib/testing/testing/assert_equal): Asserts that the input values are equal. -* [`assert_not_equal()`](/mojo/stdlib/testing/testing/assert_not_equal): +- [`assert_not_equal()`](/mojo/stdlib/testing/testing/assert_not_equal): Asserts that the input values are not equal. -* [`assert_almost_equal()`](/mojo/stdlib/testing/testing/assert_almost_equal): +- [`assert_almost_equal()`](/mojo/stdlib/testing/testing/assert_almost_equal): Asserts that the input values are equal up to a tolerance. The boolean assertions report a basic error message when they fail. @@ -191,8 +197,7 @@ Error: AssertionError: Didn't raise at Expression [4] wrapper:18:23 The example above assigns the return value from `inc()` to a [*discard pattern*](/mojo/manual/lifecycle/death#explicit-lifetimes). -Without it, the Mojo compiler detects that the return value is unused and -optimizes the code to eliminate the function call. +Without it, the Mojo compiler reports a warning that the return value is unused. ::: @@ -222,11 +227,11 @@ Error: invalid value A Mojo unit test is simply a function that fulfills all of these requirements: -* Has a name that starts with `test_`. -* Accepts no arguments. -* Returns either `None` or a value of type `object`. -* Raises an error to indicate test failure. -* Is defined at the module scope, not as a Mojo struct method. +- Has a name that starts with `test_`. +- Accepts no arguments. +- Returns either `None` or a value of type `object`. +- Raises an error to indicate test failure. +- Is defined at the module scope, not as a Mojo struct method. You can use either `def` or `fn` to define a test function. Because a test function always raises an error to indicate failure, any test function defined @@ -269,9 +274,9 @@ The unique identity of a unit test consists of the path of the test file and the name of the test function, separated by `::`. So the test IDs from the example above are: -* `test_my_target_module.mojo::test_validate_input()` -* `test_my_target_module.mojo::test_convert_input()` -* `test_my_target_module.mojo::test_convert_error()` +- `test_my_target_module.mojo::test_validate_input()` +- `test_my_target_module.mojo::test_convert_input()` +- `test_my_target_module.mojo::test_convert_error()` ## The `mojo test` command @@ -283,18 +288,19 @@ command for running tests or collecting a list of tests. By default, the `mojo test` command runs the tests that you specify using one of the following: -* A single test ID with either an absolute or relative file path, to run only +- A single test ID with either an absolute or relative file path, to run only that test. -* A single absolute or relative file path, to run all tests in that file. -* A single absolute or relative directory path, to recurse through that +- A single absolute or relative file path, to run all tests in that file. +- A single absolute or relative directory path, to recurse through that directory hierarchy and run all tests found. If needed, you can optionally use the `-I` option one or more times to append additional paths to the list of directories searched to import Mojo modules and -packages. For example, consider a project with the following directory -structure: +packages. Consider the [example testing +project](https://github.com/modularml/mojo/tree/nightly/examples/testing) in +GitHub, which has the following directory structure: -``` +```output . ├── src │   ├── example.mojo @@ -307,11 +313,14 @@ structure: └── test_inc.mojo ``` -From the project root directory, you could execute all of the tests in the -`test` directory like this: +From the project root directory, you can execute all of the tests in the `test` +directory like this: +```bash +mojo test -I src test ``` -$ mojo test -I src test + +```output Testing Time: 3.433s Total Discovered Tests: 4 @@ -321,10 +330,13 @@ Failed : 0 (0.00%) Skipped: 0 (0.00%) ``` -You could run the tests contained in only the `test_dec.mojo` file like this: +You can run the tests contained in only the `test_dec.mojo` file like this: +```bash +mojo test -I src test/my_math/test_dec.mojo ``` -$ mojo test -I src test/my_math/test_dec.mojo + +```output Testing Time: 1.175s Total Discovered Tests: 2 @@ -334,11 +346,14 @@ Failed : 0 (0.00%) Skipped: 0 (0.00%) ``` -And you could run a single test from a file by providing its fully qualified +And you can run a single test from a file by providing its fully qualified ID like this: +```bash +mojo test -I src 'test/my_math/test_dec.mojo::test_dec_valid()' ``` -$ mojo test -I src 'test/my_math/test_dec.mojo::test_dec_valid()' + +```output Testing Time: 0.66s Total Discovered Tests: 1 @@ -353,9 +368,11 @@ Skipped: 0 (0.00%) By including the `--collect-only` or `--co` option, you can use `mojo test` to discover and print a list of tests. -As an example, consider the project structure shown in the -[Running tests](#running-tests) section. The following command produces a list -of all of the tests defined in the `test` directory hierarchy. +Consider the [example testing +project](https://github.com/modularml/mojo/tree/nightly/examples/testing) +directory structure shown in the [Running tests](#running-tests) section. The +following command produces a list of all of the tests defined in the `test` +directory hierarchy. ```bash mojo test --co test @@ -364,7 +381,7 @@ mojo test --co test The output shows the hierarchy of directories, test files, and individual tests (note that this example elides the full filesystem paths from the output shown): -``` +```output @@ -380,7 +397,7 @@ By default `mojo test` produces concise, human-readable output. Alternatively you can produce JSON formatted output more suitable for input to other tools by including the `--diagnostic-format json` option. -For example, you could run the tests in the `test_quickstart.mojo` file shown +For example, you can run the tests in the `test_quickstart.mojo` file shown in the [Get started](#get-started) section with JSON formatted output using this command: @@ -392,7 +409,7 @@ The output shows the detailed results for each individual test and summary results (note that this example elides the full filesystem paths from the output shown): -``` +```json { "children": [ { @@ -421,19 +438,21 @@ output shown): } ``` -You can also produce JSON output for test collection as well. As an example, -consider the project structure shown in the [Running tests](#running-tests) -section. The following command collects a list in JSON format of all of the -tests defined in the `test` directory hierarchy: +You can also produce JSON output for test collection as well. Consider the +[example testing +project](https://github.com/modularml/mojo/tree/nightly/examples/testing) +directory structure shown in the [Running tests](#running-tests) section. The +following command collects a list in JSON format of all of the tests defined in +the `test` directory hierarchy: ```bash mojo test --diagnostic-format json --co test ``` -The output would appear as follows (note that this example elides the full +The output will appear as follows (note that this example elides the full filesystem paths from the output shown): -``` +```json { "children": [ { @@ -442,18 +461,18 @@ filesystem paths from the output shown): "id": "ROOT_DIR/test/my_math/test_dec.mojo::test_dec_valid()", "location": { "endColumn": 5, - "endLine": 5, + "endLine": 19, "startColumn": 5, - "startLine": 5 + "startLine": 19 } }, { "id": "ROOT_DIR/test/my_math/test_dec.mojo::test_dec_min()", "location": { "endColumn": 5, - "endLine": 9, + "endLine": 24, "startColumn": 5, - "startLine": 9 + "startLine": 24 } } ], @@ -465,18 +484,18 @@ filesystem paths from the output shown): "id": "ROOT_DIR/test/my_math/test_inc.mojo::test_inc_valid()", "location": { "endColumn": 5, - "endLine": 5, + "endLine": 19, "startColumn": 5, - "startLine": 5 + "startLine": 19 } }, { "id": "ROOT_DIR/test/my_math/test_inc.mojo::test_inc_max()", "location": { "endColumn": 5, - "endLine": 9, + "endLine": 24, "startColumn": 5, - "startLine": 9 + "startLine": 24 } } ], @@ -539,7 +558,7 @@ assert_equals(b, 2) Sometimes you might want to execute a line of code as part of the test but *not* display that line in the API documentation. To achieve this, prefix the line of -code with `%#`. For example, you could use this technique to omit `import` +code with `%#`. For example, you can use this technique to omit `import` statements and assertion functions from the documentation. ```` @@ -560,7 +579,7 @@ print(c) ### Documentation test suites and scoping The Mojo testing framework treats each docstring as a separate *test suite*. -In other words, a single test suite could correspond to the docstring for an +In other words, a single test suite can correspond to the docstring for an individual package, module, function, struct, struct method, etc. Each executable code block within a given docstring is a single test of the same @@ -606,43 +625,45 @@ suite within the same module. ### Documentation test identifiers The format of a documentation test identifier is `@::`. -This is best explained by an example. Consider the project structure shown in -the [Running tests](#running-tests) section. The source files in the `src` -directory might contain docstrings for the `my_math` package, the `utils.mojo` -module, and the individual functions within that module. You could collect the -full list of tests by executing: +This is best explained by an example. Consider the [example testing +project](https://github.com/modularml/mojo/tree/nightly/examples/testing) +directory structure shown in the [Running tests](#running-tests) section. The +source files in the `src` directory might contain docstrings for the `my_math` +package, the `utils.mojo` module, and the individual functions within that +module. You can collect the full list of tests by executing: -``` +```bash mojo test --co src ``` The output shows the hierarchy of directories, test files, and individual tests (note that this example elides the full filesystem paths from the output shown): -``` +```output + - - - - - - + + + + + + ``` Several different test suites appear in this result: -| Test suite scope | File | Test suite name | -| ---------------- | --------------------------- | ---------------------------------------------------- | -| Package | `src/my_math/__init__.mojo` | `__doc__` | -| Module | `src/my_math/utils.mojo` | `__doc__` | -| Function | `src/my_math/utils.mojo` | `inc(stdlib\3A\3Abuiltin\3A\3Aint\3A\3AInt).__doc__` | +| Test suite scope | File | Test suite name | +| ---------------- | --------------------------- | ------------------------ | +| Package | `src/my_math/__init__.mojo` | `__doc__` | +| Module | `src/my_math/utils.mojo` | `__doc__` | +| Function | `src/my_math/utils.mojo` | `inc(\3A\3AInt).__doc__` | Then within a specific test suite, tests are numbered sequentially in the order they appear in the docstring, starting with 0. diff --git a/examples/testing/.gitattributes b/examples/testing/.gitattributes new file mode 100644 index 0000000000..8f61a8e774 --- /dev/null +++ b/examples/testing/.gitattributes @@ -0,0 +1,2 @@ +# SCM syntax highlighting +pixi.lock linguist-language=YAML linguist-generated=true diff --git a/examples/testing/.gitignore b/examples/testing/.gitignore new file mode 100644 index 0000000000..4edde08eef --- /dev/null +++ b/examples/testing/.gitignore @@ -0,0 +1,6 @@ +# pixi environments +.pixi +*.egg-info + +# Magic environments +.magic diff --git a/examples/testing/README.md b/examples/testing/README.md new file mode 100644 index 0000000000..849554de04 --- /dev/null +++ b/examples/testing/README.md @@ -0,0 +1,68 @@ +# Modular testing framework examples + +This directory contains examples of using the Mojo testing framework. It +demonstrates using the testing framework for both unit testing and testing code +examples in the [documentation +strings](https://docs.modular.com/mojo/manual/basics#code-comments) (also known +as *docstrings*) of Mojo API documentation. See the +[Testing](https://docs.modular.com/mojo/tools/testing) section of the [Mojo +manual](https://docs.modular.com/mojo/manual/) for a complete discussion of how +to use the Mojo testing framework. + +## Files + +This directory contains the following files: + +- `src/my_math/__init__.mojo`: a Mojo package file with package-level docstrings + containing code examples to test + +- `src/my_math/utils.mojo`: a Mojo module source file with both module-level and + function-level docstrings containing code examples to test + +- `src/example.mojo`: a simple Mojo program that uses the functions from the + `my_math` package + +- `test/my_math/test_*.mojo`: Mojo test files containing unit tests for + functions defined in the `my_math` package + +- `mojoproject.toml`: a [Magic](https://docs.modular.com/magic/) project file + containing the project dependencies and task definitions. + +## Run the code + +This example project uses the [Magic](https://docs.modular.com/magic/) package +and virtual environment manager. To run the code in this project, you should +follow the instructions in [Install +Magic](https://docs.modular.com/nightly/magic/#install-magic) first. + +Once you have installed Magic, activate the project's virtual environment by +navigating to the project's root directory and executing: + +```bash +magic shell +``` + +Run the unit tests contained in the `test` directory by executing: + +```bash +mojo test -I src test +``` + +Run the docstring tests for the API documentation contained in the `src` +directory by executing: + +```bash +mojo test src +``` + +If desired, you can run the example program by executing: + +```bash +mojo src/example.mojo +``` + +Once you're done, deactivate the project's virtual environment by executing: + +```bash +exit +``` diff --git a/examples/testing/mojoproject.toml b/examples/testing/mojoproject.toml new file mode 100644 index 0000000000..487fdcfa48 --- /dev/null +++ b/examples/testing/mojoproject.toml @@ -0,0 +1,16 @@ +[project] +authors = ["Modular "] +channels = ["conda-forge", "https://conda.modular.com/max-nightly"] +description = "An example of using the Mojo testing framework" +name = "testing" +platforms = ["osx-arm64", "linux-64", "linux-aarch64"] +version = "0.1.0" + +[tasks] +main = "mojo run src/example.mojo" +doc-tests = "mojo test src" +unit-tests = "mojo test -I src test" +tests = { depends-on = ["doc-tests", "unit-tests"] } + +[dependencies] +max = "*" diff --git a/examples/testing/src/example.mojo b/examples/testing/src/example.mojo new file mode 100644 index 0000000000..28807bbccb --- /dev/null +++ b/examples/testing/src/example.mojo @@ -0,0 +1,26 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from my_math import dec, inc + + +def main(): + i = 0 + print("Incrementing") + while i < 5: + i = inc(i) + print(i) + print("Decrementing") + while i > 0: + print(i) + i = dec(i) diff --git a/examples/testing/src/my_math/__init__.mojo b/examples/testing/src/my_math/__init__.mojo new file mode 100644 index 0000000000..968532820f --- /dev/null +++ b/examples/testing/src/my_math/__init__.mojo @@ -0,0 +1,51 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +# ===----------------------------------------------------------------------=== # +# Package file +# ===----------------------------------------------------------------------=== # +"""Basic mathematical utilities. + +This package defines a collection of utility functions for manipulating +integer values. + +You can import these APIs from the `my_math` package. For example: + +```mojo +from my_math import dec, inc +``` + +The `inc()` function performs a simple increment: + +```mojo +%# from testing import assert_equal +from my_math import inc +a = 1 +b = inc(a) # b = 2 +%# assert_equal(b, 2) +``` + +However, `inc()` raises an error if it would result in integer overflow: + +```mojo +c = 0 +try: + c = inc(Int.MAX) +except e: + print(e) +%# assert_equal("inc overflow", str(e)) +``` + +""" + +from .utils import dec, inc diff --git a/examples/testing/src/my_math/utils.mojo b/examples/testing/src/my_math/utils.mojo new file mode 100644 index 0000000000..8eb0d42577 --- /dev/null +++ b/examples/testing/src/my_math/utils.mojo @@ -0,0 +1,94 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +"""Implements various mathematical utilities. + +You can import these APIs from the `my_math` package. For example: + +```mojo +from my_math import inc +``` +""" + + +def inc(n: Int) -> Int: + """Returns an incremented integer value. + + ```mojo + %# from testing import assert_equal + from my_math import inc + i = 7 + j = inc(i) # j = 8 + %# assert_equal(j, 8) + ``` + + However, `inc()` raises an error if it would result in integer overflow: + + ```mojo + k = 0 + try: + k = inc(Int.MAX) + except e: + print(e) # inc overflow + %# assert_equal("inc overflow", str(e)) + ``` + + Args: + n: The integer value to increment. + + Returns: + The input value plus one. + + Raises: + An error if the incremented value exceeds `Int.MAX`. + """ + if n == Int.MAX: + raise Error("inc overflow") + return n + 1 + + +def dec(n: Int) -> Int: + """Returns a decremented integer value. + + ```mojo + %# from testing import assert_equal + from my_math import dec + i = 7 + j = dec(i) # j = 6 + %# assert_equal(j, 6) + ``` + + However, `dec()` raises an error if it would result in integer overflow: + + ```mojo + k = 0 + try: + k = dec(Int.MIN) + except e: + print(e) # inc overflow + %# assert_equal("dec overflow", str(e)) + ``` + + Args: + n: The integer value to decrement. + + Returns: + The input value minus one. + + Raises: + An error if the decremented value is less than `Int.MIN`. + + """ + if n == Int.MIN: + raise Error("dec overflow") + return n - 1 diff --git a/examples/testing/test/my_math/test_dec.mojo b/examples/testing/test/my_math/test_dec.mojo new file mode 100644 index 0000000000..7484124d6b --- /dev/null +++ b/examples/testing/test/my_math/test_dec.mojo @@ -0,0 +1,28 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from my_math import dec + +from testing import assert_equal, assert_raises + + +def test_dec_valid(): + assert_equal(dec(1), 0) + assert_equal(dec(0), -1) + + +def test_dec_min(): + with assert_raises(): + # Assign the return value to the discard pattern to prevent the Mojo + # compiler from warning that it is unused. + _ = dec(Int.MIN) diff --git a/examples/testing/test/my_math/test_inc.mojo b/examples/testing/test/my_math/test_inc.mojo new file mode 100644 index 0000000000..8b18919c75 --- /dev/null +++ b/examples/testing/test/my_math/test_inc.mojo @@ -0,0 +1,28 @@ +# ===----------------------------------------------------------------------=== # +# Copyright (c) 2025, Modular Inc. All rights reserved. +# +# Licensed under the Apache License v2.0 with LLVM Exceptions: +# https://llvm.org/LICENSE.txt +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ===----------------------------------------------------------------------=== # + +from my_math import inc + +from testing import assert_equal, assert_raises + + +def test_inc_valid(): + assert_equal(inc(0), 1) + assert_equal(inc(1), 2) + + +def test_inc_max(): + with assert_raises(): + # Assign the return value to the discard pattern to prevent the Mojo + # compiler from warning that it is unused. + _ = inc(Int.MAX) From 203c0848bd3323999e0a1fc41390ec63cad47c26 Mon Sep 17 00:00:00 2001 From: Connor Gray Date: Wed, 15 Jan 2025 17:54:42 -0600 Subject: [PATCH 32/39] [stdlib] polish: Add `StringSlice.char_slices()` + deprecate `__iter__()` method MODULAR_ORIG_COMMIT_REV_ID: a50d7efa09350c65b20877feec2d99217c8da65b Signed-off-by: Joshua James Venter --- stdlib/src/collections/string/_unicode.mojo | 22 +++++++++---------- .../src/collections/string/string_slice.mojo | 19 +++++++++++----- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/stdlib/src/collections/string/_unicode.mojo b/stdlib/src/collections/string/_unicode.mojo index e96dff1260..152ec38d54 100644 --- a/stdlib/src/collections/string/_unicode.mojo +++ b/stdlib/src/collections/string/_unicode.mojo @@ -117,19 +117,18 @@ fn is_uppercase(s: StringSlice) -> Bool: there is at least one cased character, False otherwise. """ var found = False - for c in s: - var rune = Char.ord(c) - var index = _lowercase_mapping_index(rune) + for char in s.chars(): + var index = _lowercase_mapping_index(char) if index != -1: found = True continue - index = _uppercase_mapping_index(rune) + index = _uppercase_mapping_index(char) if index != -1: return False - index = _uppercase_mapping2_index(rune) + index = _uppercase_mapping2_index(char) if index != -1: return False - index = _uppercase_mapping3_index(rune) + index = _uppercase_mapping3_index(char) if index != -1: return False return found @@ -147,21 +146,20 @@ fn is_lowercase(s: StringSlice) -> Bool: there is at least one cased character, False otherwise. """ var found = False - for c in s: - var rune = Char.ord(c) - var index = _uppercase_mapping_index(rune) + for char in s.chars(): + var index = _uppercase_mapping_index(char) if index != -1: found = True continue - index = _uppercase_mapping2_index(rune) + index = _uppercase_mapping2_index(char) if index != -1: found = True continue - index = _uppercase_mapping3_index(rune) + index = _uppercase_mapping3_index(char) if index != -1: found = True continue - index = _lowercase_mapping_index(rune) + index = _lowercase_mapping_index(char) if index != -1: return False return found diff --git a/stdlib/src/collections/string/string_slice.mojo b/stdlib/src/collections/string/string_slice.mojo index 74c471f491..4104962de4 100644 --- a/stdlib/src/collections/string/string_slice.mojo +++ b/stdlib/src/collections/string/string_slice.mojo @@ -512,7 +512,7 @@ struct StringSlice[mut: Bool, //, origin: Origin[mut]]( """ var result = String() var use_dquote = False - for s in self: + for s in self.char_slices(): use_dquote = use_dquote or (s == "'") if s == "\\": @@ -675,15 +675,14 @@ struct StringSlice[mut: Bool, //, origin: Origin[mut]]( self.unsafe_ptr(), rhs.unsafe_ptr(), min(len1, len2) ) + @deprecated("Use `str.chars()` or `str.char_slices()` instead.") fn __iter__(self) -> _StringSliceIter[origin]: """Iterate over the string, returning immutable references. Returns: An iterator of references to the string elements. """ - return _StringSliceIter[origin]( - ptr=self.unsafe_ptr(), length=self.byte_length() - ) + return self.char_slices() fn __reversed__(self) -> _StringSliceIter[origin, False]: """Iterate backwards over the string, returning immutable references. @@ -955,6 +954,16 @@ struct StringSlice[mut: Bool, //, origin: Origin[mut]]( """ return CharsIter(self) + fn char_slices(self) -> _StringSliceIter[origin]: + """Iterate over the string, returning immutable references. + + Returns: + An iterator of references to the string elements. + """ + return _StringSliceIter[origin]( + ptr=self.unsafe_ptr(), length=self.byte_length() + ) + @always_inline fn as_bytes(self) -> Span[Byte, origin]: """Get the sequence of encoded bytes of the underlying string. @@ -1265,7 +1274,7 @@ struct StringSlice[mut: Bool, //, origin: Origin[mut]]( ) else: var offset = 0 - for s in self: + for s in self.char_slices(): var b_len = s.byte_length() if not _is_newline_char(ptr, offset, ptr[offset], b_len): return False From 6816725d2ce81b9a7616ce50e8d945b6545f222f Mon Sep 17 00:00:00 2001 From: Jack Clayton Date: Wed, 15 Jan 2025 19:26:53 -0500 Subject: [PATCH 33/39] [mojo-lang] Allow keyword-only argument overloading This allows overloading keyword-only argument names, and overloading a positional arg with a keyword-only argument: ```mojo struct OverloadedKwArgs: var val: Int fn __init__(out self, single: Int): self.val = single fn __init__(out self, *, double: Int): self.val = double * 2 fn __init__(out self, *, triple: Int): self.val = triple * 3 fn main(): OverloadedKwArgs(1) # val=1 OverloadedKwArgs(double=1) # val=2 OverloadedKwArgs(triple=2) # val=3 ``` It also enables indexing overloading: ```mojo struct OverloadedKwArgs: var vals: List[Int] fn __init__(out self): self.vals = List[Int](0, 1, 2, 3, 4) fn __getitem__(self, idx: Int) -> Int: return self.vals[idx] fn __getitem__(self, *, idx2: Int) -> Int: return self.vals[idx2 * 2] fn __setitem__(mut self, idx: Int, val: Int): self.vals[idx] = val fn __setitem__(mut self, val: Int, *, idx2: Int): self.vals[idx2 * 2] = val fn main(): var x = OverloadedKwArgs() print(x[1]) # 1 print(x[idx2=1]) # 2 x[1] = 42 x[idx2=1] = 84 print(x[1]) # 42 print(x[idx2=1]) # 84 ``` MODULAR_ORIG_COMMIT_REV_ID: 3a2fbcd84ea3ecb83e30ae21d34006759d61743c Signed-off-by: Joshua James Venter --- docs/changelog.md | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index 1d8ca2919e..bb34b332c0 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -42,6 +42,62 @@ what we publish. var y : Int = x[idx] # Just works! ``` +- You can now overload positional arguments with a keyword-only argument, and + keyword-only arguments with different names: + + ```mojo + struct OverloadedKwArgs: + var val: Int + + fn __init__(out self, single: Int): + self.val = single + + fn __init__(out self, *, double: Int): + self.val = double * 2 + + fn __init__(out self, *, triple: Int): + self.val = triple * 3 + + fn main(): + OverloadedKwArgs(1) # val=1 + OverloadedKwArgs(double=1) # val=2 + OverloadedKwArgs(triple=2) # val=3 + ``` + + This also works with indexing operations: + + ```mojo + struct OverloadedKwArgs: + var vals: List[Int] + + fn __init__(out self): + self.vals = List[Int](0, 1, 2, 3, 4) + + fn __getitem__(self, idx: Int) -> Int: + return self.vals[idx] + + fn __getitem__(self, *, idx2: Int) -> Int: + return self.vals[idx2 * 2] + + fn __setitem__(mut self, idx: Int, val: Int): + self.vals[idx] = val + + fn __setitem__(mut self, val: Int, *, idx2: Int): + self.vals[idx2 * 2] = val + + + fn main(): + var x = OverloadedKwArgs() + print(x[1]) # 1 + print(x[idx2=1]) # 2 + + x[1] = 42 + x[idx2=1] = 84 + + print(x[1]) # 42 + print(x[idx2=1]) # 84 + ``` + ### Standard library changes - The `int` function to construct an `Int` has been deprecated, this was a From afb1ac0c0b20aa33366474be1817274255e6b513 Mon Sep 17 00:00:00 2001 From: soraros Date: Wed, 15 Jan 2025 18:36:59 -0800 Subject: [PATCH 34/39] [External] [stdlib] Make examples compile in `math` (#53924) [External] [stdlib] Make examples compile in `math` - This is needed because of https://github.com/modularml/mojo/issues/3828. Co-authored-by: soraros Closes modularml/mojo#3912 MODULAR_ORIG_COMMIT_REV_ID: 1b67d641b8fc389d43fab99ebf6785fc9c906d55 Signed-off-by: Joshua James Venter --- stdlib/src/math/math.mojo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/src/math/math.mojo b/stdlib/src/math/math.mojo index ec2461fe65..d2acffd50a 100644 --- a/stdlib/src/math/math.mojo +++ b/stdlib/src/math/math.mojo @@ -2588,7 +2588,7 @@ trait CeilDivable: var x: Float64 fn __ceildiv__(self, denominator: Self) -> Self: - return -(self.x // -denominator.x) + return Self(self.x // denominator.x) ``` """ @@ -2621,7 +2621,7 @@ trait CeilDivableRaising: var x: object fn __ceildiv__(self, denominator: Self) raises -> Self: - return -(self.x // -denominator.x) + return Self(self.x // denominator.x) ``` """ From e280f80dc9c723622ed9b45fde4b85ce62e2a91e Mon Sep 17 00:00:00 2001 From: abdul dakkak Date: Wed, 15 Jan 2025 18:56:04 -0800 Subject: [PATCH 35/39] [Stdlib] Simplify code for append/prepend in linked list, NFC MODULAR_ORIG_COMMIT_REV_ID: e80f95fab01d0a24aeabdfa7438e94131b3b2493 Signed-off-by: Joshua James Venter --- stdlib/src/collections/linked_list.mojo | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/stdlib/src/collections/linked_list.mojo b/stdlib/src/collections/linked_list.mojo index afa3c0b624..9591374a33 100644 --- a/stdlib/src/collections/linked_list.mojo +++ b/stdlib/src/collections/linked_list.mojo @@ -174,10 +174,9 @@ struct LinkedList[ElementType: WritableCollectionElement]: addr.init_pointee_move(node) if self: self._tail[].next = addr - self._tail = addr else: self._head = addr - self._tail = addr + self._tail = addr self._size += 1 fn prepend(mut self, owned value: ElementType): @@ -191,10 +190,9 @@ struct LinkedList[ElementType: WritableCollectionElement]: addr.init_pointee_move(node) if self: self._head[].prev = addr - self._head = addr else: - self._head = addr self._tail = addr + self._head = addr self._size += 1 fn reverse(mut self): From e68db9f9dcf7d66270dcd15ad96db99ec167180a Mon Sep 17 00:00:00 2001 From: Jack Clayton Date: Wed, 15 Jan 2025 22:10:29 -0500 Subject: [PATCH 36/39] [stdlib] Move `str` functions to `String` ctors And add deprecation warnings to the `str` functions, to be phased out to a compiler error in the release after next. MODULAR_ORIG_COMMIT_REV_ID: 54247b2e5fd77efc455237f0b372fa7c983c8cda Signed-off-by: Joshua James Venter --- docs/changelog.md | 11 ++- docs/manual/errors.mdx | 12 +-- docs/manual/functions.mdx | 4 +- docs/manual/get-started.mdx | 14 +-- docs/manual/operators.mdx | 7 +- docs/manual/parameters/index.mdx | 28 +++--- docs/manual/pointers/unsafe-pointers.mdx | 2 +- docs/manual/python/types.mdx | 13 +-- docs/manual/traits.mdx | 6 +- docs/manual/types.mdx | 29 ++++-- docs/manual/values/ownership.mdx | 6 +- docs/roadmap.md | 2 +- examples/life/test/test_gridv1.mojo | 2 +- examples/life/test/test_gridv2.mojo | 2 +- examples/matmul.mojo | 4 +- examples/operators/main.mojo | 4 +- examples/operators/test_my_complex.mojo | 4 +- examples/testing/src/my_math/__init__.mojo | 2 +- examples/testing/src/my_math/utils.mojo | 4 +- proposals/improved-hash-module.md | 2 +- stdlib/benchmarks/builtin/bench_int.mojo | 2 +- stdlib/benchmarks/builtin/bench_sort.mojo | 22 +++-- stdlib/benchmarks/collections/bench_dict.mojo | 10 +- .../benchmarks/collections/bench_string.mojo | 2 +- stdlib/benchmarks/hashlib/bench_hash.mojo | 2 +- stdlib/docs/development.md | 2 +- stdlib/docs/style-guide.md | 2 +- stdlib/src/builtin/_location.mojo | 2 +- stdlib/src/builtin/bool.mojo | 2 +- stdlib/src/builtin/char.mojo | 7 +- stdlib/src/builtin/debug_assert.mojo | 8 +- stdlib/src/builtin/float_literal.mojo | 2 +- stdlib/src/builtin/format_int.mojo | 2 +- stdlib/src/builtin/int.mojo | 4 +- stdlib/src/builtin/int_literal.mojo | 2 +- stdlib/src/builtin/object.mojo | 14 +-- stdlib/src/builtin/repr.mojo | 2 +- stdlib/src/builtin/str.mojo | 33 +++---- stdlib/src/builtin/string_literal.mojo | 38 +++---- stdlib/src/builtin/uint.mojo | 4 +- stdlib/src/collections/deque.mojo | 2 +- stdlib/src/collections/dict.mojo | 6 +- stdlib/src/collections/list.mojo | 2 +- stdlib/src/collections/string/format.mojo | 22 +++-- .../src/collections/string/inline_string.mojo | 14 +-- stdlib/src/collections/string/string.mojo | 99 +++++++++---------- .../src/collections/string/string_slice.mojo | 16 ++- stdlib/src/memory/pointer.mojo | 2 +- stdlib/src/memory/unsafe_pointer.mojo | 2 +- stdlib/src/os/_linux_aarch64.mojo | 28 +++--- stdlib/src/os/_linux_x86.mojo | 28 +++--- stdlib/src/os/_macos.mojo | 32 +++--- stdlib/src/os/fstat.mojo | 10 +- stdlib/src/os/os.mojo | 4 +- stdlib/src/os/path/path.mojo | 4 +- stdlib/src/pathlib/path.mojo | 12 +-- stdlib/src/pwd/_linux.mojo | 16 +-- stdlib/src/pwd/_macos.mojo | 16 +-- stdlib/src/python/_cpython.mojo | 6 +- stdlib/src/python/python.mojo | 2 +- stdlib/src/python/python_object.mojo | 4 +- stdlib/src/tempfile/tempfile.mojo | 8 +- stdlib/src/testing/testing.mojo | 40 +++++--- stdlib/src/time/time.mojo | 2 +- stdlib/src/utils/_serialize.mojo | 2 +- stdlib/src/utils/stringref.mojo | 11 ++- stdlib/src/utils/variant.mojo | 4 +- stdlib/src/utils/write.mojo | 4 +- stdlib/test/bit/test_bit.mojo | 2 +- stdlib/test/builtin/test_bfloat16.mojo | 2 +- stdlib/test/builtin/test_bool.mojo | 8 +- stdlib/test/builtin/test_char.mojo | 10 +- stdlib/test/builtin/test_dtype.mojo | 4 +- stdlib/test/builtin/test_error.mojo | 6 +- stdlib/test/builtin/test_file.mojo | 6 +- stdlib/test/builtin/test_format_float.mojo | 6 +- stdlib/test/builtin/test_issue_1004.mojo | 2 +- stdlib/test/builtin/test_location.mojo | 2 +- stdlib/test/builtin/test_object.mojo | 48 ++++----- stdlib/test/builtin/test_print.mojo | 2 +- stdlib/test/builtin/test_simd.mojo | 35 +++---- stdlib/test/builtin/test_slice.mojo | 2 +- stdlib/test/builtin/test_sort.mojo | 11 ++- stdlib/test/builtin/test_str.mojo | 2 +- stdlib/test/builtin/test_string_literal.mojo | 2 +- stdlib/test/builtin/test_uint.mojo | 8 +- .../string/test_inlined_string.mojo | 18 ++-- .../test/collections/string/test_string.mojo | 22 ++--- .../collections/string/test_string_slice.mojo | 50 +++++----- stdlib/test/collections/test_dict.mojo | 16 +-- .../test/collections/test_inline_array.mojo | 4 +- stdlib/test/collections/test_linked_list.mojo | 2 +- stdlib/test/hashlib/test_ahash.mojo | 12 +-- stdlib/test/hashlib/test_hasher.mojo | 2 +- stdlib/test/memory/test_memory.mojo | 40 ++++---- stdlib/test/memory/test_reference.mojo | 2 +- stdlib/test/memory/test_unsafepointer.mojo | 6 +- stdlib/test/os/path/test_isdir.mojo | 4 +- stdlib/test/os/path/test_islink.mojo | 2 +- stdlib/test/os/test_mkdir_and_rmdir.mojo | 6 +- stdlib/test/os/test_remove.mojo | 4 +- stdlib/test/os/test_stat.mojo | 2 +- stdlib/test/pathlib/test_pathlib.mojo | 20 ++-- stdlib/test/python/test_ownership.mojo | 10 +- .../python/test_python_error_handling.mojo | 6 +- stdlib/test/python/test_python_interop.mojo | 22 ++--- stdlib/test/python/test_python_object.mojo | 98 +++++++++--------- stdlib/test/python/test_python_to_mojo.mojo | 4 +- stdlib/test/random/test_random.mojo | 18 ++-- stdlib/test/tempfile/test_tempfile.mojo | 28 +++--- stdlib/test/testing/test_assert_raises.mojo | 8 +- stdlib/test/testing/test_assertion.mojo | 12 +-- stdlib/test/utils/test_index.mojo | 22 ++--- stdlib/test/utils/test_tuple.mojo | 14 +-- stdlib/test/utils/test_write.mojo | 4 +- 115 files changed, 693 insertions(+), 641 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index bb34b332c0..0dde1eb064 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -100,11 +100,12 @@ what we publish. ### Standard library changes -- The `int` function to construct an `Int` has been deprecated, this was a - temporary workaround when Mojo didn't have a way to distinguish between - implicit and explicit constructors. You can do a search and replace from - `int(` to `Int(` to update your programs, the `int` function will be removed - in the next release. +- These functions have been deprecated: `int`, `str` in favor of constructors: + `Int`, `String`. The functions were a temporary workaround for when Mojo + didn't have a way to distinguish between implicit and explicit constructors. + You can do a search and replace e.g. from `int(` to `Int(` to update your + programs. This release will show a deprecation warning for the old functions, + and they'll be removed in the next release. - `UnsafePointer`'s `bitcast` method has now been split into `bitcast` for changing the type, `origin_cast` for changing mutability, diff --git a/docs/manual/errors.mdx b/docs/manual/errors.mdx index 47e1a23711..ff7512798a 100644 --- a/docs/manual/errors.mdx +++ b/docs/manual/errors.mdx @@ -103,12 +103,12 @@ recovery that's appropriate for your application. If you provide the name of a variable after the `except` keyword, then the `Error` instance is bound to the variable if an error occurs. The `Error` type -implements the [`Writable`](/mojo/stdlib/utils/write/Writable) trait, so -you can pass it as an argument to the [`print()`](/mojo/stdlib/builtin/io/print) +implements the [`Writable`](/mojo/stdlib/utils/write/Writable) trait, so you can +pass it as an argument to the [`print()`](/mojo/stdlib/builtin/io/print) function if you'd like to print its error message to the console. It also implements the [`Stringable`](/mojo/stdlib/builtin/str/Stringable) trait, so you -can pass it to the [`str()`](/mojo/stdlib/builtin/str/str) function if you want -to extract the error message as a `String` for further processing. +can construct a `String` with `String(error)` if you want to extract the error +message as a `String` for further processing. If desired, you can re-raise an error condition from your `except` clause simply by executing a `raise` statement from within its code block. This can be either @@ -152,7 +152,7 @@ def main(): print("try =>", value[]) if value[] == 1: continue - result = str("{} incremented is {}").format(value[], incr(value[])) + result = String("{} incremented is {}").format(value[], incr(value[])) except e: print("except =>", e) else: @@ -384,7 +384,7 @@ struct ConditionalTimer: print("Elapsed time:", elapsed_time_ms, "milliseconds") fn __exit__(mut self, e: Error) raises -> Bool: - if str(e) == "just a warning": + if String(e) == "just a warning": print("Suppressing error:", e) self.__exit__() return True diff --git a/docs/manual/functions.mdx b/docs/manual/functions.mdx index b7e34a14ff..c6f51aeaf9 100644 --- a/docs/manual/functions.mdx +++ b/docs/manual/functions.mdx @@ -364,12 +364,12 @@ fn print_string(s: String): print(s, end="") fn print_many[T: Stringable, *Ts: Stringable](first: T, *rest: *Ts): - print_string(str(first)) + print_string(String(first)) @parameter fn print_elt[T: Stringable](a: T): print_string(" ") - print_string(str(a)) + print_string(String(a)) rest.each[print_elt]() print_many("Bob") ``` diff --git a/docs/manual/get-started.mdx b/docs/manual/get-started.mdx index 9a3aaeff9b..08e6f575e0 100644 --- a/docs/manual/get-started.mdx +++ b/docs/manual/get-started.mdx @@ -647,11 +647,11 @@ produces the same output. You can verify that by running the program again. ## 9. Implement support for the `StringableRaising` trait -You can pass most Mojo types to the built-in `str()` function to produce a +You can convert most Mojo types to `String` using `String(my_val)` to produce a `String` representation of that instance. But you'll get an error if you try to do that with our current implementation of `Grid`. So let's fix that. -Because the Mojo compiler performs static type checking, a function like `str()` +Because the Mojo compiler performs static type checking, a `String` constructor can accept a value only if its type implements some required behavior—in this case, it only accepts types that can generate a `String` representation. @@ -663,7 +663,7 @@ any type that conform to a specified trait. (This type of function is sometimes referred to as a [*generic* function](/mojo/manual/parameters/#parameters-and-generics).) -In the case of `str()`, it requires a type to conform to either the `Stringable` +In the case of `String()`, it requires a type to conform to either the `Stringable` or `StringableRaising` trait. Each trait requires a conforming type to implement a `__str__()` method that returns a `String` representation. The only difference between the two traits is that `Stringable` requires that the method *cannot* @@ -692,13 +692,13 @@ struct Grid(StringableRaising): ... ``` -Now let's verify that `str()` works with an instance of `Grid`. +Now let's verify that `String()` works with an instance of `Grid`. ```mojo title="life.mojo" def main(): ... start = Grid(8, 8, glider) - print(str(start)) + print(String(start)) ``` If you run the program again, you should still see the same glider pattern as before. @@ -896,7 +896,7 @@ and print it. def main(): start = Grid.random(8, 16) - print(str(start)) + print(String(start)) ``` Run the program a few times to verify that it generates a different grid each @@ -1009,7 +1009,7 @@ from gridv1 import Grid def run_display(owned grid: Grid) -> None: while True: - print(str(grid)) + print(String(grid)) print() if input("Enter 'q' to quit or press to continue: ") == "q": break diff --git a/docs/manual/operators.mdx b/docs/manual/operators.mdx index b4ac20d127..3ae0802151 100644 --- a/docs/manual/operators.mdx +++ b/docs/manual/operators.mdx @@ -1100,7 +1100,7 @@ c2: Real: 3.1415899999999999; Imaginary: 0.0 To make it simpler to print `Complex` values, let's implement the [Writable](/mojo/stdlib/utils/write/Writable) trait. While we're at it, let's also implement the [`Stringable`](/mojo/stdlib/builtin/str/Stringable) trait so -that we can use the `str()` function to generate a `String` representation of a +that we can use the `String()` constructor to generate a `String` representation of a `Complex` value. You can find out more about these traits and their associated methods in [The `Stringable`, `Representable`, and `Writable` traits](/mojo/manual/traits#the-stringable-representable-and-writable-traits). @@ -1137,13 +1137,14 @@ between defining functions with `def` and `fn`. ::: Now we can print a `Complex` value directly, and we can explicitly generate a -`String` representation by passing a `Complex` value to `str()`. +`String` representation by passing a `Complex` value to `String.write()` which +constructs a new `String` from all the arguments passed to it. ```mojo c3 = Complex(3.14159, -2.71828) print("c3 =", c3) -var msg: String = "The value is: " + str(c3) +var msg = String.write("The value is: ", c3) print(msg) ``` diff --git a/docs/manual/parameters/index.mdx b/docs/manual/parameters/index.mdx index c602ce9522..084aba0ca8 100644 --- a/docs/manual/parameters/index.mdx +++ b/docs/manual/parameters/index.mdx @@ -103,7 +103,7 @@ conforms to the [`Stringable`](/mojo/stdlib/builtin/str/Stringable) trait: fn repeat[MsgType: Stringable, count: Int](msg: MsgType): @parameter for i in range(count): - print(str(msg)) + print(String(msg)) # Must use keyword parameter for `count` repeat[count=2](42) @@ -125,7 +125,7 @@ by the argument. Now you can pass the following parameter `count` positionally: fn repeat[MsgType: Stringable, //, count: Int](msg: MsgType): @parameter for i in range(count): - print(str(msg)) + print(String(msg)) # MsgType is always inferred, so first positional keyword `2` is passed to `count` repeat[2](42) @@ -252,7 +252,7 @@ struct Container[ElementType: CollectionElement]: def __str__[StrElementType: StringableCollectionElement, //]( self: Container[StrElementType]) -> String: - return str(self.element) + return String(self.element) def use_container(): float_container = Container(5) @@ -282,7 +282,7 @@ This trait must be a superset of `ElementType`'s original trait: for example, all of requirements of the original trait. Note that the `use_container()` function calls the `__str__()` method directly, -rather than calling `str(float_container)`. One current limitation of +rather than calling `String(float_container)`. One current limitation of conditional conformance is that Mojo can't recognize the struct `Container[Int]` as conforming to `Stringable`, even though the `__str__()` method is implemented for any `ElementType` that's also `Stringable`. @@ -545,11 +545,11 @@ struct Two[Type: StringableCollectionElement]: fn __init__(out self, one: One[Type], another: One[Type]): self.val1 = one.value self.val2 = another.value - print(str(self.val1), str(self.val2)) + print(String(self.val1), String(self.val2)) @staticmethod fn fire(thing1: One[Type], thing2: One[Type]): - print("🔥", str(thing1.value), str(thing2.value)) + print("🔥", String(thing1.value), String(thing2.value)) def use_two(): s3 = Two(One("infer"), One("me")) @@ -1163,9 +1163,7 @@ For example, suppose we have a `Fudge` struct with three parameters: @value struct Fudge[sugar: Int, cream: Int, chocolate: Int = 7](Stringable): fn __str__(self) -> String: - return str("Fudge (") + str(sugar) + "," + - str(cream) + "," + str(chocolate) + ")" - + return String.write("Fudge (", sugar, ",", cream, ",", chocolate, ")") ``` We can write a function that takes a `Fudge` argument with just one bound @@ -1173,7 +1171,7 @@ parameter (it's *partially bound*): ```mojo fn eat(f: Fudge[5, *_]): - print("Ate " + str(f)) + print("Ate " + String(f)) ``` The `eat()` function takes a `Fudge` struct with the first parameter (`sugar`) @@ -1185,7 +1183,7 @@ on the `eat` function. In practice, this is roughly equivalent to writing: ```mojo fn eat[cr: Int, ch: Int](f: Fudge[5, cr, ch]): - print("Ate", str(f)) + print("Ate", String(f)) ``` In both cases, we can call the function by passing in an instance with the @@ -1218,7 +1216,7 @@ parameter value with a single underscore (`_`): ```mojo fn devour(f: Fudge[_, 6, _]): - print("Devoured", str(f)) + print("Devoured", String(f)) ``` Again, the unbound parameters (`sugar` and `chocolate`) are added as implicit @@ -1228,7 +1226,7 @@ parameters, `su` and `ch`: ```mojo fn devour[su: Int, ch: Int](f: Fudge[su, 6, ch]): - print("Devoured", str(f)) + print("Devoured", String(f)) ``` You can also specify parameters by keyword, or mix positional and keyword @@ -1239,7 +1237,7 @@ And `cream` is explicitly bound to the value 6: ```mojo fn devour(f: Fudge[_, chocolate=_, cream=6]): - print("Devoured", str(f)) + print("Devoured", String(f)) ``` All three versions of the `devour()` function work with the following calls: @@ -1261,7 +1259,7 @@ for example: ```mojo fn nibble(f: Fudge[5]): - print("Ate", str(f)) + print("Ate", String(f)) nibble(Fudge[5, 4, 7]()) diff --git a/docs/manual/pointers/unsafe-pointers.mdx b/docs/manual/pointers/unsafe-pointers.mdx index 9bfb18a23a..69acb084b0 100644 --- a/docs/manual/pointers/unsafe-pointers.mdx +++ b/docs/manual/pointers/unsafe-pointers.mdx @@ -168,7 +168,7 @@ type](/mojo/manual/types#register-passable-memory-only-and-trivial-types) (like `Int`) or a newly-constructed, "owned" value: ```mojo -str_ptr.init_pointee_move(str("Owned string")) +str_ptr.init_pointee_move(String("Owned string")) ``` Alternately, you can get a pointer to an existing value using the static diff --git a/docs/manual/python/types.mdx b/docs/manual/python/types.mdx index 4aab0ace57..ee0f0d17a5 100644 --- a/docs/manual/python/types.mdx +++ b/docs/manual/python/types.mdx @@ -149,18 +149,19 @@ Currently `PythonObject` conforms to the [`Boolable`](/mojo/stdlib/builtin/bool/Boolable), [`Floatable`](/mojo/stdlib/builtin/floatable/Floatable/), and [`Intable`](/mojo/stdlib/builtin/int/Intable) traits, which means you can -convert Python values to Mojo `String`, `Bool`, and `Float64` types using the -[`str()`](/mojo/stdlib/builtin/str/str), +convert Python values to Mojo `Bool` and `Float64` types using the [`bool()`](/mojo/stdlib/builtin/bool/bool-function) and -[`float()`](/mojo/stdlib/builtin/floatable/float/) built-in functions, and -construct an `Int` using the [`Int()`](/mojo/stdlib/builtin/int/Int/#__init__) -constructor. `PythonObject` also conforms to the +[`float()`](/mojo/stdlib/builtin/floatable/float/) built-in functions, construct +an `Int` using the [`Int()`](/mojo/stdlib/builtin/int/Int/#__init__) +constructor, and construct a `String` using the +[`String()`](/mojo/stdlib/collections/string/String/#__init__) constructor. +`PythonObject` also conforms to the [`Writable`](/mojo/stdlib/utils/write/Writable) trait so that you can print Python values using the built-in [`print()`](/mojo/stdlib/builtin/io/print) function. ```mojo -var s: String = str(py_string) +var s: String = String(py_string) var b: Bool = bool(py_bool) var f: Float64 = float(py_float) var i: Int = Int(py_int) diff --git a/docs/manual/traits.mdx b/docs/manual/traits.mdx index a779396a65..c4d62de147 100644 --- a/docs/manual/traits.mdx +++ b/docs/manual/traits.mdx @@ -385,13 +385,11 @@ True ### The `Stringable`, `Representable`, and `Writable` traits The [`Stringable`](/mojo/stdlib/builtin/str/Stringable) trait identifies a type -that can be implicitly converted to +that can be explicitly converted to [`String`](/mojo/stdlib/collections/string/String). The [`StringableRaising`](/mojo/stdlib/builtin/str/StringableRaising) trait describes a type that can be converted to a `String`, but the conversion might -raise an error. Any type that conforms to `Stringable` or `StringableRaising` -also works with the built-in [`str()`](/mojo/stdlib/builtin/str/str) function to -explicitly return a `String`. These traits also mean that the type can support +raise an error. These traits also mean that the type can support both the `{!s}` and `{}` format specifiers of the `String` class's [`format()`](/mojo/stdlib/collections/string/String#format) method. These traits require the type to define the diff --git a/docs/manual/types.mdx b/docs/manual/types.mdx index ee6ddcf586..6f46013f86 100644 --- a/docs/manual/types.mdx +++ b/docs/manual/types.mdx @@ -322,11 +322,23 @@ Testing Mojo strings Most standard library types conform to the [`Stringable`](/mojo/stdlib/builtin/str/Stringable) trait, which represents -a type that can be converted to a string. Use `str(value)` to +a type that can be converted to a string. Use `String(value)` to explicitly convert a value to a string: ```mojo -var s = str("Items in list: ") + str(5) +var s = String("Items in list: ") + String(5) +print(s) +``` + +```output +Items in list: 5 +``` + +Or use `String.write` to take variadic `Stringable` types, so you don't have to +call `String()` on each value: + +```mojo +var s = String.write("Items in list: ", 5) print(s) ``` @@ -362,9 +374,8 @@ Note that the triple double quote form is also used for API documentation strings. Unlike `IntLiteral` and `FloatLiteral`, `StringLiteral` doesn't automatically -materialize to a runtime type. In some cases, you may need to manually convert -`StringLiteral` values to `String` using the built-in -[`str()`](/mojo/stdlib/builtin/str/str) method. +materialize to a runtime type. In some cases, you may need to explicitly convert +`StringLiteral` values to `String`. ```mojo # Variable is type `StringLiteral` @@ -374,7 +385,7 @@ var s1 = "Example" var s2: String = "Example" # Variable is type `String` -var s3 = str("Example") +var s3 = String("Example") ``` ## Booleans @@ -428,7 +439,7 @@ same tuple from the previous example with implicit typing instead of explicit, we must also convert `"Example"` from type `StringLiteral` to type `String`. ```mojo -example_tuple = (1, str("Example")) +example_tuple = (1, String("Example")) s = example_tuple.get[1, String]() print(s) ``` @@ -672,7 +683,7 @@ results in undefined behavior, so you should always guard a call to `value()` inside a conditional that checks whether a value exists. ```mojo -var opt: Optional[String] = str("Testing") +var opt: Optional[String] = String("Testing") if opt: var value_ref = opt.value() print(value_ref) @@ -689,7 +700,7 @@ value if there is one, or a user-specified default value otherwise: var custom_greeting: Optional[String] = None print(custom_greeting.or_else("Hello")) -custom_greeting = str("Hi") +custom_greeting = String("Hi") print(custom_greeting.or_else("Hello")) ``` diff --git a/docs/manual/values/ownership.mdx b/docs/manual/values/ownership.mdx index e8d201e8b6..817f43ef4c 100644 --- a/docs/manual/values/ownership.mdx +++ b/docs/manual/values/ownership.mdx @@ -256,7 +256,7 @@ fn append_twice(mut s: String, other: String): s += other fn invalid_access(): - var my_string = str("o") + var my_string = String("o") # error: passing `my_string` mut is invalid since it is also passed # read. @@ -274,8 +274,8 @@ reference (or need to pass the same value to two arguments) is to make a copy: ```mojo fn valid_access(): - var my_string = str("o") - var other_string = str(my_string) + var my_string = String("o") + var other_string = String(my_string) append_twice(my_string, other_string) print(my_string) ``` diff --git a/docs/roadmap.md b/docs/roadmap.md index 46df347afd..8ffd0fa4f8 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -472,5 +472,5 @@ converting string literals to `String` values. For example: ```mojo var h: String = "hello" # or -print(g or str("hello")) +print(g or String("hello")) ``` diff --git a/examples/life/test/test_gridv1.mojo b/examples/life/test/test_gridv1.mojo index bded4cc2f5..19e0d4c8a0 100644 --- a/examples/life/test/test_gridv1.mojo +++ b/examples/life/test/test_gridv1.mojo @@ -44,7 +44,7 @@ def test_gridv1_index(): def test_gridv1_str(): grid = Grid(4, 4, data4x4) - grid_str = str(grid) + grid_str = String(grid) assert_equal(str4x4, grid_str) diff --git a/examples/life/test/test_gridv2.mojo b/examples/life/test/test_gridv2.mojo index 1987272743..cc251a9d6b 100644 --- a/examples/life/test/test_gridv2.mojo +++ b/examples/life/test/test_gridv2.mojo @@ -53,7 +53,7 @@ def test_gridv2_index(): def test_gridv2_str(): grid = grid4x4() - grid_str = str(grid) + grid_str = String(grid) assert_equal(str4x4, grid_str) diff --git a/examples/matmul.mojo b/examples/matmul.mojo index ad81185519..44638daf34 100644 --- a/examples/matmul.mojo +++ b/examples/matmul.mojo @@ -84,7 +84,7 @@ def run_matmul_python() -> Float64: var pymatmul: PythonObject = Python.import_module("pymatmul") var py = Python.import_module("builtins") - var gflops = pymatmul.benchmark_matmul_python(128, 128, 128).to_float64() + var gflops = float(pymatmul.benchmark_matmul_python(128, 128, 128)) py.print(py.str("{:<18}{:>8.3f} GFLOPS").format("Python:", gflops)) return gflops @@ -94,7 +94,7 @@ def run_matmul_numpy() -> Float64: var pymatmul: PythonObject = Python.import_module("pymatmul") var py = Python.import_module("builtins") - var gflops = pymatmul.benchmark_matmul_numpy(M, N, K).to_float64() + var gflops = float(pymatmul.benchmark_matmul_numpy(M, N, K)) py.print(py.str("{:<18}{:>8.3f} GFLOPS").format("Numpy:", gflops)) return gflops diff --git a/examples/operators/main.mojo b/examples/operators/main.mojo index 413b68cd10..1cffa1cbbc 100644 --- a/examples/operators/main.mojo +++ b/examples/operators/main.mojo @@ -24,10 +24,10 @@ def main(): print() - # Examples of using Complex values with str(), repr(), and print() + # Examples of using Complex values with String(), repr(), and print() c3 = Complex(3.14159, -2.71828) print("c3 =", c3) - var msg: String = "The value is: " + str(c3) + var msg: String = "The value is: " + String(c3) print(msg) print(String("{!r}").format(c3)) diff --git a/examples/operators/test_my_complex.mojo b/examples/operators/test_my_complex.mojo index 1e6481aef7..2846f01bea 100644 --- a/examples/operators/test_my_complex.mojo +++ b/examples/operators/test_my_complex.mojo @@ -35,7 +35,7 @@ def test_str(): str1 = "({} + {}i)".format(re1, im1) out_str1 = String() c1 = Complex(re1, im1) - assert_equal(str1, str(c1)) + assert_equal(str1, String(c1)) c1.write_to(out_str1) assert_equal(str1, out_str1) @@ -45,7 +45,7 @@ def test_str(): str2 = "({} - {}i)".format(re2, abs(im2)) out_str2 = String() c2 = Complex(re2, im2) - assert_equal(str2, str(c2)) + assert_equal(str2, String(c2)) c2.write_to(out_str2) assert_equal(str2, out_str2) diff --git a/examples/testing/src/my_math/__init__.mojo b/examples/testing/src/my_math/__init__.mojo index 968532820f..79dd92b79d 100644 --- a/examples/testing/src/my_math/__init__.mojo +++ b/examples/testing/src/my_math/__init__.mojo @@ -43,7 +43,7 @@ try: c = inc(Int.MAX) except e: print(e) -%# assert_equal("inc overflow", str(e)) +%# assert_equal("inc overflow", String(e)) ``` """ diff --git a/examples/testing/src/my_math/utils.mojo b/examples/testing/src/my_math/utils.mojo index 8eb0d42577..000fa023cd 100644 --- a/examples/testing/src/my_math/utils.mojo +++ b/examples/testing/src/my_math/utils.mojo @@ -40,7 +40,7 @@ def inc(n: Int) -> Int: k = inc(Int.MAX) except e: print(e) # inc overflow - %# assert_equal("inc overflow", str(e)) + %# assert_equal("inc overflow", String(e)) ``` Args: @@ -76,7 +76,7 @@ def dec(n: Int) -> Int: k = dec(Int.MIN) except e: print(e) # inc overflow - %# assert_equal("dec overflow", str(e)) + %# assert_equal("dec overflow", String(e)) ``` Args: diff --git a/proposals/improved-hash-module.md b/proposals/improved-hash-module.md index 1e4dd64b13..22643e7a7a 100644 --- a/proposals/improved-hash-module.md +++ b/proposals/improved-hash-module.md @@ -224,7 +224,7 @@ fn _DJBX33A_SECRET() -> UInt64: return bitcast[DType.uint64](Int64(Int(secret_string))) except: var value = random_si64(Int64.MIN, Int64.MAX) - _ = setenv("DJBX33A_SECRET", str(value)) + _ = setenv("DJBX33A_SECRET", String(value)) return bitcast[DType.uint64](value) struct DJBX33A_Hasher[custom_secret: UInt64 = 0](Hasher): diff --git a/stdlib/benchmarks/builtin/bench_int.mojo b/stdlib/benchmarks/builtin/bench_int.mojo index 2d65c690c3..efc4b171a5 100644 --- a/stdlib/benchmarks/builtin/bench_int.mojo +++ b/stdlib/benchmarks/builtin/bench_int.mojo @@ -26,7 +26,7 @@ fn bench_stringify_small_integers(mut b: Bencher) raises: @parameter fn call_fn(): for i in range(1_000): - var a = str(i) + var a = String(i) benchmark.keep(bool(a)) b.iter[call_fn]() diff --git a/stdlib/benchmarks/builtin/bench_sort.mojo b/stdlib/benchmarks/builtin/bench_sort.mojo index 7c70e7ebb6..addf6c200c 100644 --- a/stdlib/benchmarks/builtin/bench_sort.mojo +++ b/stdlib/benchmarks/builtin/bench_sort.mojo @@ -147,13 +147,13 @@ fn bench_tiny_list_sort[type: DType](mut m: Bench) raises: _ = list^ m.bench_function[bench_sort_list]( - BenchId("std_sort_random_" + str(count) + "_" + str(type)) + BenchId("std_sort_random_" + String(count) + "_" + String(type)) ) m.bench_function[bench_small_sort]( - BenchId("sml_sort_random_" + str(count) + "_" + str(type)) + BenchId("sml_sort_random_" + String(count) + "_" + String(type)) ) m.bench_function[bench_insertion_sort]( - BenchId("ins_sort_random_" + str(count) + "_" + str(type)) + BenchId("ins_sort_random_" + String(count) + "_" + String(type)) ) @@ -202,10 +202,10 @@ fn bench_small_list_sort[type: DType](mut m: Bench, count: Int) raises: _ = list^ m.bench_function[bench_sort_list]( - BenchId("std_sort_random_" + str(count) + "_" + str(type)) + BenchId("std_sort_random_" + String(count) + "_" + String(type)) ) m.bench_function[bench_insertion_sort]( - BenchId("ins_sort_random_" + str(count) + "_" + str(type)) + BenchId("ins_sort_random_" + String(count) + "_" + String(type)) ) @@ -254,11 +254,11 @@ fn bench_large_list_sort[type: DType](mut m: Bench, count: Int) raises: _ = list^ m.bench_function[bench_sort_list]( - BenchId("std_sort_random_" + str(count) + "_" + str(type)) + BenchId("std_sort_random_" + String(count) + "_" + String(type)) ) m.bench_function[bench_heap_sort]( - BenchId("heap_sort_random_" + str(count) + "_" + str(type)) + BenchId("heap_sort_random_" + String(count) + "_" + String(type)) ) @@ -307,10 +307,14 @@ fn bench_low_cardinality_list_sort(mut m: Bench, count: Int, delta: Int) raises: _ = list^ m.bench_function[bench_sort_list]( - BenchId("std_sort_low_card_" + str(count) + "_delta_" + str(delta)) + BenchId( + "std_sort_low_card_" + String(count) + "_delta_" + String(delta) + ) ) m.bench_function[bench_heap_sort]( - BenchId("heap_sort_low_card_" + str(count) + "_delta_" + str(delta)) + BenchId( + "heap_sort_low_card_" + String(count) + "_delta_" + String(delta) + ) ) diff --git a/stdlib/benchmarks/collections/bench_dict.mojo b/stdlib/benchmarks/collections/bench_dict.mojo index e5d4ba2e37..3a740b96f9 100644 --- a/stdlib/benchmarks/collections/bench_dict.mojo +++ b/stdlib/benchmarks/collections/bench_dict.mojo @@ -134,10 +134,10 @@ def main(): for i in range(len(sizes)): alias size = sizes[i] m.bench_function[bench_dict_insert[size]]( - BenchId("bench_dict_insert[" + str(size) + "]") + BenchId("bench_dict_insert[" + String(size) + "]") ) m.bench_function[bench_dict_lookup[size]]( - BenchId("bench_dict_lookup[" + str(size) + "]") + BenchId("bench_dict_lookup[" + String(size) + "]") ) m.dump_report() @@ -147,5 +147,9 @@ def main(): alias size = sizes[i] var mem_s = total_bytes_used(make_dict[size]()) print( - '"bench_dict_memory_size[' + str(size) + ']",' + str(mem_s) + ",0" + '"bench_dict_memory_size[' + + String(size) + + ']",' + + String(mem_s) + + ",0" ) diff --git a/stdlib/benchmarks/collections/bench_string.mojo b/stdlib/benchmarks/collections/bench_string.mojo index ee7647989a..bcbf29a0c0 100644 --- a/stdlib/benchmarks/collections/bench_string.mojo +++ b/stdlib/benchmarks/collections/bench_string.mojo @@ -262,7 +262,7 @@ def main(): alias fname = filenames[j] alias old = old_chars[j] alias new = new_chars[j] - suffix = "[" + str(length) + "]" # "(" + fname + ")" + suffix = "[" + String(length) + "]" # "(" + fname + ")" m.bench_function[bench_string_count[length, fname, old]]( BenchId("bench_string_count" + suffix) ) diff --git a/stdlib/benchmarks/hashlib/bench_hash.mojo b/stdlib/benchmarks/hashlib/bench_hash.mojo index 6d2ba54044..0d95cc9afe 100644 --- a/stdlib/benchmarks/hashlib/bench_hash.mojo +++ b/stdlib/benchmarks/hashlib/bench_hash.mojo @@ -586,7 +586,7 @@ fn gen_word_pairs[words: String = words_en]() -> List[String]: try: var list = words.split(",") for w in list: - var w1 = str(w[].strip()) + var w1 = String(w[].strip()) for w in list: var w2 = w[].strip() result.append(w1 + " " + w2) diff --git a/stdlib/docs/development.md b/stdlib/docs/development.md index 024dc87b6c..ef21e6fb81 100644 --- a/stdlib/docs/development.md +++ b/stdlib/docs/development.md @@ -239,7 +239,7 @@ fn get_cwd_and_paths() raises -> List[String]: result = List[String]() result.append(pathlib.get_cwd_message()) for path in cwd().listdir(): - result.append(str(path[])) + result.append(String(path[])) ``` This won't work because it's importing `pathlib` from the `stdlib.mojopkg` that diff --git a/stdlib/docs/style-guide.md b/stdlib/docs/style-guide.md index 82002c152c..e2298d1b66 100644 --- a/stdlib/docs/style-guide.md +++ b/stdlib/docs/style-guide.md @@ -371,7 +371,7 @@ a closure as a parameter that only runs when assertions are enabled: tensor = Tensor[DType.uint8, 1](TensorShape(1), cpu_device()) fn _test_cpu() capturing -> Bool: - return "cpu" in str(tensor._device) + return "cpu" in String(tensor._device) debug_assert[_test_cpu]("This code is only runnable on CPU") ``` diff --git a/stdlib/src/builtin/_location.mojo b/stdlib/src/builtin/_location.mojo index 463cba7b08..410d332e66 100644 --- a/stdlib/src/builtin/_location.mojo +++ b/stdlib/src/builtin/_location.mojo @@ -40,7 +40,7 @@ struct _SourceLocation(Writable, Stringable): Args: msg: The message to attach the prefix to. """ - return "At " + str(self) + ": " + str(msg) + return "At " + String(self) + ": " + String(msg) fn write_to[W: Writer](self, mut writer: W): """ diff --git a/stdlib/src/builtin/bool.mojo b/stdlib/src/builtin/bool.mojo index 213d080e21..3ca5f39680 100644 --- a/stdlib/src/builtin/bool.mojo +++ b/stdlib/src/builtin/bool.mojo @@ -248,7 +248,7 @@ struct Bool( Returns: A string representation. """ - return str(self) + return String(self) @always_inline("nodebug") fn __int__(self) -> Int: diff --git a/stdlib/src/builtin/char.mojo b/stdlib/src/builtin/char.mojo index 261fc2ffeb..51e7769704 100644 --- a/stdlib/src/builtin/char.mojo +++ b/stdlib/src/builtin/char.mojo @@ -254,7 +254,12 @@ struct Char(CollectionElement, EqualityComparable, Intable, Stringable): Returns: A string containing this single character. """ - return String(self) + var char_len = self.utf8_byte_length() + var buffer = List[Byte](capacity=char_len + 1) + _ = self.unsafe_write_utf8(buffer.unsafe_ptr()) + buffer.unsafe_ptr()[char_len] = 0 + buffer.size = char_len + 1 + return String(buffer^) # ===-------------------------------------------------------------------===# # Methods diff --git a/stdlib/src/builtin/debug_assert.mojo b/stdlib/src/builtin/debug_assert.mojo index 52dde896aa..896368dba2 100644 --- a/stdlib/src/builtin/debug_assert.mojo +++ b/stdlib/src/builtin/debug_assert.mojo @@ -113,7 +113,7 @@ fn debug_assert[ ```mojo person = "name: john, age: 50" name = "john" - debug_assert(str("name: ") + name == person, "unexpected name") + debug_assert(String("name: ") + name == person, "unexpected name") ``` This will have a runtime penality due to allocating a `String` in the @@ -122,7 +122,7 @@ fn debug_assert[ ```mojo fn check_name() capturing -> Bool: - return str("name: ") + name == person + return String("name: ") + name == person debug_assert[check_name]("unexpected name") ``` @@ -196,7 +196,7 @@ fn debug_assert[ ```mojo person = "name: john, age: 50" name = "john" - debug_assert(str("name: ") + name == person, "unexpected name") + debug_assert(String("name: ") + name == person, "unexpected name") ``` This will have a runtime penality due to allocating a `String` in the @@ -205,7 +205,7 @@ fn debug_assert[ ```mojo fn check_name() capturing -> Bool: - return str("name: ") + name == person + return String("name: ") + name == person debug_assert[check_name]("unexpected name") ``` diff --git a/stdlib/src/builtin/float_literal.mojo b/stdlib/src/builtin/float_literal.mojo index 6cee98bafa..9ddc2de605 100644 --- a/stdlib/src/builtin/float_literal.mojo +++ b/stdlib/src/builtin/float_literal.mojo @@ -122,7 +122,7 @@ struct FloatLiteral( Returns: A string representation. """ - return str(Float64(self)) + return String(Float64(self)) @always_inline("nodebug") fn __int_literal__(self) -> IntLiteral: diff --git a/stdlib/src/builtin/format_int.mojo b/stdlib/src/builtin/format_int.mojo index 79726e1a99..c54b602d19 100644 --- a/stdlib/src/builtin/format_int.mojo +++ b/stdlib/src/builtin/format_int.mojo @@ -225,7 +225,7 @@ fn _try_format_int( # incompatible radix and custom digit chars, which we aren't doing # above. return abort[String]( - "unexpected exception formatting value as hexadecimal: " + str(e) + "unexpected exception formatting value as hexadecimal: " + String(e) ) diff --git a/stdlib/src/builtin/int.mojo b/stdlib/src/builtin/int.mojo index abc536abb9..662ee68de0 100644 --- a/stdlib/src/builtin/int.mojo +++ b/stdlib/src/builtin/int.mojo @@ -209,7 +209,7 @@ trait ImplicitlyIntable(Intable): # ===----------------------------------------------------------------------=== # -# FIXME(25.1): Move `int` deprecation warnings to a compiler error +# FIXME(25.2): Move `int` deprecation warnings to a compiler error @deprecated( "the `int` function is deprecated, use the `Int` constructor instead." ) @@ -1149,7 +1149,7 @@ struct Int( Returns: A string representation. """ - return str(self) + return String(self) fn __hash__(self) -> UInt: """Hash the int using builtin hash. diff --git a/stdlib/src/builtin/int_literal.mojo b/stdlib/src/builtin/int_literal.mojo index f7b72d9ea0..c114104ea6 100644 --- a/stdlib/src/builtin/int_literal.mojo +++ b/stdlib/src/builtin/int_literal.mojo @@ -701,7 +701,7 @@ struct IntLiteral( Returns: The value as a string. """ - return str(Int(self)) + return String(Int(self)) @always_inline fn __ceildiv__(self, denominator: Self) -> Self: diff --git a/stdlib/src/builtin/object.mojo b/stdlib/src/builtin/object.mojo index a20b4b31c3..94ee27873b 100644 --- a/stdlib/src/builtin/object.mojo +++ b/stdlib/src/builtin/object.mojo @@ -568,18 +568,18 @@ struct _ObjectImpl( writer.write("None") return if self.is_bool(): - writer.write(str(self.get_as_bool())) + writer.write(String(self.get_as_bool())) return if self.is_int(): - writer.write(str(self.get_as_int())) + writer.write(String(self.get_as_int())) return if self.is_float(): - writer.write(str(self.get_as_float())) + writer.write(String(self.get_as_float())) return if self.is_str(): writer.write( "'" - + str( + + String( StringRef( self.get_as_string().data, self.get_as_string().length ) @@ -597,7 +597,7 @@ struct _ObjectImpl( for j in range(self.get_list_length()): if j != 0: writer.write(", ") - writer.write(str(object(self.get_list_element(j)))) + writer.write(String(object(self.get_list_element(j)))) writer.write("]") return @@ -609,9 +609,9 @@ struct _ObjectImpl( writer.write(", ") writer.write( "'" - + str(entry[].key) + + String(entry[].key) + "' = " - + str(object(entry[].value.copy())) + + String(object(entry[].value.copy())) ) print_sep = True writer.write("}") diff --git a/stdlib/src/builtin/repr.mojo b/stdlib/src/builtin/repr.mojo index 5ea538abce..9fd07cdc43 100644 --- a/stdlib/src/builtin/repr.mojo +++ b/stdlib/src/builtin/repr.mojo @@ -50,7 +50,7 @@ trait Representable: This is typically used for debugging, so it is important that the representation is information-rich and unambiguous. Note that when computing the string representation of a collection (`Dict`, `List`, `Set`, etc...), - the `repr` function is called on each element, not the `str()` function. + the `repr` function is called on each element, not the `String()` function. """ fn __repr__(self) -> String: diff --git a/stdlib/src/builtin/str.mojo b/stdlib/src/builtin/str.mojo index 93f1482cf2..f32bf25ee1 100644 --- a/stdlib/src/builtin/str.mojo +++ b/stdlib/src/builtin/str.mojo @@ -28,7 +28,7 @@ trait Stringable: Any type that conforms to `Stringable` or [`StringableRaising`](/mojo/stdlib/builtin/str/StringableRaising) works with the built-in [`print()`](/mojo/stdlib/builtin/io/print) and - [`str()`](/mojo/stdlib/builtin/str/str) functions. + [`String()`](/mojo/stdlib/builtin/str/str) functions. The `Stringable` trait requires the type to define the `__str__()` method. For example: @@ -42,12 +42,12 @@ trait Stringable: return self.s ``` - Now you can pass an instance of `Foo` to the `str()` function to get back a + Now you can pass an instance of `Foo` to the `String()` function to get back a `String`: ```mojo var foo = Foo("test") - print(str(foo) == "test") + print(String(foo) == "test") ``` ```plaintext @@ -83,7 +83,7 @@ trait StringableRaising: [`Stringable`](/mojo/stdlib/builtin/str/Stringable) or `StringableRaising` works with the built-in [`print()`](/mojo/stdlib/builtin/io/print) and - [`str()`](/mojo/stdlib/builtin/str/str) functions. + [`String()`](/mojo/stdlib/builtin/str/str) functions. The `StringableRaising` trait requires the type to define the `__str__()` method, which can raise an error. For example: @@ -99,13 +99,13 @@ trait StringableRaising: return self.s ``` - Now you can pass an instance of `Foo` to the `str()` function to get back a + Now you can pass an instance of `Foo` to the `String()` function to get back a `String`: ```mojo fn main() raises: var foo = Foo("test") - print(str(foo) == "test") + print(String(foo) == "test") ``` ```plaintext @@ -130,6 +130,10 @@ trait StringableRaising: # ===----------------------------------------------------------------------=== # +# FIXME(25.2): Move `str` deprecation warnings to a compiler error +@deprecated( + "the `str` function is deprecated, use the `String` constructor instead." +) @no_inline fn str[T: Stringable](value: T) -> String: """Get the string representation of a value. @@ -146,19 +150,10 @@ fn str[T: Stringable](value: T) -> String: return value.__str__() -@no_inline -fn str(value: None) -> String: - """Get the string representation of the `None` type. - - Args: - value: The object to get the string representation of. - - Returns: - The string representation of the object. - """ - return "None" - - +# FIXME(25.2): Move `str` deprecation warnings to a compiler error +@deprecated( + "the `str` function is deprecated, use the `String` constructor instead." +) @no_inline fn str[T: StringableRaising](value: T) raises -> String: """Get the string representation of a value. diff --git a/stdlib/src/builtin/string_literal.mojo b/stdlib/src/builtin/string_literal.mojo index 72f1207149..deaf26f17f 100644 --- a/stdlib/src/builtin/string_literal.mojo +++ b/stdlib/src/builtin/string_literal.mojo @@ -135,7 +135,7 @@ struct StringLiteral( Returns: The string value as a StringLiteral. """ - return Self._from_string[str(value)]() + return Self._from_string[String(value)]() # ===-------------------------------------------------------------------===# # Operator dunders @@ -470,7 +470,7 @@ struct StringLiteral( Returns: A new string containing the character at the specified position. """ - return str(self)[idx] + return String(self)[idx] # ===-------------------------------------------------------------------===# # Methods @@ -648,7 +648,7 @@ struct StringLiteral( Returns: The joined string. """ - return str(self).join(elems) + return String(self).join(elems) fn join(self, *elems: Int) -> String: """Joins the elements from the tuple using the current string literal as a @@ -662,9 +662,9 @@ struct StringLiteral( """ if len(elems) == 0: return "" - var curr = str(elems[0]) + var curr = String(elems[0]) for i in range(1, len(elems)): - curr += self + str(elems[i]) + curr += self + String(elems[i]) return curr fn join[*Types: Stringable](self, *elems: *Types) -> String: @@ -689,7 +689,7 @@ struct StringLiteral( is_first = False else: result += self - result += str(a) + result += String(a) elems.each[add_elt]() return result @@ -717,7 +717,7 @@ struct StringLiteral( ``` . """ - return str(self).split(sep, maxsplit) + return String(self).split(sep, maxsplit) fn split(self, sep: NoneType = None, maxsplit: Int = -1) -> List[String]: """Split the string literal by every whitespace separator. @@ -745,7 +745,7 @@ struct StringLiteral( ``` . """ - return str(self).split(sep, maxsplit) + return String(self).split(sep, maxsplit) fn splitlines(self, keepends: Bool = False) -> List[String]: """Split the string literal at line boundaries. This corresponds to Python's @@ -774,7 +774,7 @@ struct StringLiteral( Returns: The number of occurrences of `substr`. """ - return str(self).count(substr) + return String(self).count(substr) fn lower(self) -> String: """Returns a copy of the string literal with all cased characters @@ -784,7 +784,7 @@ struct StringLiteral( A new string where cased letters have been converted to lowercase. """ - return str(self).lower() + return String(self).lower() fn upper(self) -> String: """Returns a copy of the string literal with all cased characters @@ -794,7 +794,7 @@ struct StringLiteral( A new string where cased letters have been converted to uppercase. """ - return str(self).upper() + return String(self).upper() fn rjust(self, width: Int, fillchar: StringLiteral = " ") -> String: """Returns the string right justified in a string literal of specified width. @@ -806,7 +806,7 @@ struct StringLiteral( Returns: Returns right justified string, or self if width is not bigger than self length. """ - return str(self).rjust(width, fillchar) + return String(self).rjust(width, fillchar) fn ljust(self, width: Int, fillchar: StringLiteral = " ") -> String: """Returns the string left justified in a string literal of specified width. @@ -818,7 +818,7 @@ struct StringLiteral( Returns: Returns left justified string, or self if width is not bigger than self length. """ - return str(self).ljust(width, fillchar) + return String(self).ljust(width, fillchar) fn center(self, width: Int, fillchar: StringLiteral = " ") -> String: """Returns the string center justified in a string literal of specified width. @@ -830,7 +830,7 @@ struct StringLiteral( Returns: Returns center justified string, or self if width is not bigger than self length. """ - return str(self).center(width, fillchar) + return String(self).center(width, fillchar) fn startswith( self, prefix: StringSlice, start: Int = 0, end: Int = -1 @@ -872,7 +872,7 @@ struct StringLiteral( Returns: True if all characters are digits else False. """ - return str(self).isdigit() + return String(self).isdigit() fn isupper(self) -> Bool: """Returns True if all cased characters in the string literal are @@ -884,7 +884,7 @@ struct StringLiteral( True if all cased characters in the string literal are uppercase and there is at least one cased character, False otherwise. """ - return str(self).isupper() + return String(self).isupper() fn islower(self) -> Bool: """Returns True if all cased characters in the string literal @@ -896,7 +896,7 @@ struct StringLiteral( True if all cased characters in the string literal are lowercase and there is at least one cased character, False otherwise. """ - return str(self).islower() + return String(self).islower() fn strip(self) -> String: """Return a copy of the string literal with leading and trailing @@ -930,7 +930,7 @@ struct StringLiteral( Returns: A string with no trailing characters. """ - return String(str(self).rstrip(chars)) + return String(String(self).rstrip(chars)) fn rstrip(self) -> String: """Return a copy of the string with trailing whitespaces removed. This @@ -961,4 +961,4 @@ struct StringLiteral( Returns: A copy of the string with no leading whitespaces. """ - return String(str(self).lstrip()) + return String(String(self).lstrip()) diff --git a/stdlib/src/builtin/uint.mojo b/stdlib/src/builtin/uint.mojo index 7067e94d68..81c04d48e9 100644 --- a/stdlib/src/builtin/uint.mojo +++ b/stdlib/src/builtin/uint.mojo @@ -121,7 +121,7 @@ struct UInt(Indexer, _HashableWithHasher): ```mojo %# from testing import assert_equal x = UInt(50) - assert_equal(str(x), "50") + assert_equal(String(x), "50") ``` Returns: @@ -164,7 +164,7 @@ struct UInt(Indexer, _HashableWithHasher): Returns: The string representation of this UInt. """ - return String.write("UInt(", str(self), ")") + return String.write("UInt(", String(self), ")") fn __hash__(self) -> UInt: """Hash the UInt using builtin hash. diff --git a/stdlib/src/collections/deque.mojo b/stdlib/src/collections/deque.mojo index f55c345f79..a0b8bfa587 100644 --- a/stdlib/src/collections/deque.mojo +++ b/stdlib/src/collections/deque.mojo @@ -444,7 +444,7 @@ struct Deque[ElementType: CollectionElement]( print(my_deque.__str__()) ``` - When the compiler supports conditional methods, then a simple `str(my_deque)` will + When the compiler supports conditional methods, then a simple `String(my_deque)` will be enough. The elements' type must implement the `__repr__()` method for this to work. diff --git a/stdlib/src/collections/dict.mojo b/stdlib/src/collections/dict.mojo index 27b7f42a3f..f593677437 100644 --- a/stdlib/src/collections/dict.mojo +++ b/stdlib/src/collections/dict.mojo @@ -712,7 +712,7 @@ struct Dict[K: KeyElement, V: CollectionElement]( # prints "{1: 1.1, 2: 2.2}" ``` - When the compiler supports conditional methods, then a simple `str(my_dict)` will + When the compiler supports conditional methods, then a simple `String(my_dict)` will be enough. Note that both they keys and values' types must implement the `__repr__()` method @@ -748,11 +748,11 @@ struct Dict[K: KeyElement, V: CollectionElement]( fn _minimum_size_of_string_representation(self) -> Int: # we do a rough estimation of the minimum number of chars that we'll see - # in the string representation, we assume that str(key) and str(value) + # in the string representation, we assume that String(key) and String(value) # will be both at least one char. return ( 2 # '{' and '}' - + len(self) * 6 # str(key), str(value) ": " and ", " + + len(self) * 6 # String(key), String(value) ": " and ", " - 2 # remove the last ", " ) diff --git a/stdlib/src/collections/list.mojo b/stdlib/src/collections/list.mojo index cc688f34af..aedb0f4612 100644 --- a/stdlib/src/collections/list.mojo +++ b/stdlib/src/collections/list.mojo @@ -401,7 +401,7 @@ struct List[T: CollectionElement, hint_trivial_type: Bool = False]( print(my_list.__str__()) ``` - When the compiler supports conditional methods, then a simple `str(my_list)` will + When the compiler supports conditional methods, then a simple `String(my_list)` will be enough. The elements' type must implement the `__repr__()` method for this to work. diff --git a/stdlib/src/collections/string/format.mojo b/stdlib/src/collections/string/format.mojo index 1cd5cd968e..425dfba341 100644 --- a/stdlib/src/collections/string/format.mojo +++ b/stdlib/src/collections/string/format.mojo @@ -248,7 +248,7 @@ struct _FormatCurlyEntry(CollectionElement, CollectionElementNew): elif manual_indexing_count and automatic_indexing_count: raise Error("Cannot both use manual and automatic indexing") elif raised_manual_index: - var val = str(raised_manual_index.value()) + var val = String(raised_manual_index.value()) raise Error("Index " + val + " not in *args") elif start: raise Error(l_err) @@ -326,11 +326,11 @@ struct _FormatCurlyEntry(CollectionElement, CollectionElementNew): manual_indexing_count += 1 except e: alias unexp = "Not the expected error from atol" - debug_assert("not convertible to integer" in str(e), unexp) + debug_assert("not convertible to integer" in String(e), unexp) # field is a keyword for **kwargs: # TODO: add support for "My name is {person.name}".format(person=Person(name="Fred")) # TODO: add support for "My name is {person[name]}".format(person={"name": "Fred"}) - var f = str(field) + var f = String(field) self.field = f raised_kwarg_field = f return True @@ -362,16 +362,16 @@ struct _FormatCurlyEntry(CollectionElement, CollectionElementNew): var data: String if empty and type_impls_write_str: - data = str(args[i]) # TODO: use writer and return + data = String(args[i]) # TODO: use writer and return elif empty and type_impls_str: - data = str(args[i]) + data = String(args[i]) elif flag == `s` and type_impls_write_str: if empty: # TODO: use writer and return pass - data = str(args[i]) + data = String(args[i]) elif flag == `s` and type_impls_str: - data = str(args[i]) + data = String(args[i]) elif flag == `r` and type_impls_write_repr: if empty: # TODO: use writer and return @@ -387,7 +387,9 @@ struct _FormatCurlyEntry(CollectionElement, CollectionElementNew): alias does_not = " does not implement the trait " alias needed = "needed for conversion_flag: " var flg = String(List[UInt8](flag, 0)) - raise Error(argnum + str(i) + does_not + needed + flg) + raise Error( + argnum + String(i) + does_not + needed + flg + ) if self.format_spec: self.format_spec.value().format( @@ -586,7 +588,7 @@ struct _FormatSpec: large as needed to represent the given value faithfully.\ For Decimal, this is the same as either 'g' or 'G' depending on the value\ of context.capitals for the current decimal context.\ - The overall effect is to match the output of str() as altered by the other\ + The overall effect is to match the output of String() as altered by the other\ format modifiers.| """ @@ -699,7 +701,7 @@ struct _FormatSpec: # TODO: transform to int/float depending on format spec # TODO: send to float/int 's __format__ method # their methods should stringify as hex/bin/oct etc. - res += str(item) + res += String(item) # ===-----------------------------------------------------------------------===# diff --git a/stdlib/src/collections/string/inline_string.mojo b/stdlib/src/collections/string/inline_string.mojo index 6cb7203e6d..bfb77bab50 100644 --- a/stdlib/src/collections/string/inline_string.mojo +++ b/stdlib/src/collections/string/inline_string.mojo @@ -122,7 +122,7 @@ struct InlineString(Sized, Stringable, CollectionElement, CollectionElementNew): except e: abort( "unreachable: InlineString append to FixedString failed: " - + str(e), + + String(e), ) else: # We're currently in the small layout but must change to the @@ -197,7 +197,7 @@ struct InlineString(Sized, Stringable, CollectionElement, CollectionElementNew): The string representation of the type. """ if self._is_small(): - return str(self._storage[_FixedString[Self.SMALL_CAP]]) + return String(self._storage[_FixedString[Self.SMALL_CAP]]) else: return self._storage[String] @@ -303,9 +303,9 @@ struct _FixedString[CAP: Int]( if len(literal) > CAP: raise Error( "String literal (len=" - + str(len(literal)) + + String(len(literal)) + ") is longer than FixedString capacity (" - + str(CAP) + + String(CAP) + ")" ) @@ -385,11 +385,11 @@ struct _FixedString[CAP: Int]( return Optional( Error( "Insufficient capacity to append len=" - + str(len(bytes)) + + String(len(bytes)) + " string to len=" - + str(len(self)) + + String(len(self)) + " FixedString with capacity=" - + str(CAP), + + String(CAP), ) ) diff --git a/stdlib/src/collections/string/string.mojo b/stdlib/src/collections/string/string.mojo index 9e3aa6a853..99a553c886 100644 --- a/stdlib/src/collections/string/string.mojo +++ b/stdlib/src/collections/string/string.mojo @@ -416,7 +416,7 @@ fn atol(str_slice: StringSlice, base: Int = 10) raises -> Int: real_base = base if real_base <= 10: - ord_num_max = ord(str(real_base - 1)) + ord_num_max = ord(String(real_base - 1)) else: ord_num_max = ord("9") ord_letter_max = ( @@ -535,9 +535,9 @@ fn _handle_base_prefix( fn _str_to_base_error(base: Int, str_slice: StringSlice) -> String: return ( "String is not convertible to integer with base " - + str(base) + + String(base) + ": '" - + str(str_slice) + + String(str_slice) + "'" ) @@ -577,7 +577,9 @@ fn _identify_base(str_slice: StringSlice, start: Int) -> Tuple[Int, Int]: fn _atof_error(str_ref: StringSlice) -> Error: - return Error("String is not convertible to float: '" + str(str_ref) + "'") + return Error( + "String is not convertible to float: '" + String(str_ref) + "'" + ) fn atof(str_slice: StringSlice) raises -> Float64: @@ -738,6 +740,42 @@ struct String( """Construct an uninitialized string.""" self._buffer = Self._buffer_type() + @no_inline + fn __init__[T: Stringable](out self, value: T): + """Initialize from a type conforming to `Stringable`. + + Parameters: + T: The type conforming to Stringable. + + Args: + value: The object to get the string representation of. + """ + self = value.__str__() + + @no_inline + fn __init__[T: StringableRaising](out self, value: T) raises: + """Initialize from a type conforming to `StringableRaising`. + + Parameters: + T: The type conforming to Stringable. + + Args: + value: The object to get the string representation of. + + Raises: + If there is an error when computing the string representation of the type. + """ + self = value.__str__() + + @no_inline + fn __init__(out self, value: None): + """Initialize a `None` type as "None". + + Args: + value: The object to get the string representation of. + """ + self = "None" + @always_inline fn __init__(out self, *, capacity: Int): """Construct an uninitialized string with the given capacity. @@ -779,53 +817,6 @@ struct String( """ return self # Just use the implicit copyinit. - fn __init__(out self, char: Char): - """Construct a string from a character. - - Args: - char: The character to construct this string from. - - Notes: - This will allocate a new string holding the UTF-8 encoded - representation of `char`. - """ - var char_len = char.utf8_byte_length() - var buffer = List[Byte](capacity=char_len + 1) - _ = char.unsafe_write_utf8(buffer.unsafe_ptr()) - buffer.unsafe_ptr()[char_len] = 0 - buffer.size = char_len + 1 - self = String(buffer^) - - fn __init__(out self, strref: StringRef): - """Construct a string from a StringRef object. - - Args: - strref: The StringRef from which to construct this string object. - """ - var length = len(strref) - var buffer = Self._buffer_type() - # +1 for null terminator, initialized to 0 - buffer.resize(length + 1, 0) - memcpy(dest=buffer.data, src=strref.data, count=length) - self = Self(buffer^) - - fn __init__(out self, str_slice: StringSlice): - """Construct a string from a string slice. - - Args: - str_slice: The string slice from which to construct this string. - - Notes: - This will allocate a new string that copies the string contents from - the provided string slice. - """ - - var length = str_slice.byte_length() - var ptr = UnsafePointer[Byte].alloc(length + 1) # null terminator - memcpy(ptr, str_slice.unsafe_ptr(), length) - ptr[length] = 0 - self = String(ptr=ptr, length=length + 1) - @always_inline @implicit fn __init__(out self, literal: StringLiteral): @@ -1306,9 +1297,9 @@ struct String( """ if len(elems) == 0: return "" - var curr = str(elems[0]) + var curr = String(elems[0]) for i in range(1, len(elems)): - curr += self + str(elems[i]) + curr += self + String(elems[i]) return curr fn join[*Types: Writable](self, *elems: *Types) -> String: @@ -1371,7 +1362,7 @@ struct String( is_first = False else: result += self - result += str(e[]) + result += String(e[]) return result diff --git a/stdlib/src/collections/string/string_slice.mojo b/stdlib/src/collections/string/string_slice.mojo index 4104962de4..0e012d6c66 100644 --- a/stdlib/src/collections/string/string_slice.mojo +++ b/stdlib/src/collections/string/string_slice.mojo @@ -496,12 +496,20 @@ struct StringSlice[mut: Bool, //, origin: Origin[mut]]( @no_inline fn __str__(self) -> String: - """Gets this slice as a standard `String`. + """Convert this StringSlice to a String. Returns: - The string representation of the slice. + A new String. + + Notes: + This will allocate a new string that copies the string contents from + the provided string slice. """ - return String(str_slice=self) + var length = self.byte_length() + var ptr = UnsafePointer[Byte].alloc(length + 1) # null terminator + memcpy(ptr, self.unsafe_ptr(), length) + ptr[length] = 0 + return String(ptr=ptr, length=length + 1) fn __repr__(self) -> String: """Return a Mojo-compatible representation of this string slice. @@ -582,7 +590,7 @@ struct StringSlice[mut: Bool, //, origin: Origin[mut]]( Returns: The file system path representation as a string. """ - return String(self) + return self.__str__() # ===------------------------------------------------------------------===# # Operator dunders diff --git a/stdlib/src/memory/pointer.mojo b/stdlib/src/memory/pointer.mojo index 1cd5f70dc4..54f60a1330 100644 --- a/stdlib/src/memory/pointer.mojo +++ b/stdlib/src/memory/pointer.mojo @@ -417,4 +417,4 @@ struct Pointer[ Returns: The string representation of the Pointer. """ - return str(UnsafePointer.address_of(self[])) + return String(UnsafePointer.address_of(self[])) diff --git a/stdlib/src/memory/unsafe_pointer.mojo b/stdlib/src/memory/unsafe_pointer.mojo index c2aefe847e..d2c19e8fb1 100644 --- a/stdlib/src/memory/unsafe_pointer.mojo +++ b/stdlib/src/memory/unsafe_pointer.mojo @@ -442,7 +442,7 @@ struct UnsafePointer[ """ # TODO: Avoid intermediate String allocation. - writer.write(str(self)) + writer.write(String(self)) # ===-------------------------------------------------------------------===# # Methods diff --git a/stdlib/src/os/_linux_aarch64.mojo b/stdlib/src/os/_linux_aarch64.mojo index f6184d56ab..2eaba1b631 100644 --- a/stdlib/src/os/_linux_aarch64.mojo +++ b/stdlib/src/os/_linux_aarch64.mojo @@ -70,20 +70,20 @@ struct _c_stat(Stringable): @no_inline fn __str__(self) -> String: var res = String("{\n") - res += "st_dev: " + str(self.st_dev) + ",\n" - res += "st_mode: " + str(self.st_mode) + ",\n" - res += "st_nlink: " + str(self.st_nlink) + ",\n" - res += "st_ino: " + str(self.st_ino) + ",\n" - res += "st_uid: " + str(self.st_uid) + ",\n" - res += "st_gid: " + str(self.st_gid) + ",\n" - res += "st_rdev: " + str(self.st_rdev) + ",\n" - res += "st_size: " + str(self.st_size) + ",\n" - res += "st_blksize: " + str(self.st_blksize) + ",\n" - res += "st_blocks: " + str(self.st_blocks) + ",\n" - res += "st_atimespec: " + str(self.st_atimespec) + ",\n" - res += "st_mtimespec: " + str(self.st_mtimespec) + ",\n" - res += "st_ctimespec: " + str(self.st_ctimespec) + ",\n" - res += "st_birthtimespec: " + str(self.st_birthtimespec) + "\n" + res += "st_dev: " + String(self.st_dev) + ",\n" + res += "st_mode: " + String(self.st_mode) + ",\n" + res += "st_nlink: " + String(self.st_nlink) + ",\n" + res += "st_ino: " + String(self.st_ino) + ",\n" + res += "st_uid: " + String(self.st_uid) + ",\n" + res += "st_gid: " + String(self.st_gid) + ",\n" + res += "st_rdev: " + String(self.st_rdev) + ",\n" + res += "st_size: " + String(self.st_size) + ",\n" + res += "st_blksize: " + String(self.st_blksize) + ",\n" + res += "st_blocks: " + String(self.st_blocks) + ",\n" + res += "st_atimespec: " + String(self.st_atimespec) + ",\n" + res += "st_mtimespec: " + String(self.st_mtimespec) + ",\n" + res += "st_ctimespec: " + String(self.st_ctimespec) + ",\n" + res += "st_birthtimespec: " + String(self.st_birthtimespec) + "\n" return res + "}" fn _to_stat_result(self) -> stat_result: diff --git a/stdlib/src/os/_linux_x86.mojo b/stdlib/src/os/_linux_x86.mojo index 76c1816e81..fbd5629f48 100644 --- a/stdlib/src/os/_linux_x86.mojo +++ b/stdlib/src/os/_linux_x86.mojo @@ -68,20 +68,20 @@ struct _c_stat(Stringable): @no_inline fn __str__(self) -> String: var res = String("{\n") - res += "st_dev: " + str(self.st_dev) + ",\n" - res += "st_mode: " + str(self.st_mode) + ",\n" - res += "st_nlink: " + str(self.st_nlink) + ",\n" - res += "st_ino: " + str(self.st_ino) + ",\n" - res += "st_uid: " + str(self.st_uid) + ",\n" - res += "st_gid: " + str(self.st_gid) + ",\n" - res += "st_rdev: " + str(self.st_rdev) + ",\n" - res += "st_size: " + str(self.st_size) + ",\n" - res += "st_blksize: " + str(self.st_blksize) + ",\n" - res += "st_blocks: " + str(self.st_blocks) + ",\n" - res += "st_atimespec: " + str(self.st_atimespec) + ",\n" - res += "st_mtimespec: " + str(self.st_mtimespec) + ",\n" - res += "st_ctimespec: " + str(self.st_ctimespec) + ",\n" - res += "st_birthtimespec: " + str(self.st_birthtimespec) + "\n" + res += "st_dev: " + String(self.st_dev) + ",\n" + res += "st_mode: " + String(self.st_mode) + ",\n" + res += "st_nlink: " + String(self.st_nlink) + ",\n" + res += "st_ino: " + String(self.st_ino) + ",\n" + res += "st_uid: " + String(self.st_uid) + ",\n" + res += "st_gid: " + String(self.st_gid) + ",\n" + res += "st_rdev: " + String(self.st_rdev) + ",\n" + res += "st_size: " + String(self.st_size) + ",\n" + res += "st_blksize: " + String(self.st_blksize) + ",\n" + res += "st_blocks: " + String(self.st_blocks) + ",\n" + res += "st_atimespec: " + String(self.st_atimespec) + ",\n" + res += "st_mtimespec: " + String(self.st_mtimespec) + ",\n" + res += "st_ctimespec: " + String(self.st_ctimespec) + ",\n" + res += "st_birthtimespec: " + String(self.st_birthtimespec) + "\n" return res + "}" fn _to_stat_result(self) -> stat_result: diff --git a/stdlib/src/os/_macos.mojo b/stdlib/src/os/_macos.mojo index b23a5f713d..596fb6e459 100644 --- a/stdlib/src/os/_macos.mojo +++ b/stdlib/src/os/_macos.mojo @@ -73,22 +73,22 @@ struct _c_stat(Stringable): @no_inline fn __str__(self) -> String: var res = String("{\n") - res += "st_dev: " + str(self.st_dev) + ",\n" - res += "st_mode: " + str(self.st_mode) + ",\n" - res += "st_nlink: " + str(self.st_nlink) + ",\n" - res += "st_ino: " + str(self.st_ino) + ",\n" - res += "st_uid: " + str(self.st_uid) + ",\n" - res += "st_gid: " + str(self.st_gid) + ",\n" - res += "st_rdev: " + str(self.st_rdev) + ",\n" - res += "st_atimespec: " + str(self.st_atimespec) + ",\n" - res += "st_mtimespec: " + str(self.st_mtimespec) + ",\n" - res += "st_ctimespec: " + str(self.st_ctimespec) + ",\n" - res += "st_birthtimespec: " + str(self.st_birthtimespec) + ",\n" - res += "st_size: " + str(self.st_size) + ",\n" - res += "st_blocks: " + str(self.st_blocks) + ",\n" - res += "st_blksize: " + str(self.st_blksize) + ",\n" - res += "st_flags: " + str(self.st_flags) + ",\n" - res += "st_gen: " + str(self.st_gen) + "\n" + res += "st_dev: " + String(self.st_dev) + ",\n" + res += "st_mode: " + String(self.st_mode) + ",\n" + res += "st_nlink: " + String(self.st_nlink) + ",\n" + res += "st_ino: " + String(self.st_ino) + ",\n" + res += "st_uid: " + String(self.st_uid) + ",\n" + res += "st_gid: " + String(self.st_gid) + ",\n" + res += "st_rdev: " + String(self.st_rdev) + ",\n" + res += "st_atimespec: " + String(self.st_atimespec) + ",\n" + res += "st_mtimespec: " + String(self.st_mtimespec) + ",\n" + res += "st_ctimespec: " + String(self.st_ctimespec) + ",\n" + res += "st_birthtimespec: " + String(self.st_birthtimespec) + ",\n" + res += "st_size: " + String(self.st_size) + ",\n" + res += "st_blocks: " + String(self.st_blocks) + ",\n" + res += "st_blksize: " + String(self.st_blksize) + ",\n" + res += "st_flags: " + String(self.st_flags) + ",\n" + res += "st_gen: " + String(self.st_gen) + "\n" return res + "}" fn _to_stat_result(self) -> stat_result: diff --git a/stdlib/src/os/fstat.mojo b/stdlib/src/os/fstat.mojo index 83e493bc7a..fb683155da 100644 --- a/stdlib/src/os/fstat.mojo +++ b/stdlib/src/os/fstat.mojo @@ -169,10 +169,10 @@ struct stat_result(Stringable, Writable): writer.write(", st_uid=", self.st_uid) writer.write(", st_gid=", self.st_gid) writer.write(", st_size=", self.st_size) - writer.write(", st_atime=", str(self.st_atimespec)) - writer.write(", st_mtime=", str(self.st_mtimespec)) - writer.write(", st_ctime=", str(self.st_ctimespec)) - writer.write(", st_birthtime=", str(self.st_birthtimespec)) + writer.write(", st_atime=", String(self.st_atimespec)) + writer.write(", st_mtime=", String(self.st_mtimespec)) + writer.write(", st_ctime=", String(self.st_ctimespec)) + writer.write(", st_birthtime=", String(self.st_birthtimespec)) writer.write(", st_blocks=", self.st_blocks) writer.write(", st_blksize=", self.st_blksize) writer.write(", st_rdev=", self.st_rdev) @@ -194,7 +194,7 @@ struct stat_result(Stringable, Writable): Returns: A representation of stat_result. """ - return str(self) + return String(self) # ===----------------------------------------------------------------------=== # diff --git a/stdlib/src/os/os.mojo b/stdlib/src/os/os.mojo index cf44c53814..350a660db6 100644 --- a/stdlib/src/os/os.mojo +++ b/stdlib/src/os/os.mojo @@ -367,11 +367,11 @@ def makedirs[ mkdir(path, mode) except e: if not exist_ok: - raise str( + raise String( e ) + "\nset `makedirs(path, exist_ok=True)` to allow existing dirs" if not os.path.isdir(path): - raise "path not created: " + path.__fspath__() + "\n" + str(e) + raise "path not created: " + path.__fspath__() + "\n" + String(e) fn rmdir[PathLike: os.PathLike](path: PathLike) raises: diff --git a/stdlib/src/os/path/path.mojo b/stdlib/src/os/path/path.mojo index 60ea06e96b..139e77d681 100644 --- a/stdlib/src/os/path/path.mojo +++ b/stdlib/src/os/path/path.mojo @@ -367,8 +367,8 @@ def split[PathLike: os.PathLike, //](path: PathLike) -> (String, String): fspath = path.__fspath__() i = fspath.rfind(os.sep) + 1 head, tail = fspath[:i], fspath[i:] - if head and head != str(os.sep) * len(head): - head = str(head.rstrip(sep)) + if head and head != String(os.sep) * len(head): + head = String(head.rstrip(sep)) return head, tail diff --git a/stdlib/src/pathlib/path.mojo b/stdlib/src/pathlib/path.mojo index 4cfbf1357a..cec42c48b3 100644 --- a/stdlib/src/pathlib/path.mojo +++ b/stdlib/src/pathlib/path.mojo @@ -61,8 +61,8 @@ fn _dir_of_current_file() raises -> Path: @no_inline fn _dir_of_current_file_impl(file_name: StringLiteral) raises -> Path: - var i = str(file_name).rfind(DIR_SEPARATOR) - return Path(str(file_name)[0:i]) + var i = String(file_name).rfind(DIR_SEPARATOR) + return Path(String(file_name)[0:i]) @value @@ -184,7 +184,7 @@ struct Path( Returns: A string representation of the path. """ - return str(self) + return String(self) fn __repr__(self) -> String: """Returns a printable representation of the path. @@ -192,7 +192,7 @@ struct Path( Returns: A printable representation of the path. """ - return str(self) + return String(self) fn __eq__(self, other: Self) -> Bool: """Returns True if the two paths are equal. @@ -203,7 +203,7 @@ struct Path( Returns: True if the paths are equal and False otherwise. """ - return str(self) == str(other) + return String(self) == String(other) fn __eq__(self, other: StringSlice) -> Bool: """Returns True if the two paths are equal. @@ -340,7 +340,7 @@ struct Path( value: The value to write. """ with open(self, "w") as f: - f.write(str(value)) + f.write(String(value)) fn suffix(self) -> String: """The path's extension, if any. diff --git a/stdlib/src/pwd/_linux.mojo b/stdlib/src/pwd/_linux.mojo index 3f1d3b4460..877cebd05b 100644 --- a/stdlib/src/pwd/_linux.mojo +++ b/stdlib/src/pwd/_linux.mojo @@ -10,9 +10,9 @@ # See the License for the specific language governing permissions and # limitations under the License. # ===----------------------------------------------------------------------=== # -from sys.ffi import c_char, external_call - from memory import UnsafePointer +from utils import StringRef +from sys.ffi import c_char, external_call from .pwd import Passwd @@ -35,20 +35,20 @@ struct _C_Passwd: fn _build_pw_struct(passwd_ptr: UnsafePointer[_C_Passwd]) raises -> Passwd: var c_pwuid = passwd_ptr[] return Passwd( - pw_name=String(c_pwuid.pw_name), - pw_passwd=String(c_pwuid.pw_passwd), + pw_name=String(StringRef(c_pwuid.pw_name)), + pw_passwd=String(StringRef(c_pwuid.pw_passwd)), pw_uid=Int(c_pwuid.pw_uid), pw_gid=Int(c_pwuid.pw_gid), - pw_gecos=String(c_pwuid.pw_gecos), - pw_dir=String(c_pwuid.pw_dir), - pw_shell=String(c_pwuid.pw_shell), + pw_gecos=String(StringRef(c_pwuid.pw_gecos)), + pw_dir=String(StringRef(c_pwuid.pw_dir)), + pw_shell=String(StringRef(c_pwuid.pw_shell)), ) fn _getpw_linux(uid: UInt32) raises -> Passwd: var passwd_ptr = external_call["getpwuid", UnsafePointer[_C_Passwd]](uid) if not passwd_ptr: - raise "user ID not found in the password database: " + str(uid) + raise "user ID not found in the password database: " + String(uid) return _build_pw_struct(passwd_ptr) diff --git a/stdlib/src/pwd/_macos.mojo b/stdlib/src/pwd/_macos.mojo index 348a4b1377..7aa51eeeb2 100644 --- a/stdlib/src/pwd/_macos.mojo +++ b/stdlib/src/pwd/_macos.mojo @@ -10,9 +10,9 @@ # See the License for the specific language governing permissions and # limitations under the License. # ===----------------------------------------------------------------------=== # -from sys.ffi import c_char, external_call - +from utils import StringRef from memory import UnsafePointer +from sys.ffi import c_char, external_call from .pwd import Passwd @@ -39,13 +39,13 @@ struct _C_Passwd: fn _build_pw_struct(passwd_ptr: UnsafePointer[_C_Passwd]) raises -> Passwd: var c_pwuid = passwd_ptr[] var passwd = Passwd( - pw_name=String(c_pwuid.pw_name), - pw_passwd=String(c_pwuid.pw_passwd), + pw_name=String(StringRef(c_pwuid.pw_name)), + pw_passwd=String(StringRef(c_pwuid.pw_passwd)), pw_uid=Int(c_pwuid.pw_uid), pw_gid=Int(c_pwuid.pw_gid), - pw_gecos=String(c_pwuid.pw_gecos), - pw_dir=String(c_pwuid.pw_dir), - pw_shell=String(c_pwuid.pw_shell), + pw_gecos=String(StringRef(c_pwuid.pw_gecos)), + pw_dir=String(StringRef(c_pwuid.pw_dir)), + pw_shell=String(StringRef(c_pwuid.pw_shell)), ) return passwd @@ -53,7 +53,7 @@ fn _build_pw_struct(passwd_ptr: UnsafePointer[_C_Passwd]) raises -> Passwd: fn _getpw_macos(uid: UInt32) raises -> Passwd: var passwd_ptr = external_call["getpwuid", UnsafePointer[_C_Passwd]](uid) if not passwd_ptr: - raise "user ID not found in the password database: " + str(uid) + raise "user ID not found in the password database: " + String(uid) return _build_pw_struct(passwd_ptr) diff --git a/stdlib/src/python/_cpython.mojo b/stdlib/src/python/_cpython.mojo index e247533f6f..52b7d58343 100644 --- a/stdlib/src/python/_cpython.mojo +++ b/stdlib/src/python/_cpython.mojo @@ -486,7 +486,7 @@ struct PyObject(Stringable, Representable, Writable): Returns: A string representation. """ - return str(self) + return String(self) # ===-------------------------------------------------------------------===# # Methods @@ -574,7 +574,7 @@ struct PyModuleDef_Base(Stringable, Representable, Writable): Returns: A string representation. """ - return str(self) + return String(self) # ===-------------------------------------------------------------------===# # Methods @@ -694,7 +694,7 @@ struct PyModuleDef(Stringable, Representable, Writable): Returns: A string representation. """ - return str(self) + return String(self) # ===-------------------------------------------------------------------===# # Methods diff --git a/stdlib/src/python/python.mojo b/stdlib/src/python/python.mojo index ca1ccab3ab..e5c774c2e5 100644 --- a/stdlib/src/python/python.mojo +++ b/stdlib/src/python/python.mojo @@ -412,7 +412,7 @@ struct Python: "invalid unchecked conversion of Python error to Mojo error", ) - var error: Error = str(PythonObject(cpython.PyErr_Fetch())) + var error: Error = String(PythonObject(cpython.PyErr_Fetch())) cpython.PyErr_Clear() return error diff --git a/stdlib/src/python/python_object.mojo b/stdlib/src/python/python_object.mojo index e247ec033b..ccd039679b 100644 --- a/stdlib/src/python/python_object.mojo +++ b/stdlib/src/python/python_object.mojo @@ -1531,7 +1531,7 @@ struct PythonObject( """ # TODO: Avoid this intermediate String allocation, if possible. - writer.write(str(self)) + writer.write(String(self)) # ===-------------------------------------------------------------------===# # Methods @@ -1589,7 +1589,7 @@ struct PythonObject( var actual_type = cpython.Py_TYPE(self.unsafe_as_py_object_ptr()) var actual_type_name = PythonObject(cpython.PyType_GetName(actual_type)) - return str(actual_type_name) + return String(actual_type_name) # ===-----------------------------------------------------------------------===# diff --git a/stdlib/src/tempfile/tempfile.mojo b/stdlib/src/tempfile/tempfile.mojo index 18b783cffe..a493c02230 100644 --- a/stdlib/src/tempfile/tempfile.mojo +++ b/stdlib/src/tempfile/tempfile.mojo @@ -64,7 +64,7 @@ fn _candidate_tempdir_list() -> List[String]: # As a last resort, the current directory if possible, # os.path.getcwd() could raise try: - dirlist.append(str(Path())) + dirlist.append(String(Path())) except: pass @@ -102,7 +102,7 @@ fn _try_to_create_file(dir: StringSlice) -> Bool: # verify that we have writing access in the target directory try: - with FileHandle(str(filename), "w"): + with FileHandle(String(filename), "w"): pass os.remove(filename) return True @@ -161,7 +161,7 @@ fn mkdtemp( # python implementation expands the path, # but several functions are not yet implemented in mojo # i.e. abspath, normpath - return str(dir_name) + return String(dir_name) except: continue raise Error("Failed to create temporary file") @@ -279,7 +279,7 @@ struct NamedTemporaryFile: print( f.read() == "Hello world!" ) - print(str(p), p.exists()) #Removed by default + print(String(p), p.exists()) #Removed by default ``` Note: `NamedTemporaryFile.__init__` document the arguments. """ diff --git a/stdlib/src/testing/testing.mojo b/stdlib/src/testing/testing.mojo index e6235bc616..f8b02cc294 100644 --- a/stdlib/src/testing/testing.mojo +++ b/stdlib/src/testing/testing.mojo @@ -43,7 +43,7 @@ from utils import StringSlice @always_inline fn _assert_error[T: Stringable](msg: T, loc: _SourceLocation) -> String: - return loc.prefix("AssertionError: " + str(msg)) + return loc.prefix("AssertionError: " + String(msg)) @always_inline @@ -141,7 +141,10 @@ fn assert_equal[ """ if lhs != rhs: raise _assert_cmp_error["`left == right` comparison"]( - str(lhs), str(rhs), msg=msg, loc=location.or_else(__call_location()) + String(lhs), + String(rhs), + msg=msg, + loc=location.or_else(__call_location()), ) @@ -200,7 +203,10 @@ fn assert_equal[ """ if any(lhs != rhs): raise _assert_cmp_error["`left == right` comparison"]( - str(lhs), str(rhs), msg=msg, loc=location.or_else(__call_location()) + String(lhs), + String(rhs), + msg=msg, + loc=location.or_else(__call_location()), ) @@ -345,7 +351,10 @@ fn assert_not_equal[ """ if lhs == rhs: raise _assert_cmp_error["`left != right` comparison"]( - str(lhs), str(rhs), msg=msg, loc=location.or_else(__call_location()) + String(lhs), + String(rhs), + msg=msg, + loc=location.or_else(__call_location()), ) @@ -403,7 +412,10 @@ fn assert_not_equal[ """ if all(lhs == rhs): raise _assert_cmp_error["`left != right` comparison"]( - str(lhs), str(rhs), msg=msg, loc=location.or_else(__call_location()) + String(lhs), + String(rhs), + msg=msg, + loc=location.or_else(__call_location()), ) @@ -490,11 +502,11 @@ fn assert_almost_equal[ ) if not all(almost_equal): - var err = str(lhs) + " is not close to " + str(rhs) + var err = String(lhs) + " is not close to " + String(rhs) @parameter if type.is_integral() or type.is_floating_point(): - err += " with a diff of " + str(abs(lhs - rhs)) + err += " with a diff of " + String(abs(lhs - rhs)) if msg: err += " (" + msg + ")" @@ -529,7 +541,10 @@ fn assert_is[ """ if lhs is not rhs: raise _assert_cmp_error["`left is right` identification"]( - str(lhs), str(rhs), msg=msg, loc=location.or_else(__call_location()) + String(lhs), + String(rhs), + msg=msg, + loc=location.or_else(__call_location()), ) @@ -560,7 +575,10 @@ fn assert_is_not[ """ if lhs is rhs: raise _assert_cmp_error["`left is not right` identification"]( - str(lhs), str(rhs), msg=msg, loc=location.or_else(__call_location()) + String(lhs), + String(rhs), + msg=msg, + loc=location.or_else(__call_location()), ) @@ -644,7 +662,7 @@ struct assert_raises: AssertionError: Always. The block must raise to pass the test. """ raise Error( - "AssertionError: Didn't raise at " + str(self.call_location) + "AssertionError: Didn't raise at " + String(self.call_location) ) fn __exit__(self, error: Error) raises -> Bool: @@ -660,5 +678,5 @@ struct assert_raises: True if the error message contained the expected string. """ if self.message_contains: - return self.message_contains.value() in str(error) + return self.message_contains.value() in String(error) return True diff --git a/stdlib/src/time/time.mojo b/stdlib/src/time/time.mojo index 5ace9e42ce..561179f9f0 100644 --- a/stdlib/src/time/time.mojo +++ b/stdlib/src/time/time.mojo @@ -78,7 +78,7 @@ struct _CTimeSpec(Stringable): @no_inline fn __str__(self) -> String: - return str(self.as_nanoseconds()) + "ns" + return String(self.as_nanoseconds()) + "ns" @value diff --git a/stdlib/src/utils/_serialize.mojo b/stdlib/src/utils/_serialize.mojo index f6e5baf18c..e013cc6ea8 100644 --- a/stdlib/src/utils/_serialize.mojo +++ b/stdlib/src/utils/_serialize.mojo @@ -170,7 +170,7 @@ fn _serialize[ for i in range(len(shape)): if i: shape_str += "x" - shape_str += str(shape[i]) + shape_str += String(shape[i]) serialize_fn(shape_str) if serialize_end_line: diff --git a/stdlib/src/utils/stringref.mojo b/stdlib/src/utils/stringref.mojo index 7d41867971..dd1ebd678e 100644 --- a/stdlib/src/utils/stringref.mojo +++ b/stdlib/src/utils/stringref.mojo @@ -20,7 +20,7 @@ from sys.ffi import c_char from bit import count_trailing_zeros from builtin.dtype import _uint_type_of_width -from memory import UnsafePointer, memcmp, pack_bits, Span +from memory import UnsafePointer, memcmp, pack_bits, Span, memcpy from memory.memory import _memcmp_impl_unconstrained @@ -400,7 +400,12 @@ struct StringRef( Returns: A new string. """ - return String.write(self) + var length = len(self) + var buffer = String._buffer_type() + # +1 for null terminator, initialized to 0 + buffer.resize(length + 1, 0) + memcpy(dest=buffer.data, src=self.data, count=length) + return String(buffer^) @no_inline fn __repr__(self) -> String: @@ -409,7 +414,7 @@ struct StringRef( Returns: The String representation of the StringRef. """ - return String.write("StringRef(", repr(str(self)), ")") + return String.write("StringRef(", repr(String(self)), ")") @no_inline fn write_to[W: Writer](self, mut writer: W): diff --git a/stdlib/src/utils/variant.mojo b/stdlib/src/utils/variant.mojo index 60d9279a30..0a9b66979d 100644 --- a/stdlib/src/utils/variant.mojo +++ b/stdlib/src/utils/variant.mojo @@ -22,7 +22,7 @@ fn to_string(mut x: IntOrString) -> String: if x.isa[String](): return x[String] # x.isa[Int]() - return str(x[Int]) + return String(x[Int]) # They have to be mutable for now, and implement CollectionElement var an_int = IntOrString(4) @@ -85,7 +85,7 @@ struct Variant[*Ts: CollectionElement]( if x.isa[String](): return x[String] # x.isa[Int]() - return str(x[Int]) + return String(x[Int]) # They have to be mutable for now, and implement CollectionElement var an_int = IntOrString(4) diff --git a/stdlib/src/utils/write.mojo b/stdlib/src/utils/write.mojo index f2a5172d2f..a46ecefbee 100644 --- a/stdlib/src/utils/write.mojo +++ b/stdlib/src/utils/write.mojo @@ -68,14 +68,14 @@ trait Writer: fn write_to[W: Writer](self, mut writer: W): writer.write("Point(", self.x, ", ", self.y, ")") - # Enable conversion to a String using `str(point)` + # Enable conversion to a String using `String(point)` fn __str__(self) -> String: return String.write(self) fn main(): var point = Point(1, 2) - var new_string = NewString(str(point)) + var new_string = NewString(String(point)) new_string.write("\\n", Point(3, 4)) print(new_string) ``` diff --git a/stdlib/test/bit/test_bit.mojo b/stdlib/test/bit/test_bit.mojo index 489976fdeb..246b3d193c 100644 --- a/stdlib/test/bit/test_bit.mojo +++ b/stdlib/test/bit/test_bit.mojo @@ -515,7 +515,7 @@ def test_log2_floor(): assert_equal( log2_floor(i), _log2_floor(i), - msg="mismatching value for the input value of " + str(i), + msg="mismatching value for the input value of " + String(i), ) fn _check_alias[n: Int](expected: Int) raises: diff --git a/stdlib/test/builtin/test_bfloat16.mojo b/stdlib/test/builtin/test_bfloat16.mojo index 1b01473741..8295f30970 100644 --- a/stdlib/test/builtin/test_bfloat16.mojo +++ b/stdlib/test/builtin/test_bfloat16.mojo @@ -68,7 +68,7 @@ def check_float64_values(): ) assert_equal( - str( + String( Float64( __mlir_op.`pop.cast`[_type = __mlir_type[`!pop.scalar`]]( __mlir_op.`kgen.param.constant`[ diff --git a/stdlib/test/builtin/test_bool.mojo b/stdlib/test/builtin/test_bool.mojo index 2225b795bf..11d0a353dd 100644 --- a/stdlib/test/builtin/test_bool.mojo +++ b/stdlib/test/builtin/test_bool.mojo @@ -51,9 +51,9 @@ def test_convert_from_implicitly_boolable(): assert_true(bool(MyTrue())) -def test_bool_to_string(): - assert_equal(str(True), "True") - assert_equal(str(False), "False") +# def test_bool_to_string(): +# assert_equal(String(True), "True") +# assert_equal(String(False), "False") def test_bool_representation(): @@ -159,7 +159,7 @@ def main(): test_bool_cast_to_int() test_bool_none() test_convert_from_implicitly_boolable() - test_bool_to_string() + # test_bool_to_string() test_bool_representation() test_bitwise() test_neg() diff --git a/stdlib/test/builtin/test_char.mojo b/stdlib/test/builtin/test_char.mojo index b38a855051..ce52119ad1 100644 --- a/stdlib/test/builtin/test_char.mojo +++ b/stdlib/test/builtin/test_char.mojo @@ -56,11 +56,11 @@ def test_char_comparison(): def test_char_formatting(): - assert_equal(str(Char(0)), "\0") - assert_equal(str(Char(32)), " ") - assert_equal(str(Char(97)), "a") - assert_equal(str(Char.from_u32(0x00BE).value()), "¾") - assert_equal(str(Char.from_u32(0x1F642).value()), "🙂") + assert_equal(String(Char(0)), "\0") + assert_equal(String(Char(32)), " ") + assert_equal(String(Char(97)), "a") + assert_equal(String(Char.from_u32(0x00BE).value()), "¾") + assert_equal(String(Char.from_u32(0x1F642).value()), "🙂") def test_char_properties(): diff --git a/stdlib/test/builtin/test_dtype.mojo b/stdlib/test/builtin/test_dtype.mojo index d941ab794a..eba0e13117 100644 --- a/stdlib/test/builtin/test_dtype.mojo +++ b/stdlib/test/builtin/test_dtype.mojo @@ -24,8 +24,8 @@ fn test_equality() raises: fn test_stringable() raises: - assert_equal("float32", str(DType.float32)) - assert_equal("int64", str(DType.int64)) + assert_equal("float32", String(DType.float32)) + assert_equal("int64", String(DType.int64)) fn test_representable() raises: diff --git a/stdlib/test/builtin/test_error.mojo b/stdlib/test/builtin/test_error.mojo index eb24ee7e4b..70dea916e7 100644 --- a/stdlib/test/builtin/test_error.mojo +++ b/stdlib/test/builtin/test_error.mojo @@ -23,15 +23,15 @@ def test_error_raising(): try: raise_an_error() except e: - assert_equal(str(e), "MojoError: This is an error!") + assert_equal(String(e), "MojoError: This is an error!") def test_from_and_to_string(): var my_string: String = "FOO" var error = Error(my_string) - assert_equal(str(error), "FOO") + assert_equal(String(error), "FOO") - assert_equal(str(Error("bad")), "bad") + assert_equal(String(Error("bad")), "bad") assert_equal(repr(Error("err")), "Error('err')") diff --git a/stdlib/test/builtin/test_file.mojo b/stdlib/test/builtin/test_file.mojo index 96043d9952..c8c792a6ee 100644 --- a/stdlib/test/builtin/test_file.mojo +++ b/stdlib/test/builtin/test_file.mojo @@ -164,7 +164,7 @@ def test_file_seek(): _ = f.seek(-12) except e: alias expected_msg = "seek error" - assert_equal(str(e)[: len(expected_msg)], expected_msg) + assert_equal(String(e)[: len(expected_msg)], expected_msg) def test_file_open_nodir(): @@ -232,14 +232,14 @@ def test_file_read_to_dtype_pointer(): var ptr = UnsafePointer[UInt8].alloc(8) var data = f.read(ptr, 8) assert_equal( - str(ptr.load[width=8](0)), + String(ptr.load[width=8](0)), "[76, 111, 114, 101, 109, 32, 105, 112]", ) var ptr2 = UnsafePointer[Int8].alloc(8) var data2 = f.read(ptr2, 8) assert_equal( - str(ptr2.load[width=8](0)), + String(ptr2.load[width=8](0)), "[115, 117, 109, 32, 100, 111, 108, 111]", ) diff --git a/stdlib/test/builtin/test_format_float.mojo b/stdlib/test/builtin/test_format_float.mojo index 3bf820543d..7c022ec74b 100644 --- a/stdlib/test/builtin/test_format_float.mojo +++ b/stdlib/test/builtin/test_format_float.mojo @@ -93,7 +93,7 @@ def test_float64(): var mojo_f64_str = String() _write_float(mojo_f64_str, f[]) - var py_f64_str = str(PythonObject(f[])) + var py_f64_str = String(PythonObject(f[])) assert_equal(py_f64_str, mojo_f64_str) @@ -188,7 +188,7 @@ def test_float32(): var mojo_f32_str = String() _write_float(mojo_f32_str, f[]) - var py_f32_str = str(np.float32(f[])) + var py_f32_str = String(np.float32(f[])) assert_equal(py_f32_str, mojo_f32_str) @@ -198,7 +198,7 @@ def test_random_floats(): var f64 = random_float64() var mojo_f64_str = String() _write_float(mojo_f64_str, f64) - var py_f64_str = str(PythonObject(f64)) + var py_f64_str = String(PythonObject(f64)) assert_equal(py_f64_str, mojo_f64_str) diff --git a/stdlib/test/builtin/test_issue_1004.mojo b/stdlib/test/builtin/test_issue_1004.mojo index 15e0c9f41c..db6ed5f61d 100644 --- a/stdlib/test/builtin/test_issue_1004.mojo +++ b/stdlib/test/builtin/test_issue_1004.mojo @@ -24,4 +24,4 @@ def main(): try: foo("Hello") except e: - assert_equal(str(e), "Failed on: Hello") + assert_equal(String(e), "Failed on: Hello") diff --git a/stdlib/test/builtin/test_location.mojo b/stdlib/test/builtin/test_location.mojo index cc9a706249..29c7e40401 100644 --- a/stdlib/test/builtin/test_location.mojo +++ b/stdlib/test/builtin/test_location.mojo @@ -239,7 +239,7 @@ fn source_loc_with_debug() -> _SourceLocation: fn test_source_location_struct() raises: var source_loc = _SourceLocation(50, 60, "/path/to/some_file.mojo") - assert_equal(str(source_loc), "/path/to/some_file.mojo:50:60") + assert_equal(String(source_loc), "/path/to/some_file.mojo:50:60") fn main() raises: diff --git a/stdlib/test/builtin/test_object.mojo b/stdlib/test/builtin/test_object.mojo index 899c75da17..848fdbbb76 100644 --- a/stdlib/test/builtin/test_object.mojo +++ b/stdlib/test/builtin/test_object.mojo @@ -191,8 +191,8 @@ def test_function_raises(a) -> object: def test_object_function(): var a: object = test_function - assert_true(str(a).startswith("Function at address 0x")) - assert_equal(str(a(1, 2)), str(3)) + assert_true(String(a).startswith("Function at address 0x")) + assert_equal(String(a(1, 2)), String(3)) a = test_function_raises with assert_raises(contains="Error from function type"): a(1) @@ -254,22 +254,22 @@ def test_matrix(): C.append(row_zero) matmul_untyped(C, A, B) - assert_equal(str(C[0]), "[5, 8, 11]") - assert_equal(str(C[1]), "[8, 14, 20]") - assert_equal(str(C[2]), "[11, 20, 29]") + assert_equal(String(C[0]), "[5, 8, 11]") + assert_equal(String(C[1]), "[8, 14, 20]") + assert_equal(String(C[2]), "[11, 20, 29]") def test_convert_to_string(): var a: object = True - assert_equal(str(a), "True") + assert_equal(String(a), "True") a = 42 - assert_equal(str(a), "42") + assert_equal(String(a), "42") a = 2.5 - assert_equal(str(a), "2.5") + assert_equal(String(a), "2.5") a = "hello" - assert_equal(str(a), "'hello'") + assert_equal(String(a), "'hello'") a = [] - assert_equal(str(a), "[]") + assert_equal(String(a), "[]") a.append(3) a.append(False) a.append(5.5) @@ -277,30 +277,32 @@ def test_convert_to_string(): b.append("foo") b.append("baz") a.append(b) - assert_equal(str(a), "[3, False, 5.5, ['foo', 'baz']]") - assert_equal(str(a[3, 1]), "'baz'") + assert_equal(String(a), "[3, False, 5.5, ['foo', 'baz']]") + assert_equal(String(a[3, 1]), "'baz'") a[3, 1] = "bar" - assert_equal(str(a[3, 1]), "'bar'") + assert_equal(String(a[3, 1]), "'bar'") var c = a + b - assert_equal(str(c), "[3, False, 5.5, ['foo', 'bar'], 'foo', 'bar']") + assert_equal(String(c), "[3, False, 5.5, ['foo', 'bar'], 'foo', 'bar']") b.append(False) - assert_equal(str(c), "[3, False, 5.5, ['foo', 'bar', False], 'foo', 'bar']") - assert_equal(str(a), "[3, False, 5.5, ['foo', 'bar', False]]") - assert_equal(str(c[3]), "['foo', 'bar', False]") + assert_equal( + String(c), "[3, False, 5.5, ['foo', 'bar', False], 'foo', 'bar']" + ) + assert_equal(String(a), "[3, False, 5.5, ['foo', 'bar', False]]") + assert_equal(String(c[3]), "['foo', 'bar', False]") b[1] = object() - assert_equal(str(a), "[3, False, 5.5, ['foo', None, False]]") + assert_equal(String(a), "[3, False, 5.5, ['foo', None, False]]") a = "abc" b = a[True] - assert_equal(str(b), "'b'") + assert_equal(String(b), "'b'") b = a[2] - assert_equal(str(b), "'c'") + assert_equal(String(b), "'c'") a = [1, 1.2, False, "true"] - assert_equal(str(a), "[1, 1.2, False, 'true']") + assert_equal(String(a), "[1, 1.2, False, 'true']") a = object(Attr("foo", 5), Attr("bar", "hello"), Attr("baz", False)) - assert_equal(str(a.bar), "'hello'") + assert_equal(String(a.bar), "'hello'") a.bar = [1, 2] - assert_equal(str(a), "{'foo' = 5, 'bar' = [1, 2], 'baz' = False}") + assert_equal(String(a), "{'foo' = 5, 'bar' = [1, 2], 'baz' = False}") assert_equal(repr(a), "{'foo' = 5, 'bar' = [1, 2], 'baz' = False}") diff --git a/stdlib/test/builtin/test_print.mojo b/stdlib/test/builtin/test_print.mojo index 4ace3a30c1..a16e54c918 100644 --- a/stdlib/test/builtin/test_print.mojo +++ b/stdlib/test/builtin/test_print.mojo @@ -24,7 +24,7 @@ from utils import IndexList, StringRef @always_inline fn _assert_error[T: Stringable](msg: T, loc: _SourceLocation) -> String: - return loc.prefix("AssertionError: " + str(msg)) + return loc.prefix("AssertionError: " + String(msg)) fn _assert_equal_error( diff --git a/stdlib/test/builtin/test_simd.mojo b/stdlib/test/builtin/test_simd.mojo index c9c4a9ed53..3d83ed1bec 100644 --- a/stdlib/test/builtin/test_simd.mojo +++ b/stdlib/test/builtin/test_simd.mojo @@ -106,32 +106,32 @@ def test_cast_init(): def test_simd_variadic(): - assert_equal(str(SIMD[DType.index, 4](52, 12, 43, 5)), "[52, 12, 43, 5]") + assert_equal(String(SIMD[DType.index, 4](52, 12, 43, 5)), "[52, 12, 43, 5]") def test_convert_simd_to_string(): var a: SIMD[DType.float32, 2] = 5 - assert_equal(str(a), "[5.0, 5.0]") + assert_equal(String(a), "[5.0, 5.0]") var b: SIMD[DType.float64, 4] = 6 - assert_equal(str(b), "[6.0, 6.0, 6.0, 6.0]") + assert_equal(String(b), "[6.0, 6.0, 6.0, 6.0]") var c: SIMD[DType.index, 8] = 7 - assert_equal(str(c), "[7, 7, 7, 7, 7, 7, 7, 7]") + assert_equal(String(c), "[7, 7, 7, 7, 7, 7, 7, 7]") # TODO: uncomment when https://github.com/modularml/mojo/issues/2353 is fixed - # assert_equal(str(UInt32(-1)), "4294967295") - assert_equal(str(UInt64(-1)), "18446744073709551615") + # assert_equal(String(UInt32(-1)), "4294967295") + assert_equal(String(UInt64(-1)), "18446744073709551615") - assert_equal(str((UInt16(32768))), "32768") - assert_equal(str((UInt16(65535))), "65535") - assert_equal(str((Int16(-2))), "-2") + assert_equal(String((UInt16(32768))), "32768") + assert_equal(String((UInt16(65535))), "65535") + assert_equal(String((Int16(-2))), "-2") - assert_equal(str(UInt64(16646288086500911323)), "16646288086500911323") + assert_equal(String(UInt64(16646288086500911323)), "16646288086500911323") # https://github.com/modularml/mojo/issues/556 assert_equal( - str( + String( SIMD[DType.uint64, 4]( 0xA0761D6478BD642F, 0xE7037ED1A0B428DB, @@ -146,7 +146,7 @@ def test_convert_simd_to_string(): ) assert_equal( - str( + String( SIMD[DType.int32, 4](-943274556, -875902520, -808530484, -741158448) ), "[-943274556, -875902520, -808530484, -741158448]", @@ -195,12 +195,12 @@ def test_issue_1625(): # FIXME (40568) should directly use the SIMD assert_equal assert_equal( - str(evens_and_odds[0]), - str(SIMD[DType.int64, 8](0, 2, 4, 6, 8, 10, 12, 14)), + String(evens_and_odds[0]), + String(SIMD[DType.int64, 8](0, 2, 4, 6, 8, 10, 12, 14)), ) assert_equal( - str(evens_and_odds[1]), - str(SIMD[DType.int64, 8](1, 3, 5, 7, 9, 11, 13, 15)), + String(evens_and_odds[1]), + String(SIMD[DType.int64, 8](1, 3, 5, 7, 9, 11, 13, 15)), ) ptr.free() @@ -1052,7 +1052,8 @@ def test_join(): def test_interleave(): assert_equal( - str(Int32(0).interleave(Int32(1))), str(SIMD[DType.index, 2](0, 1)) + String(Int32(0).interleave(Int32(1))), + String(SIMD[DType.index, 2](0, 1)), ) assert_equal( diff --git a/stdlib/test/builtin/test_slice.mojo b/stdlib/test/builtin/test_slice.mojo index 2208a5bf3a..da32ed9903 100644 --- a/stdlib/test/builtin/test_slice.mojo +++ b/stdlib/test/builtin/test_slice.mojo @@ -67,7 +67,7 @@ struct SliceStringable: pass fn __getitem__(self, a: Slice) -> String: - return str(a) + return String(a) def test_slice_stringable(): diff --git a/stdlib/test/builtin/test_sort.mojo b/stdlib/test/builtin/test_sort.mojo index 5c9e9a253d..edba5a03d1 100644 --- a/stdlib/test/builtin/test_sort.mojo +++ b/stdlib/test/builtin/test_sort.mojo @@ -49,14 +49,15 @@ fn random_numbers[ # sort[dtype](list) # for i in range(1, len(list)): # assert_true( -# list[i] >= list[i - 1], str(list[i - 1]) + " > " + str(list[i]) +# list[i] >= list[i - 1], String(list[i - 1]) + " > " + String(list[i]) # ) fn assert_sorted_string(mut list: List[String]) raises: for i in range(1, len(list)): assert_true( - list[i] >= list[i - 1], str(list[i - 1]) + " > " + str(list[i]) + list[i] >= list[i - 1], + String(list[i - 1]) + " > " + String(list[i]), ) @@ -64,7 +65,7 @@ fn assert_sorted[ type: ComparableCollectionElement ](mut list: List[type]) raises: for i in range(1, len(list)): - assert_true(list[i] >= list[i - 1], "error at index: " + str(i)) + assert_true(list[i] >= list[i - 1], "error at index: " + String(i)) fn test_sort_small_3() raises: @@ -522,7 +523,7 @@ def test_sort_string_small_list(): var list = random_numbers[DType.int32](10) var string_list = List[String]() for n in list: - string_list.append(str(Int(n[]))) + string_list.append(String(Int(n[]))) sort(string_list) assert_sorted_string(string_list) @@ -531,7 +532,7 @@ def test_sort_string_big_list(): var list = random_numbers[DType.int32](1000) var string_list = List[String]() for n in list: - string_list.append(str(Int(n[]))) + string_list.append(String(Int(n[]))) sort(string_list) assert_sorted_string(string_list) diff --git a/stdlib/test/builtin/test_str.mojo b/stdlib/test/builtin/test_str.mojo index 434915d8b3..594777287f 100644 --- a/stdlib/test/builtin/test_str.mojo +++ b/stdlib/test/builtin/test_str.mojo @@ -16,7 +16,7 @@ from testing import assert_equal def test_str_none(): - assert_equal(str(None), "None") + assert_equal(String(None), "None") def main(): diff --git a/stdlib/test/builtin/test_string_literal.mojo b/stdlib/test/builtin/test_string_literal.mojo index b0782481f3..fb86aecebb 100644 --- a/stdlib/test/builtin/test_string_literal.mojo +++ b/stdlib/test/builtin/test_string_literal.mojo @@ -66,7 +66,7 @@ def test_equality(): assert_true(StringLiteral.__ne__("five", "six")) assert_false(StringLiteral.__ne__("six", "six")) - var hello = str("hello") + var hello = String("hello") var hello_ref = hello.as_string_slice() assert_false(StringLiteral.__eq__("goodbye", hello)) diff --git a/stdlib/test/builtin/test_uint.mojo b/stdlib/test/builtin/test_uint.mojo index 005c7ee43f..2f15a1c9ad 100644 --- a/stdlib/test/builtin/test_uint.mojo +++ b/stdlib/test/builtin/test_uint.mojo @@ -19,12 +19,12 @@ from testing import assert_equal, assert_false, assert_not_equal, assert_true def test_simple_uint(): - assert_equal(str(UInt(32)), "32") + assert_equal(String(UInt(32)), "32") - assert_equal(str(UInt(0)), "0") - assert_equal(str(UInt()), "0") + assert_equal(String(UInt(0)), "0") + assert_equal(String(UInt()), "0") - assert_equal(str(UInt(18446744073709551615)), "18446744073709551615") + assert_equal(String(UInt(18446744073709551615)), "18446744073709551615") def test_uint_representation(): diff --git a/stdlib/test/collections/string/test_inlined_string.mojo b/stdlib/test/collections/string/test_inlined_string.mojo index 027ef84fd2..672a25ecfe 100644 --- a/stdlib/test/collections/string/test_inlined_string.mojo +++ b/stdlib/test/collections/string/test_inlined_string.mojo @@ -35,7 +35,7 @@ def test_fixed_string(): var s = _FixedString[50]("hello world") # Test conversion to String - assert_equal(str(s), "hello world") + assert_equal(String(s), "hello world") # Test comparison with StringLiteral assert_equal(s, "hello world") @@ -55,7 +55,7 @@ def test_fixed_string(): var s3 = _FixedString[1]("") assert_equal(len(s3), 0) - assert_equal(str(s3), "") + assert_equal(String(s3), "") def test_fixed_string_growth(): @@ -65,7 +65,7 @@ def test_fixed_string_growth(): s1 += "hello " assert_equal(len(s1), 6) - assert_equal(str(s1), "hello ") + assert_equal(String(s1), "hello ") try: s1 += "world" @@ -80,7 +80,7 @@ def test_fixed_string_growth(): ) # s1 should be unchanged by the failed append - assert_equal(str(s1), "hello ") + assert_equal(String(s1), "hello ") def test_small_string_construction(): @@ -149,7 +149,7 @@ def test_small_string_iadd(): assert_equal(len(s1), 37) assert_true(not s1._is_small()) - assert_equal(str(s1), "Hello world, how's it going? The End.") + assert_equal(String(s1), "Hello world, how's it going? The End.") # ================================== # Test appending String to InlineString @@ -158,7 +158,7 @@ def test_small_string_iadd(): var s2 = InlineString("") s2 += String("Hello, World!") - assert_equal(str(s2), "Hello, World!") + assert_equal(String(s2), "Hello, World!") assert_equal(len(s2), 13) @@ -169,7 +169,7 @@ def test_small_string_add(): var s1: InlineString = InlineString("hello") + " world" - assert_equal(str(s1), "hello world") + assert_equal(String(s1), "hello world") assert_equal(len(s1), "11") # @@ -178,7 +178,7 @@ def test_small_string_add(): var s2: InlineString = InlineString("hello") + InlineString(" world") - assert_equal(str(s2), "hello world") + assert_equal(String(s2), "hello world") assert_equal(len(s2), "11") # @@ -187,5 +187,5 @@ def test_small_string_add(): var s3: InlineString = InlineString("hello") + String(" world") - assert_equal(str(s3), "hello world") + assert_equal(String(s3), "hello world") assert_equal(len(s3), "11") diff --git a/stdlib/test/collections/string/test_string.mojo b/stdlib/test/collections/string/test_string.mojo index 9e231af486..6e59e59c3d 100644 --- a/stdlib/test/collections/string/test_string.mojo +++ b/stdlib/test/collections/string/test_string.mojo @@ -37,10 +37,10 @@ struct AString(Stringable): def test_stringable(): - assert_equal("hello", str("hello")) - assert_equal("0", str(0)) - assert_equal("AAA", str(StringRef("AAA"))) - assert_equal("a string", str(AString())) + assert_equal("hello", String("hello")) + assert_equal("0", String(0)) + assert_equal("AAA", String(StringRef("AAA"))) + assert_equal("a string", String(AString())) def test_constructors(): @@ -49,17 +49,17 @@ def test_constructors(): assert_true(not String()) # Construction from Int - var s0 = str(0) - assert_equal("0", str(0)) + var s0 = String(0) + assert_equal("0", String(0)) assert_equal(1, len(s0)) - var s1 = str(123) - assert_equal("123", str(123)) + var s1 = String(123) + assert_equal("123", String(123)) assert_equal(3, len(s1)) # Construction from StringLiteral var s2 = String("abc") - assert_equal("abc", str(s2)) + assert_equal("abc", String(s2)) assert_equal(3, len(s2)) # Construction from UnsafePointer @@ -83,7 +83,7 @@ def test_constructors(): def test_copy(): var s0 = String("find") - var s1 = str(s0) + var s1 = String(s0) s1._buffer[3] = ord("e") assert_equal("find", s0) assert_equal("fine", s1) @@ -171,7 +171,7 @@ def test_add(): var s8 = String("abc is ") var s9 = AString() - assert_equal("abc is a string", str(s8) + str(s9)) + assert_equal("abc is a string", String(s8) + String(s9)) def test_add_string_slice(): diff --git a/stdlib/test/collections/string/test_string_slice.mojo b/stdlib/test/collections/string/test_string_slice.mojo index 8a94cb024f..105c88c159 100644 --- a/stdlib/test/collections/string/test_string_slice.mojo +++ b/stdlib/test/collections/string/test_string_slice.mojo @@ -225,7 +225,7 @@ fn test_slice_bool() raises: def test_slice_repr(): # Standard single-byte characters assert_equal(StringSlice.__repr__("hello"), "'hello'") - assert_equal(StringSlice.__repr__(str(0)), "'0'") + assert_equal(StringSlice.__repr__(String(0)), "'0'") assert_equal(StringSlice.__repr__("A"), "'A'") assert_equal(StringSlice.__repr__(" "), "' '") assert_equal(StringSlice.__repr__("~"), "'~'") @@ -334,34 +334,40 @@ fn test_utf8_validation() raises: def test_find(): - haystack = str("abcdefg").as_string_slice() - haystack_with_special_chars = str("abcdefg@#$").as_string_slice() - haystack_repeated_chars = str("aaaaaaaaaaaaaaaaaaaaaaaa").as_string_slice() - - assert_equal(haystack.find(str("a").as_string_slice()), 0) - assert_equal(haystack.find(str("ab").as_string_slice()), 0) - assert_equal(haystack.find(str("abc").as_string_slice()), 0) - assert_equal(haystack.find(str("bcd").as_string_slice()), 1) - assert_equal(haystack.find(str("de").as_string_slice()), 3) - assert_equal(haystack.find(str("fg").as_string_slice()), 5) - assert_equal(haystack.find(str("g").as_string_slice()), 6) - assert_equal(haystack.find(str("z").as_string_slice()), -1) - assert_equal(haystack.find(str("zzz").as_string_slice()), -1) - - assert_equal(haystack.find(str("@#$").as_string_slice()), -1) + haystack = String("abcdefg").as_string_slice() + haystack_with_special_chars = String("abcdefg@#$").as_string_slice() + haystack_repeated_chars = String( + "aaaaaaaaaaaaaaaaaaaaaaaa" + ).as_string_slice() + + assert_equal(haystack.find(String("a").as_string_slice()), 0) + assert_equal(haystack.find(String("ab").as_string_slice()), 0) + assert_equal(haystack.find(String("abc").as_string_slice()), 0) + assert_equal(haystack.find(String("bcd").as_string_slice()), 1) + assert_equal(haystack.find(String("de").as_string_slice()), 3) + assert_equal(haystack.find(String("fg").as_string_slice()), 5) + assert_equal(haystack.find(String("g").as_string_slice()), 6) + assert_equal(haystack.find(String("z").as_string_slice()), -1) + assert_equal(haystack.find(String("zzz").as_string_slice()), -1) + + assert_equal(haystack.find(String("@#$").as_string_slice()), -1) assert_equal( - haystack_with_special_chars.find(str("@#$").as_string_slice()), 7 + haystack_with_special_chars.find(String("@#$").as_string_slice()), 7 ) - assert_equal(haystack_repeated_chars.find(str("aaa").as_string_slice()), 0) - assert_equal(haystack_repeated_chars.find(str("AAa").as_string_slice()), -1) + assert_equal( + haystack_repeated_chars.find(String("aaa").as_string_slice()), 0 + ) + assert_equal( + haystack_repeated_chars.find(String("AAa").as_string_slice()), -1 + ) assert_equal( - haystack.find(str("hijklmnopqrstuvwxyz").as_string_slice()), -1 + haystack.find(String("hijklmnopqrstuvwxyz").as_string_slice()), -1 ) assert_equal( - str("").as_string_slice().find(str("abc").as_string_slice()), -1 + String("").as_string_slice().find(String("abc").as_string_slice()), -1 ) @@ -510,7 +516,7 @@ def test_splitlines(): ](l1: List[StringSlice[O1]], l2: List[String]) raises: assert_equal(len(l1), len(l2)) for i in range(len(l1)): - assert_equal(str(l1[i]), l2[i]) + assert_equal(String(l1[i]), l2[i]) # Test with no line breaks assert_equal(S("hello world").splitlines(), L("hello world")) diff --git a/stdlib/test/collections/test_dict.mojo b/stdlib/test/collections/test_dict.mojo index d9252d8f3d..6fb74b3d29 100644 --- a/stdlib/test/collections/test_dict.mojo +++ b/stdlib/test/collections/test_dict.mojo @@ -78,7 +78,7 @@ def test_basic_no_copies(): def test_multiple_resizes(): var dict = Dict[String, Int]() for i in range(20): - dict["key" + str(i)] = i + 1 + dict["key" + String(i)] = i + 1 assert_equal(11, dict["key10"]) assert_equal(20, dict["key19"]) @@ -99,7 +99,7 @@ def test_bool_conversion(): def test_big_dict(): var dict = Dict[String, Int]() for i in range(2000): - dict["key" + str(i)] = i + 1 + dict["key" + String(i)] = i + 1 assert_equal(2000, len(dict)) @@ -132,7 +132,7 @@ def test_dict_string_representation_int_int(): def test_compact(): var dict = Dict[String, Int]() for i in range(20): - var key = "key" + str(i) + var key = "key" + String(i) dict[key] = i + 1 _ = dict.pop(key) assert_equal(0, len(dict)) @@ -141,10 +141,10 @@ def test_compact(): def test_compact_with_elements(): var dict = Dict[String, Int]() for i in range(5): - var key = "key" + str(i) + var key = "key" + String(i) dict[key] = i + 1 for i in range(5, 20): - var key = "key" + str(i) + var key = "key" + String(i) dict[key] = i + 1 _ = dict.pop(key) assert_equal(5, len(dict)) @@ -270,7 +270,7 @@ def test_dict_copy_add_new_item(): # test there are two copies of dict and # they don't share underlying memory copy["b"] = 2 - assert_false(str(2) in orig) + assert_false(String(2) in orig) def test_dict_copy_calls_copy_constructor(): @@ -608,14 +608,14 @@ def test_compile_time_dict(): fn _get_dict() -> Dict[String, Int32]: var res = Dict[String, Int32]() for i in range(N): - res[str(i)] = i + res[String(i)] = i return res alias my_dict = _get_dict() @parameter for i in range(N): - alias val = my_dict.get(str(i)).value() + alias val = my_dict.get(String(i)).value() assert_equal(val, i) diff --git a/stdlib/test/collections/test_inline_array.mojo b/stdlib/test/collections/test_inline_array.mojo index 29268017ba..2f311931de 100644 --- a/stdlib/test/collections/test_inline_array.mojo +++ b/stdlib/test/collections/test_inline_array.mojo @@ -187,8 +187,8 @@ def test_array_unsafe_assume_initialized_constructor_string(): def test_array_contains(): var arr = InlineArray[String, 3]("hi", "hello", "hey") - assert_true(str("hi") in arr) - assert_true(not str("greetings") in arr) + assert_true(String("hi") in arr) + assert_true(not String("greetings") in arr) def test_inline_array_runs_destructors(): diff --git a/stdlib/test/collections/test_linked_list.mojo b/stdlib/test/collections/test_linked_list.mojo index fa8b12b85d..1375def212 100644 --- a/stdlib/test/collections/test_linked_list.mojo +++ b/stdlib/test/collections/test_linked_list.mojo @@ -101,7 +101,7 @@ def test_setitem(): def test_str(): var l1 = LinkedList[Int](1, 2, 3) - assert_equal(str(l1), "[1, 2, 3]") + assert_equal(String(l1), "[1, 2, 3]") def test_repr(): diff --git a/stdlib/test/hashlib/test_ahash.mojo b/stdlib/test/hashlib/test_ahash.mojo index 9a58a753b2..4fa20d1571 100644 --- a/stdlib/test/hashlib/test_ahash.mojo +++ b/stdlib/test/hashlib/test_ahash.mojo @@ -577,7 +577,7 @@ fn gen_word_pairs[words: String = words_en]() -> List[String]: try: var list = words.split(", ") for w in list: - var w1 = str(w[].strip()) + var w1 = String(w[].strip()) for w in list: var w2 = w[].strip() result.append(w1 + " " + w2) @@ -597,7 +597,7 @@ def assert_dif_hashes(hashes: List[UInt64], upper_bound: Int): var diff = dif_bits(hashes[i], hashes[j]) assert_true( diff > upper_bound, - str("Index: {}:{}, diff between: {} and {} is: {}").format( + String("Index: {}:{}, diff between: {} and {} is: {}").format( i, j, hashes[i], hashes[j], diff ), location=__call_location(), @@ -653,7 +653,7 @@ def test_avalanche(): var diff = dif_bits(hashes0[i], hashes1[i]) assert_true( diff > 16, - str("Index: {}, diff between: {} and {} is: {}").format( + String("Index: {}, diff between: {} and {} is: {}").format( i, hashes0[i], hashes1[i], diff ), ) @@ -678,7 +678,7 @@ def test_trailing_zeros(): var diff = dif_bits(hashes0[i], hashes1[i]) assert_true( diff > 18, - str("Index: {}, diff between: {} and {} is: {}").format( + String("Index: {}, diff between: {} and {} is: {}").format( i, hashes0[i], hashes1[i], diff ), ) @@ -705,7 +705,7 @@ def assert_fill_factor[ var fill_factor = 1 - unfilled / num_buckets assert_true( fill_factor >= lower_bound, - str("Fill factor for {} is {}, provided lower boound was {}").format( + String("Fill factor for {} is {}, provided lower boound was {}").format( label, fill_factor, lower_bound ), location=__call_location(), @@ -730,7 +730,7 @@ def assert_fill_factor_old_hash[ var fill_factor = 1 - unfilled / num_buckets assert_true( fill_factor >= lower_bound, - str("Fill factor for {} is {}, provided lower bound was {}").format( + String("Fill factor for {} is {}, provided lower bound was {}").format( label, fill_factor, lower_bound ), location=__call_location(), diff --git a/stdlib/test/hashlib/test_hasher.mojo b/stdlib/test/hashlib/test_hasher.mojo index 4c10ac50a5..c60032b2e1 100644 --- a/stdlib/test/hashlib/test_hasher.mojo +++ b/stdlib/test/hashlib/test_hasher.mojo @@ -156,7 +156,7 @@ def test_with_ahasher(): def test_hash_hashable_with_hasher_types(): assert_equal(_hash_with_hasher(DType.uint64), 6529703120343940753) assert_equal(_hash_with_hasher(""), 11583516797109448887) - assert_equal(_hash_with_hasher(str("")), 11583516797109448887) + assert_equal(_hash_with_hasher(String("")), 11583516797109448887) assert_equal(_hash_with_hasher(StringRef("")), 11583516797109448887) assert_equal(_hash_with_hasher(Int(-123)), 4720193641311814362) assert_equal(_hash_with_hasher(UInt(123)), 4498397628805512285) diff --git a/stdlib/test/memory/test_memory.mojo b/stdlib/test/memory/test_memory.mojo index 26d12e1d03..48b77fdc74 100644 --- a/stdlib/test/memory/test_memory.mojo +++ b/stdlib/test/memory/test_memory.mojo @@ -198,48 +198,48 @@ def test_memcmp_extensive[ assert_equal( memcmp(ptr1, ptr1, count), 0, - "for dtype=" + str(type) + ";count=" + str(count), + "for dtype=" + String(type) + ";count=" + String(count), ) assert_equal( memcmp(ptr1, ptr2, count), -1, - "for dtype=" + str(type) + ";count=" + str(count), + "for dtype=" + String(type) + ";count=" + String(count), ) assert_equal( memcmp(ptr2, ptr1, count), 1, - "for dtype=" + str(type) + ";count=" + str(count), + "for dtype=" + String(type) + ";count=" + String(count), ) assert_equal( memcmp(dptr1, dptr1, count), 0, "for dtype=" - + str(type) + + String(type) + ";extremes=" - + str(extermes) + + String(extermes) + ";count=" - + str(count), + + String(count), ) assert_equal( memcmp(dptr1, dptr2, count), -1, "for dtype=" - + str(type) + + String(type) + ";extremes=" - + str(extermes) + + String(extermes) + ";count=" - + str(count), + + String(count), ) assert_equal( memcmp(dptr2, dptr1, count), 1, "for dtype=" - + str(type) + + String(type) + ";extremes=" - + str(extermes) + + String(extermes) + ";count=" - + str(count), + + String(count), ) ptr1.free() @@ -313,21 +313,21 @@ def test_memset(): def test_pointer_string(): var nullptr = UnsafePointer[Int]() - assert_equal(str(nullptr), "0x0") + assert_equal(String(nullptr), "0x0") var ptr = UnsafePointer[Int].alloc(1) - assert_true(str(ptr).startswith("0x")) - assert_not_equal(str(ptr), "0x0") + assert_true(String(ptr).startswith("0x")) + assert_not_equal(String(ptr), "0x0") ptr.free() def test_dtypepointer_string(): var nullptr = UnsafePointer[Float32]() - assert_equal(str(nullptr), "0x0") + assert_equal(String(nullptr), "0x0") var ptr = UnsafePointer[Float32].alloc(1) - assert_true(str(ptr).startswith("0x")) - assert_not_equal(str(ptr), "0x0") + assert_true(String(ptr).startswith("0x")) + assert_not_equal(String(ptr), "0x0") ptr.free() @@ -367,8 +367,8 @@ def test_pointer_refitem_pair(): def test_address_space_str(): - assert_equal(str(AddressSpace.GENERIC), "AddressSpace.GENERIC") - assert_equal(str(AddressSpace(17)), "AddressSpace(17)") + assert_equal(String(AddressSpace.GENERIC), "AddressSpace.GENERIC") + assert_equal(String(AddressSpace(17)), "AddressSpace(17)") def test_dtypepointer_gather(): diff --git a/stdlib/test/memory/test_reference.mojo b/stdlib/test/memory/test_reference.mojo index 6b84cbc900..746c7e8fbf 100644 --- a/stdlib/test/memory/test_reference.mojo +++ b/stdlib/test/memory/test_reference.mojo @@ -38,7 +38,7 @@ def test_equality(): def test_str(): var a = Int(42) var a_ref = Pointer.address_of(a) - assert_true(str(a_ref).startswith("0x")) + assert_true(String(a_ref).startswith("0x")) def main(): diff --git a/stdlib/test/memory/test_unsafepointer.mojo b/stdlib/test/memory/test_unsafepointer.mojo index 5e8fefc1f5..5bf8837422 100644 --- a/stdlib/test/memory/test_unsafepointer.mojo +++ b/stdlib/test/memory/test_unsafepointer.mojo @@ -142,11 +142,11 @@ def test_bitcast(): def test_unsafepointer_string(): var nullptr = UnsafePointer[Int]() - assert_equal(str(nullptr), "0x0") + assert_equal(String(nullptr), "0x0") var ptr = UnsafePointer[Int].alloc(1) - assert_true(str(ptr).startswith("0x")) - assert_not_equal(str(ptr), "0x0") + assert_true(String(ptr).startswith("0x")) + assert_not_equal(String(ptr), "0x0") ptr.free() diff --git a/stdlib/test/os/path/test_isdir.mojo b/stdlib/test/os/path/test_isdir.mojo index 74e4b3e7fc..eb87a671b3 100644 --- a/stdlib/test/os/path/test_isdir.mojo +++ b/stdlib/test/os/path/test_isdir.mojo @@ -21,6 +21,6 @@ from testing import assert_false, assert_true def main(): assert_true(isdir(Path())) - assert_true(isdir(str(cwd()))) - assert_false(isdir(str(cwd() / "nonexistent"))) + assert_true(isdir(String(cwd()))) + assert_false(isdir(String(cwd() / "nonexistent"))) assert_false(isdir(__source_location().file_name)) diff --git a/stdlib/test/os/path/test_islink.mojo b/stdlib/test/os/path/test_islink.mojo index 9e6cac2153..c8b3af2e57 100644 --- a/stdlib/test/os/path/test_islink.mojo +++ b/stdlib/test/os/path/test_islink.mojo @@ -29,4 +29,4 @@ def main(): assert_true(isdir(Path(TEMP_DIR))) assert_true(isdir(TEMP_DIR)) assert_true(islink(TEMP_DIR)) - assert_false(islink(str(Path(TEMP_DIR) / "nonexistent"))) + assert_false(islink(String(Path(TEMP_DIR) / "nonexistent"))) diff --git a/stdlib/test/os/test_mkdir_and_rmdir.mojo b/stdlib/test/os/test_mkdir_and_rmdir.mojo index f2fd2171ee..4fef85d336 100644 --- a/stdlib/test/os/test_mkdir_and_rmdir.mojo +++ b/stdlib/test/os/test_mkdir_and_rmdir.mojo @@ -43,7 +43,7 @@ fn test_mkdir_and_rmdir(path: String) raises: # verify that the test dir does not exist before starting the test assert_false( exists(path), - "Unexpected dir " + str(path) + " it should not exist", + "Unexpected dir " + String(path) + " it should not exist", ) os.mkdir(path, 0o777) @@ -63,7 +63,7 @@ fn test_mkdir_and_rmdir(path: Path) raises: # verify that the test dir does not exist before starting the test assert_false( exists(path), - "Unexpected dir " + str(path) + " it should not exist", + "Unexpected dir " + String(path) + " it should not exist", ) os.mkdir(path, 0o777) @@ -83,7 +83,7 @@ fn test_makedirs_and_removedirs(path: Path) raises: # verify that the test dir does not exist before starting the test assert_false( exists(path), - "Unexpected dir " + str(path) + " it should not exist", + "Unexpected dir " + String(path) + " it should not exist", ) os.makedirs(path, exist_ok=True) assert_true(exists(path)) diff --git a/stdlib/test/os/test_remove.mojo b/stdlib/test/os/test_remove.mojo index ccd9382ad3..5d1506abdb 100644 --- a/stdlib/test/os/test_remove.mojo +++ b/stdlib/test/os/test_remove.mojo @@ -37,7 +37,7 @@ fn create_file_and_test_delete_path[ fn test_remove() raises: var cwd_path = Path() var my_file_path = cwd_path / "my_file.test" - var my_file_name = str(my_file_path) + var my_file_name = String(my_file_path) # verify that the test file does not exist before starting the test assert_false( @@ -57,7 +57,7 @@ fn test_remove() raises: create_file_and_test_delete_path[unlink, "unlink"](my_file_path) # test with relative path - my_file_name = str(Path("my_relative_file.test")) + my_file_name = String(Path("my_relative_file.test")) create_file_and_test_delete_path[remove, "remove"](my_file_name) diff --git a/stdlib/test/os/test_stat.mojo b/stdlib/test/os/test_stat.mojo index c6be572d9c..67a738e040 100644 --- a/stdlib/test/os/test_stat.mojo +++ b/stdlib/test/os/test_stat.mojo @@ -21,5 +21,5 @@ from testing import assert_not_equal, assert_true def main(): var st = stat(__source_location().file_name) - assert_not_equal(str(st), "") + assert_not_equal(String(st), "") assert_true(S_ISREG(st.st_mode)) diff --git a/stdlib/test/pathlib/test_pathlib.mojo b/stdlib/test/pathlib/test_pathlib.mojo index d57c149e0f..e13a4abf1b 100644 --- a/stdlib/test/pathlib/test_pathlib.mojo +++ b/stdlib/test/pathlib/test_pathlib.mojo @@ -23,16 +23,16 @@ alias TEMP_FILE = env_get_string["TEMP_FILE"]() def test_cwd(): - assert_true(str(cwd()).startswith("/")) + assert_true(String(cwd()).startswith("/")) def test_path(): - assert_true(str(Path() / "some" / "dir").endswith("/some/dir")) + assert_true(String(Path() / "some" / "dir").endswith("/some/dir")) - assert_equal(str(Path("/foo") / "bar" / "jar"), "/foo/bar/jar") + assert_equal(String(Path("/foo") / "bar" / "jar"), "/foo/bar/jar") assert_equal( - str(Path("/foo" + DIR_SEPARATOR) / "bar" / "jar"), "/foo/bar/jar" + String(Path("/foo" + DIR_SEPARATOR) / "bar" / "jar"), "/foo/bar/jar" ) assert_not_equal(Path().stat().st_mode, 0) @@ -102,7 +102,7 @@ fn get_current_home() -> String: def set_home(path: Path): - path_str = str(path) + path_str = String(path) @parameter if os_is_windows(): @@ -152,7 +152,7 @@ def test_stat(): var path = Path(__source_location().file_name) var stat = path.stat() assert_equal( - str(stat), + String(stat), "os.stat_result(st_mode={}, st_ino={}, st_dev={}, st_nlink={}," " st_uid={}, st_gid={}, st_size={}, st_atime={}, st_mtime={}," " st_ctime={}, st_birthtime={}, st_blocks={}, st_blksize={}," @@ -164,10 +164,10 @@ def test_stat(): stat.st_uid, stat.st_gid, stat.st_size, - str(stat.st_atimespec), - str(stat.st_mtimespec), - str(stat.st_ctimespec), - str(stat.st_birthtimespec), + String(stat.st_atimespec), + String(stat.st_mtimespec), + String(stat.st_ctimespec), + String(stat.st_birthtimespec), stat.st_blocks, stat.st_blksize, stat.st_rdev, diff --git a/stdlib/test/python/test_ownership.mojo b/stdlib/test/python/test_ownership.mojo index ec7a71d89e..4411185e77 100644 --- a/stdlib/test/python/test_ownership.mojo +++ b/stdlib/test/python/test_ownership.mojo @@ -27,27 +27,27 @@ fn test_import(mut python: Python) raises: fn test_list(mut python: Python) raises: var b: PythonObject = Python.import_module("builtins") var my_list = PythonObject([1, 2.34, "False"]) - var py_string = str(my_list) + var py_string = String(my_list) assert_equal(py_string, "[1, 2.34, 'False']") fn test_tuple(mut python: Python) raises: var b: PythonObject = Python.import_module("builtins") var my_tuple = PythonObject((1, 2.34, "False")) - var py_string = str(my_tuple) + var py_string = String(my_tuple) assert_equal(py_string, "(1, 2.34, 'False')") fn test_call_ownership(mut python: Python) raises: var obj: PythonObject = [1, "5"] - var py_string = str(obj) + var py_string = String(obj) var string = python.__str__(py_string) assert_equal(string, "[1, '5']") fn test_getitem_ownership(mut python: Python) raises: var obj: PythonObject = [1, "5"] - var py_string = str(obj[1]) + var py_string = String(obj[1]) var string = python.__str__(py_string) assert_equal(string, "5") @@ -55,7 +55,7 @@ fn test_getitem_ownership(mut python: Python) raises: fn test_getattr_ownership(mut python: Python) raises: var my_module: PythonObject = Python.import_module("my_module") var obj = my_module.Foo(4) - var py_string = str(obj.bar) + var py_string = String(obj.bar) var string = python.__str__(py_string) assert_equal(string, "4") diff --git a/stdlib/test/python/test_python_error_handling.mojo b/stdlib/test/python/test_python_error_handling.mojo index d74ed3b429..5659f2abf9 100644 --- a/stdlib/test/python/test_python_error_handling.mojo +++ b/stdlib/test/python/test_python_error_handling.mojo @@ -21,7 +21,7 @@ fn test_python_exception_import() raises: try: var sys = Python.import_module("my_uninstalled_module") except e: - assert_equal(str(e), "No module named 'my_uninstalled_module'") + assert_equal(String(e), "No module named 'my_uninstalled_module'") fn test_python_exception_getattr() raises: @@ -31,7 +31,7 @@ fn test_python_exception_getattr() raises: var person = my_module.Person() var expec_fail = person.undefined() except e: - assert_equal(str(e), "'Person' object has no attribute 'undefined'") + assert_equal(String(e), "'Person' object has no attribute 'undefined'") fn test_python_exception_getitem() raises: @@ -39,7 +39,7 @@ fn test_python_exception_getitem() raises: var list = PythonObject([1, 2, 3]) var should_fail = list[13] except e: - assert_equal(str(e), "list index out of range") + assert_equal(String(e), "list index out of range") fn test_python_exception_call() raises: diff --git a/stdlib/test/python/test_python_interop.mojo b/stdlib/test/python/test_python_interop.mojo index 3e1a465628..80fe6ea3d9 100644 --- a/stdlib/test/python/test_python_interop.mojo +++ b/stdlib/test/python/test_python_interop.mojo @@ -20,9 +20,9 @@ from testing import assert_equal fn test_execute_python_string(mut python: Python) -> String: try: _ = Python.evaluate("print('evaluated by PyRunString')") - return str(Python.evaluate("'a' + 'b'")) + return String(Python.evaluate("'a' + 'b'")) except e: - return str(e) + return String(e) fn test_local_import(mut python: Python) -> String: @@ -31,10 +31,10 @@ fn test_local_import(mut python: Python) -> String: if my_module: var foo = my_module.Foo("apple") foo.bar = "orange" - return str(foo.bar) + return String(foo.bar) return "no module, no fruit" except e: - return str(e) + return String(e) fn test_dynamic_import(mut python: Python, times: Int = 1) -> String: @@ -51,15 +51,15 @@ def hello(name): var mod = Python.evaluate(INLINE_MODULE, file=True) for _ in range(times - 1): mod.hello("world") - return str(mod.hello("world")) + return String(mod.hello("world")) except e: - return str(e) + return String(e) fn test_call(mut python: Python) -> String: try: var my_module: PythonObject = Python.import_module("my_module") - return str( + return String( my_module.eat_it_all( "carrot", "bread", @@ -70,7 +70,7 @@ fn test_call(mut python: Python) -> String: ) ) except e: - return str(e) + return String(e) def main(): @@ -93,12 +93,12 @@ def main(): ) var obj: PythonObject = [1, 2.4, True, "False"] - assert_equal(str(obj), "[1, 2.4, True, 'False']") + assert_equal(String(obj), "[1, 2.4, True, 'False']") obj = (1, 2.4, True, "False") - assert_equal(str(obj), "(1, 2.4, True, 'False')") + assert_equal(String(obj), "(1, 2.4, True, 'False')") obj = None - assert_equal(str(obj), "None") + assert_equal(String(obj), "None") assert_equal(test_execute_python_string(python), "ab") diff --git a/stdlib/test/python/test_python_object.mojo b/stdlib/test/python/test_python_object.mojo index 50540361ef..fe15369e5f 100644 --- a/stdlib/test/python/test_python_object.mojo +++ b/stdlib/test/python/test_python_object.mojo @@ -290,7 +290,7 @@ fn test_string_conversions() raises -> None: var py = Python() var py_float = PythonObject(3.14) var type_obj = py.type(py_float) - assert_equal(str(type_obj), "") + assert_equal(String(type_obj), "") test_string_literal() test_string() @@ -334,8 +334,8 @@ def test_nested_object(): var nested_list = PythonObject([a, b]) var nested_tuple = PythonObject((a, b)) - assert_equal(str(nested_list), "[[1, 2, 3], [4, 5, 6]]") - assert_equal(str(nested_tuple), "([1, 2, 3], [4, 5, 6])") + assert_equal(String(nested_list), "[[1, 2, 3], [4, 5, 6]]") + assert_equal(String(nested_tuple), "([1, 2, 3], [4, 5, 6])") fn test_iter() raises: @@ -368,9 +368,9 @@ fn test_iter() raises: fn test_setitem() raises: var ll = PythonObject([1, 2, 3, "food"]) - assert_equal(str(ll), "[1, 2, 3, 'food']") + assert_equal(String(ll), "[1, 2, 3, 'food']") ll[1] = "nomnomnom" - assert_equal(str(ll), "[1, 'nomnomnom', 3, 'food']") + assert_equal(String(ll), "[1, 'nomnomnom', 3, 'food']") fn test_dict() raises: @@ -380,20 +380,20 @@ fn test_dict() raises: d["food"] = 123 # intentionally replace to ensure keys stay in order var dd = PythonObject(d) - assert_equal(str(dd), "{'food': 123, 'fries': 'yes'}") + assert_equal(String(dd), "{'food': 123, 'fries': 'yes'}") dd["food"] = "salad" dd[42] = Python.evaluate("[4, 2]") - assert_equal(str(dd), "{'food': 'salad', 'fries': 'yes', 42: [4, 2]}") + assert_equal(String(dd), "{'food': 'salad', 'fries': 'yes', 42: [4, 2]}") # Also test that Python.dict() creates the right object. var empty = Python.dict() - assert_equal(str(empty), "{}") + assert_equal(String(empty), "{}") fn test_none() raises: var n = Python.none() - assert_equal(str(n), "None") + assert_equal(String(n), "None") assert_true(n is None) @@ -425,9 +425,9 @@ fn test_getitem_raises() raises: _ = d[0, 0] with_get = custom_indexable.WithGetItem() - assert_equal("Key: 0", str(with_get[0])) - assert_equal("Keys: 0, 0", str(with_get[0, 0])) - assert_equal("Keys: 0, 0, 0", str(with_get[0, 0, 0])) + assert_equal("Key: 0", String(with_get[0])) + assert_equal("Keys: 0, 0", String(with_get[0, 0])) + assert_equal("Keys: 0, 0, 0", String(with_get[0, 0, 0])) var without_get = custom_indexable.Simple() with assert_raises(contains="'Simple' object is not subscriptable"): @@ -441,7 +441,7 @@ fn test_getitem_raises() raises: _ = with_get_exception[1] with_2d = custom_indexable.With2DGetItem() - assert_equal("[1, 2, 3]", str(with_2d[0])) + assert_equal("[1, 2, 3]", String(with_2d[0])) assert_equal(2, with_2d[0, 1]) assert_equal(6, with_2d[1, 2]) @@ -487,43 +487,43 @@ def test_setitem_raises(): fn test_py_slice() raises: custom_indexable = Python.import_module("custom_indexable") var a = PythonObject([1, 2, 3, 4, 5]) - assert_equal("[2, 3]", str(a[1:3])) - assert_equal("[1, 2, 3, 4, 5]", str(a[:])) - assert_equal("[1, 2, 3]", str(a[:3])) - assert_equal("[3, 4, 5]", str(a[2:])) - assert_equal("[1, 3, 5]", str(a[::2])) - assert_equal("[2, 4]", str(a[1::2])) - assert_equal("[4, 5]", str(a[-2:])) - assert_equal("[1, 2, 3]", str(a[:-2])) - assert_equal("[5, 4, 3, 2, 1]", str(a[::-1])) - assert_equal("[1, 2, 3, 4, 5]", str(a[-10:10])) # out of bounds - assert_equal("[1, 2, 3, 4, 5]", str(a[::])) - assert_equal("[1, 2, 3, 4, 5]", str(a[:100])) - assert_equal("[]", str(a[5:])) - assert_equal("[5, 4, 3, 2]", str(a[:-5:-1])) + assert_equal("[2, 3]", String(a[1:3])) + assert_equal("[1, 2, 3, 4, 5]", String(a[:])) + assert_equal("[1, 2, 3]", String(a[:3])) + assert_equal("[3, 4, 5]", String(a[2:])) + assert_equal("[1, 3, 5]", String(a[::2])) + assert_equal("[2, 4]", String(a[1::2])) + assert_equal("[4, 5]", String(a[-2:])) + assert_equal("[1, 2, 3]", String(a[:-2])) + assert_equal("[5, 4, 3, 2, 1]", String(a[::-1])) + assert_equal("[1, 2, 3, 4, 5]", String(a[-10:10])) # out of bounds + assert_equal("[1, 2, 3, 4, 5]", String(a[::])) + assert_equal("[1, 2, 3, 4, 5]", String(a[:100])) + assert_equal("[]", String(a[5:])) + assert_equal("[5, 4, 3, 2]", String(a[:-5:-1])) var b = Python.evaluate("[i for i in range(1000)]") - assert_equal("[0, 250, 500, 750]", str(b[::250])) + assert_equal("[0, 250, 500, 750]", String(b[::250])) with assert_raises(contains="slice step cannot be zero"): _ = b[::0] # Negative cases such as `b[1.3:10]` or `b["1":10]` are handled by parser # which would normally throw a TypeError in Python var s = PythonObject("Hello, World!") - assert_equal("Hello", str(s[:5])) - assert_equal("World!", str(s[7:])) - assert_equal("!dlroW ,olleH", str(s[::-1])) - assert_equal("Hello, World!", str(s[:])) - assert_equal("Hlo ol!", str(s[::2])) - assert_equal("Hlo ol!", str(s[None:None:2])) + assert_equal("Hello", String(s[:5])) + assert_equal("World!", String(s[7:])) + assert_equal("!dlroW ,olleH", String(s[::-1])) + assert_equal("Hello, World!", String(s[:])) + assert_equal("Hlo ol!", String(s[::2])) + assert_equal("Hlo ol!", String(s[None:None:2])) var t = PythonObject((1, 2, 3, 4, 5)) - assert_equal("(2, 3, 4)", str(t[1:4])) - assert_equal("(4, 3, 2)", str(t[3:0:-1])) + assert_equal("(2, 3, 4)", String(t[1:4])) + assert_equal("(4, 3, 2)", String(t[3:0:-1])) var empty = PythonObject([]) - assert_equal("[]", str(empty[:])) - assert_equal("[]", str(empty[1:2:3])) + assert_equal("[]", String(empty[:])) + assert_equal("[]", String(empty[1:2:3])) # TODO: enable this test. Currently it fails with error: unhashable type: 'slice' # var d = Python.dict() @@ -533,31 +533,31 @@ fn test_py_slice() raises: # _ = d[1:3] var custom = custom_indexable.Sliceable() - assert_equal("slice(1, 3, None)", str(custom[1:3])) + assert_equal("slice(1, 3, None)", String(custom[1:3])) var i = PythonObject(1) with assert_raises(contains="'int' object is not subscriptable"): _ = i[0:1] with_2d = custom_indexable.With2DGetItem() - assert_equal("[1, 2]", str(with_2d[0, PythonObject(Slice(0, 2))])) - assert_equal("[1, 2]", str(with_2d[0][0:2])) + assert_equal("[1, 2]", String(with_2d[0, PythonObject(Slice(0, 2))])) + assert_equal("[1, 2]", String(with_2d[0][0:2])) - assert_equal("[4, 5, 6]", str(with_2d[PythonObject(Slice(0, 2)), 1])) - assert_equal("[4, 5, 6]", str(with_2d[0:2][1])) + assert_equal("[4, 5, 6]", String(with_2d[PythonObject(Slice(0, 2)), 1])) + assert_equal("[4, 5, 6]", String(with_2d[0:2][1])) assert_equal( - "[[1, 2, 3], [4, 5, 6]]", str(with_2d[PythonObject(Slice(0, 2))]) + "[[1, 2, 3], [4, 5, 6]]", String(with_2d[PythonObject(Slice(0, 2))]) ) - assert_equal("[[1, 2, 3], [4, 5, 6]]", str(with_2d[0:2])) - assert_equal("[[1, 3], [4, 6]]", str(with_2d[0:2, ::2])) + assert_equal("[[1, 2, 3], [4, 5, 6]]", String(with_2d[0:2])) + assert_equal("[[1, 3], [4, 6]]", String(with_2d[0:2, ::2])) assert_equal( - "[6, 5, 4]", str(with_2d[1, PythonObject(Slice(None, None, -1))]) + "[6, 5, 4]", String(with_2d[1, PythonObject(Slice(None, None, -1))]) ) - assert_equal("[6, 5, 4]", str(with_2d[1][::-1])) + assert_equal("[6, 5, 4]", String(with_2d[1][::-1])) - assert_equal("[7, 9]", str(with_2d[2][::2])) + assert_equal("[7, 9]", String(with_2d[2][::2])) with assert_raises(contains="list index out of range"): _ = with_2d[0:1][4] diff --git a/stdlib/test/python/test_python_to_mojo.mojo b/stdlib/test/python/test_python_to_mojo.mojo index d621943f9c..a8dc7aca97 100644 --- a/stdlib/test/python/test_python_to_mojo.mojo +++ b/stdlib/test/python/test_python_to_mojo.mojo @@ -21,7 +21,7 @@ fn test_string_to_python_to_mojo(mut python: Python) raises: var py_string = PythonObject("mojo") var py_string_capitalized = py_string.capitalize() - var cap_mojo_string = str(py_string_capitalized) + var cap_mojo_string = String(py_string_capitalized) assert_equal(cap_mojo_string, "Mojo") @@ -54,7 +54,7 @@ fn test_range() raises: fn test_python_to_string() raises: var os = Python.import_module("os") - assert_true(str(os.environ).startswith("environ({")) + assert_true(String(os.environ).startswith("environ({")) def main(): diff --git a/stdlib/test/random/test_random.mojo b/stdlib/test/random/test_random.mojo index 0a90b5ae89..384a2f4ed6 100644 --- a/stdlib/test/random/test_random.mojo +++ b/stdlib/test/random/test_random.mojo @@ -29,24 +29,24 @@ def test_random(): var random_float = random_float64(0, 1) assert_true( random_float >= 0, - "Value " + str(random_float) + " is not above or equal to 0", + "Value " + String(random_float) + " is not above or equal to 0", ) assert_true( random_float <= 1, - "Value " + str(random_float) + " is not below or equal to 1", + "Value " + String(random_float) + " is not below or equal to 1", ) var random_signed = random_si64(-255, 255) assert_true( random_signed >= -255, "Signed value " - + str(random_signed) + + String(random_signed) + " is not above or equal to -255", ) assert_true( random_signed <= 255, "Signed value " - + str(random_signed) + + String(random_signed) + " is not below or equal to 255", ) @@ -54,13 +54,13 @@ def test_random(): assert_true( random_unsigned >= 0, "Unsigned value " - + str(random_unsigned) + + String(random_unsigned) + " is not above or equal to 0", ) assert_true( random_unsigned <= 255, "Unsigned value " - + str(random_unsigned) + + String(random_unsigned) + " is not below or equal to 255", ) @@ -135,14 +135,14 @@ def test_shuffle(): var i = L_l_s() var j = L_l_s() for x in range(10): - i.append(L_s(str(x), str(x + 1), str(x + 3))) - j.append(L_s(str(x), str(x + 1), str(x + 3))) + i.append(L_s(String(x), String(x + 1), String(x + 3))) + j.append(L_s(String(x), String(x + 1), String(x + 3))) shuffle(i) # TODO: Uncomment when possible # assert_true(g != h) assert_equal(len(i), len(j)) for x in range(10): - var target: List[String] = L_s(str(x), str(x + 1), str(x + 3)) + var target: List[String] = L_s(String(x), String(x + 1), String(x + 3)) var found = False for y in range(len(i)): if j[y] == target: diff --git a/stdlib/test/tempfile/test_tempfile.mojo b/stdlib/test/tempfile/test_tempfile.mojo index d84ac25554..6f8fcf8b17 100644 --- a/stdlib/test/tempfile/test_tempfile.mojo +++ b/stdlib/test/tempfile/test_tempfile.mojo @@ -101,7 +101,7 @@ def _set_up_gettempdir_test( os.rmdir(dir_with_writing_access) raise Error( "Failed to setup test, couldn't create " - + str(dir_without_writing_access) + + String(dir_without_writing_access) ) @@ -109,7 +109,7 @@ def test_gettempdir(): var non_existing_dir = Path() / "non_existing_dir" assert_false( exists(non_existing_dir), - "Unexpected dir" + str(non_existing_dir), + "Unexpected dir" + String(non_existing_dir), ) var dir_without_writing_access = Path() / "dir_without_writing_access" var dir_with_writing_access = Path() / "dir_with_writing_access" @@ -119,7 +119,7 @@ def test_gettempdir(): var vars_to_set = Dict[String, String]() # test TMPDIR is used first - vars_to_set["TMPDIR"] = str(dir_with_writing_access) + vars_to_set["TMPDIR"] = String(dir_with_writing_access) with TempEnvWithCleanup( vars_to_set, _clean_up_gettempdir_test, @@ -128,13 +128,13 @@ def test_gettempdir(): assert_true(tmpdir_result, "Failed to get temporary directory") assert_equal( tmpdir_result.value(), - str(dir_with_writing_access), - "expected to get:" + str(dir_with_writing_access), + String(dir_with_writing_access), + "expected to get:" + String(dir_with_writing_access), ) # test gettempdir falls back to TEMP - vars_to_set["TMPDIR"] = str(non_existing_dir) - vars_to_set["TEMP"] = str(dir_with_writing_access) + vars_to_set["TMPDIR"] = String(non_existing_dir) + vars_to_set["TEMP"] = String(dir_with_writing_access) with TempEnvWithCleanup( vars_to_set, _clean_up_gettempdir_test, @@ -143,14 +143,14 @@ def test_gettempdir(): assert_true(tmpdir_result, "Failed to get temporary directory") assert_equal( tmpdir_result.value(), - str(dir_with_writing_access), - "expected to get:" + str(dir_with_writing_access), + String(dir_with_writing_access), + "expected to get:" + String(dir_with_writing_access), ) # test gettempdir falls back to TMP - vars_to_set["TMPDIR"] = str(non_existing_dir) - vars_to_set["TEMP"] = str(non_existing_dir) - vars_to_set["TMP"] = str(dir_with_writing_access) + vars_to_set["TMPDIR"] = String(non_existing_dir) + vars_to_set["TEMP"] = String(non_existing_dir) + vars_to_set["TMP"] = String(dir_with_writing_access) with TempEnvWithCleanup( vars_to_set, _clean_up_gettempdir_test, @@ -159,8 +159,8 @@ def test_gettempdir(): assert_true(tmpdir_result, "Failed to get temporary directory") assert_equal( tmpdir_result.value(), - str(dir_with_writing_access), - "expected to get:" + str(dir_with_writing_access), + String(dir_with_writing_access), + "expected to get:" + String(dir_with_writing_access), ) _clean_up_gettempdir_test() diff --git a/stdlib/test/testing/test_assert_raises.mojo b/stdlib/test/testing/test_assert_raises.mojo index 4dda27ca87..50c1c17326 100644 --- a/stdlib/test/testing/test_assert_raises.mojo +++ b/stdlib/test/testing/test_assert_raises.mojo @@ -39,9 +39,9 @@ fn test_assert_raises_no_error() raises: pass raise Error("This should not be reachable.") except e: - assert_true(str(e).startswith("AssertionError: Didn't raise")) - assert_true(str(e).endswith(":27")) # col 27 - assert_true(str(e) != "This should not be reachable.") + assert_true(String(e).startswith("AssertionError: Didn't raise")) + assert_true(String(e).endswith(":27")) # col 27 + assert_true(String(e) != "This should not be reachable.") fn test_assert_raises_no_match() raises: @@ -50,7 +50,7 @@ fn test_assert_raises_no_match() raises: raise "OtherError" raise Error("This should not be reachable.") except e: - assert_equal(str(e), "OtherError") + assert_equal(String(e), "OtherError") def main(): diff --git a/stdlib/test/testing/test_assertion.mojo b/stdlib/test/testing/test_assertion.mojo index c9aaaf6d9d..c7153040fb 100644 --- a/stdlib/test/testing/test_assertion.mojo +++ b/stdlib/test/testing/test_assertion.mojo @@ -35,22 +35,22 @@ def test_assert_messages(): try: assert_true(False) except e: - assert_true(assertion in str(e) and assertion_error in str(e)) + assert_true(assertion in String(e) and assertion_error in String(e)) try: assert_false(True) except e: - assert_true(assertion in str(e) and assertion_error in str(e)) + assert_true(assertion in String(e) and assertion_error in String(e)) try: assert_equal(1, 0) except e: - assert_true(assertion in str(e) and assertion_error in str(e)) + assert_true(assertion in String(e) and assertion_error in String(e)) try: assert_not_equal(0, 0) except e: - assert_true(assertion in str(e) and assertion_error in str(e)) + assert_true(assertion in String(e) and assertion_error in String(e)) @value @@ -236,8 +236,8 @@ def test_assert_custom_location(): location=location, ) except e: - assert_true(str(location) in str(e)) - assert_true("always_false" in str(e)) + assert_true(String(location) in String(e)) + assert_true("always_false" in String(e)) def test_assert_equal_stringslice(): diff --git a/stdlib/test/utils/test_index.mojo b/stdlib/test/utils/test_index.mojo index 500fdcf259..ff5236890c 100644 --- a/stdlib/test/utils/test_index.mojo +++ b/stdlib/test/utils/test_index.mojo @@ -20,38 +20,38 @@ from utils import Index, IndexList def test_basics(): assert_equal(IndexList[2](1, 2), IndexList[2](1, 2)) assert_equal(IndexList[3](1, 2, 3), IndexList[3](1, 2, 3)) - assert_equal(str(IndexList[3](1, 2, 3)), "(1, 2, 3)") + assert_equal(String(IndexList[3](1, 2, 3)), "(1, 2, 3)") assert_equal(IndexList[3](1, 2, 3)[2], 3) def test_cast(): assert_equal( - str(IndexList[1](1)), + String(IndexList[1](1)), "(1,)", ) assert_equal( - str(IndexList[2](1, 2).cast[DType.int32]()), + String(IndexList[2](1, 2).cast[DType.int32]()), "(1, 2)", ) assert_equal( - str(IndexList[2, element_bitwidth=64](1, 2).cast[DType.int32]()), + String(IndexList[2, element_bitwidth=64](1, 2).cast[DType.int32]()), "(1, 2)", ) assert_equal( - str(IndexList[2, element_bitwidth=32](1, 2).cast[DType.int64]()), + String(IndexList[2, element_bitwidth=32](1, 2).cast[DType.int64]()), "(1, 2)", ) assert_equal( - str( + String( IndexList[2, element_bitwidth=32](1, -2).cast[element_bitwidth=64]() ), "(1, -2)", ) assert_equal( - str(IndexList[2, element_bitwidth=32](1, 2)), + String(IndexList[2, element_bitwidth=32](1, 2)), "(1, 2)", ) - alias s = str( + alias s = String( IndexList[2, element_bitwidth=32](1, 2).cast[ element_bitwidth=64, unsigned=True ]() @@ -61,10 +61,10 @@ def test_cast(): def test_index(): - assert_equal(str(Index[element_bitwidth=64](1, 2, 3)), "(1, 2, 3)") - assert_equal(str(Index[element_bitwidth=32](1, 2, 3)), "(1, 2, 3)") + assert_equal(String(Index[element_bitwidth=64](1, 2, 3)), "(1, 2, 3)") + assert_equal(String(Index[element_bitwidth=32](1, 2, 3)), "(1, 2, 3)") assert_equal( - str(Index[element_bitwidth=32, unsigned=True](1, 2, 3)), "(1, 2, 3)" + String(Index[element_bitwidth=32, unsigned=True](1, 2, 3)), "(1, 2, 3)" ) diff --git a/stdlib/test/utils/test_tuple.mojo b/stdlib/test/utils/test_tuple.mojo index 0748552be0..1feb95f50a 100644 --- a/stdlib/test/utils/test_tuple.mojo +++ b/stdlib/test/utils/test_tuple.mojo @@ -20,21 +20,21 @@ from utils import IndexList, StaticTuple def test_static_int_tuple(): - assert_equal(str(IndexList[1](1)), "(1,)") + assert_equal(String(IndexList[1](1)), "(1,)") - assert_equal(str(IndexList[3](2)), "(2, 2, 2)") + assert_equal(String(IndexList[3](2)), "(2, 2, 2)") assert_equal( - str(IndexList[3](1, 2, 3) * IndexList[3](4, 5, 6)), + String(IndexList[3](1, 2, 3) * IndexList[3](4, 5, 6)), "(4, 10, 18)", ) assert_equal( - str(IndexList[4](1, 2, 3, 4) - IndexList[4](4, 5, 6, 7)), + String(IndexList[4](1, 2, 3, 4) - IndexList[4](4, 5, 6, 7)), "(-3, -3, -3, -3)", ) - assert_equal(str(IndexList[2](10, 11) // IndexList[2](3, 4)), "(3, 2)") + assert_equal(String(IndexList[2](10, 11) // IndexList[2](3, 4)), "(3, 2)") # Note: index comparison is intended for access bound checking, which is # usually all-element semantic, i.e. true if true for all positions. @@ -44,9 +44,9 @@ def test_static_int_tuple(): assert_equal(len(IndexList[4](3, 5, -1, -2)), 4) - assert_equal(str(IndexList[2]((1, 2))), "(1, 2)") + assert_equal(String(IndexList[2]((1, 2))), "(1, 2)") - assert_equal(str(IndexList[4]((1, 2, 3, 4))), "(1, 2, 3, 4)") + assert_equal(String(IndexList[4]((1, 2, 3, 4))), "(1, 2, 3, 4)") def test_tuple_literal(): diff --git a/stdlib/test/utils/test_write.mojo b/stdlib/test/utils/test_write.mojo index 579b573892..77bb3fb5a9 100644 --- a/stdlib/test/utils/test_write.mojo +++ b/stdlib/test/utils/test_write.mojo @@ -70,13 +70,13 @@ fn test_string_format_seq() raises: fn test_stringable_based_on_format() raises: - assert_equal(str(Point(10, 11)), "Point(10, 11)") + assert_equal(String(Point(10, 11)), "Point(10, 11)") fn test_writer_of_fixed_string() raises: var s1 = _FixedString[100]() s1.write("Hello, World!") - assert_equal(str(s1), "Hello, World!") + assert_equal(String(s1), "Hello, World!") fn test_write_int_padded() raises: From 8b069e9c4d1a92d11008da9d29d0f46e9b8c8a2a Mon Sep 17 00:00:00 2001 From: Jack Clayton Date: Wed, 15 Jan 2025 23:27:57 -0500 Subject: [PATCH 37/39] [stdlib] Move `bool` functions to `Bool` ctors And add deprecation warnings to the `bool` functions, to be phased out to a compiler error in the release after next. MODULAR_ORIG_COMMIT_REV_ID: 6aac03285e2f69659e1208a372d5130c4f203f3d Signed-off-by: Joshua James Venter --- docs/manual/python/types.mdx | 31 ++++++++-------- stdlib/benchmarks/builtin/bench_int.mojo | 2 +- stdlib/benchmarks/collections/bench_dict.mojo | 4 +- .../benchmarks/collections/bench_string.mojo | 14 +++---- stdlib/src/builtin/_format_float.mojo | 6 +-- stdlib/src/builtin/bool.mojo | 37 ++++++++++++------- stdlib/src/collections/counter.mojo | 2 +- stdlib/src/collections/optional.mojo | 4 +- .../src/collections/string/string_slice.mojo | 2 +- stdlib/src/sys/ffi.mojo | 2 +- stdlib/test/builtin/test_bool.mojo | 6 +-- 11 files changed, 60 insertions(+), 50 deletions(-) diff --git a/docs/manual/python/types.mdx b/docs/manual/python/types.mdx index ee0f0d17a5..850efc8434 100644 --- a/docs/manual/python/types.mdx +++ b/docs/manual/python/types.mdx @@ -147,25 +147,24 @@ explicitly convert a Python value into a native Mojo value. Currently `PythonObject` conforms to the [`Stringable`](/mojo/stdlib/builtin/str/Stringable), [`Boolable`](/mojo/stdlib/builtin/bool/Boolable), -[`Floatable`](/mojo/stdlib/builtin/floatable/Floatable/), and -[`Intable`](/mojo/stdlib/builtin/int/Intable) traits, which means you can -convert Python values to Mojo `Bool` and `Float64` types using the -[`bool()`](/mojo/stdlib/builtin/bool/bool-function) and -[`float()`](/mojo/stdlib/builtin/floatable/float/) built-in functions, construct -an `Int` using the [`Int()`](/mojo/stdlib/builtin/int/Int/#__init__) -constructor, and construct a `String` using the -[`String()`](/mojo/stdlib/collections/string/String/#__init__) constructor. -`PythonObject` also conforms to the -[`Writable`](/mojo/stdlib/utils/write/Writable) trait so that you can print -Python values using the built-in [`print()`](/mojo/stdlib/builtin/io/print) -function. +[`Intable`](/mojo/stdlib/builtin/int/Intable), and +[`Floatable`](/mojo/stdlib/builtin/floatable/Floatable/) traits, which allows +you to convert a `PythonObject` to the corresponding Mojo types. ```mojo -var s: String = String(py_string) -var b: Bool = bool(py_bool) +var s = String(py_string) +var b = Bool(py_bool) +var i = Int(py_int) + var f: Float64 = float(py_float) -var i: Int = Int(py_int) -print(py_obj) +``` + +PythonObject also implements the [`Writable`](/mojo/stdlib/utils/write/Writable) +trait, so that you can print Python values using the built-in +[`print()`](/mojo/stdlib/builtin/io/print) function. + +```mojo +print(python_object) ``` ### Comparing Python types in Mojo diff --git a/stdlib/benchmarks/builtin/bench_int.mojo b/stdlib/benchmarks/builtin/bench_int.mojo index efc4b171a5..7147b4a94c 100644 --- a/stdlib/benchmarks/builtin/bench_int.mojo +++ b/stdlib/benchmarks/builtin/bench_int.mojo @@ -27,7 +27,7 @@ fn bench_stringify_small_integers(mut b: Bencher) raises: fn call_fn(): for i in range(1_000): var a = String(i) - benchmark.keep(bool(a)) + benchmark.keep(Bool(a)) b.iter[call_fn]() diff --git a/stdlib/benchmarks/collections/bench_dict.mojo b/stdlib/benchmarks/collections/bench_dict.mojo index 3a740b96f9..10f04f62ae 100644 --- a/stdlib/benchmarks/collections/bench_dict.mojo +++ b/stdlib/benchmarks/collections/bench_dict.mojo @@ -65,7 +65,7 @@ fn bench_dict_insert[size: Int](mut b: Bencher) raises: items[key] = Int(random.random_si64(0, size)) b.iter[call_fn]() - keep(bool(items)) + keep(Bool(items)) # ===-----------------------------------------------------------------------===# @@ -93,7 +93,7 @@ fn bench_dict_lookup[size: Int](mut b: Bencher) raises: keep(res) b.iter[call_fn]() - keep(bool(items)) + keep(Bool(items)) # ===-----------------------------------------------------------------------===# diff --git a/stdlib/benchmarks/collections/bench_string.mojo b/stdlib/benchmarks/collections/bench_string.mojo index bcbf29a0c0..39ca437068 100644 --- a/stdlib/benchmarks/collections/bench_string.mojo +++ b/stdlib/benchmarks/collections/bench_string.mojo @@ -94,7 +94,7 @@ fn bench_string_count[ keep(amnt) b.iter[call_fn]() - keep(bool(items)) + keep(Bool(items)) # ===-----------------------------------------------------------------------===# @@ -121,7 +121,7 @@ fn bench_string_split[ keep(res.data) b.iter[call_fn]() - keep(bool(items)) + keep(Bool(items)) # ===-----------------------------------------------------------------------===# @@ -140,7 +140,7 @@ fn bench_string_splitlines[ keep(res.data) b.iter[call_fn]() - keep(bool(items)) + keep(Bool(items)) # ===-----------------------------------------------------------------------===# @@ -159,7 +159,7 @@ fn bench_string_lower[ keep(res._buffer.data) b.iter[call_fn]() - keep(bool(items)) + keep(Bool(items)) # ===-----------------------------------------------------------------------===# @@ -178,7 +178,7 @@ fn bench_string_upper[ keep(res._buffer.data) b.iter[call_fn]() - keep(bool(items)) + keep(Bool(items)) # ===-----------------------------------------------------------------------===# @@ -200,7 +200,7 @@ fn bench_string_replace[ keep(res._buffer.data) b.iter[call_fn]() - keep(bool(items)) + keep(Bool(items)) # ===-----------------------------------------------------------------------===# @@ -219,7 +219,7 @@ fn bench_string_is_valid_utf8[ keep(res) b.iter[call_fn]() - keep(bool(items)) + keep(Bool(items)) # ===-----------------------------------------------------------------------===# diff --git a/stdlib/src/builtin/_format_float.mojo b/stdlib/src/builtin/_format_float.mojo index ad1a93b0da..690501c379 100644 --- a/stdlib/src/builtin/_format_float.mojo +++ b/stdlib/src/builtin/_format_float.mojo @@ -545,16 +545,16 @@ fn _divide_by_pow10[ if CarrierDType is DType.uint64: @parameter - if N == 1 and bool(n_max <= 4611686018427387908): + if N == 1 and Bool(n_max <= 4611686018427387908): return _umul128_upper64(n, 1844674407370955162) - elif N == 3 and bool(n_max <= 15534100272597517998): + elif N == 3 and Bool(n_max <= 15534100272597517998): return _umul128_upper64(n, 4722366482869645214) >> 8 else: return n / pow(10, N) else: @parameter - if N == 1 and bool(n_max <= 1073741828): + if N == 1 and Bool(n_max <= 1073741828): return (_umul64(n.cast[DType.uint32](), 429496730) >> 32).cast[ CarrierDType ]() diff --git a/stdlib/src/builtin/bool.mojo b/stdlib/src/builtin/bool.mojo index 3ca5f39680..1b6a4450f4 100644 --- a/stdlib/src/builtin/bool.mojo +++ b/stdlib/src/builtin/bool.mojo @@ -167,6 +167,27 @@ struct Bool( """ self = value.__bool__() + @always_inline + fn __init__[T: Boolable, //](out self, value: T): + """Set the bool representation of the object. + + Parameters: + T: The type of the object. + + Args: + value: The object to get the bool representation of. + """ + self = value.__bool__() + + @always_inline + fn __init__(out self, value: None): + """Set the bool representation of the `None` type to `False`. + + Args: + value: The object to get the bool representation of. + """ + self = False + @always_inline("nodebug") @implicit fn __init__(out self, value: SIMD[DType.bool, 1]): @@ -533,19 +554,9 @@ struct Bool( # ===----------------------------------------------------------------------=== # -@always_inline -fn bool(value: None) -> Bool: - """Get the bool representation of the `None` type. - - Args: - value: The object to get the bool representation of. - - Returns: - The bool representation of the object. - """ - return False - - +@deprecated( + "the `bool` function is deprecated, use the `Bool` constructor instead." +) @always_inline fn bool[T: Boolable, //](value: T) -> Bool: """Get the bool representation of the object. diff --git a/stdlib/src/collections/counter.mojo b/stdlib/src/collections/counter.mojo index abe33c2fb8..fc2e4fea03 100644 --- a/stdlib/src/collections/counter.mojo +++ b/stdlib/src/collections/counter.mojo @@ -160,7 +160,7 @@ struct Counter[V: KeyElement](Sized, CollectionElement, Boolable): Returns: `False` if the Counter is empty, `True` otherwise. """ - return bool(len(self)) + return Bool(len(self)) # ===------------------------------------------------------------------=== # # Comparison operators diff --git a/stdlib/src/collections/optional.mojo b/stdlib/src/collections/optional.mojo index b96d3d694a..806119a053 100644 --- a/stdlib/src/collections/optional.mojo +++ b/stdlib/src/collections/optional.mojo @@ -22,7 +22,7 @@ var a = Optional(1) var b = Optional[Int](None) if a: print(a.value()) # prints 1 -if b: # bool(b) is False, so no print +if b: # Bool(b) is False, so no print print(b.value()) var c = a.or_else(2) var d = b.or_else(2) @@ -73,7 +73,7 @@ struct Optional[T: CollectionElement]( var b = Optional[Int](None) if a: print(a.value()) # prints 1 - if b: # bool(b) is False, so no print + if b: # Bool(b) is False, so no print print(b.value()) var c = a.or_else(2) var d = b.or_else(2) diff --git a/stdlib/src/collections/string/string_slice.mojo b/stdlib/src/collections/string/string_slice.mojo index 0e012d6c66..c6425bf838 100644 --- a/stdlib/src/collections/string/string_slice.mojo +++ b/stdlib/src/collections/string/string_slice.mojo @@ -247,7 +247,7 @@ struct CharsIter[mut: Bool, //, origin: Origin[mut]]: Returns: A boolean indicating if there are still elements in this iterator. """ - return bool(self.peek_next()) + return Bool(self.peek_next()) @always_inline fn __len__(self) -> Int: diff --git a/stdlib/src/sys/ffi.mojo b/stdlib/src/sys/ffi.mojo index 429dd1e0f7..cafee526e0 100644 --- a/stdlib/src/sys/ffi.mojo +++ b/stdlib/src/sys/ffi.mojo @@ -206,7 +206,7 @@ struct DLHandle(CollectionElement, CollectionElementNew, Boolable): name.unsafe_cstr_ptr(), ) - return bool(opaque_function_ptr) + return Bool(opaque_function_ptr) # TODO(#15590): Implement support for windows and remove the always_inline. @always_inline diff --git a/stdlib/test/builtin/test_bool.mojo b/stdlib/test/builtin/test_bool.mojo index 11d0a353dd..081a31bc38 100644 --- a/stdlib/test/builtin/test_bool.mojo +++ b/stdlib/test/builtin/test_bool.mojo @@ -29,8 +29,8 @@ def test_bool_cast_to_int(): def test_bool_none(): var test = None - assert_equal(bool(None), False) - assert_equal(bool(test), False) + assert_equal(Bool(None), False) + assert_equal(Bool(test), False) @value @@ -48,7 +48,7 @@ fn takes_bool(cond: Bool) -> Bool: def test_convert_from_implicitly_boolable(): assert_true(takes_bool(MyTrue())) - assert_true(bool(MyTrue())) + assert_true(Bool(MyTrue())) # def test_bool_to_string(): From 72c36db13bb8d811d318a95b84ecdf69f0d79531 Mon Sep 17 00:00:00 2001 From: modularbot Date: Thu, 16 Jan 2025 06:41:26 +0000 Subject: [PATCH 38/39] Update lockfiles to point to latest nightly version: 25.1.0.dev2025011605 Signed-off-by: Joshua James Venter --- examples/life/magic.lock | 157 +- examples/magic.lock | 157 +- examples/notebooks/magic.lock | 157 +- examples/operators/magic.lock | 157 +- examples/testing/magic.lock | 7274 +++++++++++++++++++++++++++++++++ magic.lock | 157 +- 6 files changed, 7664 insertions(+), 395 deletions(-) create mode 100644 examples/testing/magic.lock diff --git a/examples/life/magic.lock b/examples/life/magic.lock index dd001a3484..5a1423aa1f 100644 --- a/examples/life/magic.lock +++ b/examples/life/magic.lock @@ -170,12 +170,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011605-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda @@ -446,12 +446,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011605-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpg123-1.32.9-h65af167_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py312hdd3e373_1.conda @@ -701,16 +701,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.5-h178c5d8_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011605-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpg123-1.32.9-hf642e45_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda @@ -6067,19 +6067,18 @@ packages: license_family: Other size: 46438 timestamp: 1727963202283 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda - sha256: a0f3e9139ab16f0a67b9d2bbabc15b78977168f4a5b5503fed4962dcb9a96102 - md5: 34fdeffa0555a1a56f38839415cc066c +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d depends: - __osx >=11.0 constrains: - - openmp 19.1.6|19.1.6.* + - openmp 19.1.7|19.1.7.* arch: arm64 platform: osx license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - size: 281251 - timestamp: 1734520462311 + size: 280830 + timestamp: 1736986295869 - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 md5: 9de5350a85c4a20c685259b889aa6393 @@ -6174,47 +6173,47 @@ packages: license_family: BSD size: 24048 timestamp: 1733219945697 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda noarch: python - sha256: fb653b1206a459970561cb99277971b809ef23dfbabb08067cf87ecc5316d144 - md5: 36d10ca6747cea3051f98f6c4340bdde + sha256: 66c70dda70094dd44776322c4274e0aedea1326e79407b710423d196fbf5c687 + md5: 63f0b9dbd781076f2346a4c90818fa77 depends: - - max-core ==25.1.0.dev2025011505 release - - max-python >=25.1.0.dev2025011505,<26.0a0 - - mojo-jupyter ==25.1.0.dev2025011505 release - - mblack ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release + - max-python >=25.1.0.dev2025011605,<26.0a0 + - mojo-jupyter ==25.1.0.dev2025011605 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 9920 - timestamp: 1736918190337 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda - sha256: 5de02f267a7821eb30275253c0f03317e45befb2291b4c164d217e4a0be08489 - md5: e084403c468c3736de7b93e85ac55ca5 + size: 9918 + timestamp: 1737005226114 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011605-release.conda + sha256: 833bf62b78d41a258c0f1c2fb33efe2ecd31d52c9f25e0927f3a3c06f3263143 + md5: 67b61208a7f51d98440b829a762aa983 depends: - - mblack ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 244663428 - timestamp: 1736918190336 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda - sha256: b90cccb4ff28d8680f0221b696cfe260c3263afc92fcc90bae9e3e0205f6649a - md5: 6b38ab0cddf2d8d6ea3de50fa06daccf + size: 244845391 + timestamp: 1737004888429 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011605-release.conda + sha256: cca47165ed2791ce97b8ed478c375ca5e19c9b1dbad2008a88fcf55976669e98 + md5: ec67c1c4477173523c480d0439f618ee depends: - - mblack ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 247150310 - timestamp: 1736918170378 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda - sha256: 8e443193c3efccf88a1f335f56803cc8252a6087ceb570847fbc7d54373436dd - md5: 380f01b398f4026fa6d362bcd535bcce + size: 247313436 + timestamp: 1737005226112 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011605-release.conda + sha256: 0c90b26d3a97472ecf01e8f96210d1b6becf10a628eb138a8fe9cba25c275f94 + md5: 67f133797e55bdfeae523889d117d24e depends: - - mblack ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 206696883 - timestamp: 1736918528488 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.12release.conda - sha256: 8ffaf65c9e533d1c05e63208e5929f7047232682d71e241a8d078bd40784c070 - md5: 979326be6e37f9d08a2af9d3b5f5b173 + size: 206707824 + timestamp: 1737004945969 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011605-3.12release.conda + sha256: 8ab036ac69684b74999f0274eb9741c0d0c4e036a0a777dfa2276539703bcf87 + md5: 6fde421d7d48ab50ec34964bfc003ab0 depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python 3.12.* - fastapi - httpx @@ -6235,13 +6234,13 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 124404054 - timestamp: 1736918190345 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.12release.conda - sha256: d29135e77b8d7da7fc1e7fe00b6cefb5faded5da911430a1ff9090377cde6a0f - md5: 7ab99f094af5a6e10444022febf6158f + size: 124617353 + timestamp: 1737004888439 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011605-3.12release.conda + sha256: 3b711e5ef7c518e1e6b69ff69c5c7505e9f5779ee99359c7b2808a6324bee5ca + md5: f264d20311c5422c256d177081752fc4 depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python 3.12.* - fastapi - httpx @@ -6262,13 +6261,13 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 127116659 - timestamp: 1736918170389 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.12release.conda - sha256: f21679607c9939017d447c50d2732c8e842dcb29d18907390f5cd85254370ccf - md5: 112c450c08f0af99073a4dc4aae82576 + size: 127393468 + timestamp: 1737005226123 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011605-3.12release.conda + sha256: f3c1e91c675ebf5835799c044f534e87840cae019df45e06ab50b09c4b819138 + md5: b42171a30a90eca86de374dc6562d2ab depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python 3.12.* - fastapi - httpx @@ -6289,12 +6288,12 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 110626067 - timestamp: 1736918528491 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + size: 110522116 + timestamp: 1737004945972 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda noarch: python - sha256: f1dab48a1791a810711d1c7e484ea1c5340297d09f9493cd99604978a3c43717 - md5: d4a97c4b5ee27717785df58abcef3fb3 + sha256: cfd9e14c0c14fa02b6b61141ff4f9007a11eb3ed1b11cf48a717f215e27c7407 + md5: d60436499404c582b03af554c788436f depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -6304,8 +6303,8 @@ packages: - platformdirs >=2 - python license: MIT - size: 130819 - timestamp: 1736918190341 + size: 130793 + timestamp: 1737005226119 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -6315,18 +6314,18 @@ packages: license_family: MIT size: 14465 timestamp: 1733255681319 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda noarch: python - sha256: 87baffbf376e8562b6bde06c50c57d907ec9a6f6f338f342bddfad4fa83403e4 - md5: c14f190fae020526fc6559130272f1f8 + sha256: 68dcf6fcc24f226462c4a7004a2214a1696f2ad0cb8d7ac229ee9ec4ea2216ea + md5: 864d0b85ff8fd743209bea757229d010 depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22931 - timestamp: 1736918190342 + size: 22934 + timestamp: 1737005226120 - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda sha256: 39c4700fb3fbe403a77d8cc27352fa72ba744db487559d5d44bf8411bb4ea200 md5: c7f302fd11eeb0987a6a5e1f3aed6a21 diff --git a/examples/magic.lock b/examples/magic.lock index f4e0cda51b..aa2ecfc4a4 100644 --- a/examples/magic.lock +++ b/examples/magic.lock @@ -131,12 +131,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.11release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011605-3.11release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py311h2dc5d0c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py311h459d7ec_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -349,12 +349,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py311ha09ea12_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.11release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011605-3.11release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py311h58d527c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py311hcd402e7_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -554,16 +554,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.5-h178c5d8_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py311h4921393_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.11release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011605-3.11release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py311h30e7462_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py311heffc1b2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -4645,19 +4645,18 @@ packages: license_family: Other size: 46438 timestamp: 1727963202283 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda - sha256: a0f3e9139ab16f0a67b9d2bbabc15b78977168f4a5b5503fed4962dcb9a96102 - md5: 34fdeffa0555a1a56f38839415cc066c +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d depends: - __osx >=11.0 constrains: - - openmp 19.1.6|19.1.6.* + - openmp 19.1.7|19.1.7.* arch: arm64 platform: osx license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - size: 281251 - timestamp: 1734520462311 + size: 280830 + timestamp: 1736986295869 - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 md5: 9de5350a85c4a20c685259b889aa6393 @@ -4752,47 +4751,47 @@ packages: license_family: BSD size: 24976 timestamp: 1733219849253 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda noarch: python - sha256: fb653b1206a459970561cb99277971b809ef23dfbabb08067cf87ecc5316d144 - md5: 36d10ca6747cea3051f98f6c4340bdde + sha256: 66c70dda70094dd44776322c4274e0aedea1326e79407b710423d196fbf5c687 + md5: 63f0b9dbd781076f2346a4c90818fa77 depends: - - max-core ==25.1.0.dev2025011505 release - - max-python >=25.1.0.dev2025011505,<26.0a0 - - mojo-jupyter ==25.1.0.dev2025011505 release - - mblack ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release + - max-python >=25.1.0.dev2025011605,<26.0a0 + - mojo-jupyter ==25.1.0.dev2025011605 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 9920 - timestamp: 1736918190337 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda - sha256: 5de02f267a7821eb30275253c0f03317e45befb2291b4c164d217e4a0be08489 - md5: e084403c468c3736de7b93e85ac55ca5 + size: 9918 + timestamp: 1737005226114 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011605-release.conda + sha256: 833bf62b78d41a258c0f1c2fb33efe2ecd31d52c9f25e0927f3a3c06f3263143 + md5: 67b61208a7f51d98440b829a762aa983 depends: - - mblack ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 244663428 - timestamp: 1736918190336 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda - sha256: b90cccb4ff28d8680f0221b696cfe260c3263afc92fcc90bae9e3e0205f6649a - md5: 6b38ab0cddf2d8d6ea3de50fa06daccf + size: 244845391 + timestamp: 1737004888429 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011605-release.conda + sha256: cca47165ed2791ce97b8ed478c375ca5e19c9b1dbad2008a88fcf55976669e98 + md5: ec67c1c4477173523c480d0439f618ee depends: - - mblack ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 247150310 - timestamp: 1736918170378 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda - sha256: 8e443193c3efccf88a1f335f56803cc8252a6087ceb570847fbc7d54373436dd - md5: 380f01b398f4026fa6d362bcd535bcce + size: 247313436 + timestamp: 1737005226112 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011605-release.conda + sha256: 0c90b26d3a97472ecf01e8f96210d1b6becf10a628eb138a8fe9cba25c275f94 + md5: 67f133797e55bdfeae523889d117d24e depends: - - mblack ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 206696883 - timestamp: 1736918528488 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.11release.conda - sha256: c854f3fd876d1804109ff3cd42522ac689bebfe0725f2dc1fa6f770b511da929 - md5: 1b35513e522bd6148f1b11c52b959147 + size: 206707824 + timestamp: 1737004945969 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011605-3.11release.conda + sha256: 871a3cc43052f0b29bbeec075c0b9963c43bdc10fc234746448d6950b77ff9a6 + md5: 14179d3572398ab1bbf4004ae43c6f3d depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python 3.11.* - fastapi - httpx @@ -4813,13 +4812,13 @@ packages: - uvicorn - python_abi 3.11.* *_cp311 license: LicenseRef-Modular-Proprietary - size: 124416691 - timestamp: 1736918190343 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.11release.conda - sha256: 69533b14861d61ccdc7d39c18c8df35d40e3b85f6cf7b8aefc588c9b856665de - md5: 4fbf6154c783c385488ff5d2e589207f + size: 124645362 + timestamp: 1737004888437 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011605-3.11release.conda + sha256: 3c96fb1819ea00d81efb078e753a6d150cf5bf83a73e1a19fec032325538dbb4 + md5: 3bd00fa93e9306846a91142e73cca48f depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python 3.11.* - fastapi - httpx @@ -4840,13 +4839,13 @@ packages: - uvicorn - python_abi 3.11.* *_cp311 license: LicenseRef-Modular-Proprietary - size: 127141652 - timestamp: 1736918170387 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.11release.conda - sha256: bcde9541c0308926d88b06a289e62ade7e9ce5fd09c7af125a74ce902562c154 - md5: fe268f18e7f099aaa136b235f44970d4 + size: 127420456 + timestamp: 1737005226120 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011605-3.11release.conda + sha256: da21ee84763b6901de213b52bd6c5b82000da39f54dc86218ff3faf3eafcf450 + md5: 66e2d3f9ee8a31dacfe7e52a4585dcb3 depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python 3.11.* - fastapi - httpx @@ -4867,12 +4866,12 @@ packages: - uvicorn - python_abi 3.11.* *_cp311 license: LicenseRef-Modular-Proprietary - size: 110638602 - timestamp: 1736918528490 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + size: 110537588 + timestamp: 1737004945971 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda noarch: python - sha256: f1dab48a1791a810711d1c7e484ea1c5340297d09f9493cd99604978a3c43717 - md5: d4a97c4b5ee27717785df58abcef3fb3 + sha256: cfd9e14c0c14fa02b6b61141ff4f9007a11eb3ed1b11cf48a717f215e27c7407 + md5: d60436499404c582b03af554c788436f depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -4882,8 +4881,8 @@ packages: - platformdirs >=2 - python license: MIT - size: 130819 - timestamp: 1736918190341 + size: 130793 + timestamp: 1737005226119 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -4893,18 +4892,18 @@ packages: license_family: MIT size: 14465 timestamp: 1733255681319 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda noarch: python - sha256: 87baffbf376e8562b6bde06c50c57d907ec9a6f6f338f342bddfad4fa83403e4 - md5: c14f190fae020526fc6559130272f1f8 + sha256: 68dcf6fcc24f226462c4a7004a2214a1696f2ad0cb8d7ac229ee9ec4ea2216ea + md5: 864d0b85ff8fd743209bea757229d010 depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22931 - timestamp: 1736918190342 + size: 22934 + timestamp: 1737005226120 - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py311h2dc5d0c_2.conda sha256: afaab7a028281d8b5336db2b994fd3f9694862b6ca372c079dc4e84ad768c20a md5: bb8ca118919836624d920b4c44383a15 diff --git a/examples/notebooks/magic.lock b/examples/notebooks/magic.lock index bbacdb7fc4..f35391f354 100644 --- a/examples/notebooks/magic.lock +++ b/examples/notebooks/magic.lock @@ -167,13 +167,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011605-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -458,13 +458,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011605-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py312hdd3e373_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -736,18 +736,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.5-h178c5d8_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011605-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -5432,19 +5432,18 @@ packages: license_family: Other size: 46438 timestamp: 1727963202283 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda - sha256: a0f3e9139ab16f0a67b9d2bbabc15b78977168f4a5b5503fed4962dcb9a96102 - md5: 34fdeffa0555a1a56f38839415cc066c +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d depends: - __osx >=11.0 constrains: - - openmp 19.1.6|19.1.6.* + - openmp 19.1.7|19.1.7.* arch: arm64 platform: osx license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - size: 281251 - timestamp: 1734520462311 + size: 280830 + timestamp: 1736986295869 - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 md5: 9de5350a85c4a20c685259b889aa6393 @@ -5549,47 +5548,47 @@ packages: license_family: BSD size: 14467 timestamp: 1733417051523 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda noarch: python - sha256: fb653b1206a459970561cb99277971b809ef23dfbabb08067cf87ecc5316d144 - md5: 36d10ca6747cea3051f98f6c4340bdde + sha256: 66c70dda70094dd44776322c4274e0aedea1326e79407b710423d196fbf5c687 + md5: 63f0b9dbd781076f2346a4c90818fa77 depends: - - max-core ==25.1.0.dev2025011505 release - - max-python >=25.1.0.dev2025011505,<26.0a0 - - mojo-jupyter ==25.1.0.dev2025011505 release - - mblack ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release + - max-python >=25.1.0.dev2025011605,<26.0a0 + - mojo-jupyter ==25.1.0.dev2025011605 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 9920 - timestamp: 1736918190337 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda - sha256: 5de02f267a7821eb30275253c0f03317e45befb2291b4c164d217e4a0be08489 - md5: e084403c468c3736de7b93e85ac55ca5 + size: 9918 + timestamp: 1737005226114 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011605-release.conda + sha256: 833bf62b78d41a258c0f1c2fb33efe2ecd31d52c9f25e0927f3a3c06f3263143 + md5: 67b61208a7f51d98440b829a762aa983 depends: - - mblack ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 244663428 - timestamp: 1736918190336 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda - sha256: b90cccb4ff28d8680f0221b696cfe260c3263afc92fcc90bae9e3e0205f6649a - md5: 6b38ab0cddf2d8d6ea3de50fa06daccf + size: 244845391 + timestamp: 1737004888429 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011605-release.conda + sha256: cca47165ed2791ce97b8ed478c375ca5e19c9b1dbad2008a88fcf55976669e98 + md5: ec67c1c4477173523c480d0439f618ee depends: - - mblack ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 247150310 - timestamp: 1736918170378 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda - sha256: 8e443193c3efccf88a1f335f56803cc8252a6087ceb570847fbc7d54373436dd - md5: 380f01b398f4026fa6d362bcd535bcce + size: 247313436 + timestamp: 1737005226112 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011605-release.conda + sha256: 0c90b26d3a97472ecf01e8f96210d1b6becf10a628eb138a8fe9cba25c275f94 + md5: 67f133797e55bdfeae523889d117d24e depends: - - mblack ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 206696883 - timestamp: 1736918528488 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.12release.conda - sha256: 8ffaf65c9e533d1c05e63208e5929f7047232682d71e241a8d078bd40784c070 - md5: 979326be6e37f9d08a2af9d3b5f5b173 + size: 206707824 + timestamp: 1737004945969 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011605-3.12release.conda + sha256: 8ab036ac69684b74999f0274eb9741c0d0c4e036a0a777dfa2276539703bcf87 + md5: 6fde421d7d48ab50ec34964bfc003ab0 depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python 3.12.* - fastapi - httpx @@ -5610,13 +5609,13 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 124404054 - timestamp: 1736918190345 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.12release.conda - sha256: d29135e77b8d7da7fc1e7fe00b6cefb5faded5da911430a1ff9090377cde6a0f - md5: 7ab99f094af5a6e10444022febf6158f + size: 124617353 + timestamp: 1737004888439 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011605-3.12release.conda + sha256: 3b711e5ef7c518e1e6b69ff69c5c7505e9f5779ee99359c7b2808a6324bee5ca + md5: f264d20311c5422c256d177081752fc4 depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python 3.12.* - fastapi - httpx @@ -5637,13 +5636,13 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 127116659 - timestamp: 1736918170389 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.12release.conda - sha256: f21679607c9939017d447c50d2732c8e842dcb29d18907390f5cd85254370ccf - md5: 112c450c08f0af99073a4dc4aae82576 + size: 127393468 + timestamp: 1737005226123 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011605-3.12release.conda + sha256: f3c1e91c675ebf5835799c044f534e87840cae019df45e06ab50b09c4b819138 + md5: b42171a30a90eca86de374dc6562d2ab depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python 3.12.* - fastapi - httpx @@ -5664,12 +5663,12 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 110626067 - timestamp: 1736918528491 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + size: 110522116 + timestamp: 1737004945972 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda noarch: python - sha256: f1dab48a1791a810711d1c7e484ea1c5340297d09f9493cd99604978a3c43717 - md5: d4a97c4b5ee27717785df58abcef3fb3 + sha256: cfd9e14c0c14fa02b6b61141ff4f9007a11eb3ed1b11cf48a717f215e27c7407 + md5: d60436499404c582b03af554c788436f depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -5679,8 +5678,8 @@ packages: - platformdirs >=2 - python license: MIT - size: 130819 - timestamp: 1736918190341 + size: 130793 + timestamp: 1737005226119 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -5700,18 +5699,18 @@ packages: license_family: BSD size: 68803 timestamp: 1735686983426 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda noarch: python - sha256: 87baffbf376e8562b6bde06c50c57d907ec9a6f6f338f342bddfad4fa83403e4 - md5: c14f190fae020526fc6559130272f1f8 + sha256: 68dcf6fcc24f226462c4a7004a2214a1696f2ad0cb8d7ac229ee9ec4ea2216ea + md5: 864d0b85ff8fd743209bea757229d010 depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22931 - timestamp: 1736918190342 + size: 22934 + timestamp: 1737005226120 - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda sha256: b05bc8252a6e957bf4a776ed5e0e61d1ba88cdc46ccb55890c72cc58b10371f4 md5: 5b5e3267d915a107eca793d52e1b780a diff --git a/examples/operators/magic.lock b/examples/operators/magic.lock index befd8a737f..36177f7982 100644 --- a/examples/operators/magic.lock +++ b/examples/operators/magic.lock @@ -131,12 +131,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011605-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -349,12 +349,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011605-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py312hdd3e373_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -554,16 +554,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.5-h178c5d8_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011605-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -4645,19 +4645,18 @@ packages: license_family: Other size: 46438 timestamp: 1727963202283 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda - sha256: a0f3e9139ab16f0a67b9d2bbabc15b78977168f4a5b5503fed4962dcb9a96102 - md5: 34fdeffa0555a1a56f38839415cc066c +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d depends: - __osx >=11.0 constrains: - - openmp 19.1.6|19.1.6.* + - openmp 19.1.7|19.1.7.* arch: arm64 platform: osx license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - size: 281251 - timestamp: 1734520462311 + size: 280830 + timestamp: 1736986295869 - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 md5: 9de5350a85c4a20c685259b889aa6393 @@ -4752,47 +4751,47 @@ packages: license_family: BSD size: 24048 timestamp: 1733219945697 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda noarch: python - sha256: fb653b1206a459970561cb99277971b809ef23dfbabb08067cf87ecc5316d144 - md5: 36d10ca6747cea3051f98f6c4340bdde + sha256: 66c70dda70094dd44776322c4274e0aedea1326e79407b710423d196fbf5c687 + md5: 63f0b9dbd781076f2346a4c90818fa77 depends: - - max-core ==25.1.0.dev2025011505 release - - max-python >=25.1.0.dev2025011505,<26.0a0 - - mojo-jupyter ==25.1.0.dev2025011505 release - - mblack ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release + - max-python >=25.1.0.dev2025011605,<26.0a0 + - mojo-jupyter ==25.1.0.dev2025011605 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 9920 - timestamp: 1736918190337 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda - sha256: 5de02f267a7821eb30275253c0f03317e45befb2291b4c164d217e4a0be08489 - md5: e084403c468c3736de7b93e85ac55ca5 + size: 9918 + timestamp: 1737005226114 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011605-release.conda + sha256: 833bf62b78d41a258c0f1c2fb33efe2ecd31d52c9f25e0927f3a3c06f3263143 + md5: 67b61208a7f51d98440b829a762aa983 depends: - - mblack ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 244663428 - timestamp: 1736918190336 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda - sha256: b90cccb4ff28d8680f0221b696cfe260c3263afc92fcc90bae9e3e0205f6649a - md5: 6b38ab0cddf2d8d6ea3de50fa06daccf + size: 244845391 + timestamp: 1737004888429 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011605-release.conda + sha256: cca47165ed2791ce97b8ed478c375ca5e19c9b1dbad2008a88fcf55976669e98 + md5: ec67c1c4477173523c480d0439f618ee depends: - - mblack ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 247150310 - timestamp: 1736918170378 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda - sha256: 8e443193c3efccf88a1f335f56803cc8252a6087ceb570847fbc7d54373436dd - md5: 380f01b398f4026fa6d362bcd535bcce + size: 247313436 + timestamp: 1737005226112 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011605-release.conda + sha256: 0c90b26d3a97472ecf01e8f96210d1b6becf10a628eb138a8fe9cba25c275f94 + md5: 67f133797e55bdfeae523889d117d24e depends: - - mblack ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 206696883 - timestamp: 1736918528488 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.12release.conda - sha256: 8ffaf65c9e533d1c05e63208e5929f7047232682d71e241a8d078bd40784c070 - md5: 979326be6e37f9d08a2af9d3b5f5b173 + size: 206707824 + timestamp: 1737004945969 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011605-3.12release.conda + sha256: 8ab036ac69684b74999f0274eb9741c0d0c4e036a0a777dfa2276539703bcf87 + md5: 6fde421d7d48ab50ec34964bfc003ab0 depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python 3.12.* - fastapi - httpx @@ -4813,13 +4812,13 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 124404054 - timestamp: 1736918190345 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.12release.conda - sha256: d29135e77b8d7da7fc1e7fe00b6cefb5faded5da911430a1ff9090377cde6a0f - md5: 7ab99f094af5a6e10444022febf6158f + size: 124617353 + timestamp: 1737004888439 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011605-3.12release.conda + sha256: 3b711e5ef7c518e1e6b69ff69c5c7505e9f5779ee99359c7b2808a6324bee5ca + md5: f264d20311c5422c256d177081752fc4 depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python 3.12.* - fastapi - httpx @@ -4840,13 +4839,13 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 127116659 - timestamp: 1736918170389 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.12release.conda - sha256: f21679607c9939017d447c50d2732c8e842dcb29d18907390f5cd85254370ccf - md5: 112c450c08f0af99073a4dc4aae82576 + size: 127393468 + timestamp: 1737005226123 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011605-3.12release.conda + sha256: f3c1e91c675ebf5835799c044f534e87840cae019df45e06ab50b09c4b819138 + md5: b42171a30a90eca86de374dc6562d2ab depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python 3.12.* - fastapi - httpx @@ -4867,12 +4866,12 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 110626067 - timestamp: 1736918528491 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + size: 110522116 + timestamp: 1737004945972 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda noarch: python - sha256: f1dab48a1791a810711d1c7e484ea1c5340297d09f9493cd99604978a3c43717 - md5: d4a97c4b5ee27717785df58abcef3fb3 + sha256: cfd9e14c0c14fa02b6b61141ff4f9007a11eb3ed1b11cf48a717f215e27c7407 + md5: d60436499404c582b03af554c788436f depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -4882,8 +4881,8 @@ packages: - platformdirs >=2 - python license: MIT - size: 130819 - timestamp: 1736918190341 + size: 130793 + timestamp: 1737005226119 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -4893,18 +4892,18 @@ packages: license_family: MIT size: 14465 timestamp: 1733255681319 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda noarch: python - sha256: 87baffbf376e8562b6bde06c50c57d907ec9a6f6f338f342bddfad4fa83403e4 - md5: c14f190fae020526fc6559130272f1f8 + sha256: 68dcf6fcc24f226462c4a7004a2214a1696f2ad0cb8d7ac229ee9ec4ea2216ea + md5: 864d0b85ff8fd743209bea757229d010 depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22931 - timestamp: 1736918190342 + size: 22934 + timestamp: 1737005226120 - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda sha256: b05bc8252a6e957bf4a776ed5e0e61d1ba88cdc46ccb55890c72cc58b10371f4 md5: 5b5e3267d915a107eca793d52e1b780a diff --git a/examples/testing/magic.lock b/examples/testing/magic.lock new file mode 100644 index 0000000000..36177f7982 --- /dev/null +++ b/examples/testing/magic.lock @@ -0,0 +1,7274 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.modular.com/max-nightly/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.11-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.0-h205f482_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h831e299_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.7-hf454442_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.8-h8570fcd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.458-h7001638_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.15-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.66.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/httptools-0.6.4-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.27.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-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.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - 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/lcms2-2.16-hb7c19ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-18.1.0-h9d9f30d_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-18.1.0-hcb10f89_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-18.1.0-hcb10f89_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-18.1.0-h08228c5_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20240808-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.33.0-h2b5623c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.33.0-h0121fbd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-18.1.0-h081d1f1_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.45-h943b412_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.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.47.2-hee588c1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.9.0-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011605-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.29.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-1.12.0rc1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.29.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.29.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.50b0-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-5.28.3-py312h2ec8cdc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-18.1.0-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-18.1.0-py312h01725c0_0_cpu.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.10.5-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.27.2-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.7.1-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyinstrument-5.0.0-py312h66e93f0_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.12.8-h9e4cc4f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.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-tzdata-2024.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py312hbf22597_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.10-hb5b8611_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.2-py312h12e396e_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/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_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/sse-starlette-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.41.3-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.48.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.21.0-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.0.4-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-14.1-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.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/aiohappyeyeballs-2.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.11-py312hcc812fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.0-hb7ec8d5_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-h1a307af_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.7-h2080895_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.8-h92ee776_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.458-h90ecb4a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.12.14-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.15-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.66.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/httptools-0.6.4-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.27.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-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.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + - 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/lcms2-2.16-h922389a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-18.1.0-h47f80e1_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-18.1.0-h3b568fd_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-18.1.0-h3b568fd_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-18.1.0-h1e9d426_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-26_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-26_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.11.1-h6702fde_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20240808-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.33.0-hccf9d24_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.33.0-hb9b2b65_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-26_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.3-h86ecc28_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.28-pthreads_h9d3fd7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-18.1.0-hfc78867_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.45-hec79eb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.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.47.2-h5eb1b54_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.9.0-h86ecc28_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.2-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.5-h2e0c361_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011605-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py312hdd3e373_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.0-hd08dc88_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.29.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-1.12.0rc1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.29.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.29.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.50b0-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.1.0-py312h719f0cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/protobuf-5.28.3-py312h6f74592_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-18.1.0-py312h8025657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-18.1.0-py312h66f7834_0_cpu.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.10.5-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.27.2-py312h8cbf658_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.7.1-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyinstrument-5.0.0-py312hb2c0f52_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.12.8-h1683364_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.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-tzdata-2024.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hb2c0f52_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.0-py312h2427ae1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.10-h5df210e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.2-py312h8cbf658_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/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_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/sse-starlette-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.41.3-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.48.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvloop-0.21.0-py312hb2c0f52_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/watchfiles-1.0.4-py312h8cbf658_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/websockets-14.1-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.2-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.2-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hb2c0f52_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.11-py312h998013c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.0-hfc2798a_16.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.7-h1be5864_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.8-h23176ea_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.458-h794939a_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.12.14-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.15-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h0bf5046_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.66.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/httptools-0.6.4-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.27.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.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.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-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.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-18.1.0-hf3eb8e5_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-18.1.0-hf07054f_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-18.1.0-hf07054f_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-18.1.0-h4239455_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-26_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-26_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.11.1-h73640d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20240808-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.33.0-hdbe95d5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.33.0-h7081f7f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-26_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-18.1.0-h636d7b7_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.45-h3783ad8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.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.47.2-h3f77e49_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.9.0-h5505292_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.5-h178c5d8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011605-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.29.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-1.12.0rc1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.29.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.29.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.50b0-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.1.0-py312h50aef2c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-5.28.3-py312hd8f9ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-18.1.0-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-18.1.0-py312hc40f475_0_cpu.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.10.5-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.27.2-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.7.1-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyinstrument-5.0.0-py312h0bf5046_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.12.8-hc22306f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.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-tzdata-2024.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312h024a12e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h024a12e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.0-py312hf8a1cbd_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.2-py312hcd83bfe_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/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_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/sse-starlette-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.41.3-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.48.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.21.0-py312h0bf5046_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.0.4-py312hcd83bfe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-14.1-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.2-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.2-hb547adb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312hea69d52_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.4.4-pyhd8ed1ab_1.conda + sha256: 95d4713e49ea92ae50cf42393683ede706b7875af5f7cb14c253438180afa732 + md5: 296b403617bafa89df4971567af79013 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 19351 + timestamp: 1733332029649 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.11.11-py312h178313f_0.conda + sha256: 2e817805e8a4fed33f23f116ff5649f8651af693328e9ed82d9d11a951338693 + md5: 8219afa093757bbe07b9825eb1973ed9 + depends: + - __glibc >=2.17,<3.0.a0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: x86_64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + size: 915358 + timestamp: 1734597073870 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.11.11-py312hcc812fe_0.conda + sha256: f28e81e458d19df4ca0002f8a92d7f647fa25e8179887a8676801dfe44edb1f2 + md5: 11fa88136d9bf39d2136b2378f7c10be + depends: + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: aarch64 + platform: linux + license: MIT AND Apache-2.0 + license_family: Apache + size: 902422 + timestamp: 1734597104529 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.11.11-py312h998013c_0.conda + sha256: 446f078e7a7b892894d7f4851a278b7834ffb4f5632313646a55c3abe13690d4 + md5: c69c904691364cfb27d15aa7153e9c29 + depends: + - __osx >=11.0 + - aiohappyeyeballs >=2.3.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + arch: arm64 + platform: osx + license: MIT AND Apache-2.0 + license_family: Apache + size: 875711 + timestamp: 1734597277258 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + sha256: 7de8ced1918bbdadecf8e1c1c68237fe5709c097bd9e0d254f4cad118f4345d0 + md5: 1a3981115a398535dbe3f6d5faae3d36 + depends: + - frozenlist >=1.1.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 13229 + timestamp: 1734342253061 +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 + md5: 2934f256a8acfe48f6ebb4fce6cde29c + depends: + - python >=3.9 + - typing-extensions >=4.0.0 + license: MIT + license_family: MIT + size: 18074 + timestamp: 1733247158254 +- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.8.0-pyhd8ed1ab_0.conda + sha256: f1455d2953e3eb6d71bc49881c8558d8e01888469dfd21061dd48afb6183e836 + md5: 848d25bfbadf020ee4d4ba90e5668252 + depends: + - exceptiongroup >=1.0.2 + - idna >=2.8 + - python >=3.9 + - sniffio >=1.1 + - typing_extensions >=4.5 + constrains: + - trio >=0.26.1 + - uvloop >=0.21 + license: MIT + license_family: MIT + size: 115305 + timestamp: 1736174485476 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda + sha256: 750186af694a7130eaf7119fbb56db0d2326d8995ad5b8eae23c622b85fea29a + md5: 356927ace43302bf6f5926e2a58dae6a + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 56354 + timestamp: 1734348889193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.8.0-h205f482_16.conda + sha256: 0695c285b70385913dc7dce05888d3ad1378247b65273bdab509494a2f8f0eea + md5: b0815d37ab812ade9c07239da7c3c369 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 107478 + timestamp: 1736592747413 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.8.0-hb7ec8d5_16.conda + sha256: 5a2a2691f2e0028e8549b97a340d7e6c502e0d54b7deba00fad505812663a98b + md5: 56f166780076db46c5e273988693d8a3 + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 112264 + timestamp: 1736592695540 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.0-hfc2798a_16.conda + sha256: cdcd932332311db1b614289101b61e32cbae2478ba2bf85763aaf5a5cc7db6f6 + md5: 1e9a41d5296f50c08ae511d61fddef85 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 92547 + timestamp: 1736592866387 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.8.1-h1a47875_3.conda + sha256: 095ac824ea9303eff67e04090ae531d9eb33d2bf8f82eaade39b839c421e16e8 + md5: 55a8561fdbbbd34f50f57d9be12ed084 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 47601 + timestamp: 1733991564405 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.8.1-h740c5af_3.conda + sha256: c5c7961d48ca7320ed3560c036f7aa5244df4b85d9657f70aacc5faba3e1509a + md5: 57ed2c445d7ef01d121b9bcea0522913 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 50036 + timestamp: 1733991581303 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + sha256: 1f44be36e1daa17b4b081debb8aee492d13571084f38b503ad13e869fef24fe4 + md5: 8b0ce61384e5a33d2b301a64f3d22ac5 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 39925 + timestamp: 1733991649383 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.10.6-hb9d3cd8_0.conda + sha256: 496e92f2150fdc351eacf6e236015deedb3d0d3114f8e5954341cbf9f3dda257 + md5: d7d4680337a14001b0e043e96529409b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 236574 + timestamp: 1733975453350 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.10.6-h86ecc28_0.conda + sha256: 57288ec5df35781bea8fc6a8c9099cad6695b747784fc1b8862a0f9e5b3bf5ab + md5: fef806a0f6de853670c746bbece01966 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 259031 + timestamp: 1733975520465 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + sha256: 3bde135c8e74987c0f79ecd4fa17ec9cff0d658b3090168727ca1af3815ae57a + md5: 145e5b4c9702ed279d7d68aaf096f77d + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 221863 + timestamp: 1733975576886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.0-h4e1184b_5.conda + sha256: 62ca84da83585e7814a40240a1e750b1563b2680b032a471464eccc001c3309b + md5: 3f4c1197462a6df2be6dc8241828fe93 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19086 + timestamp: 1733991637424 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.0-h0f0193d_5.conda + sha256: 3f05d19f68ef800f33d44ea2a4211003124076516c8469abc7d432236344df53 + md5: 3a1421d12435df5b4c412cc4c8fac64d + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 19740 + timestamp: 1733991625201 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + sha256: 47b2813f652ce7e64ac442f771b2a5f7d4af4ad0d07ff51f6075ea80ed2e3f09 + md5: a8b6c17732d14ed49d0e9b59c43186bc + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 18068 + timestamp: 1733991869211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.0-h7959bf6_11.conda + sha256: 10d7240c7db0c941fb1a59c4f8ea6689a434b03309ee7b766fa15a809c553c02 + md5: 9b3fb60fe57925a92f399bc3fc42eccf + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 54003 + timestamp: 1734024480949 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.5.0-hcbd8f92_11.conda + sha256: 79aa363c71c891a27496c0498f8d498b2ddc87b3ccb3b6c9da5b50b05936ebb8 + md5: e0772c59af4243a9b2565baa5d79e5b6 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 55207 + timestamp: 1734024546663 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + sha256: f0667935f4e0d4c25e0e51da035640310b5ceeb8f723156734439bde8b848d7d + md5: ba41238f8e653998d7d2f42e3a8db054 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 47078 + timestamp: 1734024749727 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.9.2-hefd7a92_4.conda + sha256: 4a330206bd51148f6c13ca0b7a4db40f29a46f090642ebacdeb88b8a4abd7f99 + md5: 5ce4df662d32d3123ea8da15571b6f51 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 197731 + timestamp: 1734008380764 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.9.2-h3df160d_4.conda + sha256: 3a1d2d332945306be9d49e569b95e4cc172d825f10e88715513a172f28ebb59e + md5: 28f00aa7fd9556c4c461328cf146c20b + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 190586 + timestamp: 1734008442362 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + sha256: 22e4737c8a885995b7c1ae1d79c1f6e78d489e16ec079615980fdde067aeaf76 + md5: 495c93a4f08b17deb3c04894512330e6 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 152983 + timestamp: 1734008451473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.15.3-h831e299_5.conda + sha256: 5920009b1c6f9a2bc131a36725251894e4b4773fce29c4b1065d4213ae337abe + md5: 80dd9f0ddf935290d1dc00ec75ff3023 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.10,<1.5.11.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 157864 + timestamp: 1734433578570 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.15.3-h1a307af_5.conda + sha256: 71f5bf891299f831dceaea12f926c393bf754569e5305387a88b77e1f94612d8 + md5: da8ab0f3eeac93449ec3d531ede92caa + depends: + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + - s2n >=1.5.10,<1.5.11.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 161889 + timestamp: 1734433686109 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_5.conda + sha256: c0a1a2b0750225ac3dc07fd258c88c2be866bf8ac67ba3d50bb4ecec852ff8ee + md5: 4c5ff4134e76426a75b8c548984fa933 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 135729 + timestamp: 1734433832730 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.11.0-h11f4f37_12.conda + sha256: 512d3969426152d9d5fd886e27b13706122dc3fa90eb08c37b0d51a33d7bb14a + md5: 96c3e0221fa2da97619ee82faa341a73 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 194672 + timestamp: 1734025626798 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.11.0-h5f50e26_12.conda + sha256: ffeb9100cc8fd4093e1a6fdfd938bc4a396dd77480b7fb17aa42855a4d5e2c70 + md5: 031ca33115d4b1eeb43f435d6215778c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 169516 + timestamp: 1734025167885 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + sha256: 96575ea1dd2a9ea94763882e40a66dcbff9c41f702bf37c9514c4c719b3c11dd + md5: c072045a6206f88015d02fcba1705ea1 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 134371 + timestamp: 1734025379525 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.7.7-hf454442_0.conda + sha256: c2f205a7bf64c5f40eea373b3a0a7c363c9aa9246a13dd7f3d9c6a4434c4fe2d + md5: 947c82025693bebd557f782bb5d6b469 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.0,<0.8.1.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 114156 + timestamp: 1734146123386 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.7.7-h2080895_0.conda + sha256: 20bc2dd60e6518d9b8215c2b652ab5c52ee8a997d3b9a5f69e2dabd28cbf26b2 + md5: ae223efa63fbb4262a2d85c3ab3bc4f5 + depends: + - aws-c-auth >=0.8.0,<0.8.1.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 117641 + timestamp: 1734146239779 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.7-h1be5864_0.conda + sha256: 22966164d63808689fffd35945f57756c95337327e28099b5d77b29fc6a56ecc + md5: a37bba7acb62dd70492ee01eacca3b8f + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.0,<0.8.1.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 97598 + timestamp: 1734146239038 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.2-h4e1184b_0.conda + sha256: 0424e380c435ba03b5948d02e8c958866c4eee50ed29e57f99473a5f795a4cfc + md5: dcd498d493818b776a77fbc242fbf8e4 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 55911 + timestamp: 1736535960724 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.2-h0f0193d_0.conda + sha256: fba38e469457764afcb94aa84d4d7788e6b5fa1554d34b05c904d2245fdd3c81 + md5: a78928881c652facde2a13ec6e776f3c + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 58221 + timestamp: 1736536003041 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + sha256: ea4f0f1e99056293c69615f581a997d65ba7e229e296e402e0d8ef750648a5b5 + md5: e7b5498ac7b7ab921a907be38f3a8080 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 49872 + timestamp: 1736536152332 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.2-h4e1184b_4.conda + sha256: 1ed9a332d06ad595694907fad2d6d801082916c27cd5076096fda4061e6d24a8 + md5: 74e8c3e4df4ceae34aa2959df4b28101 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 72762 + timestamp: 1733994347547 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.2-h0f0193d_4.conda + sha256: 9f1e3635a587bcf92b61d88c7af7d24cd89c147c6d0ae58afbde08e65bcf48da + md5: 3bd35b0adab3d743f09e0252cc441d6b + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 72154 + timestamp: 1733994384415 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + sha256: 215086d95e8ff1d3fcb0197ada116cc9d7db1fdae7573f5e810d20fa9215b47c + md5: e70e88a357a3749b67679c0788c5b08a + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 70186 + timestamp: 1733994496998 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.29.8-h8570fcd_1.conda + sha256: ff8f08bc615d3ef6d970df80988200b3ecee76ecfa4885109cd82b30176cfda9 + md5: f21296b496cca1c1fa426b9a3b676e79 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.8.0,<0.8.1.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.7,<0.7.8.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 354328 + timestamp: 1736598991291 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.29.8-h92ee776_1.conda + sha256: 114ac89d3936bf801dcbd488ba0b468c7e113a407cb1ee5898259a5202b7e750 + md5: 63546051b5687f793ae977c7994e1339 + depends: + - aws-c-auth >=0.8.0,<0.8.1.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.7,<0.7.8.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 284664 + timestamp: 1736598964131 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.8-h23176ea_1.conda + sha256: db6a31078bb82fb12044d7706239c003568273729f7ba4971c1479b7926ada82 + md5: 31fdd3ffb00f5472196fa95ef08087b7 + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.0,<0.8.1.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.7,<0.7.8.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 236269 + timestamp: 1736599024242 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.458-h7001638_5.conda + sha256: 849524b09865e84d6926aa814944cf71511aa4a00fffc5ad174c286d5dfac5f0 + md5: fc01d77a7f383b2915f276c73b7d0934 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.8,<0.29.9.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 3088636 + timestamp: 1736598504343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.458-h90ecb4a_5.conda + sha256: 9467acd0f2df74ea7472aebdfb8b5656a8d403abad2edbce9743d6e88c94fd10 + md5: 33f86f8de1d8cd40f8fe628dc0784437 + depends: + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.8,<0.29.9.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2925443 + timestamp: 1736598526637 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.458-h794939a_5.conda + sha256: 2b1e7d5a45e82604bfdb6de63c53cf0e9495f596cfd90e644a1e67910de7f91c + md5: a2374b4182bf5b2d08b2903393d0c487 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.8,<0.29.9.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2824168 + timestamp: 1736598935034 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + sha256: fe07debdb089a3db17f40a7f20d283d75284bb4fc269ef727b8ba6fc93f7cb5a + md5: 0a8838771cc2e985cd295e01ae83baf1 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 345117 + timestamp: 1728053909574 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.14.0-h1887c18_0.conda + sha256: 8967b3ccee4d74e61f6ec82dd8efb9deb854ee7ba012dfe767b7a92e0ac77724 + md5: e0c3a906a41be769f0ae20ca3e31cfc0 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 338650 + timestamp: 1728055589907 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + sha256: f5b91329ed59ffc0be8747784c6e4cc7e56250c54032883a83bc11808ef6a87e + md5: f093a11dcf3cdcca010b20a818fcc6dc + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 294299 + timestamp: 1728054014060 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + sha256: 286b31616c191486626cb49e9ceb5920d29394b9e913c23adb7eb637629ba4de + md5: 73f73f60854f325a55f1d31459f2ab73 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 232351 + timestamp: 1728486729511 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.10.0-h47b0b28_0.conda + sha256: 1c72423b9beba167d2f01b80dc204da77240a8266f1edb3d89510c852b300d69 + md5: 94e73a7877743a85c57091d8afab2348 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 217132 + timestamp: 1728488096615 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + sha256: bde446b916fff5150606f8ed3e6058ffc55a3aa72381e46f1ab346590b1ae40a + md5: d7b71593a937459f2d4b67e1a4727dc2 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 166907 + timestamp: 1728486882502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + sha256: 2606260e5379eed255bcdc6adc39b93fb31477337bcd911c121fc43cd29bf394 + md5: 7eb66060455c7a47d9dcdbfa9f46579b + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 549342 + timestamp: 1728578123088 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.13.0-h185ecfd_1.conda + sha256: 280ec70009a92626054f58e45b168fce393e71a9710587488bd8401628cda481 + md5: 221e1e5ecb2643e113f32b3229d5ba33 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 502934 + timestamp: 1728580241002 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + sha256: 08d52d130addc0fb55d5ba10d9fa483e39be25d69bac7f4c676c2c3069207590 + md5: 704238ef05d46144dae2e6b5853df8bc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 438636 + timestamp: 1728578216193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + sha256: 273475f002b091b66ce7366da04bf164c3732c03f8692ab2ee2d23335b6a82ba + md5: 13de36be8de3ae3f05ba127631599213 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 149312 + timestamp: 1728563338704 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.8.0-h1b94036_1.conda + sha256: 146e76aac169e3dbdce5d3b142b7930ac643795c765e7655d1989905ec7d3231 + md5: 793b1080ab2d958980f137a8643cd6e8 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 140832 + timestamp: 1728565334900 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + sha256: 77ab04e8fe5636a2de9c718f72a43645f7502cd208868c8a91ffba385547d585 + md5: 7a187cd7b1445afc80253bb186a607cc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 121278 + timestamp: 1728563418777 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + sha256: 5371e4f3f920933bb89b926a85a67f24388227419abd6e99f6086481e5e8d5f2 + md5: 7c1980f89dd41b097549782121a73490 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 287366 + timestamp: 1728729530295 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.12.0-h37d6d07_1.conda + sha256: 4079c617a75682e49bae63670d58fd6078ccfbbe55ca1f994acab3a74ab6bbcc + md5: b724f3b4b7f4e9b36c58cbe3ed8610a2 + depends: + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 260547 + timestamp: 1728730924071 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + sha256: f48523f8aa0b5b80f45a92f0556b388dd96f44ac2dc2f44a01d08c1822eec97d + md5: c49fbc5233fcbaa86391162ff1adef38 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 196032 + timestamp: 1728729672889 +- conda: https://conda.anaconda.org/conda-forge/noarch/backoff-2.2.1-pyhd8ed1ab_1.conda + sha256: f334115c6b0c6c2cd0d28595365f205ec7eaa60bcc5ff91a75d7245f728be820 + md5: a38b801f2bcc12af80c2e02a9e4ce7d9 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 18816 + timestamp: 1733771192649 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + sha256: f2a59ccd20b4816dea9a2a5cb917eb69728271dbf1aeab4e1b7e609330a50b6f + md5: b0b867af6fc74b2a0aa206da29c0f3cf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hb9d3cd8_2 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 349867 + timestamp: 1725267732089 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py312h6f74592_2.conda + sha256: 9736bf660a0e4260c68f81d2635b51067f817813e6490ac9e8abd9a835dcbf6d + md5: e1e9727063057168d95f27a032acd0a4 + depends: + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 h86ecc28_2 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 356878 + timestamp: 1725267878508 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py312hde4cb15_2.conda + sha256: 254b411fa78ccc226f42daf606772972466f93e9bc6895eabb4cfda22f5178af + md5: a83c2ef76ccb11bc2349f4f17696b15d + depends: + - __osx >=11.0 + - libcxx >=17 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 339360 + timestamp: 1725268143995 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: bzip2-1.0.6 + license_family: BSD + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: bzip2-1.0.6 + license_family: BSD + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + sha256: d4f28d87b6339b94f74762c0076e29c8ef8ddfff51a564a92da2843573c18320 + md5: e2775acf57efd5af15b8e3d1d74d72d3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 206085 + timestamp: 1734208189009 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.4-h86ecc28_0.conda + sha256: 1187a41d4bb2afe02cb18690682edc98d1e9f5e0ccda638d8704a75ea1875bbe + md5: 356da36f35d36dcba16e43f1589d4e39 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 215979 + timestamp: 1734208193181 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda + sha256: 09c0c8476e50b2955f474a4a1c17c4c047dd52993b5366b6ea8e968e583b921f + md5: c1c999a38a4303b29d75c636eaa13cf9 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 179496 + timestamp: 1734208291879 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda + sha256: 1afd7274cbc9a334d6d0bc62fa760acc7afdaceb0b91a8df370ec01fd75dc7dd + md5: 720523eb0d6a9b0f6120c16b2aa4e7de + arch: x86_64 + platform: linux + license: ISC + size: 157088 + timestamp: 1734208393264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.12.14-hcefe29a_0.conda + sha256: ad7b43211051332a5a4e788bb4619a2d0ecb5be73e0f76be17f733a87d7effd1 + md5: 83b4ad1e6dc14df5891f3fcfdeb44351 + arch: aarch64 + platform: linux + license: ISC + size: 157096 + timestamp: 1734209301744 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.12.14-hf0a4a13_0.conda + sha256: 256be633fd0882ccc1a7a32bc278547e1703f85082c0789a87a603ee3ab8fb82 + md5: 7cb381a6783d91902638e4ed1ebd478e + arch: arm64 + platform: osx + license: ISC + size: 157091 + timestamp: 1734208344343 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda + sha256: 048c16a9cbcb1fbad02083414d3bc7c1d0eea4b39aee6aa6bf8d1d5089ca8bad + md5: 6feb87357ecd66733be3279f16a8c400 + depends: + - python >=3.9 + license: ISC + size: 161642 + timestamp: 1734380604767 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 + md5: a861504bbea4161a9170b85d4d2be840 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 294403 + timestamp: 1725560714366 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + sha256: 1162e3ca039e7ca7c0e78f0a020ed1bde968096841b663e3f393c966eb82f0f0 + md5: 1a256e5581b1099e9295cb84d53db3ea + depends: + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 312892 + timestamp: 1725561779888 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f + md5: 19a5456f72f505881ba493979777b24e + depends: + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 281206 + timestamp: 1725560813378 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda + sha256: 4e0ee91b97e5de3e74567bdacea27f0139709fceca4db8adffbe24deffccb09b + md5: e83a31202d1c0a000fce3e9cf3825875 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 47438 + timestamp: 1735929811779 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda + sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab + md5: f22f4d4970e09d68a10b922cbb0408d3 + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 84705 + timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/datasets-2.14.4-pyhd8ed1ab_0.conda + sha256: 7e09bd083a609138b780fcc4535924cb96814d2c908a36d4c64a2ba9ee3efe7f + md5: 3e087f072ce03c43a9b60522f5d0ca2f + depends: + - aiohttp + - dill >=0.3.0,<0.3.8 + - fsspec >=2021.11.1 + - huggingface_hub >=0.14.0,<1.0.0 + - importlib-metadata + - multiprocess + - numpy >=1.17 + - packaging + - pandas + - pyarrow >=8.0.0 + - python >=3.8.0 + - python-xxhash + - pyyaml >=5.1 + - requests >=2.19.0 + - tqdm >=4.62.1 + license: Apache-2.0 + license_family: Apache + size: 347303 + timestamp: 1691593908658 +- conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.15-pyhd8ed1ab_1.conda + sha256: a20ebf2c9b02a6eb32412ceb5c4cffaae49417db7e75414a76417538293a9402 + md5: eaef2e94d5bd76f758545d172c1fda67 + depends: + - python >=3.9 + - wrapt <2,>=1.10 + license: MIT + license_family: MIT + size: 14297 + timestamp: 1733662697343 +- conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda + sha256: 4ff20c6be028be2825235631c45d9e4a75bca1de65f8840c02dfb28ea0137c45 + md5: 5e4f3466526c52bc9af2d2353a1460bd + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + size: 87553 + timestamp: 1690101185422 +- conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.7.0-pyhff2d567_1.conda + sha256: 3ec40ccf63f2450c5e6c7dd579e42fc2e97caf0d8cd4ba24aa434e6fc264eda0 + md5: 5fbd60d61d21b4bd2f9d7a48fe100418 + depends: + - python >=3.9,<4.0.0 + - sniffio + constrains: + - aioquic >=1.0.0 + - wmi >=1.5.1 + - httpx >=0.26.0 + - trio >=0.23 + - cryptography >=43 + - httpcore >=1.0.0 + - idna >=3.7 + - h2 >=4.1.0 + license: ISC + license_family: OTHER + size: 172172 + timestamp: 1733256829961 +- conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.2.0-pyhd8ed1ab_1.conda + sha256: b91a19eb78edfc2dbb36de9a67f74ee2416f1b5273dd7327abe53f2dbf864736 + md5: da16dd3b0b71339060cd44cb7110ddf9 + depends: + - dnspython >=2.0.0 + - idna >=2.0.0 + - python >=3.9 + license: Unlicense + size: 44401 + timestamp: 1733300827551 +- conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.2.0-hd8ed1ab_1.conda + sha256: e0d0fdf587aa0ed0ff08b2bce3ab355f46687b87b0775bfba01cc80a859ee6a2 + md5: 0794f8807ff2c6f020422cacb1bd7bfa + depends: + - email-validator >=2.2.0,<2.2.1.0a0 + license: Unlicense + size: 6552 + timestamp: 1733300828176 +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + sha256: cbde2c64ec317118fc06b223c5fd87c8a680255e7348dd60e7b292d2e103e701 + md5: a16662747cdeb9abbac74d0057cc976e + depends: + - python >=3.9 + license: MIT and PSF-2.0 + size: 20486 + timestamp: 1733208916977 +- conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.115.6-pyhd8ed1ab_0.conda + sha256: d7826d537c667093c9de96411a09585a8d620c84a830a0195e58e9a0df45f018 + md5: 1b1e0c97830cdf75f1f371bd467ab657 + depends: + - email_validator >=2.0.0 + - fastapi-cli >=0.0.5 + - httpx >=0.23.0 + - jinja2 >=2.11.2 + - pydantic >=1.7.4,!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0 + - python >=3.9 + - python-multipart >=0.0.7 + - starlette >=0.40.0,<0.42.0 + - typing_extensions >=4.8.0 + - uvicorn-standard >=0.12.0 + license: MIT + license_family: MIT + size: 73084 + timestamp: 1733362427885 +- conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.7-pyhd8ed1ab_0.conda + sha256: 300683731013b7221922339cd40430bb3c2ddeeb658fd7e37f5099ffe64e4db0 + md5: d960e0ea9e1c561aa928f6c4439f04c7 + depends: + - python >=3.9 + - rich-toolkit >=0.11.1 + - typer >=0.12.3 + - uvicorn-standard >=0.15.0 + license: MIT + license_family: MIT + size: 15546 + timestamp: 1734302408607 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda + sha256: 18dca6e2194732df7ebf824abaefe999e4765ebe8e8a061269406ab88fc418b9 + md5: d692e9ba6f92dc51484bf3477e36ce7c + depends: + - python >=3.9 + license: Unlicense + size: 17441 + timestamp: 1733240909987 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 + md5: 9ae35c3d96db2c94ce0cef86efdfa2cb + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: GPL-2.0-only OR FTL + size: 634972 + timestamp: 1694615932610 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + sha256: 7af93030f4407f076dce181062360efac2cd54dce863b5d7765287a6f5382537 + md5: a5ab74c5bd158c3d5532b66d8d83d907 + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: GPL-2.0-only OR FTL + size: 642092 + timestamp: 1694617858496 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + sha256: 791673127e037a2dc0eebe122dc4f904cb3f6e635bb888f42cbe1a76b48748d9 + md5: e6085e516a3e304ce41a8ee08b9b89ad + depends: + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: GPL-2.0-only OR FTL + size: 596430 + timestamp: 1694616332835 +- conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.5.0-py312h66e93f0_0.conda + sha256: 7e0c12983b20f2816b3712729b5a35ecb7ee152132ca7cf805427c62395ea823 + md5: f98e36c96b2c66d9043187179ddb04f4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 60968 + timestamp: 1729699568442 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.5.0-py312hb2c0f52_0.conda + sha256: b0a9ff3e71452eed70877b2f3175d41cd85070da6deac381c5f3f61e1f19bccb + md5: 62fc11b0738ca15e0dd19b60cf280d12 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 59967 + timestamp: 1729699642726 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.5.0-py312h0bf5046_0.conda + sha256: 44d6d6b332421e621c029fb149f12dba1ccb5ed6ac632e2e807a9d92d6cb2864 + md5: 7960352935cc95ac23883c9b8c97f2ff + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 53366 + timestamp: 1729699762631 +- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda + sha256: 3320970c4604989eadf908397a9475f9e6a96a773c185915111399cbfbe47817 + md5: e041ad4c43ab5e10c74587f95378ebc7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 137756 + timestamp: 1734650349242 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a + md5: d411fc29e338efb48c5fd4576d71d881 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 119654 + timestamp: 1726600001928 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.2.2-h5ad3122_1005.conda + sha256: 28fe6b40b20454106d5e4ef6947cf298c13cc72a46347bbc49b563cd3a463bfa + md5: 4ff634d515abbf664774b5e1168a9744 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 106638 + timestamp: 1726599967617 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + sha256: fd56ed8a1dab72ab90d8a8929b6f916a6d9220ca297ff077f8f04c5ed3408e20 + md5: 57a511a5905caa37540eb914dfcbf1fb + depends: + - __osx >=11.0 + - libcxx >=17 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 82090 + timestamp: 1726600145480 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + sha256: dc824dc1d0aa358e28da2ecbbb9f03d932d976c8dca11214aa1dcdfcbd054ba2 + md5: ff862eebdfeb2fd048ae9dc92510baca + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 143452 + timestamp: 1718284177264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-h468a4a4_0.conda + sha256: 920795d4f775a9f47e91c2223e64847f0b212b3fedc56c137c5889e32efe8ba0 + md5: 08940a32c6ced3703d1412dd37df4f62 + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 145811 + timestamp: 1718284208668 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + sha256: 9fc77de416953aa959039db72bc41bfa4600ae3ff84acad04a7d0c1ab9552602 + md5: fef68d0a95aa5b84b5c1a4f6f3bf40e1 + depends: + - __osx >=11.0 + - gflags >=2.2.2,<2.3.0a0 + - libcxx >=16 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 112215 + timestamp: 1718284365403 +- conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.66.0-pyhff2d567_0.conda + sha256: d8d19575a827f2c62500949b9536efdd6b5406c9f546a73b6a87ac90b03a5875 + md5: 4861e30ff0cd566ea6fb4593e3b7c22a + depends: + - protobuf >=3.20.2,<6.0.0.dev0,!=3.20.0,!=3.20.1,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 116522 + timestamp: 1731459019854 +- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda + sha256: 622516185a7c740d5c7f27016d0c15b45782c1501e5611deec63fd70344ce7c8 + md5: 7ee49e89531c0dcbba9466f6d115d585 + depends: + - python >=3.9 + - typing_extensions + license: MIT + license_family: MIT + size: 51846 + timestamp: 1733327599467 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda + sha256: 843ddad410c370672a8250470697027618f104153612439076d4d7b91eeb7b5c + md5: 825927dc7b0f287ef8d4d0011bb113b1 + depends: + - hpack >=4.0,<5 + - hyperframe >=6.0,<7 + - python >=3.9 + license: MIT + license_family: MIT + size: 52000 + timestamp: 1733298867359 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda + sha256: ec89b7e5b8aa2f0219f666084446e1fb7b54545861e9caa892acb24d125761b5 + md5: 2aa5ff7fa34a81b9196532c84c10d865 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 29412 + timestamp: 1733299296857 +- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda + sha256: c84d012a245171f3ed666a8bf9319580c269b7843ffa79f26468842da3abd5df + md5: 2ca8e6dbc86525c8b95e3c0ffa26442e + depends: + - python >=3.8 + - h11 >=0.13,<0.15 + - h2 >=3,<5 + - sniffio 1.* + - anyio >=3.0,<5.0 + - certifi + license: BSD-3-Clause + license_family: BSD + size: 48959 + timestamp: 1731707562362 +- conda: https://conda.anaconda.org/conda-forge/linux-64/httptools-0.6.4-py312h66e93f0_0.conda + sha256: 621e7e050b888e5239d33e37ea72d6419f8367e5babcad38b755586f20264796 + md5: 8b1160b32557290b64d5be68db3d996d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 101872 + timestamp: 1732707756745 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/httptools-0.6.4-py312hb2c0f52_0.conda + sha256: 0bd1f30224af142711d11033a7469ae402a1147143f399f7341bbc1d8178c722 + md5: 5e70a6de59352f9a52e9caa7f3447390 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 101255 + timestamp: 1732707891645 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/httptools-0.6.4-py312hea69d52_0.conda + sha256: 5e93cda79e32e8c0039e05ea1939e688da336187dab025f699b42ef529e848be + md5: e1747a8e8d2aca5499aaea9993bf31ff + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 85623 + timestamp: 1732707871414 +- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + sha256: cd0f1de3697b252df95f98383e9edb1d00386bfdd03fdf607fa42fe5fcb09950 + md5: d6989ead454181f4f9bc987d3dc4e285 + depends: + - anyio + - certifi + - httpcore 1.* + - idna + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 63082 + timestamp: 1733663449209 +- conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.27.1-pyhd8ed1ab_0.conda + sha256: 4597d7aa720f4acdddacc27b3f9e8d4336cb79477c53aee2d7ab96d136169cdb + md5: 8c9a53ecd0c3c278efbdac567dd12ed0 + depends: + - filelock + - fsspec >=2023.5.0 + - packaging >=20.9 + - python >=3.9 + - pyyaml >=5.1 + - requests + - tqdm >=4.42.1 + - typing-extensions >=3.7.4.3 + - typing_extensions >=3.7.4.3 + license: Apache-2.0 + license_family: APACHE + size: 278363 + timestamp: 1736350219225 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda + sha256: e91c6ef09d076e1d9a02819cd00fa7ee18ecf30cdd667605c853980216584d1b + md5: 566e75c90c1d0c8c459eb0ad9833dc7a + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 17239 + timestamp: 1733298862681 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + sha256: 813298f2e54ef087dbfc9cc2e56e08ded41de65cff34c639cc8ba4e27e4540c9 + md5: 268203e8b983fddb6412b36f2024e75c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 12282786 + timestamp: 1720853454991 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 + md5: 5eb22c1d7b3fc4abb50d92d621583137 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 11857802 + timestamp: 1720853997952 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87 + md5: 39a4f67be3286c86d696df570b1201b7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 49765 + timestamp: 1733211921194 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + sha256: 13766b88fc5b23581530d3a0287c0c58ad82f60401afefab283bf158d2be55a9 + md5: 315607a3030ad5d5227e76e0733798ff + depends: + - python >=3.9 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 28623 + timestamp: 1733223207185 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda + sha256: 98977694b9ecaa3218662f843425f39501f81973c450f995eec68f1803ed71c3 + md5: 2752a6ed44105bfb18c9bef1177d9dcd + depends: + - markupsafe >=2.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 112561 + timestamp: 1734824044952 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 57671 + timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.1-h4e544f5_0.tar.bz2 + sha256: 6d4233d97a9b38acbb26e1268bcf8c10a8e79c2aed7e5a385ec3769967e3e65b + md5: 1f24853e59c68892452ef94ddd8afd4b + depends: + - libgcc-ng >=10.3.0 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 112327 + timestamp: 1646166857935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda + sha256: 5c878d104b461b7ef922abe6320711c0d01772f4cd55de18b674f88547870041 + md5: 51bb7010fc86f70eee639b4bb7a894f5 + depends: + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 245247 + timestamp: 1701647787198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.16-h922389a_0.conda + sha256: be4847b1014d3cbbc524a53bdbf66182f86125775020563e11d914c8468dd97d + md5: ffdd8267a04c515e7ce69c727b051414 + depends: + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 296219 + timestamp: 1701647961116 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda + sha256: 151e0c84feb7e0747fabcc85006b8973b22f5abbc3af76a9add0b0ef0320ebe4 + md5: 66f6c134e76fe13cce8a9ea5814b5dd5 + depends: + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 211959 + timestamp: 1701647962657 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + sha256: 7c91cea91b13f4314d125d1bedb9d03a29ebbd5080ccdea70260363424646dbe + md5: 048b02e3962f066da18efe3a21b77672 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 669211 + timestamp: 1729655358674 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda + sha256: 80ec7e8f006196808fac5bd4b3773a652847f97bbf08044cd87731424ac64f8b + md5: fcbde5ea19d55468953bf588770c0501 + constrains: + - binutils_impl_linux-aarch64 2.43 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 698245 + timestamp: 1729655345825 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 + md5: 76bbff344f0134279f225174e9064c8f + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 281798 + timestamp: 1657977462600 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 + sha256: 2d09ef9b7796d83364957e420b41c32d94e628c3f0520b61c332518a7b5cd586 + md5: 1a0ffc65e03ce81559dbcb0695ad1476 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 262096 + timestamp: 1657978241894 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + sha256: 6f068bb53dfb6147d3147d981bb851bb5477e769407ad4e6a68edf482fdcb958 + md5: de462d5aacda3b30721b512c5da4e742 + depends: + - libcxx >=13.0.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 215721 + timestamp: 1657977558796 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_hbbce691_4.conda + sha256: 143a586aa67d50622ef703de57b9d43f44945836d6568e0e7aa174bd8c45e0d4 + md5: 488f260ccda0afaf08acb286db439c2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1311599 + timestamp: 1736008414161 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20240722.0-cxx17_h18dbdb1_4.conda + sha256: bb6c5fb3b8de5f90735c5252b57efb3c268ee222c755569dac18065f05147670 + md5: 633b9fe454ffea2aaf29e191d946a83b + depends: + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20240722.0 + - libabseil-static =20240722.0=cxx17* + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1334844 + timestamp: 1736008472455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 1178260 + timestamp: 1736008642885 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-18.1.0-h9d9f30d_8_cpu.conda + build_number: 8 + sha256: f6c72ce82d145cb94a1131b68547b88056fb48158a382f9ce763286fce53ee65 + md5: 1c9caae53b14a385b59e87687adad2d6 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-crt-cpp >=0.29.8,<0.29.9.0a0 + - aws-sdk-cpp >=1.11.458,<1.11.459.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - gflags >=2.2.2,<2.3.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.33.0,<2.34.0a0 + - libgoogle-cloud-storage >=2.33.0,<2.34.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.9.0,<2.10.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 8801586 + timestamp: 1736610546493 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-18.1.0-h47f80e1_8_cpu.conda + build_number: 8 + sha256: bf381dfa84e94ffce715c46352dd99f6f6ace69859b0efb822500f8882be429a + md5: daceef1881b4ddc72bb5b225a122c633 + depends: + - aws-crt-cpp >=0.29.8,<0.29.9.0a0 + - aws-sdk-cpp >=1.11.458,<1.11.459.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - gflags >=2.2.2,<2.3.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.33.0,<2.34.0a0 + - libgoogle-cloud-storage >=2.33.0,<2.34.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.9.0,<2.10.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - arrow-cpp <0.0a0 + - apache-arrow-proc =*=cpu + - parquet-cpp <0.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 8045923 + timestamp: 1736611764958 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-18.1.0-hf3eb8e5_8_cpu.conda + build_number: 8 + sha256: 766e46b45520773db93ee1a91951cc135a85544bba738e7b378d31f16097753f + md5: fdc79871e6c243b819497337215416d9 + depends: + - __osx >=11.0 + - aws-crt-cpp >=0.29.8,<0.29.9.0a0 + - aws-sdk-cpp >=1.11.458,<1.11.459.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libcxx >=18 + - libgoogle-cloud >=2.33.0,<2.34.0a0 + - libgoogle-cloud-storage >=2.33.0,<2.34.0a0 + - libre2-11 >=2024.7.2 + - libutf8proc >=2.9.0,<2.10.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + - apache-arrow-proc =*=cpu + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 5497383 + timestamp: 1736608604724 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-18.1.0-hcb10f89_8_cpu.conda + build_number: 8 + sha256: 126a6e78199311d99e38b9d633ce3e0290795ac68ce3ee8a9b91436c85c4095d + md5: 544759904898499f634f8f88a9907f88 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 18.1.0 h9d9f30d_8_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 611558 + timestamp: 1736610592458 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-18.1.0-h3b568fd_8_cpu.conda + build_number: 8 + sha256: c94844ab1d8fafe17775161283bd1fe7ab1f93f660fc5ba0c01bd33fe3d21eaf + md5: 7a8e6a363d2f39a2f3df3f181d12692d + depends: + - libarrow 18.1.0 h47f80e1_8_cpu + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 579798 + timestamp: 1736611846905 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-18.1.0-hf07054f_8_cpu.conda + build_number: 8 + sha256: 29196dc6b2e4488f98bd8950de6333efe5d1a9d0cc62e186694946766185475e + md5: 8db96829f8e427167f450c7467a1ba44 + depends: + - __osx >=11.0 + - libarrow 18.1.0 hf3eb8e5_8_cpu + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 484442 + timestamp: 1736608695654 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-18.1.0-hcb10f89_8_cpu.conda + build_number: 8 + sha256: fe50edf030b5ccbadec2bf8f90d4cdf32d63ec52ba26233fc2c8bfbe43df3b15 + md5: 894a5ed78728b77c997fefeee222ac4d + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 18.1.0 h9d9f30d_8_cpu + - libarrow-acero 18.1.0 hcb10f89_8_cpu + - libgcc >=13 + - libparquet 18.1.0 h081d1f1_8_cpu + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 588032 + timestamp: 1736610711976 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-18.1.0-h3b568fd_8_cpu.conda + build_number: 8 + sha256: bb87d8e633074c9759d93abb277d31314dc66fad741253b48e8265e186228c5b + md5: 11856da892b919cc27bd62638d701c65 + depends: + - libarrow 18.1.0 h47f80e1_8_cpu + - libarrow-acero 18.1.0 h3b568fd_8_cpu + - libgcc >=13 + - libparquet 18.1.0 hfc78867_8_cpu + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 560571 + timestamp: 1736611941995 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-18.1.0-hf07054f_8_cpu.conda + build_number: 8 + sha256: bff2d39e418eadab8c522a536449ac90f070dd8e83e2bd5e67a9c3eb8ecf712f + md5: 7b3736f49b3ba299b7799aeb448cb830 + depends: + - __osx >=11.0 + - libarrow 18.1.0 hf3eb8e5_8_cpu + - libarrow-acero 18.1.0 hf07054f_8_cpu + - libcxx >=18 + - libparquet 18.1.0 h636d7b7_8_cpu + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 491001 + timestamp: 1736609758514 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-18.1.0-h08228c5_8_cpu.conda + build_number: 8 + sha256: dca372e27724904577315b8db3793e027a5c152a485e505e630a57b15634cd85 + md5: 46eaf81238da6f3ffab1f3ffdcee382e + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 18.1.0 h9d9f30d_8_cpu + - libarrow-acero 18.1.0 hcb10f89_8_cpu + - libarrow-dataset 18.1.0 hcb10f89_8_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 521707 + timestamp: 1736610765240 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-18.1.0-h1e9d426_8_cpu.conda + build_number: 8 + sha256: 1896ea00da28e10670f7ba51bb543e68a87f717e9f5692fee44268f1a13d9eee + md5: e7dc0209e065a2b51f19848cefa4b1ab + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 18.1.0 h47f80e1_8_cpu + - libarrow-acero 18.1.0 h3b568fd_8_cpu + - libarrow-dataset 18.1.0 h3b568fd_8_cpu + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 517189 + timestamp: 1736611989417 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-18.1.0-h4239455_8_cpu.conda + build_number: 8 + sha256: ae52d926ebfc8edb0728824f2918a825d39bd85a4ef27fe2b73656cfecdd7c69 + md5: f67eb19d22ba355cced8c86073ad49b1 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libarrow 18.1.0 hf3eb8e5_8_cpu + - libarrow-acero 18.1.0 hf07054f_8_cpu + - libarrow-dataset 18.1.0 hf07054f_8_cpu + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 452161 + timestamp: 1736609917123 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda + build_number: 26 + sha256: 30bd658682b124243f8e52d8edf8a19e7be1bc31e4fe4baec30a64002dc8cd0c + md5: ac52800af2e0c0e7dac770b435ce768a + depends: + - libopenblas >=0.3.28,<0.3.29.0a0 + - libopenblas >=0.3.28,<1.0a0 + constrains: + - libcblas 3.9.0 26_linux64_openblas + - liblapack 3.9.0 26_linux64_openblas + - liblapacke 3.9.0 26_linux64_openblas + - blas * openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16393 + timestamp: 1734432564346 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-26_linuxaarch64_openblas.conda + build_number: 26 + sha256: df6d8ee34d45cf35609ecdd55c1ff03e32e0cd87ae41ebe4ef3747a8e09ead4d + md5: 8d900b7079a00969d70305e9aad550b7 + depends: + - libopenblas >=0.3.28,<0.3.29.0a0 + - libopenblas >=0.3.28,<1.0a0 + constrains: + - blas * openblas + - liblapacke 3.9.0 26_linuxaarch64_openblas + - libcblas 3.9.0 26_linuxaarch64_openblas + - liblapack 3.9.0 26_linuxaarch64_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16477 + timestamp: 1734432576699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-26_osxarm64_openblas.conda + build_number: 26 + sha256: 597f9c3779caa979c8c6abbb3ba8c7191b84e1a910d6b0d10e5faf35284c450c + md5: 21be102c9ae80a67ba7de23b129aa7f6 + depends: + - libopenblas >=0.3.28,<0.3.29.0a0 + - libopenblas >=0.3.28,<1.0a0 + constrains: + - liblapack 3.9.0 26_osxarm64_openblas + - liblapacke 3.9.0 26_osxarm64_openblas + - libcblas 3.9.0 26_osxarm64_openblas + - blas * openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 16714 + timestamp: 1734433054681 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 + md5: 41b599ed2b02abcfdd84302bff174b23 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 68851 + timestamp: 1725267660471 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h86ecc28_2.conda + sha256: 64112af913974b309d67fd342e065fd184347043a6387933b3db796778a28019 + md5: 3ee026955c688f551a9999840cff4c67 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 68982 + timestamp: 1725267774142 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda + sha256: 839dacb741bdbb25e58f42088a2001b649f4f12195aeb700b5ddfca3267749e5 + md5: d0bf1dff146b799b319ea0434b93f779 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 68426 + timestamp: 1725267943211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + sha256: 2892d512cad096cb03f1b66361deeab58b64e15ba525d6592bb6d609e7045edf + md5: 9566f0bd264fbd463002e759b8a82401 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 32696 + timestamp: 1725267669305 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h86ecc28_2.conda + sha256: 94c808d9ca3eb6ef30976a9843e27f027cf3a1e84e8c6835cbb696b7bdb35c4c + md5: e64d0f3b59c7c4047446b97a8624a72d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 31708 + timestamp: 1725267783442 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda + sha256: 6c6862eb274f21a7c0b60e5345467a12e6dda8b9af4438c66d496a2c1a538264 + md5: 55e66e68ce55523a6811633dd1ac74e2 + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 28378 + timestamp: 1725267980316 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + sha256: 779f58174e99de3600e939fa46eddb453ec5d3c60bb46cdaa8b4c127224dbf29 + md5: 06f70867945ea6a84d35836af780f1de + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 281750 + timestamp: 1725267679782 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h86ecc28_2.conda + sha256: 41385e17bc73834b235c5aff12d6d82eccb534acb3c30986996f9dad92a0d54c + md5: 0e9bd365480c72b25c71a448257b537d + depends: + - libbrotlicommon 1.1.0 h86ecc28_2 + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 290230 + timestamp: 1725267792697 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda + sha256: eeb1eb0d58b9d02bc1b98dc0a058f104ab168eb2f7d1c7bfa0570a12cfcdb7b7 + md5: 4f3a434504c67b2c42565c0b85c1885c + depends: + - __osx >=11.0 + - libbrotlicommon 1.1.0 hd74edd7_2 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 279644 + timestamp: 1725268003553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda + build_number: 26 + sha256: 9c74e536c9bc868e356ffd43f81c2cb398aec84b40fcadc312315b164a5500ee + md5: ebcc5f37a435aa3c19640533c82f8d76 + depends: + - libblas 3.9.0 26_linux64_openblas + constrains: + - liblapack 3.9.0 26_linux64_openblas + - liblapacke 3.9.0 26_linux64_openblas + - blas * openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16336 + timestamp: 1734432570482 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-26_linuxaarch64_openblas.conda + build_number: 26 + sha256: 521e78be0c4170f229c43e1a6c94337a72db3ebcbe6e5960f8413aa438dcb8f9 + md5: d77f943ae4083f3aeddca698f2d28262 + depends: + - libblas 3.9.0 26_linuxaarch64_openblas + constrains: + - blas * openblas + - liblapacke 3.9.0 26_linuxaarch64_openblas + - liblapack 3.9.0 26_linuxaarch64_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16398 + timestamp: 1734432580937 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-26_osxarm64_openblas.conda + build_number: 26 + sha256: 27a29ef6b2fd2179bc3a0bb9db351f078ba140ca10485dca147c399639f84c93 + md5: a0e9980fe12d42f6d0c0ec009f67e948 + depends: + - libblas 3.9.0 26_osxarm64_openblas + constrains: + - liblapack 3.9.0 26_osxarm64_openblas + - liblapacke 3.9.0 26_osxarm64_openblas + - blas * openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 16628 + timestamp: 1734433061517 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 + md5: c965a5aa0d5c1c37ffc62dff36e28400 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 20440 + timestamp: 1633683576494 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + sha256: b8b8c57a87da86b3ea24280fd6aa8efaf92f4e684b606bf2db5d3cb06ffbe2ea + md5: 268ee639c17ada0002fb04dd21816cc2 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 18669 + timestamp: 1633683724891 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 + md5: 32bd82a6a625ea6ce090a81c3d34edeb + depends: + - libcxx >=11.1.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 18765 + timestamp: 1633683992603 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda + sha256: 3cd4075b2a7b5562e46c8ec626f6f9ca57aeecaa94ff7df57eca26daa94c9906 + md5: 2b3e0081006dc21e8bf53a91c83a055c + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: curl + license_family: MIT + size: 423011 + timestamp: 1733999897624 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.11.1-h6702fde_0.conda + sha256: 9fc65d21a58f4aad1bc39dfb94a178893aeb035850c5cf0ed9736674279f390b + md5: 7dec1cd271c403d1636bda5aa388a55d + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: curl + license_family: MIT + size: 440737 + timestamp: 1733999835504 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.11.1-h73640d1_0.conda + sha256: f47c35938144c23278987c7d12096f6a42d7c850ffc277222b032073412383b6 + md5: 46d7524cabfdd199bffe63f8f19a552b + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: curl + license_family: MIT + size: 385098 + timestamp: 1734000160270 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.7-ha82da77_0.conda + sha256: 776092346da87a2a23502e14d91eb0c32699c4a1522b7331537bd1c3751dcff5 + md5: 5b3e1610ff8bd5443476b91d618f5b77 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 523505 + timestamp: 1736877862502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + sha256: 511d801626d02f4247a04fff957cc6e9ec4cc7e8622bd9acd076bcdc5de5fe66 + md5: 8dfae1d2e74767e9ce36d5fa0d8605db + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 72255 + timestamp: 1734373823254 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.23-h5e3c512_0.conda + sha256: 959419d87cd2b789a9055db95704c614f31aeb70bef7949fa2f734122a3a2863 + md5: 7e7ca2607b11b180120cefc2354fc0cb + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 69862 + timestamp: 1734373858306 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda + sha256: 887c02deaed6d583459eba6367023e36d8761085b2f7126e389424f57155da53 + md5: 1d8b9588be14e71df38c525767a1ac30 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 54132 + timestamp: 1734373971372 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20240808-pl5321h7949ede_0.conda + sha256: 4d0d69ddf9cc7d724a1ccf3a9852e44c8aea9825692582bac2c4e8d21ec95ccd + md5: 8247f80f3dc464d9322e85007e307fe8 + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 134657 + timestamp: 1736191912705 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20240808-pl5321h976ea20_0.conda + sha256: 031daea98cf278f858b7957ad5dc475f1b5673cd5e718850529401ced64cef2c + md5: 0be40129d3dd1a152fff29a85f0785d0 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 148120 + timestamp: 1736192137151 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20240808-pl5321hafb1f1b_0.conda + sha256: fb934d7a03279ec8eae4bf1913ac9058fcf6fed35290d8ffa6e04157f396a3b1 + md5: af89aa84ffb5ee551ce0c137b951a3b5 + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 107634 + timestamp: 1736192034117 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 112766 + timestamp: 1702146165126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + sha256: 973af77e297f1955dd1f69c2cbdc5ab9dfc88388a5576cd152cda178af0fd006 + md5: a9a13cb143bbaa477b1ebaefbe47a302 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 115123 + timestamp: 1702146237623 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 107458 + timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 427426 + timestamp: 1685725977222 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + sha256: 01333cc7d6e6985dd5700b43660d90e9e58049182017fd24862088ecbe1458e4 + md5: 96ae6083cd1ac9f6bc81631ac835b317 + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 438992 + timestamp: 1685726046519 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 + md5: 1a109764bff3bdc7bdd84088347d71dc + depends: + - openssl >=3.1.1,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 368167 + timestamp: 1685726248899 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.4-h5ad3122_0.conda + sha256: f42e758009ba9db90d1fe7992bc3e60d0c52f71fb20923375d2c44ae69a5a2b3 + md5: f1b3fab36861b3ce945a13f0dfdfc688 + depends: + - libgcc >=13 + constrains: + - expat 2.6.4.* + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 72345 + timestamp: 1730967203789 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + md5: d645c6d2ac96843a2bfaccd2d62b3ac3 + depends: + - libgcc-ng >=9.4.0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 58292 + timestamp: 1636488182923 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2 + sha256: 7e9258a102480757fe3faeb225a3ca04dffd10fecd2a958c65cdb4cdf75f2c3c + md5: dddd85f4d52121fab0a8b099c5e06501 + depends: + - libgcc-ng >=9.4.0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 59450 + timestamp: 1636488255090 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + sha256: 53eb8a79365e58849e7b1a068d31f4f9e718dc938d6f2c03e960345739a03569 + md5: 3cb76c3f10d3bc7f1105b2fc9db984df + depends: + - _libgcc_mutex 0.1 conda_forge + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h77fa898_1 + - libgcc-ng ==14.2.0=*_1 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 848745 + timestamp: 1729027721139 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda + sha256: 5d56757ccad208c79214395b00d006d8d18929a4ba49c47bd9460789a7620943 + md5: 511b511c5445e324066c3377481bcab8 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==14.2.0=*_1 + - libgomp 14.2.0 he277a41_1 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 535243 + timestamp: 1729089435134 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + sha256: 3a76969c80e9af8b6e7a55090088bc41da4cffcde9e2c71b17f44d37b7cb87f7 + md5: e39480b9ca41323497b05492a63bc35b + depends: + - libgcc 14.2.0 h77fa898_1 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 54142 + timestamp: 1729027726517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda + sha256: 9b5cf168a6c7361cae869cb74b716766ee7c6d6b3f6172b32ba9bf91135efdc4 + md5: 0694c249c61469f2c0f7e2990782af21 + depends: + - libgcc 14.2.0 he277a41_1 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 54104 + timestamp: 1729089444587 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda + sha256: fc9e7f22a17faf74da904ebfc4d88699013d2992e55505e4aa0eb01770290977 + md5: f1fd30127802683586f768875127a987 + depends: + - libgfortran5 14.2.0 hd5240d6_1 + constrains: + - libgfortran-ng ==14.2.0=*_1 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 53997 + timestamp: 1729027752995 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-14.2.0-he9431aa_1.conda + sha256: cb66e411fa32a5c6040f4e5e2a63c00897aae4c3133a9c004c2e929ccf19575b + md5: 0294b92d2f47a240bebb1e3336b495f1 + depends: + - libgfortran5 14.2.0 hb6113d0_1 + constrains: + - libgfortran-ng ==14.2.0=*_1 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 54105 + timestamp: 1729089471124 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 110233 + timestamp: 1707330749033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda + sha256: d149a37ca73611e425041f33b9d8dbed6e52ec506fe8cc1fc0ee054bddeb6d5d + md5: 9822b874ea29af082e5d36098d25427d + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1462645 + timestamp: 1729027735353 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-14.2.0-hb6113d0_1.conda + sha256: a87ff46d19916403cbf68cf1d785bf56b4d1ab7b2552468d2ea775d70782493f + md5: fc068e11b10e18f184e027782baa12b6 + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1102158 + timestamp: 1729089452640 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + arch: arm64 + platform: osx + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 997381 + timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + sha256: 1911c29975ec99b6b906904040c855772ccb265a1c79d5d75c8ceec4ed89cd63 + md5: cc3573974587f12dda90d96e3e55a702 + depends: + - _libgcc_mutex 0.1 conda_forge + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 460992 + timestamp: 1729027639220 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda + sha256: 5aa53874a5e57a00f2e0c2e2910684eb674429cd5fcb803619b226a73e89aedf + md5: 376f0e73abbda6d23c0cb749adc195ef + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 463521 + timestamp: 1729089357313 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.33.0-h2b5623c_1.conda + sha256: ae48ee93e2c226bf682f1e389c2fd51ae7bf77c2ce4b3aee069764f4be1c63f2 + md5: 61829a8dd5f4e2327e707572065bae41 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.33.0 *_1 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1254656 + timestamp: 1735648569457 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-2.33.0-hccf9d24_1.conda + sha256: d3d4def86d880431928799ba90ca97e57c2f05677c03af8de2337502926c492c + md5: a2724014eb04f14bd71d35f45b062dd0 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.33.0 *_1 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1253019 + timestamp: 1735649566849 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.33.0-hdbe95d5_1.conda + sha256: ce95aca02451694a4154c7770b6addf4fb859abf17912de6ec947da8469a56ce + md5: 91de1fbab8610974c0094c266bc63435 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.33.0 *_1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 877594 + timestamp: 1735648230965 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.33.0-h0121fbd_1.conda + sha256: 41022523320ca8633a6c615710823e596efadb50f06d724e1a0c81e27994f257 + md5: b0cfb5044685a7a9fa43ae669124f0a0 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.33.0 h2b5623c_1 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 784357 + timestamp: 1735648759177 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-2.33.0-hb9b2b65_1.conda + sha256: 5eda1cbba68709b91b370b3792c9cfd7bec4ac4e2262f0887d12e1f000ae1191 + md5: 45df2267ff4d8ce532e8d300ce0b0829 + depends: + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.33.0 hccf9d24_1 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 737518 + timestamp: 1735649773462 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.33.0-h7081f7f_1.conda + sha256: c0524a22064bc17f5c037da09ba54cc9e767741ef645178e499750c44bec2531 + md5: af8e51382464d4cc2d0054977c40a732 + depends: + - __osx >=11.0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libcxx >=18 + - libgoogle-cloud 2.33.0 hdbe95d5_1 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 526963 + timestamp: 1735649222088 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.67.1-h25350d4_1.conda + sha256: 014627485b3cf0ea18e04c0bab07be7fb98722a3aeeb58477acc7e1c3d2f911e + md5: 0c6497a760b99a926c7c12b74951a39c + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 7792251 + timestamp: 1735584856826 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.67.1-hf7ccdd3_1.conda + sha256: 3fa173dc1d7456aac2b26937daae86a08432a31640e3d6569c62edc661fc9bbe + md5: 8fb41a425bebaeb3d0fa568503612e64 + depends: + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 7430006 + timestamp: 1735585769731 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + sha256: 630edf63981818ff590367cb95fddbed0f5a390464d0952c90ec81de899e84a6 + md5: 8a3cba079d6ac985e7d73c76a678fbb4 + depends: + - __osx >=11.0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 5311706 + timestamp: 1735585137716 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda + sha256: 8ac2f6a9f186e76539439e50505d98581472fedb347a20e7d1f36429849f05c9 + md5: d66573916ffcf376178462f1b61c941e + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + size: 705775 + timestamp: 1702682170569 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda + sha256: a30e09d089cb75a0d5b8e5c354694c1317da98261185ed65aa3793e741060614 + md5: 9a8eb13f14de7d761555a98712e6df65 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + size: 705787 + timestamp: 1702684557134 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda + sha256: bc7de5097b97bcafcf7deaaed505f7ce02f648aac8eccc0d5a47cc599a1d0304 + md5: 69bda57310071cf6d2b86caf11573d2d + arch: arm64 + platform: osx + license: LGPL-2.1-only + size: 676469 + timestamp: 1702682458114 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f + md5: ea25936bb4080d843790b586850f82b8 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + arch: x86_64 + platform: linux + license: IJG AND BSD-3-Clause AND Zlib + size: 618575 + timestamp: 1694474974816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda + sha256: 675bc1f2a8581cd34a86c412663ec29c5f90c1d9f8d11866aa1ade5cdbdf8429 + md5: ed24e702928be089d9ba3f05618515c6 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + arch: aarch64 + platform: linux + license: IJG AND BSD-3-Clause AND Zlib + size: 647126 + timestamp: 1694475003570 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + sha256: a42054eaa38e84fc1e5ab443facac4bbc9d1b6b6f23f54b7bf4f1eb687e1d993 + md5: 3ff1e053dc3a2b8e36b9bfa4256a58d1 + constrains: + - jpeg <0.0.0a + arch: arm64 + platform: osx + license: IJG AND BSD-3-Clause AND Zlib + size: 547541 + timestamp: 1694475104253 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda + build_number: 26 + sha256: b76458c36331376911e0f98fa68109e02f4d5e5ebfffa79587ac69cef748bba1 + md5: 3792604c43695d6a273bc5faaac47d48 + depends: + - libblas 3.9.0 26_linux64_openblas + constrains: + - libcblas 3.9.0 26_linux64_openblas + - liblapacke 3.9.0 26_linux64_openblas + - blas * openblas + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16338 + timestamp: 1734432576650 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-26_linuxaarch64_openblas.conda + build_number: 26 + sha256: a42bd01498efe2ccf6d08d56ac3cbd3ceab79e06699ff5aac3da8e45a66738f7 + md5: a5d4e18876393633da62fd8492c00156 + depends: + - libblas 3.9.0 26_linuxaarch64_openblas + constrains: + - blas * openblas + - liblapacke 3.9.0 26_linuxaarch64_openblas + - libcblas 3.9.0 26_linuxaarch64_openblas + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 16403 + timestamp: 1734432585123 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-26_osxarm64_openblas.conda + build_number: 26 + sha256: dd6d9a21e672aee4332f019c8229ce70cf5eaf6c2f4cbd1443b105fb66c00dc5 + md5: cebad79038a75cfd28fa90d147a2d34d + depends: + - libblas 3.9.0 26_osxarm64_openblas + constrains: + - liblapacke 3.9.0 26_osxarm64_openblas + - libcblas 3.9.0 26_osxarm64_openblas + - blas * openblas + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 16624 + timestamp: 1734433068120 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda + sha256: e6e425252f3839e2756e4af1ea2074dffd3396c161bf460629f9dfd6a65f15c6 + md5: 2ecf2f1c7e4e21fcfe6423a51a992d84 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + size: 111132 + timestamp: 1733407410083 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.6.3-h86ecc28_1.conda + sha256: d1cce0b7d62d1e54e2164d3e0667ee808efc6c3870256e5b47a150cd0bf46824 + md5: eb08b903681f9f2432c320e8ed626723 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: 0BSD + size: 124138 + timestamp: 1733409137214 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda + sha256: d863b8257406918ffdc50ae65502f2b2d6cede29404d09a094f59509d6a0aaf1 + md5: b2553114a7f5e20ccd02378a77d836aa + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: 0BSD + size: 99129 + timestamp: 1733407496073 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + sha256: b0f2b3695b13a989f75d8fd7f4778e1c7aabe3b36db83f0fe80b2cd812c0e975 + md5: 19e57602824042dfd0446292ef90488b + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 647599 + timestamp: 1729571887612 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.64.0-hc8609a4_0.conda + sha256: c093c6d370aadbf0409c20b6c54c488ee2f6fea976181919fcc63e87ee232673 + md5: f52c614fa214a8bedece9421c771670d + depends: + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 714610 + timestamp: 1729571912479 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda + sha256: 00cc685824f39f51be5233b54e19f45abd60de5d8847f1a56906f8936648b72f + md5: 3408c02539cee5f1141f9f11450b6a51 + depends: + - __osx >=11.0 + - c-ares >=1.34.2,<2.0a0 + - libcxx >=17 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 566719 + timestamp: 1729572385640 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-only + license_family: GPL + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda + sha256: 99ba271d8a80a1af2723f2e124ffd91d850074c0389c067e6d96d72a2dbfeabe + md5: 62857b389e42b36b686331bec0922050 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.28,<0.3.29.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 5578513 + timestamp: 1730772671118 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.28-pthreads_h9d3fd7e_1.conda + sha256: 30623a40764e935aa77e0d4db54c1a1589189a9bf3a03fdb445505c1e319b5a6 + md5: e8dde93dd199da3c1f2c1fcfd0042cd4 + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.28,<0.3.29.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 4793435 + timestamp: 1730773029647 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda + sha256: 62bb669c37a845129096f73d446cdb6bb170e4927f2fea2b661329680dbbc373 + md5: 40803a48d947c8639da6704e9a44d3ce + depends: + - __osx >=11.0 + - libgfortran 5.* + - libgfortran5 >=13.2.0 + - llvm-openmp >=18.1.8 + constrains: + - openblas >=0.3.28,<0.3.29.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 4165774 + timestamp: 1730772154295 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-18.1.0-h081d1f1_8_cpu.conda + build_number: 8 + sha256: 2c6d900d4e9dd3c4000886d76d3f8a099e904667ebc6935b49428e6e9b766481 + md5: a9fa0ef309406c84b46db3a28efd761e + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 18.1.0 h9d9f30d_8_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 1207011 + timestamp: 1736610684584 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-18.1.0-hfc78867_8_cpu.conda + build_number: 8 + sha256: 2ed6b9eac4504051ddc094ea3f3a2b3198d4d25a443a96fa2971d8075d790c31 + md5: 9a907190c9e2c6bf1a29569700218f0b + depends: + - libarrow 18.1.0 h47f80e1_8_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 1117465 + timestamp: 1736611918180 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-18.1.0-h636d7b7_8_cpu.conda + build_number: 8 + sha256: 4991519ef4264abc7160e9faaf8ff01d4731bf1497076bef1895d6c366f796eb + md5: b8bd275a49877fdec62ff787818a869d + depends: + - __osx >=11.0 + - libarrow 18.1.0 hf3eb8e5_8_cpu + - libcxx >=18 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 873593 + timestamp: 1736609701839 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.45-h943b412_0.conda + sha256: b8f5b5ba9a14dedf7c97c01300de492b1b52b68eacbc3249a13fdbfa82349a2f + md5: 85cbdaacad93808395ac295b5667d25b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: zlib-acknowledgement + size: 289426 + timestamp: 1736339058310 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.45-hec79eb8_0.conda + sha256: a06daa523a0d5775acb96e6e3f083adc2ab1383eb8f664513dbc663f439c9cca + md5: 9a8716c16b40acc7148263de1d0a403b + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: zlib-acknowledgement + size: 299051 + timestamp: 1736344007986 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.45-h3783ad8_0.conda + sha256: ddcc81c049b32fb5eb3ac1f9a6d3a589c08325c8ec6f89eb912208b19330d68c + md5: d554c806d065b1763cb9e1cb1d25741d + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: zlib-acknowledgement + size: 263151 + timestamp: 1736339184358 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.28.3-h6128344_1.conda + sha256: 51125ebb8b7152e4a4e69fd2398489c4ec8473195c27cde3cbdf1cb6d18c5493 + md5: d8703f1ffe5a06356f06467f1d0b9464 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2960815 + timestamp: 1735577210663 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.28.3-h44a3b7b_1.conda + sha256: ecb69f2b1668e784b41ba667493be846662d5ef702bef64fb2e013bb1364cdc4 + md5: 68f807f7cc13951652bbe048253fd405 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 2788074 + timestamp: 1735576315676 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_2.conda + sha256: 4420f8362c71251892ba1eeb957c5e445e4e1596c0c651c28d0d8b415fe120c7 + md5: b2fede24428726dd867611664fb372e8 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 209793 + timestamp: 1735541054068 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2024.07.02-h18dbdb1_2.conda + sha256: 862c20de0120f802e618dcb25913d00c5b82f91f4be60b2d46a774e851adc2f6 + md5: 9a7dbbaab49f76a6f36e5c9d98e323a7 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 204305 + timestamp: 1735540986919 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + sha256: 112a73ad483353751d4c5d63648c69a4d6fcebf5e1b698a860a3f5124fc3db96 + md5: 6b1e3624d3488016ca4f1ca0c412efaa + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + constrains: + - re2 2024.07.02.* + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 167155 + timestamp: 1735541067807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: ISC + size: 205978 + timestamp: 1716828628198 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 + md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: ISC + size: 177394 + timestamp: 1716828514515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 + md5: a7ce36e284c5faaf93c220dfc39e3abd + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: ISC + size: 164972 + timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda + sha256: 48af21ebc2cbf358976f1e0f4a0ab9e91dfc83d0ef337cf3837c6f5bc22fb352 + md5: b58da17db24b6e08bcbf8fed2fb8c915 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: Unlicense + size: 873551 + timestamp: 1733761824646 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.2-h5eb1b54_0.conda + sha256: 885a27fa84a5a73ed9779168c02b6c386e2fc7a53f0566b32a09ceca146b42b4 + md5: d4bf59f8783a4a66c0aec568f6de3ff4 + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: Unlicense + size: 1042182 + timestamp: 1733761913736 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda + sha256: f192f3c8973de9ec4c214990715f13b781965247a5cedf9162e7f9e699cfc3c4 + md5: 122d6f29470f1a991e85608e77e56a8a + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: Unlicense + size: 850553 + timestamp: 1733762057506 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + sha256: 0407ac9fda2bb67e11e357066eff144c845801d00b5f664efbc48813af1e7bb9 + md5: be2de152d8073ef1c01b7728475f2fe7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 304278 + timestamp: 1732349402869 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-ha41c0db_0.conda + sha256: 40f2af5357457546bd11cd64a3b9043d83865180f65ce602515c35f353be35c7 + md5: aeffe03c0e598f015aab08dbb04f6ee4 + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 311577 + timestamp: 1732349396421 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + sha256: f7047c6ed44bcaeb04432e8c74da87591940d091b0a3940c0d884b7faa8062e9 + md5: ddc7194676c285513706e5fc64f214d7 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 279028 + timestamp: 1732349599461 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + sha256: 4661af0eb9bdcbb5fb33e5d0023b001ad4be828fccdcc56500059d56f9869462 + md5: 234a5554c53625688d51062645337328 + depends: + - libgcc 14.2.0 h77fa898_1 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3893695 + timestamp: 1729027746910 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda + sha256: 519556d2c93f1b487091ce046d62e762286177f4a670ec10e16005177d0bcab3 + md5: 37f489acd39e22b623d2d1e5ac6d195c + depends: + - libgcc 14.2.0 he277a41_1 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3816794 + timestamp: 1729089463404 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda + sha256: 25bb30b827d4f6d6f0522cc0579e431695503822f144043b93c50237017fffd8 + md5: 8371ac6457591af2cf6159439c1fd051 + depends: + - libstdcxx 14.2.0 hc0a3c3a_1 + arch: x86_64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 54105 + timestamp: 1729027780628 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda + sha256: 9f97461bd55a2745a7a0941f3502a047f15bfe7bb2952dc7fb204b3202f866fd + md5: 0e75771b8a03afae5a2c6ce71bc733f5 + depends: + - libstdcxx 14.2.0 h3f4de04_1 + arch: aarch64 + platform: linux + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 54133 + timestamp: 1729089498541 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + sha256: ebb395232973c18745b86c9a399a4725b2c39293c9a91b8e59251be013db42f0 + md5: dcb95c0a98ba9ff737f7ae482aef7833 + depends: + - __glibc >=2.17,<3.0.a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 425773 + timestamp: 1727205853307 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.21.0-h154c74f_0.conda + sha256: f04ab1417aca1687edff9c30d8423ace285eb8c053dc16d595c6e47cfeefb274 + md5: c28792bf37f4ecdce8e3cb9e40750650 + depends: + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 417329 + timestamp: 1727205944238 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + sha256: 7a6c7d5f58cbbc2ccd6493b4b821639fdb0701b9b04c737a949e8cb6adf1c9ad + md5: 7ce2bd2f650f8c31ad7ba4c7bfea61b7 + depends: + - __osx >=11.0 + - libcxx >=17 + - libevent >=2.1.12,<2.1.13.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 324342 + timestamp: 1727206096912 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda + sha256: b224e16b88d76ea95e4af56e2bc638c603bd26a770b98d117d04541d3aafa002 + md5: 0ea6510969e1296cc19966fad481f6de + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.23,<1.24.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: HPND + size: 428173 + timestamp: 1734398813264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-h88f7998_3.conda + sha256: 5888bd66ba7606ae8596856c7dac800940ecad0aed77d6aa37db69d434c81cf0 + md5: 36a0ea4a173338c8725dc0807e99cf22 + depends: + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.23,<1.24.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: HPND + size: 464699 + timestamp: 1734398752249 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + sha256: 91417846157e04992801438a496b151df89604b2e7c6775d6f701fcd0cbed5ae + md5: a5d084a957563e614ec0c0196d890654 + depends: + - __osx >=11.0 + - lerc >=4.0.0,<5.0a0 + - libcxx >=18 + - libdeflate >=1.23,<1.24.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: HPND + size: 370600 + timestamp: 1734398863052 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.9.0-hb9d3cd8_1.conda + sha256: 9794e6388e780c3310d46f773bbc924d4053375c3fcdb07a704b57f4616db928 + md5: 1e936bd23d737aac62a18e9a1e7f8b18 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 81500 + timestamp: 1732868419835 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.9.0-h86ecc28_1.conda + sha256: 37a1833c55f9945724cd4b3eb6a1469032cc754a1dd725f191c34154ad2ba7e4 + md5: 699f155da290be3a1a64c932c6728991 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 81526 + timestamp: 1732868466862 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.9.0-h5505292_1.conda + sha256: ea88f06e97ef8fa2490f7594f8885bb542577226edf8abba3144302d951a53c2 + md5: f777470d31c78cd0abe1903a2fda436f + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 83000 + timestamp: 1732868631531 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.2-hb9d3cd8_0.conda + sha256: a35cd81cd1a9add11024097da83cc06b0aae83186fe4124b77710876f37d8f31 + md5: 070e3c9ddab77e38799d5c30b109c633 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 884647 + timestamp: 1729322566955 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.2-h86ecc28_0.conda + sha256: adf4eca89339ac7780f2394e7e6699be81259eb91f79f9d9fdf2c1bc6b26f210 + md5: 1899e1ec2be63386c41c4db31d3056af + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 627484 + timestamp: 1729322575379 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda + sha256: 0e5176af1e788ad5006cf261c4ea5a288a935fda48993b0240ddd2e562dc3d02 + md5: 4bc348e3a1a74d20a3f9beb866d75e0a + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 410500 + timestamp: 1729322654121 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + sha256: c45283fd3e90df5f0bd3dbcd31f59cdd2b001d424cf30a07223655413b158eaf + md5: 63f790534398730f59e1b899c3644d4a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - libwebp 1.5.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 429973 + timestamp: 1734777489810 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.5.0-h0886dbf_0.conda + sha256: b3d881a0ae08bb07fff7fa8ead506c8d2e0388733182fe4f216f3ec5d61ffcf0 + md5: 95ef4a689b8cc1b7e18b53784d88f96b + depends: + - libgcc >=13 + constrains: + - libwebp 1.5.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 362623 + timestamp: 1734779054659 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda + sha256: f8bdb876b4bc8cb5df47c28af29188de8911c3fea4b799a33743500149de3f4a + md5: 569466afeb84f90d5bb88c11cc23d746 + depends: + - __osx >=11.0 + constrains: + - libwebp 1.5.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 290013 + timestamp: 1734777593617 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 395888 + timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b + md5: cd14ee5cca2464a425b1dbfc24d90db2 + depends: + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 397493 + timestamp: 1727280745441 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 + md5: af523aae2eca6dfa1c8eec693f5b9a79 + depends: + - __osx >=11.0 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 323658 + timestamp: 1727278733917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: LGPL-2.1-or-later + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda + sha256: 306e18aa647d8208ad2cd0e62d84933222b2fbe93d2d53cd5283d2256b1d54de + md5: f5b05674697ae7d2c5932766695945e1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libiconv >=1.17,<2.0a0 + - liblzma >=5.6.3,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - icu <0.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 689993 + timestamp: 1733443678322 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.13.5-h2e0c361_1.conda + sha256: dc0e86d35a836af6e99d18f50c6551fc64c53ed3a3da5a9fea90e78763cf14b4 + md5: 63410f85031930cde371dfe0ee89109a + depends: + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.17,<2.0a0 + - liblzma >=5.6.3,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 732155 + timestamp: 1733443825814 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.5-h178c5d8_1.conda + sha256: d7af3f25a4cece170502acd38f2dafbea4521f373f46dcb28a37fbe6ac2da544 + md5: 3dc3cff0eca1640a6acbbfab2f78139e + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libiconv >=1.17,<2.0a0 + - liblzma >=5.6.3,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 582898 + timestamp: 1733443841584 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + arch: aarch64 + platform: linux + license: Zlib + license_family: Other + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + arch: arm64 + platform: osx + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d + depends: + - __osx >=11.0 + constrains: + - openmp 19.1.7|19.1.7.* + arch: arm64 + platform: osx + license: Apache-2.0 WITH LLVM-exception + size: 280830 + timestamp: 1736986295869 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 167055 + timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda + sha256: 67e55058d275beea76c1882399640c37b5be8be4eb39354c94b610928e9a0573 + md5: 6654e411da94011e8fbe004eacb8fe11 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 184953 + timestamp: 1733740984533 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652 + md5: 01511afc6cc1909c5303cf31be17b44f + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 148824 + timestamp: 1733741047892 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + sha256: 0fbacdfb31e55964152b24d5567e9a9996e1e7902fb08eb7d91b5fd6ce60803a + md5: fee3164ac23dfca50cfcc8b85ddefb81 + depends: + - mdurl >=0.1,<1 + - python >=3.9 + license: MIT + license_family: MIT + size: 64430 + timestamp: 1733250550053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + sha256: 4a6bf68d2a2b669fecc9a4a009abd1cf8e72c2289522ff00d81b5a6e51ae78f5 + md5: eb227c3e0bf58f5bd69c0532b157975b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 24604 + timestamp: 1733219911494 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda + sha256: 1d500158262f30b9c23e37d1c861fe76e127a3926d69b3b38c25d20d3faa6f9f + md5: bc8607ab678073a0441808a31465f4fb + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 25079 + timestamp: 1733220639175 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda + sha256: 4aa997b244014d3707eeef54ab0ee497d12c0d0d184018960cce096169758283 + md5: 46e547061080fddf9cf95a0327e8aba6 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 24048 + timestamp: 1733219945697 +- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + noarch: python + sha256: 66c70dda70094dd44776322c4274e0aedea1326e79407b710423d196fbf5c687 + md5: 63f0b9dbd781076f2346a4c90818fa77 + depends: + - max-core ==25.1.0.dev2025011605 release + - max-python >=25.1.0.dev2025011605,<26.0a0 + - mojo-jupyter ==25.1.0.dev2025011605 release + - mblack ==25.1.0.dev2025011605 release + license: LicenseRef-Modular-Proprietary + size: 9918 + timestamp: 1737005226114 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011605-release.conda + sha256: 833bf62b78d41a258c0f1c2fb33efe2ecd31d52c9f25e0927f3a3c06f3263143 + md5: 67b61208a7f51d98440b829a762aa983 + depends: + - mblack ==25.1.0.dev2025011605 release + license: LicenseRef-Modular-Proprietary + size: 244845391 + timestamp: 1737004888429 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011605-release.conda + sha256: cca47165ed2791ce97b8ed478c375ca5e19c9b1dbad2008a88fcf55976669e98 + md5: ec67c1c4477173523c480d0439f618ee + depends: + - mblack ==25.1.0.dev2025011605 release + license: LicenseRef-Modular-Proprietary + size: 247313436 + timestamp: 1737005226112 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011605-release.conda + sha256: 0c90b26d3a97472ecf01e8f96210d1b6becf10a628eb138a8fe9cba25c275f94 + md5: 67f133797e55bdfeae523889d117d24e + depends: + - mblack ==25.1.0.dev2025011605 release + license: LicenseRef-Modular-Proprietary + size: 206707824 + timestamp: 1737004945969 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011605-3.12release.conda + sha256: 8ab036ac69684b74999f0274eb9741c0d0c4e036a0a777dfa2276539703bcf87 + md5: 6fde421d7d48ab50ec34964bfc003ab0 + depends: + - max-core ==25.1.0.dev2025011605 release + - python 3.12.* + - fastapi + - httpx + - huggingface_hub + - numpy >=1.18,<2.0 + - opentelemetry-api + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus >=0.48b0 + - opentelemetry-sdk >=1.27.0 + - pillow + - pydantic-settings >=2.4.0,<3 + - pydantic >=2.4.0,<3 + - pyinstrument + - python-json-logger + - sse-starlette >=2.1.3,<3 + - transformers + - typing_extensions + - uvicorn + - python_abi 3.12.* *_cp312 + license: LicenseRef-Modular-Proprietary + size: 124617353 + timestamp: 1737004888439 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011605-3.12release.conda + sha256: 3b711e5ef7c518e1e6b69ff69c5c7505e9f5779ee99359c7b2808a6324bee5ca + md5: f264d20311c5422c256d177081752fc4 + depends: + - max-core ==25.1.0.dev2025011605 release + - python 3.12.* + - fastapi + - httpx + - huggingface_hub + - numpy >=1.18,<2.0 + - opentelemetry-api + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus >=0.48b0 + - opentelemetry-sdk >=1.27.0 + - pillow + - pydantic-settings >=2.4.0,<3 + - pydantic >=2.4.0,<3 + - pyinstrument + - python-json-logger + - sse-starlette >=2.1.3,<3 + - transformers + - typing_extensions + - uvicorn + - python_abi 3.12.* *_cp312 + license: LicenseRef-Modular-Proprietary + size: 127393468 + timestamp: 1737005226123 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011605-3.12release.conda + sha256: f3c1e91c675ebf5835799c044f534e87840cae019df45e06ab50b09c4b819138 + md5: b42171a30a90eca86de374dc6562d2ab + depends: + - max-core ==25.1.0.dev2025011605 release + - python 3.12.* + - fastapi + - httpx + - huggingface_hub + - numpy >=1.18,<2.0 + - opentelemetry-api + - opentelemetry-exporter-otlp-proto-http >=1.27.0 + - opentelemetry-exporter-prometheus >=0.48b0 + - opentelemetry-sdk >=1.27.0 + - pillow + - pydantic-settings >=2.4.0,<3 + - pydantic >=2.4.0,<3 + - pyinstrument + - python-json-logger + - sse-starlette >=2.1.3,<3 + - transformers + - typing_extensions + - uvicorn + - python_abi 3.12.* *_cp312 + license: LicenseRef-Modular-Proprietary + size: 110522116 + timestamp: 1737004945972 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda + noarch: python + sha256: cfd9e14c0c14fa02b6b61141ff4f9007a11eb3ed1b11cf48a717f215e27c7407 + md5: d60436499404c582b03af554c788436f + depends: + - python >=3.9,<3.13 + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9.0 + - platformdirs >=2 + - python + license: MIT + size: 130793 + timestamp: 1737005226119 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + md5: 592132998493b3ff25fd7479396e8351 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 14465 + timestamp: 1733255681319 +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda + noarch: python + sha256: 68dcf6fcc24f226462c4a7004a2214a1696f2ad0cb8d7ac229ee9ec4ea2216ea + md5: 864d0b85ff8fd743209bea757229d010 + depends: + - max-core ==25.1.0.dev2025011605 release + - python >=3.9,<3.13 + - jupyter_client >=8.6.2,<8.7 + - python + license: LicenseRef-Modular-Proprietary + size: 22934 + timestamp: 1737005226120 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda + sha256: b05bc8252a6e957bf4a776ed5e0e61d1ba88cdc46ccb55890c72cc58b10371f4 + md5: 5b5e3267d915a107eca793d52e1b780a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 61507 + timestamp: 1733913288935 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda + sha256: ff9f767ba4df68e9ac2a380529a83a2fb6abd985beee9eab16608f7e2c3ccc6e + md5: dcf3ae213cf0ab40ebcc10452e1ed9fa + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 63077 + timestamp: 1733913233032 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda + sha256: 482fd09fb798090dc8cce2285fa69f43b1459099122eac2fb112d9b922b9f916 + md5: 0048335516fed938e4dd2c457b4c5b9b + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 55968 + timestamp: 1729065664275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda + sha256: bb612a921fafda6375a2204ffebd8811db8dd3b8f25ac9886cc9bcbff7e3664e + md5: 5a64b9f44790d9a187a85366dd0ffa8d + depends: + - dill >=0.3.6 + - libgcc-ng >=12 + - python >=3.12.0rc3,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 335666 + timestamp: 1695459025249 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py312hdd3e373_1.conda + sha256: c53362cdf346f314e111faddc53061e3fd2ece0ba68ca303f5dd109976df158f + md5: 173a1692d2b3ddc265dc6afd21a869b3 + depends: + - dill >=0.3.6 + - libgcc-ng >=12 + - python >=3.12.0rc3,<3.13.0a0 + - python >=3.12.0rc3,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 336110 + timestamp: 1695459137796 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda + sha256: 8041371e3ec3fbc2ca13c71b0180672896e6382e62892d9f6b11a4c5dd675951 + md5: 910ef2223c71902175418d9163152788 + depends: + - dill >=0.3.6 + - python >=3.12.0rc3,<3.13.0a0 + - python >=3.12.0rc3,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 335147 + timestamp: 1695459275360 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda + sha256: 1895f47b7d68581a6facde5cb13ab8c2764c2e53a76bd746f8f98910dc4e08fe + md5: 29097e7ea634a45cc5386b95cac6568f + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 10854 + timestamp: 1733230986902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda + sha256: 17fe6afd8a00446010220d52256bd222b1e4fcb93bd587e7784b03219f3dc358 + md5: 04b34b9a40cdc48cfdab261ab176ff74 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: X11 AND BSD-3-Clause + size: 894452 + timestamp: 1736683239706 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_2.conda + sha256: 9fd726174dde993c560dd6fa1a383e61d546d380e98e0b0348d22512e5d86e24 + md5: 779046fb585c71373e8a051be06c6011 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: X11 AND BSD-3-Clause + size: 928402 + timestamp: 1736683192463 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda + sha256: b45c73348ec9841d5c893acc2e97adff24127548fe8c786109d03c41ed564e91 + md5: f6f7c5b7d0983be186c46c4f6f8f9af8 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: X11 AND BSD-3-Clause + size: 796754 + timestamp: 1736683572099 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 7484186 + timestamp: 1707225809722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda + sha256: 23767677a7790bee5457d5e75ebd508b9a31c5354216f4310dd1acfca3f7a6f9 + md5: 9cebf5a06cb87d4569cd68df887af476 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6614296 + timestamp: 1707225994762 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda + sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518 + md5: d83fc83d589e2625a3451c9a7e21047c + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6073136 + timestamp: 1707226249608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda + sha256: 5bee706ea5ba453ed7fd9da7da8380dd88b865c8d30b5aaec14d2b6dd32dbc39 + md5: 9e5816bc95d285c115a3ebc2f8563564 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 342988 + timestamp: 1733816638720 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.3-h3f56577_0.conda + sha256: 92d310033e20538e896f4e4b1ea4205eb6604eee7c5c651c4965a0d8d3ca0f1d + md5: 04231368e4af50d11184b50e14250993 + depends: + - libgcc >=13 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 377796 + timestamp: 1733816683252 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda + sha256: 1d59bc72ca7faac06d349c1a280f5cfb8a57ee5896f1e24225a997189d7418c7 + md5: 4b71d78648dbcf68ce8bf22bb07ff838 + depends: + - __osx >=11.0 + - libcxx >=18 + - libpng >=1.6.44,<1.7.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 319362 + timestamp: 1733816781741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda + sha256: f62f6bca4a33ca5109b6d571b052a394d836956d21b25b7ffd03376abf7a481f + md5: 4ce6875f75469b2757a65e10a5d05e31 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 2937158 + timestamp: 1736086387286 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.4.0-hd08dc88_1.conda + sha256: 60d34454b861501d7355f25a7b39fdb5de8d56fca49b5bcbe8b8142b7d82dce4 + md5: e21c4767e783a58c373fdb99de6211bf + depends: + - ca-certificates + - libgcc >=13 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 3469279 + timestamp: 1736088141230 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda + sha256: 97772762abc70b3a537683ca9fc3ff3d6099eb64e4aba3b9c99e6fce48422d21 + md5: 22f971393637480bda8c679f374d8861 + depends: + - __osx >=11.0 + - ca-certificates + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 2936415 + timestamp: 1736086108693 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-api-1.29.0-pyhd8ed1ab_1.conda + sha256: 296280c8ace35c0a1cf72bed1077f248b3af903c3bf92332f1783a207cb5abdb + md5: 307b05402c1a382f2f09426492dee8f8 + depends: + - deprecated >=1.2.6 + - importlib-metadata >=6.0,<=8.5.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 44166 + timestamp: 1734132973331 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-common-1.29.0-pyhd8ed1ab_0.conda + sha256: ae9776efe52564e0d6711cfcee7c54439273e57a3999f7f796f66e862f58aae9 + md5: 0c02e74d26bce3fec93b227cf7ea6e6b + depends: + - backoff >=1.10.0,<3.0.0 + - opentelemetry-proto 1.29.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 18922 + timestamp: 1734310457116 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-otlp-proto-http-1.29.0-pyhd8ed1ab_1.conda + sha256: 5d61db9d5b4f91b3932f5f2348920d5b7fdaa09e52c8ea054cf7bf3f21677c9c + md5: 223f4e56a29601c887f0dc467034af5b + depends: + - deprecated >=1.2.6 + - googleapis-common-protos >=1.52,<2.dev0 + - opentelemetry-api >=1.15,<2.dev0 + - opentelemetry-exporter-otlp-proto-common 1.29.0 + - opentelemetry-proto 1.29.0 + - opentelemetry-sdk 1.29.0 + - python >=3.9 + - requests >=2.7,<3.dev0 + license: Apache-2.0 + license_family: APACHE + size: 17147 + timestamp: 1734345675510 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-exporter-prometheus-1.12.0rc1-pyhd8ed1ab_0.conda + sha256: b8239230dbbdb491401e41b53bd9f21d60551cedef1a8d5807fca1bf9bdd331c + md5: 1ddc95052b31147d1e10d818cf519cf5 + depends: + - opentelemetry-api >=1.10.0 + - opentelemetry-sdk >=1.10.0 + - prometheus_client >=0.5.0,<1.0.0 + - python >=3.6 + license: Apache-2.0 + license_family: APACHE + size: 14721 + timestamp: 1695214221489 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-proto-1.29.0-pyhd8ed1ab_0.conda + sha256: 200a7cb8acc8a0ddd6ef55c5460cec871b6a265929b240a0296c0ccb9c8d9758 + md5: e2a6d2ad10b813c7fdc1c64aac376128 + depends: + - protobuf <6.0,>=5.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 37235 + timestamp: 1734291034372 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-sdk-1.29.0-pyhd8ed1ab_0.conda + sha256: 7b36629d8b8be8a019fcfd1518d7b7f862dd25de96f8adcadb93e4fd12cf9bd6 + md5: 2a8893f06e6ebda4bfa78875bc923ea4 + depends: + - opentelemetry-api 1.29.0 + - opentelemetry-semantic-conventions 0.50b0 + - python >=3.9 + - typing-extensions >=3.7.4 + - typing_extensions >=3.7.4 + license: Apache-2.0 + license_family: APACHE + size: 77645 + timestamp: 1734297838999 +- conda: https://conda.anaconda.org/conda-forge/noarch/opentelemetry-semantic-conventions-0.50b0-pyh3cfb1c2_0.conda + sha256: 6526e70368d5bf66ef0eaa51fb800d53782dde71a24bd38f40139919a6f784dc + md5: f7111fa4188d646c8108e232d024cb99 + depends: + - deprecated >=1.2.6 + - opentelemetry-api 1.29.0 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 86084 + timestamp: 1734208980168 +- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.0.3-h12ee42a_2.conda + sha256: dff5cc8023905782c86b3459055f26d4b97890e403b0698477c9fed15d8669cc + md5: 4f6f9f3f80354ad185e276c120eac3f0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1188881 + timestamp: 1735630209320 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.0.3-hdd485aa_2.conda + sha256: b6c67542352a86cdf143c3066d5cda855b74454a156eedcd8958b494c6a32a83 + md5: d19f01b42e5d6a2908b65df435aff42f + depends: + - libgcc >=13 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 1167714 + timestamp: 1735630248837 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + sha256: cca330695f3bdb8c0e46350c29cd4af3345865544e36f1d7c9ba9190ad22f5f4 + md5: 24b1897c0d24afbb70704ba998793b78 + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 438520 + timestamp: 1735630624140 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + sha256: ad275a83bfebfa8a8fee9b0569aaf6f513ada6a246b2f5d5b85903d8ca61887e + md5: 8bce4f6caaf8c5448c7ac86d87e26b4b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 15436913 + timestamp: 1726879054912 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.3-py312ha2895bd_2.conda + sha256: a34b10077de97eea72c81cb96e3ddc7d48320c0fc7d9b28ba8d9d2bead1d8297 + md5: 39a91ac336d350513de6aad56da5a920 + depends: + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + constrains: + - fsspec >=2022.11.0 + - s3fs >=2022.11.0 + - fastparquet >=2022.12.0 + - pyreadstat >=1.2.0 + - qtpy >=2.3.0 + - scipy >=1.10.0 + - beautifulsoup4 >=4.11.2 + - gcsfs >=2022.11.0 + - numexpr >=2.8.4 + - sqlalchemy >=2.0.0 + - pyxlsb >=1.0.10 + - numba >=0.56.4 + - lxml >=4.9.2 + - matplotlib >=3.6.3 + - psycopg2 >=2.9.6 + - tzdata >=2022.7 + - bottleneck >=1.3.6 + - xarray >=2022.12.0 + - xlsxwriter >=3.0.5 + - zstandard >=0.19.0 + - blosc >=1.21.3 + - pytables >=3.8.0 + - openpyxl >=3.1.0 + - pyqt5 >=5.15.8 + - tabulate >=0.9.0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 15162992 + timestamp: 1736811533875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py312hcd31e36_1.conda + sha256: ff0cb54b5d058c7987b4a0984066e893642d1865a7bb695294b6172e2fcdc457 + md5: c68bfa69e6086c381c74e16fd72613a8 + depends: + - __osx >=11.0 + - libcxx >=17 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 14470437 + timestamp: 1726878887799 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + md5: 617f15191456cc6a13db418a275435e5 + depends: + - python >=3.9 + license: MPL-2.0 + license_family: MOZILLA + size: 41075 + timestamp: 1733233471940 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda + sha256: 5c347962202b55ae4d8a463e0555c5c6ca33396266a08284bf1384399894e541 + md5: d3894405f05b2c0f351d5de3ae26fa9c + depends: + - __glibc >=2.17,<3.0.a0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: x86_64 + platform: linux + license: HPND + size: 42749785 + timestamp: 1735929845390 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.1.0-py312h719f0cf_0.conda + sha256: 7559556ffc44bda777f85c2e5acd6b5756fa5822c0271b329b7b9a3c6bb20349 + md5: 77e0ec0a6fc847d317f204aa15b59f6b + depends: + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: aarch64 + platform: linux + license: HPND + size: 41362848 + timestamp: 1735932311857 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.1.0-py312h50aef2c_0.conda + sha256: b29b7c915053e06a7a5b4118760202c572c9c35d23bd6ce8e73270b6a50e50ee + md5: 94d6ba8cd468668a9fb04193b0f4b36e + depends: + - __osx >=11.0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + arch: arm64 + platform: osx + license: HPND + size: 42852329 + timestamp: 1735930118976 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.21.1-pyhd8ed1ab_0.conda + sha256: bc8f00d5155deb7b47702cb8370f233935704100dbc23e30747c161d1b6cf3ab + md5: 3e01e386307acc60b2f89af0b2e161aa + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + size: 49002 + timestamp: 1733327434163 +- conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.2.1-py312h66e93f0_0.conda + sha256: 5771311fb5ded614ca349c92579a0b752af55a310f40b71fc533e20625965391 + md5: 55d5742a696d7da1c1262e99b6217ceb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 52747 + timestamp: 1733391916349 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/propcache-0.2.1-py312hb2c0f52_0.conda + sha256: c7f62c11ed929ccf1f3d4a1e200e28be01e8d0e0786bf8f76c5893f2ea681e1b + md5: 50ab8953e7ff1333a4a47cda32e68123 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 52484 + timestamp: 1733391993461 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.2.1-py312hea69d52_0.conda + sha256: f8c266c494aa1e4cfb8bf0b6fca060044b2f3d65afe4c5062ebeea382e77aa6d + md5: c84e3dd97fe25a17322c4a0f670c6750 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 48225 + timestamp: 1733392308901 +- conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-5.28.3-py312h2ec8cdc_0.conda + sha256: acb2e0ee948e3941f8ed191cb77f654e06538638aed8ccd71cbc78a15242ebbb + md5: 9d7e427d159c1b2d516cc047ff177c48 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libprotobuf 5.28.3 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 464794 + timestamp: 1731366525051 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/protobuf-5.28.3-py312h6f74592_0.conda + sha256: 9c575d5035c7ecb114ab9e17906c0a54087d9598dd6a2104c02fe33f0a29dd46 + md5: 06513608c94fb1c1b17136ace77063a9 + depends: + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libprotobuf 5.28.3 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 473242 + timestamp: 1731366577844 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-5.28.3-py312hd8f9ff3_0.conda + sha256: 9d572a97419bdace14d7c7cc8cc8c4bf2dcb22b56965dac87a27fbdb5061b926 + md5: 5afbe52a59f04dd1fe566d0d17590d7e + depends: + - __osx >=11.0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - libprotobuf 5.28.3 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 448803 + timestamp: 1731367010746 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 8252 + timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba + md5: bb5a90c93e3bac3d5690acf76b4a6386 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 8342 + timestamp: 1726803319942 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 + md5: 415816daf82e0b23a736a069a75e9da7 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 8381 + timestamp: 1726802424786 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-18.1.0-py312h7900ff3_0.conda + sha256: 46a61c29375d3bf1933eae61c7861394c168898915d59fc99bf05e46de2ff5ad + md5: ac65b70df28687c6af4270923c020bdd + depends: + - libarrow-acero 18.1.0.* + - libarrow-dataset 18.1.0.* + - libarrow-substrait 18.1.0.* + - libparquet 18.1.0.* + - pyarrow-core 18.1.0 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 25213 + timestamp: 1732610785600 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-18.1.0-py312h8025657_0.conda + sha256: 49db959887cb89b44053a44a98d0f35644fc0b2003587492f02b56046de0b60a + md5: 9bb7d32e96a5dcb5ea7fd90a11a83656 + depends: + - libarrow-acero 18.1.0.* + - libarrow-dataset 18.1.0.* + - libarrow-substrait 18.1.0.* + - libparquet 18.1.0.* + - pyarrow-core 18.1.0 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 25374 + timestamp: 1732611006864 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-18.1.0-py312h1f38498_0.conda + sha256: 06c0e208d5bf15051874097366c8e8e5db176dffba38526f227a34e80cc8e9bc + md5: 3710616b880b31d0c8afd8ae7e12392a + depends: + - libarrow-acero 18.1.0.* + - libarrow-dataset 18.1.0.* + - libarrow-substrait 18.1.0.* + - libparquet 18.1.0.* + - pyarrow-core 18.1.0 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 25375 + timestamp: 1732610892198 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-18.1.0-py312h01725c0_0_cpu.conda + sha256: 948a4161c56f846d374a3721a657e58ddbc992a29b3b3e7a6411975c30361d94 + md5: ee80934a6c280ff8635f8db5dec11e04 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 18.1.0.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 4612916 + timestamp: 1732610377259 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-18.1.0-py312h66f7834_0_cpu.conda + sha256: e7eb062145be554c23dfefa0ebe8c5f6ae8c59635117a6921e66403d6addcda3 + md5: 3390c8b8f57e85506c92a37cf750bdd7 + depends: + - libarrow 18.1.0.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 4406662 + timestamp: 1732610939832 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-18.1.0-py312hc40f475_0_cpu.conda + sha256: 063eb168a29d4ce6d9ed865e9e1ad3b6e141712189955a79e06b24ddc0cbbc9c + md5: 9859e7c4b94bbf69772dbf0511101cec + depends: + - __osx >=11.0 + - libarrow 18.1.0.* *cpu + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.21,<3 + - apache-arrow-proc =*=cpu + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 3909116 + timestamp: 1732610863261 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 + md5: 12c566707c80111f9799308d9e265aef + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + size: 110100 + timestamp: 1733195786147 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.5-pyh3cfb1c2_0.conda + sha256: 0f32c30ddc610cd1113335d8b4f311f20f4d72754b7c1a5d0d9493f597cf11d2 + md5: e8ea30925c8271c4128375810d7d3d7a + depends: + - annotated-types >=0.6.0 + - pydantic-core 2.27.2 + - python >=3.9 + - typing-extensions >=4.6.1 + - typing_extensions >=4.12.2 + license: MIT + license_family: MIT + size: 296805 + timestamp: 1736458364196 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.27.2-py312h12e396e_0.conda + sha256: 81602a4592ad2ac1a1cb57372fd25214e63b1c477d5818b0c21cde0f1f85c001 + md5: bae01b2563030c085f5158c518b84e86 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6.0,!=4.7.0 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 1641402 + timestamp: 1734571789895 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.27.2-py312h8cbf658_0.conda + sha256: 623e0f3846f15d035ce7ab7ae445fc8d9e547b6684ab55858b6f44510d24b097 + md5: 9677f6ab4bf27ba3c2aee70d08c7b27c + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6.0,!=4.7.0 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 1505076 + timestamp: 1734571966615 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.27.2-py312hcd83bfe_0.conda + sha256: cfa7201f890d5d08ce29ff70e65a96787d5793a1718776733666b44bbd4a1205 + md5: dcb307e02f17d38c6e1cbfbf8c602852 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6.0,!=4.7.0 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 1593461 + timestamp: 1734571986644 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-settings-2.7.1-pyh3cfb1c2_0.conda + sha256: 082fb1ec29917d2c9ed6a862cb8eb9beb88c208ea62c9fef1aeb5f4f3e0e0b06 + md5: d71d76b62bed332b037d7adfc0f3989a + depends: + - pydantic >=2.7.0 + - python >=3.9 + - python-dotenv >=0.21.0 + license: MIT + license_family: MIT + size: 31822 + timestamp: 1735650532951 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + sha256: 28a3e3161390a9d23bc02b4419448f8d27679d9e2c250e29849e37749c8de86b + md5: 232fb4577b6687b2d503ef8e254270c9 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + size: 888600 + timestamp: 1736243563082 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyinstrument-5.0.0-py312h66e93f0_0.conda + sha256: 8a006507a4003fb01eeee2f9ba79f994478694766ea3b445273da5c11cf8e763 + md5: 798f42d9bfdf125dc80ffbec0e96e0b6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 182021 + timestamp: 1728714164706 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyinstrument-5.0.0-py312hb2c0f52_0.conda + sha256: 7967b94b8f0ff75847302444e9c43ac11a391d74da24cb14fba1049fac9e5ba9 + md5: 5274663cb05dfbe316db50af6da4389f + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 183141 + timestamp: 1728714267954 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyinstrument-5.0.0-py312h0bf5046_0.conda + sha256: 6879d52fb0ec2258e2850476786a652c394220d53883c53691ed5390183ae925 + md5: f0e4a98d54477083ddc9d2f33507f848 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 181512 + timestamp: 1728714205508 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda + build_number: 1 + sha256: 3f0e0518c992d8ccfe62b189125721309836fe48a010dc424240583e157f9ff0 + md5: 7fd2fd79436d9b473812f14e86746844 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.3,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + size: 31565686 + timestamp: 1733410597922 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.8-h1683364_1_cpython.conda + build_number: 1 + sha256: 85573582d5b0f79923fed0a8365d3d74d21eee9f0a5fa1b9345f191e006363ab + md5: 09ec612ea05370989eaa3d81abf0f369 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - liblzma >=5.6.3,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + size: 13760816 + timestamp: 1733407890896 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.8-hc22306f_1_cpython.conda + build_number: 1 + sha256: 7586a711b1b08a9df8864e26efdc06980bdfb0e18d5ac4651d0fee30a8d3e3a0 + md5: 54ca5b5d92ef3a3ba61e195ee882a518 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + size: 12998673 + timestamp: 1733408900971 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e + depends: + - python >=3.9 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_1.conda + sha256: 99713f6b534fef94995c6c16fd21d59f3548784e9111775d692bdc7c44678f02 + md5: e5c6ed218664802d305e79cc2d4491de + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 24215 + timestamp: 1733243277223 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda + sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca + md5: a61bf9ec79426938ff785eb69dbb1960 + depends: + - python >=3.6 + license: BSD-2-Clause + license_family: BSD + size: 13383 + timestamp: 1677079727691 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda + sha256: 1b03678d145b1675b757cba165a0d9803885807792f7eb4495e48a38858c3cca + md5: a28c984e0429aff3ab7386f7de56de6f + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + size: 27913 + timestamp: 1734420869885 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1.conda + sha256: 57c9a02ec25926fb48edca59b9ede107823e5d5c473b94a0e05cc0b9a193a642 + md5: c0def296b2f6d2dd7b030c2a7f66bb1f + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + size: 142235 + timestamp: 1733235414217 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda + sha256: 20851b1e59fee127d49e01fc73195a88ab0779f103b7d6ffc90d11142a83678f + md5: 39aed2afe4d0cf76ab3d6b09eecdbea7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.2,<0.8.3.0a0 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 23162 + timestamp: 1725272139519 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-xxhash-3.5.0-py312h52516f5_1.conda + sha256: 0fa5ba80073a43391ee90303814adbc9fd826175de1fdac273ba0e5b711aa255 + md5: 591c4ae6d8338dfd07b951e00433a405 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.2,<0.8.3.0a0 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 23589 + timestamp: 1725273317965 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py312h024a12e_1.conda + sha256: 28204ef48f028a4d872e22040da0dad7ebd703549b010a1bb511b6dd94cf466d + md5: 266fe1ae54a7bb17990206664d0f0ae4 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.2,<0.8.3.0a0 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 21765 + timestamp: 1725272382968 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + depends: + - python >=3.7 + license: MIT + license_family: MIT + size: 188538 + timestamp: 1706886944988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda + sha256: a60705971e958724168f2ebbb8ed4853067f1d3f7059843df3903e3092bbcffa + md5: 549e5930e768548a89c23f595dac5a95 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 206553 + timestamp: 1725456256213 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hb2c0f52_1.conda + sha256: 8c515ebe1e7e85d972d72b75760af9dfac06fd11a9dba7e05c42d69aedbb303c + md5: dc5de424f7dbb9772da720dbb81317b2 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 199141 + timestamp: 1725456356043 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h024a12e_1.conda + sha256: b06f1c15fb39695bbf707ae8fb554b9a77519af577b5556784534c7db10b52e3 + md5: 1ee23620cf46cb15900f70a1300bae55 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 187143 + timestamp: 1725456547263 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py312hbf22597_3.conda + sha256: bc303f9b11e04a515f79cd5ad3bfa0e84b9dfec76552626d6263b38789fe6678 + md5: 746ce19f0829ec3e19c93007b1a224d3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 378126 + timestamp: 1728642454632 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.2.0-py312h2427ae1_3.conda + sha256: cfc4ea87d68b5f0ed64a61f500d5ea0a2310d1f281a4f95afa06c703ea1bdf7d + md5: 1f0779280c3dc1e72cfd86bd1e59791d + depends: + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 371730 + timestamp: 1728644030875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.2.0-py312hf8a1cbd_3.conda + sha256: 2e0ca1bb9ab3af5d1f9b38548d65be7097ba0246e7e63c908c9b1323df3f45b5 + md5: 7bdaa4c2a84b744ef26c8b2ba65c3d0e + depends: + - __osx >=11.0 + - libcxx >=17 + - libsodium >=1.0.20,<1.0.21.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 361674 + timestamp: 1728642457661 +- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h9925aae_2.conda + sha256: d213c44958d49ce7e0d4d5b81afec23640cce5016685dbb2d23571a99caa4474 + md5: e84ddf12bde691e8ec894b00ea829ddf + depends: + - libre2-11 2024.07.02 hbbce691_2 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 26786 + timestamp: 1735541074034 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2024.07.02-haa97905_2.conda + sha256: 040848655df9119bae5a549fb5c8956a5537120859416c1d9d0712b7bac9f12e + md5: 1bf0135339b4a7419a198a795d2d4be0 + depends: + - libre2-11 2024.07.02 h18dbdb1_2 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 26830 + timestamp: 1735540999398 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + sha256: 4d3799c05f8f662922a0acd129d119774760a3281b883603678e128d1cb307fb + md5: 7a8b4ad8c58a3408ca89d78788c78178 + depends: + - libre2-11 2024.07.02 h07bc746_2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 26861 + timestamp: 1735541088455 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 + md5: 47d31b792659ce70f470b5c82fdfb7a4 + depends: + - libgcc-ng >=12 + - ncurses >=6.3,<7.0a0 + arch: x86_64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 281456 + timestamp: 1679532220005 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda + sha256: 4c99f7417419734e3797d45bc355e61c26520e111893b0d7087a01a7fbfbe3dd + md5: 105eb1e16bf83bfb2eb380a48032b655 + depends: + - libgcc-ng >=12 + - ncurses >=6.3,<7.0a0 + arch: aarch64 + platform: linux + license: GPL-3.0-only + license_family: GPL + size: 294092 + timestamp: 1679532238805 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 + md5: 8cbb776a2f641b943d413b3e19df71f4 + depends: + - ncurses >=6.3,<7.0a0 + arch: arm64 + platform: osx + license: GPL-3.0-only + license_family: GPL + size: 250351 + timestamp: 1679532511311 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + sha256: fcb5687d3ec5fff580b64b8fb649d9d65c999a91a5c3108a313ecdd2de99f06b + md5: 647770db979b43f9c9ca25dcfa7dc4e4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Python-2.0 + license_family: PSF + size: 402821 + timestamp: 1730952378415 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2024.11.6-py312hb2c0f52_0.conda + sha256: ec2c416860de29224e447e2031f8686a05476759c17da1f32f61d4307e540ec8 + md5: fa8b589107567f532fa1380e66f91776 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Python-2.0 + license_family: PSF + size: 398947 + timestamp: 1730952477463 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py312hea69d52_0.conda + sha256: dcdec32f2c7dd37986baa692bedf9db126ad34e92e5e9b64f707cba3d04d2525 + md5: e73cda1f18846b608284bd784f061eac + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Python-2.0 + license_family: PSF + size: 366374 + timestamp: 1730952427552 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: a9b9368f3701a417eac9edbcae7cb737 + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.9 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + size: 58723 + timestamp: 1733217126197 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + sha256: 06a760c5ae572e72e865d5a87e9fe3cc171e1a9c996e63daf3db52ff1a0b4457 + md5: 7aed65d4ff222bfb7335997aa40b7da5 + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.9 + - typing_extensions >=4.0.0,<5.0.0 + license: MIT + license_family: MIT + size: 185646 + timestamp: 1733342347277 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-toolkit-0.11.3-pyh29332c3_0.conda + sha256: e558f8c254a9ff9164d069110da162fc79497d70c60f2c09a5d3d0d7101c5628 + md5: 4ba15ae9388b67d09782798347481f69 + depends: + - python >=3.9 + - rich >=13.7.1 + - click >=8.1.7 + - typing_extensions >=4.12.2 + - python + license: MIT + license_family: MIT + size: 17357 + timestamp: 1733750834072 +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.10-hb5b8611_0.conda + sha256: f6d451821fddc26b93f45e9313e1ea15e09e5ef049d4e137413a5225d2a5dfba + md5: 999f3673f2a011f59287f2969e3749e4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 355142 + timestamp: 1734415467047 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.5.10-h5df210e_0.conda + sha256: b5e7a9f4b7b1ec5c5c3661e2defc8b47fab543b05cad6fec78739d8007612464 + md5: 3d3979efcc0f44f3f0cef3de03b296cc + depends: + - libgcc >=13 + - openssl >=3.4.0,<4.0a0 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 353450 + timestamp: 1734415474615 +- conda: https://conda.anaconda.org/conda-forge/linux-64/safetensors-0.5.2-py312h12e396e_0.conda + sha256: 98b8dfa5eec083e0b3ace00906a7f7e748b1e2446dca17e87473f43278fcc036 + md5: 999ca9d87d2bb8b4c01e62c755b928cf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 424409 + timestamp: 1736383159339 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/safetensors-0.5.2-py312h8cbf658_0.conda + sha256: 3e230060c1366cbaf03f4315b021dfe47f5147f3af88f17975d661c08fe15ad3 + md5: 2c77c961c4e813b1d05122ac4d803d80 + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 408166 + timestamp: 1736383184569 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/safetensors-0.5.2-py312hcd83bfe_0.conda + sha256: 0aeb3e654095ca0261d560d1fc05912d0e94d547a7dc435d7f4cedeba966d176 + md5: fc0383682805e293eba9b8afc9ad0931 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 378060 + timestamp: 1736383410115 +- conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda + sha256: 0557c090913aa63cdbe821dbdfa038a321b488e22bc80196c4b3b1aace4914ef + md5: 7c3c2a0f3ebdea2bbc35538d162b43bf + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 14462 + timestamp: 1733301007770 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + sha256: ec91e86eeb2c6bbf09d51351b851e945185d70661d2ada67204c9a6419d282d3 + md5: 3b3e64af585eadfb52bb90b553db5edf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 42739 + timestamp: 1733501881851 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.1-hd4fb6f5_1.conda + sha256: c4a07ae5def8d55128f25a567a296ef9d7bf99a3bc79d46bd5160c076a5f50af + md5: 2fcc6cd1e5550deb509073fd2e6693e1 + depends: + - libgcc >=13 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 43032 + timestamp: 1733501964775 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda + sha256: 4242f95b215127a006eb664fe26ed5a82df87e90cbdbc7ce7ff4971f0720997f + md5: ded86dee325290da2967a3fea3800eb5 + depends: + - __osx >=11.0 + - libcxx >=18 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 35857 + timestamp: 1733502172664 +- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + sha256: c2248418c310bdd1719b186796ae50a8a77ce555228b6acd32768e2543a15012 + md5: bf7a226e58dfb8346c70df36065d86c9 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + size: 15019 + timestamp: 1733244175724 +- conda: https://conda.anaconda.org/conda-forge/noarch/sse-starlette-2.2.1-pyhd8ed1ab_0.conda + sha256: 3c6a476e7afb702d841e23c61a0c4cc491929d2e39376d329e67e94c40a236cc + md5: c1ef6bc13dd2caa4b406fb3cb06c2791 + depends: + - anyio >=4.7.0 + - python >=3.9 + - starlette >=0.41.3 + license: BSD-3-Clause + license_family: BSD + size: 15324 + timestamp: 1735126414893 +- conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.41.3-pyha770c72_1.conda + sha256: b74fc76107487eb26624c01fc55bfab7eed03ae82e003333c86d8a1eeac53672 + md5: 0207dac04ae2200701fab697f0aaaac4 + depends: + - anyio >=3.4.0,<5 + - python >=3.9 + - typing_extensions >=3.10.0 + license: BSD-3-Clause + license_family: BSD + size: 58838 + timestamp: 1733344472634 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: TCL + license_family: BSD + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: TCL + license_family: BSD + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.0-py312h8360d73_0.conda + sha256: 4f504a5e9d77c6d88a8f735c4319429d8bf40b742384f908a2efe0a09acc3cc5 + md5: f953aa733207f3d37acf4a3efbedba89 + depends: + - __glibc >=2.17,<3.0.a0 + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 2258007 + timestamp: 1732734202127 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tokenizers-0.21.0-py312ha0d6ea1_0.conda + sha256: ef0f4d4e2c798b1821187ea0ba4c86484e48abaa0e9a19fe68030fa7ff5dde84 + md5: 077f48c9e0c08a30d842e15c51df4143 + depends: + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.4.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: APACHE + size: 2331194 + timestamp: 1732734303196 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.0-py312hf3e4074_0.conda + sha256: 5d395333fcb22dc611140286c1f2ea8b3fa220a4931c583587cb612238091555 + md5: 4c732c74b485ef7ac8ec1c548dd45e8e + depends: + - __osx >=11.0 + - huggingface_hub >=0.16.4,<1.0 + - libcxx >=18 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + size: 1931389 + timestamp: 1732734727624 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 840414 + timestamp: 1732616043734 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4.2-py312h52516f5_0.conda + sha256: 4c19a544354172b2273553267e734795a6da3c78a04c2d19f8e9e159ca3178bc + md5: e28996d9d2d44d777b7e6fb12f63715b + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 841662 + timestamp: 1732616934923 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda + sha256: 964a2705a36c50040c967b18b45b9cc8de3c2aff4af546979a574e0b38e58e39 + md5: fb0605888a475d6a380ae1d1a819d976 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 842549 + timestamp: 1732616081362 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + size: 89498 + timestamp: 1735661472632 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/transformers-4.48.0-pyhd8ed1ab_0.conda + sha256: c8dd6d69e4ef67c7d507dec2be4b6964f6ddbe1ce35a822ddf4089505d702f33 + md5: 2c57d4af7b8952484962b40a59cf1537 + depends: + - datasets !=2.5.0 + - filelock + - huggingface_hub >=0.23.0,<1.0 + - numpy >=1.17 + - packaging >=20.0 + - python >=3.9 + - pyyaml >=5.1 + - regex !=2019.12.17 + - requests + - safetensors >=0.4.1 + - tokenizers >=0.21,<0.22 + - tqdm >=4.27 + license: Apache-2.0 + license_family: APACHE + size: 3408277 + timestamp: 1736534112195 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.1-pyhd8ed1ab_0.conda + sha256: ef695490e895c2ad552c77ec497b899b09fd4ad4ab07edcf5649f5994cf92a35 + md5: 170a0398946d8f5b454e592672b6fc20 + depends: + - python >=3.9 + - typer-slim-standard 0.15.1 hd8ed1ab_0 + license: MIT + license_family: MIT + size: 56175 + timestamp: 1733408582623 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.1-pyhd8ed1ab_0.conda + sha256: d4965516f35e0805199de6596c4ac76c4ad3d6b012be35e532102f9e53ecb860 + md5: 0218b16f5a1dd569e575a7a6415489db + depends: + - click >=8.0.0 + - python >=3.9 + - typing_extensions >=3.7.4.3 + constrains: + - rich >=10.11.0 + - typer >=0.15.1,<0.15.2.0a0 + - shellingham >=1.3.0 + license: MIT + license_family: MIT + size: 43592 + timestamp: 1733408569554 +- conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.1-hd8ed1ab_0.conda + sha256: f31c56fe98315da8b9ce848256c17e0b9f87896b41a6ccf0c9cc74644dcef20f + md5: 4e603c43bfdfc7b533be087c3e070cc9 + depends: + - rich + - shellingham + - typer-slim 0.15.1 pyhd8ed1ab_0 + license: MIT + license_family: MIT + size: 49531 + timestamp: 1733408570063 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + noarch: python + sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: b6a408c64b78ec7b779a3e5c7a902433 + depends: + - typing_extensions 4.12.2 pyha770c72_1 + license: PSF-2.0 + license_family: PSF + size: 10075 + timestamp: 1733188758872 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + sha256: 4fde5c3008bf5d2db82f2b50204464314cc3c91c1d953652f7bd01d9e52aefdf + md5: 8ac3367aafb1cc0a068483c580af8015 + license: LicenseRef-Public-Domain + size: 122354 + timestamp: 1728047496079 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda + sha256: 114919ffa80c328127dab9c8e7a38f9d563c617691fb81fccb11c1e86763727e + md5: 32674f8dbfb7b26410ed580dd3c10a29 + depends: + - brotli-python >=1.0.9 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.9 + - zstandard >=0.18.0 + license: MIT + license_family: MIT + size: 100102 + timestamp: 1734859520452 +- conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.0-pyh31011fe_0.conda + sha256: 55c160b0cf9274e2b98bc0f7fcce548bffa8d788bc86aa02801877457040f6fa + md5: 5d448feee86e4740498ec8f8eb40e052 + depends: + - __unix + - click >=7.0 + - h11 >=0.8 + - python >=3.9 + - typing_extensions >=4.0 + license: BSD-3-Clause + license_family: BSD + size: 48643 + timestamp: 1734293057914 +- conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.0-h31011fe_0.conda + sha256: 87e1531e175e75122f9f37608eb953af4c977465ab0ae11283cc01fef954e4ec + md5: 32a94143a7f65d76d2d5da37dcb4ed79 + depends: + - __unix + - httptools >=0.6.3 + - python-dotenv >=0.13 + - pyyaml >=5.1 + - uvicorn 0.34.0 pyh31011fe_0 + - uvloop >=0.14.0,!=0.15.0,!=0.15.1 + - watchfiles >=0.13 + - websockets >=10.4 + license: BSD-3-Clause + license_family: BSD + size: 7203 + timestamp: 1734293058849 +- conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.21.0-py312h66e93f0_1.conda + sha256: 9337a80165fcf70b06b9d6ba920dad702260ca966419ae77560a15540e41ab72 + md5: 998e481e17c1b6a74572e73b06f2df08 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libuv >=1.49.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: MIT OR Apache-2.0 + size: 701355 + timestamp: 1730214506716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvloop-0.21.0-py312hb2c0f52_1.conda + sha256: 807eede6698bd00a1d739a3e19ee6ae6a03a66d2ddd2ef150f2dfd198c3b0292 + md5: d83e107ba16c77aba2feec47b7b666a4 + depends: + - libgcc >=13 + - libuv >=1.49.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: MIT OR Apache-2.0 + size: 655266 + timestamp: 1730214606664 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvloop-0.21.0-py312h0bf5046_1.conda + sha256: b1efa77aa4871d7bb09c8dd297fa9bd9070ba7f0f95f2d12ae9cdd31ce8b6b22 + md5: 4f5110253ba80ebf27e55c4ab333880a + depends: + - __osx >=11.0 + - libuv >=1.49.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: MIT OR Apache-2.0 + size: 544097 + timestamp: 1730214653726 +- conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.0.4-py312h12e396e_0.conda + sha256: b728f525dcae2c10524f9942255346eba62aee9c820ff269d7dd4f7caffb7ffb + md5: df87129c4cb7afc4a3cbad71a1b9e223 + depends: + - __glibc >=2.17,<3.0.a0 + - anyio >=3.0.0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 410192 + timestamp: 1736550568524 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/watchfiles-1.0.4-py312h8cbf658_0.conda + sha256: 45193910f6bafc287c784442d173745161b18f96223f0f990a9a744fda753787 + md5: ed958a27e610c31de625e167d4c11a04 + depends: + - anyio >=3.0.0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 403791 + timestamp: 1736550743174 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.0.4-py312hcd83bfe_0.conda + sha256: 84122e3712f2263e12c9d2be75d122eaf2d269801183df4b73aadcb670943b17 + md5: 946eb0208d09b811a671fad9b2831f4e + depends: + - __osx >=11.0 + - anyio >=3.0.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 363822 + timestamp: 1736550859472 +- conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-14.1-py312h66e93f0_0.conda + sha256: 5998940f91765ba991cf286c863c20bcb53db92bb976a2b5a714566b86b0e763 + md5: a79f7ce618bd0a9f4c00c59a03570fcd + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 242145 + timestamp: 1731498716195 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/websockets-14.1-py312hb2c0f52_0.conda + sha256: c292a8badcbe4040537e225fbeb237bfaf272808eab060067d965d3da98ccd5c + md5: 7e2a0ef2a1a87f88f9745f9c7059186e + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 242912 + timestamp: 1731498811466 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-14.1-py312hea69d52_0.conda + sha256: 98fb04a1a0f53dc604378f94b5795d0b8e462fee01bf0a887cb34d0efdf5d21f + md5: 89b79a9baa7db46ce21f5738a5a3dfda + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 243131 + timestamp: 1731498944076 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda + sha256: ed3a1700ecc5d38c7e7dc7d2802df1bc1da6ba3d6f6017448b8ded0affb4ae00 + md5: 669e63af87710f8d52fdec9d4d63b404 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 63590 + timestamp: 1736869574299 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-1.17.2-py312hb2c0f52_0.conda + sha256: cc28914462a21b2f64d9b763a9733bfcbc811dd2975d0d2e6e429e35f5b6d59c + md5: 8a5c6e3f809bae085be369b62dc5d06a + depends: + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 63967 + timestamp: 1736869675870 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.2-py312hea69d52_0.conda + sha256: 6a3e68b57de29802e8703d1791dcacb7613bfdc17bbb087c6b2ea2796e6893ef + md5: e49608c832fcf438f70cbcae09c3adc5 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 61198 + timestamp: 1736869673767 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 + md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 14780 + timestamp: 1734229004433 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-h86ecc28_0.conda + sha256: 7829a0019b99ba462aece7592d2d7f42e12d12ccd3b9614e529de6ddba453685 + md5: d5397424399a66d33c80b1f2345a36a6 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 15873 + timestamp: 1734230458294 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda + sha256: f33e6f013fc36ebc200f09ddead83468544cb5c353a3b50499b07b8c34e28a8d + md5: 50901e0764b7701d8ed7343496f4f301 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 13593 + timestamp: 1734229104321 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 19901 + timestamp: 1727794976192 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda + sha256: efcc150da5926cf244f757b8376d96a4db78bc15b8d90ca9f56ac6e75755971f + md5: 25a5a7b797fe6e084e04ffe2db02fc62 + depends: + - libgcc >=13 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 20615 + timestamp: 1727796660574 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + sha256: 9939a166d780700d81023546759102b33fdc2c5f11ef09f5f66c77210fd334c8 + md5: 77c447f48cab5d3a15ac224edb86a968 + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 18487 + timestamp: 1727795205022 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda + sha256: 6fe74a8fd84ab0dc25e4dc3e0c22388dd8accb212897a208b14fe5d4fbb8fc2f + md5: f08fb5c89edfc4aadee1c81d4cfb1fa1 + depends: + - libgcc-ng >=12 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 97691 + timestamp: 1689951608120 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xxhash-0.8.2-h31becfc_0.conda + sha256: 4c526aed70b579d80e5c20d32130b6bc8bde59b3250d43c2b5269755f4da8a9b + md5: bb9faf6857108a9f62ebb4dab6ef05da + depends: + - libgcc-ng >=12 + arch: aarch64 + platform: linux + license: BSD-2-Clause + license_family: BSD + size: 102442 + timestamp: 1689951682147 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.2-hb547adb_0.conda + sha256: a70f59f7221ee72c45b39a6b36a33eb9c717ba01921cce1a3c361a4676979a2e + md5: 144cd3b88706507f332f5eb5fb83a33b + arch: arm64 + platform: osx + license: BSD-2-Clause + license_family: BSD + size: 97593 + timestamp: 1689951969732 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + size: 89141 + timestamp: 1641346969816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + sha256: 8bc601d6dbe249eba44b3c456765265cd8f42ef1e778f8df9b0c9c88b8558d7e + md5: b853307650cb226731f653aa623936a4 + depends: + - libgcc-ng >=9.4.0 + arch: aarch64 + platform: linux + license: MIT + license_family: MIT + size: 92927 + timestamp: 1641347626613 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 + md5: 4bb3f014845110883a3c5ee811fd84b4 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + size: 88016 + timestamp: 1641347076660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.18.3-py312h66e93f0_0.conda + sha256: a0d93c3bef723e384cff8a29a82a2c6b7a73b39328088f3a2d97c901f56e9a63 + md5: 91df2efaa08730416bec2a4502309275 + depends: + - __glibc >=2.17,<3.0.a0 + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 151393 + timestamp: 1733428897813 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.18.3-py312hb2c0f52_0.conda + sha256: 470b5b0f3ac89acd143095281167dc2ac1a56d4fa22e1794bd8f3b00bb604540 + md5: 0b3c640697bca798d0ab428f530ed24c + depends: + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: aarch64 + platform: linux + license: Apache-2.0 + license_family: Apache + size: 150004 + timestamp: 1733429056665 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.18.3-py312hea69d52_0.conda + sha256: 69c7863809e11bc90c0d935c16e7f151dcc925add08b3894f06059263a8cb9ba + md5: f32f9b16361866a62d6e061fcd7eb400 + depends: + - __osx >=11.0 + - idna >=2.0 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + size: 141556 + timestamp: 1733429104990 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: x86_64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 335400 + timestamp: 1731585026517 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda + sha256: a6003096dc0570a86492040ba32b04ce7662b159600be2252b7a0dfb9414e21c + md5: f2f3282559a4b87b7256ecafb4610107 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + arch: aarch64 + platform: linux + license: MPL-2.0 + license_family: MOZILLA + size: 371419 + timestamp: 1731589490850 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda + sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a + md5: f7e6b65943cb73bce0143737fded08f1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libcxx >=18 + - libsodium >=1.0.20,<1.0.21.0a0 + arch: arm64 + platform: osx + license: MPL-2.0 + license_family: MOZILLA + size: 281565 + timestamp: 1731585108039 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 21809 + timestamp: 1732827613585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + sha256: b97015e146437283f2213ff0e95abdc8e2480150634d81fbae6b96ee09f5e50b + md5: 8b7069e9792ee4e5b4919a7a306d2e67 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 419552 + timestamp: 1725305670210 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + sha256: 2681c2a249752bdc7978e59ee2f34fcdfcbfda80029b84b8e5fec8dbc9e3af25 + md5: ffcb8e97e62af42075e0e5f46bb9856e + depends: + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 392496 + timestamp: 1725305808244 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + sha256: d00ca25c1e28fd31199b26a94f8c96574475704a825d244d7a6351ad3745eeeb + md5: a4cde595509a7ad9c13b1a3809bcfe51 + depends: + - __osx >=11.0 + - cffi >=1.11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 330788 + timestamp: 1725305806565 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b + md5: 4d056880988120e29d75bfff282e0f45 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 554846 + timestamp: 1714722996770 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + sha256: 484f9d0722c77685ae379fbff3ccd662af9ead7e59eb39cd6d0c677cdf25ff6c + md5: be8d5f8cf21aed237b8b182ea86b3dd6 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: aarch64 + platform: linux + license: BSD-3-Clause + license_family: BSD + size: 539937 + timestamp: 1714723130243 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + sha256: 2d4fd1ff7ee79cd954ca8e81abf11d9d49954dd1fef80f27289e2402ae9c2e09 + md5: d96942c06c3e84bfcc5efb038724a7fd + depends: + - __osx >=11.0 + - libzlib >=1.2.13,<2.0.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + size: 405089 + timestamp: 1714723101397 diff --git a/magic.lock b/magic.lock index ea064f325e..adcf0280a6 100644 --- a/magic.lock +++ b/magic.lock @@ -132,12 +132,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011605-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.15-py312h98912ed_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -351,12 +351,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-h5ad3122_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.2-py312h74ce7d3_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011605-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.1.0-py312hcc812fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multiprocess-0.70.15-py312hdd3e373_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -557,16 +557,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.5-h178c5d8_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/lit-19.1.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312h998013c_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda - - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.12release.conda - - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011605-release.conda + - conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011605-3.12release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda + - conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.1.0-py312hdb8e49c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.15-py312h02f2b3b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_1.conda @@ -4657,19 +4657,18 @@ packages: license_family: Apache size: 128580 timestamp: 1736894117712 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda - sha256: a0f3e9139ab16f0a67b9d2bbabc15b78977168f4a5b5503fed4962dcb9a96102 - md5: 34fdeffa0555a1a56f38839415cc066c +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.7-hdb05f8b_0.conda + sha256: b92a669f2059874ebdcb69041b6c243d68ffc3fb356ac1339cec44aeb27245d7 + md5: c4d54bfd3817313ce758aa76283b118d depends: - __osx >=11.0 constrains: - - openmp 19.1.6|19.1.6.* + - openmp 19.1.7|19.1.7.* arch: arm64 platform: osx license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - size: 281251 - timestamp: 1734520462311 + size: 280830 + timestamp: 1736986295869 - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 md5: 9de5350a85c4a20c685259b889aa6393 @@ -4764,47 +4763,47 @@ packages: license_family: BSD size: 24048 timestamp: 1733219945697 -- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011505-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/max-25.1.0.dev2025011605-release.conda noarch: python - sha256: fb653b1206a459970561cb99277971b809ef23dfbabb08067cf87ecc5316d144 - md5: 36d10ca6747cea3051f98f6c4340bdde + sha256: 66c70dda70094dd44776322c4274e0aedea1326e79407b710423d196fbf5c687 + md5: 63f0b9dbd781076f2346a4c90818fa77 depends: - - max-core ==25.1.0.dev2025011505 release - - max-python >=25.1.0.dev2025011505,<26.0a0 - - mojo-jupyter ==25.1.0.dev2025011505 release - - mblack ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release + - max-python >=25.1.0.dev2025011605,<26.0a0 + - mojo-jupyter ==25.1.0.dev2025011605 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 9920 - timestamp: 1736918190337 -- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011505-release.conda - sha256: 5de02f267a7821eb30275253c0f03317e45befb2291b4c164d217e4a0be08489 - md5: e084403c468c3736de7b93e85ac55ca5 + size: 9918 + timestamp: 1737005226114 +- conda: https://conda.modular.com/max-nightly/linux-64/max-core-25.1.0.dev2025011605-release.conda + sha256: 833bf62b78d41a258c0f1c2fb33efe2ecd31d52c9f25e0927f3a3c06f3263143 + md5: 67b61208a7f51d98440b829a762aa983 depends: - - mblack ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 244663428 - timestamp: 1736918190336 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011505-release.conda - sha256: b90cccb4ff28d8680f0221b696cfe260c3263afc92fcc90bae9e3e0205f6649a - md5: 6b38ab0cddf2d8d6ea3de50fa06daccf + size: 244845391 + timestamp: 1737004888429 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-core-25.1.0.dev2025011605-release.conda + sha256: cca47165ed2791ce97b8ed478c375ca5e19c9b1dbad2008a88fcf55976669e98 + md5: ec67c1c4477173523c480d0439f618ee depends: - - mblack ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 247150310 - timestamp: 1736918170378 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011505-release.conda - sha256: 8e443193c3efccf88a1f335f56803cc8252a6087ceb570847fbc7d54373436dd - md5: 380f01b398f4026fa6d362bcd535bcce + size: 247313436 + timestamp: 1737005226112 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-core-25.1.0.dev2025011605-release.conda + sha256: 0c90b26d3a97472ecf01e8f96210d1b6becf10a628eb138a8fe9cba25c275f94 + md5: 67f133797e55bdfeae523889d117d24e depends: - - mblack ==25.1.0.dev2025011505 release + - mblack ==25.1.0.dev2025011605 release license: LicenseRef-Modular-Proprietary - size: 206696883 - timestamp: 1736918528488 -- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011505-3.12release.conda - sha256: 8ffaf65c9e533d1c05e63208e5929f7047232682d71e241a8d078bd40784c070 - md5: 979326be6e37f9d08a2af9d3b5f5b173 + size: 206707824 + timestamp: 1737004945969 +- conda: https://conda.modular.com/max-nightly/linux-64/max-python-25.1.0.dev2025011605-3.12release.conda + sha256: 8ab036ac69684b74999f0274eb9741c0d0c4e036a0a777dfa2276539703bcf87 + md5: 6fde421d7d48ab50ec34964bfc003ab0 depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python 3.12.* - fastapi - httpx @@ -4825,13 +4824,13 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 124404054 - timestamp: 1736918190345 -- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011505-3.12release.conda - sha256: d29135e77b8d7da7fc1e7fe00b6cefb5faded5da911430a1ff9090377cde6a0f - md5: 7ab99f094af5a6e10444022febf6158f + size: 124617353 + timestamp: 1737004888439 +- conda: https://conda.modular.com/max-nightly/linux-aarch64/max-python-25.1.0.dev2025011605-3.12release.conda + sha256: 3b711e5ef7c518e1e6b69ff69c5c7505e9f5779ee99359c7b2808a6324bee5ca + md5: f264d20311c5422c256d177081752fc4 depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python 3.12.* - fastapi - httpx @@ -4852,13 +4851,13 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 127116659 - timestamp: 1736918170389 -- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011505-3.12release.conda - sha256: f21679607c9939017d447c50d2732c8e842dcb29d18907390f5cd85254370ccf - md5: 112c450c08f0af99073a4dc4aae82576 + size: 127393468 + timestamp: 1737005226123 +- conda: https://conda.modular.com/max-nightly/osx-arm64/max-python-25.1.0.dev2025011605-3.12release.conda + sha256: f3c1e91c675ebf5835799c044f534e87840cae019df45e06ab50b09c4b819138 + md5: b42171a30a90eca86de374dc6562d2ab depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python 3.12.* - fastapi - httpx @@ -4879,12 +4878,12 @@ packages: - uvicorn - python_abi 3.12.* *_cp312 license: LicenseRef-Modular-Proprietary - size: 110626067 - timestamp: 1736918528491 -- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011505-release.conda + size: 110522116 + timestamp: 1737004945972 +- conda: https://conda.modular.com/max-nightly/noarch/mblack-25.1.0.dev2025011605-release.conda noarch: python - sha256: f1dab48a1791a810711d1c7e484ea1c5340297d09f9493cd99604978a3c43717 - md5: d4a97c4b5ee27717785df58abcef3fb3 + sha256: cfd9e14c0c14fa02b6b61141ff4f9007a11eb3ed1b11cf48a717f215e27c7407 + md5: d60436499404c582b03af554c788436f depends: - python >=3.9,<3.13 - click >=8.0.0 @@ -4894,8 +4893,8 @@ packages: - platformdirs >=2 - python license: MIT - size: 130819 - timestamp: 1736918190341 + size: 130793 + timestamp: 1737005226119 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -4905,18 +4904,18 @@ packages: license_family: MIT size: 14465 timestamp: 1733255681319 -- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011505-release.conda +- conda: https://conda.modular.com/max-nightly/noarch/mojo-jupyter-25.1.0.dev2025011605-release.conda noarch: python - sha256: 87baffbf376e8562b6bde06c50c57d907ec9a6f6f338f342bddfad4fa83403e4 - md5: c14f190fae020526fc6559130272f1f8 + sha256: 68dcf6fcc24f226462c4a7004a2214a1696f2ad0cb8d7ac229ee9ec4ea2216ea + md5: 864d0b85ff8fd743209bea757229d010 depends: - - max-core ==25.1.0.dev2025011505 release + - max-core ==25.1.0.dev2025011605 release - python >=3.9,<3.13 - jupyter_client >=8.6.2,<8.7 - python license: LicenseRef-Modular-Proprietary - size: 22931 - timestamp: 1736918190342 + size: 22934 + timestamp: 1737005226120 - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.1.0-py312h178313f_2.conda sha256: b05bc8252a6e957bf4a776ed5e0e61d1ba88cdc46ccb55890c72cc58b10371f4 md5: 5b5e3267d915a107eca793d52e1b780a From e4cb52b78f76878905a9d7cbcd14ccf212948a59 Mon Sep 17 00:00:00 2001 From: Joshua James Venter Date: Thu, 16 Jan 2025 11:55:20 +0200 Subject: [PATCH 39/39] str -> String Signed-off-by: Joshua James Venter --- stdlib/src/collections/string/string.mojo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/src/collections/string/string.mojo b/stdlib/src/collections/string/string.mojo index 99a553c886..d5d0569edd 100644 --- a/stdlib/src/collections/string/string.mojo +++ b/stdlib/src/collections/string/string.mojo @@ -267,7 +267,7 @@ fn stol(str_slice: StringSlice, base: Int = 10) raises -> (Int, String): real_base = base if real_base <= 10: - ord_num_max = ord(str(real_base - 1)) + ord_num_max = ord(String(real_base - 1)) else: ord_num_max = ord("9") ord_letter_max = (