Skip to content

Commit 66ec654

Browse files
authored
Merge branch 'main' into feature/querybuilder-clean
2 parents b8a4db6 + 9788cbb commit 66ec654

14 files changed

Lines changed: 1211 additions & 48 deletions

File tree

.claude/skills/dataverse-sdk-dev/SKILL.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,35 @@ Navigation property names are case-sensitive and must match the entity's `$metad
5454
9. **Document public APIs** - Add Sphinx-style docstrings with examples for public methods
5555
10. **Define __all__ in module files** - Each module declares its own exports via `__all__` (e.g., `errors.py` defines `__all__ = ["HttpError", ...]`). Package `__init__.py` files should not re-export or redefine another module's `__all__`; they use `__all__ = []` to indicate no star-import exports.
5656
11. **Run black before committing** - Always run `python -m black <changed files>` before committing. CI will reject unformatted code. Config is in `pyproject.toml` under `[tool.black]`.
57+
58+
### Docstring Type Annotations (Microsoft Learn Compatibility)
59+
60+
This SDK's API reference is published on Microsoft Learn. The Learn doc pipeline parses `:type:` and `:rtype:` directives differently from standard Sphinx -- every word between `:class:` references is treated as a separate cross-reference (`<xref:word>`). Using Sphinx-style `:class:\`list\` of :class:\`str\`` produces broken `<xref:of>` links on Learn.
61+
62+
**Rules for `:type:` and `:rtype:` directives:**
63+
64+
- Use Python bracket notation for generic types: `list[str]`, `dict[str, typing.Any]`, `list[dict]`
65+
- Use `or` (without `:class:`) for union types: `str or None`, `dict or list[dict]`
66+
- Use bracket nesting for complex types: `collections.abc.Iterable[list[dict]]`
67+
- Use `~` prefix for SDK types to show short name: `list[~PowerPlatform.Dataverse.models.record.Record]`
68+
- `:class:` is fine for single standalone types: `:class:\`str\``, `:class:\`bool\``
69+
70+
**Never** use `:class:\`X\` of :class:\`Y\`` or `:class:\`X\` mapping :class:\`Y\` to :class:\`Z\`` -- the words `of`, `mapping`, `to` become broken `<xref:>` links.
71+
72+
**Correct examples:**
73+
74+
```rst
75+
:type data: dict or list[dict]
76+
:rtype: list[str]
77+
:rtype: collections.abc.Iterable[list[~PowerPlatform.Dataverse.models.record.Record]]
78+
:type select: list[str] or None
79+
:type columns: dict[str, typing.Any]
80+
```
81+
82+
**Wrong examples (NEVER use):**
83+
84+
```rst
85+
:type data: :class:`dict` or :class:`list` of :class:`dict`
86+
:rtype: :class:`list` of :class:`str`
87+
:type columns: :class:`dict` mapping :class:`str` to :class:`typing.Any`
88+
```

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.1.0b7] - 2026-03-17
9+
10+
### Added
11+
- DataFrame namespace: `client.dataframe.get()`, `.create()`, `.update()`, `.delete()` for working with Dataverse records as pandas DataFrames and Series — no manual dict conversion required (#98)
12+
- Table metadata now includes `primary_name_attribute` and `primary_id_attribute` from `tables.create()` and `tables.get_info()` (#148)
13+
14+
### Changed
15+
- `pandas>=2.0.0` is now a required dependency (#98)
16+
817
## [0.1.0b6] - 2026-03-12
918

1019
### Added
@@ -82,6 +91,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8291
- Comprehensive error handling with specific exception types (`DataverseError`, `AuthenticationError`, etc.) (#22, #24)
8392
- HTTP retry logic with exponential backoff for resilient operations (#72)
8493

94+
[0.1.0b7]: https://github.com/microsoft/PowerPlatform-DataverseClient-Python/compare/v0.1.0b6...v0.1.0b7
8595
[0.1.0b6]: https://github.com/microsoft/PowerPlatform-DataverseClient-Python/compare/v0.1.0b5...v0.1.0b6
8696
[0.1.0b5]: https://github.com/microsoft/PowerPlatform-DataverseClient-Python/compare/v0.1.0b4...v0.1.0b5
8797
[0.1.0b4]: https://github.com/microsoft/PowerPlatform-DataverseClient-Python/compare/v0.1.0b3...v0.1.0b4

CONTRIBUTING.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,4 +121,41 @@ published release:
121121
# After publishing v0.1.0b4, bump to v0.1.0b5 on main
122122
# Update version in pyproject.toml
123123
# Commit directly to main: "Bump version to 0.1.0b5 for next development cycle"
124+
```
125+
126+
### Docstring Type Annotations (Microsoft Learn Compatibility)
127+
128+
This SDK's API reference is published on [Microsoft Learn](https://learn.microsoft.com). The Learn doc pipeline processes `:type:` and `:rtype:` Sphinx directives differently from standard Sphinx -- every word between `:class:` back-tick references is treated as a separate cross-reference (`<xref:word>`). For example:
129+
130+
```
131+
:rtype: :class:`list` of :class:`str`
132+
```
133+
134+
This produces a broken `<xref:of>` link because `of` is not a valid type.
135+
136+
**Rules for `:type:` and `:rtype:` directives:**
137+
138+
- Use **Python bracket notation** for generic types: `list[str]`, `dict[str, typing.Any]`, `list[dict]`
139+
- Use **`or`** (without `:class:`) for union types: `str or None`, `dict or list[dict]`
140+
- Use **bracket nesting** for complex types: `collections.abc.Iterable[list[dict]]`
141+
- `:class:` is fine for **single standalone types**: `` :class:`str` ``, `` :class:`bool` ``
142+
143+
**NEVER** use the following patterns -- the connector words (`of`, `mapping`, `to`) become broken `<xref:>` links on Learn:
144+
145+
```
146+
:class:`X` of :class:`Y`
147+
:class:`X` mapping :class:`Y` to :class:`Z`
148+
```
149+
150+
Correct:
151+
```
152+
:type data: dict or list[dict]
153+
:rtype: list[str]
154+
:type select: list[str] or None
155+
```
156+
157+
Wrong:
158+
```
159+
:type data: :class:`dict` or :class:`list` of :class:`dict`
160+
:rtype: :class:`list` of :class:`str`
124161
```

0 commit comments

Comments
 (0)