From 98521aea0716c5355cd3afd008e30e952c91680e Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Wed, 28 May 2025 16:02:43 -0500 Subject: [PATCH 01/42] CXX-3232 add v1 interface declarations --- .evergreen/scripts/abidiff-test.sh | 12 +- .../include/bsoncxx/v1/array/value.hpp | 176 ++- src/bsoncxx/include/bsoncxx/v1/array/view.hpp | 120 +- src/bsoncxx/include/bsoncxx/v1/decimal128.hpp | 122 +- .../include/bsoncxx/v1/detail/macros.hpp | 7 + .../include/bsoncxx/v1/document/value.hpp | 359 +++++- .../include/bsoncxx/v1/document/view.hpp | 328 ++++- .../include/bsoncxx/v1/element/view.hpp | 275 +++- .../include/bsoncxx/v1/exception-fwd.hpp | 4 +- src/bsoncxx/include/bsoncxx/v1/exception.hpp | 97 +- src/bsoncxx/include/bsoncxx/v1/oid.hpp | 185 ++- src/bsoncxx/include/bsoncxx/v1/types/id.hpp | 56 +- .../include/bsoncxx/v1/types/value.hpp | 330 ++++- src/bsoncxx/include/bsoncxx/v1/types/view.hpp | 1114 ++++++++++++++++- .../lib/bsoncxx/private/type_traits.hh | 20 +- src/bsoncxx/lib/bsoncxx/v1/array/value.cpp | 15 + src/bsoncxx/lib/bsoncxx/v1/array/view.cpp | 20 + src/bsoncxx/lib/bsoncxx/v1/decimal128.cpp | 13 + src/bsoncxx/lib/bsoncxx/v1/document/value.cpp | 15 + src/bsoncxx/lib/bsoncxx/v1/document/view.cpp | 20 + src/bsoncxx/lib/bsoncxx/v1/element/view.cpp | 15 + src/bsoncxx/lib/bsoncxx/v1/exception.cpp | 10 + src/bsoncxx/lib/bsoncxx/v1/oid.cpp | 13 + src/bsoncxx/lib/bsoncxx/v1/types/value.cpp | 15 + src/bsoncxx/lib/bsoncxx/v1/types/view.cpp | 24 + 25 files changed, 3321 insertions(+), 44 deletions(-) diff --git a/.evergreen/scripts/abidiff-test.sh b/.evergreen/scripts/abidiff-test.sh index cc4ea1de2b..75069842df 100755 --- a/.evergreen/scripts/abidiff-test.sh +++ b/.evergreen/scripts/abidiff-test.sh @@ -54,7 +54,11 @@ echo "---" >>cxx-noabi/mongocxx.txt # Allow task to upload the diff reports despite failed status. echo "Comparing stable ABI for bsoncxx..." -if ! abidiff "${abi_flags[@]:?}" install/old/lib/libbsoncxx.so install/new/lib/libbsoncxx.so >>cxx-abi/bsoncxx.txt; then +abidiff "${abi_flags[@]:?}" install/old/lib/libbsoncxx.so install/new/lib/libbsoncxx.so >>cxx-abi/bsoncxx.txt && ret="$?" || ret="$?" +if (("$ret" & 0x03)); then # ABIDIFF_ERROR (1) | ABIDIFF_USAGE_ERROR (2) + echo "abidiff error" >&2 + exit 1 +elif (("$ret" & 0x08)); then # ABIDIFF_ABI_INCOMPATIBLE_CHANGE (8). declare status status='{"status":"failed", "type":"test", "should_continue":true, "desc":"abidiff returned an error for bsoncxx (stable)"}' curl -sS -d "${status:?}" -H "Content-Type: application/json" -X POST localhost:2285/task_status || true @@ -63,7 +67,11 @@ echo "Comparing stable ABI for bsoncxx... done." # Allow task to upload the diff reports despite failed status. echo "Comparing stable ABI for mongocxx..." -if ! abidiff "${abi_flags[@]:?}" install/old/lib/libmongocxx.so install/new/lib/libmongocxx.so >>cxx-abi/mongocxx.txt; then +abidiff "${abi_flags[@]:?}" install/old/lib/libmongocxx.so install/new/lib/libmongocxx.so >>cxx-abi/mongocxx.txt && ret="$?" || ret="$?" +if (("$ret" & 0x03)); then # ABIDIFF_ERROR (1) | ABIDIFF_USAGE_ERROR (2) + echo "abidiff error" >&2 + exit 1 +elif (("$ret" & 0x08)); then # ABIDIFF_ABI_INCOMPATIBLE_CHANGE (8) declare status status='{"status":"failed", "type":"test", "should_continue":true, "desc":"abidiff returned an error for mongocxx (stable)"}' curl -sS -d "${status:?}" -H "Content-Type: application/json" -X POST localhost:2285/task_status || true diff --git a/src/bsoncxx/include/bsoncxx/v1/array/value.hpp b/src/bsoncxx/include/bsoncxx/v1/array/value.hpp index 71e0545e2d..00ca2db62a 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/value.hpp @@ -20,6 +20,17 @@ #include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + namespace bsoncxx { namespace v1 { namespace array { @@ -29,7 +40,165 @@ namespace array { /// /// @attention This feature is experimental! It is not ready for use! /// -class value {}; +class value { + private: + v1::document::value _value; + + template + struct is_valid_deleter : std::is_constructible {}; + + public: + /// @copydoc v1::document::value::deleter_type + using deleter_type = v1::document::value::deleter_type; + + /// @copydoc v1::document::value::default_deleter_type + using default_deleter_type = v1::document::value::default_deleter_type; + + /// @copydoc v1::document::value::unique_ptr_type + using unique_ptr_type = v1::document::value::unique_ptr_type; + + /// @copydoc v1::document::view::const_iterator + using const_iterator = v1::document::view::const_iterator; + + /// @copydoc v1::document::view::iterator + using iterator = const_iterator; + + /// @copydoc v1::document::value::~value() + ~value() = default; + + /// @copydoc v1::document::value::value(v1::document::value&& other) noexcept + value(value&& other) noexcept : _value{std::move(other._value)} {} + + /// @copydoc v1::document::value::operator=(v1::document::value&& other) noexcept + value& operator=(value&& other) noexcept { + _value = std::move(other._value); + return *this; + } + + /// @copydoc v1::document::value::value(v1::document::value const& other) + value(value const& other) : _value(other._value) {} + + /// @copydoc v1::document::value::operator=(v1::document::value const& other) + value& operator=(value const& other) { + _value = other._value; + return *this; + } + + /// @copydoc v1::document::value::value() + value() = default; + + /// @copydoc v1::document::value::value(std::uint8_t* data, std::size_t length, Deleter deleter) + template ::value>* = nullptr> + value(std::uint8_t* data, std::size_t length, Deleter deleter) : _value{data, length, std::move(deleter)} {} + + /// @copydoc v1::document::value::value(std::uint8_t* data, std::size_t length) + value(std::uint8_t* data, std::size_t length) : _value{data, length} {} + + /// @copydoc v1::document::value::value(v1::document::value::unique_ptr_type ptr, std::size_t length) + value(unique_ptr_type ptr, std::size_t length) : _value{std::move(ptr), length} {} + + /// @copydoc v1::document::value::value(v1::document::view const& view) + explicit value(v1::array::view view) : _value{view} {} + + /// @copydoc v1::document::value::get_deleter() const + deleter_type const& get_deleter() const { + return _value.get_deleter(); + } + + /// @copydoc v1::document::value::release() + unique_ptr_type release() { + return _value.release(); + } + + /// @copydoc v1::document::value::reset(v1::document::value v) + void reset(value v) { + _value = std::move(v._value); + } + + /// @copydoc v1::document::value::reset(v1::document::view const& v) + void reset(v1::array::view v) { + *this = value{v}; + } + + /// + /// Return a view of the BSON binary data as an array. + /// + v1::array::view view() const { + return {_value.data(), _value.size()}; + } + + /// + /// Implicitly convert to `this->view()`. + /// + /* explicit(false) */ operator v1::array::view() const { + return this->view(); + } + + /// @copydoc v1::array::view::cbegin() const + v1::array::view::const_iterator cbegin() const { + return this->view().cbegin(); + } + + /// @copydoc v1::array::view::cend() const + v1::array::view::const_iterator cend() const { + return this->view().cend(); + } + + /// @copydoc v1::array::view::begin() const + v1::array::view::const_iterator begin() const { + return this->view().begin(); + } + + /// @copydoc v1::array::view::end() const + v1::array::view::const_iterator end() const { + return this->view().end(); + } + + /// @copydoc v1::array::view::find(std::uint32_t i) const + v1::array::view::const_iterator find(std::uint32_t i) const { + return this->view().find(i); + } + + /// @copydoc v1::array::view::operator[](std::uint32_t i) const + v1::element::view operator[](std::uint32_t i) const { + return this->view()[i]; + } + + /// @copydoc v1::array::view::data() const + std::uint8_t const* data() const { + return this->view().data(); + } + + /// @copydoc v1::array::view::size() const + std::size_t size() const { + return this->view().size(); + } + + /// @copydoc v1::array::view::length() const + std::size_t length() const { + return this->view().length(); + } + + /// @copydoc v1::array::view::empty() const + bool empty() const { + return this->view().empty(); + } + + /// @copydoc v1::array::view::operator bool() const + explicit operator bool() const { + return this->view().operator bool(); + } + + /// @copydoc v1::array::view::operator==(v1::array::view const& lhs, v1::array::view const& rhs) + friend bool operator==(value const& lhs, value const& rhs) { + return lhs.view() == rhs.view(); + } + + /// @copydoc v1::array::view::operator!=(v1::array::view const& lhs, v1::array::view const& rhs) + friend bool operator!=(value const& lhs, value const& rhs) { + return !(lhs == rhs); + } +}; } // namespace array } // namespace v1 @@ -41,3 +210,8 @@ class value {}; /// @file /// Provides @ref bsoncxx::v1::array::value. /// +/// @par Includes +/// - @ref bsoncxx/v1/array/view.hpp +/// - @ref bsoncxx/v1/document/value.hpp +/// - @ref bsoncxx/v1/element/view.hpp +/// diff --git a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp index 202c4b956a..751ce405f6 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp @@ -20,6 +20,14 @@ #include +#include +#include +#include + +#include +#include +#include + namespace bsoncxx { namespace v1 { namespace array { @@ -27,9 +35,115 @@ namespace array { /// /// A non-owning, read-only BSON array. /// +/// An "invalid" view, as indicated by @ref operator bool() const, does not satisfy the minimum requirements of a valid +/// BSON document, which are that: +/// +/// - @ref data() is not null, and +/// - @ref size() is not less than `5` (the minimum size of a BSON document). +/// +/// The BSON binary data being represented is only validated as minimally required to satisfy a requested operation. +/// When an operation is not satisfiable due to invalid data, the operation will throw an @ref bsoncxx::v1::exception +/// with @ref bsoncxx::v1::error::document::view::invalid_data. +/// /// @attention This feature is experimental! It is not ready for use! /// -class view {}; +class view { + public: + /// + /// Equivalent to @ref const_iterator. + /// + using const_iterator = v1::document::view::const_iterator; + + /// + /// Equivalent to @ref const_iterator. + /// + using iterator = const_iterator; + + private: + v1::document::view _view; + + public: + /// @copydoc v1::document::view::view() + view() = default; + + /// @copydoc v1::document::view::view(std::uint8_t const* data, std::size_t length) + view(std::uint8_t const* data, std::size_t length) : _view{data, length} {} + + /// @copydoc v1::document::view::data() const + std::uint8_t const* data() const { + return _view.data(); + } + + /// @copydoc v1::document::view::size() const + std::size_t size() const { + return _view.size(); + } + + /// @copydoc v1::document::view::length() const + std::size_t length() const { + return _view.length(); + } + + /// @copydoc v1::document::view::empty() const + bool empty() const { + return _view.empty(); + } + + /// @copydoc v1::document::view::operator bool() const + explicit operator bool() const { + return _view.operator bool(); + } + + /// @copydoc v1::document::view::cbegin() const + BSONCXX_ABI_EXPORT_CDECL(const_iterator) cbegin() const; + + /// @copydoc v1::document::view::cend() const + const_iterator cend() const { + return {}; + } + + /// @copydoc v1::document::view::cbegin() const + const_iterator begin() const { + return this->cbegin(); + } + + /// @copydoc v1::document::view::cend() const + const_iterator end() const { + return this->cend(); + } + + /// + /// Return a const iterator to the element within the represented BSON array at index `i`. + /// + /// If this view is invalid, returns an end iterator. + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation + /// failed due to invalid BSON binary data. + /// + BSONCXX_ABI_EXPORT_CDECL(const_iterator) find(std::uint32_t i) const; + + /// @copydoc find(std::uint32_t i) const + v1::element::view operator[](std::uint32_t i) const { + return *(this->find(i)); + } + + /// + /// Implicitly convert to a @ref bsoncxx::v1::document::view. + /// + /* explicit(false) */ operator v1::document::view() const { + return _view; + } + + /// @copydoc v1::document::view::operator==(v1::document::view const& lhs, v1::document::view const& rhs) + friend bool operator==(view const& lhs, view const& rhs) { + return lhs._view == rhs._view; + } + + /// @copydoc v1::document::view::operator!=(v1::document::view const& lhs, v1::document::view const& rhs) + friend bool operator!=(view const& lhs, view const& rhs) { + return !(lhs == rhs); + } +}; } // namespace array } // namespace v1 @@ -41,3 +155,7 @@ class view {}; /// @file /// Provides @ref bsoncxx::v1::array::view. /// +/// @par Includes +/// - @ref bsoncxx/v1/document/view.hpp +/// - @ref bsoncxx/v1/element/view.hpp +/// diff --git a/src/bsoncxx/include/bsoncxx/v1/decimal128.hpp b/src/bsoncxx/include/bsoncxx/v1/decimal128.hpp index 4f9c12612b..842e8987af 100644 --- a/src/bsoncxx/include/bsoncxx/v1/decimal128.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/decimal128.hpp @@ -20,6 +20,65 @@ #include +#include +#include + +#include +#include + +namespace bsoncxx { +namespace v1 { +namespace error { +namespace category { + +/// +/// The error category for @ref bsoncxx::v1::error::decimal128. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) decimal128(); + +} // namespace category +} // namespace error +} // namespace v1 +} // namespace bsoncxx + +namespace bsoncxx { +namespace v1 { +namespace error { + +/// +/// Errors codes which may be returned by @ref bsoncxx::v1::decimal128. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +enum class decimal128 { + zero, ///< Zero. + empty_string, ///< String must not be empty. + invalid_string_length, ///< Length of string is too long (exceeds `INT_MAX`). + invalid_string_data, ///< String is not a valid Decimal128 representation. +}; + +/// +/// Support implicit conversion to `std::error_code`. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +inline std::error_code make_error_code(decimal128 v) { + return {static_cast(v), v1::error::category::decimal128()}; +} + +} // namespace error +} // namespace v1 +} // namespace bsoncxx + +namespace std { + +template <> +struct is_error_code_enum : true_type {}; + +} // namespace std + namespace bsoncxx { namespace v1 { @@ -28,7 +87,68 @@ namespace v1 { /// /// @attention This feature is experimental! It is not ready for use! /// -class decimal128 {}; +class decimal128 { + private: + std::uint64_t _high = 0u; + std::uint64_t _low = 0u; + + public: + /// + /// Zero-initialize the byte representation. + /// + /// @note The result is equivalent to `"0E-6176"`, not `"0"`. + /// + decimal128() = default; + + /// + /// Initialize with the given `high` and `low` byte representations. + /// + decimal128(std::uint64_t high, std::uint64_t low) : _high{high}, _low{low} {} + + /// + /// Initialize with the given Decimal128 string representation. + /// + /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::decimal128::empty_string if `str` is null. + /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::decimal128::invalid_string_length if the length of + /// `str` exceeds `INT_MAX`. + /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::decimal128::invalid_string_data if `str` is not a + /// valid Decimal128 string representation. + /// + explicit BSONCXX_ABI_EXPORT_CDECL() decimal128(v1::stdx::string_view str); + + /// + /// Return the string representation. + /// + BSONCXX_ABI_EXPORT_CDECL(std::string) to_string() const; + + /// + /// Return the high-order bytes. + /// + std::uint64_t high() const { + return _high; + } + + /// + /// Return the low-order bytes. + /// + std::uint64_t low() const { + return _low; + } + + /// + /// Compare equal when the byte representations compare equal. + /// + /// @{ + friend bool operator==(decimal128 const& lhs, decimal128 const& rhs) { + return lhs._high == rhs._high && lhs._low == rhs._low; + } + + friend bool operator!=(decimal128 const& lhs, decimal128 const& rhs) { + return !(lhs == rhs); + } + /// @} + /// +}; } // namespace v1 } // namespace bsoncxx diff --git a/src/bsoncxx/include/bsoncxx/v1/detail/macros.hpp b/src/bsoncxx/include/bsoncxx/v1/detail/macros.hpp index d70cba09c1..337610dbb9 100644 --- a/src/bsoncxx/include/bsoncxx/v1/detail/macros.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/detail/macros.hpp @@ -83,6 +83,13 @@ #define BSONCXX_PRIVATE_CONSTEXPR_CXX14 inline #endif +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56019 +#if defined(__GNUC__) && (__GNUC__ < 5) && !defined(__clang__) +#define BSONCXX_PRIVATE_MAX_ALIGN_T max_align_t +#else +#define BSONCXX_PRIVATE_MAX_ALIGN_T std::max_align_t +#endif + #define BSONCXX_PRIVATE_IF_MSVC(...) #define BSONCXX_PRIVATE_IF_GCC(...) #define BSONCXX_PRIVATE_IF_CLANG(...) diff --git a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp index 06ca4d5c9b..d8a3705332 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp @@ -20,6 +20,18 @@ #include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + namespace bsoncxx { namespace v1 { namespace document { @@ -29,7 +41,348 @@ namespace document { /// /// @attention This feature is experimental! It is not ready for use! /// -class value {}; +class value { + public: + /// + /// The type of the deleter used to free the underlying BSON binary data. + /// + /// A deleter `D` that is wrapped by @ref deleter_type must: + /// + /// - be `std::is_nothrow_destructible`, + /// - be `std::is_nothrow_move_constructible`, + /// - not throw an exception when invoked with a `std::uint8_t*`. + /// + /// These requirements are the same as those for a `std::unique_ptr` deleter `D`, but do not include nothrow + /// move assignability due to being wrapped by @ref deleter_type. + /// + /// @important Despite being a `std::function`, @ref deleter_type is assumed to behave like a C++23 + /// `std::move_only_function`. That is, it is assumed to be nothrow destructible, nothrow move constructible, and + /// nothrow move assignable. + /// + using deleter_type = std::function; + + /// + /// The deleter used to free copied BSON binary data when a user-provided deleter is not specified. + /// + using default_deleter_type = std::default_delete; + + /// + /// The type of the unique pointer used to manage the underlying BSON binary data. + /// + using unique_ptr_type = std::unique_ptr; + + private: + unique_ptr_type _data; + std::size_t _length = 0u; + + template + using is_value = detail::is_alike; + + template + using to_bson_expr = decltype(to_bson(std::declval(), std::declval())); + + template + struct has_to_bson : detail::conjunction>, detail::is_detected> {}; + + template + using from_bson_expr = decltype(from_bson(std::declval(), std::declval())); + + template + struct has_from_bson : detail::conjunction>, detail::is_detected> { + }; + + template + struct is_valid_deleter + : detail::disjunction< + // std::function may not be nothrow move constructible across all pre-C++20 implementations. + // Deliberately allow an exemption that assumes it is de facto nothrow move constructible. + std::is_same, + // Same requirements for D in std::unique_ptr but without (nothrow) move assignability which is not + // required for T in std::function. + detail::conjunction< + std::is_convertible, + std::is_nothrow_destructible, + std::is_nothrow_move_constructible>> {}; + + public: + /// @copydoc v1::document::view::const_iterator + using const_iterator = v1::document::view::const_iterator; + + /// @copydoc v1::document::view::iterator + using iterator = const_iterator; + + /// + /// Destroy this object. + /// + ~value() = default; + + /// + /// Move construction. + /// + /// @par Postconditions: + /// - `other` is equivalent to a default-initialized value. + /// + value(value&& other) noexcept : _data{std::move(other._data)}, _length{other._length} { + other._length = 0u; + } + + /// + /// Move assignment. + /// + /// @par Postconditions: + /// - `other` is equivalent to a default-initialized value. + /// + value& operator=(value&& other) noexcept { + _data = std::move(other._data); + + _length = other._length; + other._length = 0u; + + return *this; + } + + /// + /// Copy construction. + /// + /// The copied value is allocated using `operator new[]` and the deleter is set to @ref + /// default_deleter_type. + /// + value(value const& other) : value{other.view()} {} + + /// + /// Copy assignment. + /// + /// The copied value is allocated using `operator new[]` and the deleter is set to @ref + /// default_deleter_type. + /// + value& operator=(value const& other) { + *this = value{other.view()}; + return *this; + } + + /// + /// Initialize without any underlying BSON binary data or deleter. + /// + /// @par Postconditions: + /// - `this->data() == nullptr` + /// - `static_cast(this->get_deleter()) == false` + /// - `this->size() == 0` + /// + value() = default; + + /// + /// Initialize as owning `data` which will be freed with `deleter`. + /// + /// @par Constraints: + /// - `Deleter` must satisfy the requirements described by @ref deleter_type. + /// + /// @par Preconditions: + /// - `length` must be less than or equal to the storage region pointed to by `data`. + /// - `deleter` must be capable of freeing the storage region pointed to by `data`. + /// + template ::value>* = nullptr> + value(std::uint8_t* data, std::size_t length, Deleter deleter) : _data{data, std::move(deleter)}, _length{length} {} + + /// + /// Initialize as owning `data` which will be freed with @ref default_deleter_type. + /// + /// @par Preconditions: + /// - `length` must be less than or equal to the storage region pointed to by `data`. + /// - `deleter` must be capable of freeing the storage region pointed to by `data`. + /// + value(std::uint8_t* data, std::size_t length) : value{data, length, default_deleter_type{}} {} + + /// + /// Initialize as owning `ptr`. + /// + /// @par Preconditions: + /// - `length` must be less than or equal to the storage region pointed to by `data`. + /// + value(unique_ptr_type ptr, std::size_t length) : _data{std::move(ptr)}, _length{length} {} + + /// + /// Initialize with a copy of the BSON binary data referenced by `view`. + /// + /// If `view` is invalid, this value is default-initialized. + /// + /// The copied value is allocated using `operator new[]` and the deleter is set to @ref + /// default_deleter_type. + /// + explicit value(v1::document::view const& view) + : _data{view ? unique_ptr_type{new std::uint8_t[view.size()], default_deleter_type{}} : unique_ptr_type{}}, + _length{view ? view.size() : 0u} { + if (view) { + std::memcpy(_data.get(), view.data(), view.size()); + } + } + + /// + /// Equivalent to `to_bson(v, *this);` after default-initialization. + /// + /// @par Constraints: + /// - `T` is not @ref bsoncxx::v1::document::value. + /// - `to_bson(v, *this)` is a valid and unambiguous overload found by ADL. + /// + template ::value>* = nullptr> + explicit value(T const& v) : value{} { + to_bson(v, *this); // ADL. + } + + /// + /// Equivalent to `*this = value{v}`. + /// + /// @par Constraints: + /// - `T` is not @ref bsoncxx::v1::document::value. + /// - `to_bson(v, *this)` is a valid and unambiguous overload found by ADL. + /// + template ::value>* = nullptr> + value& operator=(T const& v) { + *this = value{v}; + return *this; + } + + /// + /// Equivalent to `from_bson(v, this->view())`. + /// + /// @par Constraints: + /// - `T` is not @ref bsoncxx::v1::document::value. + /// - `from_bson(v, this->view())` is a valid and unambiguous overload found by ADL. + /// + template ::value>* = nullptr> + void get(T& v) const { + from_bson(v, this->view()); // ADL. + } + + /// + /// Equivalent to `T value; this->get(value); return value;`. + /// + /// @par Constraints: + /// - `T` is not @ref bsoncxx::v1::document::value. + /// - `T` is default-constructible. + /// - `from_bson(v, this->view())` is a valid and unambiguous overload found by ADL. + /// + template < + typename T, + detail::enable_if_t, has_from_bson>::value>* = nullptr> + T get() const { + T res; + this->get(res); + return res; + } + + /// + /// Return the current deleter. + /// + deleter_type const& get_deleter() const { + return _data.get_deleter(); + } + + /// + /// Release ownership of the underlying BSON binary data. + /// + unique_ptr_type release() { + _length = 0u; + return std::move(_data); + } + + /// + /// Replace the underlying BSON binary data with `v`. + /// + void reset(value v) { + *this = std::move(v); + } + + /// + /// Replace the underlying BSON binary data with a copy of `v`. + /// + /// If `v` is invalid, reset to a default-initialized value. + /// + /// The copied value is allocated using `operator new[]` and the deleter is set to @ref + /// default_deleter_type. + /// + void reset(v1::document::view const& v) { + *this = value{v}; + } + + /// + /// Return a view of the BSON binary data as a document. + /// + v1::document::view view() const { + return {_data.get(), _length}; + } + + /// + /// Implicitly convert to `this->view()`. + /// + /* explicit(false) */ operator v1::document::view() const { + return this->view(); + } + + /// @copydoc v1::document::view::cbegin() const + const_iterator cbegin() const { + return this->view().cbegin(); + } + + /// @copydoc v1::document::view::cend() const + const_iterator cend() const { + return this->view().cend(); + } + + /// @copydoc v1::document::view::begin() const + const_iterator begin() const { + return this->view().begin(); + } + + /// @copydoc v1::document::view::end() const + const_iterator end() const { + return this->view().end(); + } + + /// @copydoc v1::document::view::find(v1::stdx::string_view key) const + const_iterator find(v1::stdx::string_view key) const { + return this->view().find(key); + } + + /// @copydoc v1::document::view::operator[](v1::stdx::string_view key) const + v1::element::view operator[](v1::stdx::string_view key) const { + return this->view()[key]; + } + + /// @copydoc v1::document::view::data() const + std::uint8_t const* data() const { + return _data.get(); + } + + /// @copydoc v1::document::view::size() const + std::size_t size() const { + return this->view().size(); + } + + /// @copydoc v1::document::view::length() const + std::size_t length() const { + return this->view().length(); + } + + /// @copydoc v1::document::view::empty() const + bool empty() const { + return this->view().empty(); + } + + /// @copydoc v1::document::view::operator bool() const + explicit operator bool() const { + return this->view().operator bool(); + } + + /// @copydoc v1::document::view::operator==(v1::document::view const& lhs, v1::document::view const& rhs) + friend bool operator==(value const& lhs, value const& rhs) { + return lhs.view() == rhs.view(); + } + + /// @copydoc v1::document::view::operator!=(v1::document::view const& lhs, v1::document::view const& rhs) + friend bool operator!=(value const& lhs, value const& rhs) { + return !(lhs == rhs); + } +}; } // namespace document } // namespace v1 @@ -41,3 +394,7 @@ class value {}; /// @file /// Provides @ref bsoncxx::v1::document::value. /// +/// @par Includes +/// - @ref bsoncxx/v1/document/view.hpp +/// - @ref bsoncxx/v1/element/view.hpp +/// diff --git a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp index 204d834719..c1a94aadca 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp @@ -20,6 +20,79 @@ #include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace bsoncxx { +namespace v1 { +namespace error { +namespace category { + +/// +/// Declares error categories for error codes declared in @ref bsoncxx::v1::error::document. +/// +namespace document { + +/// +/// The error category for @ref bsoncxx::v1::error::document::view. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) view(); + +} // namespace document +} // namespace category +} // namespace error +} // namespace v1 +} // namespace bsoncxx + +namespace bsoncxx { +namespace v1 { +namespace error { + +/// +/// Declares error codes returned by @ref bsoncxx::v1::document interfaces. +/// +namespace document { + +/// +/// Errors codes which may be returned by @ref bsoncxx::v1::document::view. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +enum class view { + zero, ///< Zero. + invalid_data, ///< Data is invalid. +}; + +/// +/// Support implicit conversion to `std::error_code`. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +inline std::error_code make_error_code(view v) { + return {static_cast(v), v1::error::category::document::view()}; +} + +} // namespace document +} // namespace error +} // namespace v1 +} // namespace bsoncxx + +namespace std { + +template <> +struct is_error_code_enum : true_type {}; + +} // namespace std + namespace bsoncxx { namespace v1 { namespace document { @@ -27,9 +100,259 @@ namespace document { /// /// A non-owning, read-only BSON document. /// +/// An "invalid" view, as indicated by @ref operator bool() const, does not satisfy the minimum requirements of a valid +/// BSON document, which are that: +/// +/// - @ref data() is not null, and +/// - @ref size() is not less than `5` (the minimum size of a BSON document). +/// +/// The BSON binary data being represented is only validated as minimally required to satisfy a requested operation. +/// When an operation is not satisfiable due to invalid data, the operation will throw an @ref bsoncxx::v1::exception +/// with @ref bsoncxx::v1::error::document::view::invalid_data. +/// /// @attention This feature is experimental! It is not ready for use! /// -class view {}; +class view { + public: + class const_iterator; + + /// + /// Equivalent to @ref const_iterator. + /// + using iterator = const_iterator; + + private: + enum : std::size_t { _empty_length = 5u }; + + std::uint8_t const* _data; + std::size_t _length; + + public: + /// + /// Initialize as an empty view. + /// + /// @par Postconditions: + /// - `this->data() != nullptr` + /// - `this->size() == 5` + /// - `this->empty() == true` + /// + BSONCXX_ABI_EXPORT_CDECL() view(); + + /// + /// Initialize with the given BSON binary data. + /// + /// @par Preconditions: + /// - `length` must be less than or equal to the storage region pointed to by `data`. + /// + view(std::uint8_t const* data, std::size_t length) : _data(data), _length(length) {} + + /// + /// Return a pointer to the BSON binary data being represented. + /// + std::uint8_t const* data() const { + return _data; + } + + /// + /// Return the length of the BSON binary data being represented. + /// + /// @note This returns the length as specified during initialization, not the length of the BSON binary data as + /// indicated by the BSON binary data itself. + /// + std::size_t size() const { + return _length; + } + + /// @copydoc size() const + std::size_t length() const { + return _length; + } + + /// + /// Return true when the BSON binary data represents an empty view. + /// + /// @note This does not return true when this view is invalid. + /// + bool empty() const { + return this->operator bool() && _data[4] == 0u; + } + + /// + /// Return true when this view is valid. + /// + /// @note This does not validate the BSON binary data being represented. + /// + explicit operator bool() const { + return _data && _length >= _empty_length; + } + + /// + /// Return a const iterator to the beginning of the range of BSON elements within this view. + /// + /// If this view is invalid, returns an end iterator. + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation + /// failed due to invalid BSON binary data. + /// + BSONCXX_ABI_EXPORT_CDECL(const_iterator) cbegin() const; + + /// + /// Return a const iterator to the end of the range of BSON elements within this view. + /// + const_iterator cend() const; + + /// @copydoc cbegin() const + const_iterator begin() const; + + /// @copydoc cend() const + const_iterator end() const; + + /// + /// Return a const iterator to the element within the represented BSON document whose key compares equal to `key`. + /// + /// If this view is invalid, returns an end iterator. + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation + /// failed due to invalid BSON binary data. + /// + BSONCXX_ABI_EXPORT_CDECL(const_iterator) find(v1::stdx::string_view key) const; + + /// @copydoc find(v1::stdx::string_view key) const + v1::element::view operator[](v1::stdx::string_view key) const; + + /// + /// Compare equal when the BSON binary data represented by `lhs` and `rhs` compare equal. + /// + /// An invalid view only compares equal to another invalid view. The underlying BSON binary data (if any) is ignored + /// for an invalid document. + /// + /// @{ + friend bool operator==(view const& lhs, view const& rhs) { + if (!lhs != !rhs) { + return false; + } + + return !lhs || (lhs.length() == rhs.length() && std::memcmp(lhs.data(), rhs.data(), lhs.length()) == 0); + } + + friend bool operator!=(view const& lhs, view const& rhs) { + return !(lhs == rhs); + } + /// @} + /// +}; + +/// +/// A const iterator over the elements of a view. +/// +/// @note This iterator almost satisfies LegacyForwardIterator, but `std::iterator_traits::reference` is defined as +/// `value_type`, similar to `std::vector::iterator` and `std::istreambuf_iterator`. Therefore, this iterator +/// only fully satisfies LegacyInputIterator. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +class view::const_iterator { + private: + v1::element::view _element; + + public: + /// + /// Provide `std::iterator_traits::iterator_category`. + /// + using iterator_category = std::input_iterator_tag; + + /// + /// Provide `std::iterator_traits::value_type`. + /// + using value_type = v1::element::view; + + /// + /// Provide `std::iterator_traits::difference_type`. + /// + using difference_type = std::ptrdiff_t; + + /// + /// Provide `std::iterator_traits::pointer`. + /// + using pointer = value_type const*; + + /// + /// Provide `std::iterator_traits::reference`. + /// + using reference = value_type; + + /// + /// Initialize as an end iterator. + /// + const_iterator() = default; + + /// + /// Return the current element. + /// + /// If this is an end iterator, returns an invalid element. + /// + reference operator*() const { + return _element; + } + + /// + /// Access the current element. + /// + /// If this is an end iterator, accesses an invalid element. + /// + pointer operator->() const { + return &_element; + } + + /// + /// Pre-increment this iterator. + /// + /// If this is an end iterator, it remains an end iterator. + /// + BSONCXX_ABI_EXPORT_CDECL(const_iterator&) operator++(); + + /// + /// Post-increment this iterator. + /// + /// If this is an end iterator, it remains an end iterator. + /// + const_iterator operator++(int) { + const_iterator tmp = *this; + this->operator++(); + return tmp; + } + + /// @copydoc v1::element::view::operator==(v1::element::view const& lhs, v1::element::view const& rhs) + friend bool operator==(const_iterator const& lhs, const_iterator const& rhs) { + return lhs._element == rhs._element; + } + + /// @copydoc v1::element::view::operator!=(v1::element::view const& lhs, v1::element::view const& rhs) + friend bool operator!=(const_iterator const& lhs, const_iterator const& rhs) { + return !(lhs == rhs); + } + + class internal; + + private: + explicit BSONCXX_ABI_EXPORT_CDECL() const_iterator(v1::element::view element); +}; + +inline view::const_iterator view::cend() const { + return {}; +} + +inline view::const_iterator view::begin() const { + return this->cbegin(); +} + +inline view::const_iterator view::end() const { + return this->cend(); +} + +inline v1::element::view view::operator[](v1::stdx::string_view key) const { + return *(this->find(key)); +} } // namespace document } // namespace v1 @@ -41,3 +364,6 @@ class view {}; /// @file /// Provides @ref bsoncxx::v1::document::view. /// +/// @par Includes +/// - @ref bsoncxx/v1/element/view.hpp +/// diff --git a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp index 84df4c2b05..53769a74f2 100644 --- a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp @@ -20,6 +20,84 @@ #include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace bsoncxx { +namespace v1 { +namespace error { +namespace category { + +/// +/// Declares error categories for error codes declared in @ref bsoncxx::v1::error::element. +/// +namespace element { + +/// +/// The error category for @ref bsoncxx::v1::error::element::view. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) view(); + +} // namespace element +} // namespace category +} // namespace error +} // namespace v1 +} // namespace bsoncxx + +namespace bsoncxx { +namespace v1 { +namespace error { + +/// +/// Declares error codes returned by @ref bsoncxx::v1::element interfaces. +/// +namespace element { + +/// +/// Errors codes which may be returned by @ref bsoncxx::v1::element::view. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +enum class view { + zero, ///< Zero. + invalid_view, ///< View is invalid. + invalid_data, ///< Data is invalid. +}; + +/// +/// Support implicit conversion to `std::error_code`. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +inline std::error_code make_error_code(view v) { + return {static_cast(v), v1::error::category::element::view()}; +} + +} // namespace element +} // namespace error +} // namespace v1 +} // namespace bsoncxx + +namespace std { + +template <> +struct is_error_code_enum : true_type {}; + +} // namespace std + namespace bsoncxx { namespace v1 { namespace element { @@ -27,9 +105,204 @@ namespace element { /// /// A non-owning, read-only BSON element. /// +/// An "invalid" element, as indicated by @ref operator bool() const, does not represent a BSON element and does not +/// have an underlying key or value. Attempting to query the key or value of an invalid element will throw an exception. +/// However, subscripting will not throw an exception when the requested field does not exist; instead it will return an +/// invalid element to facilitate chaining. +/// +/// ```cpp +/// a = doc["a"]; // If "a" exists, `a` is valid. Otherwise, `a` is invalid. +/// b = a["2"]; // If "a.b" exists and is a document, `b` is valid. Otherwise, `b` is invalid. +/// c = b[3]; // If "a.b.c" exists and is an array, `c` is valid. Otherwise, `c` is invalid. +/// +/// a.key(); // Throws an exception if invalid. +/// b.type_id(); // Throws an exception if invalid. +/// c.get_int32(); // Throws an exception if invalid. +/// ``` +/// +/// Do not chain subscripts (e.g. `doc["a"]["b"]`) or immediately query element properties (e.g. `doc["x"].key()`) +/// if you need to identify which field may be missing. +/// +/// ```cpp +/// // Unclear whether "x" or "x.y" was missing when an exception is thrown. +/// try { doc["x"]["y"].type_id(); } catch (...) {} +/// +/// // Check validity prior to further access to identify the missing field. +/// if (x = doc["x"]) { +/// if (y = x["y"]) {} // Field "x.y" is present. +/// else {} // Field "x.y" is missing. +/// } else {} // Field "x" is missing. +/// +/// // A less efficient but more concise approach. +/// if (doc["x"]["y"]) {} // Field "x.y" is present. +/// else if (doc["x"]) {} // Field "x.y" is missing. +/// else {} // Field "x" is missing. +/// ``` +/// +/// The BSON binary data being represented is only validated as minimally required to satisfy a requested operation. +/// When an operation is not satisfiable due to invalid data, the operation will throw an @ref bsoncxx::v1::exception +/// with @ref bsoncxx::v1::error::document::view::invalid_data. +/// /// @attention This feature is experimental! It is not ready for use! /// -class view {}; +class view { + private: + class impl; + + alignas(BSONCXX_PRIVATE_MAX_ALIGN_T) unsigned char _storage[32]; + + public: + /// + /// Destroy this object. + /// + BSONCXX_ABI_EXPORT_CDECL() ~view(); + + // Handled by the nothrow copy constructor. + // view(view&& other) noexcept; + + // Handled by the nothrow copy assignment operator. + // view& operator=(view&& other) noexcept; + + /// + /// Copy (or move) construction. + /// + BSONCXX_ABI_EXPORT_CDECL() view(view const& other) noexcept; + + /// + /// Copy (or move) assignment. + /// + BSONCXX_ABI_EXPORT_CDECL(view&) operator=(view const& other) noexcept; + + /// + /// Initialize as an invalid element without any associated BSON binary data. + /// + BSONCXX_ABI_EXPORT_CDECL() view(); + + /// + /// Return true when this is a valid element. + /// + /// @note This does not validate the BSON binary data being represented. + /// + explicit BSONCXX_ABI_EXPORT_CDECL() operator bool() const; + + /// + /// Return the "raw" component of the underlying BSON binary data. + /// + /// The value is unspecified when this element is invalid. + /// + BSONCXX_ABI_EXPORT_CDECL(std::uint8_t const*) raw() const; + + /// + /// Return the "length" component of the underlying BSON binary data. + /// + /// The value is unspecified when this element is invalid. + /// + BSONCXX_ABI_EXPORT_CDECL(std::uint32_t) length() const; + + /// + /// Return the "offset" component of the underlying BSON binary data. + /// + /// The value is unspecified when this element is invalid. + /// + BSONCXX_ABI_EXPORT_CDECL(std::uint32_t) offset() const; + + /// + /// Return the "keylen" component of the underlying BSON binary data. + /// + /// The value is unspecified when this element is invalid. + /// + BSONCXX_ABI_EXPORT_CDECL(std::uint32_t) keylen() const; + + /// + /// Return the type. + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is + /// invalid. + /// + BSONCXX_ABI_EXPORT_CDECL(v1::types::id) type_id() const; + + /// + /// Return the key. + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is + /// invalid. + /// + BSONCXX_ABI_EXPORT_CDECL(v1::stdx::string_view) key() const; + +#pragma push_macro("X") +#undef X +#define X(_name, _value) BSONCXX_ABI_EXPORT_CDECL(v1::types::b_##_name) get_##_name() const; + + /// + /// Return the underlying BSON type value. + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is + /// invalid. + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::types::view::type_mismatch if the BSON type + /// value does not match the requested type. + /// + /// @{ + BSONCXX_V1_TYPES_XMACRO(X) + /// @} + /// +#pragma pop_macro("X") + + /// + /// Return a view of the underlying BSON type value. + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is + /// invalid. + /// + BSONCXX_ABI_EXPORT_CDECL(v1::types::view) type_view() const; + + /// + /// Return a deep copy of the underlying BSON type value. + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is + /// invalid. + /// + BSONCXX_ABI_EXPORT_CDECL(v1::types::value) type_value() const; + + /// + /// Return an element representing the requested field. + /// + /// @returns An invalid element if the requested field does not exist. + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_data if this operation + /// failed due to invalid BSON binary data. + /// + /// @{ + BSONCXX_ABI_EXPORT_CDECL(v1::element::view) operator[](v1::stdx::string_view key) const; + BSONCXX_ABI_EXPORT_CDECL(v1::element::view) operator[](std::uint32_t idx) const; + /// @} + /// + + /// + /// Compare equal when `lhs` and `rhs` represent the same field within the same BSON binary data. + /// + /// An invalid element only compares equal to another invalid element. The underlying BSON binary data (if any) is + /// ignored for an invalid element. + /// + friend bool operator==(view const& lhs, view const& rhs) { + if (!lhs != !rhs) { + return false; + } + + return !lhs || (lhs.raw() == rhs.raw() && lhs.offset() == rhs.offset()); + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(view const& lhs, view const& rhs) { + return !(lhs == rhs); + } + + class internal; + + private: + explicit view(impl i); +}; } // namespace element } // namespace v1 diff --git a/src/bsoncxx/include/bsoncxx/v1/exception-fwd.hpp b/src/bsoncxx/include/bsoncxx/v1/exception-fwd.hpp index 44c105e0a4..c393252d47 100644 --- a/src/bsoncxx/include/bsoncxx/v1/exception-fwd.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/exception-fwd.hpp @@ -16,6 +16,8 @@ #include +#include + namespace bsoncxx { namespace v1 { namespace error { @@ -31,7 +33,7 @@ enum class type; namespace bsoncxx { namespace v1 { -class exception; +class BSONCXX_ABI_EXPORT exception; } // namespace v1 } // namespace bsoncxx diff --git a/src/bsoncxx/include/bsoncxx/v1/exception.hpp b/src/bsoncxx/include/bsoncxx/v1/exception.hpp index ad2fbd0a51..47a9f9b9d4 100644 --- a/src/bsoncxx/include/bsoncxx/v1/exception.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/exception.hpp @@ -20,10 +20,46 @@ #include +#include +#include + #include +#include + +namespace bsoncxx { +namespace v1 { +namespace error { + +/// +/// Declares error categories for error codes and error conditions declared in @ref bsoncxx::v1::error. +/// +namespace category { + +/// +/// The error category for @ref bsoncxx::v1::error::source. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) source(); + +/// +/// The error category for @ref bsoncxx::v1::error::type. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) type(); + +} // namespace category +} // namespace error +} // namespace v1 +} // namespace bsoncxx namespace bsoncxx { namespace v1 { + +/// +/// Declares error codes and error conditions returned by @ref bsoncxx::v1 interfaces. +/// namespace error { /// @@ -31,28 +67,83 @@ namespace error { /// /// @attention This feature is experimental! It is not ready for use! /// -enum class source {}; +enum class source { + zero, ///< Zero. + bsoncxx, ///< From the bsoncxx library. + bson, ///< From the bson library. +}; + +/// +/// Support implicit conversion to `std::error_condition`. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +inline std::error_condition make_error_condition(source code) { + return {static_cast(code), v1::error::category::source()}; +} /// /// Enumeration identifying the type (cause) of a @ref bsoncxx::v1 error. /// /// @attention This feature is experimental! It is not ready for use! /// -enum class type {}; +enum class type { + zero, ///< Zero. + invalid_argument, ///< An invalid argument passed to the throwing function. + runtime_error, ///< An erroneous condition was detected at runtime. +}; + +/// +/// Support implicit conversion to `std::error_condition`. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +inline std::error_condition make_error_condition(type code) { + return {static_cast(code), v1::error::category::type()}; +} } // namespace error } // namespace v1 } // namespace bsoncxx +namespace std { + +template <> +struct is_error_condition_enum : true_type {}; + +template <> +struct is_error_condition_enum : true_type {}; + +} // namespace std + namespace bsoncxx { namespace v1 { +BSONCXX_PRIVATE_WARNINGS_PUSH(); +BSONCXX_PRIVATE_WARNINGS_DISABLE(MSVC(4251)); +BSONCXX_PRIVATE_WARNINGS_DISABLE(MSVC(4275)); + /// /// Base class for all exceptions thrown by @ref bsoncxx::v1. /// +/// @par Inherits: +/// - `std::system_error` +/// /// @attention This feature is experimental! It is not ready for use! /// -class exception {}; +class exception : public std::system_error { + public: + ~exception() override; + + exception(exception&&) = default; + exception& operator=(exception&&) = default; + exception(exception const&) = default; + exception& operator=(exception const&) = default; + + using std::system_error::system_error; +}; + +BSONCXX_PRIVATE_WARNINGS_POP(); } // namespace v1 } // namespace bsoncxx diff --git a/src/bsoncxx/include/bsoncxx/v1/oid.hpp b/src/bsoncxx/include/bsoncxx/v1/oid.hpp index 02c24211de..79ab8b4c3c 100644 --- a/src/bsoncxx/include/bsoncxx/v1/oid.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/oid.hpp @@ -20,6 +20,71 @@ #include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace bsoncxx { +namespace v1 { +namespace error { +namespace category { + +/// +/// The error category for @ref bsoncxx::v1::error::oid. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) oid(); + +} // namespace category +} // namespace error +} // namespace v1 +} // namespace bsoncxx + +namespace bsoncxx { +namespace v1 { +namespace error { + +/// +/// Errors codes may be returned by @ref bsoncxx::v1::oid. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +enum class oid { + zero, ///< Zero. + null_bytes_ptr, ///< Bytes pointer must not be null. + invalid_length, ///< Byte length must equal @ref bsoncxx::v1::oid::k_oid_length. + empty_string, ///< String must not be empty. + invalid_string, ///< String is not a valid ObjectID representation. +}; + +/// +/// Support implicit conversion to `std::error_code`. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +inline std::error_code make_error_code(oid v) { + return {static_cast(v), v1::error::category::oid()}; +} + +} // namespace error +} // namespace v1 +} // namespace bsoncxx + +namespace std { + +template <> +struct is_error_code_enum : true_type {}; + +} // namespace std + namespace bsoncxx { namespace v1 { @@ -28,7 +93,125 @@ namespace v1 { /// /// @attention This feature is experimental! It is not ready for use! /// -class oid {}; +class oid { + public: + /// + /// The number of bytes required to represent an ObjectID. + /// + static constexpr BSONCXX_ABI_EXPORT std::size_t k_oid_length = 12; + + private: + std::array _bytes; + + public: + /// + /// Initialize with a unique ObjectID. + /// + /// The ObjectID is generated using the bson library's + /// [`bson_oid_init`](https://mongoc.org/libbson/current/bson_oid_init.html) function with the default + /// [`bson_context_t`](https://mongoc.org/libbson/current/bson_context_t.html). + /// + /// @throws bsoncxx::v1::exception (on Windows only) with a `std::system_category()` error code + /// (as returned by + /// [`WSAGetLastError()`](https://learn.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-wsagetlasterror)) + /// on failure to initialize the Winsock library with + /// [`WSAStartup()`](https://learn.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-wsastartup). + /// + BSONCXX_ABI_EXPORT_CDECL() oid(); + + /// + /// Initialize with the given ObjectID byte representation. + /// + /// @param bytes A pointer to the ObjectID byte representation. + /// @param len The length of the array pointed to by `bytes`. + /// + /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::oid::null_bytes_ptr if `bytes` is null. + /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::oid::invalid_length if `len` is not equal to @ref + /// k_oid_length. + /// + BSONCXX_ABI_EXPORT_CDECL() oid(std::uint8_t const* bytes, std::size_t len); + + /// + /// Initialize with the given ObjectID hexadecimal string representation. + /// + /// @param str A valid ObjectID represented. + /// + /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::oid::empty_string if `str` is empty. + /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::oid::invalid_string if `str` is invalid. + /// + explicit BSONCXX_ABI_EXPORT_CDECL() oid(v1::stdx::string_view str); + + /// + /// Return @ref k_oid_length. + /// + std::size_t size() const { + return k_oid_length; + } + + /// + /// Return a pointer to the byte representation. + /// + std::uint8_t const* bytes() const { + return _bytes.data(); + } + + /// + /// Return the hexadecimal representation. + /// + BSONCXX_ABI_EXPORT_CDECL(std::string) to_string() const; + + /// + /// Return the timestamp component. + /// + BSONCXX_ABI_EXPORT_CDECL(std::time_t) get_time_t() const; + + /// + /// Equivalent to [`bson_oid_compare`](https://mongoc.org/libbson/current/bson_oid_compare.html). + /// + BSONCXX_ABI_EXPORT_CDECL(int) compare(oid const& other) const; + + /// + /// Equivalent to `lhs.compare(rhs) == 0`. + /// + friend bool operator==(oid const& lhs, oid const& rhs) { + return lhs.compare(rhs) == 0; + } + + /// + /// Equivalent to `lhs.compare(rhs) != 0`. + /// + friend bool operator!=(oid const& lhs, oid const& rhs) { + return lhs.compare(rhs) != 0; + } + + /// + /// Equivalent to `lhs.compare(rhs) < 0`. + /// + friend bool operator<(oid const& lhs, oid const& rhs) { + return lhs.compare(rhs) < 0; + } + + /// + /// Equivalent to `lhs.compare(rhs) <= 0`. + /// + friend bool operator<=(oid const& lhs, oid const& rhs) { + return lhs.compare(rhs) <= 0; + } + + /// + /// Equivalent to `lhs.compare(rhs) > 0`. + /// + friend bool operator>(oid const& lhs, oid const& rhs) { + return lhs.compare(rhs) > 0; + } + + /// + /// Equivalent to `lhs.compare(rhs) >= 0`. + /// + friend bool operator>=(oid const& lhs, oid const& rhs) { + return lhs.compare(rhs) >= 0; + } +}; } // namespace v1 } // namespace bsoncxx diff --git a/src/bsoncxx/include/bsoncxx/v1/types/id.hpp b/src/bsoncxx/include/bsoncxx/v1/types/id.hpp index 89a43808e5..67838113df 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/id.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/id.hpp @@ -20,6 +20,10 @@ #include +#include + +#include + namespace bsoncxx { namespace v1 { namespace types { @@ -31,7 +35,36 @@ namespace types { /// /// @showenumvalues /// -enum class id : std::uint8_t {}; +enum class id : std::uint8_t { + k_double = 0x01, ///< 64-bit binary floating point. + k_string = 0x02, ///< UTF-8 string. + k_document = 0x03, ///< Embedded document. + k_array = 0x04, ///< Array. + k_binary = 0x05, ///< Binary data. + k_undefined = 0x06, ///< Undefined value. @deprecated + k_oid = 0x07, ///< ObjectId. + k_bool = 0x08, ///< Boolean. + k_date = 0x09, ///< UTC datetime. + k_null = 0x0A, ///< Null value. + k_regex = 0x0B, ///< Regular expression. + k_dbpointer = 0x0C, ///< DBPointer. @deprecated + k_code = 0x0D, ///< JavaScript code. + k_symbol = 0x0E, ///< Symbol. @deprecated + k_codewscope = 0x0F, ///< JavaScript code with scope. @deprecated + k_int32 = 0x10, ///< 32-bit integer. + k_timestamp = 0x11, ///< Timestamp. + k_int64 = 0x12, ///< 64-bit integer. + k_decimal128 = 0x13, ///< 128-bit decimal floating point. + k_maxkey = 0x7F, ///< Min key. + k_minkey = 0xFF, ///< Max key. +}; + +/// +/// Return the name of the enumerator (e.g. `"double"` given `k_double`). +/// +/// @attention This feature is experimental! It is not ready for use! +/// +BSONCXX_ABI_EXPORT_CDECL(std::string) to_string(id rhs); /// /// Enumeration identifying a BSON binary subtype. @@ -40,7 +73,26 @@ enum class id : std::uint8_t {}; /// /// @showenumvalues /// -enum class binary_subtype : std::uint8_t {}; +enum class binary_subtype : std::uint8_t { + k_binary = 0x00, ///< Generic binary subtype. + k_function = 0x01, ///< Function. + k_binary_deprecated = 0x02, ///< Binary (Old). @deprecated + k_uuid_deprecated = 0x03, ///< UUID (Old). @deprecated + k_uuid = 0x04, ///< UUID. + k_md5 = 0x05, ///< MD5. + k_encrypted = 0x06, ///< Encrypted BSON value. + k_column = 0x07, ///< Compressed BSON column. + k_sensitive = 0x08, ///< Sensitive. + k_vector = 0x09, ///< Vector. + k_user = 0x80, ///< User defined. +}; + +/// +/// Return the name of the enumerator (e.g. `"binary"` given `k_binary`). +/// +/// @attention This feature is experimental! It is not ready for use! +/// +BSONCXX_ABI_EXPORT_CDECL(std::string) to_string(binary_subtype rhs); } // namespace types } // namespace v1 diff --git a/src/bsoncxx/include/bsoncxx/v1/types/value.hpp b/src/bsoncxx/include/bsoncxx/v1/types/value.hpp index fe5fe54126..21b6d5bf11 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/value.hpp @@ -20,6 +20,89 @@ #include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace bsoncxx { +namespace v1 { +namespace error { +namespace category { + +/// +/// Declares error categories for error codes declared in @ref bsoncxx::v1::error::types. +/// +namespace types { + +/// +/// The error category for @ref bsoncxx::v1::error::types::value. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) value(); + +} // namespace types +} // namespace category +} // namespace error +} // namespace v1 +} // namespace bsoncxx + +namespace bsoncxx { +namespace v1 { +namespace error { + +/// +/// Declares error codes returned by @ref bsoncxx::v1::types interfaces. +/// +namespace types { + +/// +/// Errors codes which may be returned by @ref bsoncxx::v1::types::value. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +enum class value { + zero, ///< Zero. + invalid_type, ///< Requested BSON type is not supported. + invalid_length_u32, ///< Length is too long (exceeds `UINT32_MAX`). +}; + +/// +/// Support implicit conversion to `std::error_code`. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +inline std::error_code make_error_code(value v) { + return {static_cast(v), v1::error::category::types::value()}; +} + +} // namespace types +} // namespace error +} // namespace v1 +} // namespace bsoncxx + +namespace std { + +template <> +struct is_error_code_enum : true_type {}; + +} // namespace std + namespace bsoncxx { namespace v1 { namespace types { @@ -31,7 +114,249 @@ namespace types { /// /// @note A "BSON type value" refers to the value of a BSON element without its key. /// -class value {}; +class value { + private: + class impl; + + alignas(BSONCXX_PRIVATE_MAX_ALIGN_T) unsigned char _storage[32]; + + public: + /// + /// Destroy this object. + /// + BSONCXX_ABI_EXPORT_CDECL() ~value(); + + /// + /// Move construction. + /// + /// @par Postconditions: + /// - `other` is equivalent to a default-initialized value. + /// + BSONCXX_ABI_EXPORT_CDECL() value(value&& other) noexcept; + + /// + /// Move assignment. + /// + /// @par Postconditions: + /// - `other` is equivalent to a default-initialized value. + /// + BSONCXX_ABI_EXPORT_CDECL(value&) operator=(value&& other) noexcept; + + /// + /// Copy construction. + /// + /// The copied BSON type value is allocated (when necessary) using + /// [`bson_value_copy`](https://mongoc.org/libbson/current/bson_value_copy.html). + /// + BSONCXX_ABI_EXPORT_CDECL() value(value const& other); + + /// + /// Copy assignment. + /// + /// The copied value is allocated (when necessary) using + /// [`bson_value_copy`](https://mongoc.org/libbson/current/bson_value_copy.html). + /// + BSONCXX_ABI_EXPORT_CDECL(value&) operator=(value const& other); + + /// + /// Initialize with @ref bsoncxx::v1::types::b_null. + /// + value() : value{v1::types::b_null{}} {} + + /// + /// Initialize with a deep copy of the underlying BSON type value. + /// + /// The copied value is allocated (when necessary) using + /// [`bson_malloc`](https://mongoc.org/libbson/current/bson_malloc.html). + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::types::value::invalid_type if `v.type_id()` is + /// not a supported value (not defined by @ref BSONCXX_V1_TYPES_XMACRO). + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::types::value::invalid_length_u32 if the length + /// of any underlying BSON type value component is not representable as an `std::uint32_t`. + /// + explicit BSONCXX_ABI_EXPORT_CDECL() value(v1::types::view const& v); + +#pragma push_macro("X") +#undef X +#define X(_name, _value) explicit BSONCXX_ABI_EXPORT_CDECL() value(v1::types::b_##_name v); + + /// + /// Implicitly convert `v` as a deep copy. + /// + /// The copied value is allocated (when necessary) using + /// [`bson_malloc`](https://mongoc.org/libbson/current/bson_malloc.html). + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::types::value::invalid_length_u32 if the length + /// of any underlying BSON type value component is not representable as an `std::uint32_t` as required by the + /// corresponding `bsoncxx::v1::types::b_`. + /// + /// @{ + BSONCXX_V1_TYPES_XMACRO(X) + /// @} + /// +#pragma pop_macro("X") + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_null. + /// + explicit value(std::nullptr_t) : value{v1::types::b_null{}} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_string. + /// + explicit value(v1::stdx::string_view v) : value{v1::types::b_string{v}} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_int32. + /// + explicit value(std::int32_t v) : value{v1::types::b_int32{v}} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_int64. + /// + explicit value(std::int64_t v) : value{v1::types::b_int64{v}} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_double. + /// + explicit value(double v) : value{v1::types::b_double{v}} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_bool. + /// + explicit value(bool v) : value{v1::types::b_bool{v}} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_oid. + /// + explicit value(v1::oid v) : value{v1::types::b_oid{v}} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_decimal128. + /// + explicit value(v1::decimal128 v) : value{v1::types::b_decimal128{v}} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_date. + /// + explicit value(std::chrono::milliseconds v) : value{v1::types::b_date{v}} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_document. + /// + explicit value(v1::document::view v) : value{v1::types::b_document{v}} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_array. + /// + explicit value(v1::array::view v) : value{v1::types::b_array{v}} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_binary with @ref + /// bsoncxx::v1::types::binary_subtype::k_binary. + /// + explicit value(std::vector const& v) + : value{v.data(), v.size(), v1::types::binary_subtype::k_binary} {} + + /// + /// Initialize with `v` as a @ref bsoncxx::v1::types::b_binary with `subtype`. + /// + explicit value(std::vector const& v, v1::types::binary_subtype subtype) + : value{v.data(), v.size(), subtype} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_dbpointer. + /// + explicit value(v1::stdx::string_view c, v1::oid v) : value{v1::types::b_dbpointer{c, v}} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_codewscope. + /// + explicit value(v1::stdx::string_view code, v1::document::view scope) + : value{v1::types::b_codewscope{code, scope}} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_regex. + /// + explicit value(v1::stdx::string_view regex, v1::stdx::string_view options) + : value{v1::types::b_regex{regex, options}} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_string. + /// + explicit value(char const* v) : value{v1::stdx::string_view{v}} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_string. + /// + explicit value(std::string const& v) : value{v1::stdx::string_view{v}} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_binary with @ref + /// bsoncxx::v1::types::binary_subtype::k_binary. + /// + explicit value(std::uint8_t const* data, std::size_t size) + : value{data, size, v1::types::binary_subtype::k_binary} {} + + /// + /// Initialize as a @ref bsoncxx::v1::types::b_binary with `subtype`. + /// + explicit BSONCXX_ABI_EXPORT_CDECL() + value(std::uint8_t const* data, std::size_t size, v1::types::binary_subtype const sub_type); + + /// + /// Return the type of the underlying BSON type value. + /// + BSONCXX_ABI_EXPORT_CDECL(v1::types::id) type_id() const; + + /// + /// Return a view of the underlying BSON type value. + /// + BSONCXX_ABI_EXPORT_CDECL(v1::types::view) view() const; + + /// + /// Implicitly convert to `this->view()`. + /// + /* explicit(false) */ operator v1::types::view() const { + return this->view(); + } + +#pragma push_macro("X") +#undef X +#define X(_name, _value) \ + v1::types::b_##_name get_##_name() const { \ + return this->view().get_##_name(); \ + } + + /// + /// Equivalent to `this->view().get_type()` where `get_type` is the correct name for the requested BSON type value + /// (e.g. `this->view().get_double()` given `this->get_double()`). + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::types::view::type_mismatch if the underlying + /// BSON type value does not match the requested type. + /// + /// @{ + BSONCXX_V1_TYPES_XMACRO(X) + /// @} + /// +#pragma pop_macro("X") + + /// + /// Equivalent to `lhs.view() == rhs.view()`. + /// + friend bool operator==(value const& lhs, value const& rhs) { + return lhs.view() == rhs.view(); + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(value const& lhs, value const& rhs) { + return !(lhs == rhs); + } + + class internal; +}; } // namespace types } // namespace v1 @@ -44,3 +369,6 @@ class value {}; /// @file /// Provides @ref bsoncxx::v1::types::value. /// +/// @par Includes +/// - @ref bsoncxx/v1/types/view.hpp +/// diff --git a/src/bsoncxx/include/bsoncxx/v1/types/view.hpp b/src/bsoncxx/include/bsoncxx/v1/types/view.hpp index 5ceabc143b..c514736f5b 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/view.hpp @@ -20,156 +20,1052 @@ #include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace bsoncxx { +namespace v1 { +namespace error { +namespace category { + +/// +/// Declares error categories for error codes declared in @ref bsoncxx::v1::error::types. +/// +namespace types { + +/// +/// The error category for @ref bsoncxx::v1::error::types::view. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) view(); + +} // namespace types +} // namespace category +} // namespace error +} // namespace v1 +} // namespace bsoncxx + +namespace bsoncxx { +namespace v1 { +namespace error { + +/// +/// Declares error codes returned by @ref bsoncxx::v1::types interfaces. +/// +namespace types { + +/// +/// Errors codes which may be returned by @ref bsoncxx::v1::types::view. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +enum class view { + zero, ///< Zero. + type_mismatch, ///< Requested type does not match the underlying type. +}; + +/// +/// Support implicit conversion to `std::error_code`. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +inline std::error_code make_error_code(view v) { + return {static_cast(v), v1::error::category::types::view()}; +} + +} // namespace types +} // namespace error +} // namespace v1 +} // namespace bsoncxx + +namespace std { + +template <> +struct is_error_code_enum : true_type {}; + +} // namespace std + namespace bsoncxx { namespace v1 { namespace types { +// BSONCXX_V1_TYPES_XMACRO: update below. + /// /// BSON type value "64-bit Binary Floating Point". /// /// @attention This feature is experimental! It is not ready for use! /// -struct b_double {}; +struct b_double { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_double; + + /// + /// The represented value. + /// + double value = {}; + + /// + /// Zero-initialize the represented value. + /// + b_double() = default; + + /// + /// Initialize with `value`. + /// + explicit b_double(double value) : value{value} {} + + /// + /// Implicitly convert to @ref value. + /// + /* explicit(false) */ operator double() const { + return value; + } + + /// + /// Equivalent to `lhs.value == rhs.value`. + /// + friend bool operator==(b_double const& lhs, b_double const& rhs) { + BSONCXX_PRIVATE_WARNINGS_PUSH(); + BSONCXX_PRIVATE_WARNINGS_DISABLE(GNU("-Wfloat-equal")); + return lhs.value == rhs.value; + BSONCXX_PRIVATE_WARNINGS_POP(); + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(b_double const& lhs, b_double const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "UTF-8 String". /// /// @attention This feature is experimental! It is not ready for use! /// -struct b_string {}; +struct b_string { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_string; + + /// + /// The represented value. + /// + v1::stdx::string_view value; + + /// + /// Zero-initialize the represented value. + /// + b_string() = default; + + /// + /// Initialize with `value`. + /// + explicit b_string(v1::stdx::string_view value) : value{value} {} + + /// + /// Implicitly convert to @ref value. + /// + /* explicit(false) */ operator v1::stdx::string_view() const { + return value; + } + + /// + /// Equivalent to `lhs.value == rhs.value`. + /// + friend bool operator==(b_string const& lhs, b_string const& rhs) { + return lhs.value == rhs.value; + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(b_string const& lhs, b_string const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "Embedded Document". /// /// @attention This feature is experimental! It is not ready for use! /// -struct b_document {}; +struct b_document { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_document; + + /// + /// The represented value. + /// + v1::document::view value; + + /// + /// Zero-initialize the represented value. + /// + b_document() = default; + + /// + /// Initialize with `value`. + /// + explicit b_document(v1::document::view value) : value{value} {} + + /// + /// Implicitly convert to @ref value. + /// + /* explicit(false) */ operator v1::document::view() const { + return value; + } + + v1::document::view view() { + return value; + } + + /// + /// Equivalent to `lhs.value == rhs.value`. + /// + friend bool operator==(b_document const& lhs, b_document const& rhs) { + return lhs.value == rhs.value; + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(b_document const& lhs, b_document const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "Array". /// /// @attention This feature is experimental! It is not ready for use! /// -struct b_array {}; +struct b_array { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_array; + + /// + /// The represented value. + /// + v1::array::view value; + + /// + /// Zero-initialize the represented value. + /// + b_array() = default; + + /// + /// Initialize with `value`. + /// + explicit b_array(v1::array::view value) : value{value} {} + + /// + /// Implicitly convert to @ref value. + /// + /* explicit(false) */ operator v1::array::view() const { + return value; + } + + /// + /// Equivalent to `lhs.value == rhs.value`. + /// + friend bool operator==(b_array const& lhs, b_array const& rhs) { + return lhs.value == rhs.value; + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(b_array const& lhs, b_array const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "Binary Data". /// /// @attention This feature is experimental! It is not ready for use! /// -struct b_binary {}; +struct b_binary { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_binary; + + /// + /// The represented value's binary subtype component. + /// + binary_subtype subtype = {}; + + /// + /// The represented value's length of binary data. + /// + std::uint32_t size = {}; + + /// + /// The represented value's binary data. + /// + std::uint8_t const* bytes = {}; + + /// + /// Zero-initialize the represented value. + /// + b_binary() = default; + + /// + /// Initialize with the given binary subtype and pointer to binary data. + /// + b_binary(binary_subtype subtype, std::uint32_t size, std::uint8_t const* bytes) + : subtype{subtype}, size{size}, bytes{bytes} {} + + /// + /// Compare equal when the binary subtype and pointed-to bytes compare equal. + /// + /// An "empty" range of bytes (when @ref bytes is null or @ref size is zero) only compares equal to another + /// "empty" range of bytes. The value of @ref subtype is ignored for an empty range of bytes. + /// + /// @{ + friend bool operator==(b_binary const& lhs, b_binary const& rhs) { + if (lhs.size != rhs.size) { + return false; + } + + if (!lhs.bytes != !rhs.bytes) { + return false; + } + + if (!lhs.bytes || lhs.size == 0u) { + return true; // Empty. + } + + return lhs.subtype == rhs.subtype && (std::memcmp(lhs.bytes, rhs.bytes, lhs.size) == 0); + } + + friend bool operator!=(b_binary const& lhs, b_binary const& rhs) { + return !(lhs == rhs); + } + /// @} + /// +}; /// /// BSON type value "Undefined (Value)". /// +/// @deprecated This BSON type is deprecated. +/// /// @attention This feature is experimental! It is not ready for use! /// -struct b_undefined {}; +struct b_undefined { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_undefined; + + /// + /// Return true. + /// + friend bool operator==(b_undefined const&, b_undefined const&) { + return true; + } + + /// + /// Return false. + /// + friend bool operator!=(b_undefined const& lhs, b_undefined const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "ObjectID". /// /// @attention This feature is experimental! It is not ready for use! /// -struct b_oid {}; +struct b_oid { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_oid; + + /// + /// The represented value. + /// + v1::oid value; + + /// + /// Zero-initialize the represented value. + /// + b_oid() = default; + + /// + /// Initialize with `value`. + /// + explicit b_oid(v1::oid const& value) : value{value} {} + + /// + /// Implicitly convert to @ref value. + /// + /* explicit(false) */ operator v1::oid() const { + return value; + } + + /// + /// Equivalent to `lhs.value == rhs.value`. + /// + friend bool operator==(b_oid const& lhs, b_oid const& rhs) { + return lhs.value == rhs.value; + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(b_oid const& lhs, b_oid const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "Boolean". /// /// @attention This feature is experimental! It is not ready for use! /// -struct b_bool {}; +struct b_bool { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_bool; + + /// + /// The represented value. + /// + bool value = false; + + /// + /// Zero-initialize the represented value. + /// + b_bool() = default; + + /// + /// Initialize with `value`. + /// + explicit b_bool(bool value) : value{value} {} + + /// + /// Implicitly convert to @ref value. + /// + /* explicit(false) */ operator bool() const { + return value; + } + + /// + /// Equivalent to `lhs.value == rhs.value`. + /// + friend bool operator==(b_bool const& lhs, b_bool const& rhs) { + return lhs.value == rhs.value; + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(b_bool const& lhs, b_bool const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "UTC Datetime". /// /// @attention This feature is experimental! It is not ready for use! /// -struct b_date {}; +struct b_date { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_date; + + /// + /// The represented value (milliseconds relative to the Unix epoch). + /// + std::chrono::milliseconds value = {}; + + /// + /// Zero-initialize the represented value. + /// + b_date() = default; + + /// + /// Initialize with `value` (milliseconds relative to the Unix epoch). + /// + explicit b_date(std::chrono::milliseconds value) : value{value} {} + + /// + /// Initialize with `tp` (assuming the epoch of `std::chrono::system_clock` is the Unix epoch). + /// + explicit b_date(std::chrono::system_clock::time_point tp) + : value{std::chrono::duration_cast(tp.time_since_epoch())} {} + + /// + /// Implicitly convert to @ref value. + /// + /* explicit(false) */ operator std::chrono::milliseconds() const { + return value; + } + + explicit operator std::chrono::system_clock::time_point() const { + return std::chrono::system_clock::time_point( + std::chrono::duration_cast(value)); + } + + /// + /// Equivalent to `lhs.value == rhs.value`. + /// + friend bool operator==(b_date const& lhs, b_date const& rhs) { + return lhs.value == rhs.value; + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(b_date const& lhs, b_date const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "Null Value". /// /// @attention This feature is experimental! It is not ready for use! /// -struct b_null {}; +struct b_null { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_null; + + /// + /// Return true. + /// + friend bool operator==(b_null const& /* lhs */, b_null const& /* rhs */) { + return true; + } + + /// + /// Return false. + /// + friend bool operator!=(b_null const& lhs, b_null const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "Regular Expression". /// /// @attention This feature is experimental! It is not ready for use! /// -struct b_regex {}; +struct b_regex { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_regex; + + /// + /// The represented value's "pattern" component. + /// + v1::stdx::string_view regex; + + /// + /// The represented value's "options" component. + /// + v1::stdx::string_view options; + + /// + /// Zero-initialize the represented value. + /// + b_regex() = default; + + /// + /// Initialize with `regex` and an empty @ref options. + /// + explicit b_regex(v1::stdx::string_view regex) : regex{regex}, options{} {} + + /// + /// Initialize with `regex` and `options`. + /// + b_regex(v1::stdx::string_view regex, v1::stdx::string_view options) : regex{regex}, options{options} {} + + /// + /// Equivalent to `lhs.regex == rhs.regex && lhs.options == rhs.options`. + /// + friend bool operator==(b_regex const& lhs, b_regex const& rhs) { + return lhs.regex == rhs.regex && lhs.options == rhs.options; + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(b_regex const& lhs, b_regex const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "DBPointer". /// +/// @deprecated This BSON type is deprecated. +/// /// @attention This feature is experimental! It is not ready for use! /// -struct b_dbpointer {}; +struct b_dbpointer { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_dbpointer; + + /// + /// The represented value's "$ref" (namespace) component. + /// + v1::stdx::string_view collection; + + /// + /// The represented value's "$id" (ObjectID) component. + /// + v1::oid value; + + /// + /// Zero-initialize the represented value. + /// + b_dbpointer() = default; + + /// + /// Initialize with `collection` and `value`. + /// + b_dbpointer(v1::stdx::string_view collection, v1::oid value) : collection{collection}, value{value} {} + + /// + /// Equivalent to `lhs.collection == rhs.collection && lhs.value == rhs.value`. + /// + friend bool operator==(b_dbpointer const& lhs, b_dbpointer const& rhs) { + return lhs.collection == rhs.collection && lhs.value == rhs.value; + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(b_dbpointer const& lhs, b_dbpointer const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "JavaScript Code". /// /// @attention This feature is experimental! It is not ready for use! /// -struct b_code {}; +struct b_code { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_code; + + /// + /// The represented value. + /// + v1::stdx::string_view code; + + /// + /// Zero-initialize the represented value. + /// + b_code() = default; + + /// + /// Initialize with `code`. + /// + explicit b_code(v1::stdx::string_view code) : code{code} {} + + /// + /// Implicitly convert to @ref code. + /// + /* explicit(false) */ operator v1::stdx::string_view() const { + return code; + } + + /// + /// Equivalent to `lhs.code == rhs.code`. + /// + friend bool operator==(b_code const& lhs, b_code const& rhs) { + return lhs.code == rhs.code; + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(b_code const& lhs, b_code const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "Symbol". /// +/// @deprecated This BSON type is deprecated. +/// /// @attention This feature is experimental! It is not ready for use! /// -struct b_symbol {}; +struct b_symbol { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_symbol; + + /// + /// The represented value. + /// + v1::stdx::string_view symbol; + + /// + /// Zero-initialize the represented value. + /// + b_symbol() = default; + + /// + /// Initialize with `symbol`. + /// + explicit b_symbol(v1::stdx::string_view symbol) : symbol{symbol} {} + + /// + /// Implicitly convert to @ref symbol. + /// + /* explicit(false) */ operator v1::stdx::string_view() const { + return symbol; + } + + /// + /// Equivalent to `lhs.symbol == rhs.symbol`. + /// + friend bool operator==(b_symbol const& lhs, b_symbol const& rhs) { + return lhs.symbol == rhs.symbol; + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(b_symbol const& lhs, b_symbol const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "JavaScript Code With Scope". /// +/// @deprecated This BSON type is deprecated. +/// /// @attention This feature is experimental! It is not ready for use! /// -struct b_codewscope {}; +struct b_codewscope { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_codewscope; + + /// + /// The represented value's "$code" component. + /// + v1::stdx::string_view code; + + /// + /// The represented value's "$scope" component. + /// + v1::document::view scope; + + /// + /// Zero-initialize the represented value. + /// + b_codewscope() = default; + + /// + /// Initialize with `code` and `scope`. + /// + b_codewscope(v1::stdx::string_view code, v1::document::view scope) : code{code}, scope{scope} {} + + /// + /// Equivalent to `lhs.code == rhs.code && lhs.scope == rhs.scope`. + /// + friend bool operator==(b_codewscope const& lhs, b_codewscope const& rhs) { + return lhs.code == rhs.code && lhs.scope == rhs.scope; + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(b_codewscope const& lhs, b_codewscope const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "32-bit Integer". /// /// @attention This feature is experimental! It is not ready for use! /// -struct b_int32 {}; +struct b_int32 { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_int32; + + /// + /// The represented value. + /// + std::int32_t value = {}; + + /// + /// Zero-initialize the represented value. + /// + b_int32() = default; + + /// + /// Initialize with `value`. + /// + explicit b_int32(std::int32_t value) : value{value} {} + + /// + /// Implicitly convert to @ref value. + /// + /* explicit(false) */ operator std::int32_t() const { + return value; + } + + /// + /// Equivalent to `lhs.value == rhs.value`. + /// + friend bool operator==(b_int32 const& lhs, b_int32 const& rhs) { + return lhs.value == rhs.value; + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(b_int32 const& lhs, b_int32 const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "Timestamp". /// /// @attention This feature is experimental! It is not ready for use! /// -struct b_timestamp {}; +struct b_timestamp { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_timestamp; + + /// + /// The represented value's "i" component. + /// + std::uint32_t increment = {}; + + /// + /// The represented value's "t" component. + /// + std::uint32_t timestamp = {}; + + /// + /// Zero-initialize the represented value. + /// + b_timestamp() = default; + + /// + /// Initialize with `increment` and `timestamp`. + /// + b_timestamp(std::uint32_t increment, std::uint32_t timestamp) : increment{increment}, timestamp{timestamp} {} + + /// + /// Equivalent to `lhs.timestamp == rhs.timestamp`. + /// + friend bool operator==(b_timestamp const& lhs, b_timestamp const& rhs) { + return lhs.timestamp == rhs.timestamp; + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(b_timestamp const& lhs, b_timestamp const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "64-bit Integer". /// /// @attention This feature is experimental! It is not ready for use! /// -struct b_int64 {}; +struct b_int64 { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_int64; + + /// + /// The represented value. + /// + std::int64_t value = {}; + + /// + /// Zero-initialize the represented value. + /// + b_int64() = default; + + /// + /// Initialize with `value`. + /// + explicit b_int64(std::int64_t value) : value{value} {} + + /// + /// Implicitly convert to @ref value. + /// + /* explicit(false) */ operator std::int64_t() const { + return value; + } + + /// + /// Equivalent to `lhs.value == rhs.value`. + /// + friend bool operator==(b_int64 const& lhs, b_int64 const& rhs) { + return lhs.value == rhs.value; + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(b_int64 const& lhs, b_int64 const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "Decimal128". /// /// @attention This feature is experimental! It is not ready for use! /// -struct b_decimal128 {}; +struct b_decimal128 { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_decimal128; + + /// + /// The represented value. + /// + v1::decimal128 value; + + /// + /// Zero-initialize the represented value. + /// + b_decimal128() = default; + + /// + /// Initialize with `value`. + /// + explicit b_decimal128(v1::decimal128 value) : value{value} {} + + /// + /// Implicitly convert to @ref value. + /// + /* explicit(false) */ operator v1::decimal128() const { + return value; + } + + /// + /// Equivalent to `lhs.value == rhs.value`. + /// + friend bool operator==(b_decimal128 const& lhs, b_decimal128 const& rhs) { + return lhs.value == rhs.value; + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(b_decimal128 const& lhs, b_decimal128 const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "Max Key". /// /// @attention This feature is experimental! It is not ready for use! /// -struct b_maxkey {}; +struct b_maxkey { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_maxkey; + + /// + /// Return true. + /// + friend bool operator==(b_maxkey const&, b_maxkey const&) { + return true; + } + + /// + /// Return false. + /// + friend bool operator!=(b_maxkey const& lhs, b_maxkey const& rhs) { + return !(lhs == rhs); + } +}; /// /// BSON type value "Min Key". /// /// @attention This feature is experimental! It is not ready for use! /// -struct b_minkey {}; +struct b_minkey { + /// + /// The type represented by this BSON type value. + /// + static constexpr BSONCXX_ABI_EXPORT id type_id = id::k_minkey; + + /// + /// Return true. + /// + friend bool operator==(b_minkey const&, b_minkey const&) { + return true; + } + + /// + /// Return false. + /// + friend bool operator!=(b_minkey const& lhs, b_minkey const& rhs) { + return !(lhs == rhs); + } +}; + +// BSONCXX_V1_TYPES_XMACRO: update above. /// /// A non-owning, read-only union of BSON type values. @@ -179,7 +1075,174 @@ struct b_minkey {}; /// /// @attention This feature is experimental! It is not ready for use! /// -class view {}; +class view { + private: + id _id; + +#pragma push_macro("X") +#undef X +#define X(_name, _value) b_##_name _b_##_name; + + union { + BSONCXX_V1_TYPES_XMACRO(X) + }; +#pragma pop_macro("X") + + template + using is_view = detail::is_alike; + + template + struct is_equality_comparable_with + : detail::conjunction>, std::is_constructible> {}; + + public: + /// Initialize with @ref bsoncxx::v1::types::b_null. + view() : _id{id::k_null}, _b_null{} {} + +#pragma push_macro("X") +#undef X + // GCC 4.X misinterprets list-initialization of _b_##_name: "too many initializers". +#define X(_name, _value) \ + /* explicit(false) */ view(b_##_name v) : _id{v.type_id}, _b_##_name(v) {} + + /// + /// Implicitly convert `v`. + /// + /// @{ + BSONCXX_V1_TYPES_XMACRO(X) + /// @} + /// +#pragma pop_macro("X") + + /// + /// Return the type of the underlying BSON type value. + /// + id type_id() const { + return _id; + } + +#pragma push_macro("X") +#undef X +#define X(_name, _value) BSONCXX_ABI_EXPORT_CDECL(b_##_name) get_##_name() const; + + /// + /// Return the requested underlying BSON type value. + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::types::view::type_mismatch if the underlying + /// BSON type value does not match the requested type. + /// + /// @{ + BSONCXX_V1_TYPES_XMACRO(X) + /// @} + /// +#pragma pop_macro("X") + + /// + /// Compare equal when the underlying BSON type values have the same type and compare equal. + /// + /// Equivalent to: + /// ```cpp + /// lhs.type_id() == rhs.type_id() && lhs.get_type() == rhs.get_type() + /// ``` + /// where `get_type` is the correct name for the underlying BSON type values (e.g. `get_double()` when + /// `type_id() == bsoncxx::v1::types::id::k_double`). + /// + /// When the type of `lhs` and `rhs` compare equal but are not a supported value (not defined by @ref + /// BSONCXX_V1_TYPES_XMACRO), the result is always `true`. + /// + friend bool operator==(view const& lhs, view const& rhs) { + if (lhs.type_id() != rhs.type_id()) { + return false; + } + +#pragma push_macro("X") +#undef X +#define X(_name, _value) \ + case v1::types::id::k_##_name: \ + return lhs.get_##_name() == rhs.get_##_name(); + + switch (lhs.type_id()) { + BSONCXX_V1_TYPES_XMACRO(X) + + default: + return true; + } +#pragma pop_macro("X") + } + + /// + /// Equivalent to `!(lhs == rhs)`. + /// + friend bool operator!=(view const& lhs, view const& rhs) { + return !(lhs == rhs); + } + + /// + /// Equivalent to `v == e.type_view()`. + /// + /// @{ + friend bool operator==(view const& v, v1::element::view const& e) { + return v == e.type_view(); + } + + friend bool operator==(v1::element::view const& e, view const& v) { + return v == e.type_view(); + } + /// @} + /// + + /// + /// Equivalent to `!(v == e)`. + /// + /// @{ + friend bool operator!=(view const& v, v1::element::view const& e) { + return !(v == e); + } + + friend bool operator!=(v1::element::view const& e, view const& v) { + return !(v == e); + } + /// @} + /// + + /// + /// Equivalent to `v == bsoncxx::v1::types::view{value}`. + /// + /// @par Constraints: + /// - `T` is not @ref bsoncxx::v1::types::view. + /// - @ref bsoncxx::v1::types::view is constructible with `T`. + /// + /// @{ + template ::value>* = nullptr> + friend bool operator==(view const& v, T const& value) { + return v == view{BSONCXX_PRIVATE_FWD(value)}; + } + + template ::value>* = nullptr> + friend bool operator==(T const& value, view const& v) { + return v == view{BSONCXX_PRIVATE_FWD(value)}; + } + /// @} + /// + + /// + /// Equivalent to `!(v == value)`. + /// + /// @{ + template ::value>* = nullptr> + friend bool operator!=(view const& v, T const& value) { + return !(v == value); + } + + template ::value>* = nullptr> + friend bool operator!=(T const& value, view const& v) { + return !(v == value); + } + /// @} + /// + + class internal; +}; } // namespace types } // namespace v1 @@ -193,3 +1256,10 @@ class view {}; /// /// @note A "BSON type value" refers to the value of a BSON element without its key. /// +/// @par Includes +/// - @ref bsoncxx/v1/array/view.hpp +/// - @ref bsoncxx/v1/decimal128.hpp +/// - @ref bsoncxx/v1/document/view.hpp +/// - @ref bsoncxx/v1/oid.hpp +/// - @ref bsoncxx/v1/types/id.hpp +/// diff --git a/src/bsoncxx/lib/bsoncxx/private/type_traits.hh b/src/bsoncxx/lib/bsoncxx/private/type_traits.hh index 4d993ccd21..6f9205932c 100644 --- a/src/bsoncxx/lib/bsoncxx/private/type_traits.hh +++ b/src/bsoncxx/lib/bsoncxx/private/type_traits.hh @@ -68,11 +68,19 @@ struct is_regular : detail::conjunction, detail::is_equality_c // Equivalent to `is_trivial` without requiring trivial default constructibility. template -struct is_semitrivial : detail::conjunction< - std::is_trivially_destructible, - std::is_trivially_move_constructible, - std::is_trivially_move_assignable, - std::is_trivially_copy_constructible, - std::is_trivially_copy_assignable> {}; +struct is_semitrivial +// https://gcc.gnu.org/onlinedocs/gcc-4.9.0/libstdc++/manual/manual/status.html +#if defined(__GNUC__) && (__GNUC__ < 5) && !defined(__clang__) + : std::true_type +#else + : detail::conjunction< + std::is_trivially_destructible, + std::is_trivially_move_constructible, + std::is_trivially_move_assignable, + std::is_trivially_copy_constructible, + std::is_trivially_copy_assignable> +#endif +{ +}; } // namespace bsoncxx diff --git a/src/bsoncxx/lib/bsoncxx/v1/array/value.cpp b/src/bsoncxx/lib/bsoncxx/v1/array/value.cpp index d7e80e8ede..9799f052d7 100644 --- a/src/bsoncxx/lib/bsoncxx/v1/array/value.cpp +++ b/src/bsoncxx/lib/bsoncxx/v1/array/value.cpp @@ -13,3 +13,18 @@ // limitations under the License. #include + +// + +#include + +namespace bsoncxx { +namespace v1 { +namespace array { + +static_assert(is_regular::value, "bsoncxx::v1::array::value must be regular"); +static_assert(is_nothrow_moveable::value, "bsoncxx::v1::array::value must be nothrow moveable"); + +} // namespace array +} // namespace v1 +} // namespace bsoncxx diff --git a/src/bsoncxx/lib/bsoncxx/v1/array/view.cpp b/src/bsoncxx/lib/bsoncxx/v1/array/view.cpp index 8eafdc8eb8..898e9e4a02 100644 --- a/src/bsoncxx/lib/bsoncxx/v1/array/view.cpp +++ b/src/bsoncxx/lib/bsoncxx/v1/array/view.cpp @@ -13,3 +13,23 @@ // limitations under the License. #include + +// + +#include + +namespace bsoncxx { +namespace v1 { +namespace array { + +static_assert(is_regular::value, "bsoncxx::v1::array::view must be regular"); +static_assert(is_semitrivial::value, "bsoncxx::v1::array::view must be semitrivial"); + +static_assert(is_regular::value, "bsoncxx::v1::array::view::const_iterator must be regular"); +static_assert( + is_nothrow_moveable::value, + "bsoncxx::v1::array::view::const_iterator must be nothrow moveable"); + +} // namespace array +} // namespace v1 +} // namespace bsoncxx diff --git a/src/bsoncxx/lib/bsoncxx/v1/decimal128.cpp b/src/bsoncxx/lib/bsoncxx/v1/decimal128.cpp index e2c2d465b4..981a0975be 100644 --- a/src/bsoncxx/lib/bsoncxx/v1/decimal128.cpp +++ b/src/bsoncxx/lib/bsoncxx/v1/decimal128.cpp @@ -13,3 +13,16 @@ // limitations under the License. #include + +// + +#include + +namespace bsoncxx { +namespace v1 { + +static_assert(is_regular::value, "bsoncxx::v1::decimal128 must be regular"); +static_assert(is_semitrivial::value, "bsoncxx::v1::decimal128 must be semitrivial"); + +} // namespace v1 +} // namespace bsoncxx diff --git a/src/bsoncxx/lib/bsoncxx/v1/document/value.cpp b/src/bsoncxx/lib/bsoncxx/v1/document/value.cpp index 04d1e03673..83db595903 100644 --- a/src/bsoncxx/lib/bsoncxx/v1/document/value.cpp +++ b/src/bsoncxx/lib/bsoncxx/v1/document/value.cpp @@ -13,3 +13,18 @@ // limitations under the License. #include + +// + +#include + +namespace bsoncxx { +namespace v1 { +namespace document { + +static_assert(is_regular::value, "bsoncxx::v1::document::value must be regular"); +static_assert(is_nothrow_moveable::value, "bsoncxx::v1::document::value must be nothrow moveable"); + +} // namespace document +} // namespace v1 +} // namespace bsoncxx diff --git a/src/bsoncxx/lib/bsoncxx/v1/document/view.cpp b/src/bsoncxx/lib/bsoncxx/v1/document/view.cpp index 949f6a95eb..a8c878016d 100644 --- a/src/bsoncxx/lib/bsoncxx/v1/document/view.cpp +++ b/src/bsoncxx/lib/bsoncxx/v1/document/view.cpp @@ -13,3 +13,23 @@ // limitations under the License. #include + +// + +#include + +namespace bsoncxx { +namespace v1 { +namespace document { + +static_assert(is_regular::value, "bsoncxx::v1::document::view must be regular"); +static_assert(is_semitrivial::value, "bsoncxx::v1::document::view must be semitrivial"); + +static_assert(is_regular::value, "bsoncxx::v1::document::view::const_iterator must be regular"); +static_assert( + is_nothrow_moveable::value, + "bsoncxx::v1::document::view::const_iterator must be nothrow moveable"); + +} // namespace document +} // namespace v1 +} // namespace bsoncxx diff --git a/src/bsoncxx/lib/bsoncxx/v1/element/view.cpp b/src/bsoncxx/lib/bsoncxx/v1/element/view.cpp index 9f7b1fac53..a19fba1bc6 100644 --- a/src/bsoncxx/lib/bsoncxx/v1/element/view.cpp +++ b/src/bsoncxx/lib/bsoncxx/v1/element/view.cpp @@ -13,3 +13,18 @@ // limitations under the License. #include + +// + +#include + +namespace bsoncxx { +namespace v1 { +namespace element { + +static_assert(is_regular::value, "bsoncxx::v1::element::view must be regular"); +static_assert(is_nothrow_moveable::value, "bsoncxx::v1::element::view must be nothrow moveable"); + +} // namespace element +} // namespace v1 +} // namespace bsoncxx diff --git a/src/bsoncxx/lib/bsoncxx/v1/exception.cpp b/src/bsoncxx/lib/bsoncxx/v1/exception.cpp index 50b176a8a8..07900b8c77 100644 --- a/src/bsoncxx/lib/bsoncxx/v1/exception.cpp +++ b/src/bsoncxx/lib/bsoncxx/v1/exception.cpp @@ -13,3 +13,13 @@ // limitations under the License. #include + +// + +namespace bsoncxx { +namespace v1 { + +exception::~exception() = default; + +} // namespace v1 +} // namespace bsoncxx diff --git a/src/bsoncxx/lib/bsoncxx/v1/oid.cpp b/src/bsoncxx/lib/bsoncxx/v1/oid.cpp index cfa9b0e6af..9bf5da8ef0 100644 --- a/src/bsoncxx/lib/bsoncxx/v1/oid.cpp +++ b/src/bsoncxx/lib/bsoncxx/v1/oid.cpp @@ -13,3 +13,16 @@ // limitations under the License. #include + +// + +#include + +namespace bsoncxx { +namespace v1 { + +static_assert(is_regular::value, "bsoncxx::v1::oid must be regular"); +static_assert(is_semitrivial::value, "bsoncxx::v1::oid must be semitrivial"); + +} // namespace v1 +} // namespace bsoncxx diff --git a/src/bsoncxx/lib/bsoncxx/v1/types/value.cpp b/src/bsoncxx/lib/bsoncxx/v1/types/value.cpp index 2a04af19a0..8dd7dc8c97 100644 --- a/src/bsoncxx/lib/bsoncxx/v1/types/value.cpp +++ b/src/bsoncxx/lib/bsoncxx/v1/types/value.cpp @@ -13,3 +13,18 @@ // limitations under the License. #include + +// + +#include + +namespace bsoncxx { +namespace v1 { +namespace types { + +static_assert(is_regular::value, "bsoncxx::v1::types::value must be regular"); +static_assert(is_nothrow_moveable::value, "bsoncxx::v1::types::value must be nothrow moveable"); + +} // namespace types +} // namespace v1 +} // namespace bsoncxx diff --git a/src/bsoncxx/lib/bsoncxx/v1/types/view.cpp b/src/bsoncxx/lib/bsoncxx/v1/types/view.cpp index c57193c1c5..cce4161d2f 100644 --- a/src/bsoncxx/lib/bsoncxx/v1/types/view.cpp +++ b/src/bsoncxx/lib/bsoncxx/v1/types/view.cpp @@ -13,3 +13,27 @@ // limitations under the License. #include + +// + +#include + +namespace bsoncxx { +namespace v1 { +namespace types { + +#pragma push_macro("X") +#undef X +#define X(_name, _value) \ + static_assert(is_regular::value, "bsoncxx::v1::types::b_" #_name " must be regular"); \ + static_assert(is_semitrivial::value, "bsoncxx::v1::types::b_" #_name " must be semitrivial"); + +BSONCXX_V1_TYPES_XMACRO(X) +#pragma pop_macro("X") + +static_assert(is_regular::value, "bsoncxx::v1::types::view must be regular"); +static_assert(is_semitrivial::value, "bsoncxx::v1::types::view must be semitrivial"); + +} // namespace types +} // namespace v1 +} // namespace bsoncxx From 7451133264400b2a69f16791d32b63fa4b823df6 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Mon, 2 Jun 2025 09:36:47 -0500 Subject: [PATCH 02/42] Use copydoc for v1::array::view iterators --- src/bsoncxx/include/bsoncxx/v1/array/view.hpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp index 751ce405f6..3fff07a0b7 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp @@ -49,14 +49,10 @@ namespace array { /// class view { public: - /// - /// Equivalent to @ref const_iterator. - /// + /// @copydoc v1::document::view::const_iterator using const_iterator = v1::document::view::const_iterator; - /// - /// Equivalent to @ref const_iterator. - /// + /// @copydoc v1::document::view::iterator using iterator = const_iterator; private: From a5b2cdeeba02fe970bbbcfa8aa01d1c23808c74a Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Mon, 2 Jun 2025 09:37:17 -0500 Subject: [PATCH 03/42] Rename Legacy -> Cpp17 for consistency with C++20 spec --- src/bsoncxx/include/bsoncxx/v1/document/view.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp index c1a94aadca..ce4f81d7c6 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp @@ -245,9 +245,9 @@ class view { /// /// A const iterator over the elements of a view. /// -/// @note This iterator almost satisfies LegacyForwardIterator, but `std::iterator_traits::reference` is defined as +/// @note This iterator almost satisfies Cpp17ForwardIterator, but `std::iterator_traits::reference` is defined as /// `value_type`, similar to `std::vector::iterator` and `std::istreambuf_iterator`. Therefore, this iterator -/// only fully satisfies LegacyInputIterator. +/// only fully satisfies Cpp17InputIterator. /// /// @attention This feature is experimental! It is not ready for use! /// From 5c06c49f15318e48c5d45f10bb6dc41a3ff386be Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Mon, 23 Jun 2025 12:42:48 -0500 Subject: [PATCH 04/42] Apply "cheap-to-copy" heuristic to pass-by-value parameters --- src/bsoncxx/include/bsoncxx/v1/array/value.hpp | 8 ++++---- src/bsoncxx/include/bsoncxx/v1/array/view.hpp | 8 ++++---- src/bsoncxx/include/bsoncxx/v1/document/value.hpp | 10 +++++----- src/bsoncxx/include/bsoncxx/v1/document/view.hpp | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/array/value.hpp b/src/bsoncxx/include/bsoncxx/v1/array/value.hpp index 00ca2db62a..5317e51f8d 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/value.hpp @@ -97,7 +97,7 @@ class value { /// @copydoc v1::document::value::value(v1::document::value::unique_ptr_type ptr, std::size_t length) value(unique_ptr_type ptr, std::size_t length) : _value{std::move(ptr), length} {} - /// @copydoc v1::document::value::value(v1::document::view const& view) + /// @copydoc v1::document::value::value(v1::document::view view) explicit value(v1::array::view view) : _value{view} {} /// @copydoc v1::document::value::get_deleter() const @@ -115,7 +115,7 @@ class value { _value = std::move(v._value); } - /// @copydoc v1::document::value::reset(v1::document::view const& v) + /// @copydoc v1::document::value::reset(v1::document::view v) void reset(v1::array::view v) { *this = value{v}; } @@ -189,12 +189,12 @@ class value { return this->view().operator bool(); } - /// @copydoc v1::array::view::operator==(v1::array::view const& lhs, v1::array::view const& rhs) + /// @copydoc v1::array::view::operator==(v1::array::view lhs, v1::array::view rhs) friend bool operator==(value const& lhs, value const& rhs) { return lhs.view() == rhs.view(); } - /// @copydoc v1::array::view::operator!=(v1::array::view const& lhs, v1::array::view const& rhs) + /// @copydoc v1::array::view::operator!=(v1::array::view lhs, v1::array::view rhs) friend bool operator!=(value const& lhs, value const& rhs) { return !(lhs == rhs); } diff --git a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp index 3fff07a0b7..fa2f2d2c38 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp @@ -130,13 +130,13 @@ class view { return _view; } - /// @copydoc v1::document::view::operator==(v1::document::view const& lhs, v1::document::view const& rhs) - friend bool operator==(view const& lhs, view const& rhs) { + /// @copydoc v1::document::view::operator==(v1::document::view lhs, v1::document::view rhs) + friend bool operator==(view lhs, view rhs) { return lhs._view == rhs._view; } - /// @copydoc v1::document::view::operator!=(v1::document::view const& lhs, v1::document::view const& rhs) - friend bool operator!=(view const& lhs, view const& rhs) { + /// @copydoc v1::document::view::operator!=(v1::document::view lhs, v1::document::view rhs) + friend bool operator!=(view lhs, view rhs) { return !(lhs == rhs); } }; diff --git a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp index d8a3705332..897720816b 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp @@ -85,7 +85,7 @@ class value { struct has_to_bson : detail::conjunction>, detail::is_detected> {}; template - using from_bson_expr = decltype(from_bson(std::declval(), std::declval())); + using from_bson_expr = decltype(from_bson(std::declval(), std::declval())); template struct has_from_bson : detail::conjunction>, detail::is_detected> { @@ -208,7 +208,7 @@ class value { /// The copied value is allocated using `operator new[]` and the deleter is set to @ref /// default_deleter_type. /// - explicit value(v1::document::view const& view) + explicit value(v1::document::view view) : _data{view ? unique_ptr_type{new std::uint8_t[view.size()], default_deleter_type{}} : unique_ptr_type{}}, _length{view ? view.size() : 0u} { if (view) { @@ -300,7 +300,7 @@ class value { /// The copied value is allocated using `operator new[]` and the deleter is set to @ref /// default_deleter_type. /// - void reset(v1::document::view const& v) { + void reset(v1::document::view v) { *this = value{v}; } @@ -373,12 +373,12 @@ class value { return this->view().operator bool(); } - /// @copydoc v1::document::view::operator==(v1::document::view const& lhs, v1::document::view const& rhs) + /// @copydoc v1::document::view::operator==(v1::document::view lhs, v1::document::view rhs) friend bool operator==(value const& lhs, value const& rhs) { return lhs.view() == rhs.view(); } - /// @copydoc v1::document::view::operator!=(v1::document::view const& lhs, v1::document::view const& rhs) + /// @copydoc v1::document::view::operator!=(v1::document::view lhs, v1::document::view rhs) friend bool operator!=(value const& lhs, value const& rhs) { return !(lhs == rhs); } diff --git a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp index ce4f81d7c6..5e3e6b3d88 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp @@ -227,7 +227,7 @@ class view { /// for an invalid document. /// /// @{ - friend bool operator==(view const& lhs, view const& rhs) { + friend bool operator==(view lhs, view rhs) { if (!lhs != !rhs) { return false; } @@ -235,7 +235,7 @@ class view { return !lhs || (lhs.length() == rhs.length() && std::memcmp(lhs.data(), rhs.data(), lhs.length()) == 0); } - friend bool operator!=(view const& lhs, view const& rhs) { + friend bool operator!=(view lhs, view rhs) { return !(lhs == rhs); } /// @} From dd8be8cf42c42c7d666c464fd90ff2c285256705 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Mon, 23 Jun 2025 12:42:48 -0500 Subject: [PATCH 05/42] Remove extraneous include doc entry --- src/bsoncxx/include/bsoncxx/v1/array/value.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/array/value.hpp b/src/bsoncxx/include/bsoncxx/v1/array/value.hpp index 5317e51f8d..3c6e4da3ab 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/value.hpp @@ -213,5 +213,4 @@ class value { /// @par Includes /// - @ref bsoncxx/v1/array/view.hpp /// - @ref bsoncxx/v1/document/value.hpp -/// - @ref bsoncxx/v1/element/view.hpp /// From 268ddd6621cf7bb85d4f7a8b52a7d9fd04380bad Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Mon, 23 Jun 2025 12:42:48 -0500 Subject: [PATCH 06/42] Reword "BSON binary data" -> "BSON bytes" --- .../include/bsoncxx/v1/array/value.hpp | 2 +- src/bsoncxx/include/bsoncxx/v1/array/view.hpp | 8 +++--- .../include/bsoncxx/v1/document/value.hpp | 18 ++++++------ .../include/bsoncxx/v1/document/view.hpp | 28 +++++++++---------- .../include/bsoncxx/v1/element/view.hpp | 22 +++++++-------- 5 files changed, 39 insertions(+), 39 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/array/value.hpp b/src/bsoncxx/include/bsoncxx/v1/array/value.hpp index 3c6e4da3ab..6e918e1ee8 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/value.hpp @@ -121,7 +121,7 @@ class value { } /// - /// Return a view of the BSON binary data as an array. + /// Return a view of the BSON bytes as an array. /// v1::array::view view() const { return {_value.data(), _value.size()}; diff --git a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp index fa2f2d2c38..16027f94e3 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp @@ -41,9 +41,9 @@ namespace array { /// - @ref data() is not null, and /// - @ref size() is not less than `5` (the minimum size of a BSON document). /// -/// The BSON binary data being represented is only validated as minimally required to satisfy a requested operation. -/// When an operation is not satisfiable due to invalid data, the operation will throw an @ref bsoncxx::v1::exception -/// with @ref bsoncxx::v1::error::document::view::invalid_data. +/// The BSON bytes being represented is only validated as minimally required to satisfy a requested operation. When an +/// operation is not satisfiable due to invalid data, the operation will throw an @ref bsoncxx::v1::exception with @ref +/// bsoncxx::v1::error::document::view::invalid_data. /// /// @attention This feature is experimental! It is not ready for use! /// @@ -114,7 +114,7 @@ class view { /// If this view is invalid, returns an end iterator. /// /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation - /// failed due to invalid BSON binary data. + /// failed due to invalid BSON bytes. /// BSONCXX_ABI_EXPORT_CDECL(const_iterator) find(std::uint32_t i) const; diff --git a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp index 897720816b..d643bfe36a 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp @@ -44,7 +44,7 @@ namespace document { class value { public: /// - /// The type of the deleter used to free the underlying BSON binary data. + /// The type of the deleter used to free the underlying BSON bytes. /// /// A deleter `D` that is wrapped by @ref deleter_type must: /// @@ -62,12 +62,12 @@ class value { using deleter_type = std::function; /// - /// The deleter used to free copied BSON binary data when a user-provided deleter is not specified. + /// The deleter used to free copied BSON bytes when a user-provided deleter is not specified. /// using default_deleter_type = std::default_delete; /// - /// The type of the unique pointer used to manage the underlying BSON binary data. + /// The type of the unique pointer used to manage the underlying BSON bytes. /// using unique_ptr_type = std::unique_ptr; @@ -161,7 +161,7 @@ class value { } /// - /// Initialize without any underlying BSON binary data or deleter. + /// Initialize without any underlying BSON bytes or deleter. /// /// @par Postconditions: /// - `this->data() == nullptr` @@ -201,7 +201,7 @@ class value { value(unique_ptr_type ptr, std::size_t length) : _data{std::move(ptr)}, _length{length} {} /// - /// Initialize with a copy of the BSON binary data referenced by `view`. + /// Initialize with a copy of the BSON bytes referenced by `view`. /// /// If `view` is invalid, this value is default-initialized. /// @@ -278,7 +278,7 @@ class value { } /// - /// Release ownership of the underlying BSON binary data. + /// Release ownership of the underlying BSON bytes. /// unique_ptr_type release() { _length = 0u; @@ -286,14 +286,14 @@ class value { } /// - /// Replace the underlying BSON binary data with `v`. + /// Replace the underlying BSON bytes with `v`. /// void reset(value v) { *this = std::move(v); } /// - /// Replace the underlying BSON binary data with a copy of `v`. + /// Replace the underlying BSON bytes with a copy of `v`. /// /// If `v` is invalid, reset to a default-initialized value. /// @@ -305,7 +305,7 @@ class value { } /// - /// Return a view of the BSON binary data as a document. + /// Return a view of the BSON bytes as a document. /// v1::document::view view() const { return {_data.get(), _length}; diff --git a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp index 5e3e6b3d88..a14402c8fd 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp @@ -106,9 +106,9 @@ namespace document { /// - @ref data() is not null, and /// - @ref size() is not less than `5` (the minimum size of a BSON document). /// -/// The BSON binary data being represented is only validated as minimally required to satisfy a requested operation. -/// When an operation is not satisfiable due to invalid data, the operation will throw an @ref bsoncxx::v1::exception -/// with @ref bsoncxx::v1::error::document::view::invalid_data. +/// The BSON bytes being represented is only validated as minimally required to satisfy a requested operation. When an +/// operation is not satisfiable due to invalid data, the operation will throw an @ref bsoncxx::v1::exception with @ref +/// bsoncxx::v1::error::document::view::invalid_data. /// /// @attention This feature is experimental! It is not ready for use! /// @@ -139,7 +139,7 @@ class view { BSONCXX_ABI_EXPORT_CDECL() view(); /// - /// Initialize with the given BSON binary data. + /// Initialize with the given BSON bytes. /// /// @par Preconditions: /// - `length` must be less than or equal to the storage region pointed to by `data`. @@ -147,17 +147,17 @@ class view { view(std::uint8_t const* data, std::size_t length) : _data(data), _length(length) {} /// - /// Return a pointer to the BSON binary data being represented. + /// Return a pointer to the BSON bytes being represented. /// std::uint8_t const* data() const { return _data; } /// - /// Return the length of the BSON binary data being represented. + /// Return the length of the BSON bytes being represented. /// - /// @note This returns the length as specified during initialization, not the length of the BSON binary data as - /// indicated by the BSON binary data itself. + /// @note This returns the length as specified during initialization, not the length of the BSON bytes as + /// indicated by the BSON bytes itself. /// std::size_t size() const { return _length; @@ -169,7 +169,7 @@ class view { } /// - /// Return true when the BSON binary data represents an empty view. + /// Return true when the BSON bytes represents an empty view. /// /// @note This does not return true when this view is invalid. /// @@ -180,7 +180,7 @@ class view { /// /// Return true when this view is valid. /// - /// @note This does not validate the BSON binary data being represented. + /// @note This does not validate the BSON bytes being represented. /// explicit operator bool() const { return _data && _length >= _empty_length; @@ -192,7 +192,7 @@ class view { /// If this view is invalid, returns an end iterator. /// /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation - /// failed due to invalid BSON binary data. + /// failed due to invalid BSON bytes. /// BSONCXX_ABI_EXPORT_CDECL(const_iterator) cbegin() const; @@ -213,7 +213,7 @@ class view { /// If this view is invalid, returns an end iterator. /// /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation - /// failed due to invalid BSON binary data. + /// failed due to invalid BSON bytes. /// BSONCXX_ABI_EXPORT_CDECL(const_iterator) find(v1::stdx::string_view key) const; @@ -221,9 +221,9 @@ class view { v1::element::view operator[](v1::stdx::string_view key) const; /// - /// Compare equal when the BSON binary data represented by `lhs` and `rhs` compare equal. + /// Compare equal when the BSON bytes represented by `lhs` and `rhs` compare equal. /// - /// An invalid view only compares equal to another invalid view. The underlying BSON binary data (if any) is ignored + /// An invalid view only compares equal to another invalid view. The underlying BSON bytes (if any) is ignored /// for an invalid document. /// /// @{ diff --git a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp index 53769a74f2..b432868b8e 100644 --- a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp @@ -139,7 +139,7 @@ namespace element { /// else {} // Field "x" is missing. /// ``` /// -/// The BSON binary data being represented is only validated as minimally required to satisfy a requested operation. +/// The BSON bytes being represented is only validated as minimally required to satisfy a requested operation. /// When an operation is not satisfiable due to invalid data, the operation will throw an @ref bsoncxx::v1::exception /// with @ref bsoncxx::v1::error::document::view::invalid_data. /// @@ -174,40 +174,40 @@ class view { BSONCXX_ABI_EXPORT_CDECL(view&) operator=(view const& other) noexcept; /// - /// Initialize as an invalid element without any associated BSON binary data. + /// Initialize as an invalid element without any associated BSON bytes. /// BSONCXX_ABI_EXPORT_CDECL() view(); /// /// Return true when this is a valid element. /// - /// @note This does not validate the BSON binary data being represented. + /// @note This does not validate the BSON bytes being represented. /// explicit BSONCXX_ABI_EXPORT_CDECL() operator bool() const; /// - /// Return the "raw" component of the underlying BSON binary data. + /// Return the "raw" component of the underlying BSON bytes. /// /// The value is unspecified when this element is invalid. /// BSONCXX_ABI_EXPORT_CDECL(std::uint8_t const*) raw() const; /// - /// Return the "length" component of the underlying BSON binary data. + /// Return the "length" component of the underlying BSON bytes. /// /// The value is unspecified when this element is invalid. /// BSONCXX_ABI_EXPORT_CDECL(std::uint32_t) length() const; /// - /// Return the "offset" component of the underlying BSON binary data. + /// Return the "offset" component of the underlying BSON bytes. /// /// The value is unspecified when this element is invalid. /// BSONCXX_ABI_EXPORT_CDECL(std::uint32_t) offset() const; /// - /// Return the "keylen" component of the underlying BSON binary data. + /// Return the "keylen" component of the underlying BSON bytes. /// /// The value is unspecified when this element is invalid. /// @@ -269,7 +269,7 @@ class view { /// @returns An invalid element if the requested field does not exist. /// /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_data if this operation - /// failed due to invalid BSON binary data. + /// failed due to invalid BSON bytes. /// /// @{ BSONCXX_ABI_EXPORT_CDECL(v1::element::view) operator[](v1::stdx::string_view key) const; @@ -278,10 +278,10 @@ class view { /// /// - /// Compare equal when `lhs` and `rhs` represent the same field within the same BSON binary data. + /// Compare equal when `lhs` and `rhs` represent the same field within the same BSON bytes. /// - /// An invalid element only compares equal to another invalid element. The underlying BSON binary data (if any) is - /// ignored for an invalid element. + /// An invalid element only compares equal to another invalid element. The underlying BSON bytes (if any) is ignored + /// for an invalid element. /// friend bool operator==(view const& lhs, view const& rhs) { if (!lhs != !rhs) { From f1ac5f38f17932fcbf14f45f5308154cbb9e34d9 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Mon, 23 Jun 2025 12:42:49 -0500 Subject: [PATCH 07/42] Document algorithmic complexity of element lookup --- src/bsoncxx/include/bsoncxx/v1/array/view.hpp | 5 ++++- src/bsoncxx/include/bsoncxx/v1/document/view.hpp | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp index 16027f94e3..316dc3711b 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp @@ -111,7 +111,10 @@ class view { /// /// Return a const iterator to the element within the represented BSON array at index `i`. /// - /// If this view is invalid, returns an end iterator. + /// If this view is invalid or the requested field is not found, returns an end iterator. + /// + /// @par Complexity + /// Linear. /// /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation /// failed due to invalid BSON bytes. diff --git a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp index a14402c8fd..dc038b3fc8 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp @@ -210,7 +210,10 @@ class view { /// /// Return a const iterator to the element within the represented BSON document whose key compares equal to `key`. /// - /// If this view is invalid, returns an end iterator. + /// If this view is invalid or the requested field is not found, returns an end iterator. + /// + /// @par Complexity + /// Linear. /// /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation /// failed due to invalid BSON bytes. From d85e22f36d5e64eab3d77bb355bcd8d55d11e5eb Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Mon, 23 Jun 2025 12:42:49 -0500 Subject: [PATCH 08/42] Fix swapped documentation for BSON min/max key --- src/bsoncxx/include/bsoncxx/v1/types/id.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/types/id.hpp b/src/bsoncxx/include/bsoncxx/v1/types/id.hpp index 67838113df..1e22b9dc2b 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/id.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/id.hpp @@ -55,8 +55,8 @@ enum class id : std::uint8_t { k_timestamp = 0x11, ///< Timestamp. k_int64 = 0x12, ///< 64-bit integer. k_decimal128 = 0x13, ///< 128-bit decimal floating point. - k_maxkey = 0x7F, ///< Min key. - k_minkey = 0xFF, ///< Max key. + k_maxkey = 0x7F, ///< Max key. + k_minkey = 0xFF, ///< Min key. }; /// From aa5c4b330741ff2b46275de00c9c244cedc9aae8 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Mon, 23 Jun 2025 12:42:49 -0500 Subject: [PATCH 09/42] Fix documentation referencing size of pointed-to storage regions --- src/bsoncxx/include/bsoncxx/v1/document/value.hpp | 6 +++--- src/bsoncxx/include/bsoncxx/v1/document/view.hpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp index d643bfe36a..8de429ba63 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp @@ -177,7 +177,7 @@ class value { /// - `Deleter` must satisfy the requirements described by @ref deleter_type. /// /// @par Preconditions: - /// - `length` must be less than or equal to the storage region pointed to by `data`. + /// - `length` must be less than or equal to the size of the storage region pointed to by `data`. /// - `deleter` must be capable of freeing the storage region pointed to by `data`. /// template ::value>* = nullptr> @@ -187,7 +187,7 @@ class value { /// Initialize as owning `data` which will be freed with @ref default_deleter_type. /// /// @par Preconditions: - /// - `length` must be less than or equal to the storage region pointed to by `data`. + /// - `length` must be less than or equal to the size of the storage region pointed to by `data`. /// - `deleter` must be capable of freeing the storage region pointed to by `data`. /// value(std::uint8_t* data, std::size_t length) : value{data, length, default_deleter_type{}} {} @@ -196,7 +196,7 @@ class value { /// Initialize as owning `ptr`. /// /// @par Preconditions: - /// - `length` must be less than or equal to the storage region pointed to by `data`. + /// - `length` must be less than or equal to the size of the storage region pointed to by `data`. /// value(unique_ptr_type ptr, std::size_t length) : _data{std::move(ptr)}, _length{length} {} diff --git a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp index dc038b3fc8..ff113cbf36 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp @@ -142,7 +142,7 @@ class view { /// Initialize with the given BSON bytes. /// /// @par Preconditions: - /// - `length` must be less than or equal to the storage region pointed to by `data`. + /// - `length` must be less than or equal to the size of the storage region pointed to by `data`. /// view(std::uint8_t const* data, std::size_t length) : _data(data), _length(length) {} From fadc090af365b65c09c8a3eda69286697267fc30 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Mon, 23 Jun 2025 12:42:50 -0500 Subject: [PATCH 10/42] Improve accuracy of invalid element documentation --- src/bsoncxx/include/bsoncxx/v1/element/view.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp index b432868b8e..399a9a8f1d 100644 --- a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp @@ -112,8 +112,8 @@ namespace element { /// /// ```cpp /// a = doc["a"]; // If "a" exists, `a` is valid. Otherwise, `a` is invalid. -/// b = a["2"]; // If "a.b" exists and is a document, `b` is valid. Otherwise, `b` is invalid. -/// c = b[3]; // If "a.b.c" exists and is an array, `c` is valid. Otherwise, `c` is invalid. +/// b = a["b"]; // If "a" is a document and "a.b" exists, `b` is valid. Otherwise, `b` is invalid. +/// c = b[3]; // If "a.b" is an array and "a.b[3]" exists, `c` is valid. Otherwise, `c` is invalid. /// /// a.key(); // Throws an exception if invalid. /// b.type_id(); // Throws an exception if invalid. From 9f44ae6d097a350274a9f02150563ad10796b238 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Mon, 23 Jun 2025 12:42:50 -0500 Subject: [PATCH 11/42] Revert v1::element::view to be non-equality-comparable --- .../include/bsoncxx/v1/document/view.hpp | 18 +++++++++++++--- .../include/bsoncxx/v1/element/view.hpp | 21 ------------------- src/bsoncxx/lib/bsoncxx/v1/element/view.cpp | 2 +- 3 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp index ff113cbf36..e3906e9b11 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp @@ -325,12 +325,24 @@ class view::const_iterator { return tmp; } - /// @copydoc v1::element::view::operator==(v1::element::view const& lhs, v1::element::view const& rhs) + /// + /// Compare equal when `lhs` and `rhs` represent the same element within the same range of BSON bytes. + /// + /// An end iterator only compares equal to another end iterator. The underlying BSON bytes (if any) is ignored + /// for an end iterator. + /// friend bool operator==(const_iterator const& lhs, const_iterator const& rhs) { - return lhs._element == rhs._element; + if (!lhs._element != !rhs._element) { + return false; + } + + return !lhs._element || + (lhs._element.raw() == rhs._element.raw() && lhs._element.offset() == rhs._element.offset()); } - /// @copydoc v1::element::view::operator!=(v1::element::view const& lhs, v1::element::view const& rhs) + /// + /// Equivalent to `!(lhs == rhs)`. + /// friend bool operator!=(const_iterator const& lhs, const_iterator const& rhs) { return !(lhs == rhs); } diff --git a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp index 399a9a8f1d..a60162707d 100644 --- a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp @@ -277,27 +277,6 @@ class view { /// @} /// - /// - /// Compare equal when `lhs` and `rhs` represent the same field within the same BSON bytes. - /// - /// An invalid element only compares equal to another invalid element. The underlying BSON bytes (if any) is ignored - /// for an invalid element. - /// - friend bool operator==(view const& lhs, view const& rhs) { - if (!lhs != !rhs) { - return false; - } - - return !lhs || (lhs.raw() == rhs.raw() && lhs.offset() == rhs.offset()); - } - - /// - /// Equivalent to `!(lhs == rhs)`. - /// - friend bool operator!=(view const& lhs, view const& rhs) { - return !(lhs == rhs); - } - class internal; private: diff --git a/src/bsoncxx/lib/bsoncxx/v1/element/view.cpp b/src/bsoncxx/lib/bsoncxx/v1/element/view.cpp index a19fba1bc6..80d306f98d 100644 --- a/src/bsoncxx/lib/bsoncxx/v1/element/view.cpp +++ b/src/bsoncxx/lib/bsoncxx/v1/element/view.cpp @@ -22,7 +22,7 @@ namespace bsoncxx { namespace v1 { namespace element { -static_assert(is_regular::value, "bsoncxx::v1::element::view must be regular"); +static_assert(is_semiregular::value, "bsoncxx::v1::element::view must be semiregular"); static_assert(is_nothrow_moveable::value, "bsoncxx::v1::element::view must be nothrow moveable"); } // namespace element From 8dbd86120ab901dc8af8aaf532d104355c0b2248 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Mon, 23 Jun 2025 12:42:50 -0500 Subject: [PATCH 12/42] Change result of comparing unsupported types from "true" to "unspecified" --- src/bsoncxx/include/bsoncxx/v1/types/view.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/types/view.hpp b/src/bsoncxx/include/bsoncxx/v1/types/view.hpp index c514736f5b..825fe4386a 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/view.hpp @@ -1147,8 +1147,8 @@ class view { /// where `get_type` is the correct name for the underlying BSON type values (e.g. `get_double()` when /// `type_id() == bsoncxx::v1::types::id::k_double`). /// - /// When the type of `lhs` and `rhs` compare equal but are not a supported value (not defined by @ref - /// BSONCXX_V1_TYPES_XMACRO), the result is always `true`. + /// When either `lhs.type_id()` or `rhs.type_id()` return an unsupported value (not defined by @ref + /// bsoncxx::v1::types::id or handled by @ref BSONCXX_V1_TYPES_XMACRO), the result is unspecified. /// friend bool operator==(view const& lhs, view const& rhs) { if (lhs.type_id() != rhs.type_id()) { From b814afc76d9645c2fc3796610664c01398908c75 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Mon, 23 Jun 2025 13:32:24 -0500 Subject: [PATCH 13/42] Tweak wording: "represents" -> "point to" --- src/bsoncxx/include/bsoncxx/v1/document/view.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp index e3906e9b11..5f67933a88 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp @@ -326,7 +326,7 @@ class view::const_iterator { } /// - /// Compare equal when `lhs` and `rhs` represent the same element within the same range of BSON bytes. + /// Compare equal when `lhs` and `rhs` point to the same element within the same range of BSON bytes. /// /// An end iterator only compares equal to another end iterator. The underlying BSON bytes (if any) is ignored /// for an end iterator. From 011887cdd2d9782de2eeaabf65751b1a9319bd0b Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Fri, 27 Jun 2025 12:12:42 -0500 Subject: [PATCH 14/42] Make bsoncxx::v1::document::value default ctor explicit --- .../include/bsoncxx/v1/document/value.hpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp index 8de429ba63..7786fb69f2 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp @@ -168,7 +168,22 @@ class value { /// - `static_cast(this->get_deleter()) == false` /// - `this->size() == 0` /// - value() = default; + /// @note @parblock This constructor is explicit to support initialization as an empty BSON document via the @ref + /// bsoncxx::v1::document::value::value(bsoncxx::v1::document::view view) constructor using list-initialization + /// syntax: + /// + /// ```cpp + /// bsoncxx::v1::document::value doc({}); + /// + /// auto v = doc.view(); + /// + /// assert(v); // Valid. + /// assert(v.empty()); // Empty. + /// assert(v.data()); // Not null. + /// ``` + /// @endparblock + /// + explicit value() = default; /// /// Initialize as owning `data` which will be freed with `deleter`. From 5b34debf42a3aca552180154543a8da834b62613 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Thu, 3 Jul 2025 14:34:42 -0500 Subject: [PATCH 15/42] Tidy up include directives --- src/bsoncxx/include/bsoncxx/v1/array/value.hpp | 3 --- src/bsoncxx/include/bsoncxx/v1/array/view.hpp | 1 - src/bsoncxx/include/bsoncxx/v1/types/value.hpp | 1 - 3 files changed, 5 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/array/value.hpp b/src/bsoncxx/include/bsoncxx/v1/array/value.hpp index 6e918e1ee8..78f75dd8d6 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/value.hpp @@ -25,9 +25,6 @@ #include #include -#include -#include -#include #include #include diff --git a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp index 316dc3711b..b8a891bb63 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp @@ -26,7 +26,6 @@ #include #include -#include namespace bsoncxx { namespace v1 { diff --git a/src/bsoncxx/include/bsoncxx/v1/types/value.hpp b/src/bsoncxx/include/bsoncxx/v1/types/value.hpp index 21b6d5bf11..8c70589175 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/value.hpp @@ -34,7 +34,6 @@ #include #include #include -#include #include #include #include From c499de55ef0e12f0d2b80304ee00103e573f5c03 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Thu, 3 Jul 2025 14:34:45 -0500 Subject: [PATCH 16/42] Use std::array instead of C arrays --- src/bsoncxx/include/bsoncxx/v1/element/view.hpp | 3 ++- src/bsoncxx/include/bsoncxx/v1/types/value.hpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp index a60162707d..b275207bf2 100644 --- a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -149,7 +150,7 @@ class view { private: class impl; - alignas(BSONCXX_PRIVATE_MAX_ALIGN_T) unsigned char _storage[32]; + alignas(BSONCXX_PRIVATE_MAX_ALIGN_T) std::array _storage; public: /// diff --git a/src/bsoncxx/include/bsoncxx/v1/types/value.hpp b/src/bsoncxx/include/bsoncxx/v1/types/value.hpp index 8c70589175..68362efcdc 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/value.hpp @@ -31,6 +31,7 @@ #include #include +#include #include #include #include @@ -117,7 +118,7 @@ class value { private: class impl; - alignas(BSONCXX_PRIVATE_MAX_ALIGN_T) unsigned char _storage[32]; + alignas(BSONCXX_PRIVATE_MAX_ALIGN_T) std::array _storage; public: /// From cf4f1608d34af45cff115aba9908efe6a3309a6e Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Thu, 3 Jul 2025 14:34:57 -0500 Subject: [PATCH 17/42] Remove redundant BSONCXX_PRIVATE_FWD --- src/bsoncxx/include/bsoncxx/v1/types/view.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/types/view.hpp b/src/bsoncxx/include/bsoncxx/v1/types/view.hpp index 825fe4386a..25e17961a5 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/view.hpp @@ -1215,12 +1215,12 @@ class view { /// @{ template ::value>* = nullptr> friend bool operator==(view const& v, T const& value) { - return v == view{BSONCXX_PRIVATE_FWD(value)}; + return v == view{value}; } template ::value>* = nullptr> friend bool operator==(T const& value, view const& v) { - return v == view{BSONCXX_PRIVATE_FWD(value)}; + return v == view{value}; } /// @} /// From a65f489490a69bf3d971066581a77e464b8c3c4a Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Thu, 3 Jul 2025 14:34:45 -0500 Subject: [PATCH 18/42] Fix implicit vs. explicit documentation for v1::types::value ctors --- src/bsoncxx/include/bsoncxx/v1/types/value.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/types/value.hpp b/src/bsoncxx/include/bsoncxx/v1/types/value.hpp index 68362efcdc..9de4eb3a94 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/value.hpp @@ -181,7 +181,7 @@ class value { #define X(_name, _value) explicit BSONCXX_ABI_EXPORT_CDECL() value(v1::types::b_##_name v); /// - /// Implicitly convert `v` as a deep copy. + /// Convert `v` as a deep copy. /// /// The copied value is allocated (when necessary) using /// [`bson_malloc`](https://mongoc.org/libbson/current/bson_malloc.html). From 8ca3115c30e7c617ef9ed9a2c25e5db420f489e1 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Wed, 9 Jul 2025 12:57:11 -0500 Subject: [PATCH 19/42] cpx: cxx-evg-rhel95 --- .clang-format | 18 +- .../components/abi_stability.py | 2 +- .../components/compile_only.py | 20 +- .evergreen/scripts/abi-stability-setup.sh | 6 +- CHANGELOG.md | 9 + Doxyfile | 2 +- README.md | 3 +- benchmark/benchmark_runner.cpp | 10 +- etc/apidocmenu.md | 5 +- etc/augmented.sbom.json | 4 +- etc/cyclonedx.sbom.json | 4 +- etc/generate-latest-apidocs.sh | 2 +- .../create/single/options/auto_encryption.cpp | 5 +- .../collections/bulk_write_with_options.cpp | 5 +- .../index_views/create_with_options.cpp | 9 +- examples/api/runner.cpp | 11 +- pyproject.toml | 2 +- .../include/bsoncxx/v1/detail/type_traits.hpp | 5 +- .../include/bsoncxx/v_noabi/bsoncxx/types.hpp | 4 +- src/bsoncxx/test/v_noabi/bson_types.cpp | 25 +- .../v_noabi/mongocxx/options/aggregate.hpp | 3 +- .../v_noabi/mongocxx/options/bulk_write.hpp | 3 +- .../mongocxx/options/change_stream.hpp | 3 +- .../v_noabi/mongocxx/options/count.hpp | 3 +- .../v_noabi/mongocxx/options/delete.hpp | 3 +- .../v_noabi/mongocxx/options/distinct.hpp | 3 +- .../v_noabi/mongocxx/options/encrypt.hpp | 3 +- .../options/estimated_document_count.hpp | 3 +- .../v_noabi/mongocxx/options/find.hpp | 3 +- .../mongocxx/options/find_one_and_delete.hpp | 3 +- .../mongocxx/options/find_one_and_replace.hpp | 3 +- .../mongocxx/options/find_one_and_update.hpp | 3 +- .../v_noabi/mongocxx/options/insert.hpp | 3 +- .../v_noabi/mongocxx/options/range.hpp | 6 +- .../v_noabi/mongocxx/options/replace.hpp | 3 +- .../v_noabi/mongocxx/options/update.hpp | 3 +- .../v_noabi/mongocxx/read_preference.hpp | 3 +- .../lib/mongocxx/private/client_encryption.hh | 5 +- .../lib/mongocxx/v_noabi/mongocxx/client.cpp | 10 +- .../mongocxx/v_noabi/mongocxx/collection.cpp | 37 +- .../mongocxx/v_noabi/mongocxx/database.cpp | 19 +- .../v_noabi/mongocxx/options/transaction.hh | 7 +- .../v_noabi/mongocxx/read_preference.cpp | 10 +- src/mongocxx/test/spec/operation.cpp | 72 +- .../test/spec/unified_tests/operations.cpp | 24 +- src/mongocxx/test/v_noabi/client_helpers.cpp | 5 +- .../test/v_noabi/client_side_encryption.cpp | 100 +- uv.lock | 973 +++++++++--------- 48 files changed, 761 insertions(+), 706 deletions(-) diff --git a/.clang-format b/.clang-format index 65b9b94ca8..cb19ce692f 100644 --- a/.clang-format +++ b/.clang-format @@ -8,6 +8,7 @@ AlignConsecutiveAssignments: AcrossEmptyLines: false AcrossComments: false AlignCompound: false + AlignFunctionDeclarations: false AlignFunctionPointers: false PadOperators: true AlignConsecutiveBitFields: @@ -15,6 +16,7 @@ AlignConsecutiveBitFields: AcrossEmptyLines: false AcrossComments: false AlignCompound: false + AlignFunctionDeclarations: false AlignFunctionPointers: false PadOperators: false AlignConsecutiveDeclarations: @@ -22,6 +24,7 @@ AlignConsecutiveDeclarations: AcrossEmptyLines: false AcrossComments: false AlignCompound: false + AlignFunctionDeclarations: false AlignFunctionPointers: false PadOperators: false AlignConsecutiveMacros: @@ -29,6 +32,7 @@ AlignConsecutiveMacros: AcrossEmptyLines: false AcrossComments: false AlignCompound: false + AlignFunctionDeclarations: false AlignFunctionPointers: false PadOperators: false AlignConsecutiveShortCaseStatements: @@ -42,6 +46,7 @@ AlignConsecutiveTableGenBreakingDAGArgColons: AcrossEmptyLines: false AcrossComments: false AlignCompound: false + AlignFunctionDeclarations: false AlignFunctionPointers: false PadOperators: false AlignConsecutiveTableGenCondOperatorColons: @@ -49,6 +54,7 @@ AlignConsecutiveTableGenCondOperatorColons: AcrossEmptyLines: false AcrossComments: false AlignCompound: false + AlignFunctionDeclarations: false AlignFunctionPointers: false PadOperators: false AlignConsecutiveTableGenDefinitionColons: @@ -56,6 +62,7 @@ AlignConsecutiveTableGenDefinitionColons: AcrossEmptyLines: false AcrossComments: false AlignCompound: false + AlignFunctionDeclarations: false AlignFunctionPointers: false PadOperators: false AlignEscapedNewlines: Left @@ -75,6 +82,7 @@ AllowShortFunctionsOnASingleLine: Empty AllowShortIfStatementsOnASingleLine: Never AllowShortLambdasOnASingleLine: All AllowShortLoopsOnASingleLine: false +AllowShortNamespacesOnASingleLine: false AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakBeforeMultilineStrings: true AttributeMacros: @@ -90,7 +98,7 @@ AttributeMacros: - MONGOCXX_ABI_NO_EXPORT - MONGOCXX_DEPRECATED BinPackArguments: false -BinPackParameters: false +BinPackParameters: OnePerLine BitFieldColonSpacing: Both BraceWrapping: AfterCaseLabel: false @@ -121,6 +129,7 @@ BreakBeforeConceptDeclarations: Always BreakBeforeBraces: Attach BreakBeforeInlineASMColon: OnlyMultiline BreakBeforeTernaryOperators: true +BreakBinaryOperations: Never BreakConstructorInitializers: BeforeColon BreakFunctionDefinitionParameters: false BreakInheritanceList: BeforeColon @@ -197,6 +206,7 @@ IncludeIsMainSourceRegex: '' IndentAccessModifiers: false IndentCaseBlocks: false IndentCaseLabels: true +IndentExportBlock: true IndentExternBlock: AfterExternBlock IndentGotoLabels: true IndentPPDirectives: None @@ -219,6 +229,7 @@ KeepEmptyLines: AtEndOfFile: false AtStartOfBlock: false AtStartOfFile: false +KeepFormFeed: false LambdaBodyIndentation: Signature LineEnding: DeriveLF MacroBlockBegin: '' @@ -234,6 +245,7 @@ ObjCSpaceBeforeProtocolList: true PackConstructorInitializers: NextLine PenaltyBreakAssignment: 2 PenaltyBreakBeforeFirstCallParameter: 1 +PenaltyBreakBeforeMemberAccess: 150 PenaltyBreakComment: 300 PenaltyBreakFirstLessLess: 120 PenaltyBreakOpenParenthesis: 0 @@ -248,8 +260,9 @@ PPIndentWidth: -1 QualifierAlignment: Right RawStringFormats: [] ReferenceAlignment: Pointer -ReflowComments: true +ReflowComments: Always RemoveBracesLLVM: false +RemoveEmptyLinesInUnwrappedLines: false RemoveParentheses: Leave RemoveSemicolon: false RequiresClausePosition: OwnLine @@ -324,4 +337,5 @@ TypenameMacros: UseTab: Never VerilogBreakBetweenInstancePorts: true WhitespaceSensitiveMacros: [] +WrapNamespaceBodyWithEmptyLines: Leave ... diff --git a/.evergreen/config_generator/components/abi_stability.py b/.evergreen/config_generator/components/abi_stability.py index b3949e2a25..571fa32725 100644 --- a/.evergreen/config_generator/components/abi_stability.py +++ b/.evergreen/config_generator/components/abi_stability.py @@ -147,7 +147,7 @@ def generate_tasks(): if func is Abidiff: distro_name = 'ubuntu2204' # Clang 12, libabigail is not available on RHEL distros. else: - distro_name = 'rhel95' # Clang 18. + distro_name = 'rhel95' # Clang 19. distro = find_large_distro(distro_name) diff --git a/.evergreen/config_generator/components/compile_only.py b/.evergreen/config_generator/components/compile_only.py index d5fb9fba37..e2addd03d4 100644 --- a/.evergreen/config_generator/components/compile_only.py +++ b/.evergreen/config_generator/components/compile_only.py @@ -18,16 +18,16 @@ MATRIX = [ # C++ standard and compiler coverage - ('rhel80', 'clang', [11, 17, 20, ]), # Clang 7.0 (max: C++20) - ('ubuntu2004', 'clang-10', [11, 17, 20, ]), # Clang 10.0 (max: C++20) - ('rhel84', 'clang', [11, 17, 20, ]), # Clang 11.0 (max: C++20) - ('ubuntu2204', 'clang-12', [11, 17, 20, 23]), # Clang 12.0 (max: C++23) - ('rhel90', 'clang', [11, 17, 20, 23]), # Clang 13.0 (max: C++23) - ('rhel91', 'clang', [11, 17, 20, 23]), # Clang 14.0 (max: C++23) - ('rhel92', 'clang', [11, 17, 20, 23]), # Clang 15.0 (max: C++23) - ('rhel93', 'clang', [11, 17, 20, 23]), # Clang 16.0 (max: C++23) - ('rhel94', 'clang', [11, 17, 20, 23]), # Clang 17.0 (max: C++23) - ('rhel95', 'clang', [11, 17, 20, 23]), # Clang 18.0 (max: C++23) + ('rhel80', 'clang', [11, 17, 20, ]), # Clang 7 (max: C++20) + ('ubuntu2004', 'clang-10', [11, 17, 20, ]), # Clang 10 (max: C++20) + ('rhel84', 'clang', [11, 17, 20, ]), # Clang 11 (max: C++20) + ('ubuntu2204', 'clang-12', [11, 17, 20, 23]), # Clang 12 (max: C++23) + ('rhel90', 'clang', [11, 17, 20, 23]), # Clang 13 (max: C++23) + ('rhel91', 'clang', [11, 17, 20, 23]), # Clang 14 (max: C++23) + ('rhel92', 'clang', [11, 17, 20, 23]), # Clang 15 (max: C++23) + ('rhel93', 'clang', [11, 17, 20, 23]), # Clang 16 (max: C++23) + ('rhel94', 'clang', [11, 17, 20, 23]), # Clang 17 (max: C++23) + ('rhel95', 'clang', [11, 17, 20, 23]), # Clang 19 (max: C++23) ('rhel7.9', 'gcc', [11, 14, ]), # GCC 4.8 (max: C++14) ('rhel80', 'gcc', [11, 17, 20, ]), # GCC 8.2 (max: C++20) diff --git a/.evergreen/scripts/abi-stability-setup.sh b/.evergreen/scripts/abi-stability-setup.sh index 199ccb6f3e..dc575f6591 100755 --- a/.evergreen/scripts/abi-stability-setup.sh +++ b/.evergreen/scripts/abi-stability-setup.sh @@ -67,9 +67,9 @@ mkdir -p "${working_dir}/install" # For latest Clang versions supporting recent C++ standards. export CC CXX case "${distro_id:?}" in -rhel9*) - CC="clang-18" - CXX="clang++-18" +rhel95*) + CC="clang-19" + CXX="clang++-19" ;; ubuntu22*) CC="clang-12" diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a95f74cea..261019c899 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,15 @@ Changes prior to 3.9.0 are documented as [release notes on GitHub](https://githu - Apple Clang 13.1 with Xcode 13.4.1 (from Apple Clang 5.1 with Xcode 5.1). - MSVC 19.0.24210 with Visual Studio 2015 Update 3 (from MSVC 19.0.23506 with Visual Studio 2015 Update 1). +## 4.1.1 + +### Fixed + +- CMake option `ENABLE_TESTS` (`OFF` by default) is no longer overwritten by the auto-downloaded C Driver (`ON` by default) during CMake configuration. +- Static pkg-config files are updated to depend on the static (not shared) libbson / libmongoc packages. +- Fix build if macros `GCC`/`GNU`/`Clang`/`MSVC` are already defined. + + ## 4.1.0 ### Fixed diff --git a/Doxyfile b/Doxyfile index c3d9098439..7c423837de 100644 --- a/Doxyfile +++ b/Doxyfile @@ -1602,7 +1602,7 @@ TOC_EXPAND = NO # protocol see https://www.sitemaps.org # This tag requires that the tag GENERATE_HTML is set to YES. -SITEMAP_URL = https://mongocxx.org/api/mongocxx-4.1.0/ +SITEMAP_URL = https://mongocxx.org/api/mongocxx-4.1.1/ # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that diff --git a/README.md b/README.md index c3b68b0868..48051cc573 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,8 @@ git clone -b releases/stable https://github.com/mongodb/mongo-cxx-driver.git | Version | ABI Stability | Development Stability | Development Status | | :---------: | :-------------: | :-------------------------: | :----------------: | | master | N/A | _Do not use in production!_ | Active | -| 4.1.0 | None | Ready for Use | Bug Fixes Only | +| 4.1.1 | None | Ready for Use | Bug Fixes Only | +| 4.1.0 | None | Ready for Use | Not Supported | | 4.0.0 | None | Ready for Use | Not Supported | | 3.11.0 | None | Ready for Use | Bug Fixes Only | | 3.10.2 | None | Ready for Use | Not Supported | diff --git a/benchmark/benchmark_runner.cpp b/benchmark/benchmark_runner.cpp index 048baebbfd..4a49deec0c 100644 --- a/benchmark/benchmark_runner.cpp +++ b/benchmark/benchmark_runner.cpp @@ -55,15 +55,17 @@ benchmark_runner::benchmark_runner(std::set types) : _types{type // Single doc microbenchmarks _microbenches.push_back(std::make_unique()); _microbenches.push_back(std::make_unique("single_and_multi_document/tweet.json")); - _microbenches.push_back(std::make_unique( - "TestSmallDocInsertOne", 2.75, iterations, "single_and_multi_document/small_doc.json")); + _microbenches.push_back( + std::make_unique( + "TestSmallDocInsertOne", 2.75, iterations, "single_and_multi_document/small_doc.json")); _microbenches.push_back( std::make_unique("TestLargeDocInsertOne", 27.31, 10, "single_and_multi_document/large_doc.json")); // Multi doc microbenchmarks _microbenches.push_back(std::make_unique("single_and_multi_document/tweet.json")); - _microbenches.push_back(std::make_unique( - "TestSmallDocBulkInsert", 2.75, iterations, "single_and_multi_document/small_doc.json")); + _microbenches.push_back( + std::make_unique( + "TestSmallDocBulkInsert", 2.75, iterations, "single_and_multi_document/small_doc.json")); _microbenches.push_back( std::make_unique("TestLargeDocBulkInsert", 27.31, 10, "single_and_multi_document/large_doc.json")); // CXX-2794: Disable GridFS benchmarks due to long runtime diff --git a/etc/apidocmenu.md b/etc/apidocmenu.md index 47acb3a306..b59e0aa5c6 100644 --- a/etc/apidocmenu.md +++ b/etc/apidocmenu.md @@ -2,7 +2,7 @@ ## Driver Documentation By Version -[4.1.0](../mongocxx-4.1.0) | [4.0.0](../mongocxx-4.0.0) | [3.11.0](../mongocxx-3.11.0) | [3.10.2](../mongocxx-3.10.2) | [3.10.1](../mongocxx-3.10.1) | [3.10.0](../mongocxx-3.10.0) | [3.9.0](../mongocxx-3.9.0) | [3.8.1](../mongocxx-3.8.1) | [3.8.0](../mongocxx-3.8.0) | [3.7.2](../mongocxx-3.7.2) | [3.7.1](../mongocxx-3.7.1) | [3.7.0](../mongocxx-3.7.0) | [3.6.7](../mongocxx-3.6.7) | [3.6.6](../mongocxx-3.6.6) | [3.6.5](../mongocxx-3.6.5) | [3.6.4](../mongocxx-3.6.4) | [3.6.3](../mongocxx-3.6.3) | [3.6.2](../mongocxx-3.6.2) | [3.6.1](../mongocxx-3.6.1) | [3.6.0](../mongocxx-3.6.0) | [3.5.1](../mongocxx-3.5.1) | [3.5.0](../mongocxx-3.5.0) | [3.4.2](../mongocxx-3.4.2) | [3.4.1](../mongocxx-3.4.1) | [3.4.0](../mongocxx-3.4.0) | [3.3.2](../mongocxx-3.3.2) | [3.3.1](../mongocxx-3.3.1) | [3.3.0](../mongocxx-3.3.0) | [3.2.1](../mongocxx-3.2.1) | [3.2.0](../mongocxx-3.2.0) | [3.1.4](../mongocxx-3.1.4/) | [3.1.3](../mongocxx-3.1.3/) | [3.1.2](../mongocxx-3.1.2/) | [3.1.1](../mongocxx-3.1.1/) | [3.1.0](../mongocxx-3.1.0/) | [3.0.3](../mongocxx-3.0.3/) | [3.0.2](../mongocxx-3.0.2/) | [3.0.1](../mongocxx-3.0.1/) | [3.0.0](../mongocxx-3.0.0/) +[4.1.1](../mongocxx-4.1.1) | [4.1.0](../mongocxx-4.1.0) | [4.0.0](../mongocxx-4.0.0) | [3.11.0](../mongocxx-3.11.0) | [3.10.2](../mongocxx-3.10.2) | [3.10.1](../mongocxx-3.10.1) | [3.10.0](../mongocxx-3.10.0) | [3.9.0](../mongocxx-3.9.0) | [3.8.1](../mongocxx-3.8.1) | [3.8.0](../mongocxx-3.8.0) | [3.7.2](../mongocxx-3.7.2) | [3.7.1](../mongocxx-3.7.1) | [3.7.0](../mongocxx-3.7.0) | [3.6.7](../mongocxx-3.6.7) | [3.6.6](../mongocxx-3.6.6) | [3.6.5](../mongocxx-3.6.5) | [3.6.4](../mongocxx-3.6.4) | [3.6.3](../mongocxx-3.6.3) | [3.6.2](../mongocxx-3.6.2) | [3.6.1](../mongocxx-3.6.1) | [3.6.0](../mongocxx-3.6.0) | [3.5.1](../mongocxx-3.5.1) | [3.5.0](../mongocxx-3.5.0) | [3.4.2](../mongocxx-3.4.2) | [3.4.1](../mongocxx-3.4.1) | [3.4.0](../mongocxx-3.4.0) | [3.3.2](../mongocxx-3.3.2) | [3.3.1](../mongocxx-3.3.1) | [3.3.0](../mongocxx-3.3.0) | [3.2.1](../mongocxx-3.2.1) | [3.2.0](../mongocxx-3.2.0) | [3.1.4](../mongocxx-3.1.4/) | [3.1.3](../mongocxx-3.1.3/) | [3.1.2](../mongocxx-3.1.2/) | [3.1.1](../mongocxx-3.1.1/) | [3.1.0](../mongocxx-3.1.0/) | [3.0.3](../mongocxx-3.0.3/) | [3.0.2](../mongocxx-3.0.2/) | [3.0.1](../mongocxx-3.0.1/) | [3.0.0](../mongocxx-3.0.0/) ## Driver Development Status @@ -12,7 +12,8 @@ | Version | ABI Stability | Development Stability | Development Status | | :---------: | :-------------: | :-------------------------: | :----------------: | | master | N/A | _Do not use in production!_ | Active | -| 4.1.0 | None | Ready for Use | Bug Fixes Only | +| 4.1.1 | None | Ready for Use | Bug Fixes Only | +| 4.1.0 | None | Ready for Use | Not Supported | | 4.0.0 | None | Ready for Use | Not Supported | | 3.11.0 | None | Ready for Use | Bug Fixes Only | | 3.10.2 | None | Ready for Use | Not Supported | diff --git a/etc/augmented.sbom.json b/etc/augmented.sbom.json index 9ee60faeda..27d99c9c16 100644 --- a/etc/augmented.sbom.json +++ b/etc/augmented.sbom.json @@ -33,7 +33,7 @@ } ], "metadata": { - "timestamp": "2025-06-12T17:36:20.890153+00:00", + "timestamp": "2025-07-01T14:54:54.875217+00:00", "tools": [ { "externalReferences": [ @@ -76,7 +76,7 @@ } ] }, - "serialNumber": "urn:uuid:c1c87561-6868-46b2-9e0c-d2f7f3bdf028", + "serialNumber": "urn:uuid:f6bad0a4-0ad0-4f8f-afce-5aae6a7d8a0f", "version": 1, "$schema": "http://cyclonedx.org/schema/bom-1.5.schema.json", "bomFormat": "CycloneDX", diff --git a/etc/cyclonedx.sbom.json b/etc/cyclonedx.sbom.json index 9ee60faeda..27d99c9c16 100644 --- a/etc/cyclonedx.sbom.json +++ b/etc/cyclonedx.sbom.json @@ -33,7 +33,7 @@ } ], "metadata": { - "timestamp": "2025-06-12T17:36:20.890153+00:00", + "timestamp": "2025-07-01T14:54:54.875217+00:00", "tools": [ { "externalReferences": [ @@ -76,7 +76,7 @@ } ] }, - "serialNumber": "urn:uuid:c1c87561-6868-46b2-9e0c-d2f7f3bdf028", + "serialNumber": "urn:uuid:f6bad0a4-0ad0-4f8f-afce-5aae6a7d8a0f", "version": 1, "$schema": "http://cyclonedx.org/schema/bom-1.5.schema.json", "bomFormat": "CycloneDX", diff --git a/etc/generate-latest-apidocs.sh b/etc/generate-latest-apidocs.sh index 59dd69f9db..fda5f5bd37 100755 --- a/etc/generate-latest-apidocs.sh +++ b/etc/generate-latest-apidocs.sh @@ -10,7 +10,7 @@ set -o errexit set -o pipefail -LATEST_VERSION="4.1.0" +LATEST_VERSION="4.1.1" DOXYGEN_VERSION_REQUIRED="1.13.2" # Permit using a custom Doxygen binary. diff --git a/examples/api/mongocxx/examples/clients/create/single/options/auto_encryption.cpp b/examples/api/mongocxx/examples/clients/create/single/options/auto_encryption.cpp index 91b67a35eb..7ab281e2cb 100644 --- a/examples/api/mongocxx/examples/clients/create/single/options/auto_encryption.cpp +++ b/examples/api/mongocxx/examples/clients/create/single/options/auto_encryption.cpp @@ -38,8 +38,9 @@ void example(bsoncxx::document::view kms_providers) { auto_encryption_opts.key_vault_namespace({"keyvault", "datakeys"}); auto_encryption_opts.kms_providers(kms_providers); - auto_encryption_opts.extra_options(bsoncxx::from_json( - R"({"mongocryptdURI": "mongodb://localhost:27027", "mongocryptdSpawnArgs": ["--port", "27027"]})")); + auto_encryption_opts.extra_options( + bsoncxx::from_json( + R"({"mongocryptdURI": "mongodb://localhost:27027", "mongocryptdSpawnArgs": ["--port", "27027"]})")); // ... other automatic encryption options. mongocxx::options::client client_opts; diff --git a/examples/api/mongocxx/examples/collections/bulk_write_with_options.cpp b/examples/api/mongocxx/examples/collections/bulk_write_with_options.cpp index bafa583791..8bba4f0dc9 100644 --- a/examples/api/mongocxx/examples/collections/bulk_write_with_options.cpp +++ b/examples/api/mongocxx/examples/collections/bulk_write_with_options.cpp @@ -46,8 +46,9 @@ void example(mongocxx::collection coll) { auto result_opt = coll.create_bulk_write(opts) .append(mongocxx::model::insert_one{bsoncxx::from_json(R"({"x": 10})")}) - .append(mongocxx::model::update_one{ - bsoncxx::from_json(R"({"x": {"$exists": 1}})"), bsoncxx::from_json(R"({"$set": {"x": 20}})")}) + .append( + mongocxx::model::update_one{ + bsoncxx::from_json(R"({"x": {"$exists": 1}})"), bsoncxx::from_json(R"({"$set": {"x": 20}})")}) .execute(); EXPECT(result_opt); diff --git a/examples/api/mongocxx/examples/collections/index_views/create_with_options.cpp b/examples/api/mongocxx/examples/collections/index_views/create_with_options.cpp index 1367a7c479..f930d3d6cf 100644 --- a/examples/api/mongocxx/examples/collections/index_views/create_with_options.cpp +++ b/examples/api/mongocxx/examples/collections/index_views/create_with_options.cpp @@ -49,10 +49,11 @@ void example(mongocxx::index_view indexes) { // Index model. { - auto result_opt = indexes.create_one(mongocxx::index_model{ - bsoncxx::from_json(R"({"y": 1})"), - bsoncxx::from_json(R"({"name": "two"})"), - }); + auto result_opt = indexes.create_one( + mongocxx::index_model{ + bsoncxx::from_json(R"({"y": 1})"), + bsoncxx::from_json(R"({"name": "two"})"), + }); EXPECT(result_opt); EXPECT(result_opt->compare("two") == 0); diff --git a/examples/api/runner.cpp b/examples/api/runner.cpp index 434b943a0a..25d47d8a93 100644 --- a/examples/api/runner.cpp +++ b/examples/api/runner.cpp @@ -300,11 +300,12 @@ class runner_type { if (verbose) { std::vector names; - names.reserve(std::accumulate( - std::begin(all_components), - std::end(all_components), - std::size_t{0}, - [](std::size_t n, std::vector const* cptr) { return n + cptr->size(); })); + names.reserve( + std::accumulate( + std::begin(all_components), + std::end(all_components), + std::size_t{0}, + [](std::size_t n, std::vector const* cptr) { return n + cptr->size(); })); for (auto cptr : all_components) { for (auto c : *cptr) { diff --git a/pyproject.toml b/pyproject.toml index 4ebebb74d0..0eb13e5075 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,7 @@ apidocs = [ clang_format = [ # etc/clang-format-all.sh - "clang-format~=19.1", + "clang-format~=20.1.0", ] config_generator = [ diff --git a/src/bsoncxx/include/bsoncxx/v1/detail/type_traits.hpp b/src/bsoncxx/include/bsoncxx/v1/detail/type_traits.hpp index 2113af18c6..4d9431910e 100644 --- a/src/bsoncxx/include/bsoncxx/v1/detail/type_traits.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/detail/type_traits.hpp @@ -378,10 +378,7 @@ static constexpr struct invoke_fn { // @cond DOXYGEN_DISABLE "Found ';' while parsing initializer list!" template > constexpr auto operator()(F&& fn, Args&&... args) const - BSONCXX_PRIVATE_RETURNS(impl_invoke::invoker< - std::is_member_object_pointer::value, - std::is_member_function_pointer< - Fd>::value>::apply(static_cast(fn), static_cast(args)...)); + BSONCXX_PRIVATE_RETURNS(impl_invoke::invoker::value, std::is_member_function_pointer::value>::apply(static_cast(fn), static_cast(args)...)); // @endcond } invoke; diff --git a/src/bsoncxx/include/bsoncxx/v_noabi/bsoncxx/types.hpp b/src/bsoncxx/include/bsoncxx/v_noabi/bsoncxx/types.hpp index 4636ee1954..13ed5655a1 100644 --- a/src/bsoncxx/include/bsoncxx/v_noabi/bsoncxx/types.hpp +++ b/src/bsoncxx/include/bsoncxx/v_noabi/bsoncxx/types.hpp @@ -60,8 +60,8 @@ enum class type : std::uint8_t { k_timestamp = 0x11, ///< Timestamp. k_int64 = 0x12, ///< 64-bit integer. k_decimal128 = 0x13, ///< 128-bit decimal floating point. - k_maxkey = 0x7F, ///< Min key. - k_minkey = 0xFF, ///< Max key. + k_maxkey = 0x7F, ///< Max key. + k_minkey = 0xFF, ///< Min key. }; /// diff --git a/src/bsoncxx/test/v_noabi/bson_types.cpp b/src/bsoncxx/test/v_noabi/bson_types.cpp index e58210f93f..0c22786b1a 100644 --- a/src/bsoncxx/test/v_noabi/bson_types.cpp +++ b/src/bsoncxx/test/v_noabi/bson_types.cpp @@ -372,13 +372,15 @@ TEST_CASE("document uninitialized element throws exceptions", "") { REQUIRE_THROWS_WITH( doc["doesnotexist"].get_string().value, - Catch::Matchers::ContainsSubstring("cannot get string from an uninitialized element with key " - "\"doesnotexist\": unset document::element")); + Catch::Matchers::ContainsSubstring( + "cannot get string from an uninitialized element with key " + "\"doesnotexist\": unset document::element")); REQUIRE_THROWS_WITH( doc["alsodoesnotexist"].get_value(), - Catch::Matchers::ContainsSubstring("cannot return the type of uninitialized element with key " - "\"alsodoesnotexist\": unset document::element")); + Catch::Matchers::ContainsSubstring( + "cannot return the type of uninitialized element with key " + "\"alsodoesnotexist\": unset document::element")); // Ensure a non-existing element evaluates to false. REQUIRE(!doc["doesnotexist"]); @@ -387,8 +389,9 @@ TEST_CASE("document uninitialized element throws exceptions", "") { // Ensure getting a key from a non-existing element results in an exception. REQUIRE_THROWS_WITH( doc["doesnotexist"].key(), - Catch::Matchers::ContainsSubstring("cannot return the key from an uninitialized element with key " - "\"doesnotexist\": unset document::element")); + Catch::Matchers::ContainsSubstring( + "cannot return the key from an uninitialized element with key " + "\"doesnotexist\": unset document::element")); } TEST_CASE("array uninitialized element throws exceptions", "") { @@ -398,8 +401,9 @@ TEST_CASE("array uninitialized element throws exceptions", "") { REQUIRE_THROWS_WITH( arr.view()[3].get_string().value, - Catch::Matchers::ContainsSubstring("cannot get string from an uninitialized element with key " - "\"3\": unset document::element")); + Catch::Matchers::ContainsSubstring( + "cannot get string from an uninitialized element with key " + "\"3\": unset document::element")); // Ensure a non-existing element evaluates to false. REQUIRE(!arr.view()[3]); // Ensure finding a non-existing element results in an end iterator. @@ -407,7 +411,8 @@ TEST_CASE("array uninitialized element throws exceptions", "") { // Ensure getting a key from a non-existing element results in an exception. REQUIRE_THROWS_WITH( arr.view()[3].key(), - Catch::Matchers::ContainsSubstring("cannot return the key from an uninitialized element with key " - "\"3\": unset document::element")); + Catch::Matchers::ContainsSubstring( + "cannot return the key from an uninitialized element with key " + "\"3\": unset document::element")); } } // namespace diff --git a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/aggregate.hpp b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/aggregate.hpp index 7059f81e23..6c27eeb71b 100644 --- a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/aggregate.hpp +++ b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/aggregate.hpp @@ -333,8 +333,7 @@ class aggregate { /// @see /// - https://www.mongodb.com/docs/manual/reference/command/aggregate/ /// - MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::types::bson_value::view_or_value> const&) + MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const&) comment() const; private: diff --git a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/bulk_write.hpp b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/bulk_write.hpp index 3227bdce4d..3cbf7c2c2d 100644 --- a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/bulk_write.hpp +++ b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/bulk_write.hpp @@ -153,8 +153,7 @@ class bulk_write { /// @return /// The current comment option. /// - MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::types::bson_value::view_or_value> const) + MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const) comment() const; private: diff --git a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/change_stream.hpp b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/change_stream.hpp index 67741d8612..072847854b 100644 --- a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/change_stream.hpp +++ b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/change_stream.hpp @@ -149,8 +149,7 @@ class change_stream { /// @return /// The current comment option. /// - MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::types::bson_value::view_or_value> const&) + MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const&) comment() const; /// diff --git a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/count.hpp b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/count.hpp index 89982ef4e1..85e0ab1360 100644 --- a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/count.hpp +++ b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/count.hpp @@ -116,8 +116,7 @@ class count { /// @see /// - https://www.mongodb.com/docs/manual/reference/command/aggregate/ /// - MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::types::bson_value::view_or_value> const&) + MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const&) comment() const; /// diff --git a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/delete.hpp b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/delete.hpp index 9afd2e8ff1..3a6e1d6312 100644 --- a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/delete.hpp +++ b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/delete.hpp @@ -152,8 +152,7 @@ class delete_options { /// @return /// The current comment option. /// - MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::types::bson_value::view_or_value> const) + MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const) comment() const; private: diff --git a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/distinct.hpp b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/distinct.hpp index 085173bfef..809ba21f10 100644 --- a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/distinct.hpp +++ b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/distinct.hpp @@ -115,8 +115,7 @@ class distinct { /// @see /// - https://www.mongodb.com/docs/manual/reference/command/distinct/ /// - MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::types::bson_value::view_or_value> const&) + MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const&) comment() const; /// diff --git a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/encrypt.hpp b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/encrypt.hpp index 36a2c16d2b..c27441d286 100644 --- a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/encrypt.hpp +++ b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/encrypt.hpp @@ -62,8 +62,7 @@ class encrypt { /// @return /// An optional owning bson_value containing the key_id. /// - MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::types::bson_value::view_or_value> const&) + MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const&) key_id() const; /// diff --git a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/estimated_document_count.hpp b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/estimated_document_count.hpp index 6d21fe4c75..392278934c 100644 --- a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/estimated_document_count.hpp +++ b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/estimated_document_count.hpp @@ -85,8 +85,7 @@ class estimated_document_count { /// @see /// - https://www.mongodb.com/docs/manual/reference/command/count/ /// - MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::types::bson_value::view_or_value> const&) + MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const&) comment() const; /// diff --git a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/find.hpp b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/find.hpp index 2e38b24dc3..a74451fc56 100644 --- a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/find.hpp +++ b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/find.hpp @@ -290,8 +290,7 @@ class find { /// @see /// - https://www.mongodb.com/docs/manual/reference/command/find/ /// - MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::types::bson_value::view_or_value> const&) + MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const&) comment_option() const; /// diff --git a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/find_one_and_delete.hpp b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/find_one_and_delete.hpp index f01f949ef2..474ab90dfc 100644 --- a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/find_one_and_delete.hpp +++ b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/find_one_and_delete.hpp @@ -239,8 +239,7 @@ class find_one_and_delete { /// @return /// The current comment option. /// - MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::types::bson_value::view_or_value> const) + MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const) comment() const; private: diff --git a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/find_one_and_replace.hpp b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/find_one_and_replace.hpp index 378bdcb655..e21ac35da8 100644 --- a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/find_one_and_replace.hpp +++ b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/find_one_and_replace.hpp @@ -160,8 +160,7 @@ class find_one_and_replace { /// @return /// The current comment option. /// - MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::types::bson_value::view_or_value> const) + MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const) comment() const; /// diff --git a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/find_one_and_update.hpp b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/find_one_and_update.hpp index ba72716ac8..887f3af0b9 100644 --- a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/find_one_and_update.hpp +++ b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/find_one_and_update.hpp @@ -162,8 +162,7 @@ class find_one_and_update { /// @return /// The current comment option. /// - MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::types::bson_value::view_or_value> const) + MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const) comment() const; /// diff --git a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/insert.hpp b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/insert.hpp index 6eaa222528..704e9f588e 100644 --- a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/insert.hpp +++ b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/insert.hpp @@ -138,8 +138,7 @@ class insert { /// @see /// - https://www.mongodb.com/docs/manual/reference/command/insert/ /// - MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::types::bson_value::view_or_value> const&) + MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const&) comment() const; private: diff --git a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/range.hpp b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/range.hpp index 787428388d..a2d712da24 100644 --- a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/range.hpp +++ b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/range.hpp @@ -47,8 +47,7 @@ class range { /// @brief Gets `RangeOpts.min`. /// @note Required if @ref precision is set. - MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::types::bson_value::view_or_value> const&) + MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const&) min() const; /// @brief Sets `RangeOpts.max`. @@ -57,8 +56,7 @@ class range { /// @brief Gets `RangeOpts.max`. /// @note Required if @ref precision is set. - MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::types::bson_value::view_or_value> const&) + MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const&) max() const; /// @brief Sets `RangeOpts.sparsity`. diff --git a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/replace.hpp b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/replace.hpp index 081b88cf87..5c36cd6896 100644 --- a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/replace.hpp +++ b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/replace.hpp @@ -214,8 +214,7 @@ class replace { /// @return /// The current comment option. /// - MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::types::bson_value::view_or_value> const) + MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const) comment() const; private: diff --git a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/update.hpp b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/update.hpp index 4d8ecca93f..ab5f1da952 100644 --- a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/update.hpp +++ b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/options/update.hpp @@ -162,8 +162,7 @@ class update { /// @return /// The current comment option. /// - MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::types::bson_value::view_or_value> const) + MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const) comment() const; /// diff --git a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/read_preference.hpp b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/read_preference.hpp index 1fa0f13a9d..a31a7df7d7 100644 --- a/src/mongocxx/include/mongocxx/v_noabi/mongocxx/read_preference.hpp +++ b/src/mongocxx/include/mongocxx/v_noabi/mongocxx/read_preference.hpp @@ -289,8 +289,7 @@ class read_preference { /// /// @return A hedge document if one was set. /// - MONGOCXX_DEPRECATED MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional< - bsoncxx::v_noabi::document::view> const) + MONGOCXX_DEPRECATED MONGOCXX_ABI_EXPORT_CDECL(bsoncxx::v_noabi::stdx::optional const) hedge() const; /// diff --git a/src/mongocxx/lib/mongocxx/private/client_encryption.hh b/src/mongocxx/lib/mongocxx/private/client_encryption.hh index 4326403137..8b261919e0 100644 --- a/src/mongocxx/lib/mongocxx/private/client_encryption.hh +++ b/src/mongocxx/lib/mongocxx/private/client_encryption.hh @@ -67,8 +67,9 @@ class client_encryption::impl { bson_error_t error; - _client_encryption.reset(libmongoc::client_encryption_new( - encryption_opts_ptr(static_cast(_opts.convert())).get(), &error)); + _client_encryption.reset( + libmongoc::client_encryption_new( + encryption_opts_ptr(static_cast(_opts.convert())).get(), &error)); if (!_client_encryption) { throw_exception(error); diff --git a/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/client.cpp b/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/client.cpp index 7ff131c2b1..112d9e1340 100644 --- a/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/client.cpp +++ b/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/client.cpp @@ -172,8 +172,9 @@ void client::read_preference(mongocxx::v_noabi::read_preference rp) { } mongocxx::v_noabi::read_preference client::read_preference() const { - mongocxx::v_noabi::read_preference rp(bsoncxx::make_unique( - libmongoc::read_prefs_copy(libmongoc::client_get_read_prefs(_get_impl().client_t)))); + mongocxx::v_noabi::read_preference rp( + bsoncxx::make_unique( + libmongoc::read_prefs_copy(libmongoc::client_get_read_prefs(_get_impl().client_t)))); return rp; } @@ -192,8 +193,9 @@ void client::write_concern(mongocxx::v_noabi::write_concern wc) { } mongocxx::v_noabi::write_concern client::write_concern() const { - mongocxx::v_noabi::write_concern wc(bsoncxx::make_unique( - libmongoc::write_concern_copy(libmongoc::client_get_write_concern(_get_impl().client_t)))); + mongocxx::v_noabi::write_concern wc( + bsoncxx::make_unique( + libmongoc::write_concern_copy(libmongoc::client_get_write_concern(_get_impl().client_t)))); return wc; } diff --git a/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/collection.cpp b/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/collection.cpp index c5f23b60e8..e146ced863 100644 --- a/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/collection.cpp +++ b/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/collection.cpp @@ -259,16 +259,18 @@ void collection::rename( } collection::collection(database const& database, bsoncxx::v_noabi::string::view_or_value collection_name) - : _impl(bsoncxx::make_unique( - libmongoc::database_get_collection(database._get_impl().database_t, collection_name.terminated().data()), - database.name(), - database._get_impl().client_impl)) {} + : _impl( + bsoncxx::make_unique( + libmongoc::database_get_collection(database._get_impl().database_t, collection_name.terminated().data()), + database.name(), + database._get_impl().client_impl)) {} collection::collection(database const& database, void* collection) - : _impl(bsoncxx::make_unique( - static_cast(collection), - database.name(), - database._get_impl().client_impl)) {} + : _impl( + bsoncxx::make_unique( + static_cast(collection), + database.name(), + database._get_impl().client_impl)) {} collection::collection(collection const& c) { if (c) { @@ -472,8 +474,13 @@ collection::_aggregate(client_session const* session, pipeline const& pipeline, rp_ptr = options.read_preference()->_impl->read_preference_t; } - return cursor(libmongoc::collection_aggregate( - _get_impl().collection_t, static_cast<::mongoc_query_flags_t>(0), stages.bson(), options_bson.bson(), rp_ptr)); + return cursor( + libmongoc::collection_aggregate( + _get_impl().collection_t, + static_cast<::mongoc_query_flags_t>(0), + stages.bson(), + options_bson.bson(), + rp_ptr)); } cursor collection::aggregate(pipeline const& pipeline, options::aggregate const& options) { @@ -1327,8 +1334,9 @@ void collection::read_preference(mongocxx::v_noabi::read_preference rp) { } mongocxx::v_noabi::read_preference collection::read_preference() const { - mongocxx::v_noabi::read_preference rp(bsoncxx::make_unique( - libmongoc::read_prefs_copy(libmongoc::collection_get_read_prefs(_get_impl().collection_t)))); + mongocxx::v_noabi::read_preference rp( + bsoncxx::make_unique( + libmongoc::read_prefs_copy(libmongoc::collection_get_read_prefs(_get_impl().collection_t)))); return rp; } @@ -1337,8 +1345,9 @@ void collection::write_concern(mongocxx::v_noabi::write_concern wc) { } mongocxx::v_noabi::write_concern collection::write_concern() const { - mongocxx::v_noabi::write_concern wc(bsoncxx::make_unique( - libmongoc::write_concern_copy(libmongoc::collection_get_write_concern(_get_impl().collection_t)))); + mongocxx::v_noabi::write_concern wc( + bsoncxx::make_unique( + libmongoc::write_concern_copy(libmongoc::collection_get_write_concern(_get_impl().collection_t)))); return wc; } diff --git a/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/database.cpp b/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/database.cpp index c2bd95e964..88a3040ab3 100644 --- a/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/database.cpp +++ b/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/database.cpp @@ -86,10 +86,11 @@ database& database::operator=(database&&) noexcept = default; database::~database() = default; database::database(mongocxx::v_noabi::client const& client, bsoncxx::v_noabi::string::view_or_value name) - : _impl(bsoncxx::make_unique( - libmongoc::client_get_database(client._get_impl().client_t, name.terminated().data()), - &client._get_impl(), - name.terminated().data())) {} + : _impl( + bsoncxx::make_unique( + libmongoc::client_get_database(client._get_impl().client_t, name.terminated().data()), + &client._get_impl(), + name.terminated().data())) {} database::database(database const& d) { if (d) { @@ -362,8 +363,9 @@ bool database::has_collection(bsoncxx::v_noabi::string::view_or_value name) cons } mongocxx::v_noabi::read_preference database::read_preference() const { - mongocxx::v_noabi::read_preference rp(bsoncxx::make_unique( - libmongoc::read_prefs_copy(libmongoc::database_get_read_prefs(_get_impl().database_t)))); + mongocxx::v_noabi::read_preference rp( + bsoncxx::make_unique( + libmongoc::read_prefs_copy(libmongoc::database_get_read_prefs(_get_impl().database_t)))); return rp; } @@ -372,8 +374,9 @@ void database::write_concern(mongocxx::v_noabi::write_concern wc) { } mongocxx::v_noabi::write_concern database::write_concern() const { - mongocxx::v_noabi::write_concern wc(bsoncxx::make_unique( - libmongoc::write_concern_copy(libmongoc::database_get_write_concern(_get_impl().database_t)))); + mongocxx::v_noabi::write_concern wc( + bsoncxx::make_unique( + libmongoc::write_concern_copy(libmongoc::database_get_write_concern(_get_impl().database_t)))); return wc; } diff --git a/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/options/transaction.hh b/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/options/transaction.hh index eb25bbda53..0d69a78a36 100644 --- a/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/options/transaction.hh +++ b/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/options/transaction.hh @@ -42,9 +42,10 @@ class transaction::impl { unique_transaction_opt{libmongoc::transaction_opts_clone(txn_opts), &mongoc_transaction_opts_destroy}) {} impl(impl const& other) - : _transaction_opt_t(unique_transaction_opt{ - libmongoc::transaction_opts_clone(other._transaction_opt_t.get()), - &mongoc_transaction_opts_destroy}) {} + : _transaction_opt_t( + unique_transaction_opt{ + libmongoc::transaction_opts_clone(other._transaction_opt_t.get()), + &mongoc_transaction_opts_destroy}) {} impl& operator=(impl const& other) { _transaction_opt_t = unique_transaction_opt{ diff --git a/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/read_preference.cpp b/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/read_preference.cpp index 3ef3de2345..8c7d025d6f 100644 --- a/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/read_preference.cpp +++ b/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/read_preference.cpp @@ -44,14 +44,16 @@ read_preference::read_preference(std::unique_ptr&& implementation) { } read_preference::read_preference() - : _impl(bsoncxx::make_unique( - libmongoc::read_prefs_new(libmongoc::conversions::read_mode_t_from_read_mode(read_mode::k_primary)))) {} + : _impl( + bsoncxx::make_unique( + libmongoc::read_prefs_new(libmongoc::conversions::read_mode_t_from_read_mode(read_mode::k_primary)))) {} read_preference::read_preference(read_mode mode) : read_preference(mode, deprecated_tag{}) {} read_preference::read_preference(read_mode mode, deprecated_tag) - : _impl(bsoncxx::make_unique( - libmongoc::read_prefs_new(libmongoc::conversions::read_mode_t_from_read_mode(mode)))) {} + : _impl( + bsoncxx::make_unique( + libmongoc::read_prefs_new(libmongoc::conversions::read_mode_t_from_read_mode(mode)))) {} read_preference::read_preference(read_mode mode, bsoncxx::v_noabi::document::view_or_value tags) : read_preference(mode, std::move(tags), deprecated_tag{}) {} diff --git a/src/mongocxx/test/spec/operation.cpp b/src/mongocxx/test/spec/operation.cpp index bcaf63baa1..82eb97026b 100644 --- a/src/mongocxx/test/spec/operation.cpp +++ b/src/mongocxx/test/spec/operation.cpp @@ -732,20 +732,22 @@ document::value operation_runner::_run_replace_one(document::view operation) { } auto result = builder::basic::document{}; - result.append(builder::basic::kvp( - "result", [matched_count, modified_count, upserted_count, upserted_id](builder::basic::sub_document subdoc) { - subdoc.append(builder::basic::kvp("matchedCount", matched_count)); + result.append( + builder::basic::kvp( + "result", + [matched_count, modified_count, upserted_count, upserted_id](builder::basic::sub_document subdoc) { + subdoc.append(builder::basic::kvp("matchedCount", matched_count)); - if (modified_count) { - subdoc.append(builder::basic::kvp("modifiedCount", *modified_count)); - } + if (modified_count) { + subdoc.append(builder::basic::kvp("modifiedCount", *modified_count)); + } - subdoc.append(builder::basic::kvp("upsertedCount", upserted_count)); + subdoc.append(builder::basic::kvp("upsertedCount", upserted_count)); - if (upserted_id) { - subdoc.append(builder::basic::kvp("upsertedId", *upserted_id)); - } - })); + if (upserted_id) { + subdoc.append(builder::basic::kvp("upsertedId", *upserted_id)); + } + })); return result.extract(); } @@ -844,20 +846,22 @@ document::value operation_runner::_run_update_many(document::view operation) { } auto result = builder::basic::document{}; - result.append(builder::basic::kvp( - "result", [matched_count, modified_count, upserted_count, upserted_id](builder::basic::sub_document subdoc) { - subdoc.append(builder::basic::kvp("matchedCount", matched_count)); + result.append( + builder::basic::kvp( + "result", + [matched_count, modified_count, upserted_count, upserted_id](builder::basic::sub_document subdoc) { + subdoc.append(builder::basic::kvp("matchedCount", matched_count)); - if (modified_count) { - subdoc.append(builder::basic::kvp("modifiedCount", *modified_count)); - } + if (modified_count) { + subdoc.append(builder::basic::kvp("modifiedCount", *modified_count)); + } - subdoc.append(builder::basic::kvp("upsertedCount", upserted_count)); + subdoc.append(builder::basic::kvp("upsertedCount", upserted_count)); - if (upserted_id) { - subdoc.append(builder::basic::kvp("upsertedId", *upserted_id)); - } - })); + if (upserted_id) { + subdoc.append(builder::basic::kvp("upsertedId", *upserted_id)); + } + })); return result.extract(); } @@ -955,20 +959,22 @@ document::value operation_runner::_run_update_one(document::view operation) { } auto result = builder::basic::document{}; - result.append(builder::basic::kvp( - "result", [matched_count, modified_count, upserted_count, upserted_id](builder::basic::sub_document subdoc) { - subdoc.append(builder::basic::kvp("matchedCount", matched_count)); + result.append( + builder::basic::kvp( + "result", + [matched_count, modified_count, upserted_count, upserted_id](builder::basic::sub_document subdoc) { + subdoc.append(builder::basic::kvp("matchedCount", matched_count)); - if (modified_count) { - subdoc.append(builder::basic::kvp("modifiedCount", *modified_count)); - } + if (modified_count) { + subdoc.append(builder::basic::kvp("modifiedCount", *modified_count)); + } - subdoc.append(builder::basic::kvp("upsertedCount", upserted_count)); + subdoc.append(builder::basic::kvp("upsertedCount", upserted_count)); - if (upserted_id) { - subdoc.append(builder::basic::kvp("upsertedId", *upserted_id)); - } - })); + if (upserted_id) { + subdoc.append(builder::basic::kvp("upsertedId", *upserted_id)); + } + })); return result.extract(); } diff --git a/src/mongocxx/test/spec/unified_tests/operations.cpp b/src/mongocxx/test/spec/unified_tests/operations.cpp index c4cff26cdb..d03fe978dd 100644 --- a/src/mongocxx/test/spec/unified_tests/operations.cpp +++ b/src/mongocxx/test/spec/unified_tests/operations.cpp @@ -618,20 +618,22 @@ document::value replace_one(collection& coll, client_session* session, document: } auto result = builder::basic::document{}; - result.append(builder::basic::kvp( - "result", [matched_count, modified_count, upserted_count, upserted_id](builder::basic::sub_document subdoc) { - subdoc.append(builder::basic::kvp("matchedCount", matched_count)); + result.append( + builder::basic::kvp( + "result", + [matched_count, modified_count, upserted_count, upserted_id](builder::basic::sub_document subdoc) { + subdoc.append(builder::basic::kvp("matchedCount", matched_count)); - if (modified_count) { - subdoc.append(builder::basic::kvp("modifiedCount", *modified_count)); - } + if (modified_count) { + subdoc.append(builder::basic::kvp("modifiedCount", *modified_count)); + } - subdoc.append(builder::basic::kvp("upsertedCount", upserted_count)); + subdoc.append(builder::basic::kvp("upsertedCount", upserted_count)); - if (upserted_id) { - subdoc.append(builder::basic::kvp("upsertedId", *upserted_id)); - } - })); + if (upserted_id) { + subdoc.append(builder::basic::kvp("upsertedId", *upserted_id)); + } + })); return result.extract(); } diff --git a/src/mongocxx/test/v_noabi/client_helpers.cpp b/src/mongocxx/test/v_noabi/client_helpers.cpp index 17c51c7492..164cfd4174 100644 --- a/src/mongocxx/test/v_noabi/client_helpers.cpp +++ b/src/mongocxx/test/v_noabi/client_helpers.cpp @@ -177,8 +177,9 @@ bsoncxx::document::value transform_document_recursive( // transform. Otherwise, append the transformed key and value. switch (v.type()) { case bsoncxx::type::k_document: - builder.append(bsoncxx::builder::basic::kvp( - k, transform_document_recursive(v.get_document().value, fcn, context))); + builder.append( + bsoncxx::builder::basic::kvp( + k, transform_document_recursive(v.get_document().value, fcn, context))); break; case bsoncxx::type::k_array: diff --git a/src/mongocxx/test/v_noabi/client_side_encryption.cpp b/src/mongocxx/test/v_noabi/client_side_encryption.cpp index 01d213efed..50d879c937 100644 --- a/src/mongocxx/test/v_noabi/client_side_encryption.cpp +++ b/src/mongocxx/test/v_noabi/client_side_encryption.cpp @@ -2435,14 +2435,15 @@ TEST_CASE("Create Encrypted Collection", "[client_side_encryption]") { bsoncxx::stdx::optional master_key; }; - which w = GENERATE(Catch::Generators::values({ - {"aws", - make_document( - kvp("region", "us-east-1"), - kvp("key", "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0"))}, - // When testing 'local', use master_key of 'null' - {"local", bsoncxx::stdx::nullopt}, - })); + which w = GENERATE( + Catch::Generators::values({ + {"aws", + make_document( + kvp("region", "us-east-1"), + kvp("key", "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0"))}, + // When testing 'local', use master_key of 'null' + {"local", bsoncxx::stdx::nullopt}, + })); options::client_encryption cse_opts; _add_cse_opts(&cse_opts, &conn, true); @@ -2614,10 +2615,11 @@ TEST_CASE("Unique Index on keyAltNames", "[client_side_encryption]") { try { client_encryption.create_data_key("local", mongocxx::options::data_key().key_alt_names({"abc"})); } catch (mongocxx::operation_exception& e) { - REQUIRE(std::strstr( - e.what(), - "E11000 duplicate key error collection: keyvault.datakeys index: keyAltNames_1 " - "dup key: { keyAltNames: \"abc\" }: generic server error")); + REQUIRE( + std::strstr( + e.what(), + "E11000 duplicate key error collection: keyvault.datakeys index: keyAltNames_1 " + "dup key: { keyAltNames: \"abc\" }: generic server error")); exception_thrown = true; } REQUIRE(exception_thrown); @@ -2630,10 +2632,11 @@ TEST_CASE("Unique Index on keyAltNames", "[client_side_encryption]") { try { client_encryption.create_data_key("local", mongocxx::options::data_key().key_alt_names({"def"})); } catch (mongocxx::operation_exception& e) { - REQUIRE(std::strstr( - e.what(), - "E11000 duplicate key error collection: keyvault.datakeys index: keyAltNames_1 " - "dup key: { keyAltNames: \"def\" }: generic server error")); + REQUIRE( + std::strstr( + e.what(), + "E11000 duplicate key error collection: keyvault.datakeys index: keyAltNames_1 " + "dup key: { keyAltNames: \"def\" }: generic server error")); exception_thrown = true; } REQUIRE(exception_thrown); @@ -2663,10 +2666,11 @@ TEST_CASE("Unique Index on keyAltNames", "[client_side_encryption]") { try { client_encryption.add_key_alt_name(key_doc.view(), "def"); } catch (mongocxx::operation_exception& e) { - REQUIRE(std::strstr( - e.what(), - "E11000 duplicate key error collection: keyvault.datakeys index: keyAltNames_1 " - "dup key: { keyAltNames: \"def\" }: generic server error")); + REQUIRE( + std::strstr( + e.what(), + "E11000 duplicate key error collection: keyvault.datakeys index: keyAltNames_1 " + "dup key: { keyAltNames: \"def\" }: generic server error")); exception_thrown = true; } REQUIRE(exception_thrown); @@ -2975,10 +2979,11 @@ range_explicit_encryption_objects range_explicit_encryption_setup( auto& encrypted_client = *(res.encrypted_client_ptr = bsoncxx::make_unique( uri(), - test_util::add_test_server_api().auto_encryption_opts(options::auto_encryption() - .key_vault_namespace({"keyvault", "datakeys"}) - .kms_providers(kms_providers.view()) - .bypass_query_analysis(true)))); + test_util::add_test_server_api().auto_encryption_opts( + options::auto_encryption() + .key_vault_namespace({"keyvault", "datakeys"}) + .kms_providers(kms_providers.view()) + .bypass_query_analysis(true)))); // Ensure the type matches with the type of the encrypted field. auto const& field_values = *(res.field_values_ptr = bsoncxx::make_unique(field_type)); @@ -3408,11 +3413,12 @@ TEST_CASE("Range Explicit Encryption", "[client_side_encryption]") { client_encryption.encrypt( field_values.v6, options::encrypt() - .range_opts(options::range() - .min(to_field_value(0, field_type)) - .max(to_field_value(200, field_type)) - .sparsity(1) - .precision(2)) + .range_opts( + options::range() + .min(to_field_value(0, field_type)) + .max(to_field_value(200, field_type)) + .sparsity(1) + .precision(2)) .key_id(key1_id) .algorithm(options::encrypt::encryption_algorithm::k_range) .contention_factor(0)), @@ -3448,10 +3454,11 @@ TEST_CASE("Range Explicit Encryption applies defaults", "[client_side_encryption // kmsProviders: { "local": { "key": } } // } auto const kms_providers = _make_kms_doc(false); - mongocxx::client_encryption client_encryption(options::client_encryption() - .key_vault_client(&key_vault_client) - .key_vault_namespace({"keyvault", "datakeys"}) - .kms_providers(kms_providers.view())); + mongocxx::client_encryption client_encryption( + options::client_encryption() + .key_vault_client(&key_vault_client) + .key_vault_namespace({"keyvault", "datakeys"}) + .kms_providers(kms_providers.view())); // Create a key with `clientEncryption.createDataKey`. Store the returned key ID in a variable // named `keyId`. @@ -3475,9 +3482,10 @@ TEST_CASE("Range Explicit Encryption applies defaults", "[client_side_encryption .key_id(keyId.view()) .algorithm(options::encrypt::encryption_algorithm::k_range) .contention_factor(0) - .range_opts(options::range() - .min(to_field_value(0, RangeFieldType::Int)) - .max(to_field_value(1000, RangeFieldType::Int)))); + .range_opts( + options::range() + .min(to_field_value(0, RangeFieldType::Int)) + .max(to_field_value(1000, RangeFieldType::Int)))); SECTION("Case 1: Uses libmongocrypt defaults") { // Call `clientEncryption.encrypt` to encrypt the int32 value `123` with these options: @@ -3499,11 +3507,12 @@ TEST_CASE("Range Explicit Encryption applies defaults", "[client_side_encryption .key_id(keyId.view()) .algorithm(options::encrypt::encryption_algorithm::k_range) .contention_factor(0) - .range_opts(options::range() - .min(to_field_value(0, RangeFieldType::Int)) - .max(to_field_value(1000, RangeFieldType::Int)) - .sparsity(2) - .trim_factor(6))); + .range_opts( + options::range() + .min(to_field_value(0, RangeFieldType::Int)) + .max(to_field_value(1000, RangeFieldType::Int)) + .sparsity(2) + .trim_factor(6))); REQUIRE_NOTHROW( payload_defaults.view().get_binary().size == payload_libmongocrypt_defaults.view().get_binary().size); @@ -3528,10 +3537,11 @@ TEST_CASE("Range Explicit Encryption applies defaults", "[client_side_encryption .key_id(keyId.view()) .algorithm(options::encrypt::encryption_algorithm::k_range) .contention_factor(0) - .range_opts(options::range() - .min(to_field_value(0, RangeFieldType::Int)) - .max(to_field_value(1000, RangeFieldType::Int)) - .trim_factor(0))); + .range_opts( + options::range() + .min(to_field_value(0, RangeFieldType::Int)) + .max(to_field_value(1000, RangeFieldType::Int)) + .trim_factor(0))); REQUIRE_NOTHROW(payload_defaults.view().get_binary().size < payload_trim_factor_0.view().get_binary().size); } diff --git a/uv.lock b/uv.lock index c8c85b0d3f..8a3276a5f7 100644 --- a/uv.lock +++ b/uv.lock @@ -1,14 +1,14 @@ version = 1 -revision = 1 +revision = 2 requires-python = ">=3.10" [[package]] name = "annotated-types" version = "0.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, ] [[package]] @@ -19,18 +19,18 @@ dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload-time = "2025-04-15T17:05:13.836Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285 }, + { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload-time = "2025-04-15T17:05:12.221Z" }, ] [[package]] name = "certifi" -version = "2025.1.31" +version = "2025.6.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } +sdist = { url = "https://files.pythonhosted.org/packages/73/f7/f14b46d4bcd21092d7d3ccef689615220d8a08fb25e564b65d20738e672e/certifi-2025.6.15.tar.gz", hash = "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b", size = 158753, upload-time = "2025-06-15T02:45:51.329Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, + { url = "https://files.pythonhosted.org/packages/84/ae/320161bd181fc06471eed047ecce67b693fd7515b16d495d8932db763426/certifi-2025.6.15-py3-none-any.whl", hash = "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057", size = 157650, upload-time = "2025-06-15T02:45:49.977Z" }, ] [[package]] @@ -40,158 +40,159 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 }, - { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 }, - { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 }, - { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 }, - { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 }, - { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 }, - { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 }, - { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 }, - { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 }, - { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 }, - { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 }, - { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 }, - { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, - { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, - { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, - { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, - { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, - { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, - { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, - { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, - { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, - { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, - { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, - { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, - { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, - { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, - { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, - { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, - { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, - { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, - { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, - { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, - { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, - { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, - { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, - { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, - { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, - { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, - { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, - { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, - { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, - { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, - { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, - { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload-time = "2024-09-04T20:45:21.852Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191, upload-time = "2024-09-04T20:43:30.027Z" }, + { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592, upload-time = "2024-09-04T20:43:32.108Z" }, + { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024, upload-time = "2024-09-04T20:43:34.186Z" }, + { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188, upload-time = "2024-09-04T20:43:36.286Z" }, + { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571, upload-time = "2024-09-04T20:43:38.586Z" }, + { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687, upload-time = "2024-09-04T20:43:40.084Z" }, + { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211, upload-time = "2024-09-04T20:43:41.526Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325, upload-time = "2024-09-04T20:43:43.117Z" }, + { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784, upload-time = "2024-09-04T20:43:45.256Z" }, + { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564, upload-time = "2024-09-04T20:43:46.779Z" }, + { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804, upload-time = "2024-09-04T20:43:48.186Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299, upload-time = "2024-09-04T20:43:49.812Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264, upload-time = "2024-09-04T20:43:51.124Z" }, + { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651, upload-time = "2024-09-04T20:43:52.872Z" }, + { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259, upload-time = "2024-09-04T20:43:56.123Z" }, + { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200, upload-time = "2024-09-04T20:43:57.891Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235, upload-time = "2024-09-04T20:44:00.18Z" }, + { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721, upload-time = "2024-09-04T20:44:01.585Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242, upload-time = "2024-09-04T20:44:03.467Z" }, + { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999, upload-time = "2024-09-04T20:44:05.023Z" }, + { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242, upload-time = "2024-09-04T20:44:06.444Z" }, + { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604, upload-time = "2024-09-04T20:44:08.206Z" }, + { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727, upload-time = "2024-09-04T20:44:09.481Z" }, + { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400, upload-time = "2024-09-04T20:44:10.873Z" }, + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload-time = "2024-09-04T20:44:12.232Z" }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload-time = "2024-09-04T20:44:13.739Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload-time = "2024-09-04T20:44:15.231Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload-time = "2024-09-04T20:44:17.188Z" }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload-time = "2024-09-04T20:44:18.688Z" }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload-time = "2024-09-04T20:44:20.248Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload-time = "2024-09-04T20:44:21.673Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload-time = "2024-09-04T20:44:23.245Z" }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload-time = "2024-09-04T20:44:24.757Z" }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload-time = "2024-09-04T20:44:26.208Z" }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload-time = "2024-09-04T20:44:27.578Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload-time = "2024-09-04T20:44:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload-time = "2024-09-04T20:44:30.289Z" }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload-time = "2024-09-04T20:44:32.01Z" }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload-time = "2024-09-04T20:44:33.606Z" }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload-time = "2024-09-04T20:44:35.191Z" }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload-time = "2024-09-04T20:44:36.743Z" }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload-time = "2024-09-04T20:44:38.492Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload-time = "2024-09-04T20:44:40.046Z" }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload-time = "2024-09-04T20:44:41.616Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload-time = "2024-09-04T20:44:43.733Z" }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" }, ] [[package]] name = "charset-normalizer" -version = "3.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/58/5580c1716040bc89206c77d8f74418caf82ce519aae06450393ca73475d1/charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", size = 198013 }, - { url = "https://files.pythonhosted.org/packages/d0/11/00341177ae71c6f5159a08168bcb98c6e6d196d372c94511f9f6c9afe0c6/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", size = 141285 }, - { url = "https://files.pythonhosted.org/packages/01/09/11d684ea5819e5a8f5100fb0b38cf8d02b514746607934134d31233e02c8/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", size = 151449 }, - { url = "https://files.pythonhosted.org/packages/08/06/9f5a12939db324d905dc1f70591ae7d7898d030d7662f0d426e2286f68c9/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", size = 143892 }, - { url = "https://files.pythonhosted.org/packages/93/62/5e89cdfe04584cb7f4d36003ffa2936681b03ecc0754f8e969c2becb7e24/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", size = 146123 }, - { url = "https://files.pythonhosted.org/packages/a9/ac/ab729a15c516da2ab70a05f8722ecfccc3f04ed7a18e45c75bbbaa347d61/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", size = 147943 }, - { url = "https://files.pythonhosted.org/packages/03/d2/3f392f23f042615689456e9a274640c1d2e5dd1d52de36ab8f7955f8f050/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", size = 142063 }, - { url = "https://files.pythonhosted.org/packages/f2/e3/e20aae5e1039a2cd9b08d9205f52142329f887f8cf70da3650326670bddf/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", size = 150578 }, - { url = "https://files.pythonhosted.org/packages/8d/af/779ad72a4da0aed925e1139d458adc486e61076d7ecdcc09e610ea8678db/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", size = 153629 }, - { url = "https://files.pythonhosted.org/packages/c2/b6/7aa450b278e7aa92cf7732140bfd8be21f5f29d5bf334ae987c945276639/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", size = 150778 }, - { url = "https://files.pythonhosted.org/packages/39/f4/d9f4f712d0951dcbfd42920d3db81b00dd23b6ab520419626f4023334056/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", size = 146453 }, - { url = "https://files.pythonhosted.org/packages/49/2b/999d0314e4ee0cff3cb83e6bc9aeddd397eeed693edb4facb901eb8fbb69/charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", size = 95479 }, - { url = "https://files.pythonhosted.org/packages/2d/ce/3cbed41cff67e455a386fb5e5dd8906cdda2ed92fbc6297921f2e4419309/charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", size = 102790 }, - { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, - { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, - { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, - { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 }, - { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 }, - { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 }, - { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 }, - { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 }, - { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 }, - { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 }, - { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 }, - { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, - { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, - { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, - { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, - { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, - { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, - { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, - { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, - { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, - { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, - { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, - { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, - { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, - { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, - { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, - { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, - { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, - { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, - { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, - { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, - { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, - { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, - { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, - { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, - { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, - { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, - { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, - { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, - { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/28/9901804da60055b406e1a1c5ba7aac1276fb77f1dde635aabfc7fd84b8ab/charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", size = 201818, upload-time = "2025-05-02T08:31:46.725Z" }, + { url = "https://files.pythonhosted.org/packages/d9/9b/892a8c8af9110935e5adcbb06d9c6fe741b6bb02608c6513983048ba1a18/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", size = 144649, upload-time = "2025-05-02T08:31:48.889Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a5/4179abd063ff6414223575e008593861d62abfc22455b5d1a44995b7c101/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", size = 155045, upload-time = "2025-05-02T08:31:50.757Z" }, + { url = "https://files.pythonhosted.org/packages/3b/95/bc08c7dfeddd26b4be8c8287b9bb055716f31077c8b0ea1cd09553794665/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", size = 147356, upload-time = "2025-05-02T08:31:52.634Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2d/7a5b635aa65284bf3eab7653e8b4151ab420ecbae918d3e359d1947b4d61/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", size = 149471, upload-time = "2025-05-02T08:31:56.207Z" }, + { url = "https://files.pythonhosted.org/packages/ae/38/51fc6ac74251fd331a8cfdb7ec57beba8c23fd5493f1050f71c87ef77ed0/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", size = 151317, upload-time = "2025-05-02T08:31:57.613Z" }, + { url = "https://files.pythonhosted.org/packages/b7/17/edee1e32215ee6e9e46c3e482645b46575a44a2d72c7dfd49e49f60ce6bf/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", size = 146368, upload-time = "2025-05-02T08:31:59.468Z" }, + { url = "https://files.pythonhosted.org/packages/26/2c/ea3e66f2b5f21fd00b2825c94cafb8c326ea6240cd80a91eb09e4a285830/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", size = 154491, upload-time = "2025-05-02T08:32:01.219Z" }, + { url = "https://files.pythonhosted.org/packages/52/47/7be7fa972422ad062e909fd62460d45c3ef4c141805b7078dbab15904ff7/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", size = 157695, upload-time = "2025-05-02T08:32:03.045Z" }, + { url = "https://files.pythonhosted.org/packages/2f/42/9f02c194da282b2b340f28e5fb60762de1151387a36842a92b533685c61e/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", size = 154849, upload-time = "2025-05-02T08:32:04.651Z" }, + { url = "https://files.pythonhosted.org/packages/67/44/89cacd6628f31fb0b63201a618049be4be2a7435a31b55b5eb1c3674547a/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", size = 150091, upload-time = "2025-05-02T08:32:06.719Z" }, + { url = "https://files.pythonhosted.org/packages/1f/79/4b8da9f712bc079c0f16b6d67b099b0b8d808c2292c937f267d816ec5ecc/charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", size = 98445, upload-time = "2025-05-02T08:32:08.66Z" }, + { url = "https://files.pythonhosted.org/packages/7d/d7/96970afb4fb66497a40761cdf7bd4f6fca0fc7bafde3a84f836c1f57a926/charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", size = 105782, upload-time = "2025-05-02T08:32:10.46Z" }, + { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload-time = "2025-05-02T08:32:11.945Z" }, + { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload-time = "2025-05-02T08:32:13.946Z" }, + { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload-time = "2025-05-02T08:32:15.873Z" }, + { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload-time = "2025-05-02T08:32:17.283Z" }, + { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload-time = "2025-05-02T08:32:18.807Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload-time = "2025-05-02T08:32:20.333Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload-time = "2025-05-02T08:32:21.86Z" }, + { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload-time = "2025-05-02T08:32:23.434Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload-time = "2025-05-02T08:32:24.993Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload-time = "2025-05-02T08:32:26.435Z" }, + { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload-time = "2025-05-02T08:32:28.376Z" }, + { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload-time = "2025-05-02T08:32:30.281Z" }, + { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload-time = "2025-05-02T08:32:32.191Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload-time = "2025-05-02T08:32:33.712Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload-time = "2025-05-02T08:32:35.768Z" }, + { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload-time = "2025-05-02T08:32:37.284Z" }, + { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload-time = "2025-05-02T08:32:38.803Z" }, + { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload-time = "2025-05-02T08:32:40.251Z" }, + { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload-time = "2025-05-02T08:32:41.705Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload-time = "2025-05-02T08:32:43.709Z" }, + { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload-time = "2025-05-02T08:32:46.197Z" }, + { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload-time = "2025-05-02T08:32:48.105Z" }, + { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload-time = "2025-05-02T08:32:49.719Z" }, + { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload-time = "2025-05-02T08:32:51.404Z" }, + { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload-time = "2025-05-02T08:32:53.079Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload-time = "2025-05-02T08:32:54.573Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" }, + { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" }, + { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" }, + { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" }, + { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" }, + { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" }, + { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" }, + { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" }, + { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" }, + { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload-time = "2025-05-02T08:33:17.06Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload-time = "2025-05-02T08:33:18.753Z" }, + { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, ] [[package]] name = "clang-format" -version = "19.1.7" +version = "20.1.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/ee/71d017fe603c06b83d6720df6b3f6f07f03abf330f39beee3fee2a067c56/clang_format-19.1.7.tar.gz", hash = "sha256:bd6fc5272a41034a7844149203461d1f311bece9ed100d22eb3eebd952a25f49", size = 11122 } +sdist = { url = "https://files.pythonhosted.org/packages/a7/af/e138e1be1812ce0261ceaf5695e7d4299fa4d5085e1ed16e9157c4cda3ea/clang_format-20.1.7.tar.gz", hash = "sha256:2b0d76b9bf1f993bad33d2216b5fce4c407bc748fa31659ab7f51ca60df113c9", size = 11535, upload-time = "2025-06-26T12:57:25.283Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/c3/2f1c53bc298c1740d0c9f8dc2d9b7030be4826b6f2aa8a04f07ef25a3d9b/clang_format-19.1.7-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:a09f34d2c89d176581858ff718c327eebc14eb6415c176dab4af5bfd8582a999", size = 1428184 }, - { url = "https://files.pythonhosted.org/packages/8e/9d/7c246a3d08105de305553d14971ed6c16cde06d20ab12d6ce7f243cf66f0/clang_format-19.1.7-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:776f89c7b056c498c0e256485bc031cbf514aaebe71e929ed54e50c478524b65", size = 1398224 }, - { url = "https://files.pythonhosted.org/packages/b1/7d/002aa5571351ee7f00f87aae5104cdd30cad1a46f25936226f7d2aed06bf/clang_format-19.1.7-py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dac394c83a9233ab6707f66e1cdbd950f8b014b58604142a5b6f7998bf0bcc8c", size = 1730962 }, - { url = "https://files.pythonhosted.org/packages/1c/fe/24b7c13af432e609d65dc32c47c61f0a6c3b80d78eb7b3df37daf0395c56/clang_format-19.1.7-py2.py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbd4f94d929edf6d8d81e990dfaafc22bb10deaefcb2762150a136f281b01c00", size = 1908820 }, - { url = "https://files.pythonhosted.org/packages/7d/a8/86595ffd6ea0bf3a3013aad94e3d55be32ef987567781eddf4621e316d09/clang_format-19.1.7-py2.py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bdcda63fffdbe2aac23b54d46408a6283ad16676a5230a95b3ed49eacd99129b", size = 2622838 }, - { url = "https://files.pythonhosted.org/packages/48/d1/731ebf78c5d5cc043c20b0755c89239350b8e75ac5d667b99689e8110bc7/clang_format-19.1.7-py2.py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c13a5802da986b1400afbee97162c29f841890ab9e20a0be7ede18189219f5f1", size = 1723352 }, - { url = "https://files.pythonhosted.org/packages/3c/e7/0e526915a3a4a23100cc721c24226a192fa0385d394019d06920dc83fe6c/clang_format-19.1.7-py2.py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4906fb463dd2033032978f56962caab268c9428a384126b9400543eb667f11c", size = 1740347 }, - { url = "https://files.pythonhosted.org/packages/52/04/ed8e2af6b3e29655a858b3aad145f3f0539df0dd1c77815b95f578260bd3/clang_format-19.1.7-py2.py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ffca915c09aed9137f8c649ad7521bd5ce690c939121db1ba54af2ba63ac8374", size = 2675802 }, - { url = "https://files.pythonhosted.org/packages/9a/ab/7874a6f45c167f4cc4d02f517b85d14b6b5fa8412f6e9c7482588d00fccb/clang_format-19.1.7-py2.py3-none-musllinux_1_2_i686.whl", hash = "sha256:fc011dc7bbe3ac8a32e0caa37ab8ba6c1639ceef6ecd04feea8d37360fc175e4", size = 2977872 }, - { url = "https://files.pythonhosted.org/packages/46/b5/c87b6c46eb7e9d0f07e2bd56cd0a62bf7e679f146b4e1447110cfae4bd01/clang_format-19.1.7-py2.py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:afdfb11584f5a6f15127a7061673a7ea12a0393fe9ee8d2ed84e74bb191ffc3b", size = 3125795 }, - { url = "https://files.pythonhosted.org/packages/22/3e/7ea08aba446c1e838367d3c0e13eb3d2e482b23e099a25149d4f7f6b8c75/clang_format-19.1.7-py2.py3-none-musllinux_1_2_s390x.whl", hash = "sha256:6ce81d5b08e0169dc52037d3ff1802eafcaf86c281ceb8b38b8359ba7b6b7bdc", size = 3069663 }, - { url = "https://files.pythonhosted.org/packages/f5/f9/6ce7fe8ff52ded01d02a568358f2ddf993347e44202b6506b039a583b7ed/clang_format-19.1.7-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d27ac1a5a8783c9271d41cd5851766ca547ea003efa4e3764f880f319b2d3ed3", size = 2763172 }, - { url = "https://files.pythonhosted.org/packages/82/fa/77fe5636bb6b6252918bf129226a248506af218a2256deece3a9d95af850/clang_format-19.1.7-py2.py3-none-win32.whl", hash = "sha256:5dfde0be33f038114af89efb917144c2f766f8b7f3a3d3e4cb9c25f76d71ef81", size = 1243262 }, - { url = "https://files.pythonhosted.org/packages/e4/32/0b44f3582b9df0b8f90266ef43975e37ec8ad52bae4f85b71552f264d5a2/clang_format-19.1.7-py2.py3-none-win_amd64.whl", hash = "sha256:3e3c75fbdf8827bbb7277226b3057fc3785dabe7284d3a9d15fceb250f68f529", size = 1441132 }, + { url = "https://files.pythonhosted.org/packages/98/c7/d6b6b2f37e559cefc07426170368ddb5951753b7a831668666c5d91d6b79/clang_format-20.1.7-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:70a904719a1bd6653d77ddc6d7b40418845912a1a2a419b9116b819a6b619f8c", size = 1436729, upload-time = "2025-06-26T12:57:02.479Z" }, + { url = "https://files.pythonhosted.org/packages/a0/8c/ae7bc9122a2c7505506bba4aae9d9f38c01435b735a38c65985d30efc943/clang_format-20.1.7-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:e5257e8188569e4e47fceb3ba3317b0b44dc5ab5046c8cc2d58c626430c747a6", size = 1410576, upload-time = "2025-06-26T12:57:04.441Z" }, + { url = "https://files.pythonhosted.org/packages/19/c1/6777ef4eafa63d35dda0cda2803e818d17a0a9fe3216837eab1f169afbee/clang_format-20.1.7-py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1dad1e6f9eb732b76046bf5810c6ee78b9e6cd6b3616cb75d9bde06ecd3222e6", size = 1794265, upload-time = "2025-06-26T12:57:05.722Z" }, + { url = "https://files.pythonhosted.org/packages/54/8f/33a426e3b61cff30e4d8d7173508da277ece67296428b7657da681c821d5/clang_format-20.1.7-py2.py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27ed7fe674e8a77461c8d5b117ed96021aa18233917b3fe54b95391e0b22d04", size = 1968022, upload-time = "2025-06-26T12:57:07.03Z" }, + { url = "https://files.pythonhosted.org/packages/da/1f/fc0fe12a27153370ca55490bedd29f11611b1a1336779472dec5f3d6af94/clang_format-20.1.7-py2.py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bd144f093b4a3ac8a0f0d0ebb9b013974884d9da0627b9905949c6f3213aa850", size = 2724211, upload-time = "2025-06-26T12:57:08.75Z" }, + { url = "https://files.pythonhosted.org/packages/c0/fd/7d7462d307d8827de0b8b183b3b467643e14c61e880b5485e7aa80a11db7/clang_format-20.1.7-py2.py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d79484ce2c8f621242046c4bb0aefd49445ec5c7bc3c404af97490289791b777", size = 1789853, upload-time = "2025-06-26T12:57:10.314Z" }, + { url = "https://files.pythonhosted.org/packages/8b/7f/55985595ffbf9bcec64ad36e9a0451cf8556ba0fb1a80781943de106cfa3/clang_format-20.1.7-py2.py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cbfb99dab836027498190f55e543bed51bae33ae6dc256861e7aa91368de98", size = 1801091, upload-time = "2025-06-26T12:57:11.708Z" }, + { url = "https://files.pythonhosted.org/packages/84/2e/04009020237243f8785188810ee33bc9ce0773e3ccba2599768381dac088/clang_format-20.1.7-py2.py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4c05114a10efe85c11fde518fe0fadc2977ce4a997a26ceaac88521daee83bbd", size = 2774653, upload-time = "2025-06-26T12:57:13.248Z" }, + { url = "https://files.pythonhosted.org/packages/1c/22/8f98cf57f54a06ff3a08dd79fba25617a4495614b6458bc69e46e81caa96/clang_format-20.1.7-py2.py3-none-musllinux_1_2_i686.whl", hash = "sha256:9cd4d64dc0e34b23badad0ce3a235fb5c8ac63651d9f91d1c806356212cbca6c", size = 3100264, upload-time = "2025-06-26T12:57:14.59Z" }, + { url = "https://files.pythonhosted.org/packages/0b/93/b5dc2959423b203f8a8db35ff7f19a114c50df265728714dcaf90d779d4f/clang_format-20.1.7-py2.py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:11431cb437ed22be85744ea47b3a6801bc61de7ac4b775bf1cb89ee190c992d4", size = 3186502, upload-time = "2025-06-26T12:57:16.176Z" }, + { url = "https://files.pythonhosted.org/packages/da/a6/3ae4861b2fd3eba3b47d46e5c31b4dac0065a8048dc77825a85ac141e991/clang_format-20.1.7-py2.py3-none-musllinux_1_2_s390x.whl", hash = "sha256:29f5fe39e60579ca253d31c1122ce06a80716400ec7e5dc38833da80f88dbbd5", size = 3224655, upload-time = "2025-06-26T12:57:18.012Z" }, + { url = "https://files.pythonhosted.org/packages/64/df/8668d80685b0556fead8ecc9ff221574d9f2b4011a68da155c54acab6dc6/clang_format-20.1.7-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6db0b7271af8cbc2656b3b6b31e4276d5c6b8ceafb1981760f4738cfbe0a9e43", size = 2881843, upload-time = "2025-06-26T12:57:19.347Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e8/5f105c2195fe565b9b5203f533f6d727a73d98ef3b295e3f2f01ddf5d847/clang_format-20.1.7-py2.py3-none-win32.whl", hash = "sha256:7bd56bd0f519959488977dcddddba4e4fd07cba6225ed09ad658caa1f7286d1f", size = 1259337, upload-time = "2025-06-26T12:57:21.029Z" }, + { url = "https://files.pythonhosted.org/packages/31/0d/a3685e3287d3ff3676297da331d7a05110dee049c773af2d6a1f5c8df0b0/clang_format-20.1.7-py2.py3-none-win_amd64.whl", hash = "sha256:4a9b909b1a9eb0b91aae51fdeeeb013ce20f9079d2e0fa8b8381e97c268dc889", size = 1444266, upload-time = "2025-06-26T12:57:22.37Z" }, + { url = "https://files.pythonhosted.org/packages/88/93/5242ed23c0ec6b2e28509452b41c732789822c9e5aa4a899e406f9d15d64/clang_format-20.1.7-py2.py3-none-win_arm64.whl", hash = "sha256:d11c62d38b9144d30021b884b0f95e7270a6bcbf4f22bdd7dae94a531d82fbba", size = 1319591, upload-time = "2025-06-26T12:57:23.704Z" }, ] [[package]] name = "click" -version = "8.1.8" +version = "8.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] [[package]] @@ -201,63 +202,65 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "python-dateutil" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/56/f8500161d9ab57ea5ad29c203b85989f87af13a367b3178ade0cd34d8d3a/croniter-1.4.1.tar.gz", hash = "sha256:1a6df60eacec3b7a0aa52a8f2ef251ae3dd2a7c7c8b9874e73e791636d55a361", size = 42301 } +sdist = { url = "https://files.pythonhosted.org/packages/96/56/f8500161d9ab57ea5ad29c203b85989f87af13a367b3178ade0cd34d8d3a/croniter-1.4.1.tar.gz", hash = "sha256:1a6df60eacec3b7a0aa52a8f2ef251ae3dd2a7c7c8b9874e73e791636d55a361", size = 42301, upload-time = "2023-06-15T18:03:35.834Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/91/e5ae454da8200c6eb6cf94ca05d799b51e2cb2cc458a7737aebc0c5a21bb/croniter-1.4.1-py2.py3-none-any.whl", hash = "sha256:9595da48af37ea06ec3a9f899738f1b2c1c13da3c38cea606ef7cd03ea421128", size = 19579 }, + { url = "https://files.pythonhosted.org/packages/f2/91/e5ae454da8200c6eb6cf94ca05d799b51e2cb2cc458a7737aebc0c5a21bb/croniter-1.4.1-py2.py3-none-any.whl", hash = "sha256:9595da48af37ea06ec3a9f899738f1b2c1c13da3c38cea606ef7cd03ea421128", size = 19579, upload-time = "2023-06-15T18:03:32.125Z" }, ] [[package]] name = "cryptography" -version = "44.0.2" +version = "45.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cd/25/4ce80c78963834b8a9fd1cc1266be5ed8d1840785c0f2e1b73b8d128d505/cryptography-44.0.2.tar.gz", hash = "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0", size = 710807 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/92/ef/83e632cfa801b221570c5f58c0369db6fa6cef7d9ff859feab1aae1a8a0f/cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7", size = 6676361 }, - { url = "https://files.pythonhosted.org/packages/30/ec/7ea7c1e4c8fc8329506b46c6c4a52e2f20318425d48e0fe597977c71dbce/cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1", size = 3952350 }, - { url = "https://files.pythonhosted.org/packages/27/61/72e3afdb3c5ac510330feba4fc1faa0fe62e070592d6ad00c40bb69165e5/cryptography-44.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb", size = 4166572 }, - { url = "https://files.pythonhosted.org/packages/26/e4/ba680f0b35ed4a07d87f9e98f3ebccb05091f3bf6b5a478b943253b3bbd5/cryptography-44.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843", size = 3958124 }, - { url = "https://files.pythonhosted.org/packages/9c/e8/44ae3e68c8b6d1cbc59040288056df2ad7f7f03bbcaca6b503c737ab8e73/cryptography-44.0.2-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5", size = 3678122 }, - { url = "https://files.pythonhosted.org/packages/27/7b/664ea5e0d1eab511a10e480baf1c5d3e681c7d91718f60e149cec09edf01/cryptography-44.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c", size = 4191831 }, - { url = "https://files.pythonhosted.org/packages/2a/07/79554a9c40eb11345e1861f46f845fa71c9e25bf66d132e123d9feb8e7f9/cryptography-44.0.2-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a", size = 3960583 }, - { url = "https://files.pythonhosted.org/packages/bb/6d/858e356a49a4f0b591bd6789d821427de18432212e137290b6d8a817e9bf/cryptography-44.0.2-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308", size = 4191753 }, - { url = "https://files.pythonhosted.org/packages/b2/80/62df41ba4916067fa6b125aa8c14d7e9181773f0d5d0bd4dcef580d8b7c6/cryptography-44.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688", size = 4079550 }, - { url = "https://files.pythonhosted.org/packages/f3/cd/2558cc08f7b1bb40683f99ff4327f8dcfc7de3affc669e9065e14824511b/cryptography-44.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7", size = 4298367 }, - { url = "https://files.pythonhosted.org/packages/71/59/94ccc74788945bc3bd4cf355d19867e8057ff5fdbcac781b1ff95b700fb1/cryptography-44.0.2-cp37-abi3-win32.whl", hash = "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79", size = 2772843 }, - { url = "https://files.pythonhosted.org/packages/ca/2c/0d0bbaf61ba05acb32f0841853cfa33ebb7a9ab3d9ed8bb004bd39f2da6a/cryptography-44.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa", size = 3209057 }, - { url = "https://files.pythonhosted.org/packages/9e/be/7a26142e6d0f7683d8a382dd963745e65db895a79a280a30525ec92be890/cryptography-44.0.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3", size = 6677789 }, - { url = "https://files.pythonhosted.org/packages/06/88/638865be7198a84a7713950b1db7343391c6066a20e614f8fa286eb178ed/cryptography-44.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639", size = 3951919 }, - { url = "https://files.pythonhosted.org/packages/d7/fc/99fe639bcdf58561dfad1faa8a7369d1dc13f20acd78371bb97a01613585/cryptography-44.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd", size = 4167812 }, - { url = "https://files.pythonhosted.org/packages/53/7b/aafe60210ec93d5d7f552592a28192e51d3c6b6be449e7fd0a91399b5d07/cryptography-44.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181", size = 3958571 }, - { url = "https://files.pythonhosted.org/packages/16/32/051f7ce79ad5a6ef5e26a92b37f172ee2d6e1cce09931646eef8de1e9827/cryptography-44.0.2-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea", size = 3679832 }, - { url = "https://files.pythonhosted.org/packages/78/2b/999b2a1e1ba2206f2d3bca267d68f350beb2b048a41ea827e08ce7260098/cryptography-44.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699", size = 4193719 }, - { url = "https://files.pythonhosted.org/packages/72/97/430e56e39a1356e8e8f10f723211a0e256e11895ef1a135f30d7d40f2540/cryptography-44.0.2-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9", size = 3960852 }, - { url = "https://files.pythonhosted.org/packages/89/33/c1cf182c152e1d262cac56850939530c05ca6c8d149aa0dcee490b417e99/cryptography-44.0.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23", size = 4193906 }, - { url = "https://files.pythonhosted.org/packages/e1/99/87cf26d4f125380dc674233971069bc28d19b07f7755b29861570e513650/cryptography-44.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922", size = 4081572 }, - { url = "https://files.pythonhosted.org/packages/b3/9f/6a3e0391957cc0c5f84aef9fbdd763035f2b52e998a53f99345e3ac69312/cryptography-44.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4", size = 4298631 }, - { url = "https://files.pythonhosted.org/packages/e2/a5/5bc097adb4b6d22a24dea53c51f37e480aaec3465285c253098642696423/cryptography-44.0.2-cp39-abi3-win32.whl", hash = "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5", size = 2773792 }, - { url = "https://files.pythonhosted.org/packages/33/cf/1f7649b8b9a3543e042d3f348e398a061923ac05b507f3f4d95f11938aa9/cryptography-44.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6", size = 3210957 }, - { url = "https://files.pythonhosted.org/packages/99/10/173be140714d2ebaea8b641ff801cbcb3ef23101a2981cbf08057876f89e/cryptography-44.0.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb", size = 3396886 }, - { url = "https://files.pythonhosted.org/packages/2f/b4/424ea2d0fce08c24ede307cead3409ecbfc2f566725d4701b9754c0a1174/cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41", size = 3892387 }, - { url = "https://files.pythonhosted.org/packages/28/20/8eaa1a4f7c68a1cb15019dbaad59c812d4df4fac6fd5f7b0b9c5177f1edd/cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562", size = 4109922 }, - { url = "https://files.pythonhosted.org/packages/11/25/5ed9a17d532c32b3bc81cc294d21a36c772d053981c22bd678396bc4ae30/cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5", size = 3895715 }, - { url = "https://files.pythonhosted.org/packages/63/31/2aac03b19c6329b62c45ba4e091f9de0b8f687e1b0cd84f101401bece343/cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa", size = 4109876 }, - { url = "https://files.pythonhosted.org/packages/99/ec/6e560908349843718db1a782673f36852952d52a55ab14e46c42c8a7690a/cryptography-44.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d", size = 3131719 }, - { url = "https://files.pythonhosted.org/packages/d6/d7/f30e75a6aa7d0f65031886fa4a1485c2fbfe25a1896953920f6a9cfe2d3b/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d", size = 3887513 }, - { url = "https://files.pythonhosted.org/packages/9c/b4/7a494ce1032323ca9db9a3661894c66e0d7142ad2079a4249303402d8c71/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471", size = 4107432 }, - { url = "https://files.pythonhosted.org/packages/45/f8/6b3ec0bc56123b344a8d2b3264a325646d2dcdbdd9848b5e6f3d37db90b3/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615", size = 3891421 }, - { url = "https://files.pythonhosted.org/packages/57/ff/f3b4b2d007c2a646b0f69440ab06224f9cf37a977a72cdb7b50632174e8a/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390", size = 4107081 }, +sdist = { url = "https://files.pythonhosted.org/packages/fe/c8/a2a376a8711c1e11708b9c9972e0c3223f5fc682552c82d8db844393d6ce/cryptography-45.0.4.tar.gz", hash = "sha256:7405ade85c83c37682c8fe65554759800a4a8c54b2d96e0f8ad114d31b808d57", size = 744890, upload-time = "2025-06-10T00:03:51.297Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/1c/92637793de053832523b410dbe016d3f5c11b41d0cf6eef8787aabb51d41/cryptography-45.0.4-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:425a9a6ac2823ee6e46a76a21a4e8342d8fa5c01e08b823c1f19a8b74f096069", size = 7055712, upload-time = "2025-06-10T00:02:38.826Z" }, + { url = "https://files.pythonhosted.org/packages/ba/14/93b69f2af9ba832ad6618a03f8a034a5851dc9a3314336a3d71c252467e1/cryptography-45.0.4-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:680806cf63baa0039b920f4976f5f31b10e772de42f16310a6839d9f21a26b0d", size = 4205335, upload-time = "2025-06-10T00:02:41.64Z" }, + { url = "https://files.pythonhosted.org/packages/67/30/fae1000228634bf0b647fca80403db5ca9e3933b91dd060570689f0bd0f7/cryptography-45.0.4-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4ca0f52170e821bc8da6fc0cc565b7bb8ff8d90d36b5e9fdd68e8a86bdf72036", size = 4431487, upload-time = "2025-06-10T00:02:43.696Z" }, + { url = "https://files.pythonhosted.org/packages/6d/5a/7dffcf8cdf0cb3c2430de7404b327e3db64735747d641fc492539978caeb/cryptography-45.0.4-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f3fe7a5ae34d5a414957cc7f457e2b92076e72938423ac64d215722f6cf49a9e", size = 4208922, upload-time = "2025-06-10T00:02:45.334Z" }, + { url = "https://files.pythonhosted.org/packages/c6/f3/528729726eb6c3060fa3637253430547fbaaea95ab0535ea41baa4a6fbd8/cryptography-45.0.4-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:25eb4d4d3e54595dc8adebc6bbd5623588991d86591a78c2548ffb64797341e2", size = 3900433, upload-time = "2025-06-10T00:02:47.359Z" }, + { url = "https://files.pythonhosted.org/packages/d9/4a/67ba2e40f619e04d83c32f7e1d484c1538c0800a17c56a22ff07d092ccc1/cryptography-45.0.4-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ce1678a2ccbe696cf3af15a75bb72ee008d7ff183c9228592ede9db467e64f1b", size = 4464163, upload-time = "2025-06-10T00:02:49.412Z" }, + { url = "https://files.pythonhosted.org/packages/7e/9a/b4d5aa83661483ac372464809c4b49b5022dbfe36b12fe9e323ca8512420/cryptography-45.0.4-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:49fe9155ab32721b9122975e168a6760d8ce4cffe423bcd7ca269ba41b5dfac1", size = 4208687, upload-time = "2025-06-10T00:02:50.976Z" }, + { url = "https://files.pythonhosted.org/packages/db/b7/a84bdcd19d9c02ec5807f2ec2d1456fd8451592c5ee353816c09250e3561/cryptography-45.0.4-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2882338b2a6e0bd337052e8b9007ced85c637da19ef9ecaf437744495c8c2999", size = 4463623, upload-time = "2025-06-10T00:02:52.542Z" }, + { url = "https://files.pythonhosted.org/packages/d8/84/69707d502d4d905021cac3fb59a316344e9f078b1da7fb43ecde5e10840a/cryptography-45.0.4-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:23b9c3ea30c3ed4db59e7b9619272e94891f8a3a5591d0b656a7582631ccf750", size = 4332447, upload-time = "2025-06-10T00:02:54.63Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ee/d4f2ab688e057e90ded24384e34838086a9b09963389a5ba6854b5876598/cryptography-45.0.4-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0a97c927497e3bc36b33987abb99bf17a9a175a19af38a892dc4bbb844d7ee2", size = 4572830, upload-time = "2025-06-10T00:02:56.689Z" }, + { url = "https://files.pythonhosted.org/packages/70/d4/994773a261d7ff98034f72c0e8251fe2755eac45e2265db4c866c1c6829c/cryptography-45.0.4-cp311-abi3-win32.whl", hash = "sha256:e00a6c10a5c53979d6242f123c0a97cff9f3abed7f064fc412c36dc521b5f257", size = 2932769, upload-time = "2025-06-10T00:02:58.467Z" }, + { url = "https://files.pythonhosted.org/packages/5a/42/c80bd0b67e9b769b364963b5252b17778a397cefdd36fa9aa4a5f34c599a/cryptography-45.0.4-cp311-abi3-win_amd64.whl", hash = "sha256:817ee05c6c9f7a69a16200f0c90ab26d23a87701e2a284bd15156783e46dbcc8", size = 3410441, upload-time = "2025-06-10T00:03:00.14Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0b/2488c89f3a30bc821c9d96eeacfcab6ff3accc08a9601ba03339c0fd05e5/cryptography-45.0.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:964bcc28d867e0f5491a564b7debb3ffdd8717928d315d12e0d7defa9e43b723", size = 7031836, upload-time = "2025-06-10T00:03:01.726Z" }, + { url = "https://files.pythonhosted.org/packages/fe/51/8c584ed426093aac257462ae62d26ad61ef1cbf5b58d8b67e6e13c39960e/cryptography-45.0.4-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6a5bf57554e80f75a7db3d4b1dacaa2764611ae166ab42ea9a72bcdb5d577637", size = 4195746, upload-time = "2025-06-10T00:03:03.94Z" }, + { url = "https://files.pythonhosted.org/packages/5c/7d/4b0ca4d7af95a704eef2f8f80a8199ed236aaf185d55385ae1d1610c03c2/cryptography-45.0.4-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:46cf7088bf91bdc9b26f9c55636492c1cce3e7aaf8041bbf0243f5e5325cfb2d", size = 4424456, upload-time = "2025-06-10T00:03:05.589Z" }, + { url = "https://files.pythonhosted.org/packages/1d/45/5fabacbc6e76ff056f84d9f60eeac18819badf0cefc1b6612ee03d4ab678/cryptography-45.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7bedbe4cc930fa4b100fc845ea1ea5788fcd7ae9562e669989c11618ae8d76ee", size = 4198495, upload-time = "2025-06-10T00:03:09.172Z" }, + { url = "https://files.pythonhosted.org/packages/55/b7/ffc9945b290eb0a5d4dab9b7636706e3b5b92f14ee5d9d4449409d010d54/cryptography-45.0.4-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:eaa3e28ea2235b33220b949c5a0d6cf79baa80eab2eb5607ca8ab7525331b9ff", size = 3885540, upload-time = "2025-06-10T00:03:10.835Z" }, + { url = "https://files.pythonhosted.org/packages/7f/e3/57b010282346980475e77d414080acdcb3dab9a0be63071efc2041a2c6bd/cryptography-45.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:7ef2dde4fa9408475038fc9aadfc1fb2676b174e68356359632e980c661ec8f6", size = 4452052, upload-time = "2025-06-10T00:03:12.448Z" }, + { url = "https://files.pythonhosted.org/packages/37/e6/ddc4ac2558bf2ef517a358df26f45bc774a99bf4653e7ee34b5e749c03e3/cryptography-45.0.4-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:6a3511ae33f09094185d111160fd192c67aa0a2a8d19b54d36e4c78f651dc5ad", size = 4198024, upload-time = "2025-06-10T00:03:13.976Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c0/85fa358ddb063ec588aed4a6ea1df57dc3e3bc1712d87c8fa162d02a65fc/cryptography-45.0.4-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:06509dc70dd71fa56eaa138336244e2fbaf2ac164fc9b5e66828fccfd2b680d6", size = 4451442, upload-time = "2025-06-10T00:03:16.248Z" }, + { url = "https://files.pythonhosted.org/packages/33/67/362d6ec1492596e73da24e669a7fbbaeb1c428d6bf49a29f7a12acffd5dc/cryptography-45.0.4-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:5f31e6b0a5a253f6aa49be67279be4a7e5a4ef259a9f33c69f7d1b1191939872", size = 4325038, upload-time = "2025-06-10T00:03:18.4Z" }, + { url = "https://files.pythonhosted.org/packages/53/75/82a14bf047a96a1b13ebb47fb9811c4f73096cfa2e2b17c86879687f9027/cryptography-45.0.4-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:944e9ccf67a9594137f942d5b52c8d238b1b4e46c7a0c2891b7ae6e01e7c80a4", size = 4560964, upload-time = "2025-06-10T00:03:20.06Z" }, + { url = "https://files.pythonhosted.org/packages/cd/37/1a3cba4c5a468ebf9b95523a5ef5651244693dc712001e276682c278fc00/cryptography-45.0.4-cp37-abi3-win32.whl", hash = "sha256:c22fe01e53dc65edd1945a2e6f0015e887f84ced233acecb64b4daadb32f5c97", size = 2924557, upload-time = "2025-06-10T00:03:22.563Z" }, + { url = "https://files.pythonhosted.org/packages/2a/4b/3256759723b7e66380397d958ca07c59cfc3fb5c794fb5516758afd05d41/cryptography-45.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:627ba1bc94f6adf0b0a2e35d87020285ead22d9f648c7e75bb64f367375f3b22", size = 3395508, upload-time = "2025-06-10T00:03:24.586Z" }, + { url = "https://files.pythonhosted.org/packages/16/33/b38e9d372afde56906a23839302c19abdac1c505bfb4776c1e4b07c3e145/cryptography-45.0.4-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a77c6fb8d76e9c9f99f2f3437c1a4ac287b34eaf40997cfab1e9bd2be175ac39", size = 3580103, upload-time = "2025-06-10T00:03:26.207Z" }, + { url = "https://files.pythonhosted.org/packages/c4/b9/357f18064ec09d4807800d05a48f92f3b369056a12f995ff79549fbb31f1/cryptography-45.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7aad98a25ed8ac917fdd8a9c1e706e5a0956e06c498be1f713b61734333a4507", size = 4143732, upload-time = "2025-06-10T00:03:27.896Z" }, + { url = "https://files.pythonhosted.org/packages/c4/9c/7f7263b03d5db329093617648b9bd55c953de0b245e64e866e560f9aac07/cryptography-45.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3530382a43a0e524bc931f187fc69ef4c42828cf7d7f592f7f249f602b5a4ab0", size = 4385424, upload-time = "2025-06-10T00:03:29.992Z" }, + { url = "https://files.pythonhosted.org/packages/a6/5a/6aa9d8d5073d5acc0e04e95b2860ef2684b2bd2899d8795fc443013e263b/cryptography-45.0.4-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:6b613164cb8425e2f8db5849ffb84892e523bf6d26deb8f9bb76ae86181fa12b", size = 4142438, upload-time = "2025-06-10T00:03:31.782Z" }, + { url = "https://files.pythonhosted.org/packages/42/1c/71c638420f2cdd96d9c2b287fec515faf48679b33a2b583d0f1eda3a3375/cryptography-45.0.4-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:96d4819e25bf3b685199b304a0029ce4a3caf98947ce8a066c9137cc78ad2c58", size = 4384622, upload-time = "2025-06-10T00:03:33.491Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ab/e3a055c34e97deadbf0d846e189237d3385dca99e1a7e27384c3b2292041/cryptography-45.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b97737a3ffbea79eebb062eb0d67d72307195035332501722a9ca86bab9e3ab2", size = 3328911, upload-time = "2025-06-10T00:03:35.035Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ba/cf442ae99ef363855ed84b39e0fb3c106ac66b7a7703f3c9c9cfe05412cb/cryptography-45.0.4-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4828190fb6c4bcb6ebc6331f01fe66ae838bb3bd58e753b59d4b22eb444b996c", size = 3590512, upload-time = "2025-06-10T00:03:36.982Z" }, + { url = "https://files.pythonhosted.org/packages/28/9a/a7d5bb87d149eb99a5abdc69a41e4e47b8001d767e5f403f78bfaafc7aa7/cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:03dbff8411206713185b8cebe31bc5c0eb544799a50c09035733716b386e61a4", size = 4146899, upload-time = "2025-06-10T00:03:38.659Z" }, + { url = "https://files.pythonhosted.org/packages/17/11/9361c2c71c42cc5c465cf294c8030e72fb0c87752bacbd7a3675245e3db3/cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51dfbd4d26172d31150d84c19bbe06c68ea4b7f11bbc7b3a5e146b367c311349", size = 4388900, upload-time = "2025-06-10T00:03:40.233Z" }, + { url = "https://files.pythonhosted.org/packages/c0/76/f95b83359012ee0e670da3e41c164a0c256aeedd81886f878911581d852f/cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:0339a692de47084969500ee455e42c58e449461e0ec845a34a6a9b9bf7df7fb8", size = 4146422, upload-time = "2025-06-10T00:03:41.827Z" }, + { url = "https://files.pythonhosted.org/packages/09/ad/5429fcc4def93e577a5407988f89cf15305e64920203d4ac14601a9dc876/cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:0cf13c77d710131d33e63626bd55ae7c0efb701ebdc2b3a7952b9b23a0412862", size = 4388475, upload-time = "2025-06-10T00:03:43.493Z" }, + { url = "https://files.pythonhosted.org/packages/99/49/0ab9774f64555a1b50102757811508f5ace451cf5dc0a2d074a4b9deca6a/cryptography-45.0.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bbc505d1dc469ac12a0a064214879eac6294038d6b24ae9f71faae1448a9608d", size = 3337594, upload-time = "2025-06-10T00:03:45.523Z" }, ] [[package]] name = "defusedxml" version = "0.7.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520 } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 }, + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, ] [[package]] @@ -267,9 +270,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744 } +sdist = { url = "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744, upload-time = "2025-01-27T10:46:25.7Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998 }, + { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998, upload-time = "2025-01-27T10:46:09.186Z" }, ] [[package]] @@ -279,9 +282,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "smmap" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684 } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794 }, + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload-time = "2025-01-02T07:20:43.624Z" }, ] [[package]] @@ -291,18 +294,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gitdb" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196 } +sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196, upload-time = "2025-01-02T07:32:43.59Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599 }, + { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599, upload-time = "2025-01-02T07:32:40.731Z" }, ] [[package]] name = "idna" version = "3.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, ] [[package]] @@ -318,18 +321,18 @@ dependencies = [ { name = "requests-toolbelt" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/b4/557e4c80c0ea12164ffeec0e29372c085bfb263faad53cef5e1455523bec/jira-3.8.0.tar.gz", hash = "sha256:63719c529a570aaa01c3373dbb5a104dab70381c5be447f6c27f997302fa335a", size = 102927 } +sdist = { url = "https://files.pythonhosted.org/packages/78/b4/557e4c80c0ea12164ffeec0e29372c085bfb263faad53cef5e1455523bec/jira-3.8.0.tar.gz", hash = "sha256:63719c529a570aaa01c3373dbb5a104dab70381c5be447f6c27f997302fa335a", size = 102927, upload-time = "2024-03-25T12:17:03.287Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/52/bb617020064261ba31cc965e932943458b7facfd9691ad7f76a2b631f44f/jira-3.8.0-py3-none-any.whl", hash = "sha256:12190dc84dad00b8a6c0341f7e8a254b0f38785afdec022bd5941e1184a5a3fb", size = 77505 }, + { url = "https://files.pythonhosted.org/packages/4f/52/bb617020064261ba31cc965e932943458b7facfd9691ad7f76a2b631f44f/jira-3.8.0-py3-none-any.whl", hash = "sha256:12190dc84dad00b8a6c0341f7e8a254b0f38785afdec022bd5941e1184a5a3fb", size = 77505, upload-time = "2024-03-25T12:16:59.916Z" }, ] [[package]] name = "looseversion" version = "1.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/64/7e/f13dc08e0712cc2eac8e56c7909ce2ac280dbffef2ffd87bd5277ce9d58b/looseversion-1.3.0.tar.gz", hash = "sha256:ebde65f3f6bb9531a81016c6fef3eb95a61181adc47b7f949e9c0ea47911669e", size = 8799 } +sdist = { url = "https://files.pythonhosted.org/packages/64/7e/f13dc08e0712cc2eac8e56c7909ce2ac280dbffef2ffd87bd5277ce9d58b/looseversion-1.3.0.tar.gz", hash = "sha256:ebde65f3f6bb9531a81016c6fef3eb95a61181adc47b7f949e9c0ea47911669e", size = 8799, upload-time = "2023-07-05T16:07:51.173Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/74/d5405b9b3b12e9176dff223576d7090bc161092878f533fd0dc23dd6ae1d/looseversion-1.3.0-py2.py3-none-any.whl", hash = "sha256:781ef477b45946fc03dd4c84ea87734b21137ecda0e1e122bcb3c8d16d2a56e0", size = 8237 }, + { url = "https://files.pythonhosted.org/packages/4e/74/d5405b9b3b12e9176dff223576d7090bc161092878f533fd0dc23dd6ae1d/looseversion-1.3.0-py2.py3-none-any.whl", hash = "sha256:781ef477b45946fc03dd4c84ea87734b21137ecda0e1e122bcb3c8d16d2a56e0", size = 8237, upload-time = "2023-07-05T16:07:49.782Z" }, ] [[package]] @@ -371,14 +374,14 @@ apidocs = [ { name = "beautifulsoup4", specifier = ">=4.12" }, { name = "packaging", specifier = ">=14.0" }, ] -clang-format = [{ name = "clang-format", specifier = "~=19.1" }] +clang-format = [{ name = "clang-format", specifier = "~=20.1.0" }] config-generator = [ { name = "packaging", specifier = ">=14.0" }, { name = "pydantic", specifier = ">=2.8" }, { name = "shrub-py", specifier = ">=3.7" }, ] dev = [ - { name = "clang-format", specifier = "~=19.1" }, + { name = "clang-format", specifier = "~=20.1.0" }, { name = "packaging", specifier = ">=14.0" }, { name = "pydantic", specifier = ">=2.8" }, { name = "shrub-py", specifier = ">=3.7" }, @@ -393,111 +396,111 @@ make-release = [ [[package]] name = "oauthlib" -version = "3.2.2" +version = "3.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6d/fa/fbf4001037904031639e6bfbfc02badfc7e12f137a8afa254df6c4c8a670/oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918", size = 177352 } +sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918, upload-time = "2025-06-19T22:48:08.269Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", size = 151688 }, + { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" }, ] [[package]] name = "packaging" version = "25.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] [[package]] name = "pillow" version = "11.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/cb/bb5c01fcd2a69335b86c22142b2bccfc3464087efb7fd382eee5ffc7fdf7/pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6", size = 47026707 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/8b/b158ad57ed44d3cc54db8d68ad7c0a58b8fc0e4c7a3f995f9d62d5b464a1/pillow-11.2.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:d57a75d53922fc20c165016a20d9c44f73305e67c351bbc60d1adaf662e74047", size = 3198442 }, - { url = "https://files.pythonhosted.org/packages/b1/f8/bb5d956142f86c2d6cc36704943fa761f2d2e4c48b7436fd0a85c20f1713/pillow-11.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:127bf6ac4a5b58b3d32fc8289656f77f80567d65660bc46f72c0d77e6600cc95", size = 3030553 }, - { url = "https://files.pythonhosted.org/packages/22/7f/0e413bb3e2aa797b9ca2c5c38cb2e2e45d88654e5b12da91ad446964cfae/pillow-11.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4ba4be812c7a40280629e55ae0b14a0aafa150dd6451297562e1764808bbe61", size = 4405503 }, - { url = "https://files.pythonhosted.org/packages/f3/b4/cc647f4d13f3eb837d3065824aa58b9bcf10821f029dc79955ee43f793bd/pillow-11.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8bd62331e5032bc396a93609982a9ab6b411c05078a52f5fe3cc59234a3abd1", size = 4490648 }, - { url = "https://files.pythonhosted.org/packages/c2/6f/240b772a3b35cdd7384166461567aa6713799b4e78d180c555bd284844ea/pillow-11.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:562d11134c97a62fe3af29581f083033179f7ff435f78392565a1ad2d1c2c45c", size = 4508937 }, - { url = "https://files.pythonhosted.org/packages/f3/5e/7ca9c815ade5fdca18853db86d812f2f188212792780208bdb37a0a6aef4/pillow-11.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c97209e85b5be259994eb5b69ff50c5d20cca0f458ef9abd835e262d9d88b39d", size = 4599802 }, - { url = "https://files.pythonhosted.org/packages/02/81/c3d9d38ce0c4878a77245d4cf2c46d45a4ad0f93000227910a46caff52f3/pillow-11.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0c3e6d0f59171dfa2e25d7116217543310908dfa2770aa64b8f87605f8cacc97", size = 4576717 }, - { url = "https://files.pythonhosted.org/packages/42/49/52b719b89ac7da3185b8d29c94d0e6aec8140059e3d8adcaa46da3751180/pillow-11.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc1c3bc53befb6096b84165956e886b1729634a799e9d6329a0c512ab651e579", size = 4654874 }, - { url = "https://files.pythonhosted.org/packages/5b/0b/ede75063ba6023798267023dc0d0401f13695d228194d2242d5a7ba2f964/pillow-11.2.1-cp310-cp310-win32.whl", hash = "sha256:312c77b7f07ab2139924d2639860e084ec2a13e72af54d4f08ac843a5fc9c79d", size = 2331717 }, - { url = "https://files.pythonhosted.org/packages/ed/3c/9831da3edea527c2ed9a09f31a2c04e77cd705847f13b69ca60269eec370/pillow-11.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9bc7ae48b8057a611e5fe9f853baa88093b9a76303937449397899385da06fad", size = 2676204 }, - { url = "https://files.pythonhosted.org/packages/01/97/1f66ff8a1503d8cbfc5bae4dc99d54c6ec1e22ad2b946241365320caabc2/pillow-11.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:2728567e249cdd939f6cc3d1f049595c66e4187f3c34078cbc0a7d21c47482d2", size = 2414767 }, - { url = "https://files.pythonhosted.org/packages/68/08/3fbf4b98924c73037a8e8b4c2c774784805e0fb4ebca6c5bb60795c40125/pillow-11.2.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35ca289f712ccfc699508c4658a1d14652e8033e9b69839edf83cbdd0ba39e70", size = 3198450 }, - { url = "https://files.pythonhosted.org/packages/84/92/6505b1af3d2849d5e714fc75ba9e69b7255c05ee42383a35a4d58f576b16/pillow-11.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0409af9f829f87a2dfb7e259f78f317a5351f2045158be321fd135973fff7bf", size = 3030550 }, - { url = "https://files.pythonhosted.org/packages/3c/8c/ac2f99d2a70ff966bc7eb13dacacfaab57c0549b2ffb351b6537c7840b12/pillow-11.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4e5c5edee874dce4f653dbe59db7c73a600119fbea8d31f53423586ee2aafd7", size = 4415018 }, - { url = "https://files.pythonhosted.org/packages/1f/e3/0a58b5d838687f40891fff9cbaf8669f90c96b64dc8f91f87894413856c6/pillow-11.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93a07e76d13bff9444f1a029e0af2964e654bfc2e2c2d46bfd080df5ad5f3d8", size = 4498006 }, - { url = "https://files.pythonhosted.org/packages/21/f5/6ba14718135f08fbfa33308efe027dd02b781d3f1d5c471444a395933aac/pillow-11.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:e6def7eed9e7fa90fde255afaf08060dc4b343bbe524a8f69bdd2a2f0018f600", size = 4517773 }, - { url = "https://files.pythonhosted.org/packages/20/f2/805ad600fc59ebe4f1ba6129cd3a75fb0da126975c8579b8f57abeb61e80/pillow-11.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8f4f3724c068be008c08257207210c138d5f3731af6c155a81c2b09a9eb3a788", size = 4607069 }, - { url = "https://files.pythonhosted.org/packages/71/6b/4ef8a288b4bb2e0180cba13ca0a519fa27aa982875882392b65131401099/pillow-11.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0a6709b47019dff32e678bc12c63008311b82b9327613f534e496dacaefb71e", size = 4583460 }, - { url = "https://files.pythonhosted.org/packages/62/ae/f29c705a09cbc9e2a456590816e5c234382ae5d32584f451c3eb41a62062/pillow-11.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6b0c664ccb879109ee3ca702a9272d877f4fcd21e5eb63c26422fd6e415365e", size = 4661304 }, - { url = "https://files.pythonhosted.org/packages/6e/1a/c8217b6f2f73794a5e219fbad087701f412337ae6dbb956db37d69a9bc43/pillow-11.2.1-cp311-cp311-win32.whl", hash = "sha256:cc5d875d56e49f112b6def6813c4e3d3036d269c008bf8aef72cd08d20ca6df6", size = 2331809 }, - { url = "https://files.pythonhosted.org/packages/e2/72/25a8f40170dc262e86e90f37cb72cb3de5e307f75bf4b02535a61afcd519/pillow-11.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:0f5c7eda47bf8e3c8a283762cab94e496ba977a420868cb819159980b6709193", size = 2676338 }, - { url = "https://files.pythonhosted.org/packages/06/9e/76825e39efee61efea258b479391ca77d64dbd9e5804e4ad0fa453b4ba55/pillow-11.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:4d375eb838755f2528ac8cbc926c3e31cc49ca4ad0cf79cff48b20e30634a4a7", size = 2414918 }, - { url = "https://files.pythonhosted.org/packages/c7/40/052610b15a1b8961f52537cc8326ca6a881408bc2bdad0d852edeb6ed33b/pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f", size = 3190185 }, - { url = "https://files.pythonhosted.org/packages/e5/7e/b86dbd35a5f938632093dc40d1682874c33dcfe832558fc80ca56bfcb774/pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b", size = 3030306 }, - { url = "https://files.pythonhosted.org/packages/a4/5c/467a161f9ed53e5eab51a42923c33051bf8d1a2af4626ac04f5166e58e0c/pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d", size = 4416121 }, - { url = "https://files.pythonhosted.org/packages/62/73/972b7742e38ae0e2ac76ab137ca6005dcf877480da0d9d61d93b613065b4/pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4", size = 4501707 }, - { url = "https://files.pythonhosted.org/packages/e4/3a/427e4cb0b9e177efbc1a84798ed20498c4f233abde003c06d2650a6d60cb/pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d", size = 4522921 }, - { url = "https://files.pythonhosted.org/packages/fe/7c/d8b1330458e4d2f3f45d9508796d7caf0c0d3764c00c823d10f6f1a3b76d/pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4", size = 4612523 }, - { url = "https://files.pythonhosted.org/packages/b3/2f/65738384e0b1acf451de5a573d8153fe84103772d139e1e0bdf1596be2ea/pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443", size = 4587836 }, - { url = "https://files.pythonhosted.org/packages/6a/c5/e795c9f2ddf3debb2dedd0df889f2fe4b053308bb59a3cc02a0cd144d641/pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c", size = 4669390 }, - { url = "https://files.pythonhosted.org/packages/96/ae/ca0099a3995976a9fce2f423166f7bff9b12244afdc7520f6ed38911539a/pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3", size = 2332309 }, - { url = "https://files.pythonhosted.org/packages/7c/18/24bff2ad716257fc03da964c5e8f05d9790a779a8895d6566e493ccf0189/pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941", size = 2676768 }, - { url = "https://files.pythonhosted.org/packages/da/bb/e8d656c9543276517ee40184aaa39dcb41e683bca121022f9323ae11b39d/pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb", size = 2415087 }, - { url = "https://files.pythonhosted.org/packages/36/9c/447528ee3776e7ab8897fe33697a7ff3f0475bb490c5ac1456a03dc57956/pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28", size = 3190098 }, - { url = "https://files.pythonhosted.org/packages/b5/09/29d5cd052f7566a63e5b506fac9c60526e9ecc553825551333e1e18a4858/pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830", size = 3030166 }, - { url = "https://files.pythonhosted.org/packages/71/5d/446ee132ad35e7600652133f9c2840b4799bbd8e4adba881284860da0a36/pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0", size = 4408674 }, - { url = "https://files.pythonhosted.org/packages/69/5f/cbe509c0ddf91cc3a03bbacf40e5c2339c4912d16458fcb797bb47bcb269/pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1", size = 4496005 }, - { url = "https://files.pythonhosted.org/packages/f9/b3/dd4338d8fb8a5f312021f2977fb8198a1184893f9b00b02b75d565c33b51/pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f", size = 4518707 }, - { url = "https://files.pythonhosted.org/packages/13/eb/2552ecebc0b887f539111c2cd241f538b8ff5891b8903dfe672e997529be/pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155", size = 4610008 }, - { url = "https://files.pythonhosted.org/packages/72/d1/924ce51bea494cb6e7959522d69d7b1c7e74f6821d84c63c3dc430cbbf3b/pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14", size = 4585420 }, - { url = "https://files.pythonhosted.org/packages/43/ab/8f81312d255d713b99ca37479a4cb4b0f48195e530cdc1611990eb8fd04b/pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b", size = 4667655 }, - { url = "https://files.pythonhosted.org/packages/94/86/8f2e9d2dc3d308dfd137a07fe1cc478df0a23d42a6c4093b087e738e4827/pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2", size = 2332329 }, - { url = "https://files.pythonhosted.org/packages/6d/ec/1179083b8d6067a613e4d595359b5fdea65d0a3b7ad623fee906e1b3c4d2/pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691", size = 2676388 }, - { url = "https://files.pythonhosted.org/packages/23/f1/2fc1e1e294de897df39fa8622d829b8828ddad938b0eaea256d65b84dd72/pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c", size = 2414950 }, - { url = "https://files.pythonhosted.org/packages/c4/3e/c328c48b3f0ead7bab765a84b4977acb29f101d10e4ef57a5e3400447c03/pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22", size = 3192759 }, - { url = "https://files.pythonhosted.org/packages/18/0e/1c68532d833fc8b9f404d3a642991441d9058eccd5606eab31617f29b6d4/pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7", size = 3033284 }, - { url = "https://files.pythonhosted.org/packages/b7/cb/6faf3fb1e7705fd2db74e070f3bf6f88693601b0ed8e81049a8266de4754/pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16", size = 4445826 }, - { url = "https://files.pythonhosted.org/packages/07/94/8be03d50b70ca47fb434a358919d6a8d6580f282bbb7af7e4aa40103461d/pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b", size = 4527329 }, - { url = "https://files.pythonhosted.org/packages/fd/a4/bfe78777076dc405e3bd2080bc32da5ab3945b5a25dc5d8acaa9de64a162/pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406", size = 4549049 }, - { url = "https://files.pythonhosted.org/packages/65/4d/eaf9068dc687c24979e977ce5677e253624bd8b616b286f543f0c1b91662/pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91", size = 4635408 }, - { url = "https://files.pythonhosted.org/packages/1d/26/0fd443365d9c63bc79feb219f97d935cd4b93af28353cba78d8e77b61719/pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751", size = 4614863 }, - { url = "https://files.pythonhosted.org/packages/49/65/dca4d2506be482c2c6641cacdba5c602bc76d8ceb618fd37de855653a419/pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9", size = 4692938 }, - { url = "https://files.pythonhosted.org/packages/b3/92/1ca0c3f09233bd7decf8f7105a1c4e3162fb9142128c74adad0fb361b7eb/pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd", size = 2335774 }, - { url = "https://files.pythonhosted.org/packages/a5/ac/77525347cb43b83ae905ffe257bbe2cc6fd23acb9796639a1f56aa59d191/pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e", size = 2681895 }, - { url = "https://files.pythonhosted.org/packages/67/32/32dc030cfa91ca0fc52baebbba2e009bb001122a1daa8b6a79ad830b38d3/pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681", size = 2417234 }, - { url = "https://files.pythonhosted.org/packages/33/49/c8c21e4255b4f4a2c0c68ac18125d7f5460b109acc6dfdef1a24f9b960ef/pillow-11.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9b7b0d4fd2635f54ad82785d56bc0d94f147096493a79985d0ab57aedd563156", size = 3181727 }, - { url = "https://files.pythonhosted.org/packages/6d/f1/f7255c0838f8c1ef6d55b625cfb286835c17e8136ce4351c5577d02c443b/pillow-11.2.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:aa442755e31c64037aa7c1cb186e0b369f8416c567381852c63444dd666fb772", size = 2999833 }, - { url = "https://files.pythonhosted.org/packages/e2/57/9968114457bd131063da98d87790d080366218f64fa2943b65ac6739abb3/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d3348c95b766f54b76116d53d4cb171b52992a1027e7ca50c81b43b9d9e363", size = 3437472 }, - { url = "https://files.pythonhosted.org/packages/b2/1b/e35d8a158e21372ecc48aac9c453518cfe23907bb82f950d6e1c72811eb0/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85d27ea4c889342f7e35f6d56e7e1cb345632ad592e8c51b693d7b7556043ce0", size = 3459976 }, - { url = "https://files.pythonhosted.org/packages/26/da/2c11d03b765efff0ccc473f1c4186dc2770110464f2177efaed9cf6fae01/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bf2c33d6791c598142f00c9c4c7d47f6476731c31081331664eb26d6ab583e01", size = 3527133 }, - { url = "https://files.pythonhosted.org/packages/79/1a/4e85bd7cadf78412c2a3069249a09c32ef3323650fd3005c97cca7aa21df/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e616e7154c37669fc1dfc14584f11e284e05d1c650e1c0f972f281c4ccc53193", size = 3571555 }, - { url = "https://files.pythonhosted.org/packages/69/03/239939915216de1e95e0ce2334bf17a7870ae185eb390fab6d706aadbfc0/pillow-11.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39ad2e0f424394e3aebc40168845fee52df1394a4673a6ee512d840d14ab3013", size = 2674713 }, - { url = "https://files.pythonhosted.org/packages/a4/ad/2613c04633c7257d9481ab21d6b5364b59fc5d75faafd7cb8693523945a3/pillow-11.2.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:80f1df8dbe9572b4b7abdfa17eb5d78dd620b1d55d9e25f834efdbee872d3aed", size = 3181734 }, - { url = "https://files.pythonhosted.org/packages/a4/fd/dcdda4471ed667de57bb5405bb42d751e6cfdd4011a12c248b455c778e03/pillow-11.2.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea926cfbc3957090becbcbbb65ad177161a2ff2ad578b5a6ec9bb1e1cd78753c", size = 2999841 }, - { url = "https://files.pythonhosted.org/packages/ac/89/8a2536e95e77432833f0db6fd72a8d310c8e4272a04461fb833eb021bf94/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:738db0e0941ca0376804d4de6a782c005245264edaa253ffce24e5a15cbdc7bd", size = 3437470 }, - { url = "https://files.pythonhosted.org/packages/9d/8f/abd47b73c60712f88e9eda32baced7bfc3e9bd6a7619bb64b93acff28c3e/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db98ab6565c69082ec9b0d4e40dd9f6181dab0dd236d26f7a50b8b9bfbd5076", size = 3460013 }, - { url = "https://files.pythonhosted.org/packages/f6/20/5c0a0aa83b213b7a07ec01e71a3d6ea2cf4ad1d2c686cc0168173b6089e7/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:036e53f4170e270ddb8797d4c590e6dd14d28e15c7da375c18978045f7e6c37b", size = 3527165 }, - { url = "https://files.pythonhosted.org/packages/58/0e/2abab98a72202d91146abc839e10c14f7cf36166f12838ea0c4db3ca6ecb/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14f73f7c291279bd65fda51ee87affd7c1e097709f7fdd0188957a16c264601f", size = 3571586 }, - { url = "https://files.pythonhosted.org/packages/21/2c/5e05f58658cf49b6667762cca03d6e7d85cededde2caf2ab37b81f80e574/pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044", size = 2674751 }, +sdist = { url = "https://files.pythonhosted.org/packages/af/cb/bb5c01fcd2a69335b86c22142b2bccfc3464087efb7fd382eee5ffc7fdf7/pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6", size = 47026707, upload-time = "2025-04-12T17:50:03.289Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/8b/b158ad57ed44d3cc54db8d68ad7c0a58b8fc0e4c7a3f995f9d62d5b464a1/pillow-11.2.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:d57a75d53922fc20c165016a20d9c44f73305e67c351bbc60d1adaf662e74047", size = 3198442, upload-time = "2025-04-12T17:47:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f8/bb5d956142f86c2d6cc36704943fa761f2d2e4c48b7436fd0a85c20f1713/pillow-11.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:127bf6ac4a5b58b3d32fc8289656f77f80567d65660bc46f72c0d77e6600cc95", size = 3030553, upload-time = "2025-04-12T17:47:13.153Z" }, + { url = "https://files.pythonhosted.org/packages/22/7f/0e413bb3e2aa797b9ca2c5c38cb2e2e45d88654e5b12da91ad446964cfae/pillow-11.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4ba4be812c7a40280629e55ae0b14a0aafa150dd6451297562e1764808bbe61", size = 4405503, upload-time = "2025-04-12T17:47:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b4/cc647f4d13f3eb837d3065824aa58b9bcf10821f029dc79955ee43f793bd/pillow-11.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8bd62331e5032bc396a93609982a9ab6b411c05078a52f5fe3cc59234a3abd1", size = 4490648, upload-time = "2025-04-12T17:47:17.37Z" }, + { url = "https://files.pythonhosted.org/packages/c2/6f/240b772a3b35cdd7384166461567aa6713799b4e78d180c555bd284844ea/pillow-11.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:562d11134c97a62fe3af29581f083033179f7ff435f78392565a1ad2d1c2c45c", size = 4508937, upload-time = "2025-04-12T17:47:19.066Z" }, + { url = "https://files.pythonhosted.org/packages/f3/5e/7ca9c815ade5fdca18853db86d812f2f188212792780208bdb37a0a6aef4/pillow-11.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c97209e85b5be259994eb5b69ff50c5d20cca0f458ef9abd835e262d9d88b39d", size = 4599802, upload-time = "2025-04-12T17:47:21.404Z" }, + { url = "https://files.pythonhosted.org/packages/02/81/c3d9d38ce0c4878a77245d4cf2c46d45a4ad0f93000227910a46caff52f3/pillow-11.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0c3e6d0f59171dfa2e25d7116217543310908dfa2770aa64b8f87605f8cacc97", size = 4576717, upload-time = "2025-04-12T17:47:23.571Z" }, + { url = "https://files.pythonhosted.org/packages/42/49/52b719b89ac7da3185b8d29c94d0e6aec8140059e3d8adcaa46da3751180/pillow-11.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc1c3bc53befb6096b84165956e886b1729634a799e9d6329a0c512ab651e579", size = 4654874, upload-time = "2025-04-12T17:47:25.783Z" }, + { url = "https://files.pythonhosted.org/packages/5b/0b/ede75063ba6023798267023dc0d0401f13695d228194d2242d5a7ba2f964/pillow-11.2.1-cp310-cp310-win32.whl", hash = "sha256:312c77b7f07ab2139924d2639860e084ec2a13e72af54d4f08ac843a5fc9c79d", size = 2331717, upload-time = "2025-04-12T17:47:28.922Z" }, + { url = "https://files.pythonhosted.org/packages/ed/3c/9831da3edea527c2ed9a09f31a2c04e77cd705847f13b69ca60269eec370/pillow-11.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9bc7ae48b8057a611e5fe9f853baa88093b9a76303937449397899385da06fad", size = 2676204, upload-time = "2025-04-12T17:47:31.283Z" }, + { url = "https://files.pythonhosted.org/packages/01/97/1f66ff8a1503d8cbfc5bae4dc99d54c6ec1e22ad2b946241365320caabc2/pillow-11.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:2728567e249cdd939f6cc3d1f049595c66e4187f3c34078cbc0a7d21c47482d2", size = 2414767, upload-time = "2025-04-12T17:47:34.655Z" }, + { url = "https://files.pythonhosted.org/packages/68/08/3fbf4b98924c73037a8e8b4c2c774784805e0fb4ebca6c5bb60795c40125/pillow-11.2.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35ca289f712ccfc699508c4658a1d14652e8033e9b69839edf83cbdd0ba39e70", size = 3198450, upload-time = "2025-04-12T17:47:37.135Z" }, + { url = "https://files.pythonhosted.org/packages/84/92/6505b1af3d2849d5e714fc75ba9e69b7255c05ee42383a35a4d58f576b16/pillow-11.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0409af9f829f87a2dfb7e259f78f317a5351f2045158be321fd135973fff7bf", size = 3030550, upload-time = "2025-04-12T17:47:39.345Z" }, + { url = "https://files.pythonhosted.org/packages/3c/8c/ac2f99d2a70ff966bc7eb13dacacfaab57c0549b2ffb351b6537c7840b12/pillow-11.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4e5c5edee874dce4f653dbe59db7c73a600119fbea8d31f53423586ee2aafd7", size = 4415018, upload-time = "2025-04-12T17:47:41.128Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e3/0a58b5d838687f40891fff9cbaf8669f90c96b64dc8f91f87894413856c6/pillow-11.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93a07e76d13bff9444f1a029e0af2964e654bfc2e2c2d46bfd080df5ad5f3d8", size = 4498006, upload-time = "2025-04-12T17:47:42.912Z" }, + { url = "https://files.pythonhosted.org/packages/21/f5/6ba14718135f08fbfa33308efe027dd02b781d3f1d5c471444a395933aac/pillow-11.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:e6def7eed9e7fa90fde255afaf08060dc4b343bbe524a8f69bdd2a2f0018f600", size = 4517773, upload-time = "2025-04-12T17:47:44.611Z" }, + { url = "https://files.pythonhosted.org/packages/20/f2/805ad600fc59ebe4f1ba6129cd3a75fb0da126975c8579b8f57abeb61e80/pillow-11.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8f4f3724c068be008c08257207210c138d5f3731af6c155a81c2b09a9eb3a788", size = 4607069, upload-time = "2025-04-12T17:47:46.46Z" }, + { url = "https://files.pythonhosted.org/packages/71/6b/4ef8a288b4bb2e0180cba13ca0a519fa27aa982875882392b65131401099/pillow-11.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0a6709b47019dff32e678bc12c63008311b82b9327613f534e496dacaefb71e", size = 4583460, upload-time = "2025-04-12T17:47:49.255Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/f29c705a09cbc9e2a456590816e5c234382ae5d32584f451c3eb41a62062/pillow-11.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6b0c664ccb879109ee3ca702a9272d877f4fcd21e5eb63c26422fd6e415365e", size = 4661304, upload-time = "2025-04-12T17:47:51.067Z" }, + { url = "https://files.pythonhosted.org/packages/6e/1a/c8217b6f2f73794a5e219fbad087701f412337ae6dbb956db37d69a9bc43/pillow-11.2.1-cp311-cp311-win32.whl", hash = "sha256:cc5d875d56e49f112b6def6813c4e3d3036d269c008bf8aef72cd08d20ca6df6", size = 2331809, upload-time = "2025-04-12T17:47:54.425Z" }, + { url = "https://files.pythonhosted.org/packages/e2/72/25a8f40170dc262e86e90f37cb72cb3de5e307f75bf4b02535a61afcd519/pillow-11.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:0f5c7eda47bf8e3c8a283762cab94e496ba977a420868cb819159980b6709193", size = 2676338, upload-time = "2025-04-12T17:47:56.535Z" }, + { url = "https://files.pythonhosted.org/packages/06/9e/76825e39efee61efea258b479391ca77d64dbd9e5804e4ad0fa453b4ba55/pillow-11.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:4d375eb838755f2528ac8cbc926c3e31cc49ca4ad0cf79cff48b20e30634a4a7", size = 2414918, upload-time = "2025-04-12T17:47:58.217Z" }, + { url = "https://files.pythonhosted.org/packages/c7/40/052610b15a1b8961f52537cc8326ca6a881408bc2bdad0d852edeb6ed33b/pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f", size = 3190185, upload-time = "2025-04-12T17:48:00.417Z" }, + { url = "https://files.pythonhosted.org/packages/e5/7e/b86dbd35a5f938632093dc40d1682874c33dcfe832558fc80ca56bfcb774/pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b", size = 3030306, upload-time = "2025-04-12T17:48:02.391Z" }, + { url = "https://files.pythonhosted.org/packages/a4/5c/467a161f9ed53e5eab51a42923c33051bf8d1a2af4626ac04f5166e58e0c/pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d", size = 4416121, upload-time = "2025-04-12T17:48:04.554Z" }, + { url = "https://files.pythonhosted.org/packages/62/73/972b7742e38ae0e2ac76ab137ca6005dcf877480da0d9d61d93b613065b4/pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4", size = 4501707, upload-time = "2025-04-12T17:48:06.831Z" }, + { url = "https://files.pythonhosted.org/packages/e4/3a/427e4cb0b9e177efbc1a84798ed20498c4f233abde003c06d2650a6d60cb/pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d", size = 4522921, upload-time = "2025-04-12T17:48:09.229Z" }, + { url = "https://files.pythonhosted.org/packages/fe/7c/d8b1330458e4d2f3f45d9508796d7caf0c0d3764c00c823d10f6f1a3b76d/pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4", size = 4612523, upload-time = "2025-04-12T17:48:11.631Z" }, + { url = "https://files.pythonhosted.org/packages/b3/2f/65738384e0b1acf451de5a573d8153fe84103772d139e1e0bdf1596be2ea/pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443", size = 4587836, upload-time = "2025-04-12T17:48:13.592Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c5/e795c9f2ddf3debb2dedd0df889f2fe4b053308bb59a3cc02a0cd144d641/pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c", size = 4669390, upload-time = "2025-04-12T17:48:15.938Z" }, + { url = "https://files.pythonhosted.org/packages/96/ae/ca0099a3995976a9fce2f423166f7bff9b12244afdc7520f6ed38911539a/pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3", size = 2332309, upload-time = "2025-04-12T17:48:17.885Z" }, + { url = "https://files.pythonhosted.org/packages/7c/18/24bff2ad716257fc03da964c5e8f05d9790a779a8895d6566e493ccf0189/pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941", size = 2676768, upload-time = "2025-04-12T17:48:19.655Z" }, + { url = "https://files.pythonhosted.org/packages/da/bb/e8d656c9543276517ee40184aaa39dcb41e683bca121022f9323ae11b39d/pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb", size = 2415087, upload-time = "2025-04-12T17:48:21.991Z" }, + { url = "https://files.pythonhosted.org/packages/36/9c/447528ee3776e7ab8897fe33697a7ff3f0475bb490c5ac1456a03dc57956/pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28", size = 3190098, upload-time = "2025-04-12T17:48:23.915Z" }, + { url = "https://files.pythonhosted.org/packages/b5/09/29d5cd052f7566a63e5b506fac9c60526e9ecc553825551333e1e18a4858/pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830", size = 3030166, upload-time = "2025-04-12T17:48:25.738Z" }, + { url = "https://files.pythonhosted.org/packages/71/5d/446ee132ad35e7600652133f9c2840b4799bbd8e4adba881284860da0a36/pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0", size = 4408674, upload-time = "2025-04-12T17:48:27.908Z" }, + { url = "https://files.pythonhosted.org/packages/69/5f/cbe509c0ddf91cc3a03bbacf40e5c2339c4912d16458fcb797bb47bcb269/pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1", size = 4496005, upload-time = "2025-04-12T17:48:29.888Z" }, + { url = "https://files.pythonhosted.org/packages/f9/b3/dd4338d8fb8a5f312021f2977fb8198a1184893f9b00b02b75d565c33b51/pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f", size = 4518707, upload-time = "2025-04-12T17:48:31.874Z" }, + { url = "https://files.pythonhosted.org/packages/13/eb/2552ecebc0b887f539111c2cd241f538b8ff5891b8903dfe672e997529be/pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155", size = 4610008, upload-time = "2025-04-12T17:48:34.422Z" }, + { url = "https://files.pythonhosted.org/packages/72/d1/924ce51bea494cb6e7959522d69d7b1c7e74f6821d84c63c3dc430cbbf3b/pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14", size = 4585420, upload-time = "2025-04-12T17:48:37.641Z" }, + { url = "https://files.pythonhosted.org/packages/43/ab/8f81312d255d713b99ca37479a4cb4b0f48195e530cdc1611990eb8fd04b/pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b", size = 4667655, upload-time = "2025-04-12T17:48:39.652Z" }, + { url = "https://files.pythonhosted.org/packages/94/86/8f2e9d2dc3d308dfd137a07fe1cc478df0a23d42a6c4093b087e738e4827/pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2", size = 2332329, upload-time = "2025-04-12T17:48:41.765Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ec/1179083b8d6067a613e4d595359b5fdea65d0a3b7ad623fee906e1b3c4d2/pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691", size = 2676388, upload-time = "2025-04-12T17:48:43.625Z" }, + { url = "https://files.pythonhosted.org/packages/23/f1/2fc1e1e294de897df39fa8622d829b8828ddad938b0eaea256d65b84dd72/pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c", size = 2414950, upload-time = "2025-04-12T17:48:45.475Z" }, + { url = "https://files.pythonhosted.org/packages/c4/3e/c328c48b3f0ead7bab765a84b4977acb29f101d10e4ef57a5e3400447c03/pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22", size = 3192759, upload-time = "2025-04-12T17:48:47.866Z" }, + { url = "https://files.pythonhosted.org/packages/18/0e/1c68532d833fc8b9f404d3a642991441d9058eccd5606eab31617f29b6d4/pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7", size = 3033284, upload-time = "2025-04-12T17:48:50.189Z" }, + { url = "https://files.pythonhosted.org/packages/b7/cb/6faf3fb1e7705fd2db74e070f3bf6f88693601b0ed8e81049a8266de4754/pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16", size = 4445826, upload-time = "2025-04-12T17:48:52.346Z" }, + { url = "https://files.pythonhosted.org/packages/07/94/8be03d50b70ca47fb434a358919d6a8d6580f282bbb7af7e4aa40103461d/pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b", size = 4527329, upload-time = "2025-04-12T17:48:54.403Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a4/bfe78777076dc405e3bd2080bc32da5ab3945b5a25dc5d8acaa9de64a162/pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406", size = 4549049, upload-time = "2025-04-12T17:48:56.383Z" }, + { url = "https://files.pythonhosted.org/packages/65/4d/eaf9068dc687c24979e977ce5677e253624bd8b616b286f543f0c1b91662/pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91", size = 4635408, upload-time = "2025-04-12T17:48:58.782Z" }, + { url = "https://files.pythonhosted.org/packages/1d/26/0fd443365d9c63bc79feb219f97d935cd4b93af28353cba78d8e77b61719/pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751", size = 4614863, upload-time = "2025-04-12T17:49:00.709Z" }, + { url = "https://files.pythonhosted.org/packages/49/65/dca4d2506be482c2c6641cacdba5c602bc76d8ceb618fd37de855653a419/pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9", size = 4692938, upload-time = "2025-04-12T17:49:02.946Z" }, + { url = "https://files.pythonhosted.org/packages/b3/92/1ca0c3f09233bd7decf8f7105a1c4e3162fb9142128c74adad0fb361b7eb/pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd", size = 2335774, upload-time = "2025-04-12T17:49:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ac/77525347cb43b83ae905ffe257bbe2cc6fd23acb9796639a1f56aa59d191/pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e", size = 2681895, upload-time = "2025-04-12T17:49:06.635Z" }, + { url = "https://files.pythonhosted.org/packages/67/32/32dc030cfa91ca0fc52baebbba2e009bb001122a1daa8b6a79ad830b38d3/pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681", size = 2417234, upload-time = "2025-04-12T17:49:08.399Z" }, + { url = "https://files.pythonhosted.org/packages/33/49/c8c21e4255b4f4a2c0c68ac18125d7f5460b109acc6dfdef1a24f9b960ef/pillow-11.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9b7b0d4fd2635f54ad82785d56bc0d94f147096493a79985d0ab57aedd563156", size = 3181727, upload-time = "2025-04-12T17:49:31.898Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f1/f7255c0838f8c1ef6d55b625cfb286835c17e8136ce4351c5577d02c443b/pillow-11.2.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:aa442755e31c64037aa7c1cb186e0b369f8416c567381852c63444dd666fb772", size = 2999833, upload-time = "2025-04-12T17:49:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/e2/57/9968114457bd131063da98d87790d080366218f64fa2943b65ac6739abb3/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d3348c95b766f54b76116d53d4cb171b52992a1027e7ca50c81b43b9d9e363", size = 3437472, upload-time = "2025-04-12T17:49:36.294Z" }, + { url = "https://files.pythonhosted.org/packages/b2/1b/e35d8a158e21372ecc48aac9c453518cfe23907bb82f950d6e1c72811eb0/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85d27ea4c889342f7e35f6d56e7e1cb345632ad592e8c51b693d7b7556043ce0", size = 3459976, upload-time = "2025-04-12T17:49:38.988Z" }, + { url = "https://files.pythonhosted.org/packages/26/da/2c11d03b765efff0ccc473f1c4186dc2770110464f2177efaed9cf6fae01/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bf2c33d6791c598142f00c9c4c7d47f6476731c31081331664eb26d6ab583e01", size = 3527133, upload-time = "2025-04-12T17:49:40.985Z" }, + { url = "https://files.pythonhosted.org/packages/79/1a/4e85bd7cadf78412c2a3069249a09c32ef3323650fd3005c97cca7aa21df/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e616e7154c37669fc1dfc14584f11e284e05d1c650e1c0f972f281c4ccc53193", size = 3571555, upload-time = "2025-04-12T17:49:42.964Z" }, + { url = "https://files.pythonhosted.org/packages/69/03/239939915216de1e95e0ce2334bf17a7870ae185eb390fab6d706aadbfc0/pillow-11.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39ad2e0f424394e3aebc40168845fee52df1394a4673a6ee512d840d14ab3013", size = 2674713, upload-time = "2025-04-12T17:49:44.944Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ad/2613c04633c7257d9481ab21d6b5364b59fc5d75faafd7cb8693523945a3/pillow-11.2.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:80f1df8dbe9572b4b7abdfa17eb5d78dd620b1d55d9e25f834efdbee872d3aed", size = 3181734, upload-time = "2025-04-12T17:49:46.789Z" }, + { url = "https://files.pythonhosted.org/packages/a4/fd/dcdda4471ed667de57bb5405bb42d751e6cfdd4011a12c248b455c778e03/pillow-11.2.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea926cfbc3957090becbcbbb65ad177161a2ff2ad578b5a6ec9bb1e1cd78753c", size = 2999841, upload-time = "2025-04-12T17:49:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/ac/89/8a2536e95e77432833f0db6fd72a8d310c8e4272a04461fb833eb021bf94/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:738db0e0941ca0376804d4de6a782c005245264edaa253ffce24e5a15cbdc7bd", size = 3437470, upload-time = "2025-04-12T17:49:50.831Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8f/abd47b73c60712f88e9eda32baced7bfc3e9bd6a7619bb64b93acff28c3e/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db98ab6565c69082ec9b0d4e40dd9f6181dab0dd236d26f7a50b8b9bfbd5076", size = 3460013, upload-time = "2025-04-12T17:49:53.278Z" }, + { url = "https://files.pythonhosted.org/packages/f6/20/5c0a0aa83b213b7a07ec01e71a3d6ea2cf4ad1d2c686cc0168173b6089e7/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:036e53f4170e270ddb8797d4c590e6dd14d28e15c7da375c18978045f7e6c37b", size = 3527165, upload-time = "2025-04-12T17:49:55.164Z" }, + { url = "https://files.pythonhosted.org/packages/58/0e/2abab98a72202d91146abc839e10c14f7cf36166f12838ea0c4db3ca6ecb/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14f73f7c291279bd65fda51ee87affd7c1e097709f7fdd0188957a16c264601f", size = 3571586, upload-time = "2025-04-12T17:49:57.171Z" }, + { url = "https://files.pythonhosted.org/packages/21/2c/5e05f58658cf49b6667762cca03d6e7d85cededde2caf2ab37b81f80e574/pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044", size = 2674751, upload-time = "2025-04-12T17:49:59.628Z" }, ] [[package]] name = "pycparser" version = "2.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736, upload-time = "2024-03-30T13:22:22.564Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload-time = "2024-03-30T13:22:20.476Z" }, ] [[package]] name = "pydantic" -version = "2.11.3" +version = "2.11.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -505,96 +508,96 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513 } +sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload-time = "2025-06-14T08:33:17.137Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591 }, + { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782, upload-time = "2025-06-14T08:33:14.905Z" }, ] [[package]] name = "pydantic-core" -version = "2.33.1" +version = "2.33.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/ea/5f572806ab4d4223d11551af814d243b0e3e02cc6913def4d1fe4a5ca41c/pydantic_core-2.33.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3077cfdb6125cc8dab61b155fdd714663e401f0e6883f9632118ec12cf42df26", size = 2044021 }, - { url = "https://files.pythonhosted.org/packages/8c/d1/f86cc96d2aa80e3881140d16d12ef2b491223f90b28b9a911346c04ac359/pydantic_core-2.33.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ffab8b2908d152e74862d276cf5017c81a2f3719f14e8e3e8d6b83fda863927", size = 1861742 }, - { url = "https://files.pythonhosted.org/packages/37/08/fbd2cd1e9fc735a0df0142fac41c114ad9602d1c004aea340169ae90973b/pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5183e4f6a2d468787243ebcd70cf4098c247e60d73fb7d68d5bc1e1beaa0c4db", size = 1910414 }, - { url = "https://files.pythonhosted.org/packages/7f/73/3ac217751decbf8d6cb9443cec9b9eb0130eeada6ae56403e11b486e277e/pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:398a38d323f37714023be1e0285765f0a27243a8b1506b7b7de87b647b517e48", size = 1996848 }, - { url = "https://files.pythonhosted.org/packages/9a/f5/5c26b265cdcff2661e2520d2d1e9db72d117ea00eb41e00a76efe68cb009/pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d3776f0001b43acebfa86f8c64019c043b55cc5a6a2e313d728b5c95b46969", size = 2141055 }, - { url = "https://files.pythonhosted.org/packages/5d/14/a9c3cee817ef2f8347c5ce0713e91867a0dceceefcb2973942855c917379/pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c566dd9c5f63d22226409553531f89de0cac55397f2ab8d97d6f06cfce6d947e", size = 2753806 }, - { url = "https://files.pythonhosted.org/packages/f2/68/866ce83a51dd37e7c604ce0050ff6ad26de65a7799df89f4db87dd93d1d6/pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d5f3acc81452c56895e90643a625302bd6be351e7010664151cc55b7b97f89", size = 2007777 }, - { url = "https://files.pythonhosted.org/packages/b6/a8/36771f4404bb3e49bd6d4344da4dede0bf89cc1e01f3b723c47248a3761c/pydantic_core-2.33.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d3a07fadec2a13274a8d861d3d37c61e97a816beae717efccaa4b36dfcaadcde", size = 2122803 }, - { url = "https://files.pythonhosted.org/packages/18/9c/730a09b2694aa89360d20756369822d98dc2f31b717c21df33b64ffd1f50/pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f99aeda58dce827f76963ee87a0ebe75e648c72ff9ba1174a253f6744f518f65", size = 2086755 }, - { url = "https://files.pythonhosted.org/packages/54/8e/2dccd89602b5ec31d1c58138d02340ecb2ebb8c2cac3cc66b65ce3edb6ce/pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:902dbc832141aa0ec374f4310f1e4e7febeebc3256f00dc359a9ac3f264a45dc", size = 2257358 }, - { url = "https://files.pythonhosted.org/packages/d1/9c/126e4ac1bfad8a95a9837acdd0963695d69264179ba4ede8b8c40d741702/pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fe44d56aa0b00d66640aa84a3cbe80b7a3ccdc6f0b1ca71090696a6d4777c091", size = 2257916 }, - { url = "https://files.pythonhosted.org/packages/7d/ba/91eea2047e681a6853c81c20aeca9dcdaa5402ccb7404a2097c2adf9d038/pydantic_core-2.33.1-cp310-cp310-win32.whl", hash = "sha256:ed3eb16d51257c763539bde21e011092f127a2202692afaeaccb50db55a31383", size = 1923823 }, - { url = "https://files.pythonhosted.org/packages/94/c0/fcdf739bf60d836a38811476f6ecd50374880b01e3014318b6e809ddfd52/pydantic_core-2.33.1-cp310-cp310-win_amd64.whl", hash = "sha256:694ad99a7f6718c1a498dc170ca430687a39894a60327f548e02a9c7ee4b6504", size = 1952494 }, - { url = "https://files.pythonhosted.org/packages/d6/7f/c6298830cb780c46b4f46bb24298d01019ffa4d21769f39b908cd14bbd50/pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", size = 2044224 }, - { url = "https://files.pythonhosted.org/packages/a8/65/6ab3a536776cad5343f625245bd38165d6663256ad43f3a200e5936afd6c/pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", size = 1858845 }, - { url = "https://files.pythonhosted.org/packages/e9/15/9a22fd26ba5ee8c669d4b8c9c244238e940cd5d818649603ca81d1c69861/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", size = 1910029 }, - { url = "https://files.pythonhosted.org/packages/d5/33/8cb1a62818974045086f55f604044bf35b9342900318f9a2a029a1bec460/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", size = 1997784 }, - { url = "https://files.pythonhosted.org/packages/c0/ca/49958e4df7715c71773e1ea5be1c74544923d10319173264e6db122543f9/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", size = 2141075 }, - { url = "https://files.pythonhosted.org/packages/7b/a6/0b3a167a9773c79ba834b959b4e18c3ae9216b8319bd8422792abc8a41b1/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", size = 2745849 }, - { url = "https://files.pythonhosted.org/packages/0b/60/516484135173aa9e5861d7a0663dce82e4746d2e7f803627d8c25dfa5578/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", size = 2005794 }, - { url = "https://files.pythonhosted.org/packages/86/70/05b1eb77459ad47de00cf78ee003016da0cedf8b9170260488d7c21e9181/pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", size = 2123237 }, - { url = "https://files.pythonhosted.org/packages/c7/57/12667a1409c04ae7dc95d3b43158948eb0368e9c790be8b095cb60611459/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", size = 2086351 }, - { url = "https://files.pythonhosted.org/packages/57/61/cc6d1d1c1664b58fdd6ecc64c84366c34ec9b606aeb66cafab6f4088974c/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", size = 2258914 }, - { url = "https://files.pythonhosted.org/packages/d1/0a/edb137176a1f5419b2ddee8bde6a0a548cfa3c74f657f63e56232df8de88/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", size = 2257385 }, - { url = "https://files.pythonhosted.org/packages/26/3c/48ca982d50e4b0e1d9954919c887bdc1c2b462801bf408613ccc641b3daa/pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", size = 1923765 }, - { url = "https://files.pythonhosted.org/packages/33/cd/7ab70b99e5e21559f5de38a0928ea84e6f23fdef2b0d16a6feaf942b003c/pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", size = 1950688 }, - { url = "https://files.pythonhosted.org/packages/4b/ae/db1fc237b82e2cacd379f63e3335748ab88b5adde98bf7544a1b1bd10a84/pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", size = 1908185 }, - { url = "https://files.pythonhosted.org/packages/c8/ce/3cb22b07c29938f97ff5f5bb27521f95e2ebec399b882392deb68d6c440e/pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", size = 2026640 }, - { url = "https://files.pythonhosted.org/packages/19/78/f381d643b12378fee782a72126ec5d793081ef03791c28a0fd542a5bee64/pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", size = 1852649 }, - { url = "https://files.pythonhosted.org/packages/9d/2b/98a37b80b15aac9eb2c6cfc6dbd35e5058a352891c5cce3a8472d77665a6/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", size = 1892472 }, - { url = "https://files.pythonhosted.org/packages/4e/d4/3c59514e0f55a161004792b9ff3039da52448f43f5834f905abef9db6e4a/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", size = 1977509 }, - { url = "https://files.pythonhosted.org/packages/a9/b6/c2c7946ef70576f79a25db59a576bce088bdc5952d1b93c9789b091df716/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", size = 2128702 }, - { url = "https://files.pythonhosted.org/packages/88/fe/65a880f81e3f2a974312b61f82a03d85528f89a010ce21ad92f109d94deb/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", size = 2679428 }, - { url = "https://files.pythonhosted.org/packages/6f/ff/4459e4146afd0462fb483bb98aa2436d69c484737feaceba1341615fb0ac/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", size = 2008753 }, - { url = "https://files.pythonhosted.org/packages/7c/76/1c42e384e8d78452ededac8b583fe2550c84abfef83a0552e0e7478ccbc3/pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", size = 2114849 }, - { url = "https://files.pythonhosted.org/packages/00/72/7d0cf05095c15f7ffe0eb78914b166d591c0eed72f294da68378da205101/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", size = 2069541 }, - { url = "https://files.pythonhosted.org/packages/b3/69/94a514066bb7d8be499aa764926937409d2389c09be0b5107a970286ef81/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", size = 2239225 }, - { url = "https://files.pythonhosted.org/packages/84/b0/e390071eadb44b41f4f54c3cef64d8bf5f9612c92686c9299eaa09e267e2/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", size = 2248373 }, - { url = "https://files.pythonhosted.org/packages/d6/b2/288b3579ffc07e92af66e2f1a11be3b056fe1214aab314748461f21a31c3/pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", size = 1907034 }, - { url = "https://files.pythonhosted.org/packages/02/28/58442ad1c22b5b6742b992ba9518420235adced665513868f99a1c2638a5/pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", size = 1956848 }, - { url = "https://files.pythonhosted.org/packages/a1/eb/f54809b51c7e2a1d9f439f158b8dd94359321abcc98767e16fc48ae5a77e/pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", size = 1903986 }, - { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551 }, - { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785 }, - { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758 }, - { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109 }, - { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159 }, - { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222 }, - { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980 }, - { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840 }, - { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518 }, - { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025 }, - { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991 }, - { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262 }, - { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626 }, - { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590 }, - { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963 }, - { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896 }, - { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810 }, - { url = "https://files.pythonhosted.org/packages/9c/c7/8b311d5adb0fe00a93ee9b4e92a02b0ec08510e9838885ef781ccbb20604/pydantic_core-2.33.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c834f54f8f4640fd7e4b193f80eb25a0602bba9e19b3cd2fc7ffe8199f5ae02", size = 2041659 }, - { url = "https://files.pythonhosted.org/packages/8a/d6/4f58d32066a9e26530daaf9adc6664b01875ae0691570094968aaa7b8fcc/pydantic_core-2.33.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:049e0de24cf23766f12cc5cc71d8abc07d4a9deb9061b334b62093dedc7cb068", size = 1873294 }, - { url = "https://files.pythonhosted.org/packages/f7/3f/53cc9c45d9229da427909c751f8ed2bf422414f7664ea4dde2d004f596ba/pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a28239037b3d6f16916a4c831a5a0eadf856bdd6d2e92c10a0da3a59eadcf3e", size = 1903771 }, - { url = "https://files.pythonhosted.org/packages/f0/49/bf0783279ce674eb9903fb9ae43f6c614cb2f1c4951370258823f795368b/pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d3da303ab5f378a268fa7d45f37d7d85c3ec19769f28d2cc0c61826a8de21fe", size = 2083558 }, - { url = "https://files.pythonhosted.org/packages/9c/5b/0d998367687f986c7d8484a2c476d30f07bf5b8b1477649a6092bd4c540e/pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:25626fb37b3c543818c14821afe0fd3830bc327a43953bc88db924b68c5723f1", size = 2118038 }, - { url = "https://files.pythonhosted.org/packages/b3/33/039287d410230ee125daee57373ac01940d3030d18dba1c29cd3089dc3ca/pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3ab2d36e20fbfcce8f02d73c33a8a7362980cff717926bbae030b93ae46b56c7", size = 2079315 }, - { url = "https://files.pythonhosted.org/packages/1f/85/6d8b2646d99c062d7da2d0ab2faeb0d6ca9cca4c02da6076376042a20da3/pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:2f9284e11c751b003fd4215ad92d325d92c9cb19ee6729ebd87e3250072cdcde", size = 2249063 }, - { url = "https://files.pythonhosted.org/packages/17/d7/c37d208d5738f7b9ad8f22ae8a727d88ebf9c16c04ed2475122cc3f7224a/pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:048c01eee07d37cbd066fc512b9d8b5ea88ceeb4e629ab94b3e56965ad655add", size = 2254631 }, - { url = "https://files.pythonhosted.org/packages/13/e0/bafa46476d328e4553b85ab9b2f7409e7aaef0ce4c937c894821c542d347/pydantic_core-2.33.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5ccd429694cf26af7997595d627dd2637e7932214486f55b8a357edaac9dae8c", size = 2080877 }, - { url = "https://files.pythonhosted.org/packages/0b/76/1794e440c1801ed35415238d2c728f26cd12695df9057154ad768b7b991c/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", size = 2042858 }, - { url = "https://files.pythonhosted.org/packages/73/b4/9cd7b081fb0b1b4f8150507cd59d27b275c3e22ad60b35cb19ea0977d9b9/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", size = 1873745 }, - { url = "https://files.pythonhosted.org/packages/e1/d7/9ddb7575d4321e40d0363903c2576c8c0c3280ebea137777e5ab58d723e3/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", size = 1904188 }, - { url = "https://files.pythonhosted.org/packages/d1/a8/3194ccfe461bb08da19377ebec8cb4f13c9bd82e13baebc53c5c7c39a029/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", size = 2083479 }, - { url = "https://files.pythonhosted.org/packages/42/c7/84cb569555d7179ca0b3f838cef08f66f7089b54432f5b8599aac6e9533e/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", size = 2118415 }, - { url = "https://files.pythonhosted.org/packages/3b/67/72abb8c73e0837716afbb58a59cc9e3ae43d1aa8677f3b4bc72c16142716/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", size = 2079623 }, - { url = "https://files.pythonhosted.org/packages/0b/cd/c59707e35a47ba4cbbf153c3f7c56420c58653b5801b055dc52cccc8e2dc/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", size = 2250175 }, - { url = "https://files.pythonhosted.org/packages/84/32/e4325a6676b0bed32d5b084566ec86ed7fd1e9bcbfc49c578b1755bde920/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", size = 2254674 }, - { url = "https://files.pythonhosted.org/packages/12/6f/5596dc418f2e292ffc661d21931ab34591952e2843e7168ea5a52591f6ff/pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", size = 2080951 }, +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/92/b31726561b5dae176c2d2c2dc43a9c5bfba5d32f96f8b4c0a600dd492447/pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8", size = 2028817, upload-time = "2025-04-23T18:30:43.919Z" }, + { url = "https://files.pythonhosted.org/packages/a3/44/3f0b95fafdaca04a483c4e685fe437c6891001bf3ce8b2fded82b9ea3aa1/pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d", size = 1861357, upload-time = "2025-04-23T18:30:46.372Z" }, + { url = "https://files.pythonhosted.org/packages/30/97/e8f13b55766234caae05372826e8e4b3b96e7b248be3157f53237682e43c/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d", size = 1898011, upload-time = "2025-04-23T18:30:47.591Z" }, + { url = "https://files.pythonhosted.org/packages/9b/a3/99c48cf7bafc991cc3ee66fd544c0aae8dc907b752f1dad2d79b1b5a471f/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572", size = 1982730, upload-time = "2025-04-23T18:30:49.328Z" }, + { url = "https://files.pythonhosted.org/packages/de/8e/a5b882ec4307010a840fb8b58bd9bf65d1840c92eae7534c7441709bf54b/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02", size = 2136178, upload-time = "2025-04-23T18:30:50.907Z" }, + { url = "https://files.pythonhosted.org/packages/e4/bb/71e35fc3ed05af6834e890edb75968e2802fe98778971ab5cba20a162315/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b", size = 2736462, upload-time = "2025-04-23T18:30:52.083Z" }, + { url = "https://files.pythonhosted.org/packages/31/0d/c8f7593e6bc7066289bbc366f2235701dcbebcd1ff0ef8e64f6f239fb47d/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2", size = 2005652, upload-time = "2025-04-23T18:30:53.389Z" }, + { url = "https://files.pythonhosted.org/packages/d2/7a/996d8bd75f3eda405e3dd219ff5ff0a283cd8e34add39d8ef9157e722867/pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a", size = 2113306, upload-time = "2025-04-23T18:30:54.661Z" }, + { url = "https://files.pythonhosted.org/packages/ff/84/daf2a6fb2db40ffda6578a7e8c5a6e9c8affb251a05c233ae37098118788/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac", size = 2073720, upload-time = "2025-04-23T18:30:56.11Z" }, + { url = "https://files.pythonhosted.org/packages/77/fb/2258da019f4825128445ae79456a5499c032b55849dbd5bed78c95ccf163/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a", size = 2244915, upload-time = "2025-04-23T18:30:57.501Z" }, + { url = "https://files.pythonhosted.org/packages/d8/7a/925ff73756031289468326e355b6fa8316960d0d65f8b5d6b3a3e7866de7/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b", size = 2241884, upload-time = "2025-04-23T18:30:58.867Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b0/249ee6d2646f1cdadcb813805fe76265745c4010cf20a8eba7b0e639d9b2/pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22", size = 1910496, upload-time = "2025-04-23T18:31:00.078Z" }, + { url = "https://files.pythonhosted.org/packages/66/ff/172ba8f12a42d4b552917aa65d1f2328990d3ccfc01d5b7c943ec084299f/pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640", size = 1955019, upload-time = "2025-04-23T18:31:01.335Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8d/71db63483d518cbbf290261a1fc2839d17ff89fce7089e08cad07ccfce67/pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", size = 2028584, upload-time = "2025-04-23T18:31:03.106Z" }, + { url = "https://files.pythonhosted.org/packages/24/2f/3cfa7244ae292dd850989f328722d2aef313f74ffc471184dc509e1e4e5a/pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", size = 1855071, upload-time = "2025-04-23T18:31:04.621Z" }, + { url = "https://files.pythonhosted.org/packages/b3/d3/4ae42d33f5e3f50dd467761304be2fa0a9417fbf09735bc2cce003480f2a/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", size = 1897823, upload-time = "2025-04-23T18:31:06.377Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f3/aa5976e8352b7695ff808599794b1fba2a9ae2ee954a3426855935799488/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", size = 1983792, upload-time = "2025-04-23T18:31:07.93Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7a/cda9b5a23c552037717f2b2a5257e9b2bfe45e687386df9591eff7b46d28/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", size = 2136338, upload-time = "2025-04-23T18:31:09.283Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/b8f9ec8dd1417eb9da784e91e1667d58a2a4a7b7b34cf4af765ef663a7e5/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", size = 2730998, upload-time = "2025-04-23T18:31:11.7Z" }, + { url = "https://files.pythonhosted.org/packages/47/bc/cd720e078576bdb8255d5032c5d63ee5c0bf4b7173dd955185a1d658c456/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", size = 2003200, upload-time = "2025-04-23T18:31:13.536Z" }, + { url = "https://files.pythonhosted.org/packages/ca/22/3602b895ee2cd29d11a2b349372446ae9727c32e78a94b3d588a40fdf187/pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", size = 2113890, upload-time = "2025-04-23T18:31:15.011Z" }, + { url = "https://files.pythonhosted.org/packages/ff/e6/e3c5908c03cf00d629eb38393a98fccc38ee0ce8ecce32f69fc7d7b558a7/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d", size = 2073359, upload-time = "2025-04-23T18:31:16.393Z" }, + { url = "https://files.pythonhosted.org/packages/12/e7/6a36a07c59ebefc8777d1ffdaf5ae71b06b21952582e4b07eba88a421c79/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", size = 2245883, upload-time = "2025-04-23T18:31:17.892Z" }, + { url = "https://files.pythonhosted.org/packages/16/3f/59b3187aaa6cc0c1e6616e8045b284de2b6a87b027cce2ffcea073adf1d2/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", size = 2241074, upload-time = "2025-04-23T18:31:19.205Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ed/55532bb88f674d5d8f67ab121a2a13c385df382de2a1677f30ad385f7438/pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", size = 1910538, upload-time = "2025-04-23T18:31:20.541Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1b/25b7cccd4519c0b23c2dd636ad39d381abf113085ce4f7bec2b0dc755eb1/pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", size = 1952909, upload-time = "2025-04-23T18:31:22.371Z" }, + { url = "https://files.pythonhosted.org/packages/49/a9/d809358e49126438055884c4366a1f6227f0f84f635a9014e2deb9b9de54/pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", size = 1897786, upload-time = "2025-04-23T18:31:24.161Z" }, + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload-time = "2025-04-23T18:31:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload-time = "2025-04-23T18:31:32.514Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload-time = "2025-04-23T18:31:33.958Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload-time = "2025-04-23T18:31:39.095Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload-time = "2025-04-23T18:31:41.034Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload-time = "2025-04-23T18:31:42.757Z" }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload-time = "2025-04-23T18:31:44.304Z" }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload-time = "2025-04-23T18:31:45.891Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload-time = "2025-04-23T18:31:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload-time = "2025-04-23T18:31:49.635Z" }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload-time = "2025-04-23T18:31:51.609Z" }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" }, + { url = "https://files.pythonhosted.org/packages/30/68/373d55e58b7e83ce371691f6eaa7175e3a24b956c44628eb25d7da007917/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa", size = 2023982, upload-time = "2025-04-23T18:32:53.14Z" }, + { url = "https://files.pythonhosted.org/packages/a4/16/145f54ac08c96a63d8ed6442f9dec17b2773d19920b627b18d4f10a061ea/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29", size = 1858412, upload-time = "2025-04-23T18:32:55.52Z" }, + { url = "https://files.pythonhosted.org/packages/41/b1/c6dc6c3e2de4516c0bb2c46f6a373b91b5660312342a0cf5826e38ad82fa/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d", size = 1892749, upload-time = "2025-04-23T18:32:57.546Z" }, + { url = "https://files.pythonhosted.org/packages/12/73/8cd57e20afba760b21b742106f9dbdfa6697f1570b189c7457a1af4cd8a0/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e", size = 2067527, upload-time = "2025-04-23T18:32:59.771Z" }, + { url = "https://files.pythonhosted.org/packages/e3/d5/0bb5d988cc019b3cba4a78f2d4b3854427fc47ee8ec8e9eaabf787da239c/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c", size = 2108225, upload-time = "2025-04-23T18:33:04.51Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c5/00c02d1571913d496aabf146106ad8239dc132485ee22efe08085084ff7c/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec", size = 2069490, upload-time = "2025-04-23T18:33:06.391Z" }, + { url = "https://files.pythonhosted.org/packages/22/a8/dccc38768274d3ed3a59b5d06f59ccb845778687652daa71df0cab4040d7/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052", size = 2237525, upload-time = "2025-04-23T18:33:08.44Z" }, + { url = "https://files.pythonhosted.org/packages/d4/e7/4f98c0b125dda7cf7ccd14ba936218397b44f50a56dd8c16a3091df116c3/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c", size = 2238446, upload-time = "2025-04-23T18:33:10.313Z" }, + { url = "https://files.pythonhosted.org/packages/ce/91/2ec36480fdb0b783cd9ef6795753c1dea13882f2e68e73bce76ae8c21e6a/pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", size = 2066678, upload-time = "2025-04-23T18:33:12.224Z" }, + { url = "https://files.pythonhosted.org/packages/7b/27/d4ae6487d73948d6f20dddcd94be4ea43e74349b56eba82e9bdee2d7494c/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", size = 2025200, upload-time = "2025-04-23T18:33:14.199Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b8/b3cb95375f05d33801024079b9392a5ab45267a63400bf1866e7ce0f0de4/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", size = 1859123, upload-time = "2025-04-23T18:33:16.555Z" }, + { url = "https://files.pythonhosted.org/packages/05/bc/0d0b5adeda59a261cd30a1235a445bf55c7e46ae44aea28f7bd6ed46e091/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", size = 1892852, upload-time = "2025-04-23T18:33:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/d37bdebbda2e449cb3f519f6ce950927b56d62f0b84fd9cb9e372a26a3d5/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", size = 2067484, upload-time = "2025-04-23T18:33:20.475Z" }, + { url = "https://files.pythonhosted.org/packages/8c/55/1f95f0a05ce72ecb02a8a8a1c3be0579bbc29b1d5ab68f1378b7bebc5057/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", size = 2108896, upload-time = "2025-04-23T18:33:22.501Z" }, + { url = "https://files.pythonhosted.org/packages/53/89/2b2de6c81fa131f423246a9109d7b2a375e83968ad0800d6e57d0574629b/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", size = 2069475, upload-time = "2025-04-23T18:33:24.528Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e9/1f7efbe20d0b2b10f6718944b5d8ece9152390904f29a78e68d4e7961159/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", size = 2239013, upload-time = "2025-04-23T18:33:26.621Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/5309c905a93811524a49b4e031e9851a6b00ff0fb668794472ea7746b448/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", size = 2238715, upload-time = "2025-04-23T18:33:28.656Z" }, + { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" }, ] [[package]] @@ -609,18 +612,18 @@ dependencies = [ { name = "typing-extensions" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/88/e08ab18dc74b2916f48703ed1a797d57cb64eca0e23b0a9254e13cfe3911/pygithub-2.6.1.tar.gz", hash = "sha256:b5c035392991cca63959e9453286b41b54d83bf2de2daa7d7ff7e4312cebf3bf", size = 3659473 } +sdist = { url = "https://files.pythonhosted.org/packages/c0/88/e08ab18dc74b2916f48703ed1a797d57cb64eca0e23b0a9254e13cfe3911/pygithub-2.6.1.tar.gz", hash = "sha256:b5c035392991cca63959e9453286b41b54d83bf2de2daa7d7ff7e4312cebf3bf", size = 3659473, upload-time = "2025-02-21T13:45:58.262Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ac/fc/a444cd19ccc8c4946a512f3827ed0b3565c88488719d800d54a75d541c0b/PyGithub-2.6.1-py3-none-any.whl", hash = "sha256:6f2fa6d076ccae475f9fc392cc6cdbd54db985d4f69b8833a28397de75ed6ca3", size = 410451 }, + { url = "https://files.pythonhosted.org/packages/ac/fc/a444cd19ccc8c4946a512f3827ed0b3565c88488719d800d54a75d541c0b/PyGithub-2.6.1-py3-none-any.whl", hash = "sha256:6f2fa6d076ccae475f9fc392cc6cdbd54db985d4f69b8833a28397de75ed6ca3", size = 410451, upload-time = "2025-02-21T13:45:55.519Z" }, ] [[package]] name = "pyjwt" version = "2.10.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785 } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997 }, + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, ] [package.optional-dependencies] @@ -635,17 +638,17 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a7/22/27582568be639dfe22ddb3902225f91f2f17ceff88ce80e4db396c8986da/PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba", size = 3392854 } +sdist = { url = "https://files.pythonhosted.org/packages/a7/22/27582568be639dfe22ddb3902225f91f2f17ceff88ce80e4db396c8986da/PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba", size = 3392854, upload-time = "2022-01-07T22:05:41.134Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/75/0b8ede18506041c0bf23ac4d8e2971b4161cd6ce630b177d0a08eb0d8857/PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1", size = 349920 }, - { url = "https://files.pythonhosted.org/packages/59/bb/fddf10acd09637327a97ef89d2a9d621328850a72f1fdc8c08bdf72e385f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92", size = 601722 }, - { url = "https://files.pythonhosted.org/packages/5d/70/87a065c37cca41a75f2ce113a5a2c2aa7533be648b184ade58971b5f7ccc/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394", size = 680087 }, - { url = "https://files.pythonhosted.org/packages/ee/87/f1bb6a595f14a327e8285b9eb54d41fef76c585a0edef0a45f6fc95de125/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d", size = 856678 }, - { url = "https://files.pythonhosted.org/packages/66/28/ca86676b69bf9f90e710571b67450508484388bfce09acf8a46f0b8c785f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858", size = 1133660 }, - { url = "https://files.pythonhosted.org/packages/3d/85/c262db650e86812585e2bc59e497a8f59948a005325a11bbbc9ecd3fe26b/PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b", size = 663824 }, - { url = "https://files.pythonhosted.org/packages/fd/1a/cc308a884bd299b651f1633acb978e8596c71c33ca85e9dc9fa33a5399b9/PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff", size = 1117912 }, - { url = "https://files.pythonhosted.org/packages/25/2d/b7df6ddb0c2a33afdb358f8af6ea3b8c4d1196ca45497dd37a56f0c122be/PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543", size = 204624 }, - { url = "https://files.pythonhosted.org/packages/5e/22/d3db169895faaf3e2eda892f005f433a62db2decbcfbc2f61e6517adfa87/PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93", size = 212141 }, + { url = "https://files.pythonhosted.org/packages/ce/75/0b8ede18506041c0bf23ac4d8e2971b4161cd6ce630b177d0a08eb0d8857/PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1", size = 349920, upload-time = "2022-01-07T22:05:49.156Z" }, + { url = "https://files.pythonhosted.org/packages/59/bb/fddf10acd09637327a97ef89d2a9d621328850a72f1fdc8c08bdf72e385f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92", size = 601722, upload-time = "2022-01-07T22:05:50.989Z" }, + { url = "https://files.pythonhosted.org/packages/5d/70/87a065c37cca41a75f2ce113a5a2c2aa7533be648b184ade58971b5f7ccc/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394", size = 680087, upload-time = "2022-01-07T22:05:52.539Z" }, + { url = "https://files.pythonhosted.org/packages/ee/87/f1bb6a595f14a327e8285b9eb54d41fef76c585a0edef0a45f6fc95de125/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d", size = 856678, upload-time = "2022-01-07T22:05:54.251Z" }, + { url = "https://files.pythonhosted.org/packages/66/28/ca86676b69bf9f90e710571b67450508484388bfce09acf8a46f0b8c785f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858", size = 1133660, upload-time = "2022-01-07T22:05:56.056Z" }, + { url = "https://files.pythonhosted.org/packages/3d/85/c262db650e86812585e2bc59e497a8f59948a005325a11bbbc9ecd3fe26b/PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b", size = 663824, upload-time = "2022-01-07T22:05:57.434Z" }, + { url = "https://files.pythonhosted.org/packages/fd/1a/cc308a884bd299b651f1633acb978e8596c71c33ca85e9dc9fa33a5399b9/PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff", size = 1117912, upload-time = "2022-01-07T22:05:58.665Z" }, + { url = "https://files.pythonhosted.org/packages/25/2d/b7df6ddb0c2a33afdb358f8af6ea3b8c4d1196ca45497dd37a56f0c122be/PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543", size = 204624, upload-time = "2022-01-07T22:06:00.085Z" }, + { url = "https://files.pythonhosted.org/packages/5e/22/d3db169895faaf3e2eda892f005f433a62db2decbcfbc2f61e6517adfa87/PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93", size = 212141, upload-time = "2022-01-07T22:06:01.861Z" }, ] [[package]] @@ -655,58 +658,58 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] [[package]] name = "pyyaml" version = "6.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199 }, - { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758 }, - { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463 }, - { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280 }, - { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239 }, - { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802 }, - { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527 }, - { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052 }, - { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774 }, - { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, - { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, - { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, - { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, - { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, - { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, - { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, - { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, - { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199, upload-time = "2024-08-06T20:31:40.178Z" }, + { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758, upload-time = "2024-08-06T20:31:42.173Z" }, + { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463, upload-time = "2024-08-06T20:31:44.263Z" }, + { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280, upload-time = "2024-08-06T20:31:50.199Z" }, + { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239, upload-time = "2024-08-06T20:31:52.292Z" }, + { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802, upload-time = "2024-08-06T20:31:53.836Z" }, + { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527, upload-time = "2024-08-06T20:31:55.565Z" }, + { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052, upload-time = "2024-08-06T20:31:56.914Z" }, + { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774, upload-time = "2024-08-06T20:31:58.304Z" }, + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload-time = "2024-08-06T20:32:03.408Z" }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload-time = "2024-08-06T20:32:04.926Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload-time = "2024-08-06T20:32:06.459Z" }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload-time = "2024-08-06T20:32:08.338Z" }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload-time = "2024-08-06T20:32:14.124Z" }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload-time = "2024-08-06T20:32:16.17Z" }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload-time = "2024-08-06T20:32:18.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload-time = "2024-08-06T20:32:19.889Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload-time = "2024-08-06T20:32:21.273Z" }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload-time = "2024-08-06T20:32:25.131Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload-time = "2024-08-06T20:32:26.511Z" }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload-time = "2024-08-06T20:32:28.363Z" }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload-time = "2024-08-06T20:32:30.058Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload-time = "2024-08-06T20:32:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload-time = "2024-08-06T20:32:37.083Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload-time = "2024-08-06T20:32:38.898Z" }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload-time = "2024-08-06T20:32:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload-time = "2024-08-06T20:32:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, ] [[package]] name = "requests" -version = "2.32.3" +version = "2.32.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -714,9 +717,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, + { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" }, ] [[package]] @@ -727,9 +730,9 @@ dependencies = [ { name = "oauthlib" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650 } +sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650, upload-time = "2024-03-22T20:32:29.939Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179 }, + { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179, upload-time = "2024-03-22T20:32:28.055Z" }, ] [[package]] @@ -739,9 +742,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 } +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888, upload-time = "2023-05-01T04:11:33.229Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 }, + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481, upload-time = "2023-05-01T04:11:28.427Z" }, ] [[package]] @@ -754,128 +757,128 @@ dependencies = [ { name = "pyyaml" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/09/6b6528a84471d432c37ecfb48fd3987cf9b02bba6bca5ef8a406b66822c5/shrub_py-3.10.0.tar.gz", hash = "sha256:035cb81fabbd72f47792ab4304ce33af262005842fa5886c1e57b7a2a9d53cfa", size = 33236 } +sdist = { url = "https://files.pythonhosted.org/packages/76/09/6b6528a84471d432c37ecfb48fd3987cf9b02bba6bca5ef8a406b66822c5/shrub_py-3.10.0.tar.gz", hash = "sha256:035cb81fabbd72f47792ab4304ce33af262005842fa5886c1e57b7a2a9d53cfa", size = 33236, upload-time = "2025-04-10T18:26:58.814Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/08/0f1d5a935de84c74239b8337c6e215fa8e75c3eb9733c68e9bef88ae9052/shrub_py-3.10.0-py3-none-any.whl", hash = "sha256:239ad492819c84f14f4349d3679f5a6218468441861f310a2320ec9683862805", size = 40326 }, + { url = "https://files.pythonhosted.org/packages/1f/08/0f1d5a935de84c74239b8337c6e215fa8e75c3eb9733c68e9bef88ae9052/shrub_py-3.10.0-py3-none-any.whl", hash = "sha256:239ad492819c84f14f4349d3679f5a6218468441861f310a2320ec9683862805", size = 40326, upload-time = "2025-04-10T18:26:54.592Z" }, ] [[package]] name = "six" version = "1.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] [[package]] name = "smmap" version = "5.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329 } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload-time = "2025-01-02T07:14:40.909Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 }, + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload-time = "2025-01-02T07:14:38.724Z" }, ] [[package]] name = "soupsieve" version = "2.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418 } +sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload-time = "2025-04-20T18:50:08.518Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677 }, + { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload-time = "2025-04-20T18:50:07.196Z" }, ] [[package]] name = "typing-extensions" -version = "4.13.2" +version = "4.14.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 } +sdist = { url = "https://files.pythonhosted.org/packages/d1/bc/51647cd02527e87d05cb083ccc402f93e441606ff1f01739a62c8ad09ba5/typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", size = 107423, upload-time = "2025-06-02T14:52:11.399Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 }, + { url = "https://files.pythonhosted.org/packages/69/e0/552843e0d356fbb5256d21449fa957fa4eff3bbc135a74a691ee70c7c5da/typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af", size = 43839, upload-time = "2025-06-02T14:52:10.026Z" }, ] [[package]] name = "typing-inspection" -version = "0.4.0" +version = "0.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 } +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 }, + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, ] [[package]] name = "urllib3" -version = "2.4.0" +version = "2.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 }, + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, ] [[package]] name = "wrapt" version = "1.17.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/d1/1daec934997e8b160040c78d7b31789f19b122110a75eca3d4e8da0049e1/wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984", size = 53307 }, - { url = "https://files.pythonhosted.org/packages/1b/7b/13369d42651b809389c1a7153baa01d9700430576c81a2f5c5e460df0ed9/wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22", size = 38486 }, - { url = "https://files.pythonhosted.org/packages/62/bf/e0105016f907c30b4bd9e377867c48c34dc9c6c0c104556c9c9126bd89ed/wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7", size = 38777 }, - { url = "https://files.pythonhosted.org/packages/27/70/0f6e0679845cbf8b165e027d43402a55494779295c4b08414097b258ac87/wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c", size = 83314 }, - { url = "https://files.pythonhosted.org/packages/0f/77/0576d841bf84af8579124a93d216f55d6f74374e4445264cb378a6ed33eb/wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72", size = 74947 }, - { url = "https://files.pythonhosted.org/packages/90/ec/00759565518f268ed707dcc40f7eeec38637d46b098a1f5143bff488fe97/wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061", size = 82778 }, - { url = "https://files.pythonhosted.org/packages/f8/5a/7cffd26b1c607b0b0c8a9ca9d75757ad7620c9c0a9b4a25d3f8a1480fafc/wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2", size = 81716 }, - { url = "https://files.pythonhosted.org/packages/7e/09/dccf68fa98e862df7e6a60a61d43d644b7d095a5fc36dbb591bbd4a1c7b2/wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c", size = 74548 }, - { url = "https://files.pythonhosted.org/packages/b7/8e/067021fa3c8814952c5e228d916963c1115b983e21393289de15128e867e/wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62", size = 81334 }, - { url = "https://files.pythonhosted.org/packages/4b/0d/9d4b5219ae4393f718699ca1c05f5ebc0c40d076f7e65fd48f5f693294fb/wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563", size = 36427 }, - { url = "https://files.pythonhosted.org/packages/72/6a/c5a83e8f61aec1e1aeef939807602fb880e5872371e95df2137142f5c58e/wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f", size = 38774 }, - { url = "https://files.pythonhosted.org/packages/cd/f7/a2aab2cbc7a665efab072344a8949a71081eed1d2f451f7f7d2b966594a2/wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58", size = 53308 }, - { url = "https://files.pythonhosted.org/packages/50/ff/149aba8365fdacef52b31a258c4dc1c57c79759c335eff0b3316a2664a64/wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda", size = 38488 }, - { url = "https://files.pythonhosted.org/packages/65/46/5a917ce85b5c3b490d35c02bf71aedaa9f2f63f2d15d9949cc4ba56e8ba9/wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438", size = 38776 }, - { url = "https://files.pythonhosted.org/packages/ca/74/336c918d2915a4943501c77566db41d1bd6e9f4dbc317f356b9a244dfe83/wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a", size = 83776 }, - { url = "https://files.pythonhosted.org/packages/09/99/c0c844a5ccde0fe5761d4305485297f91d67cf2a1a824c5f282e661ec7ff/wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000", size = 75420 }, - { url = "https://files.pythonhosted.org/packages/b4/b0/9fc566b0fe08b282c850063591a756057c3247b2362b9286429ec5bf1721/wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6", size = 83199 }, - { url = "https://files.pythonhosted.org/packages/9d/4b/71996e62d543b0a0bd95dda485219856def3347e3e9380cc0d6cf10cfb2f/wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b", size = 82307 }, - { url = "https://files.pythonhosted.org/packages/39/35/0282c0d8789c0dc9bcc738911776c762a701f95cfe113fb8f0b40e45c2b9/wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662", size = 75025 }, - { url = "https://files.pythonhosted.org/packages/4f/6d/90c9fd2c3c6fee181feecb620d95105370198b6b98a0770cba090441a828/wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72", size = 81879 }, - { url = "https://files.pythonhosted.org/packages/8f/fa/9fb6e594f2ce03ef03eddbdb5f4f90acb1452221a5351116c7c4708ac865/wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317", size = 36419 }, - { url = "https://files.pythonhosted.org/packages/47/f8/fb1773491a253cbc123c5d5dc15c86041f746ed30416535f2a8df1f4a392/wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3", size = 38773 }, - { url = "https://files.pythonhosted.org/packages/a1/bd/ab55f849fd1f9a58ed7ea47f5559ff09741b25f00c191231f9f059c83949/wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925", size = 53799 }, - { url = "https://files.pythonhosted.org/packages/53/18/75ddc64c3f63988f5a1d7e10fb204ffe5762bc663f8023f18ecaf31a332e/wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392", size = 38821 }, - { url = "https://files.pythonhosted.org/packages/48/2a/97928387d6ed1c1ebbfd4efc4133a0633546bec8481a2dd5ec961313a1c7/wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40", size = 38919 }, - { url = "https://files.pythonhosted.org/packages/73/54/3bfe5a1febbbccb7a2f77de47b989c0b85ed3a6a41614b104204a788c20e/wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d", size = 88721 }, - { url = "https://files.pythonhosted.org/packages/25/cb/7262bc1b0300b4b64af50c2720ef958c2c1917525238d661c3e9a2b71b7b/wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b", size = 80899 }, - { url = "https://files.pythonhosted.org/packages/2a/5a/04cde32b07a7431d4ed0553a76fdb7a61270e78c5fd5a603e190ac389f14/wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98", size = 89222 }, - { url = "https://files.pythonhosted.org/packages/09/28/2e45a4f4771fcfb109e244d5dbe54259e970362a311b67a965555ba65026/wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82", size = 86707 }, - { url = "https://files.pythonhosted.org/packages/c6/d2/dcb56bf5f32fcd4bd9aacc77b50a539abdd5b6536872413fd3f428b21bed/wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae", size = 79685 }, - { url = "https://files.pythonhosted.org/packages/80/4e/eb8b353e36711347893f502ce91c770b0b0929f8f0bed2670a6856e667a9/wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9", size = 87567 }, - { url = "https://files.pythonhosted.org/packages/17/27/4fe749a54e7fae6e7146f1c7d914d28ef599dacd4416566c055564080fe2/wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9", size = 36672 }, - { url = "https://files.pythonhosted.org/packages/15/06/1dbf478ea45c03e78a6a8c4be4fdc3c3bddea5c8de8a93bc971415e47f0f/wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991", size = 38865 }, - { url = "https://files.pythonhosted.org/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125", size = 53800 }, - { url = "https://files.pythonhosted.org/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998", size = 38824 }, - { url = "https://files.pythonhosted.org/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5", size = 38920 }, - { url = "https://files.pythonhosted.org/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8", size = 88690 }, - { url = "https://files.pythonhosted.org/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6", size = 80861 }, - { url = "https://files.pythonhosted.org/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc", size = 89174 }, - { url = "https://files.pythonhosted.org/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2", size = 86721 }, - { url = "https://files.pythonhosted.org/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b", size = 79763 }, - { url = "https://files.pythonhosted.org/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504", size = 87585 }, - { url = "https://files.pythonhosted.org/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", size = 36676 }, - { url = "https://files.pythonhosted.org/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", size = 38871 }, - { url = "https://files.pythonhosted.org/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192", size = 56312 }, - { url = "https://files.pythonhosted.org/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b", size = 40062 }, - { url = "https://files.pythonhosted.org/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0", size = 40155 }, - { url = "https://files.pythonhosted.org/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306", size = 113471 }, - { url = "https://files.pythonhosted.org/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb", size = 101208 }, - { url = "https://files.pythonhosted.org/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681", size = 109339 }, - { url = "https://files.pythonhosted.org/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6", size = 110232 }, - { url = "https://files.pythonhosted.org/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6", size = 100476 }, - { url = "https://files.pythonhosted.org/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f", size = 106377 }, - { url = "https://files.pythonhosted.org/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", size = 37986 }, - { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750 }, - { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 }, +sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531, upload-time = "2025-01-14T10:35:45.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/d1/1daec934997e8b160040c78d7b31789f19b122110a75eca3d4e8da0049e1/wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984", size = 53307, upload-time = "2025-01-14T10:33:13.616Z" }, + { url = "https://files.pythonhosted.org/packages/1b/7b/13369d42651b809389c1a7153baa01d9700430576c81a2f5c5e460df0ed9/wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22", size = 38486, upload-time = "2025-01-14T10:33:15.947Z" }, + { url = "https://files.pythonhosted.org/packages/62/bf/e0105016f907c30b4bd9e377867c48c34dc9c6c0c104556c9c9126bd89ed/wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7", size = 38777, upload-time = "2025-01-14T10:33:17.462Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/0f6e0679845cbf8b165e027d43402a55494779295c4b08414097b258ac87/wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c", size = 83314, upload-time = "2025-01-14T10:33:21.282Z" }, + { url = "https://files.pythonhosted.org/packages/0f/77/0576d841bf84af8579124a93d216f55d6f74374e4445264cb378a6ed33eb/wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72", size = 74947, upload-time = "2025-01-14T10:33:24.414Z" }, + { url = "https://files.pythonhosted.org/packages/90/ec/00759565518f268ed707dcc40f7eeec38637d46b098a1f5143bff488fe97/wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061", size = 82778, upload-time = "2025-01-14T10:33:26.152Z" }, + { url = "https://files.pythonhosted.org/packages/f8/5a/7cffd26b1c607b0b0c8a9ca9d75757ad7620c9c0a9b4a25d3f8a1480fafc/wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2", size = 81716, upload-time = "2025-01-14T10:33:27.372Z" }, + { url = "https://files.pythonhosted.org/packages/7e/09/dccf68fa98e862df7e6a60a61d43d644b7d095a5fc36dbb591bbd4a1c7b2/wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c", size = 74548, upload-time = "2025-01-14T10:33:28.52Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8e/067021fa3c8814952c5e228d916963c1115b983e21393289de15128e867e/wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62", size = 81334, upload-time = "2025-01-14T10:33:29.643Z" }, + { url = "https://files.pythonhosted.org/packages/4b/0d/9d4b5219ae4393f718699ca1c05f5ebc0c40d076f7e65fd48f5f693294fb/wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563", size = 36427, upload-time = "2025-01-14T10:33:30.832Z" }, + { url = "https://files.pythonhosted.org/packages/72/6a/c5a83e8f61aec1e1aeef939807602fb880e5872371e95df2137142f5c58e/wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f", size = 38774, upload-time = "2025-01-14T10:33:32.897Z" }, + { url = "https://files.pythonhosted.org/packages/cd/f7/a2aab2cbc7a665efab072344a8949a71081eed1d2f451f7f7d2b966594a2/wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58", size = 53308, upload-time = "2025-01-14T10:33:33.992Z" }, + { url = "https://files.pythonhosted.org/packages/50/ff/149aba8365fdacef52b31a258c4dc1c57c79759c335eff0b3316a2664a64/wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda", size = 38488, upload-time = "2025-01-14T10:33:35.264Z" }, + { url = "https://files.pythonhosted.org/packages/65/46/5a917ce85b5c3b490d35c02bf71aedaa9f2f63f2d15d9949cc4ba56e8ba9/wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438", size = 38776, upload-time = "2025-01-14T10:33:38.28Z" }, + { url = "https://files.pythonhosted.org/packages/ca/74/336c918d2915a4943501c77566db41d1bd6e9f4dbc317f356b9a244dfe83/wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a", size = 83776, upload-time = "2025-01-14T10:33:40.678Z" }, + { url = "https://files.pythonhosted.org/packages/09/99/c0c844a5ccde0fe5761d4305485297f91d67cf2a1a824c5f282e661ec7ff/wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000", size = 75420, upload-time = "2025-01-14T10:33:41.868Z" }, + { url = "https://files.pythonhosted.org/packages/b4/b0/9fc566b0fe08b282c850063591a756057c3247b2362b9286429ec5bf1721/wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6", size = 83199, upload-time = "2025-01-14T10:33:43.598Z" }, + { url = "https://files.pythonhosted.org/packages/9d/4b/71996e62d543b0a0bd95dda485219856def3347e3e9380cc0d6cf10cfb2f/wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b", size = 82307, upload-time = "2025-01-14T10:33:48.499Z" }, + { url = "https://files.pythonhosted.org/packages/39/35/0282c0d8789c0dc9bcc738911776c762a701f95cfe113fb8f0b40e45c2b9/wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662", size = 75025, upload-time = "2025-01-14T10:33:51.191Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6d/90c9fd2c3c6fee181feecb620d95105370198b6b98a0770cba090441a828/wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72", size = 81879, upload-time = "2025-01-14T10:33:52.328Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fa/9fb6e594f2ce03ef03eddbdb5f4f90acb1452221a5351116c7c4708ac865/wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317", size = 36419, upload-time = "2025-01-14T10:33:53.551Z" }, + { url = "https://files.pythonhosted.org/packages/47/f8/fb1773491a253cbc123c5d5dc15c86041f746ed30416535f2a8df1f4a392/wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3", size = 38773, upload-time = "2025-01-14T10:33:56.323Z" }, + { url = "https://files.pythonhosted.org/packages/a1/bd/ab55f849fd1f9a58ed7ea47f5559ff09741b25f00c191231f9f059c83949/wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925", size = 53799, upload-time = "2025-01-14T10:33:57.4Z" }, + { url = "https://files.pythonhosted.org/packages/53/18/75ddc64c3f63988f5a1d7e10fb204ffe5762bc663f8023f18ecaf31a332e/wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392", size = 38821, upload-time = "2025-01-14T10:33:59.334Z" }, + { url = "https://files.pythonhosted.org/packages/48/2a/97928387d6ed1c1ebbfd4efc4133a0633546bec8481a2dd5ec961313a1c7/wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40", size = 38919, upload-time = "2025-01-14T10:34:04.093Z" }, + { url = "https://files.pythonhosted.org/packages/73/54/3bfe5a1febbbccb7a2f77de47b989c0b85ed3a6a41614b104204a788c20e/wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d", size = 88721, upload-time = "2025-01-14T10:34:07.163Z" }, + { url = "https://files.pythonhosted.org/packages/25/cb/7262bc1b0300b4b64af50c2720ef958c2c1917525238d661c3e9a2b71b7b/wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b", size = 80899, upload-time = "2025-01-14T10:34:09.82Z" }, + { url = "https://files.pythonhosted.org/packages/2a/5a/04cde32b07a7431d4ed0553a76fdb7a61270e78c5fd5a603e190ac389f14/wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98", size = 89222, upload-time = "2025-01-14T10:34:11.258Z" }, + { url = "https://files.pythonhosted.org/packages/09/28/2e45a4f4771fcfb109e244d5dbe54259e970362a311b67a965555ba65026/wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82", size = 86707, upload-time = "2025-01-14T10:34:12.49Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d2/dcb56bf5f32fcd4bd9aacc77b50a539abdd5b6536872413fd3f428b21bed/wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae", size = 79685, upload-time = "2025-01-14T10:34:15.043Z" }, + { url = "https://files.pythonhosted.org/packages/80/4e/eb8b353e36711347893f502ce91c770b0b0929f8f0bed2670a6856e667a9/wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9", size = 87567, upload-time = "2025-01-14T10:34:16.563Z" }, + { url = "https://files.pythonhosted.org/packages/17/27/4fe749a54e7fae6e7146f1c7d914d28ef599dacd4416566c055564080fe2/wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9", size = 36672, upload-time = "2025-01-14T10:34:17.727Z" }, + { url = "https://files.pythonhosted.org/packages/15/06/1dbf478ea45c03e78a6a8c4be4fdc3c3bddea5c8de8a93bc971415e47f0f/wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991", size = 38865, upload-time = "2025-01-14T10:34:19.577Z" }, + { url = "https://files.pythonhosted.org/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125", size = 53800, upload-time = "2025-01-14T10:34:21.571Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998", size = 38824, upload-time = "2025-01-14T10:34:22.999Z" }, + { url = "https://files.pythonhosted.org/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5", size = 38920, upload-time = "2025-01-14T10:34:25.386Z" }, + { url = "https://files.pythonhosted.org/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8", size = 88690, upload-time = "2025-01-14T10:34:28.058Z" }, + { url = "https://files.pythonhosted.org/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6", size = 80861, upload-time = "2025-01-14T10:34:29.167Z" }, + { url = "https://files.pythonhosted.org/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc", size = 89174, upload-time = "2025-01-14T10:34:31.702Z" }, + { url = "https://files.pythonhosted.org/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2", size = 86721, upload-time = "2025-01-14T10:34:32.91Z" }, + { url = "https://files.pythonhosted.org/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b", size = 79763, upload-time = "2025-01-14T10:34:34.903Z" }, + { url = "https://files.pythonhosted.org/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504", size = 87585, upload-time = "2025-01-14T10:34:36.13Z" }, + { url = "https://files.pythonhosted.org/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", size = 36676, upload-time = "2025-01-14T10:34:37.962Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", size = 38871, upload-time = "2025-01-14T10:34:39.13Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192", size = 56312, upload-time = "2025-01-14T10:34:40.604Z" }, + { url = "https://files.pythonhosted.org/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b", size = 40062, upload-time = "2025-01-14T10:34:45.011Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0", size = 40155, upload-time = "2025-01-14T10:34:47.25Z" }, + { url = "https://files.pythonhosted.org/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306", size = 113471, upload-time = "2025-01-14T10:34:50.934Z" }, + { url = "https://files.pythonhosted.org/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb", size = 101208, upload-time = "2025-01-14T10:34:52.297Z" }, + { url = "https://files.pythonhosted.org/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681", size = 109339, upload-time = "2025-01-14T10:34:53.489Z" }, + { url = "https://files.pythonhosted.org/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6", size = 110232, upload-time = "2025-01-14T10:34:55.327Z" }, + { url = "https://files.pythonhosted.org/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6", size = 100476, upload-time = "2025-01-14T10:34:58.055Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f", size = 106377, upload-time = "2025-01-14T10:34:59.3Z" }, + { url = "https://files.pythonhosted.org/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", size = 37986, upload-time = "2025-01-14T10:35:00.498Z" }, + { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750, upload-time = "2025-01-14T10:35:03.378Z" }, + { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594, upload-time = "2025-01-14T10:35:44.018Z" }, ] From dde921121d9a5a6de69bd7bcfa3e193cb36df377 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Wed, 9 Jul 2025 11:05:27 -0500 Subject: [PATCH 20/42] Fix documentation for find vs. subscript --- src/bsoncxx/include/bsoncxx/v1/array/view.hpp | 14 ++++++++++++-- src/bsoncxx/include/bsoncxx/v1/document/view.hpp | 12 +++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp index b8a891bb63..08fca3db8e 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp @@ -108,7 +108,7 @@ class view { } /// - /// Return a const iterator to the element within the represented BSON array at index `i`. + /// Return a const iterator to the element within the represented BSON array at index `i` via key string comparison. /// /// If this view is invalid or the requested field is not found, returns an end iterator. /// @@ -120,7 +120,17 @@ class view { /// BSONCXX_ABI_EXPORT_CDECL(const_iterator) find(std::uint32_t i) const; - /// @copydoc find(std::uint32_t i) const + /// + /// Return the first element within the represented BSON array at index `i` via key string comparison. + /// + /// If this view is invalid or the requested field is not found, returns an invalid element. + /// + /// @par Complexity + /// Linear. + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation + /// failed due to invalid BSON bytes. + /// v1::element::view operator[](std::uint32_t i) const { return *(this->find(i)); } diff --git a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp index 5f67933a88..3c379b4789 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp @@ -220,7 +220,17 @@ class view { /// BSONCXX_ABI_EXPORT_CDECL(const_iterator) find(v1::stdx::string_view key) const; - /// @copydoc find(v1::stdx::string_view key) const + /// + /// Return the first element within the represented BSON document whose key compares equal to `key`. + /// + /// If this view is invalid or the requested field is not found, returns an invalid element. + /// + /// @par Complexity + /// Linear. + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation + /// failed due to invalid BSON bytes. + /// v1::element::view operator[](v1::stdx::string_view key) const; /// From 4b351fe330d16d83c54a32909347510b5146354a Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Wed, 9 Jul 2025 11:05:27 -0500 Subject: [PATCH 21/42] Consistently use noexcept for defaulted move SMFs --- src/bsoncxx/include/bsoncxx/v1/exception.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/exception.hpp b/src/bsoncxx/include/bsoncxx/v1/exception.hpp index 47a9f9b9d4..e999558dc1 100644 --- a/src/bsoncxx/include/bsoncxx/v1/exception.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/exception.hpp @@ -135,8 +135,8 @@ class exception : public std::system_error { public: ~exception() override; - exception(exception&&) = default; - exception& operator=(exception&&) = default; + exception(exception&&) noexcept = default; + exception& operator=(exception&&) noexcept = default; exception(exception const&) = default; exception& operator=(exception const&) = default; From b80e6a8f82e0e82dfc603c5a46da2080ebaacbc0 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Wed, 9 Jul 2025 11:05:53 -0500 Subject: [PATCH 22/42] Avoid false-positive -Wdocumentation Clang warnings --- src/bsoncxx/include/bsoncxx/v1/document/value.hpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp index 7786fb69f2..6d8eb412e4 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp @@ -168,10 +168,9 @@ class value { /// - `static_cast(this->get_deleter()) == false` /// - `this->size() == 0` /// - /// @note @parblock This constructor is explicit to support initialization as an empty BSON document via the @ref + /// @note This constructor is explicit to support initialization as an empty BSON document via the @ref /// bsoncxx::v1::document::value::value(bsoncxx::v1::document::view view) constructor using list-initialization /// syntax: - /// /// ```cpp /// bsoncxx::v1::document::value doc({}); /// @@ -181,7 +180,6 @@ class value { /// assert(v.empty()); // Empty. /// assert(v.data()); // Not null. /// ``` - /// @endparblock /// explicit value() = default; From 667c74017787f3ae16666c2daa00424a7418a471 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Wed, 9 Jul 2025 11:05:28 -0500 Subject: [PATCH 23/42] Change v1::types::id from uint8_t to int8_t --- src/bsoncxx/include/bsoncxx/v1/types/id-fwd.hpp | 6 +++--- src/bsoncxx/include/bsoncxx/v1/types/id.hpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/types/id-fwd.hpp b/src/bsoncxx/include/bsoncxx/v1/types/id-fwd.hpp index 32143780cc..2d89712655 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/id-fwd.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/id-fwd.hpp @@ -42,6 +42,7 @@ /// // clang-format off #define BSONCXX_V1_TYPES_XMACRO(X) \ + X(minkey, -0x01) \ X(double, 0x01) \ X(string, 0x02) \ X(document, 0x03) \ @@ -61,8 +62,7 @@ X(timestamp, 0x11) \ X(int64, 0x12) \ X(decimal128, 0x13) \ - X(maxkey, 0x7F) \ - X(minkey, 0xFF) + X(maxkey, 0x7F) // clang-format on /// @@ -106,7 +106,7 @@ namespace bsoncxx { namespace v1 { namespace types { -enum class id : std::uint8_t; +enum class id : std::int8_t; enum class binary_subtype : std::uint8_t; } // namespace types diff --git a/src/bsoncxx/include/bsoncxx/v1/types/id.hpp b/src/bsoncxx/include/bsoncxx/v1/types/id.hpp index 1e22b9dc2b..8e297dfd04 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/id.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/id.hpp @@ -35,7 +35,8 @@ namespace types { /// /// @showenumvalues /// -enum class id : std::uint8_t { +enum class id : std::int8_t { + k_minkey = -0x01, ///< Min key. k_double = 0x01, ///< 64-bit binary floating point. k_string = 0x02, ///< UTF-8 string. k_document = 0x03, ///< Embedded document. @@ -56,7 +57,6 @@ enum class id : std::uint8_t { k_int64 = 0x12, ///< 64-bit integer. k_decimal128 = 0x13, ///< 128-bit decimal floating point. k_maxkey = 0x7F, ///< Max key. - k_minkey = 0xFF, ///< Min key. }; /// From 12b54353b971fc16f4de63898caeb683e07c84a1 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Wed, 9 Jul 2025 11:05:28 -0500 Subject: [PATCH 24/42] Add bsoncxx/v1/detail/bit.hpp --- src/bsoncxx/include/bsoncxx/v1/detail/bit.hpp | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/bsoncxx/include/bsoncxx/v1/detail/bit.hpp diff --git a/src/bsoncxx/include/bsoncxx/v1/detail/bit.hpp b/src/bsoncxx/include/bsoncxx/v1/detail/bit.hpp new file mode 100644 index 0000000000..e33738ea06 --- /dev/null +++ b/src/bsoncxx/include/bsoncxx/v1/detail/bit.hpp @@ -0,0 +1,78 @@ +// Copyright 2009-present MongoDB, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include + +#include + +#if defined(__has_include) +#if __has_include() +// Prioritize using std::endian from C++20. +#include +#endif // __has_include() +#elif defined(_WIN32) +// Forward-compatibility with STL: https://github.com/microsoft/STL/blob/vs-2019-16.5/stl/inc/bit#L26 +#elif defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) +// Predefined compiler macros: https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html +#elif defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200809L +// Fallback to POSIX Issue 8: https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/endian.h.html +#include +#elif defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE) +// Fallback to OpenBSD/FreeBSD/etc.: https://www.man7.org/linux/man-pages/man3/endian.3.html +// _BSD_SOURCE for compatibility with glibc 2.19 and older. +#include +#endif + +namespace bsoncxx { +namespace detail { + +// Equivalent to `std::endian` in C++20. +enum class endian { +#if defined(__cpp_lib_endian) && __cpp_lib_endian >= 201907L + little = static_cast(std::endian::little), + big = static_cast(std::endian::big), + native = static_cast(std::endian::native) +#elif defined(_WIN32) + // STL: https://github.com/microsoft/STL/blob/vs-2019-16.5/stl/inc/bit#L26 + little = 0, + big = 1, + native = little, +#elif defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) && defined(__BYTE_ORDER__) + // Predefined compiler macros for GCC and Clang. + little = __ORDER_LITTLE_ENDIAN__, + big = __ORDER_BIG_ENDIAN__, + native = __BYTE_ORDER__, +#elif defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN) && defined(BYTE_ORDER) + // Fallback to POSIX and OpenBSD/FreeBSD/etc. + little = LITTLE_ENDIAN, + big = BIG_ENDIAN, + native = BYTE_ORDER, +#else +#error "Could not determine the byte order for the target compiler architecture" +#endif +}; + +} // namespace detail +} // namespace bsoncxx + +#include + +/// +/// @file +/// For internal use only! +/// +/// @warning For internal use only! +/// From 3dbcc858edf4751b0e7f892e3e1336d8cbce94a3 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Wed, 9 Jul 2025 11:05:29 -0500 Subject: [PATCH 25/42] Use BSON bytes to store and represent document length --- .../include/bsoncxx/v1/array/value.hpp | 23 ++++---- src/bsoncxx/include/bsoncxx/v1/array/view.hpp | 4 +- .../include/bsoncxx/v1/document/value.hpp | 38 ++++++------- .../include/bsoncxx/v1/document/view.hpp | 55 +++++++++++++++---- 4 files changed, 71 insertions(+), 49 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/array/value.hpp b/src/bsoncxx/include/bsoncxx/v1/array/value.hpp index 78f75dd8d6..5c3c2287c0 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/value.hpp @@ -42,7 +42,7 @@ class value { v1::document::value _value; template - struct is_valid_deleter : std::is_constructible {}; + struct is_valid_deleter : std::is_constructible {}; public: /// @copydoc v1::document::value::deleter_type @@ -64,13 +64,10 @@ class value { ~value() = default; /// @copydoc v1::document::value::value(v1::document::value&& other) noexcept - value(value&& other) noexcept : _value{std::move(other._value)} {} + value(value&& other) noexcept = default; /// @copydoc v1::document::value::operator=(v1::document::value&& other) noexcept - value& operator=(value&& other) noexcept { - _value = std::move(other._value); - return *this; - } + value& operator=(value&& other) noexcept = default; /// @copydoc v1::document::value::value(v1::document::value const& other) value(value const& other) : _value(other._value) {} @@ -84,15 +81,15 @@ class value { /// @copydoc v1::document::value::value() value() = default; - /// @copydoc v1::document::value::value(std::uint8_t* data, std::size_t length, Deleter deleter) + /// @copydoc v1::document::value::value(std::uint8_t* data, Deleter deleter) template ::value>* = nullptr> - value(std::uint8_t* data, std::size_t length, Deleter deleter) : _value{data, length, std::move(deleter)} {} + value(std::uint8_t* data, Deleter deleter) : _value{data, std::move(deleter)} {} - /// @copydoc v1::document::value::value(std::uint8_t* data, std::size_t length) - value(std::uint8_t* data, std::size_t length) : _value{data, length} {} + /// @copydoc v1::document::value::value(std::uint8_t* data) + explicit value(std::uint8_t* data) : _value{data} {} - /// @copydoc v1::document::value::value(v1::document::value::unique_ptr_type ptr, std::size_t length) - value(unique_ptr_type ptr, std::size_t length) : _value{std::move(ptr), length} {} + /// @copydoc v1::document::value::value(v1::document::value::unique_ptr_type ptr) + explicit value(unique_ptr_type ptr) : _value{std::move(ptr)} {} /// @copydoc v1::document::value::value(v1::document::view view) explicit value(v1::array::view view) : _value{view} {} @@ -121,7 +118,7 @@ class value { /// Return a view of the BSON bytes as an array. /// v1::array::view view() const { - return {_value.data(), _value.size()}; + return v1::array::view{_value.data()}; } /// diff --git a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp index 08fca3db8e..723bbc9cec 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp @@ -61,8 +61,8 @@ class view { /// @copydoc v1::document::view::view() view() = default; - /// @copydoc v1::document::view::view(std::uint8_t const* data, std::size_t length) - view(std::uint8_t const* data, std::size_t length) : _view{data, length} {} + /// @copydoc v1::document::view::view(std::uint8_t const* data) + explicit view(std::uint8_t const* data) : _view{data} {} /// @copydoc v1::document::view::data() const std::uint8_t const* data() const { diff --git a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp index 6d8eb412e4..6b850eec31 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp @@ -73,7 +73,6 @@ class value { private: unique_ptr_type _data; - std::size_t _length = 0u; template using is_value = detail::is_alike; @@ -122,9 +121,7 @@ class value { /// @par Postconditions: /// - `other` is equivalent to a default-initialized value. /// - value(value&& other) noexcept : _data{std::move(other._data)}, _length{other._length} { - other._length = 0u; - } + value(value&& other) noexcept = default; /// /// Move assignment. @@ -132,14 +129,7 @@ class value { /// @par Postconditions: /// - `other` is equivalent to a default-initialized value. /// - value& operator=(value&& other) noexcept { - _data = std::move(other._data); - - _length = other._length; - other._length = 0u; - - return *this; - } + value& operator=(value&& other) noexcept = default; /// /// Copy construction. @@ -190,28 +180,34 @@ class value { /// - `Deleter` must satisfy the requirements described by @ref deleter_type. /// /// @par Preconditions: - /// - `length` must be less than or equal to the size of the storage region pointed to by `data`. + /// - If `data` is not null, the size of the storage region pointed to by `data` must be greater than or equal to 5. + /// - The "total number of bytes comprising the document" as indicated by the BSON bytes pointed-to by `data` must + /// be less than or equal to the size of the storage region pointed to by `data`. /// - `deleter` must be capable of freeing the storage region pointed to by `data`. /// template ::value>* = nullptr> - value(std::uint8_t* data, std::size_t length, Deleter deleter) : _data{data, std::move(deleter)}, _length{length} {} + value(std::uint8_t* data, Deleter deleter) : _data{data, std::move(deleter)} {} /// /// Initialize as owning `data` which will be freed with @ref default_deleter_type. /// /// @par Preconditions: - /// - `length` must be less than or equal to the size of the storage region pointed to by `data`. + /// - If `data` is not null, the size of the storage region pointed to by `data` must be greater than or equal to 5. + /// - The "total number of bytes comprising the document" as indicated by the BSON bytes pointed-to by `data` must + /// be less than or equal to the size of the storage region pointed to by `data`. /// - `deleter` must be capable of freeing the storage region pointed to by `data`. /// - value(std::uint8_t* data, std::size_t length) : value{data, length, default_deleter_type{}} {} + explicit value(std::uint8_t* data) : value{data, default_deleter_type{}} {} /// /// Initialize as owning `ptr`. /// /// @par Preconditions: - /// - `length` must be less than or equal to the size of the storage region pointed to by `data`. + /// - If `data` is not null, the size of the storage region pointed to by `data` must be greater than or equal to 5. + /// - The "total number of bytes comprising the document" as indicated by the BSON bytes pointed-to by `data` must + /// be less than or equal to the size of the storage region pointed to by `data`. /// - value(unique_ptr_type ptr, std::size_t length) : _data{std::move(ptr)}, _length{length} {} + explicit value(unique_ptr_type ptr) : _data{std::move(ptr)} {} /// /// Initialize with a copy of the BSON bytes referenced by `view`. @@ -222,8 +218,7 @@ class value { /// default_deleter_type. /// explicit value(v1::document::view view) - : _data{view ? unique_ptr_type{new std::uint8_t[view.size()], default_deleter_type{}} : unique_ptr_type{}}, - _length{view ? view.size() : 0u} { + : _data{view ? unique_ptr_type{new std::uint8_t[view.size()], default_deleter_type{}} : unique_ptr_type{}} { if (view) { std::memcpy(_data.get(), view.data(), view.size()); } @@ -294,7 +289,6 @@ class value { /// Release ownership of the underlying BSON bytes. /// unique_ptr_type release() { - _length = 0u; return std::move(_data); } @@ -321,7 +315,7 @@ class value { /// Return a view of the BSON bytes as a document. /// v1::document::view view() const { - return {_data.get(), _length}; + return v1::document::view{_data.get()}; } /// diff --git a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp index 3c379b4789..1e0082b8f3 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -125,7 +126,9 @@ class view { enum : std::size_t { _empty_length = 5u }; std::uint8_t const* _data; - std::size_t _length; + + template + std::int32_t raw_size() const; public: /// @@ -142,9 +145,11 @@ class view { /// Initialize with the given BSON bytes. /// /// @par Preconditions: - /// - `length` must be less than or equal to the size of the storage region pointed to by `data`. + /// - If `data` is not null, the size of the storage region pointed to by `data` must be greater than or equal to 5. + /// - The "total number of bytes comprising the document" as indicated by the BSON bytes pointed-to by `data` must + /// be less than or equal to the size of the storage region pointed to by `data`. /// - view(std::uint8_t const* data, std::size_t length) : _data(data), _length(length) {} + view(std::uint8_t const* data) : _data(data) {} /// /// Return a pointer to the BSON bytes being represented. @@ -156,25 +161,29 @@ class view { /// /// Return the length of the BSON bytes being represented. /// - /// @note This returns the length as specified during initialization, not the length of the BSON bytes as - /// indicated by the BSON bytes itself. + /// If `this->data()` is null, returns `0`. /// - std::size_t size() const { - return _length; - } + /// @note This returns the length as indicated by the pointed to BSON bytes. The result is always within the range + /// [0, INT32_MAX] when preconditions are satisfied. + /// + std::size_t size() const; /// @copydoc size() const std::size_t length() const { - return _length; + return this->size(); } /// - /// Return true when the BSON bytes represents an empty view. + /// Return true when the BSON bytes represents an empty view: + /// + /// - @ref data() is not null, + /// - @ref size() is equal to 5, and + /// - the pointed-to BSON bytes are terminated with a null byte. /// /// @note This does not return true when this view is invalid. /// bool empty() const { - return this->operator bool() && _data[4] == 0u; + return this->size() == _empty_length && _data[4] == 0u; } /// @@ -183,7 +192,7 @@ class view { /// @note This does not validate the BSON bytes being represented. /// explicit operator bool() const { - return _data && _length >= _empty_length; + return this->size() >= _empty_length; } /// @@ -255,6 +264,28 @@ class view { /// }; +template <> +inline std::int32_t view::raw_size() const { + std::int32_t res; + std::memcpy(&res, _data, sizeof(res)); + return res; +} + +template <> +inline std::int32_t view::raw_size() const { + std::int32_t res; + auto const bytes = reinterpret_cast(&res); + bytes[0] = _data[3]; + bytes[1] = _data[2]; + bytes[2] = _data[1]; + bytes[3] = _data[0]; + return res; +} + +inline std::size_t view::size() const { + return _data ? static_cast(this->raw_size()) : 0u; +} + /// /// A const iterator over the elements of a view. /// From f7966e6dc17d268eaf1f6d4a2ba2ad8aa039847f Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Wed, 9 Jul 2025 11:05:29 -0500 Subject: [PATCH 26/42] Make v1::document::value default-initialize as an empty document --- .../include/bsoncxx/v1/document/value.hpp | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp index 6b850eec31..6cd012e74d 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp @@ -66,6 +66,11 @@ class value { /// using default_deleter_type = std::default_delete; + /// + /// The deleter used to avoid freeing preallocated storage representing an empty BSON document. + /// + static BSONCXX_ABI_EXPORT_CDECL(void) noop_deleter(std::uint8_t*); + /// /// The type of the unique pointer used to manage the underlying BSON bytes. /// @@ -151,12 +156,12 @@ class value { } /// - /// Initialize without any underlying BSON bytes or deleter. + /// Initialize as an empty document (or array). /// - /// @par Postconditions: - /// - `this->data() == nullptr` - /// - `static_cast(this->get_deleter()) == false` - /// - `this->size() == 0` + /// The value is equivalent to a default-initialized @ref bsoncxx::v1::document::view and the deleter is set to @ref + /// bsoncxx::v1::document::value::noop_deleter. + /// + /// @warning Modifying the pointed-to data after default construction is undefined behavior. /// /// @note This constructor is explicit to support initialization as an empty BSON document via the @ref /// bsoncxx::v1::document::value::value(bsoncxx::v1::document::view view) constructor using list-initialization @@ -171,7 +176,7 @@ class value { /// assert(v.data()); // Not null. /// ``` /// - explicit value() = default; + explicit value() : _data{const_cast(v1::document::view{}.data()), &noop_deleter} {} /// /// Initialize as owning `data` which will be freed with `deleter`. @@ -212,15 +217,20 @@ class value { /// /// Initialize with a copy of the BSON bytes referenced by `view`. /// - /// If `view` is invalid, this value is default-initialized. + /// If `view` is invalid or equivalent to a default-initialized @ref bsoncxx::v1::document::view, this value is + /// default-initialized. /// /// The copied value is allocated using `operator new[]` and the deleter is set to @ref /// default_deleter_type. /// - explicit value(v1::document::view view) - : _data{view ? unique_ptr_type{new std::uint8_t[view.size()], default_deleter_type{}} : unique_ptr_type{}} { - if (view) { + explicit value(v1::document::view view) { + v1::document::view const empty; + + if (view && view.data() != empty.data()) { + _data = unique_ptr_type{new std::uint8_t[view.size()], default_deleter_type{}}; std::memcpy(_data.get(), view.data(), view.size()); + } else { + _data = unique_ptr_type{const_cast(empty.data()), &noop_deleter}; } } From 167f7bcd4abaf129ba0b0078ac010d8f8d65851b Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Wed, 9 Jul 2025 11:05:29 -0500 Subject: [PATCH 27/42] Revert explicit default constructors for list-initialization --- src/bsoncxx/include/bsoncxx/v1/document/value.hpp | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp index 6cd012e74d..411cdbfa97 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp @@ -163,20 +163,7 @@ class value { /// /// @warning Modifying the pointed-to data after default construction is undefined behavior. /// - /// @note This constructor is explicit to support initialization as an empty BSON document via the @ref - /// bsoncxx::v1::document::value::value(bsoncxx::v1::document::view view) constructor using list-initialization - /// syntax: - /// ```cpp - /// bsoncxx::v1::document::value doc({}); - /// - /// auto v = doc.view(); - /// - /// assert(v); // Valid. - /// assert(v.empty()); // Empty. - /// assert(v.data()); // Not null. - /// ``` - /// - explicit value() : _data{const_cast(v1::document::view{}.data()), &noop_deleter} {} + value() : _data{const_cast(v1::document::view{}.data()), &noop_deleter} {} /// /// Initialize as owning `data` which will be freed with `deleter`. From 8e93526eab91949bfa8404c598ebe2c7ebe0dfde Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Thu, 3 Jul 2025 14:34:46 -0500 Subject: [PATCH 28/42] Revert v1::oid::size to static member function (again) --- src/bsoncxx/include/bsoncxx/v1/oid.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/oid.hpp b/src/bsoncxx/include/bsoncxx/v1/oid.hpp index 79ab8b4c3c..bf2bd6d26e 100644 --- a/src/bsoncxx/include/bsoncxx/v1/oid.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/oid.hpp @@ -144,7 +144,7 @@ class oid { /// /// Return @ref k_oid_length. /// - std::size_t size() const { + static std::size_t size() { return k_oid_length; } From ba187b538e2b27269cc316f72dfd2869b9140d94 Mon Sep 17 00:00:00 2001 From: Ezra Chung <88335979+eramongodb@users.noreply.github.com> Date: Thu, 10 Jul 2025 11:37:30 -0500 Subject: [PATCH 29/42] Update Clang 18 -> Clang 19 for rhel95 distro (#1421) --- .../components/abi_stability.py | 2 +- .../components/compile_only.py | 20 +++++++++---------- .evergreen/scripts/abi-stability-setup.sh | 6 +++--- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.evergreen/config_generator/components/abi_stability.py b/.evergreen/config_generator/components/abi_stability.py index b3949e2a25..571fa32725 100644 --- a/.evergreen/config_generator/components/abi_stability.py +++ b/.evergreen/config_generator/components/abi_stability.py @@ -147,7 +147,7 @@ def generate_tasks(): if func is Abidiff: distro_name = 'ubuntu2204' # Clang 12, libabigail is not available on RHEL distros. else: - distro_name = 'rhel95' # Clang 18. + distro_name = 'rhel95' # Clang 19. distro = find_large_distro(distro_name) diff --git a/.evergreen/config_generator/components/compile_only.py b/.evergreen/config_generator/components/compile_only.py index d5fb9fba37..e2addd03d4 100644 --- a/.evergreen/config_generator/components/compile_only.py +++ b/.evergreen/config_generator/components/compile_only.py @@ -18,16 +18,16 @@ MATRIX = [ # C++ standard and compiler coverage - ('rhel80', 'clang', [11, 17, 20, ]), # Clang 7.0 (max: C++20) - ('ubuntu2004', 'clang-10', [11, 17, 20, ]), # Clang 10.0 (max: C++20) - ('rhel84', 'clang', [11, 17, 20, ]), # Clang 11.0 (max: C++20) - ('ubuntu2204', 'clang-12', [11, 17, 20, 23]), # Clang 12.0 (max: C++23) - ('rhel90', 'clang', [11, 17, 20, 23]), # Clang 13.0 (max: C++23) - ('rhel91', 'clang', [11, 17, 20, 23]), # Clang 14.0 (max: C++23) - ('rhel92', 'clang', [11, 17, 20, 23]), # Clang 15.0 (max: C++23) - ('rhel93', 'clang', [11, 17, 20, 23]), # Clang 16.0 (max: C++23) - ('rhel94', 'clang', [11, 17, 20, 23]), # Clang 17.0 (max: C++23) - ('rhel95', 'clang', [11, 17, 20, 23]), # Clang 18.0 (max: C++23) + ('rhel80', 'clang', [11, 17, 20, ]), # Clang 7 (max: C++20) + ('ubuntu2004', 'clang-10', [11, 17, 20, ]), # Clang 10 (max: C++20) + ('rhel84', 'clang', [11, 17, 20, ]), # Clang 11 (max: C++20) + ('ubuntu2204', 'clang-12', [11, 17, 20, 23]), # Clang 12 (max: C++23) + ('rhel90', 'clang', [11, 17, 20, 23]), # Clang 13 (max: C++23) + ('rhel91', 'clang', [11, 17, 20, 23]), # Clang 14 (max: C++23) + ('rhel92', 'clang', [11, 17, 20, 23]), # Clang 15 (max: C++23) + ('rhel93', 'clang', [11, 17, 20, 23]), # Clang 16 (max: C++23) + ('rhel94', 'clang', [11, 17, 20, 23]), # Clang 17 (max: C++23) + ('rhel95', 'clang', [11, 17, 20, 23]), # Clang 19 (max: C++23) ('rhel7.9', 'gcc', [11, 14, ]), # GCC 4.8 (max: C++14) ('rhel80', 'gcc', [11, 17, 20, ]), # GCC 8.2 (max: C++20) diff --git a/.evergreen/scripts/abi-stability-setup.sh b/.evergreen/scripts/abi-stability-setup.sh index 199ccb6f3e..dc575f6591 100755 --- a/.evergreen/scripts/abi-stability-setup.sh +++ b/.evergreen/scripts/abi-stability-setup.sh @@ -67,9 +67,9 @@ mkdir -p "${working_dir}/install" # For latest Clang versions supporting recent C++ standards. export CC CXX case "${distro_id:?}" in -rhel9*) - CC="clang-18" - CXX="clang++-18" +rhel95*) + CC="clang-19" + CXX="clang++-19" ;; ubuntu22*) CC="clang-12" From 86e978c492c9ecf43645b7528ac649fac6e4d420 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Thu, 10 Jul 2025 11:37:30 -0500 Subject: [PATCH 30/42] Improve consistency of subscript documentation --- src/bsoncxx/include/bsoncxx/v1/array/view.hpp | 4 ++-- .../include/bsoncxx/v1/document/view.hpp | 2 +- .../include/bsoncxx/v1/element/view.hpp | 24 +++++++++++++++---- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp index 723bbc9cec..ab2970763a 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp @@ -121,9 +121,9 @@ class view { BSONCXX_ABI_EXPORT_CDECL(const_iterator) find(std::uint32_t i) const; /// - /// Return the first element within the represented BSON array at index `i` via key string comparison. + /// Return the first element within the represented BSON array whose key compares equal to `i`. /// - /// If this view is invalid or the requested field is not found, returns an invalid element. + /// @returns An invalid element if this view is invalid or the requested field is not found. /// /// @par Complexity /// Linear. diff --git a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp index 1e0082b8f3..f05a53a98b 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp @@ -232,7 +232,7 @@ class view { /// /// Return the first element within the represented BSON document whose key compares equal to `key`. /// - /// If this view is invalid or the requested field is not found, returns an invalid element. + /// @returns An invalid element if this view is invalid or the requested field is not found. /// /// @par Complexity /// Linear. diff --git a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp index b275207bf2..40c262ef5b 100644 --- a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp @@ -265,18 +265,32 @@ class view { BSONCXX_ABI_EXPORT_CDECL(v1::types::value) type_value() const; /// - /// Return an element representing the requested field. + /// Return the first element within the represented BSON document whose key compares equal to `key`. /// - /// @returns An invalid element if the requested field does not exist. + /// @returns An invalid element if this view is invalid, this element does not represent a BSON document, or the + /// requested field is not found. + /// + /// @par Complexity + /// Linear. /// /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_data if this operation /// failed due to invalid BSON bytes. /// - /// @{ BSONCXX_ABI_EXPORT_CDECL(v1::element::view) operator[](v1::stdx::string_view key) const; - BSONCXX_ABI_EXPORT_CDECL(v1::element::view) operator[](std::uint32_t idx) const; - /// @} + + /// + /// Return the first element within the represented BSON array whose key compares equal to `i`. /// + /// @returns An invalid element if this view is invalid, this element does not represent a BSON array, or the + /// requested field is not found. + /// + /// @par Complexity + /// Linear. + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_data if this operation + /// failed due to invalid BSON bytes. + /// + BSONCXX_ABI_EXPORT_CDECL(v1::element::view) operator[](std::uint32_t idx) const; class internal; From b9744b1dcd2605ebd138de182108df24219cc6a5 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Thu, 10 Jul 2025 11:37:31 -0500 Subject: [PATCH 31/42] Define v1::document::value::noop_deleter_type --- src/bsoncxx/include/bsoncxx/v1/document/value.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp index 411cdbfa97..f2e87efbcc 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp @@ -66,6 +66,11 @@ class value { /// using default_deleter_type = std::default_delete; + /// + /// The type of a pointer to @ref noop_deleter. + /// + using noop_deleter_type = void(BSONCXX_ABI_CDECL*)(std::uint8_t*); + /// /// The deleter used to avoid freeing preallocated storage representing an empty BSON document. /// From 88efd0c45f402dbc1c4f8c85a51e1e0323a3e561 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Fri, 11 Jul 2025 13:11:48 -0500 Subject: [PATCH 32/42] Add missing explicit --- src/bsoncxx/include/bsoncxx/v1/document/view.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp index f05a53a98b..8c1d945afc 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp @@ -149,7 +149,7 @@ class view { /// - The "total number of bytes comprising the document" as indicated by the BSON bytes pointed-to by `data` must /// be less than or equal to the size of the storage region pointed to by `data`. /// - view(std::uint8_t const* data) : _data(data) {} + explicit view(std::uint8_t const* data) : _data(data) {} /// /// Return a pointer to the BSON bytes being represented. From 9888b1f4eaeeba2c868ad87174a21ea3f4f7dcfb Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Fri, 11 Jul 2025 13:11:48 -0500 Subject: [PATCH 33/42] Remove all use of __cdecl in v1 --- src/bsoncxx/include/bsoncxx/v1/array/view.hpp | 4 +-- src/bsoncxx/include/bsoncxx/v1/decimal128.hpp | 6 ++-- .../include/bsoncxx/v1/document/value.hpp | 6 ++-- .../include/bsoncxx/v1/document/view.hpp | 12 +++---- .../include/bsoncxx/v1/element/view.hpp | 34 +++++++++---------- src/bsoncxx/include/bsoncxx/v1/exception.hpp | 4 +-- src/bsoncxx/include/bsoncxx/v1/oid.hpp | 14 ++++---- src/bsoncxx/include/bsoncxx/v1/types/id.hpp | 4 +-- .../include/bsoncxx/v1/types/value.hpp | 22 ++++++------ src/bsoncxx/include/bsoncxx/v1/types/view.hpp | 4 +-- 10 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp index ab2970763a..ea4389f579 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp @@ -90,7 +90,7 @@ class view { } /// @copydoc v1::document::view::cbegin() const - BSONCXX_ABI_EXPORT_CDECL(const_iterator) cbegin() const; + BSONCXX_ABI_EXPORT const_iterator cbegin() const; /// @copydoc v1::document::view::cend() const const_iterator cend() const { @@ -118,7 +118,7 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation /// failed due to invalid BSON bytes. /// - BSONCXX_ABI_EXPORT_CDECL(const_iterator) find(std::uint32_t i) const; + BSONCXX_ABI_EXPORT const_iterator find(std::uint32_t i) const; /// /// Return the first element within the represented BSON array whose key compares equal to `i`. diff --git a/src/bsoncxx/include/bsoncxx/v1/decimal128.hpp b/src/bsoncxx/include/bsoncxx/v1/decimal128.hpp index 842e8987af..69de435c2c 100644 --- a/src/bsoncxx/include/bsoncxx/v1/decimal128.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/decimal128.hpp @@ -36,7 +36,7 @@ namespace category { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) decimal128(); +BSONCXX_ABI_EXPORT std::error_category const& decimal128(); } // namespace category } // namespace error @@ -114,12 +114,12 @@ class decimal128 { /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::decimal128::invalid_string_data if `str` is not a /// valid Decimal128 string representation. /// - explicit BSONCXX_ABI_EXPORT_CDECL() decimal128(v1::stdx::string_view str); + explicit BSONCXX_ABI_EXPORT decimal128(v1::stdx::string_view str); /// /// Return the string representation. /// - BSONCXX_ABI_EXPORT_CDECL(std::string) to_string() const; + BSONCXX_ABI_EXPORT std::string to_string() const; /// /// Return the high-order bytes. diff --git a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp index f2e87efbcc..f722889158 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp @@ -59,7 +59,7 @@ class value { /// `std::move_only_function`. That is, it is assumed to be nothrow destructible, nothrow move constructible, and /// nothrow move assignable. /// - using deleter_type = std::function; + using deleter_type = std::function; /// /// The deleter used to free copied BSON bytes when a user-provided deleter is not specified. @@ -69,12 +69,12 @@ class value { /// /// The type of a pointer to @ref noop_deleter. /// - using noop_deleter_type = void(BSONCXX_ABI_CDECL*)(std::uint8_t*); + using noop_deleter_type = void (*)(std::uint8_t*); /// /// The deleter used to avoid freeing preallocated storage representing an empty BSON document. /// - static BSONCXX_ABI_EXPORT_CDECL(void) noop_deleter(std::uint8_t*); + static BSONCXX_ABI_EXPORT void noop_deleter(std::uint8_t*); /// /// The type of the unique pointer used to manage the underlying BSON bytes. diff --git a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp index 8c1d945afc..e599105201 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp @@ -46,7 +46,7 @@ namespace document { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) view(); +BSONCXX_ABI_EXPORT std::error_category const& view(); } // namespace document } // namespace category @@ -139,7 +139,7 @@ class view { /// - `this->size() == 5` /// - `this->empty() == true` /// - BSONCXX_ABI_EXPORT_CDECL() view(); + BSONCXX_ABI_EXPORT view(); /// /// Initialize with the given BSON bytes. @@ -203,7 +203,7 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation /// failed due to invalid BSON bytes. /// - BSONCXX_ABI_EXPORT_CDECL(const_iterator) cbegin() const; + BSONCXX_ABI_EXPORT const_iterator cbegin() const; /// /// Return a const iterator to the end of the range of BSON elements within this view. @@ -227,7 +227,7 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation /// failed due to invalid BSON bytes. /// - BSONCXX_ABI_EXPORT_CDECL(const_iterator) find(v1::stdx::string_view key) const; + BSONCXX_ABI_EXPORT const_iterator find(v1::stdx::string_view key) const; /// /// Return the first element within the represented BSON document whose key compares equal to `key`. @@ -353,7 +353,7 @@ class view::const_iterator { /// /// If this is an end iterator, it remains an end iterator. /// - BSONCXX_ABI_EXPORT_CDECL(const_iterator&) operator++(); + BSONCXX_ABI_EXPORT const_iterator& operator++(); /// /// Post-increment this iterator. @@ -391,7 +391,7 @@ class view::const_iterator { class internal; private: - explicit BSONCXX_ABI_EXPORT_CDECL() const_iterator(v1::element::view element); + explicit BSONCXX_ABI_EXPORT const_iterator(v1::element::view element); }; inline view::const_iterator view::cend() const { diff --git a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp index 40c262ef5b..d75a119aa0 100644 --- a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp @@ -50,7 +50,7 @@ namespace element { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) view(); +BSONCXX_ABI_EXPORT std::error_category const& view(); } // namespace element } // namespace category @@ -156,7 +156,7 @@ class view { /// /// Destroy this object. /// - BSONCXX_ABI_EXPORT_CDECL() ~view(); + BSONCXX_ABI_EXPORT ~view(); // Handled by the nothrow copy constructor. // view(view&& other) noexcept; @@ -167,52 +167,52 @@ class view { /// /// Copy (or move) construction. /// - BSONCXX_ABI_EXPORT_CDECL() view(view const& other) noexcept; + BSONCXX_ABI_EXPORT view(view const& other) noexcept; /// /// Copy (or move) assignment. /// - BSONCXX_ABI_EXPORT_CDECL(view&) operator=(view const& other) noexcept; + BSONCXX_ABI_EXPORT view& operator=(view const& other) noexcept; /// /// Initialize as an invalid element without any associated BSON bytes. /// - BSONCXX_ABI_EXPORT_CDECL() view(); + BSONCXX_ABI_EXPORT view(); /// /// Return true when this is a valid element. /// /// @note This does not validate the BSON bytes being represented. /// - explicit BSONCXX_ABI_EXPORT_CDECL() operator bool() const; + explicit BSONCXX_ABI_EXPORT operator bool() const; /// /// Return the "raw" component of the underlying BSON bytes. /// /// The value is unspecified when this element is invalid. /// - BSONCXX_ABI_EXPORT_CDECL(std::uint8_t const*) raw() const; + BSONCXX_ABI_EXPORT std::uint8_t const* raw() const; /// /// Return the "length" component of the underlying BSON bytes. /// /// The value is unspecified when this element is invalid. /// - BSONCXX_ABI_EXPORT_CDECL(std::uint32_t) length() const; + BSONCXX_ABI_EXPORT std::uint32_t length() const; /// /// Return the "offset" component of the underlying BSON bytes. /// /// The value is unspecified when this element is invalid. /// - BSONCXX_ABI_EXPORT_CDECL(std::uint32_t) offset() const; + BSONCXX_ABI_EXPORT std::uint32_t offset() const; /// /// Return the "keylen" component of the underlying BSON bytes. /// /// The value is unspecified when this element is invalid. /// - BSONCXX_ABI_EXPORT_CDECL(std::uint32_t) keylen() const; + BSONCXX_ABI_EXPORT std::uint32_t keylen() const; /// /// Return the type. @@ -220,7 +220,7 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is /// invalid. /// - BSONCXX_ABI_EXPORT_CDECL(v1::types::id) type_id() const; + BSONCXX_ABI_EXPORT v1::types::id type_id() const; /// /// Return the key. @@ -228,11 +228,11 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is /// invalid. /// - BSONCXX_ABI_EXPORT_CDECL(v1::stdx::string_view) key() const; + BSONCXX_ABI_EXPORT v1::stdx::string_view key() const; #pragma push_macro("X") #undef X -#define X(_name, _value) BSONCXX_ABI_EXPORT_CDECL(v1::types::b_##_name) get_##_name() const; +#define X(_name, _value) BSONCXX_ABI_EXPORT v1::types::b_##_name get_##_name() const; /// /// Return the underlying BSON type value. @@ -254,7 +254,7 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is /// invalid. /// - BSONCXX_ABI_EXPORT_CDECL(v1::types::view) type_view() const; + BSONCXX_ABI_EXPORT v1::types::view type_view() const; /// /// Return a deep copy of the underlying BSON type value. @@ -262,7 +262,7 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is /// invalid. /// - BSONCXX_ABI_EXPORT_CDECL(v1::types::value) type_value() const; + BSONCXX_ABI_EXPORT v1::types::value type_value() const; /// /// Return the first element within the represented BSON document whose key compares equal to `key`. @@ -276,7 +276,7 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_data if this operation /// failed due to invalid BSON bytes. /// - BSONCXX_ABI_EXPORT_CDECL(v1::element::view) operator[](v1::stdx::string_view key) const; + BSONCXX_ABI_EXPORT v1::element::view operator[](v1::stdx::string_view key) const; /// /// Return the first element within the represented BSON array whose key compares equal to `i`. @@ -290,7 +290,7 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_data if this operation /// failed due to invalid BSON bytes. /// - BSONCXX_ABI_EXPORT_CDECL(v1::element::view) operator[](std::uint32_t idx) const; + BSONCXX_ABI_EXPORT v1::element::view operator[](std::uint32_t idx) const; class internal; diff --git a/src/bsoncxx/include/bsoncxx/v1/exception.hpp b/src/bsoncxx/include/bsoncxx/v1/exception.hpp index e999558dc1..015aaeecfa 100644 --- a/src/bsoncxx/include/bsoncxx/v1/exception.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/exception.hpp @@ -40,14 +40,14 @@ namespace category { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) source(); +BSONCXX_ABI_EXPORT std::error_category const& source(); /// /// The error category for @ref bsoncxx::v1::error::type. /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) type(); +BSONCXX_ABI_EXPORT std::error_category const& type(); } // namespace category } // namespace error diff --git a/src/bsoncxx/include/bsoncxx/v1/oid.hpp b/src/bsoncxx/include/bsoncxx/v1/oid.hpp index bf2bd6d26e..537fb30fe4 100644 --- a/src/bsoncxx/include/bsoncxx/v1/oid.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/oid.hpp @@ -41,7 +41,7 @@ namespace category { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) oid(); +BSONCXX_ABI_EXPORT std::error_category const& oid(); } // namespace category } // namespace error @@ -117,7 +117,7 @@ class oid { /// on failure to initialize the Winsock library with /// [`WSAStartup()`](https://learn.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-wsastartup). /// - BSONCXX_ABI_EXPORT_CDECL() oid(); + BSONCXX_ABI_EXPORT oid(); /// /// Initialize with the given ObjectID byte representation. @@ -129,7 +129,7 @@ class oid { /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::oid::invalid_length if `len` is not equal to @ref /// k_oid_length. /// - BSONCXX_ABI_EXPORT_CDECL() oid(std::uint8_t const* bytes, std::size_t len); + BSONCXX_ABI_EXPORT oid(std::uint8_t const* bytes, std::size_t len); /// /// Initialize with the given ObjectID hexadecimal string representation. @@ -139,7 +139,7 @@ class oid { /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::oid::empty_string if `str` is empty. /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::oid::invalid_string if `str` is invalid. /// - explicit BSONCXX_ABI_EXPORT_CDECL() oid(v1::stdx::string_view str); + explicit BSONCXX_ABI_EXPORT oid(v1::stdx::string_view str); /// /// Return @ref k_oid_length. @@ -158,17 +158,17 @@ class oid { /// /// Return the hexadecimal representation. /// - BSONCXX_ABI_EXPORT_CDECL(std::string) to_string() const; + BSONCXX_ABI_EXPORT std::string to_string() const; /// /// Return the timestamp component. /// - BSONCXX_ABI_EXPORT_CDECL(std::time_t) get_time_t() const; + BSONCXX_ABI_EXPORT std::time_t get_time_t() const; /// /// Equivalent to [`bson_oid_compare`](https://mongoc.org/libbson/current/bson_oid_compare.html). /// - BSONCXX_ABI_EXPORT_CDECL(int) compare(oid const& other) const; + BSONCXX_ABI_EXPORT int compare(oid const& other) const; /// /// Equivalent to `lhs.compare(rhs) == 0`. diff --git a/src/bsoncxx/include/bsoncxx/v1/types/id.hpp b/src/bsoncxx/include/bsoncxx/v1/types/id.hpp index 8e297dfd04..e1738ee862 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/id.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/id.hpp @@ -64,7 +64,7 @@ enum class id : std::int8_t { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT_CDECL(std::string) to_string(id rhs); +BSONCXX_ABI_EXPORT std::string to_string(id rhs); /// /// Enumeration identifying a BSON binary subtype. @@ -92,7 +92,7 @@ enum class binary_subtype : std::uint8_t { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT_CDECL(std::string) to_string(binary_subtype rhs); +BSONCXX_ABI_EXPORT std::string to_string(binary_subtype rhs); } // namespace types } // namespace v1 diff --git a/src/bsoncxx/include/bsoncxx/v1/types/value.hpp b/src/bsoncxx/include/bsoncxx/v1/types/value.hpp index 9de4eb3a94..4709ded40e 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/value.hpp @@ -54,7 +54,7 @@ namespace types { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) value(); +BSONCXX_ABI_EXPORT std::error_category const& value(); } // namespace types } // namespace category @@ -124,7 +124,7 @@ class value { /// /// Destroy this object. /// - BSONCXX_ABI_EXPORT_CDECL() ~value(); + BSONCXX_ABI_EXPORT ~value(); /// /// Move construction. @@ -132,7 +132,7 @@ class value { /// @par Postconditions: /// - `other` is equivalent to a default-initialized value. /// - BSONCXX_ABI_EXPORT_CDECL() value(value&& other) noexcept; + BSONCXX_ABI_EXPORT value(value&& other) noexcept; /// /// Move assignment. @@ -140,7 +140,7 @@ class value { /// @par Postconditions: /// - `other` is equivalent to a default-initialized value. /// - BSONCXX_ABI_EXPORT_CDECL(value&) operator=(value&& other) noexcept; + BSONCXX_ABI_EXPORT value& operator=(value&& other) noexcept; /// /// Copy construction. @@ -148,7 +148,7 @@ class value { /// The copied BSON type value is allocated (when necessary) using /// [`bson_value_copy`](https://mongoc.org/libbson/current/bson_value_copy.html). /// - BSONCXX_ABI_EXPORT_CDECL() value(value const& other); + BSONCXX_ABI_EXPORT value(value const& other); /// /// Copy assignment. @@ -156,7 +156,7 @@ class value { /// The copied value is allocated (when necessary) using /// [`bson_value_copy`](https://mongoc.org/libbson/current/bson_value_copy.html). /// - BSONCXX_ABI_EXPORT_CDECL(value&) operator=(value const& other); + BSONCXX_ABI_EXPORT value& operator=(value const& other); /// /// Initialize with @ref bsoncxx::v1::types::b_null. @@ -174,11 +174,11 @@ class value { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::types::value::invalid_length_u32 if the length /// of any underlying BSON type value component is not representable as an `std::uint32_t`. /// - explicit BSONCXX_ABI_EXPORT_CDECL() value(v1::types::view const& v); + explicit BSONCXX_ABI_EXPORT value(v1::types::view const& v); #pragma push_macro("X") #undef X -#define X(_name, _value) explicit BSONCXX_ABI_EXPORT_CDECL() value(v1::types::b_##_name v); +#define X(_name, _value) explicit BSONCXX_ABI_EXPORT value(v1::types::b_##_name v); /// /// Convert `v` as a deep copy. @@ -301,18 +301,18 @@ class value { /// /// Initialize as a @ref bsoncxx::v1::types::b_binary with `subtype`. /// - explicit BSONCXX_ABI_EXPORT_CDECL() + explicit BSONCXX_ABI_EXPORT value(std::uint8_t const* data, std::size_t size, v1::types::binary_subtype const sub_type); /// /// Return the type of the underlying BSON type value. /// - BSONCXX_ABI_EXPORT_CDECL(v1::types::id) type_id() const; + BSONCXX_ABI_EXPORT v1::types::id type_id() const; /// /// Return a view of the underlying BSON type value. /// - BSONCXX_ABI_EXPORT_CDECL(v1::types::view) view() const; + BSONCXX_ABI_EXPORT v1::types::view view() const; /// /// Implicitly convert to `this->view()`. diff --git a/src/bsoncxx/include/bsoncxx/v1/types/view.hpp b/src/bsoncxx/include/bsoncxx/v1/types/view.hpp index 25e17961a5..57ebced9ca 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/view.hpp @@ -49,7 +49,7 @@ namespace types { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) view(); +BSONCXX_ABI_EXPORT std::error_category const& view(); } // namespace types } // namespace category @@ -1123,7 +1123,7 @@ class view { #pragma push_macro("X") #undef X -#define X(_name, _value) BSONCXX_ABI_EXPORT_CDECL(b_##_name) get_##_name() const; +#define X(_name, _value) BSONCXX_ABI_EXPORT b_##_name get_##_name() const; /// /// Return the requested underlying BSON type value. From dfb80be667d42d36dcc834bf7a44aeef69d28ec5 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Fri, 11 Jul 2025 13:11:49 -0500 Subject: [PATCH 34/42] An invalid view -> an invalid value --- .../include/bsoncxx/v1/document/value.hpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp index f722889158..acd790194f 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp @@ -209,20 +209,26 @@ class value { /// /// Initialize with a copy of the BSON bytes referenced by `view`. /// - /// If `view` is invalid or equivalent to a default-initialized @ref bsoncxx::v1::document::view, this value is - /// default-initialized. + /// If `view` is equivalent to a default-initialized @ref bsoncxx::v1::document::view, this value is + /// equivalent to `value()`. /// - /// The copied value is allocated using `operator new[]` and the deleter is set to @ref + /// If `view` is invalid, this value is equivalent to `value{nullptr}`. + /// + /// Otherwise, the copied value is allocated using `operator new[]` and the deleter is set to @ref /// default_deleter_type. /// explicit value(v1::document::view view) { + if (!view) { + return; + } + v1::document::view const empty; - if (view && view.data() != empty.data()) { + if (view.data() == empty.data()) { + _data = unique_ptr_type{const_cast(empty.data()), &noop_deleter}; + } else { _data = unique_ptr_type{new std::uint8_t[view.size()], default_deleter_type{}}; std::memcpy(_data.get(), view.data(), view.size()); - } else { - _data = unique_ptr_type{const_cast(empty.data()), &noop_deleter}; } } From f19ab7e7df026dc194e2d901a6623ad09d442887 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Fri, 11 Jul 2025 13:11:49 -0500 Subject: [PATCH 35/42] Add length validation overloads --- .../include/bsoncxx/v1/array/value.hpp | 10 ++++ src/bsoncxx/include/bsoncxx/v1/array/view.hpp | 3 ++ .../include/bsoncxx/v1/document/value.hpp | 53 ++++++++++++++++--- .../include/bsoncxx/v1/document/view.hpp | 24 ++++++--- 4 files changed, 78 insertions(+), 12 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/array/value.hpp b/src/bsoncxx/include/bsoncxx/v1/array/value.hpp index 5c3c2287c0..42792768ce 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/value.hpp @@ -85,12 +85,22 @@ class value { template ::value>* = nullptr> value(std::uint8_t* data, Deleter deleter) : _value{data, std::move(deleter)} {} + /// @copydoc v1::document::value::value(std::uint8_t* data, std::size_t length, Deleter deleter) + template ::value>* = nullptr> + value(std::uint8_t* data, std::size_t length, Deleter deleter) : _value{data, length, std::move(deleter)} {} + /// @copydoc v1::document::value::value(std::uint8_t* data) explicit value(std::uint8_t* data) : _value{data} {} + /// @copydoc v1::document::value::value(std::uint8_t* data, std::size_t length) + value(std::uint8_t* data, std::size_t length) : _value{data, length} {} + /// @copydoc v1::document::value::value(v1::document::value::unique_ptr_type ptr) explicit value(unique_ptr_type ptr) : _value{std::move(ptr)} {} + /// @copydoc v1::document::value::value(v1::document::value::unique_ptr_type ptr, std::size_t length) + value(unique_ptr_type ptr, std::size_t length) : _value{std::move(ptr), length} {} + /// @copydoc v1::document::value::value(v1::document::view view) explicit value(v1::array::view view) : _value{view} {} diff --git a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp index ea4389f579..50d3d3e2ff 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp @@ -64,6 +64,9 @@ class view { /// @copydoc v1::document::view::view(std::uint8_t const* data) explicit view(std::uint8_t const* data) : _view{data} {} + /// @copydoc v1::document::view::view(std::uint8_t const* data, std::size_t length) + view(std::uint8_t const* data, std::size_t length) : _view{data, length} {} + /// @copydoc v1::document::view::data() const std::uint8_t const* data() const { return _view.data(); diff --git a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp index acd790194f..55ad1df3ad 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp @@ -178,34 +178,75 @@ class value { /// /// @par Preconditions: /// - If `data` is not null, the size of the storage region pointed to by `data` must be greater than or equal to 5. - /// - The "total number of bytes comprising the document" as indicated by the BSON bytes pointed-to by `data` must - /// be less than or equal to the size of the storage region pointed to by `data`. + /// - The embedded length must be less than or equal to the size of the storage region pointed to by `data`. /// - `deleter` must be capable of freeing the storage region pointed to by `data`. /// template ::value>* = nullptr> value(std::uint8_t* data, Deleter deleter) : _data{data, std::move(deleter)} {} + /// + /// Equivalent to @ref value(std::uint8_t* data, Deleter deleter), but validates the embedded length against + /// `length`. + /// + /// @par Preconditions: + /// - If `data` is not null, the size of the storage region pointed to by `data` must be greater than or equal to + /// `length`. + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_length if `length` is + /// less than `5` or less than `this->size()`. + /// + template ::value>* = nullptr> + value(std::uint8_t* data, std::size_t length, Deleter deleter) : value{data, std::move(deleter)} { + (void)v1::document::view{data, length}; // May throw. + } + /// /// Initialize as owning `data` which will be freed with @ref default_deleter_type. /// /// @par Preconditions: /// - If `data` is not null, the size of the storage region pointed to by `data` must be greater than or equal to 5. - /// - The "total number of bytes comprising the document" as indicated by the BSON bytes pointed-to by `data` must - /// be less than or equal to the size of the storage region pointed to by `data`. + /// - The embedded length must be less than or equal to the size of the storage region pointed to by `data`. /// - `deleter` must be capable of freeing the storage region pointed to by `data`. /// explicit value(std::uint8_t* data) : value{data, default_deleter_type{}} {} + /// + /// Equivalent to @ref value(std::uint8_t* data), but validates the embedded length against `length`. + /// + /// @par Preconditions: + /// - If `data` is not null, the size of the storage region pointed to by `data` must be greater than or equal to + /// `length`. + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_length if `length` is + /// less than `5` or less than `this->size()`. + /// + explicit value(std::uint8_t* data, std::size_t length) : value{data} { + (void)v1::document::view{data, length}; // May throw. + } + /// /// Initialize as owning `ptr`. /// /// @par Preconditions: /// - If `data` is not null, the size of the storage region pointed to by `data` must be greater than or equal to 5. - /// - The "total number of bytes comprising the document" as indicated by the BSON bytes pointed-to by `data` must - /// be less than or equal to the size of the storage region pointed to by `data`. + /// - The embedded length must be less than or equal to the size of the storage region pointed to by `data`. /// explicit value(unique_ptr_type ptr) : _data{std::move(ptr)} {} + /// + /// Equivalent to @ref value(unique_ptr_type ptr), but validates the embedded length against `length`. + /// + /// @par Preconditions: + /// - If `ptr` is not null, the size of the storage region pointed to by `data` must be greater than or equal to + /// `length`. + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_length if `length` is + /// less than `5` or less than `this->size()`. + /// + explicit value(unique_ptr_type ptr, std::size_t length) : value{std::move(ptr)} { + (void)v1::document::view{_data.get(), length}; // May throw. + } + /// /// Initialize with a copy of the BSON bytes referenced by `view`. /// diff --git a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp index e599105201..a219400f68 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp @@ -69,8 +69,9 @@ namespace document { /// @attention This feature is experimental! It is not ready for use! /// enum class view { - zero, ///< Zero. - invalid_data, ///< Data is invalid. + zero, ///< Zero. + invalid_length, ///< Length is invalid. + invalid_data, ///< Data is invalid. }; /// @@ -146,10 +147,21 @@ class view { /// /// @par Preconditions: /// - If `data` is not null, the size of the storage region pointed to by `data` must be greater than or equal to 5. - /// - The "total number of bytes comprising the document" as indicated by the BSON bytes pointed-to by `data` must - /// be less than or equal to the size of the storage region pointed to by `data`. + /// - The embedded length must be less than or equal to the size of the storage region pointed to by `data`. /// - explicit view(std::uint8_t const* data) : _data(data) {} + explicit view(std::uint8_t const* data) : _data{data} {} + + /// + /// Equivalent to @ref view(std::uint8_t const* data), but validates the embedded length against `length`. + /// + /// @par Preconditions: + /// - If `data` is not null, the size of the storage region pointed to by `data` must be greater than or equal to + /// `length`. + /// + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_length if `length` is + /// less than `5` or less than `this->size()`. + /// + BSONCXX_ABI_EXPORT view(std::uint8_t const* data, std::size_t length); /// /// Return a pointer to the BSON bytes being represented. @@ -163,7 +175,7 @@ class view { /// /// If `this->data()` is null, returns `0`. /// - /// @note This returns the length as indicated by the pointed to BSON bytes. The result is always within the range + /// @note This returns the embedded length as indicated by the pointed-to BSON bytes. The result is always within the range /// [0, INT32_MAX] when preconditions are satisfied. /// std::size_t size() const; From a1a7c90c6f3b2f2857b148b3a4773362288193c0 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Fri, 11 Jul 2025 13:11:50 -0500 Subject: [PATCH 36/42] Revert GCC 4.X compatibility workarounds --- .../include/bsoncxx/v1/detail/macros.hpp | 5 ----- src/bsoncxx/include/bsoncxx/v1/types/view.hpp | 3 +-- .../lib/bsoncxx/private/type_traits.hh | 20 ++++++------------- 3 files changed, 7 insertions(+), 21 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/detail/macros.hpp b/src/bsoncxx/include/bsoncxx/v1/detail/macros.hpp index 337610dbb9..d53f7f241c 100644 --- a/src/bsoncxx/include/bsoncxx/v1/detail/macros.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/detail/macros.hpp @@ -83,12 +83,7 @@ #define BSONCXX_PRIVATE_CONSTEXPR_CXX14 inline #endif -// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56019 -#if defined(__GNUC__) && (__GNUC__ < 5) && !defined(__clang__) -#define BSONCXX_PRIVATE_MAX_ALIGN_T max_align_t -#else #define BSONCXX_PRIVATE_MAX_ALIGN_T std::max_align_t -#endif #define BSONCXX_PRIVATE_IF_MSVC(...) #define BSONCXX_PRIVATE_IF_GCC(...) diff --git a/src/bsoncxx/include/bsoncxx/v1/types/view.hpp b/src/bsoncxx/include/bsoncxx/v1/types/view.hpp index 57ebced9ca..71ecd85d60 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/view.hpp @@ -1101,9 +1101,8 @@ class view { #pragma push_macro("X") #undef X - // GCC 4.X misinterprets list-initialization of _b_##_name: "too many initializers". #define X(_name, _value) \ - /* explicit(false) */ view(b_##_name v) : _id{v.type_id}, _b_##_name(v) {} + /* explicit(false) */ view(b_##_name v) : _id{v.type_id}, _b_##_name{v} {} /// /// Implicitly convert `v`. diff --git a/src/bsoncxx/lib/bsoncxx/private/type_traits.hh b/src/bsoncxx/lib/bsoncxx/private/type_traits.hh index 6f9205932c..4d993ccd21 100644 --- a/src/bsoncxx/lib/bsoncxx/private/type_traits.hh +++ b/src/bsoncxx/lib/bsoncxx/private/type_traits.hh @@ -68,19 +68,11 @@ struct is_regular : detail::conjunction, detail::is_equality_c // Equivalent to `is_trivial` without requiring trivial default constructibility. template -struct is_semitrivial -// https://gcc.gnu.org/onlinedocs/gcc-4.9.0/libstdc++/manual/manual/status.html -#if defined(__GNUC__) && (__GNUC__ < 5) && !defined(__clang__) - : std::true_type -#else - : detail::conjunction< - std::is_trivially_destructible, - std::is_trivially_move_constructible, - std::is_trivially_move_assignable, - std::is_trivially_copy_constructible, - std::is_trivially_copy_assignable> -#endif -{ -}; +struct is_semitrivial : detail::conjunction< + std::is_trivially_destructible, + std::is_trivially_move_constructible, + std::is_trivially_move_assignable, + std::is_trivially_copy_constructible, + std::is_trivially_copy_assignable> {}; } // namespace bsoncxx From 099f6f26b65215f8bf47b08f645cbf51ed742d39 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Fri, 11 Jul 2025 13:11:51 -0500 Subject: [PATCH 37/42] ClangFormat --- src/bsoncxx/include/bsoncxx/v1/document/view.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp index a219400f68..15f63e79f6 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp @@ -175,8 +175,8 @@ class view { /// /// If `this->data()` is null, returns `0`. /// - /// @note This returns the embedded length as indicated by the pointed-to BSON bytes. The result is always within the range - /// [0, INT32_MAX] when preconditions are satisfied. + /// @note This returns the embedded length as indicated by the pointed-to BSON bytes. The result is always within + /// the range [0, INT32_MAX] when preconditions are satisfied. /// std::size_t size() const; From a2a51fc5b3ae7e06ad67daf01723f38834e20e53 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Mon, 14 Jul 2025 09:15:15 -0500 Subject: [PATCH 38/42] Revert "Remove all use of __cdecl in v1" (CXX-3310) This reverts commit 9888b1f4eaeeba2c868ad87174a21ea3f4f7dcfb. --- src/bsoncxx/include/bsoncxx/v1/array/view.hpp | 4 +-- src/bsoncxx/include/bsoncxx/v1/decimal128.hpp | 6 ++-- .../include/bsoncxx/v1/document/value.hpp | 6 ++-- .../include/bsoncxx/v1/document/view.hpp | 12 +++---- .../include/bsoncxx/v1/element/view.hpp | 34 +++++++++---------- src/bsoncxx/include/bsoncxx/v1/exception.hpp | 4 +-- src/bsoncxx/include/bsoncxx/v1/oid.hpp | 14 ++++---- src/bsoncxx/include/bsoncxx/v1/types/id.hpp | 4 +-- .../include/bsoncxx/v1/types/value.hpp | 22 ++++++------ src/bsoncxx/include/bsoncxx/v1/types/view.hpp | 4 +-- 10 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp index 50d3d3e2ff..69ff44e4e2 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp @@ -93,7 +93,7 @@ class view { } /// @copydoc v1::document::view::cbegin() const - BSONCXX_ABI_EXPORT const_iterator cbegin() const; + BSONCXX_ABI_EXPORT_CDECL(const_iterator) cbegin() const; /// @copydoc v1::document::view::cend() const const_iterator cend() const { @@ -121,7 +121,7 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation /// failed due to invalid BSON bytes. /// - BSONCXX_ABI_EXPORT const_iterator find(std::uint32_t i) const; + BSONCXX_ABI_EXPORT_CDECL(const_iterator) find(std::uint32_t i) const; /// /// Return the first element within the represented BSON array whose key compares equal to `i`. diff --git a/src/bsoncxx/include/bsoncxx/v1/decimal128.hpp b/src/bsoncxx/include/bsoncxx/v1/decimal128.hpp index 69de435c2c..842e8987af 100644 --- a/src/bsoncxx/include/bsoncxx/v1/decimal128.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/decimal128.hpp @@ -36,7 +36,7 @@ namespace category { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT std::error_category const& decimal128(); +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) decimal128(); } // namespace category } // namespace error @@ -114,12 +114,12 @@ class decimal128 { /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::decimal128::invalid_string_data if `str` is not a /// valid Decimal128 string representation. /// - explicit BSONCXX_ABI_EXPORT decimal128(v1::stdx::string_view str); + explicit BSONCXX_ABI_EXPORT_CDECL() decimal128(v1::stdx::string_view str); /// /// Return the string representation. /// - BSONCXX_ABI_EXPORT std::string to_string() const; + BSONCXX_ABI_EXPORT_CDECL(std::string) to_string() const; /// /// Return the high-order bytes. diff --git a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp index 55ad1df3ad..6f568edcdf 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp @@ -59,7 +59,7 @@ class value { /// `std::move_only_function`. That is, it is assumed to be nothrow destructible, nothrow move constructible, and /// nothrow move assignable. /// - using deleter_type = std::function; + using deleter_type = std::function; /// /// The deleter used to free copied BSON bytes when a user-provided deleter is not specified. @@ -69,12 +69,12 @@ class value { /// /// The type of a pointer to @ref noop_deleter. /// - using noop_deleter_type = void (*)(std::uint8_t*); + using noop_deleter_type = void(BSONCXX_ABI_CDECL*)(std::uint8_t*); /// /// The deleter used to avoid freeing preallocated storage representing an empty BSON document. /// - static BSONCXX_ABI_EXPORT void noop_deleter(std::uint8_t*); + static BSONCXX_ABI_EXPORT_CDECL(void) noop_deleter(std::uint8_t*); /// /// The type of the unique pointer used to manage the underlying BSON bytes. diff --git a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp index 15f63e79f6..3b63050cbb 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp @@ -46,7 +46,7 @@ namespace document { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT std::error_category const& view(); +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) view(); } // namespace document } // namespace category @@ -140,7 +140,7 @@ class view { /// - `this->size() == 5` /// - `this->empty() == true` /// - BSONCXX_ABI_EXPORT view(); + BSONCXX_ABI_EXPORT_CDECL() view(); /// /// Initialize with the given BSON bytes. @@ -215,7 +215,7 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation /// failed due to invalid BSON bytes. /// - BSONCXX_ABI_EXPORT const_iterator cbegin() const; + BSONCXX_ABI_EXPORT_CDECL(const_iterator) cbegin() const; /// /// Return a const iterator to the end of the range of BSON elements within this view. @@ -239,7 +239,7 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation /// failed due to invalid BSON bytes. /// - BSONCXX_ABI_EXPORT const_iterator find(v1::stdx::string_view key) const; + BSONCXX_ABI_EXPORT_CDECL(const_iterator) find(v1::stdx::string_view key) const; /// /// Return the first element within the represented BSON document whose key compares equal to `key`. @@ -365,7 +365,7 @@ class view::const_iterator { /// /// If this is an end iterator, it remains an end iterator. /// - BSONCXX_ABI_EXPORT const_iterator& operator++(); + BSONCXX_ABI_EXPORT_CDECL(const_iterator&) operator++(); /// /// Post-increment this iterator. @@ -403,7 +403,7 @@ class view::const_iterator { class internal; private: - explicit BSONCXX_ABI_EXPORT const_iterator(v1::element::view element); + explicit BSONCXX_ABI_EXPORT_CDECL() const_iterator(v1::element::view element); }; inline view::const_iterator view::cend() const { diff --git a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp index d75a119aa0..40c262ef5b 100644 --- a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp @@ -50,7 +50,7 @@ namespace element { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT std::error_category const& view(); +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) view(); } // namespace element } // namespace category @@ -156,7 +156,7 @@ class view { /// /// Destroy this object. /// - BSONCXX_ABI_EXPORT ~view(); + BSONCXX_ABI_EXPORT_CDECL() ~view(); // Handled by the nothrow copy constructor. // view(view&& other) noexcept; @@ -167,52 +167,52 @@ class view { /// /// Copy (or move) construction. /// - BSONCXX_ABI_EXPORT view(view const& other) noexcept; + BSONCXX_ABI_EXPORT_CDECL() view(view const& other) noexcept; /// /// Copy (or move) assignment. /// - BSONCXX_ABI_EXPORT view& operator=(view const& other) noexcept; + BSONCXX_ABI_EXPORT_CDECL(view&) operator=(view const& other) noexcept; /// /// Initialize as an invalid element without any associated BSON bytes. /// - BSONCXX_ABI_EXPORT view(); + BSONCXX_ABI_EXPORT_CDECL() view(); /// /// Return true when this is a valid element. /// /// @note This does not validate the BSON bytes being represented. /// - explicit BSONCXX_ABI_EXPORT operator bool() const; + explicit BSONCXX_ABI_EXPORT_CDECL() operator bool() const; /// /// Return the "raw" component of the underlying BSON bytes. /// /// The value is unspecified when this element is invalid. /// - BSONCXX_ABI_EXPORT std::uint8_t const* raw() const; + BSONCXX_ABI_EXPORT_CDECL(std::uint8_t const*) raw() const; /// /// Return the "length" component of the underlying BSON bytes. /// /// The value is unspecified when this element is invalid. /// - BSONCXX_ABI_EXPORT std::uint32_t length() const; + BSONCXX_ABI_EXPORT_CDECL(std::uint32_t) length() const; /// /// Return the "offset" component of the underlying BSON bytes. /// /// The value is unspecified when this element is invalid. /// - BSONCXX_ABI_EXPORT std::uint32_t offset() const; + BSONCXX_ABI_EXPORT_CDECL(std::uint32_t) offset() const; /// /// Return the "keylen" component of the underlying BSON bytes. /// /// The value is unspecified when this element is invalid. /// - BSONCXX_ABI_EXPORT std::uint32_t keylen() const; + BSONCXX_ABI_EXPORT_CDECL(std::uint32_t) keylen() const; /// /// Return the type. @@ -220,7 +220,7 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is /// invalid. /// - BSONCXX_ABI_EXPORT v1::types::id type_id() const; + BSONCXX_ABI_EXPORT_CDECL(v1::types::id) type_id() const; /// /// Return the key. @@ -228,11 +228,11 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is /// invalid. /// - BSONCXX_ABI_EXPORT v1::stdx::string_view key() const; + BSONCXX_ABI_EXPORT_CDECL(v1::stdx::string_view) key() const; #pragma push_macro("X") #undef X -#define X(_name, _value) BSONCXX_ABI_EXPORT v1::types::b_##_name get_##_name() const; +#define X(_name, _value) BSONCXX_ABI_EXPORT_CDECL(v1::types::b_##_name) get_##_name() const; /// /// Return the underlying BSON type value. @@ -254,7 +254,7 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is /// invalid. /// - BSONCXX_ABI_EXPORT v1::types::view type_view() const; + BSONCXX_ABI_EXPORT_CDECL(v1::types::view) type_view() const; /// /// Return a deep copy of the underlying BSON type value. @@ -262,7 +262,7 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is /// invalid. /// - BSONCXX_ABI_EXPORT v1::types::value type_value() const; + BSONCXX_ABI_EXPORT_CDECL(v1::types::value) type_value() const; /// /// Return the first element within the represented BSON document whose key compares equal to `key`. @@ -276,7 +276,7 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_data if this operation /// failed due to invalid BSON bytes. /// - BSONCXX_ABI_EXPORT v1::element::view operator[](v1::stdx::string_view key) const; + BSONCXX_ABI_EXPORT_CDECL(v1::element::view) operator[](v1::stdx::string_view key) const; /// /// Return the first element within the represented BSON array whose key compares equal to `i`. @@ -290,7 +290,7 @@ class view { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_data if this operation /// failed due to invalid BSON bytes. /// - BSONCXX_ABI_EXPORT v1::element::view operator[](std::uint32_t idx) const; + BSONCXX_ABI_EXPORT_CDECL(v1::element::view) operator[](std::uint32_t idx) const; class internal; diff --git a/src/bsoncxx/include/bsoncxx/v1/exception.hpp b/src/bsoncxx/include/bsoncxx/v1/exception.hpp index 015aaeecfa..e999558dc1 100644 --- a/src/bsoncxx/include/bsoncxx/v1/exception.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/exception.hpp @@ -40,14 +40,14 @@ namespace category { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT std::error_category const& source(); +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) source(); /// /// The error category for @ref bsoncxx::v1::error::type. /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT std::error_category const& type(); +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) type(); } // namespace category } // namespace error diff --git a/src/bsoncxx/include/bsoncxx/v1/oid.hpp b/src/bsoncxx/include/bsoncxx/v1/oid.hpp index 537fb30fe4..bf2bd6d26e 100644 --- a/src/bsoncxx/include/bsoncxx/v1/oid.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/oid.hpp @@ -41,7 +41,7 @@ namespace category { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT std::error_category const& oid(); +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) oid(); } // namespace category } // namespace error @@ -117,7 +117,7 @@ class oid { /// on failure to initialize the Winsock library with /// [`WSAStartup()`](https://learn.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-wsastartup). /// - BSONCXX_ABI_EXPORT oid(); + BSONCXX_ABI_EXPORT_CDECL() oid(); /// /// Initialize with the given ObjectID byte representation. @@ -129,7 +129,7 @@ class oid { /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::oid::invalid_length if `len` is not equal to @ref /// k_oid_length. /// - BSONCXX_ABI_EXPORT oid(std::uint8_t const* bytes, std::size_t len); + BSONCXX_ABI_EXPORT_CDECL() oid(std::uint8_t const* bytes, std::size_t len); /// /// Initialize with the given ObjectID hexadecimal string representation. @@ -139,7 +139,7 @@ class oid { /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::oid::empty_string if `str` is empty. /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::oid::invalid_string if `str` is invalid. /// - explicit BSONCXX_ABI_EXPORT oid(v1::stdx::string_view str); + explicit BSONCXX_ABI_EXPORT_CDECL() oid(v1::stdx::string_view str); /// /// Return @ref k_oid_length. @@ -158,17 +158,17 @@ class oid { /// /// Return the hexadecimal representation. /// - BSONCXX_ABI_EXPORT std::string to_string() const; + BSONCXX_ABI_EXPORT_CDECL(std::string) to_string() const; /// /// Return the timestamp component. /// - BSONCXX_ABI_EXPORT std::time_t get_time_t() const; + BSONCXX_ABI_EXPORT_CDECL(std::time_t) get_time_t() const; /// /// Equivalent to [`bson_oid_compare`](https://mongoc.org/libbson/current/bson_oid_compare.html). /// - BSONCXX_ABI_EXPORT int compare(oid const& other) const; + BSONCXX_ABI_EXPORT_CDECL(int) compare(oid const& other) const; /// /// Equivalent to `lhs.compare(rhs) == 0`. diff --git a/src/bsoncxx/include/bsoncxx/v1/types/id.hpp b/src/bsoncxx/include/bsoncxx/v1/types/id.hpp index e1738ee862..8e297dfd04 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/id.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/id.hpp @@ -64,7 +64,7 @@ enum class id : std::int8_t { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT std::string to_string(id rhs); +BSONCXX_ABI_EXPORT_CDECL(std::string) to_string(id rhs); /// /// Enumeration identifying a BSON binary subtype. @@ -92,7 +92,7 @@ enum class binary_subtype : std::uint8_t { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT std::string to_string(binary_subtype rhs); +BSONCXX_ABI_EXPORT_CDECL(std::string) to_string(binary_subtype rhs); } // namespace types } // namespace v1 diff --git a/src/bsoncxx/include/bsoncxx/v1/types/value.hpp b/src/bsoncxx/include/bsoncxx/v1/types/value.hpp index 4709ded40e..9de4eb3a94 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/value.hpp @@ -54,7 +54,7 @@ namespace types { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT std::error_category const& value(); +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) value(); } // namespace types } // namespace category @@ -124,7 +124,7 @@ class value { /// /// Destroy this object. /// - BSONCXX_ABI_EXPORT ~value(); + BSONCXX_ABI_EXPORT_CDECL() ~value(); /// /// Move construction. @@ -132,7 +132,7 @@ class value { /// @par Postconditions: /// - `other` is equivalent to a default-initialized value. /// - BSONCXX_ABI_EXPORT value(value&& other) noexcept; + BSONCXX_ABI_EXPORT_CDECL() value(value&& other) noexcept; /// /// Move assignment. @@ -140,7 +140,7 @@ class value { /// @par Postconditions: /// - `other` is equivalent to a default-initialized value. /// - BSONCXX_ABI_EXPORT value& operator=(value&& other) noexcept; + BSONCXX_ABI_EXPORT_CDECL(value&) operator=(value&& other) noexcept; /// /// Copy construction. @@ -148,7 +148,7 @@ class value { /// The copied BSON type value is allocated (when necessary) using /// [`bson_value_copy`](https://mongoc.org/libbson/current/bson_value_copy.html). /// - BSONCXX_ABI_EXPORT value(value const& other); + BSONCXX_ABI_EXPORT_CDECL() value(value const& other); /// /// Copy assignment. @@ -156,7 +156,7 @@ class value { /// The copied value is allocated (when necessary) using /// [`bson_value_copy`](https://mongoc.org/libbson/current/bson_value_copy.html). /// - BSONCXX_ABI_EXPORT value& operator=(value const& other); + BSONCXX_ABI_EXPORT_CDECL(value&) operator=(value const& other); /// /// Initialize with @ref bsoncxx::v1::types::b_null. @@ -174,11 +174,11 @@ class value { /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::types::value::invalid_length_u32 if the length /// of any underlying BSON type value component is not representable as an `std::uint32_t`. /// - explicit BSONCXX_ABI_EXPORT value(v1::types::view const& v); + explicit BSONCXX_ABI_EXPORT_CDECL() value(v1::types::view const& v); #pragma push_macro("X") #undef X -#define X(_name, _value) explicit BSONCXX_ABI_EXPORT value(v1::types::b_##_name v); +#define X(_name, _value) explicit BSONCXX_ABI_EXPORT_CDECL() value(v1::types::b_##_name v); /// /// Convert `v` as a deep copy. @@ -301,18 +301,18 @@ class value { /// /// Initialize as a @ref bsoncxx::v1::types::b_binary with `subtype`. /// - explicit BSONCXX_ABI_EXPORT + explicit BSONCXX_ABI_EXPORT_CDECL() value(std::uint8_t const* data, std::size_t size, v1::types::binary_subtype const sub_type); /// /// Return the type of the underlying BSON type value. /// - BSONCXX_ABI_EXPORT v1::types::id type_id() const; + BSONCXX_ABI_EXPORT_CDECL(v1::types::id) type_id() const; /// /// Return a view of the underlying BSON type value. /// - BSONCXX_ABI_EXPORT v1::types::view view() const; + BSONCXX_ABI_EXPORT_CDECL(v1::types::view) view() const; /// /// Implicitly convert to `this->view()`. diff --git a/src/bsoncxx/include/bsoncxx/v1/types/view.hpp b/src/bsoncxx/include/bsoncxx/v1/types/view.hpp index 71ecd85d60..f952c79093 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/view.hpp @@ -49,7 +49,7 @@ namespace types { /// /// @attention This feature is experimental! It is not ready for use! /// -BSONCXX_ABI_EXPORT std::error_category const& view(); +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) view(); } // namespace types } // namespace category @@ -1122,7 +1122,7 @@ class view { #pragma push_macro("X") #undef X -#define X(_name, _value) BSONCXX_ABI_EXPORT b_##_name get_##_name() const; +#define X(_name, _value) BSONCXX_ABI_EXPORT_CDECL(b_##_name) get_##_name() const; /// /// Return the requested underlying BSON type value. From 7087d8a5cb34e278f16d051ab356c51543c7d5b9 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Mon, 14 Jul 2025 10:57:25 -0500 Subject: [PATCH 39/42] v1::array::view::cbegin() can reuse v1::document::view::cbegin() --- src/bsoncxx/include/bsoncxx/v1/array/view.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp index 69ff44e4e2..c8fc483eb8 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp @@ -93,7 +93,9 @@ class view { } /// @copydoc v1::document::view::cbegin() const - BSONCXX_ABI_EXPORT_CDECL(const_iterator) cbegin() const; + const_iterator cbegin() const { + return _view.cbegin(); + } /// @copydoc v1::document::view::cend() const const_iterator cend() const { From 9a77b171b2947d003770841e3258da698a395c18 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Mon, 14 Jul 2025 15:30:39 -0500 Subject: [PATCH 40/42] Support implicit assignment from view to value --- src/bsoncxx/include/bsoncxx/v1/array/value.hpp | 6 ++++++ src/bsoncxx/include/bsoncxx/v1/document/value.hpp | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/src/bsoncxx/include/bsoncxx/v1/array/value.hpp b/src/bsoncxx/include/bsoncxx/v1/array/value.hpp index 42792768ce..db5bf909ad 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/value.hpp @@ -72,6 +72,12 @@ class value { /// @copydoc v1::document::value::value(v1::document::value const& other) value(value const& other) : _value(other._value) {} + /// @copydoc v1::document::value::operator=(v1::document::view view) + value& operator=(v1::array::view view) { + this->reset(view); + return *this; + } + /// @copydoc v1::document::value::operator=(v1::document::value const& other) value& operator=(value const& other) { _value = other._value; diff --git a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp index 6f568edcdf..0ec82aad11 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp @@ -285,6 +285,14 @@ class value { to_bson(v, *this); // ADL. } + /// + /// Equivalent to `this->reset(view)`. + /// + value& operator=(v1::document::view view) { + this->reset(view); + return *this; + } + /// /// Equivalent to `*this = value{v}`. /// From e949f98eb14992a887e6d9d12c868e4177fbcee9 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Wed, 23 Jul 2025 12:28:00 -0500 Subject: [PATCH 41/42] Remove extra precondition on pointer-only ctor --- src/bsoncxx/include/bsoncxx/v1/document/value.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp index 0ec82aad11..5656a22e36 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp @@ -206,7 +206,6 @@ class value { /// @par Preconditions: /// - If `data` is not null, the size of the storage region pointed to by `data` must be greater than or equal to 5. /// - The embedded length must be less than or equal to the size of the storage region pointed to by `data`. - /// - `deleter` must be capable of freeing the storage region pointed to by `data`. /// explicit value(std::uint8_t* data) : value{data, default_deleter_type{}} {} From d1933a6dec10b3d54afdd725c855903f3e9c2592 Mon Sep 17 00:00:00 2001 From: Ezra Chung Date: Wed, 23 Jul 2025 10:38:44 -0500 Subject: [PATCH 42/42] Refactor to use more traditional errc + error_category pattern --- src/bsoncxx/include/bsoncxx/v1/array/view.hpp | 6 +- src/bsoncxx/include/bsoncxx/v1/decimal128.hpp | 94 ++++++-------- .../include/bsoncxx/v1/document/value.hpp | 6 +- .../include/bsoncxx/v1/document/view.hpp | 108 ++++++---------- .../include/bsoncxx/v1/element/view.hpp | 116 +++++++----------- .../include/bsoncxx/v1/exception-fwd.hpp | 12 +- src/bsoncxx/include/bsoncxx/v1/exception.hpp | 86 +++++-------- src/bsoncxx/include/bsoncxx/v1/oid.hpp | 99 ++++++--------- .../include/bsoncxx/v1/types/value.hpp | 106 ++++++---------- src/bsoncxx/include/bsoncxx/v1/types/view.hpp | 98 +++++---------- 10 files changed, 270 insertions(+), 461 deletions(-) diff --git a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp index c8fc483eb8..1dd6271e83 100644 --- a/src/bsoncxx/include/bsoncxx/v1/array/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/array/view.hpp @@ -42,7 +42,7 @@ namespace array { /// /// The BSON bytes being represented is only validated as minimally required to satisfy a requested operation. When an /// operation is not satisfiable due to invalid data, the operation will throw an @ref bsoncxx::v1::exception with @ref -/// bsoncxx::v1::error::document::view::invalid_data. +/// bsoncxx::v1::document::view::errc::invalid_data. /// /// @attention This feature is experimental! It is not ready for use! /// @@ -120,7 +120,7 @@ class view { /// @par Complexity /// Linear. /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::document::view::errc::invalid_data if this operation /// failed due to invalid BSON bytes. /// BSONCXX_ABI_EXPORT_CDECL(const_iterator) find(std::uint32_t i) const; @@ -133,7 +133,7 @@ class view { /// @par Complexity /// Linear. /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::document::view::errc::invalid_data if this operation /// failed due to invalid BSON bytes. /// v1::element::view operator[](std::uint32_t i) const { diff --git a/src/bsoncxx/include/bsoncxx/v1/decimal128.hpp b/src/bsoncxx/include/bsoncxx/v1/decimal128.hpp index 842e8987af..ebbc164edf 100644 --- a/src/bsoncxx/include/bsoncxx/v1/decimal128.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/decimal128.hpp @@ -26,59 +26,6 @@ #include #include -namespace bsoncxx { -namespace v1 { -namespace error { -namespace category { - -/// -/// The error category for @ref bsoncxx::v1::error::decimal128. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) decimal128(); - -} // namespace category -} // namespace error -} // namespace v1 -} // namespace bsoncxx - -namespace bsoncxx { -namespace v1 { -namespace error { - -/// -/// Errors codes which may be returned by @ref bsoncxx::v1::decimal128. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -enum class decimal128 { - zero, ///< Zero. - empty_string, ///< String must not be empty. - invalid_string_length, ///< Length of string is too long (exceeds `INT_MAX`). - invalid_string_data, ///< String is not a valid Decimal128 representation. -}; - -/// -/// Support implicit conversion to `std::error_code`. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -inline std::error_code make_error_code(decimal128 v) { - return {static_cast(v), v1::error::category::decimal128()}; -} - -} // namespace error -} // namespace v1 -} // namespace bsoncxx - -namespace std { - -template <> -struct is_error_code_enum : true_type {}; - -} // namespace std - namespace bsoncxx { namespace v1 { @@ -108,10 +55,10 @@ class decimal128 { /// /// Initialize with the given Decimal128 string representation. /// - /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::decimal128::empty_string if `str` is null. - /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::decimal128::invalid_string_length if the length of + /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::decimal128::errc::empty_string if `str` is null. + /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::decimal128::errc::invalid_string_length if the length of /// `str` exceeds `INT_MAX`. - /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::decimal128::invalid_string_data if `str` is not a + /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::decimal128::errc::invalid_string_data if `str` is not a /// valid Decimal128 string representation. /// explicit BSONCXX_ABI_EXPORT_CDECL() decimal128(v1::stdx::string_view str); @@ -148,11 +95,46 @@ class decimal128 { } /// @} /// + + /// + /// Errors codes which may be returned by @ref bsoncxx::v1::decimal128. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + enum class errc { + zero, ///< Zero. + empty_string, ///< String must not be empty. + invalid_string_length, ///< Length of string is too long (exceeds `INT_MAX`). + invalid_string_data, ///< String is not a valid Decimal128 representation. + }; + + /// + /// The error category for @ref bsoncxx::v1::decimal128::errc. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + static BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) error_category(); + + /// + /// Support implicit conversion to `std::error_code`. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + friend std::error_code make_error_code(errc v) { + return {static_cast(v), error_category()}; + } }; } // namespace v1 } // namespace bsoncxx +namespace std { + +template <> +struct is_error_code_enum : true_type {}; + +} // namespace std + #include /// diff --git a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp index 5656a22e36..cdb5e4d048 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/value.hpp @@ -192,7 +192,7 @@ class value { /// - If `data` is not null, the size of the storage region pointed to by `data` must be greater than or equal to /// `length`. /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_length if `length` is + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::document::view::errc::invalid_length if `length` is /// less than `5` or less than `this->size()`. /// template ::value>* = nullptr> @@ -216,7 +216,7 @@ class value { /// - If `data` is not null, the size of the storage region pointed to by `data` must be greater than or equal to /// `length`. /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_length if `length` is + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::document::view::errc::invalid_length if `length` is /// less than `5` or less than `this->size()`. /// explicit value(std::uint8_t* data, std::size_t length) : value{data} { @@ -239,7 +239,7 @@ class value { /// - If `ptr` is not null, the size of the storage region pointed to by `data` must be greater than or equal to /// `length`. /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_length if `length` is + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::document::view::errc::invalid_length if `length` is /// less than `5` or less than `this->size()`. /// explicit value(unique_ptr_type ptr, std::size_t length) : value{std::move(ptr)} { diff --git a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp index 3b63050cbb..ee8b3cda1e 100644 --- a/src/bsoncxx/include/bsoncxx/v1/document/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/document/view.hpp @@ -31,70 +31,6 @@ #include #include -namespace bsoncxx { -namespace v1 { -namespace error { -namespace category { - -/// -/// Declares error categories for error codes declared in @ref bsoncxx::v1::error::document. -/// -namespace document { - -/// -/// The error category for @ref bsoncxx::v1::error::document::view. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) view(); - -} // namespace document -} // namespace category -} // namespace error -} // namespace v1 -} // namespace bsoncxx - -namespace bsoncxx { -namespace v1 { -namespace error { - -/// -/// Declares error codes returned by @ref bsoncxx::v1::document interfaces. -/// -namespace document { - -/// -/// Errors codes which may be returned by @ref bsoncxx::v1::document::view. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -enum class view { - zero, ///< Zero. - invalid_length, ///< Length is invalid. - invalid_data, ///< Data is invalid. -}; - -/// -/// Support implicit conversion to `std::error_code`. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -inline std::error_code make_error_code(view v) { - return {static_cast(v), v1::error::category::document::view()}; -} - -} // namespace document -} // namespace error -} // namespace v1 -} // namespace bsoncxx - -namespace std { - -template <> -struct is_error_code_enum : true_type {}; - -} // namespace std - namespace bsoncxx { namespace v1 { namespace document { @@ -110,7 +46,7 @@ namespace document { /// /// The BSON bytes being represented is only validated as minimally required to satisfy a requested operation. When an /// operation is not satisfiable due to invalid data, the operation will throw an @ref bsoncxx::v1::exception with @ref -/// bsoncxx::v1::error::document::view::invalid_data. +/// bsoncxx::v1::document::view::errc::invalid_data. /// /// @attention This feature is experimental! It is not ready for use! /// @@ -158,7 +94,7 @@ class view { /// - If `data` is not null, the size of the storage region pointed to by `data` must be greater than or equal to /// `length`. /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_length if `length` is + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::document::view::errc::invalid_length if `length` is /// less than `5` or less than `this->size()`. /// BSONCXX_ABI_EXPORT view(std::uint8_t const* data, std::size_t length); @@ -212,7 +148,7 @@ class view { /// /// If this view is invalid, returns an end iterator. /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::document::view::errc::invalid_data if this operation /// failed due to invalid BSON bytes. /// BSONCXX_ABI_EXPORT_CDECL(const_iterator) cbegin() const; @@ -236,7 +172,7 @@ class view { /// @par Complexity /// Linear. /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::document::view::errc::invalid_data if this operation /// failed due to invalid BSON bytes. /// BSONCXX_ABI_EXPORT_CDECL(const_iterator) find(v1::stdx::string_view key) const; @@ -249,7 +185,7 @@ class view { /// @par Complexity /// Linear. /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::document::view::invalid_data if this operation + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::document::view::errc::invalid_data if this operation /// failed due to invalid BSON bytes. /// v1::element::view operator[](v1::stdx::string_view key) const; @@ -274,6 +210,33 @@ class view { } /// @} /// + + /// + /// Errors codes which may be returned by @ref bsoncxx::v1::document::view. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + enum class errc { + zero, ///< Zero. + invalid_length, ///< Length is invalid. + invalid_data, ///< Data is invalid. + }; + + /// + /// The error category for @ref bsoncxx::v1::document::view::errc. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + static BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) error_category(); + + /// + /// Support implicit conversion to `std::error_code`. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + friend std::error_code make_error_code(errc v) { + return {static_cast(v), error_category()}; + } }; template <> @@ -426,6 +389,13 @@ inline v1::element::view view::operator[](v1::stdx::string_view key) const { } // namespace v1 } // namespace bsoncxx +namespace std { + +template <> +struct is_error_code_enum : true_type {}; + +} // namespace std + #include /// diff --git a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp index 40c262ef5b..d5b9f4e649 100644 --- a/src/bsoncxx/include/bsoncxx/v1/element/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/element/view.hpp @@ -35,70 +35,6 @@ #include #include -namespace bsoncxx { -namespace v1 { -namespace error { -namespace category { - -/// -/// Declares error categories for error codes declared in @ref bsoncxx::v1::error::element. -/// -namespace element { - -/// -/// The error category for @ref bsoncxx::v1::error::element::view. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) view(); - -} // namespace element -} // namespace category -} // namespace error -} // namespace v1 -} // namespace bsoncxx - -namespace bsoncxx { -namespace v1 { -namespace error { - -/// -/// Declares error codes returned by @ref bsoncxx::v1::element interfaces. -/// -namespace element { - -/// -/// Errors codes which may be returned by @ref bsoncxx::v1::element::view. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -enum class view { - zero, ///< Zero. - invalid_view, ///< View is invalid. - invalid_data, ///< Data is invalid. -}; - -/// -/// Support implicit conversion to `std::error_code`. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -inline std::error_code make_error_code(view v) { - return {static_cast(v), v1::error::category::element::view()}; -} - -} // namespace element -} // namespace error -} // namespace v1 -} // namespace bsoncxx - -namespace std { - -template <> -struct is_error_code_enum : true_type {}; - -} // namespace std - namespace bsoncxx { namespace v1 { namespace element { @@ -142,7 +78,7 @@ namespace element { /// /// The BSON bytes being represented is only validated as minimally required to satisfy a requested operation. /// When an operation is not satisfiable due to invalid data, the operation will throw an @ref bsoncxx::v1::exception -/// with @ref bsoncxx::v1::error::document::view::invalid_data. +/// with @ref bsoncxx::v1::document::view::errc::invalid_data. /// /// @attention This feature is experimental! It is not ready for use! /// @@ -217,7 +153,7 @@ class view { /// /// Return the type. /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::element::view::errc::invalid_view if this element is /// invalid. /// BSONCXX_ABI_EXPORT_CDECL(v1::types::id) type_id() const; @@ -225,7 +161,7 @@ class view { /// /// Return the key. /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::element::view::errc::invalid_view if this element is /// invalid. /// BSONCXX_ABI_EXPORT_CDECL(v1::stdx::string_view) key() const; @@ -237,9 +173,9 @@ class view { /// /// Return the underlying BSON type value. /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::element::view::errc::invalid_view if this element is /// invalid. - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::types::view::type_mismatch if the BSON type + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::types::view::errc::type_mismatch if the BSON type /// value does not match the requested type. /// /// @{ @@ -251,7 +187,7 @@ class view { /// /// Return a view of the underlying BSON type value. /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::element::view::errc::invalid_view if this element is /// invalid. /// BSONCXX_ABI_EXPORT_CDECL(v1::types::view) type_view() const; @@ -259,7 +195,7 @@ class view { /// /// Return a deep copy of the underlying BSON type value. /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_view if this element is + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::element::view::errc::invalid_view if this element is /// invalid. /// BSONCXX_ABI_EXPORT_CDECL(v1::types::value) type_value() const; @@ -273,7 +209,7 @@ class view { /// @par Complexity /// Linear. /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_data if this operation + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::element::view::errc::invalid_data if this operation /// failed due to invalid BSON bytes. /// BSONCXX_ABI_EXPORT_CDECL(v1::element::view) operator[](v1::stdx::string_view key) const; @@ -287,11 +223,38 @@ class view { /// @par Complexity /// Linear. /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::element::view::invalid_data if this operation + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::element::view::errc::invalid_data if this operation /// failed due to invalid BSON bytes. /// BSONCXX_ABI_EXPORT_CDECL(v1::element::view) operator[](std::uint32_t idx) const; + /// + /// Errors codes which may be returned by @ref bsoncxx::v1::element::view. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + enum class errc { + zero, ///< Zero. + invalid_view, ///< View is invalid. + invalid_data, ///< Data is invalid. + }; + + /// + /// The error category for @ref bsoncxx::v1::element::view::errc. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + static BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) error_category(); + + /// + /// Support implicit conversion to `std::error_code`. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + friend std::error_code make_error_code(errc v) { + return {static_cast(v), error_category()}; + } + class internal; private: @@ -302,6 +265,13 @@ class view { } // namespace v1 } // namespace bsoncxx +namespace std { + +template <> +struct is_error_code_enum : true_type {}; + +} // namespace std + #include /// diff --git a/src/bsoncxx/include/bsoncxx/v1/exception-fwd.hpp b/src/bsoncxx/include/bsoncxx/v1/exception-fwd.hpp index c393252d47..697bd27223 100644 --- a/src/bsoncxx/include/bsoncxx/v1/exception-fwd.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/exception-fwd.hpp @@ -20,18 +20,10 @@ namespace bsoncxx { namespace v1 { -namespace error { -enum class source; +enum class source_errc; -enum class type; - -} // namespace error -} // namespace v1 -} // namespace bsoncxx - -namespace bsoncxx { -namespace v1 { +enum class type_errc; class BSONCXX_ABI_EXPORT exception; diff --git a/src/bsoncxx/include/bsoncxx/v1/exception.hpp b/src/bsoncxx/include/bsoncxx/v1/exception.hpp index e999558dc1..70ba0df54b 100644 --- a/src/bsoncxx/include/bsoncxx/v1/exception.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/exception.hpp @@ -28,58 +28,32 @@ namespace bsoncxx { namespace v1 { -namespace error { - -/// -/// Declares error categories for error codes and error conditions declared in @ref bsoncxx::v1::error. -/// -namespace category { - -/// -/// The error category for @ref bsoncxx::v1::error::source. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) source(); - -/// -/// The error category for @ref bsoncxx::v1::error::type. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) type(); - -} // namespace category -} // namespace error -} // namespace v1 -} // namespace bsoncxx - -namespace bsoncxx { -namespace v1 { - -/// -/// Declares error codes and error conditions returned by @ref bsoncxx::v1 interfaces. -/// -namespace error { /// /// Enumeration identifying the source of a @ref bsoncxx::v1 error. /// /// @attention This feature is experimental! It is not ready for use! /// -enum class source { +enum class source_errc { zero, ///< Zero. bsoncxx, ///< From the bsoncxx library. bson, ///< From the bson library. }; +/// +/// The error category for @ref bsoncxx::v1::source_errc. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) source_error_category(); + /// /// Support implicit conversion to `std::error_condition`. /// /// @attention This feature is experimental! It is not ready for use! /// -inline std::error_condition make_error_condition(source code) { - return {static_cast(code), v1::error::category::source()}; +inline std::error_condition make_error_condition(source_errc code) { + return {static_cast(code), v1::source_error_category()}; } /// @@ -87,38 +61,28 @@ inline std::error_condition make_error_condition(source code) { /// /// @attention This feature is experimental! It is not ready for use! /// -enum class type { +enum class type_errc { zero, ///< Zero. invalid_argument, ///< An invalid argument passed to the throwing function. runtime_error, ///< An erroneous condition was detected at runtime. }; +/// +/// The error category for @ref bsoncxx::v1::type_errc. +/// +/// @attention This feature is experimental! It is not ready for use! +/// +BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) type_error_category(); + /// /// Support implicit conversion to `std::error_condition`. /// /// @attention This feature is experimental! It is not ready for use! /// -inline std::error_condition make_error_condition(type code) { - return {static_cast(code), v1::error::category::type()}; +inline std::error_condition make_error_condition(type_errc code) { + return {static_cast(code), v1::type_error_category()}; } -} // namespace error -} // namespace v1 -} // namespace bsoncxx - -namespace std { - -template <> -struct is_error_condition_enum : true_type {}; - -template <> -struct is_error_condition_enum : true_type {}; - -} // namespace std - -namespace bsoncxx { -namespace v1 { - BSONCXX_PRIVATE_WARNINGS_PUSH(); BSONCXX_PRIVATE_WARNINGS_DISABLE(MSVC(4251)); BSONCXX_PRIVATE_WARNINGS_DISABLE(MSVC(4275)); @@ -148,6 +112,16 @@ BSONCXX_PRIVATE_WARNINGS_POP(); } // namespace v1 } // namespace bsoncxx +namespace std { + +template <> +struct is_error_condition_enum : true_type {}; + +template <> +struct is_error_condition_enum : true_type {}; + +} // namespace std + #include /// diff --git a/src/bsoncxx/include/bsoncxx/v1/oid.hpp b/src/bsoncxx/include/bsoncxx/v1/oid.hpp index bf2bd6d26e..f02e6ee0bf 100644 --- a/src/bsoncxx/include/bsoncxx/v1/oid.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/oid.hpp @@ -30,61 +30,6 @@ #include #include #include - -namespace bsoncxx { -namespace v1 { -namespace error { -namespace category { - -/// -/// The error category for @ref bsoncxx::v1::error::oid. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) oid(); - -} // namespace category -} // namespace error -} // namespace v1 -} // namespace bsoncxx - -namespace bsoncxx { -namespace v1 { -namespace error { - -/// -/// Errors codes may be returned by @ref bsoncxx::v1::oid. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -enum class oid { - zero, ///< Zero. - null_bytes_ptr, ///< Bytes pointer must not be null. - invalid_length, ///< Byte length must equal @ref bsoncxx::v1::oid::k_oid_length. - empty_string, ///< String must not be empty. - invalid_string, ///< String is not a valid ObjectID representation. -}; - -/// -/// Support implicit conversion to `std::error_code`. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -inline std::error_code make_error_code(oid v) { - return {static_cast(v), v1::error::category::oid()}; -} - -} // namespace error -} // namespace v1 -} // namespace bsoncxx - -namespace std { - -template <> -struct is_error_code_enum : true_type {}; - -} // namespace std - namespace bsoncxx { namespace v1 { @@ -125,8 +70,8 @@ class oid { /// @param bytes A pointer to the ObjectID byte representation. /// @param len The length of the array pointed to by `bytes`. /// - /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::oid::null_bytes_ptr if `bytes` is null. - /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::oid::invalid_length if `len` is not equal to @ref + /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::oid::errc::null_bytes_ptr if `bytes` is null. + /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::oid::errc::invalid_length if `len` is not equal to @ref /// k_oid_length. /// BSONCXX_ABI_EXPORT_CDECL() oid(std::uint8_t const* bytes, std::size_t len); @@ -136,8 +81,8 @@ class oid { /// /// @param str A valid ObjectID represented. /// - /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::oid::empty_string if `str` is empty. - /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::error::oid::invalid_string if `str` is invalid. + /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::oid::errc::empty_string if `str` is empty. + /// @throws bsoncxx::v1::exception with @ref bsoncxx::v1::oid::errc::invalid_string if `str` is invalid. /// explicit BSONCXX_ABI_EXPORT_CDECL() oid(v1::stdx::string_view str); @@ -211,11 +156,47 @@ class oid { friend bool operator>=(oid const& lhs, oid const& rhs) { return lhs.compare(rhs) >= 0; } + + /// + /// Errors codes may be returned by @ref bsoncxx::v1::oid. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + enum class errc { + zero, ///< Zero. + null_bytes_ptr, ///< Bytes pointer must not be null. + invalid_length, ///< Byte length must equal @ref bsoncxx::v1::oid::k_oid_length. + empty_string, ///< String must not be empty. + invalid_string, ///< String is not a valid ObjectID representation. + }; + + /// + /// The error category for @ref bsoncxx::v1::oid::errc. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + static BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) error_category(); + + /// + /// Support implicit conversion to `std::error_code`. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + friend std::error_code make_error_code(errc v) { + return {static_cast(v), error_category()}; + } }; } // namespace v1 } // namespace bsoncxx +namespace std { + +template <> +struct is_error_code_enum : true_type {}; + +} // namespace std + #include /// diff --git a/src/bsoncxx/include/bsoncxx/v1/types/value.hpp b/src/bsoncxx/include/bsoncxx/v1/types/value.hpp index 9de4eb3a94..d11d079b4e 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/value.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/value.hpp @@ -39,70 +39,6 @@ #include #include -namespace bsoncxx { -namespace v1 { -namespace error { -namespace category { - -/// -/// Declares error categories for error codes declared in @ref bsoncxx::v1::error::types. -/// -namespace types { - -/// -/// The error category for @ref bsoncxx::v1::error::types::value. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) value(); - -} // namespace types -} // namespace category -} // namespace error -} // namespace v1 -} // namespace bsoncxx - -namespace bsoncxx { -namespace v1 { -namespace error { - -/// -/// Declares error codes returned by @ref bsoncxx::v1::types interfaces. -/// -namespace types { - -/// -/// Errors codes which may be returned by @ref bsoncxx::v1::types::value. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -enum class value { - zero, ///< Zero. - invalid_type, ///< Requested BSON type is not supported. - invalid_length_u32, ///< Length is too long (exceeds `UINT32_MAX`). -}; - -/// -/// Support implicit conversion to `std::error_code`. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -inline std::error_code make_error_code(value v) { - return {static_cast(v), v1::error::category::types::value()}; -} - -} // namespace types -} // namespace error -} // namespace v1 -} // namespace bsoncxx - -namespace std { - -template <> -struct is_error_code_enum : true_type {}; - -} // namespace std - namespace bsoncxx { namespace v1 { namespace types { @@ -169,9 +105,9 @@ class value { /// The copied value is allocated (when necessary) using /// [`bson_malloc`](https://mongoc.org/libbson/current/bson_malloc.html). /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::types::value::invalid_type if `v.type_id()` is + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::types::value::errc::invalid_type if `v.type_id()` is /// not a supported value (not defined by @ref BSONCXX_V1_TYPES_XMACRO). - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::types::value::invalid_length_u32 if the length + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::types::value::errc::invalid_length_u32 if the length /// of any underlying BSON type value component is not representable as an `std::uint32_t`. /// explicit BSONCXX_ABI_EXPORT_CDECL() value(v1::types::view const& v); @@ -186,7 +122,7 @@ class value { /// The copied value is allocated (when necessary) using /// [`bson_malloc`](https://mongoc.org/libbson/current/bson_malloc.html). /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::types::value::invalid_length_u32 if the length + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::types::value::errc::invalid_length_u32 if the length /// of any underlying BSON type value component is not representable as an `std::uint32_t` as required by the /// corresponding `bsoncxx::v1::types::b_`. /// @@ -332,7 +268,7 @@ class value { /// Equivalent to `this->view().get_type()` where `get_type` is the correct name for the requested BSON type value /// (e.g. `this->view().get_double()` given `this->get_double()`). /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::types::view::type_mismatch if the underlying + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::types::view::errc::type_mismatch if the underlying /// BSON type value does not match the requested type. /// /// @{ @@ -355,6 +291,33 @@ class value { return !(lhs == rhs); } + /// + /// Errors codes which may be returned by @ref bsoncxx::v1::types::value. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + enum class errc { + zero, ///< Zero. + invalid_type, ///< Requested BSON type is not supported. + invalid_length_u32, ///< Length is too long (exceeds `UINT32_MAX`). + }; + + /// + /// The error category for @ref bsoncxx::v1::types::value::errc. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + static BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) error_category(); + + /// + /// Support implicit conversion to `std::error_code`. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + friend std::error_code make_error_code(errc v) { + return {static_cast(v), error_category()}; + } + class internal; }; @@ -362,6 +325,13 @@ class value { } // namespace v1 } // namespace bsoncxx +namespace std { + +template <> +struct is_error_code_enum : true_type {}; + +} // namespace std + #include /// diff --git a/src/bsoncxx/include/bsoncxx/v1/types/view.hpp b/src/bsoncxx/include/bsoncxx/v1/types/view.hpp index f952c79093..ab306550f5 100644 --- a/src/bsoncxx/include/bsoncxx/v1/types/view.hpp +++ b/src/bsoncxx/include/bsoncxx/v1/types/view.hpp @@ -34,69 +34,6 @@ #include #include -namespace bsoncxx { -namespace v1 { -namespace error { -namespace category { - -/// -/// Declares error categories for error codes declared in @ref bsoncxx::v1::error::types. -/// -namespace types { - -/// -/// The error category for @ref bsoncxx::v1::error::types::view. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) view(); - -} // namespace types -} // namespace category -} // namespace error -} // namespace v1 -} // namespace bsoncxx - -namespace bsoncxx { -namespace v1 { -namespace error { - -/// -/// Declares error codes returned by @ref bsoncxx::v1::types interfaces. -/// -namespace types { - -/// -/// Errors codes which may be returned by @ref bsoncxx::v1::types::view. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -enum class view { - zero, ///< Zero. - type_mismatch, ///< Requested type does not match the underlying type. -}; - -/// -/// Support implicit conversion to `std::error_code`. -/// -/// @attention This feature is experimental! It is not ready for use! -/// -inline std::error_code make_error_code(view v) { - return {static_cast(v), v1::error::category::types::view()}; -} - -} // namespace types -} // namespace error -} // namespace v1 -} // namespace bsoncxx - -namespace std { - -template <> -struct is_error_code_enum : true_type {}; - -} // namespace std - namespace bsoncxx { namespace v1 { namespace types { @@ -1127,7 +1064,7 @@ class view { /// /// Return the requested underlying BSON type value. /// - /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::error::types::view::type_mismatch if the underlying + /// @exception bsoncxx::v1::exception with @ref bsoncxx::v1::types::view::errc::type_mismatch if the underlying /// BSON type value does not match the requested type. /// /// @{ @@ -1240,6 +1177,32 @@ class view { /// @} /// + /// + /// Errors codes which may be returned by @ref bsoncxx::v1::types::view. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + enum class errc { + zero, ///< Zero. + type_mismatch, ///< Requested type does not match the underlying type. + }; + + /// + /// The error category for @ref bsoncxx::v1::types::view::errc. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + static BSONCXX_ABI_EXPORT_CDECL(std::error_category const&) error_category(); + + /// + /// Support implicit conversion to `std::error_code`. + /// + /// @attention This feature is experimental! It is not ready for use! + /// + friend std::error_code make_error_code(errc v) { + return {static_cast(v), error_category()}; + } + class internal; }; @@ -1247,6 +1210,13 @@ class view { } // namespace v1 } // namespace bsoncxx +namespace std { + +template <> +struct is_error_code_enum : true_type {}; + +} // namespace std + #include ///