* Added `PyRef::as_super` and `PyRefMut::as_super` methods, including docstrings and tests. The implementation of these methods also required adding `#[repr(transparent)]` to the `PyRef` and `PyRefMut` structs.
* Added newsfragment entry.
* Changed the `AsRef<U>`/`AsMut<U>` impls for `PyRef` and `PyRefMut` to use the new `as_super` methods. Added the `PyRefMut::downgrade` associated function for converting `&PyRefMut` to `&PyRef`. Updated tests and docstrings to better demonstrate the new functionality.
* Fixed newsfragment filename.
* Removed unnecessary re-borrows flagged by clippy.
* retrigger checks
* Updated `PyRef::as_super`, `PyRefMut::as_super`, and `PyRefMut::downgrade` to use `.cast()` instead of `as _` pointer casts. Fixed typo.
* Updated `PyRef::as_super` and `PyRefMut::downgrade` to use `ptr_from_ref` for the initial cast to `*const _` instead of `as _` casts.
* Added `pyo3::internal_tricks::ptr_from_mut` function alongside the `ptr_from_ref` added in PR #4240. Updated `PyRefMut::as_super` to use this method instead of `as *mut _`.
* Updated the user guide to recommend `as_super` for accessing the base class instead of `as_ref`, and updated the subsequent example/doctest to demonstrate this functionality.
* Improved tests for the `as_super` methods.
* Updated newsfragment to include additional changes.
* Fixed formatting.
---------
Co-authored-by: jrudolph <jrudolph@anl.gov>
* feat: Add 'ord' option for PyClass and corresponding tests
Updated the macros back-end to include 'ord' as an option for PyClass allowing for Python-style ordering comparison of enum variants. Additionally, test cases to verify the proper functioning of this new feature have been introduced.
* update: fix formatting with cargo fmt
* update: documented added feature in newsfragments
* update: updated saved errors for comparison test for invalid pyclass args
* update: removed nested match arms and extended cases for ordering instead
* update: alphabetically ordered entries
* update: added section to class documentation with example for using ord argument.
* refactor: reduced duplication of code using closure to process tokens.
* update: used ensure_spanned macro to emit compile time errors for uses of ord on complex enums or structs, updated test errors for bad compile cases
* fix: remove errant character
* update: added note about PartialOrd being required.
* feat: implemented ordering for structs and complex enums. Retained the equality logic for simple enums until PartialEq is deprecated.
* update: adjusted compile time error checks for missing PartialOrd implementations. Refactored growing set of comparison tests for simple and complex enums and structs into separate test file.
* fix: updated with clippy findings
* update: added not to pyclass parameters on ord (assumes that eq will be implemented and merged first)
* update: rebased on main after merging of `eq` feature
* update: format update
* update: update all test output and doc tests
* Update guide/src/class.md
Co-authored-by: Icxolu <10486322+Icxolu@users.noreply.github.com>
* Update pyo3-macros-backend/src/pyclass.rs
Co-authored-by: Icxolu <10486322+Icxolu@users.noreply.github.com>
* Update newsfragments/4202.added.md
Co-authored-by: Icxolu <10486322+Icxolu@users.noreply.github.com>
* Update guide/pyclass-parameters.md
Co-authored-by: Icxolu <10486322+Icxolu@users.noreply.github.com>
* update: added note about `ord` implementation with example.
* fix doc formatting
---------
Co-authored-by: Michael Gilbert <git.3mc1o@aleeas.com>
Co-authored-by: Icxolu <10486322+Icxolu@users.noreply.github.com>
* Declarative modules: make sure to emmit doc comments and other attributes
* Adds a test
* Apply suggestions from code review
---------
Co-authored-by: David Hewitt <mail@davidhewitt.dev>
* Automated module= field creation in declarative modules
Sets automatically the "module" field of all contained classes and submodules in a declarative module
Adds the "module" field to pymodule attributes in order to set the name of the parent modules. By default, the module is assumed to be a root module
* fix guide test error
---------
Co-authored-by: David Hewitt <mail@davidhewitt.dev>
This makes it possible to use rust keywords as the name of python class
methods and standalone functions. For example:
```
struct MyClass {
}
impl MyClass {
#[new]
fn new() -> Self {
MyClass {}
}
#[pyo3(name = "struct")]
fn struct_method(&self) -> usize {
42
}
}
fn struct_function() -> usize {
42
}
```
From the [`syn::Ident`
documentation](https://docs.rs/syn/2.0.66/syn/struct.Ident.html):
> An identifier constructed with `Ident::new` is permitted to be a Rust
keyword, though parsing one through its
[`Parse`](https://docs.rs/syn/2.0.66/syn/parse/trait.Parse.html)
implementation rejects Rust keywords. Use `input.call(Ident::parse_any)`
when parsing to match the behaviour of `Ident::new`.
Fixes issue #4225
* fix incorrect `__richcmp__` for `eq_int` only simple enums
* add tests for deprecated simple enum eq behavior
* only emit deprecation warning if neither `eq` nor `eq_int` were given
* require `eq` for `eq_int`
* Added `ToPyObject` and `Into<PyObject>` impls for `PyBackedStr`.
* Create 4205.added.md
* Added attributes limiting the `ToPyObject` and `IntoPy<PyObject>` impls to the case where `cfg(any(Py_3_10, not(Py_LIMITED_API)))`. When this cfg does not apply, the conversion is less trivial since the `storage` is actually `PyBytes`, not `PyString`.
* Fixed imports format.
* Updated the `ToPyObject` and `IntoPy<PyObject>` impls to support the `cfg(not(any(Py_3_10, not(Py_LIMITED_API))))` case by converting the `PyBytes` back to `PyString`.
* Added `ToPyObject` and `IntoPy<PyObject>` impls for `PyBackedBytes`.
* Added tests for the `PyBackedBytes` conversion impls.
* Updated newsfragment entry to include the `PyBackedBytes` impls.
* Changed the `IntoPy` and `ToPyObject` impls for `PyBackedBytes` to produce `PyBytes` regardless of the backing variant. Updated tests to demonstrate this.
* retrigger checks
* Updated `PyBackedStr` conversion tests to extract the result as a `PyBackedStr` instead of `&str` since the latter is not supported under some `cfg`'s.
* Fixed `IntoPy<PyObject> for PyBackedBytes` impl to create `bytes` for both storage types as intended. Updated test to properly catch the error.
---------
Co-authored-by: jrudolph <jrudolph@anl.gov>
* Add vscode folder to gitignore
* Initial work on PyWeakRef (weakref.ReferenceType)
* Add documentation for PyWeakRef::upgrade
* Add missing docs for PyWeakRef
* Add PyWeakProxy
* Add PyWeakCallableProxy
* Add PyWeakRefMethods::upgrade_exact and prevent unnecessary panicing
* Change PyWeakRefMethods to exclude infeasible errors.
As a result of the checks made about the objectpointers in PyO3, all
errors in PyWeakref_GetObject are already caught. Therefor there is no
need to check for these errors in the non-ffi layer.
* Add towncrier changes
* Update weakref type doctests to use `py.run_bound`
* Fix to adhere to MSRV
* Make weakref tests independent from macros feature
* Change Weakref tests
* Remove forgotten Debug marcos
* Processed .gitignore and PyResultExt feedback
* Change new methods of weakref types to remove dangling pointers
* Change to reflect deprecation of PyErr::value for PyErr::value_bound
* Change Tests so different class name in older python versions is accounted for
* Change formatting
* Make tests ABI3 compatible
* Prevent the use of PyClass in test for weakref under abi3 Python 3.7 and 3.8
* Disable weakref types when targeting PyPy
* Remove needless borrow from CallableProxy test
* Add Borrowed variants of upgrade and upgrade exact to trait
* Added tests for weakref borrow_upgrade methods
* Change PyWeakRefMethods method names to be more consistent
* Change weakref constructors to take PyAny for main target
* Add track_caller to all panicing weakref methods
* Add PyWeakRefMethods::upgrade*_as_unchecked
* Fix PyWeakProxy and PyWeakCallableProxy Documentation
* Replace deprecated wrap_pyfunction with bound equivalent
* Add (Generic) PyWeakref Type
* Reworked Proxy types into one (PyWeakrefProxy)
* Rename PyWeakRef to PyWeakrefReference
* Change PyWeakrefReference to only use type pointer when it exists
* Remove `#[track_caller]` annotations for now
* Make the gil-refs function feature dependent
* Remove unused AsPyPointer import
* Change docs links to PyNone to not include private module
* Fix string based examples
* Change tests to work for Python 3.13
* Fix cargo clippy for Python 3.13
---------
Co-authored-by: David Hewitt <mail@davidhewitt.dev>
* feat: support pyclass on tuple enums
* cargo fmt
* changelog
* ruff format
* rebase with adaptation for FnArg refactor
* fix class.md from pr comments
* add enum tuple variant getitem implementation
* fmt
* progress toward getitem and len impl on derive pyclass for complex enum tuple
* working getitem and len slots for complex tuple enum pyclass derivation
* refactor code generation
* address PR concerns
- take py from function argument on get_item
- make more general slot def implementation
- remove unnecessary function arguments
- add testcases for uncovered cases including future feature match_args
* add tracking issue
* fmt
* ruff
* remove me
* support match_args for tuple enum
* integrate FnArg now takes Cow
* fix empty and single element tuples
* use impl_py_slot_def for cimplex tuple enum slots
* reverse erroneous doc change
* Address latest comments
* formatting suggestion
* fix :
- clippy beta
- better compile error (+related doc and test)
---------
Co-authored-by: Chris Arderne <chris@translucent.app>
* Add feature controlling the global reference pool to enable avoiding its overhead.
* Document reference-pool feature in the performance guide.
* Invert semantics of feature to disable reference pool so the new behaviour becomes opt-in
* Remove delayed reference count increments as we cannot prevent reference count errors as long as these are available
* Adjust tests to be compatible with disable-reference-pool feature
* Adjust tests to be compatible with py-clone feature
* Adjust the GIL benchmark to the updated reference pool semantics.
* Further extend and clarify the documentation of the py-clone and disable-reference-pool features
* Replace disable-reference-pool feature by pyo3_disable_reference_pool conditional compilation flag
Such a flag is harder to use and thereby also harder to abuse. This seems
appropriate as this is purely a performance-oriented change which show only be
enabled by leaf crates and brings with it additional highly implicit sources of
process aborts.
* Add pyo3_leak_on_drop_without_reference_pool to turn aborts into leaks when the global reference pool is disabled and the GIL is not held
* Add `num-rational` support for Python's `fractions.Fraction` type
* Add newsfragment
* Use Bound instead
* Handle objs which atts are incorrect
* Add extra test
* Add tests for wasm32 arch
* add type for wasm32 clipppy
This allow also storing idents that were generated
as part of the macro instead of only ones the were
present in the source code. This is needed for
example in complex enum tuple variants.