* use `ffi::MemberGef` for `#[pyo3(get)]` fields of `Py<T>`
* tidy up implementation
* make it work on MSRV :(
* fix docs and newsfragment
* clippy
* internal docs and coverage
* review: mejrs
* emit c-string literals on Rust 1.77 or later
* only clone `PyO3CratePath` instead of the whole `Ctx`
Co-authored-by: mejrs <59372212+mejrs@users.noreply.github.com>
---------
Co-authored-by: mejrs <59372212+mejrs@users.noreply.github.com>
Co-authored-by: David Hewitt <mail@davidhewitt.dev>
* Improve the span and message for return types of pymethod/functions
* Don't pass the span
* fixup trybuild output
---------
Co-authored-by: David Hewitt <mail@davidhewitt.dev>
* 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`
* 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>
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.
* Resolve references to legacy numerical constants and use the associated constants instead
* Suppress non_local_definitions lint as we often want the non-local effects in macro code