diff --git a/README.md b/README.md index 1f1bdb9..3d9dae0 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ Once you have a Mojo project set up locally, ```toml [dependencies] - lightbug_http = ">=0.1.17" + lightbug_http = ">=0.1.18" ``` 3. Run `magic install` at the root of your project, where `mojoproject.toml` is located diff --git a/external/__init__.mojo b/external/__init__.mojo new file mode 100644 index 0000000..e69de29 diff --git a/external/small_time/__init__.mojo b/external/small_time/__init__.mojo new file mode 100644 index 0000000..66562c4 --- /dev/null +++ b/external/small_time/__init__.mojo @@ -0,0 +1,5 @@ +# small_time library, courtesy @thatstoasty , 2025 +# https://github.com/thatstoasty/small-time/ +from .small_time import SmallTime, now +from .time_zone import TimeZone +from .time_delta import TimeDelta diff --git a/external/small_time/c.mojo b/external/small_time/c.mojo new file mode 100644 index 0000000..7edfa70 --- /dev/null +++ b/external/small_time/c.mojo @@ -0,0 +1,129 @@ +# small_time library, courtesy @thatstoasty , 2025 +# https://github.com/thatstoasty/small-time/ +from sys import external_call +from sys.ffi import c_uchar +from memory import UnsafePointer, Pointer, stack_allocation + + +@register_passable("trivial") +struct TimeVal: + """Time value.""" + var tv_sec: Int + """Seconds.""" + var tv_usec: Int + """Microseconds.""" + + fn __init__(out self, tv_sec: Int = 0, tv_usec: Int = 0): + """Initializes a new time value. + + Args: + tv_sec: Seconds. + tv_usec: Microseconds. + """ + self.tv_sec = tv_sec + self.tv_usec = tv_usec + + +@register_passable("trivial") +struct Tm: + """C Tm struct.""" + + var tm_sec: Int32 + """Seconds.""" + var tm_min: Int32 + """Minutes.""" + var tm_hour: Int32 + """Hour.""" + var tm_mday: Int32 + """Day of the month.""" + var tm_mon: Int32 + """Month.""" + var tm_year: Int32 + """Year minus 1900.""" + var tm_wday: Int32 + """Day of the week.""" + var tm_yday: Int32 + """Day of the year.""" + var tm_isdst: Int32 + """Daylight savings flag.""" + var tm_gmtoff: Int64 + """Localtime zone offset seconds.""" + + fn __init__(out self): + """Initializes a new time struct.""" + self.tm_sec = 0 + self.tm_min = 0 + self.tm_hour = 0 + self.tm_mday = 0 + self.tm_mon = 0 + self.tm_year = 0 + self.tm_wday = 0 + self.tm_yday = 0 + self.tm_isdst = 0 + self.tm_gmtoff = 0 + + +fn gettimeofday() -> TimeVal: + """Gets the current time. It's a wrapper around libc `gettimeofday`. + + Returns: + Current time. + """ + var tv = stack_allocation[1, TimeVal]() + _ = external_call["gettimeofday", Int32](tv, 0) + return tv.take_pointee() + + +fn time() -> Int: + """Returns the current time in seconds since the Epoch. + + Returns: + Current time in seconds. + """ + var time = 0 + return external_call["time", Int](Pointer.address_of(time)) + + +fn localtime(owned tv_sec: Int) -> Tm: + """Converts a time value to a broken-down local time. + + Args: + tv_sec: Time value in seconds since the Epoch. + + Returns: + Broken down local time. + """ + return external_call["localtime", UnsafePointer[Tm]](UnsafePointer.address_of(tv_sec)).take_pointee() + + +fn strptime(time_str: String, time_format: String) -> Tm: + """Parses a time string according to a format string. + + Args: + time_str: Time string. + time_format: Time format string. + + Returns: + Broken down time. + """ + var tm = stack_allocation[1, Tm]() + _ = external_call[ + "strptime", + NoneType, + UnsafePointer[c_uchar], + UnsafePointer[c_uchar], + UnsafePointer[Tm] + ](time_str.unsafe_ptr(), time_format.unsafe_ptr(), tm) + return tm.take_pointee() + + +fn gmtime(owned tv_sec: Int) -> Tm: + """Converts a time value to a broken-down UTC time. + + Args: + tv_sec: Time value in seconds since the Epoch. + + Returns: + Broken down UTC time. + """ + return external_call["gmtime", UnsafePointer[Tm]](Pointer.address_of(tv_sec)).take_pointee() diff --git a/external/small_time/formatter.mojo b/external/small_time/formatter.mojo new file mode 100644 index 0000000..c724566 --- /dev/null +++ b/external/small_time/formatter.mojo @@ -0,0 +1,278 @@ +# small_time library, courtesy @thatstoasty , 2025 +# https://github.com/thatstoasty/small-time/ +from collections import InlineArray +from collections.string import StringSlice +from utils import StaticTuple +from external.small_time.time_zone import UTC_TZ + +alias MONTH_NAMES = InlineArray[String, 13]( + "", + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", +) +"""The full month names.""" + +alias MONTH_ABBREVIATIONS = InlineArray[String, 13]( + "", + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", +) +"""The month name abbreviations.""" + +alias DAY_NAMES = InlineArray[String, 8]( + "", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday", +) +"""The full day names.""" +alias DAY_ABBREVIATIONS = InlineArray[String, 8]("", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun") +"""The day name abbreviations.""" +alias formatter = _Formatter() +"""Default formatter instance.""" + + +struct _Formatter: + """SmallTime formatter.""" + var _sub_chrs: StaticTuple[Int, 128] + """Substitution characters.""" + + fn __init__(out self): + """Initializes a new formatter.""" + self._sub_chrs = StaticTuple[Int, 128]() + for i in range(128): + self._sub_chrs[i] = 0 + self._sub_chrs[_Y] = 4 + self._sub_chrs[_M] = 4 + self._sub_chrs[_D] = 2 + self._sub_chrs[_d] = 4 + self._sub_chrs[_H] = 2 + self._sub_chrs[_h] = 2 + self._sub_chrs[_m] = 2 + self._sub_chrs[_s] = 2 + self._sub_chrs[_S] = 6 + self._sub_chrs[_Z] = 3 + self._sub_chrs[_A] = 1 + self._sub_chrs[_a] = 1 + + fn format(self, m: SmallTime, fmt: String) -> String: + """Formats the given time value using the specified format string. + "YYYY[abc]MM" -> replace("YYYY") + "abc" + replace("MM") + + Args: + m: Time value. + fmt: Format string. + + Returns: + Formatted time string. + """ + if len(fmt) == 0: + return "" + + var format = fmt.as_string_slice() + var result: String = '' + var in_bracket = False + var start = 0 + + for i in range(len(format)): + if format[i] == "[": + if in_bracket: + result.write("[") + else: + in_bracket = True + + # Not sure why stringslice slicing raises, + # but fallback to allocating a string and slicing that if it raises. + try: + result.write(self.replace(m, format[start:i])) + except: + result.write(self.replace(m, fmt[start:i])) + + start = i + 1 + elif format[i] == "]": + if in_bracket: + try: + result.write(format[start:i]) + except: + result.write(fmt[start:i]) + in_bracket = False + else: + try: + result.write(format[start:i]) + except: + result.write(fmt[start:i]) + result.write("]") + start = i + 1 + + if in_bracket: + result.write("[") + + if start < len(format): + try: + result.write(self.replace(m, format[start:])) + except: + result.write(self.replace(m, fmt[start:])) + return result + + fn replace(self, m: SmallTime, fmt: StringSlice) -> String: + """Replaces the tokens in the given format string with the corresponding values. + + Args: + m: Time value. + fmt: Format string. + + Returns: + Formatted time string. + """ + if len(fmt) == 0: + return "" + + var result: String = '' + var matched_byte = 0 + var matched_count = 0 + for i in range(len(fmt)): + var c = ord(fmt[i]) + + # If the current character is not a token, add it to the result. + if c > 127 or self._sub_chrs[c] == 0: + if matched_byte > 0: + result += self.replace_token(m, matched_byte, matched_count) + matched_byte = 0 + result += fmt[i] + continue + + # If the current character is the same as the previous one, increment the count. + if c == matched_byte: + matched_count += 1 + continue + + # If the current character is different from the previous one, replace the previous tokens + # and move onto the next token to track. + result += self.replace_token(m, matched_byte, matched_count) + matched_byte = c + matched_count = 1 + + # If no tokens were found, append an empty string and return the original. + if matched_byte > 0: + result += self.replace_token(m, matched_byte, matched_count) + return result + + fn replace_token(self, m: SmallTime, token: Int, token_count: Int) -> String: + if token == _Y: + if token_count == 1: + return "Y" + if token_count == 2: + return String(m.year).rjust(4, "0")[2:4] + if token_count == 4: + return String(m.year).rjust(4, "0") + elif token == _M: + if token_count == 1: + return String(m.month) + if token_count == 2: + return String(m.month).rjust(2, "0") + if token_count == 3: + return MONTH_ABBREVIATIONS[m.month] + if token_count == 4: + return MONTH_NAMES[m.month] + elif token == _D: + if token_count == 1: + return String(m.day) + if token_count == 2: + return String(m.day).rjust(2, "0") + elif token == _H: + if token_count == 1: + return String(m.hour) + if token_count == 2: + return String(m.hour).rjust(2, "0") + elif token == _h: + var h_12 = m.hour + if m.hour > 12: + h_12 -= 12 + if token_count == 1: + return String(h_12) + if token_count == 2: + return String(h_12).rjust(2, "0") + elif token == _m: + if token_count == 1: + return String(m.minute) + if token_count == 2: + return String(m.minute).rjust(2, "0") + elif token == _s: + if token_count == 1: + return String(m.second) + if token_count == 2: + return String(m.second).rjust(2, "0") + elif token == _S: + if token_count == 1: + return String(m.microsecond // 100000) + if token_count == 2: + return String(m.microsecond // 10000).rjust(2, "0") + if token_count == 3: + return String(m.microsecond // 1000).rjust(3, "0") + if token_count == 4: + return String(m.microsecond // 100).rjust(4, "0") + if token_count == 5: + return String(m.microsecond // 10).rjust(5, "0") + if token_count == 6: + return String(m.microsecond).rjust(6, "0") + elif token == _d: + if token_count == 1: + return String(m.iso_weekday()) + if token_count == 3: + return DAY_ABBREVIATIONS[m.iso_weekday()] + if token_count == 4: + return DAY_NAMES[m.iso_weekday()] + elif token == _Z: + if token_count == 3: + return String(UTC_TZ) if not m.tz else String(m.tz) + var separator = "" if token_count == 1 else ":" + if not m.tz: + return UTC_TZ.format(separator) + else: + return m.tz.format(separator) + + elif token == _a: + return "am" if m.hour < 12 else "pm" + elif token == _A: + return "AM" if m.hour < 12 else "PM" + return "" + + +alias _Y = ord("Y") +alias _M = ord("M") +alias _D = ord("D") +alias _d = ord("d") +alias _H = ord("H") +alias _h = ord("h") +alias _m = ord("m") +alias _s = ord("s") +alias _S = ord("S") +alias _X = ord("X") +alias _x = ord("x") +alias _Z = ord("Z") +alias _A = ord("A") +alias _a = ord("a") diff --git a/external/small_time/small_time.mojo b/external/small_time/small_time.mojo new file mode 100644 index 0000000..3907a2d --- /dev/null +++ b/external/small_time/small_time.mojo @@ -0,0 +1,608 @@ +# small_time library, courtesy @thatstoasty , 2025 +# https://github.com/thatstoasty/small-time/ +from collections import InlineArray, Optional +import external.small_time.c +import external.small_time.time_zone +from external.small_time.time_delta import TimeDelta +from external.small_time.formatter import formatter + + +alias _DI400Y = 146097 +"""Number of days in 400 years.""" +alias _DI100Y = 36524 +"""Number of days in 100 years.""" +alias _DI4Y = 1461 +"""Number of days in 4 years.""" +alias _DAYS_IN_MONTH = InlineArray[Int, 13](-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) +"""Number of days in each month, not counting leap years.""" +alias _DAYS_BEFORE_MONTH = InlineArray[Int, 13]( + -1, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 +) # -1 is a placeholder for indexing purposes. +"""Number of days before each month in a common year.""" + + +fn _is_leap(year: Int) -> Bool: + """If the year is a leap year. + + Args: + year: The year to check. + + Returns: + True if the year is a leap year, False otherwise. + + Notes: + A year is a leap year if it is divisible by 4, but not by 100, unless it is divisible by 400. + """ + return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0) + + +fn _days_before_year(year: Int) -> Int: + """Number of days before January 1st of year. + + Args: + year: The year to check. + + Returns: + Number of days before January 1st of year. + + Notes: + year -> number of days before January 1st of year. + """ + var y = year - 1 + return y * 365 + y // 4 - y // 100 + y // 400 + + +fn _days_in_month(year: Int, month: Int) -> Int: + """Number of days in a month in a year. + + Args: + year: The year to check. + month: The month to check. + + Returns: + Number of days in that month in that year. + + Notes: + year, month -> number of days in that month in that year. + """ + if month == 2 and _is_leap(year): + return 29 + return _DAYS_IN_MONTH[month] + + +fn _days_before_month(year: Int, month: Int) -> Int: + """Number of days in year preceding first day of month. + + Args: + year: The year to check. + month: The month to check. + + Returns: + Number of days in year preceding first day of month. + + Notes: + year, month -> number of days in year preceding first day of month. + """ + if month > 2 and _is_leap(year): + return _DAYS_BEFORE_MONTH[month] + 1 + return _DAYS_BEFORE_MONTH[month] + + +fn _ymd2ord(year: Int, month: Int, day: Int) -> Int: + """Convert year, month, day to ordinal, considering 01-Jan-0001 as day 1. + + Args: + year: The year to check. + month: The month to check. + day: The day to check. + + Returns: + Ordinal, considering 01-Jan-0001 as day 1. + """ + return _days_before_year(year) + _days_before_month(year, month) + day + + +alias MAX_TIMESTAMP: Int = 32503737600 +"""Maximum timestamp.""" +alias MAX_TIMESTAMP_MS = MAX_TIMESTAMP * 1000 +"""Maximum timestamp in milliseconds.""" +alias MAX_TIMESTAMP_US = MAX_TIMESTAMP * 1_000_000 +"""Maximum timestamp in microseconds.""" + + +fn normalize_timestamp(owned timestamp: Float64) raises -> Float64: + """Normalize millisecond and microsecond timestamps into normal timestamps. + + Args: + timestamp: The timestamp to normalize. + + Returns: + The normalized timestamp. + + Raises: + Error: If the timestamp is too large. + """ + if timestamp > MAX_TIMESTAMP: + if timestamp < MAX_TIMESTAMP_MS: + timestamp /= 1000 + elif timestamp < MAX_TIMESTAMP_US: + timestamp /= 1_000_000 + else: + raise Error("The specified timestamp " + String(timestamp) + "is too large.") + return timestamp + + +fn now(*, utc: Bool = False) raises -> SmallTime: + """Return the current time in UTC or local time. + + Args: + utc: If True, return the current time in UTC. Otherwise, return the current time in local time. + + Returns: + The current time. + """ + return from_timestamp(c.gettimeofday(), utc) + + +fn _validate_timestamp(tm: c.Tm, time_val: c.TimeVal, time_zone: TimeZone) raises -> SmallTime: + """Validate the timestamp. + + Args: + tm: The time struct. + time_val: The time value. + time_zone: The time zone. + + Returns: + The validated timestamp. + + Raises: + Error: If the timestamp is invalid. + """ + var year = Int(tm.tm_year) + 1900 + if not -1 < year < 10000: + raise Error("The year parsed out from the timestamp is too large or negative. Received: ", year) + + var month = Int(tm.tm_mon) + 1 + if not -1 < month < 13: + raise Error("The month parsed out from the timestamp is too large or negative. Received: ", month) + + var day = Int(tm.tm_mday) + if not -1 < day < 32: + raise Error( + "The day of the month parsed out from the timestamp is too large or negative. Received: ", day + ) + + var hours = Int(tm.tm_hour) + if not -1 < hours < 25: + raise Error("The hour parsed out from the timestamp is too large or negative. Received: ", hours) + + var minutes = Int(tm.tm_min) + if not -1 < minutes < 61: + raise Error("The minutes parsed out from the timestamp is too large or negative. Received: ", minutes) + + var seconds = Int(tm.tm_sec) + if not -1 < seconds < 61: + raise Error( + "The day of the month parsed out from the timestamp is too large or negative. Received: ", seconds + ) + + var microseconds = time_val.tv_usec + if microseconds < 0: + raise Error("Received negative microseconds. Received: ", microseconds) + + return SmallTime( + year, + month, + day, + hours, + minutes, + seconds, + microseconds, + time_zone, + ) + + +fn from_timestamp(t: c.TimeVal, utc: Bool) raises -> SmallTime: + """Create a SmallTime instance from a timestamp. + + Args: + t: The timestamp. + utc: If True, the timestamp is in UTC. Otherwise, the timestamp is in local time. + + Returns: + The SmallTime instance. + + Raises: + Error: If the timestamp is invalid. + """ + if utc: + return _validate_timestamp(c.gmtime(t.tv_sec), t, TimeZone(0, "UTC")) + + var tm = c.localtime(t.tv_sec) + var tz = TimeZone(Int(tm.tm_gmtoff), "local") + return _validate_timestamp(tm, t, tz) + + +fn from_timestamp(timestamp: Float64, *, utc: Bool = False) raises -> SmallTime: + """Create a SmallTime instance from a timestamp. + + Args: + timestamp: The timestamp. + utc: If True, the timestamp is in UTC. Otherwise, the timestamp is in local time. + + Returns: + The SmallTime instance. + + Raises: + Error: If the timestamp is invalid. + """ + var timestamp_ = normalize_timestamp(timestamp) + return from_timestamp(c.TimeVal(Int(timestamp_)), utc) + + +fn strptime(date_str: String, fmt: String, tzinfo: TimeZone = TimeZone()) raises -> SmallTime: + """Create a SmallTime instance from a date string and format, + in the style of `datetime.strptime`. Optionally replaces the parsed time_zone. + + Args: + date_str: The date string. + fmt: The format string. + tzinfo: The time zone. + + Returns: + The SmallTime instance. + + Raises: + Error: If the timestamp is invalid. + + Examples: + ```mojo + from small_time.small_time import strptime + print(strptime('20-01-2019 15:49:10', '%d-%m-%Y %H:%M:%S')) + ``` + . + """ + var tm = c.strptime(date_str, fmt) + var tz = TimeZone(Int(tm.tm_gmtoff)) if not tzinfo else tzinfo + return _validate_timestamp(tm, c.TimeVal(), tz) + + +fn strptime(date_str: String, fmt: String, tz_str: String) raises -> SmallTime: + """Create a SmallTime instance from a date string and format, + in the style of `datetime.strptime`. Optionally replaces the parsed time_zone. + + Args: + date_str: The date string. + fmt: The format string. + tz_str: The time zone. + + Returns: + The SmallTime instance. + + Raises: + Error: If the timestamp is invalid. + + Examples: + ```mojo + from small_time.small_time import strptime + print(strptime('20-01-2019 15:49:10', '%d-%m-%Y %H:%M:%S')) + ``` + . + """ + return strptime(date_str, fmt, time_zone.from_utc(tz_str)) + + +fn from_ordinal(ordinal: Int) -> SmallTime: + """Construct a SmallTime from a proleptic Gregorian ordinal. + + Args: + ordinal: The proleptic Gregorian ordinal. + + Returns: + The SmallTime instance. + + Notes: + January 1 of year 1 is day 1. Only the year, month and day are + non-zero in the result. + """ + var n = ordinal + # n is a 1-based index, starting at 1-Jan-1. The pattern of leap years + # repeats exactly every 400 years. The basic strategy is to find the + # closest 400-year boundary at or before n, then work with the offset + # from that boundary to n. Life is much clearer if we subtract 1 from + # n first -- then the values of n at 400-year boundaries are exactly + # those divisible by _DI400Y: + # + # D M Y n n-1 + # -- --- ---- ---------- ---------------- + # 31 Dec -400 -_DI400Y -_DI400Y -1 + # 1 Jan -399 -_DI400Y +1 -_DI400Y 400-year boundary + # ... + # 30 Dec 000 -1 -2 + # 31 Dec 000 0 -1 + # 1 Jan 001 1 0 400-year boundary + # 2 Jan 001 2 1 + # 3 Jan 001 3 2 + # ... + # 31 Dec 400 _DI400Y _DI400Y -1 + # 1 Jan 401 _DI400Y +1 _DI400Y 400-year boundary + n -= 1 + var n400 = n // _DI400Y + n = n % _DI400Y + var year = n400 * 400 + 1 # ..., -399, 1, 401, ... + + # Now n is the (non-negative) offset, in days, from January 1 of year, to + # the desired date. Now compute how many 100-year cycles precede n. + # Note that it's possible for n100 to equal 4! In that case 4 full + # 100-year cycles precede the desired day, which implies the desired + # day is December 31 at the end of a 400-year cycle. + var n100 = n // _DI100Y + n = n % _DI100Y + + # Now compute how many 4-year cycles precede it. + var n4 = n // _DI4Y + n = n % _DI4Y + + # And now how many single years. Again n1 can be 4, and again meaning + # that the desired day is December 31 at the end of the 4-year cycle. + var n1 = n // 365 + n = n % 365 + + year += n100 * 100 + n4 * 4 + n1 + if n1 == 4 or n100 == 4: + return SmallTime(year - 1, 12, 31) + + # Now the year is correct, and n is the offset from January 1. We find + # the month via an estimate that's either exact or one too large. + var leap_year = n1 == 3 and (n4 != 24 or n100 == 3) + var month = (n + 50) >> 5 + var preceding: Int + if month > 2 and leap_year: + preceding = _DAYS_BEFORE_MONTH[month] + 1 + else: + preceding = _DAYS_BEFORE_MONTH[month] + if preceding > n: # estimate is too large + month -= 1 + if month == 2 and leap_year: + preceding -= _DAYS_BEFORE_MONTH[month] + 1 + else: + preceding -= _DAYS_BEFORE_MONTH[month] + n -= preceding + + # Now the year and month are correct, and n is the offset from the + # start of that month: we're done! + return SmallTime(year, month, n + 1) + + +@value +struct SmallTime(Stringable, Writable, Representable): + """Datetime representation.""" + var year: Int + """Year.""" + var month: Int + """Month.""" + var day: Int + """Day.""" + var hour: Int + """Hour.""" + var minute: Int + """Minute.""" + var second: Int + """Second.""" + var microsecond: Int + """Microsecond.""" + var tz: TimeZone + """Time zone.""" + + fn __init__( + out self, + year: Int, + month: Int, + day: Int, + hour: Int = 0, + minute: Int = 0, + second: Int = 0, + microsecond: Int = 0, + tz: TimeZone = TimeZone(), + ): + """Initializes a new SmallTime instance. + + Args: + year: Year. + month: Month. + day: Day. + hour: Hour. + minute: Minute. + second: Second. + microsecond: Microsecond. + tz: Time zone. + """ + self.year = year + self.month = month + self.day = day + self.hour = hour + self.minute = minute + self.second = second + self.microsecond = microsecond + self.tz = tz + + fn format(self, fmt: String = "YYYY-MM-DD HH:mm:ss ZZ") -> String: + """Returns a string representation of the `SmallTime` + formatted according to the provided format string. + + Args: + fmt: The format string. + + Returns: + The formatted string. + + Examples: + ```mojo + import small_time + var m = small_time.now() + print(m.format('YYYY-MM-DD HH:mm:ss ZZ')) #'2013-05-09 03:56:47 -00:00' + print(m.format('MMMM DD, YYYY')) #'May 09, 2013' + print(m.format()) #'2013-05-09 03:56:47 -00:00' + ``` + . + """ + return formatter.format(self, fmt) + + fn isoformat[timespec: String = "auto"](self, sep: String = "T") -> String: + """Return the time formatted according to ISO. + + Parameters: + timespec: The number of additional terms of the time to include. + + Args: + sep: The separator between date and time. + + Returns: + The formatted string. + + Notes: + The full format looks like 'YYYY-MM-DD HH:MM:SS.mmmmmm'. + + If self.tzinfo is not None, the UTC offset is also attached, giving + giving a full format of 'YYYY-MM-DD HH:MM:SS.mmmmmm+HH:MM'. + + Optional argument sep specifies the separator between date and + time, default 'T'. + + The optional argument timespec specifies the number of additional + terms of the time to include. Valid options are 'auto', 'hours', + 'minutes', 'seconds', 'milliseconds' and 'microseconds'. + """ + alias valid = InlineArray[String, 6]("auto", "hours", "minutes", "seconds", "milliseconds", "microseconds") + """Valid timespec values.""" + constrained[ + timespec in valid, + msg="timespec must be one of the following: 'auto', 'hours', 'minutes', 'seconds', 'milliseconds', 'microseconds'", + ]() + var date_str = String( + String(self.year).rjust(4, "0"), "-", String(self.month).rjust(2, "0"), "-" + String(self.day).rjust(2, "0") + ) + var time_str = String("") + + @parameter + if timespec == "auto" or timespec == "microseconds": + time_str = String( + String(self.hour).rjust(2, "0"), + ":", + String(self.minute).rjust(2, "0"), + ":", + String(self.second).rjust(2, "0"), + ".", + String(self.microsecond).rjust(6, "0") + ) + elif timespec == "milliseconds": + time_str = String( + String(self.hour).rjust(2, "0"), + ":", + String(self.minute).rjust(2, "0"), + ":", + String(self.second).rjust(2, "0"), + ".", + String(self.microsecond // 1000).rjust(3, "0") + ) + elif timespec == "seconds": + time_str = String( + String(self.hour).rjust(2, "0"), + ":", + String(self.minute).rjust(2, "0"), + ":", + String(self.second).rjust(2, "0") + ) + elif timespec == "minutes": + time_str = String(String(self.hour).rjust(2, "0"), ":", String(self.minute).rjust(2, "0")) + elif timespec == "hours": + time_str = String(self.hour).rjust(2, "0") + + if not self.tz: + return sep.join(date_str, time_str) + else: + return sep.join(date_str, time_str) + self.tz.format() + + fn to_ordinal(self) -> Int: + """Return proleptic Gregorian ordinal for the year, month and day. + + Returns: + Proleptic Gregorian ordinal for the year, month and day. + + Notes: + January 1 of year 1 is day 1. Only the year, month and day values + contribute to the result. + """ + return _ymd2ord(self.year, self.month, self.day) + + fn iso_weekday(self) -> Int: + """Returns day of the week. + + Returns: + Day of the week, where Monday == 1 ... Sunday == 7. + """ + return self.to_ordinal() % 7 or 7 + + fn __str__(self) -> String: + """Return the string representation of the `SmallTime` instance. + + Returns: + The string representation. + """ + return self.isoformat() + + fn __repr__(self) -> String: + """Return the string representation of the `SmallTime` instance. + + Returns: + The string representation. + """ + return String.write(self) + + fn __sub__(self, other: Self) -> TimeDelta: + """Subtract two `SmallTime` instances. + + Args: + other: The other `SmallTime` instance. + + Returns: + The time difference. + """ + var days1 = self.to_ordinal() + var days2 = other.to_ordinal() + var secs1 = self.second + self.minute * 60 + self.hour * 3600 + var secs2 = other.second + other.minute * 60 + other.hour * 3600 + var base = TimeDelta(days1 - days2, secs1 - secs2, self.microsecond - other.microsecond) + return base + + fn write_to[W: Writer, //](self, mut writer: W): + """Writes a representation of the `SmallTime` instance to a writer. + + Parameters: + W: The type of writer to write the contents to. + + Args: + writer: The writer to write the contents to. + """ + @parameter + fn write_optional(opt: Optional[String]): + if opt: + writer.write(repr(opt.value())) + else: + writer.write(repr(None)) + + writer.write("SmallTime(", + "year=", self.year, + ", month=", self.month, + ", day=", self.day, + ", hour=", self.hour, + ", minute=", self.minute, + ", second=", self.second, + ", microsecond=", self.microsecond, + ) + writer.write(", tz=", "TimeZone(", + "offset=", self.tz.offset, + ", name=") + write_optional(self.tz.name) + writer.write(")") + writer.write(")") diff --git a/external/small_time/time_delta.mojo b/external/small_time/time_delta.mojo new file mode 100644 index 0000000..b2e6567 --- /dev/null +++ b/external/small_time/time_delta.mojo @@ -0,0 +1,309 @@ +# small_time library, courtesy @thatstoasty , 2025 +# https://github.com/thatstoasty/small-time/ +alias SECONDS_OF_DAY = 24 * 3600 + + +@register_passable("trivial") +struct TimeDelta(Stringable): + """Time delta.""" + var days: Int + """Days.""" + var seconds: Int + """Seconds.""" + var microseconds: Int + """Microseconds.""" + + fn __init__( + out self, + days: Int = 0, + seconds: Int = 0, + microseconds: Int = 0, + milliseconds: Int = 0, + minutes: Int = 0, + hours: Int = 0, + weeks: Int = 0, + ): + """Initializes a new time delta. + + Args: + days: Days. + seconds: Seconds. + microseconds: Microseconds. + milliseconds: Milliseconds. + minutes: Minutes. + hours: Hours. + weeks: Weeks. + """ + self.days = 0 + self.seconds = 0 + self.microseconds = 0 + + var days_ = days + var seconds_ = seconds + var microseconds_ = microseconds + + # Normalize everything to days, seconds, microseconds. + days_ += weeks * 7 + seconds_ += minutes * 60 + hours * 3600 + microseconds_ += milliseconds * 1000 + + self.days = days_ + days_ = seconds_ // SECONDS_OF_DAY + seconds_ = seconds_ % SECONDS_OF_DAY + self.days += days_ + self.seconds += seconds_ + + seconds_ = microseconds_ // 1000000 + microseconds_ = microseconds_ % 1000000 + days_ = seconds_ // SECONDS_OF_DAY + seconds_ = seconds_ % SECONDS_OF_DAY + self.days += days_ + self.seconds += seconds_ + + seconds_ = microseconds_ // 1000000 + self.microseconds = microseconds_ % 1000000 + self.seconds += seconds_ + days_ = self.seconds // SECONDS_OF_DAY + self.seconds = self.seconds % SECONDS_OF_DAY + self.days += days_ + + fn __str__(self) -> String: + """String representation of the duration. + + Returns: + String representation of the duration. + """ + var mm = self.seconds // 60 + var ss = String(self.seconds % 60) + var hh = String(mm // 60) + mm = mm % 60 + var s = String(hh, ":", String(mm).rjust(2, "0"), ":", ss.rjust(2, "0")) + if self.days: + if abs(self.days) != 1: + s = String(self.days, " days, ", s) + else: + s = String(self.days, " day, ", s) + if self.microseconds: + s.write(String(self.microseconds).rjust(6, "0")) + return s^ + + fn total_seconds(self) -> Float64: + """Total seconds in the duration. + + Returns: + Total seconds in the duration. + """ + return ((self.days * 86400 + self.seconds) * 10**6 + self.microseconds) / 10**6 + + fn __add__(self, other: Self) -> Self: + """Adds two time deltas. + + Args: + other: Time delta to add. + + Returns: + Sum of the two time deltas. + """ + return Self( + self.days + other.days, + self.seconds + other.seconds, + self.microseconds + other.microseconds, + ) + + fn __radd__(self, other: Self) -> Self: + """Adds two time deltas. + + Args: + other: Time delta to add. + + Returns: + Sum of the two time deltas. + """ + return self.__add__(other) + + fn __sub__(self, other: Self) -> Self: + """Subtracts two time deltas. + + Args: + other: Time delta to subtract. + + Returns: + Difference of the two time deltas. + """ + return Self( + self.days - other.days, + self.seconds - other.seconds, + self.microseconds - other.microseconds, + ) + + fn __rsub__(self, other: Self) -> Self: + """Subtracts two time deltas. + + Args: + other: Time delta to subtract. + + Returns: + Difference of the two time deltas. + """ + return Self( + other.days - self.days, + other.seconds - self.seconds, + other.microseconds - self.microseconds, + ) + + fn __neg__(self) -> Self: + """Negates the time delta. + + Returns: + Negated time delta. + """ + return Self(-self.days, -self.seconds, -self.microseconds) + + fn __pos__(self) -> Self: + """Returns the time delta. + + Returns: + Time delta. + """ + return self + + def __abs__(self) -> Self: + """Returns the absolute value of the time delta. + + Returns: + Absolute value of the time delta. + """ + if self.days < 0: + return -self + else: + return self + + fn __mul__(self, other: Int) -> Self: + """Multiplies the time delta by a scalar. + + Args: + other: Scalar to multiply by. + + Returns: + Scaled time delta. + """ + return Self( + self.days * other, + self.seconds * other, + self.microseconds * other, + ) + + fn __rmul__(self, other: Int) -> Self: + """Multiplies the time delta by a scalar. + + Args: + other: Scalar to multiply by. + + Returns: + Scaled time delta. + """ + return self.__mul__(other) + + fn _to_microseconds(self) -> Int: + """Converts the time delta to microseconds. + + Returns: + Time delta in microseconds. + """ + return (self.days * SECONDS_OF_DAY + self.seconds) * 1000000 + self.microseconds + + fn __mod__(self, other: Self) -> Self: + """Returns the remainder of the division of two time deltas. + + Args: + other: Time delta to divide by. + + Returns: + Remainder of the division of two time deltas. + """ + return Self(0, 0, self._to_microseconds() % other._to_microseconds()) + + fn __eq__(self, other: Self) -> Bool: + """Checks if two time deltas are equal. + + Args: + other: Time delta to compare with. + + Returns: + True if the time deltas are equal, False otherwise. + """ + return self.days == other.days and self.seconds == other.seconds and self.microseconds == other.microseconds + + fn __le__(self, other: Self) -> Bool: + """Checks if the time delta is less than or equal to the other time delta. + + Args: + other: Time delta to compare with. + + Returns: + True if the time delta is less than or equal to the other time delta, False otherwise. + """ + if self.days < other.days: + return True + elif self.days == other.days: + if self.seconds < other.seconds: + return True + elif self.seconds == other.seconds and self.microseconds <= other.microseconds: + return True + return False + + fn __lt__(self, other: Self) -> Bool: + """Checks if the time delta is less than the other time delta. + + Args: + other: Time delta to compare with. + + Returns: + True if the time delta is less than the other time delta, False otherwise. + """ + if self.days < other.days: + return True + elif self.days == other.days: + if self.seconds < other.seconds: + return True + elif self.seconds == other.seconds and self.microseconds < other.microseconds: + return True + return False + + fn __ge__(self, other: Self) -> Bool: + """Checks if the time delta is greater than or equal to the other time delta. + + Args: + other: Time delta to compare with. + + Returns: + True if the time delta is greater than or equal to the other time delta, False otherwise. + """ + return not self.__lt__(other) + + fn __gt__(self, other: Self) -> Bool: + """Checks if the time delta is greater than the other time delta. + + Args: + other: Time delta to compare with. + + Returns: + True if the time delta is greater than the other time delta, False otherwise. + """ + return not self.__le__(other) + + fn __bool__(self) -> Bool: + """Checks if the time delta is non-zero. + + Returns: + True if the time delta is non-zero, False otherwise. + """ + return self.days != 0 or self.seconds != 0 or self.microseconds != 0 + + +alias MIN = TimeDelta(-99999999) +"""Minimum time delta.""" +alias MAX = TimeDelta(days=99999999) +"""Maximum time delta.""" +alias RESOLUTION = TimeDelta(microseconds=1) +"""Resolution of the time delta.""" diff --git a/external/small_time/time_zone.mojo b/external/small_time/time_zone.mojo new file mode 100644 index 0000000..b209be4 --- /dev/null +++ b/external/small_time/time_zone.mojo @@ -0,0 +1,138 @@ +# small_time library, courtesy @thatstoasty , 2025 +# https://github.com/thatstoasty/small-time/ +from collections import Optional +import small_time.c + +alias UTC = "UTC" +alias UTC_TZ = TimeZone(0, UTC) +"""UTC Timezone.""" + +alias DASH = "-" +alias PLUS = "+" +alias COLON = ":" + +fn local() -> TimeZone: + """Returns the local timezone. + + Returns: + Local timezone. + """ + var local_t = c.localtime(0) + return TimeZone(Int(local_t.tm_gmtoff), "local") + + +fn _is_numeric(c: Byte) -> Bool: + """Checks if a character is numeric. + + Args: + c: Character. + + Returns: + True if the character is numeric, False otherwise. + """ + return c >= ord("0") and c <= ord("9") + + +fn from_utc(utc_str: String) raises -> TimeZone: + """Creates a timezone from a string. + + Args: + utc_str: UTC string. + + Returns: + Timezone. + + Raises: + Error: If the UTC string is invalid. + """ + var timezone = utc_str.as_string_slice() + if len(timezone) == 0: + raise Error("utc_str is empty") + + if timezone == "utc" or timezone == "UTC" or timezone == "Z": + return TimeZone(0, String("utc")) + + var i = 0 + # Skip the UTC prefix. + if len(timezone) > 3 and timezone[0:3] == UTC: + i = 3 + + var sign = -1 if timezone[i] == DASH else 1 + if timezone[i] == PLUS or timezone[i] == DASH: + i += 1 + + if len(timezone) < i + 2 or not _is_numeric(ord(timezone[i])) or not _is_numeric(ord(timezone[i + 1])): + raise Error("utc_str format is invalid") + var hours = atol(timezone[i : i + 2]) + i += 2 + + var minutes: Int + if len(timezone) <= i: + minutes = 0 + elif len(timezone) == i + 3 and timezone[i] == COLON: + minutes = atol(timezone[i + 1 : i + 3]) + elif len(timezone) == i + 2 and _is_numeric(ord(timezone[i])): + minutes = atol(timezone[i : i + 2]) + else: + raise Error("utc_str format is invalid") + + var offset = sign * (hours * 3600 + minutes * 60) + return TimeZone(offset) + + +@value +struct TimeZone(Stringable): + """Timezone.""" + var offset: Int + """Offset in seconds.""" + var name: Optional[String] + """Name of the timezone.""" + + fn __init__(out self, offset: Int = 0, name: String = "utc"): + """Initializes a new timezone. + + Args: + offset: Offset in seconds. + name: Name of the timezone. + """ + self.offset = offset + self.name = name + + fn __str__(self) -> String: + """String representation of the timezone. + + Returns: + String representation. + """ + if self.name: + return self.name.value() + return "" + + fn __bool__(self) -> Bool: + """Checks if the timezone is valid. + + Returns: + True if the timezone is valid, False otherwise. + """ + return self.name.__bool__() + + fn format(self, sep: String = ":") -> String: + """Formats the timezone. + + Args: + sep: Separator between hours and minutes. + + Returns: + Formatted timezone. + """ + var sign: String + var offset_abs: Int + if self.offset < 0: + sign = "-" + offset_abs = -self.offset + else: + sign = "+" + offset_abs = self.offset + var hh = String(offset_abs // 3600) + var mm = String(offset_abs % 3600) + return String(sign, hh.rjust(2, "0"), sep, mm.rjust(2, "0")) diff --git a/lightbug_http/cookie/expiration.mojo b/lightbug_http/cookie/expiration.mojo index 7a0e0e3..6c1db3f 100644 --- a/lightbug_http/cookie/expiration.mojo +++ b/lightbug_http/cookie/expiration.mojo @@ -1,4 +1,4 @@ -from small_time import SmallTime +from external.small_time import SmallTime alias HTTP_DATE_FORMAT = "ddd, DD MMM YYYY HH:mm:ss ZZZ" alias TZ_GMT = TimeZone(0, "GMT") diff --git a/lightbug_http/cookie/request_cookie_jar.mojo b/lightbug_http/cookie/request_cookie_jar.mojo index a4d89ee..b3cb362 100644 --- a/lightbug_http/cookie/request_cookie_jar.mojo +++ b/lightbug_http/cookie/request_cookie_jar.mojo @@ -1,6 +1,6 @@ from collections import Optional, List, Dict -from small_time import SmallTime, TimeZone -from small_time.small_time import strptime +from external.small_time import SmallTime, TimeZone +from external.small_time.small_time import strptime from lightbug_http.strings import to_string, lineBreak from lightbug_http.header import HeaderKey, write_header from lightbug_http.io.bytes import ByteReader, ByteWriter, is_newline, is_space diff --git a/lightbug_http/http/response.mojo b/lightbug_http/http/response.mojo index f16cd97..17459f0 100644 --- a/lightbug_http/http/response.mojo +++ b/lightbug_http/http/response.mojo @@ -1,6 +1,6 @@ from utils import StringSlice from collections import Optional -from small_time.small_time import now +from external.small_time.small_time import now from lightbug_http.uri import URI from lightbug_http.io.bytes import Bytes, bytes, byte, ByteReader, ByteWriter from lightbug_http.connection import TCPConnection, default_buffer_size diff --git a/magic.lock b/magic.lock index 6c1d3bf..0214d9e 100644 --- a/magic.lock +++ b/magic.lock @@ -10,7 +10,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.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/importlib-metadata-8.6.1-pyha770c72_0.conda @@ -34,7 +34,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_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.29-pthreads_h94d23a6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-he636bdd_11.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.49.1-hee588c1_2.conda @@ -52,31 +52,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.10-h9e4cc4f_0_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/linux-64/python_abi-3.12-6_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.4.0-py312hbf22597_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_11.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb957f94_11.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-he636bdd_11.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - - conda: https://repo.prefix.dev/modular-community/linux-64/small_time-25.2.0-h6f44653_0.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/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/typing_extensions-4.13.1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.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/importlib-metadata-8.6.1-pyha770c72_0.conda @@ -100,7 +99,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_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.29-pthreads_h9d3fd7e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.29.3-h4edc36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.29.3-h4edc36e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h80ac1c1_11.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.49.1-h5eb1b54_2.conda @@ -118,30 +117,29 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.0-hd08dc88_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.10-h1683364_0_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/linux-aarch64/python_abi-3.12-6_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.4.0-py312h2427ae1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_11.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312he2566dd_11.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h80ac1c1_11.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - - conda: https://repo.prefix.dev/modular-community/linux-aarch64/small_time-25.2.0-h8dc4c6c_0.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/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/typing_extensions-4.13.1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda osx-arm64: - 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/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.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/importlib-metadata-8.6.1-pyha770c72_0.conda @@ -151,21 +149,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20250127.1-cxx17_h07bc746_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.2-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.3-ha82da77_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.0-h286801f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-14_2_0_h6c33f7e_103.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-14.2.0-h6c33f7e_103.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-14.2.0-heb5dd2a_105.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-14.2.0-h2c44a93_105.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.29.3-hccd9074_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.29.3-hccd9074_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-h98efcbe_11.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.49.1-h3f77e49_2.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-20.1.2-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.3-hdb05f8b_0.conda - conda: https://conda.modular.com/max/noarch/max-25.2.0-release.conda - conda: https://conda.modular.com/max/osx-arm64/max-core-25.2.0-release.conda - conda: https://conda.modular.com/max/osx-arm64/max-python-25.2.0-release.conda @@ -175,24 +173,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.0-h81ee809_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.10-hc22306f_0_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/osx-arm64/python_abi-3.12-6_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.4.0-py312hf4875e0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_11.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h5ad5c83_11.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-h98efcbe_11.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - - conda: https://repo.prefix.dev/modular-community/osx-arm64/small_time-25.2.0-h58ea7c0_0.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/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/typing_extensions-4.13.1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda @@ -206,7 +203,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.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/importlib-metadata-8.6.1-pyha770c72_0.conda @@ -230,7 +227,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_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.29-pthreads_h94d23a6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-he636bdd_11.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.49.1-hee588c1_2.conda @@ -248,31 +245,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.10-h9e4cc4f_0_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/linux-64/python_abi-3.12-6_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.4.0-py312hbf22597_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_11.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb957f94_11.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-he636bdd_11.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - - conda: https://repo.prefix.dev/modular-community/linux-64/small_time-25.2.0-h6f44653_0.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/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/typing_extensions-4.13.1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.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/importlib-metadata-8.6.1-pyha770c72_0.conda @@ -296,7 +292,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_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.29-pthreads_h9d3fd7e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.29.3-h4edc36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.29.3-h4edc36e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h80ac1c1_11.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.49.1-h5eb1b54_2.conda @@ -314,30 +310,29 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.0-hd08dc88_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.10-h1683364_0_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/linux-aarch64/python_abi-3.12-6_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.4.0-py312h2427ae1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_11.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312he2566dd_11.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h80ac1c1_11.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - - conda: https://repo.prefix.dev/modular-community/linux-aarch64/small_time-25.2.0-h8dc4c6c_0.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/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/typing_extensions-4.13.1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda osx-arm64: - 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/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.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/importlib-metadata-8.6.1-pyha770c72_0.conda @@ -347,21 +342,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20250127.1-cxx17_h07bc746_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.2-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.3-ha82da77_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.0-h286801f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-14_2_0_h6c33f7e_103.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-14.2.0-h6c33f7e_103.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-14.2.0-heb5dd2a_105.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-14.2.0-h2c44a93_105.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.29.3-hccd9074_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.29.3-hccd9074_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-h98efcbe_11.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.49.1-h3f77e49_2.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-20.1.2-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.3-hdb05f8b_0.conda - conda: https://conda.modular.com/max/noarch/max-25.2.0-release.conda - conda: https://conda.modular.com/max/osx-arm64/max-core-25.2.0-release.conda - conda: https://conda.modular.com/max/osx-arm64/max-python-25.2.0-release.conda @@ -371,24 +366,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.0-h81ee809_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.10-hc22306f_0_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/osx-arm64/python_abi-3.12-6_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.4.0-py312hf4875e0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_11.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h5ad5c83_11.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-h98efcbe_11.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - - conda: https://repo.prefix.dev/modular-community/osx-arm64/small_time-25.2.0-h58ea7c0_0.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/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/typing_extensions-4.13.1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda @@ -405,7 +399,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.9.0-pyh29332c3_0.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/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-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 @@ -447,7 +441,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_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.29-pthreads_h94d23a6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-he636bdd_11.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.49.1-hee588c1_2.conda @@ -469,7 +463,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda @@ -477,11 +471,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.33.1-py312h3b7be25_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.10-h9e4cc4f_0_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.1.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-6_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.4.0-py312hbf22597_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda @@ -493,9 +487,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-he636bdd_11.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://repo.prefix.dev/modular-community/linux-64/small_time-25.2.0-h6f44653_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.46.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.46.2-pyh81abbef_0.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/tornado-6.4.2-py312h66e93f0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda @@ -503,15 +496,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.2-pyhff008b6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.2-h801b22e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.1-hf5ce1d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.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/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.2-pyh31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.2-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/watchfiles-1.0.5-py312h12e396e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-15.0.1-py312h66e93f0_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/zeromq-4.3.5-h3b0a872_7.conda @@ -523,7 +516,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.9.0-pyh29332c3_0.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/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-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 @@ -565,7 +558,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_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.29-pthreads_h9d3fd7e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.29.3-h4edc36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.29.3-h4edc36e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h80ac1c1_11.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.49.1-h5eb1b54_2.conda @@ -587,7 +580,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.0-hd08dc88_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda @@ -595,11 +588,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.33.1-py312h8cbf658_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.10-h1683364_0_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.1.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-6_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.2-py312hcc812fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.4.0-py312h2427ae1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda @@ -611,9 +604,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h80ac1c1_11.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://repo.prefix.dev/modular-community/linux-aarch64/small_time-25.2.0-h8dc4c6c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.46.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.46.2-pyh81abbef_0.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/tornado-6.4.2-py312h52516f5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda @@ -621,15 +613,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.2-pyhff008b6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.2-h801b22e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.1-hf5ce1d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.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/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.2-pyh31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.2-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/watchfiles-1.0.5-py312h8cbf658_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/websockets-15.0.1-py312hb2c0f52_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/zeromq-4.3.5-h5efb499_7.conda @@ -640,7 +632,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.9.0-pyh29332c3_0.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/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-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 @@ -668,22 +660,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20250127.1-cxx17_h07bc746_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.2-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.3-ha82da77_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.0-h286801f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-14_2_0_h6c33f7e_103.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-14.2.0-h6c33f7e_103.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-14.2.0-heb5dd2a_105.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-14.2.0-h2c44a93_105.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.29.3-hccd9074_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.29.3-hccd9074_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-h98efcbe_11.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.49.1-h3f77e49_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.50.0-h5505292_0.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-20.1.2-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.3-hdb05f8b_0.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/noarch/max-25.2.0-release.conda @@ -696,7 +688,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.0-h81ee809_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda @@ -704,11 +696,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.33.1-py312hd60eec9_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.10-hc22306f_0_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.1.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.20-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-6_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py312h998013c_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.4.0-py312hf4875e0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda @@ -720,9 +712,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-h98efcbe_11.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://repo.prefix.dev/modular-community/osx-arm64/small_time-25.2.0-h58ea7c0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.46.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.46.2-pyh81abbef_0.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/tornado-6.4.2-py312hea69d52_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda @@ -730,15 +721,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.15.2-pyhff008b6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.15.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.15.2-h801b22e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.1-hf5ce1d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.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/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.2-pyh31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.2-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/watchfiles-1.0.5-py312hcd83bfe_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-15.0.1-py312hea69d52_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/zeromq-4.3.5-hc1bb282_7.conda @@ -754,7 +745,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.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/importlib-metadata-8.6.1-pyha770c72_0.conda @@ -778,7 +769,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_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.29-pthreads_h94d23a6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-he636bdd_11.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.49.1-hee588c1_2.conda @@ -796,31 +787,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.10-h9e4cc4f_0_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/linux-64/python_abi-3.12-6_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.4.0-py312hbf22597_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-0.2.0-hc8f76dd_11.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-python-0.2.0-py312hb957f94_11.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sentencepiece-spm-0.2.0-he636bdd_11.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - - conda: https://repo.prefix.dev/modular-community/linux-64/small_time-25.2.0-h6f44653_0.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/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/typing_extensions-4.13.1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.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/importlib-metadata-8.6.1-pyha770c72_0.conda @@ -844,7 +834,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_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.29-pthreads_h9d3fd7e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.29.3-h4edc36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.29.3-h4edc36e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsentencepiece-0.2.0-h80ac1c1_11.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.49.1-h5eb1b54_2.conda @@ -862,30 +852,29 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.5.0-hd08dc88_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.10-h1683364_0_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/linux-aarch64/python_abi-3.12-6_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyzmq-26.4.0-py312h2427ae1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-0.2.0-h6c1b121_11.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-python-0.2.0-py312he2566dd_11.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sentencepiece-spm-0.2.0-h80ac1c1_11.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - - conda: https://repo.prefix.dev/modular-community/linux-aarch64/small_time-25.2.0-h8dc4c6c_0.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/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/typing_extensions-4.13.1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-h5efb499_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda osx-arm64: - 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/ca-certificates-2025.1.31-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.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/importlib-metadata-8.6.1-pyha770c72_0.conda @@ -895,21 +884,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20250127.1-cxx17_h07bc746_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.2-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.3-ha82da77_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.0-h286801f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-14_2_0_h6c33f7e_103.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-14.2.0-h6c33f7e_103.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-14.2.0-heb5dd2a_105.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-14.2.0-h2c44a93_105.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.29.3-hccd9074_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.29.3-hccd9074_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsentencepiece-0.2.0-h98efcbe_11.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.49.1-h3f77e49_2.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-20.1.2-hdb05f8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.3-hdb05f8b_0.conda - conda: https://conda.modular.com/max/noarch/max-25.2.0-release.conda - conda: https://conda.modular.com/max/osx-arm64/max-core-25.2.0-release.conda - conda: https://conda.modular.com/max/osx-arm64/max-python-25.2.0-release.conda @@ -919,24 +908,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.0-h81ee809_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.10-hc22306f_0_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/osx-arm64/python_abi-3.12-6_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.4.0-py312hf4875e0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-0.2.0-h22a84ea_11.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-python-0.2.0-py312h5ad5c83_11.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sentencepiece-spm-0.2.0-h98efcbe_11.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - - conda: https://repo.prefix.dev/modular-community/osx-arm64/small_time-25.2.0-h58ea7c0_0.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/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/typing_extensions-4.13.1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda @@ -1090,30 +1078,14 @@ packages: license_family: BSD size: 122909 timestamp: 1720974522888 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda - sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 - md5: 19f3a56f68d2fd06c516076bff482c52 - arch: x86_64 - platform: linux - license: ISC - size: 158144 - timestamp: 1738298224464 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2025.1.31-hcefe29a_0.conda - sha256: 66c6408ee461593cfdb2d78d82e6ed74d04a04ccb51df3ef8a5f35148c9c6eec - md5: 462cb166cd2e26a396f856510a3aff67 - arch: aarch64 - platform: linux - license: ISC - size: 158290 - timestamp: 1738299057652 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2025.1.31-hf0a4a13_0.conda - sha256: 7e12816618173fe70f5c638b72adf4bfd4ddabf27794369bb17871c5bb75b9f9 - md5: 3569d6a9141adc64d2fe4797f3289e06 - arch: arm64 - platform: osx +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.conda + sha256: 43878eddf8eb46e3ba7fcbe77a2f8d00aab9a66d9ff63bc4d072b7af17481197 + md5: e74273d9fc5ab633d613cde474b55157 + depends: + - __unix license: ISC - size: 158425 - timestamp: 1738298167688 + size: 158834 + timestamp: 1745260472197 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda sha256: 42a78446da06a2568cb13e69be3355169fbd0ea424b00fc80b7d840f5baaacf3 md5: c207fa5ac7ea99b149344385a9c0880d @@ -1679,17 +1651,17 @@ packages: license_family: BSD size: 17032 timestamp: 1740088127097 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.2-ha82da77_0.conda - sha256: e3ad5ba1ff49f988c1476f47f395499e841bdd8eafc3908cb1b64daae3a83f3b - md5: 85ea0d49eb61f57e02ce98dc29ca161f +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-20.1.3-ha82da77_0.conda + sha256: aa45cf608430e713575ef4193e4c0bcdfd7972db51f1c3af2fece26c173f5e67 + md5: 379db9caa727cab4d3a6c4327e4e7053 depends: - __osx >=11.0 arch: arm64 platform: osx license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 566452 - timestamp: 1743573280445 + size: 566462 + timestamp: 1744844034347 - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 md5: c277e0a4d549b03ac1e9d6cbbe3d017b @@ -1881,17 +1853,17 @@ packages: license_family: GPL size: 53611 timestamp: 1740241100147 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-14_2_0_h6c33f7e_103.conda - sha256: 8628746a8ecd311f1c0d14bb4f527c18686251538f7164982ccbe3b772de58b5 - md5: 044a210bc1d5b8367857755665157413 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-14.2.0-heb5dd2a_105.conda + sha256: 6ca48762c330d1cdbdaa450f197ccc16ffb7181af50d112b4ccf390223d916a1 + md5: ad35937216e65cfeecd828979ee5e9e6 depends: - - libgfortran5 14.2.0 h6c33f7e_103 + - libgfortran5 14.2.0 h2c44a93_105 arch: arm64 platform: osx license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 156291 - timestamp: 1743863532821 + size: 155474 + timestamp: 1743913530958 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda sha256: c17b7cf3073a1f4e1f34d50872934fa326346e104d3c445abc1e62481ad6085c md5: 556a4fdfac7287d349b8f09aba899693 @@ -1919,19 +1891,19 @@ packages: license_family: GPL size: 1100765 timestamp: 1740241083241 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-14.2.0-h6c33f7e_103.conda - sha256: 8599453990bd3a449013f5fa3d72302f1c68f0680622d419c3f751ff49f01f17 - md5: 69806c1e957069f1d515830dcc9f6cbb +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-14.2.0-h2c44a93_105.conda + sha256: de09987e1080f71e2285deec45ccb949c2620a672b375029534fbb878e471b22 + md5: 06f35a3b1479ec55036e1c9872f97f2c depends: - llvm-openmp >=8.0.0 constrains: - - libgfortran 5.0.0 14_2_0_*_103 + - libgfortran 14.2.0 arch: arm64 platform: osx license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 806566 - timestamp: 1743863491726 + size: 806283 + timestamp: 1743913488925 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda sha256: 1a3130e0b9267e781b89399580f3163632d59fe5b0142900d63052ab1a53490e md5: 06d02030237f4d5b3d9a7e7d348fe3c6 @@ -2089,7 +2061,7 @@ packages: md5: 0cd1148c68f09027ee0b0f0179f77c30 depends: - __osx >=11.0 - - libgfortran 5.* + - libgfortran >=5 - libgfortran5 >=13.2.0 - llvm-openmp >=18.1.8 constrains: @@ -2100,13 +2072,13 @@ packages: license_family: BSD size: 4168442 timestamp: 1739825514918 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_0.conda - sha256: 9965b1ada1f997202ad8c5a960e69057280b7b926c718df9b07c62924d9c1d73 - md5: 452518a9744fbac05fb45531979bdf29 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_1.conda + sha256: 691af28446345674c6b3fb864d0e1a1574b6cc2f788e0f036d73a6b05dcf81cf + md5: edb86556cf4a0c133e7932a1597ff236 depends: - __glibc >=2.17,<3.0.a0 - libabseil * cxx17* - - libabseil >=20250127.0,<20250128.0a0 + - libabseil >=20250127.1,<20250128.0a0 - libgcc >=13 - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 @@ -2114,14 +2086,14 @@ packages: platform: linux license: BSD-3-Clause license_family: BSD - size: 3352450 - timestamp: 1741126291267 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.29.3-h4edc36e_0.conda - sha256: a30d7608fd536413d5913b17430cac3b63711cc9699814ff106ee2f386640b7f - md5: ac171e408286df5ea157ceb742568b0b + size: 3358788 + timestamp: 1745159546868 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-5.29.3-h4edc36e_1.conda + sha256: 3dea67282f1e3442030ff9d4ee46747e5260dac3360db27f0e0227d913bbc744 + md5: 2f321e8f84944b3b41f7187bbc2bbedd depends: - libabseil * cxx17* - - libabseil >=20250127.0,<20250128.0a0 + - libabseil >=20250127.1,<20250128.0a0 - libgcc >=13 - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 @@ -2129,23 +2101,23 @@ packages: platform: linux license: BSD-3-Clause license_family: BSD - size: 3294650 - timestamp: 1741125673538 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.29.3-hccd9074_0.conda - sha256: 49d424913d018f3849c4153088889cb5ac4a37e5acedc35336b78c8a8450f764 - md5: 243704f59b7c09aab5b3070538026c92 + size: 3196210 + timestamp: 1745158850256 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.29.3-hccd9074_1.conda + sha256: 6e5b49bfa09bfc1aa0d69113be435d40ace0d01592b7b22cac696928cee6be03 + md5: f7951fdf76556f91bc146384ede7de40 depends: - __osx >=11.0 - libabseil * cxx17* - - libabseil >=20250127.0,<20250128.0a0 + - libabseil >=20250127.1,<20250128.0a0 - libcxx >=18 - libzlib >=1.3.1,<2.0a0 arch: arm64 platform: osx license: BSD-3-Clause license_family: BSD - size: 2630681 - timestamp: 1741125634671 + size: 2613087 + timestamp: 1745158781377 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsentencepiece-0.2.0-he636bdd_11.conda sha256: c5b98351daa23979a6728d297bf3b3eaae0324ae60487f5637b09a9ed7656d43 md5: aed2d089d7d343500921f9ad3f7ba9c8 @@ -2417,19 +2389,19 @@ packages: license_family: Other size: 46438 timestamp: 1727963202283 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.2-hdb05f8b_0.conda - sha256: 3510c986f94d8baf8bfef834c0a4fa9f059dbaa5940abe59c60342761fb77e27 - md5: 922f10fcb42090cdb0b74340dee96c08 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.3-hdb05f8b_0.conda + sha256: daddebd6ebf2960bb3bae945230ed07b254f430642c739c00ebfb4a8c747a033 + md5: 9f2cc154dd184ff808c2c6afd21cb12c depends: - __osx >=11.0 constrains: - - openmp 20.1.2|20.1.2.* + - openmp 20.1.3|20.1.3.* arch: arm64 platform: osx license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 282406 - timestamp: 1743660065194 + size: 282301 + timestamp: 1744934108744 - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda sha256: 0fbacdfb31e55964152b24d5567e9a9996e1e7902fb08eb7d91b5fd6ce60803a md5: fee3164ac23dfca50cfcc8b85ddefb81 @@ -2830,15 +2802,14 @@ packages: license_family: Apache size: 3067649 timestamp: 1744132084304 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 - md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyhd8ed1ab_0.conda + sha256: f759df4f492ae481505dcceb3d4485a120ee798af26711c92de20944a1185621 + md5: 4088c0d078e2f5092ddf824495186229 depends: - python >=3.8 license: Apache-2.0 - license_family: APACHE - size: 60164 - timestamp: 1733203368787 + size: 61525 + timestamp: 1745075800980 - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee md5: 617f15191456cc6a13db418a275435e5 @@ -2952,25 +2923,24 @@ packages: license_family: BSD size: 21085 timestamp: 1733217331982 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_1_cpython.conda - build_number: 1 - sha256: 77f2073889d4c91a57bc0da73a0466d9164dbcf6191ea9c3a7be6872f784d625 - md5: d82342192dfc9145185190e651065aa9 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.10-h9e4cc4f_0_cpython.conda + sha256: 4dc1da115805bd353bded6ab20ff642b6a15fcc72ac2f3de0e1d014ff3612221 + md5: a41d26cd4d47092d683915d058380dec 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 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 - libgcc >=13 - - liblzma >=5.6.4,<6.0a0 + - liblzma >=5.8.1,<6.0a0 - libnsl >=2.0.1,<2.1.0a0 - libsqlite >=3.49.1,<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.1,<4.0a0 + - openssl >=3.5.0,<4.0a0 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata @@ -2979,26 +2949,25 @@ packages: arch: x86_64 platform: linux license: Python-2.0 - size: 31670716 - timestamp: 1741130026152 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.9-h1683364_1_cpython.conda - build_number: 1 - sha256: af49622427ab0cf64efc0db91f505f974f6d24dce8df298e0cc1de3ccd321f67 - md5: 780ac8d332b0711766c121e4f835ba5d + size: 31279179 + timestamp: 1744325164633 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.10-h1683364_0_cpython.conda + sha256: fcc0ce19cacb2d8636f35407164251804441560a4cd16030fcb014f968ed5f6e + md5: b23ca8f1883073f95e5c10543d77323e 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 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 - libgcc >=13 - - liblzma >=5.6.4,<6.0a0 + - liblzma >=5.8.1,<6.0a0 - libnsl >=2.0.1,<2.1.0a0 - libsqlite >=3.49.1,<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.1,<4.0a0 + - openssl >=3.5.0,<4.0a0 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata @@ -3007,22 +2976,21 @@ packages: arch: aarch64 platform: linux license: Python-2.0 - size: 13763839 - timestamp: 1741128029222 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.9-hc22306f_1_cpython.conda - build_number: 1 - sha256: fe804fc462396baab8abe525a722d0254c839533c98c47abd2c6d1248ad45e93 - md5: d9fac7b334ff6e5f93abd27509a53060 + size: 13787815 + timestamp: 1744323165893 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.10-hc22306f_0_cpython.conda + sha256: 69aed911271e3f698182e9a911250b05bdf691148b670a23e0bea020031e298e + md5: c88f1a7e1e7b917d9c139f03b0960fea depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.4,<3.0a0 - - libffi >=3.4,<4.0a0 - - liblzma >=5.6.4,<6.0a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - liblzma >=5.8.1,<6.0a0 - libsqlite >=3.49.1,<4.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.4.1,<4.0a0 + - openssl >=3.5.0,<4.0a0 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata @@ -3031,8 +2999,8 @@ packages: arch: arm64 platform: osx license: Python-2.0 - size: 13042031 - timestamp: 1741128584924 + size: 12932743 + timestamp: 1744323815320 - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 md5: 5ba79d7c71f03c678c8ead841f347d6e @@ -3062,42 +3030,16 @@ packages: license_family: Apache size: 27913 timestamp: 1734420869885 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-6_cp312.conda - build_number: 6 - sha256: 09aff7ca31d1dbee63a504dba89aefa079b7c13a50dae18e1fe40a40ea71063e - md5: 95bd67b1113859774c30418e8481f9d8 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda + build_number: 7 + sha256: a1bbced35e0df66cc713105344263570e835625c28d1bdee8f748f482b2d7793 + md5: 0dfcdc155cf23812a0c9deada86fb723 constrains: - python 3.12.* *_cpython - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD - size: 6872 - timestamp: 1743483197238 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-6_cp312.conda - build_number: 6 - sha256: 1432664e212adf8a8e9ae4ce2c1dffb4494c7c12a50b1ebbb76819a5d2c9a23a - md5: c5120990ae43910ccc73159698640250 - constrains: - - python 3.12.* *_cpython - arch: aarch64 - platform: linux - license: BSD-3-Clause - license_family: BSD - size: 6919 - timestamp: 1743483181416 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-6_cp312.conda - build_number: 6 - sha256: 5ed89c380e790b07f9a2e27de39445d2209fcdeb304577bc910884922648acc0 - md5: 3d84f3f8c97233b20d64019d3b9aea97 - constrains: - - python 3.12.* *_cpython - arch: arm64 - platform: osx - license: BSD-3-Clause - license_family: BSD - size: 6937 - timestamp: 1743483237548 + size: 6971 + timestamp: 1745258861359 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda sha256: 159cba13a93b3fe084a1eb9bda0a07afc9148147647f0d437c3c3da60980503b md5: cf2485f39740de96e2a7f2bb18ed2fee @@ -3429,27 +3371,6 @@ packages: license_family: MIT size: 16385 timestamp: 1733381032766 -- conda: https://repo.prefix.dev/modular-community/linux-64/small_time-25.2.0-h6f44653_0.conda - sha256: eaeb882346ae67dfeda49f1ad950163ae584765d0fd5d7c14e0904c139a73ac5 - depends: - - max >=25.2.0,<26.0a0 - license: Apache-2.0 - size: 843959 - timestamp: 1744300695258 -- conda: https://repo.prefix.dev/modular-community/linux-aarch64/small_time-25.2.0-h8dc4c6c_0.conda - sha256: a9f19a516061d1b8801310e071a85176af30f82069793484b629b71a27f37acb - depends: - - max >=25.2.0,<26.0a0 - license: Apache-2.0 - size: 843802 - timestamp: 1744300687393 -- conda: https://repo.prefix.dev/modular-community/osx-arm64/small_time-25.2.0-h58ea7c0_0.conda - sha256: 664ffa836fd3b306a5cdad369ed284393b033ab0d116b61f7aa7253081874b5e - depends: - - max >=25.2.0,<26.0a0 - license: Apache-2.0 - size: 842616 - timestamp: 1744300688425 - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda sha256: c2248418c310bdd1719b186796ae50a8a77ce555228b6acd32768e2543a15012 md5: bf7a226e58dfb8346c70df36065d86c9 @@ -3459,17 +3380,18 @@ packages: license_family: Apache size: 15019 timestamp: 1733244175724 -- conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.46.1-pyha770c72_0.conda - sha256: 821c9e23e9dffaa1519faac109c60f02ebccc6436efd58ea60b85dd7b7f6e9ec - md5: db2f992eed837d11aed1dab97af9e408 +- conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.46.2-pyh81abbef_0.conda + sha256: d41b9b2719a2a0176930df21d7fec7b758058e7fafd53dc900b5706cd627fa3a + md5: 36ec80c2b37e52760ab41be7c2bd1fd3 depends: - anyio >=3.6.2,<5 - python >=3.9 - typing_extensions >=3.10.0 + - python license: BSD-3-Clause license_family: BSD - size: 58328 - timestamp: 1741450719441 + size: 62335 + timestamp: 1744661396275 - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e md5: d453b98d9c83e71da0741bb0ff4d76bc @@ -3602,15 +3524,15 @@ packages: license_family: MIT size: 5409 timestamp: 1740697495168 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.1-hf5ce1d7_0.conda - sha256: f38c8a4cb27155a3c0d2853683569b1b1b38b31aa17195c23789367868d2125e - md5: e37cf790f710cf72fd13dcb6b2d4370c +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda + sha256: 4865fce0897d3cb0ffc8998219157a8325f6011c136e6fd740a9a6b169419296 + md5: 568ed1300869dca0ba09fb750cda5dbb depends: - - typing_extensions ==4.13.1 pyh29332c3_0 + - typing_extensions ==4.13.2 pyh29332c3_0 license: PSF-2.0 license_family: PSF - size: 89685 - timestamp: 1743820059977 + size: 89900 + timestamp: 1744302253997 - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.0-pyhd8ed1ab_0.conda sha256: 172f971d70e1dbb978f6061d3f72be463d0f629155338603450d8ffe87cbf89d md5: c5c76894b6b7bacc888ba25753bc8677 @@ -3621,25 +3543,25 @@ packages: license_family: MIT size: 18070 timestamp: 1741438157162 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.1-pyh29332c3_0.conda - sha256: 78a5efbf86eca68b5f9e58f0dc7e56dcfa96d1dcba5c7f5f37d2c0444de22085 - md5: 5710c79a5fb0a6bfdba0a887f90583b1 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda + sha256: a8aaf351e6461de0d5d47e4911257e25eec2fa409d71f3b643bb2f748bde1c08 + md5: 83fc6ae00127671e301c9f44254c31b8 depends: - python >=3.9 - python license: PSF-2.0 license_family: PSF - size: 52170 - timestamp: 1743820059977 + size: 52189 + timestamp: 1744302253997 - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 md5: 4222072737ccff51314b5ece9c7d6f5a license: LicenseRef-Public-Domain size: 122968 timestamp: 1742727099393 -- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda - sha256: 114919ffa80c328127dab9c8e7a38f9d563c617691fb81fccb11c1e86763727e - md5: 32674f8dbfb7b26410ed580dd3c10a29 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda + sha256: a25403b76f7f03ca1a906e1ef0f88521edded991b9897e7fed56a3e334b3db8c + md5: c1e349028e0052c4eea844e94f773065 depends: - brotli-python >=1.0.9 - h2 >=4,<5 @@ -3648,11 +3570,11 @@ packages: - 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 + size: 100791 + timestamp: 1744323705540 +- conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.34.2-pyh31011fe_0.conda + sha256: d6c504920400354a89e597c5d355288e77481d638cca0489fea3530167895f15 + md5: 7e9f164470d693a5d2537c6b2ce1d9ea depends: - __unix - click >=7.0 @@ -3661,24 +3583,24 @@ packages: - 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 + size: 48985 + timestamp: 1745173533667 +- conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-standard-0.34.2-h31011fe_0.conda + sha256: c323cc4986f4fea91dedbee68dce8071cade48be2e71cf9c575faf3f3ccc42a9 + md5: 62676324fa57eb76b542a6a2e85d35e2 depends: - __unix - httptools >=0.6.3 - python-dotenv >=0.13 - pyyaml >=5.1 - - uvicorn 0.34.0 pyh31011fe_0 + - uvicorn 0.34.2 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 + size: 7661 + timestamp: 1745173534493 - conda: https://conda.anaconda.org/conda-forge/linux-64/uvloop-0.21.0-py312h66e93f0_1.conda sha256: 9337a80165fcf70b06b9d6ba920dad702260ca966419ae77560a15540e41ab72 md5: 998e481e17c1b6a74572e73b06f2df08 @@ -3721,9 +3643,9 @@ packages: 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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.0.5-py312h12e396e_0.conda + sha256: b97b961190e2f0d4bc4e26d6a58cce847aa353a292f1fec194e9ecca25793101 + md5: 731f9ed51e7198ec91c4b9d7899e881c depends: - __glibc >=2.17,<3.0.a0 - anyio >=3.0.0 @@ -3736,11 +3658,11 @@ packages: 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 + size: 421844 + timestamp: 1744451587768 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/watchfiles-1.0.5-py312h8cbf658_0.conda + sha256: f23bec95199ebdd070911b3a1203f23069aa60b4134d6c1bbb113a9cd16c2759 + md5: ac02c1989115661ada39e6edd20e0bb5 depends: - anyio >=3.0.0 - libgcc >=13 @@ -3753,11 +3675,11 @@ packages: 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 + size: 413350 + timestamp: 1744451646159 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.0.5-py312hcd83bfe_0.conda + sha256: 6a743ab6fe7d5f83c59c9ed93928a7ff2b935a93bb22a85464b386e06ae467af + md5: 4d684532f69a405bf5baec46b1462aa0 depends: - __osx >=11.0 - anyio >=3.0.0 @@ -3770,8 +3692,8 @@ packages: platform: osx license: MIT license_family: MIT - size: 363822 - timestamp: 1736550859472 + size: 366809 + timestamp: 1744451821025 - conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-15.0.1-py312h66e93f0_0.conda sha256: d55c82992553720a4c2f49d383ce8260a4ce1fa39df0125edb71f78ff2ee3682 md5: b986da7551224417af6b7da4021d8050 diff --git a/mojoproject.toml b/mojoproject.toml index eac2ebb..d4bd808 100644 --- a/mojoproject.toml +++ b/mojoproject.toml @@ -4,7 +4,7 @@ channels = ["conda-forge", "https://conda.modular.com/max", "https://repo.prefix description = "Simple and fast HTTP framework for Mojo!" name = "lightbug_http" platforms = ["osx-arm64", "linux-64", "linux-aarch64"] -version = "0.1.17" +version = "0.1.18" [tasks] build = { cmd = "rattler-build build --recipe recipes -c https://conda.modular.com/max -c conda-forge --skip-existing=all", env = {MODULAR_MOJO_IMPORT_PATH = "$CONDA_PREFIX/lib/mojo"} } @@ -25,7 +25,6 @@ bench_server = { cmd = "bash scripts/bench_server.sh" } [dependencies] max = ">=25.2.0,<25.3.0" -small_time = ">=25.2.0,<25.3.0" [feature.integration-tests.dependencies] requests = ">=2.32.3,<3" diff --git a/recipes/recipe.yaml b/recipes/recipe.yaml index 26125bf..26e4fe0 100644 --- a/recipes/recipe.yaml +++ b/recipes/recipe.yaml @@ -1,14 +1,15 @@ # yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json context: - version: "0.1.17" + version: "0.1.18" package: name: "lightbug_http" - version: 0.1.17 + version: 0.1.18 source: - path: ../lightbug_http + - path: ../external - path: ../LICENSE build: @@ -19,7 +20,6 @@ build: requirements: run: - max >=25.2.0 - - small_time == 25.2.0 about: homepage: https://github.com/saviorand/lightbug_http diff --git a/tests/lightbug_http/cookie/test_cookie.mojo b/tests/lightbug_http/cookie/test_cookie.mojo index 97846c2..752a18b 100644 --- a/tests/lightbug_http/cookie/test_cookie.mojo +++ b/tests/lightbug_http/cookie/test_cookie.mojo @@ -1,5 +1,5 @@ from lightbug_http.cookie import SameSite, Cookie, Duration, Expiration -from small_time.small_time import SmallTime, now +from external.small_time.small_time import SmallTime, now from testing import assert_true, assert_equal from collections import Optional diff --git a/tests/lightbug_http/cookie/test_expiration.mojo b/tests/lightbug_http/cookie/test_expiration.mojo index 3d0cf0b..0cd80f4 100644 --- a/tests/lightbug_http/cookie/test_expiration.mojo +++ b/tests/lightbug_http/cookie/test_expiration.mojo @@ -1,6 +1,6 @@ import testing from lightbug_http.cookie.expiration import Expiration -from small_time import SmallTime +from external.small_time import SmallTime def test_ctors():