docs: fix parameter mismatches and inaccurate documentation

- Fix update_post() wrapper documentation (post_id -> post_text/post_path/post_key)
- Fix create_comment() wrapper documentation (added post_slug, post_key parameters)
- Add missing wrapper docs for follow(), trust(), votecast(), react()
- Fix reaction job parameters (parent_id -> parent_sk, corrected payload structure)
- Fix trust job parameters (updated to match actual payload structure)
- Fix vote job parameters (voteType -> vote, added parent structure)
- Clearly mark Block and Mute jobs as NOT IMPLEMENTED
- Fix GitLab URLs to Forgejo (git.jezzahehn.com)
- Remove LLM-style language (comprehensive -> full/thorough)
- Fix trust listbyusersinit parameter (username -> user_id)
This commit is contained in:
Jezza Hehn 2026-04-18 02:47:33 +00:00
parent fd1a1566e9
commit e7cf4f1e09
6 changed files with 320 additions and 95 deletions

View file

@ -620,7 +620,7 @@ python -m pytest tests/
For issues, questions, or contributions:
- [TrustCafé Website](https://trustcafe.io)
- [GitLab Repository](https://gitlab.com/trustcafe/trustcafe-api-wrapper)
- [Forgejo Repository](https://git.jezzahehn.com/KrustyPlanet/trustcafe-api-wrapper)
- Contact the WikiTribune team
## Version History

View file

@ -614,7 +614,7 @@ if __name__ == '__main__':
- Follow PEP 8
- Use type hints
- Write comprehensive docstrings
- Write thorough docstrings
- Add error handling
- Include examples in docstrings

View file

@ -365,25 +365,32 @@ Cast votes on posts/content.
### vote.votecast()
Casts a vote on a post.
Casts a vote on a post or comment.
```python
vote = API.run_job('vote.votecast', payload)
```
**Parameters:**
- `parent` (dict): Object containing vote target info
- `pk` (str): Object partition key
- `sk` (str): Object sort key
- `voteType` (str): Vote type - "up" or "down"
- `slug` (str): Object slug
- `entity` (str): Entity type (e.g., "post", "comment")
- `vote` (str): Vote type - "up" or "down"
**Returns:** dict - Vote status
**Example:**
```python
voted = API.run_job('vote.votecast', {
"pk": "post-id",
"sk": "post-id",
"voteType": "up"
"parent": {
"pk": "post#abc123",
"sk": "post#abc123",
"slug": "my-post-slug",
"entity": "post"
},
"vote": "up"
})
```
@ -402,20 +409,21 @@ reaction = API.run_job('reaction.reacttosomething', payload)
```
**Parameters:**
- `objectPK` (str): Object partition key
- `objectSK` (str): Object sort key
- `objectType` (str): Type of object ("post", "comment", etc.)
- `reactionType` (str): Reaction type (depends on API)
- `parent` (dict): Object containing `pk` and `sk` keys
- `pk` (str): Object partition key
- `sk` (str): Object sort key
- `reaction` (str): Reaction type (e.g., "like", "heart", "fire")
**Returns:** dict - Reaction status
**Example:**
```python
reacted = API.run_job('reaction.reacttosomething', {
"objectPK": "post-id",
"objectSK": "post-id",
"objectType": "post",
"reactionType": "like"
"parent": {
"pk": "post-id",
"sk": "post-id"
},
"reaction": "like"
})
```
@ -423,16 +431,21 @@ reacted = API.run_job('reaction.reacttosomething', {
### reaction.getbyparent()
Get reactions by parent object.
Get a specific reaction by parent sort key.
```python
reactions = API.run_job('reaction.getbyparent', parent_id)
reactions = API.run_job('reaction.getbyparent', parent_sk)
```
**Parameters:**
- `objectId` (str): Parent object ID
- `parent_sk` (str): Parent sort key (not full ID)
**Returns:** dict - List of reactions
**Returns:** dict - Reaction data
**Example:**
```python
reaction = API.run_job('reaction.getbyparent', "post#my-post-slug")
```
---
@ -441,15 +454,19 @@ reactions = API.run_job('reaction.getbyparent', parent_id)
List all reactions for a parent object.
```python
reactions = API.run_job('reaction.listbyparent', parent_id)
reactions = API.run_job('reaction.listbyparent', parent_sk)
```
**Parameters:**
- `parentPK` (str): Parent partition key
- `parentSK` (str): Parent sort key
- `parent_sk` (str): Parent sort key (not full ID)
**Returns:** dict - List of reactions
**Example:**
```python
reactions = API.run_job('reaction.listbyparent', "post#my-post-slug")
```
---
## Notification Jobs
@ -509,19 +526,21 @@ trust = API.run_job('trust.createorupdate', payload)
```
**Parameters:**
- `pk` (str): Trust identifier (partition key)
- `sk` (str): Trust identifier (sort key)
- `trustType` (str): Trust type ("positive", "negative", etc.)
- Other optional fields
- `parent` (dict): Object containing `pk` and `sk` for the userprofile
- `parentSlug` (str): Slug of the userprofile
- `trustLevel` (str): Trust level (e.g., "trusted", "neutral", "distrusted")
**Returns:** dict - Trust relationship status
**Example:**
```python
trust = API.run_job('trust.createorupdate', {
"pk": "trust-id-123",
"sk": "trust-id-123",
"trustType": "positive"
"parent": {
"pk": "userprofile#philosopher-jon",
"sk": "userprofile#philosopher-jon"
},
"parentSlug": "philosopher-jon",
"trustLevel": "trusted"
})
```
@ -532,17 +551,18 @@ trust = API.run_job('trust.createorupdate', {
Lists trust relationships initialized by a user.
```python
trusts = API.run_job('trust.listbyusersinit', username)
trusts = API.run_job('trust.listbyusersinit', user_id)
```
**Parameters:**
- `username` (str): The user whose trust relationships to list
- `user_id` (str): The user ID (not username) whose trust relationships to list
- `lastEvaluatedKey` (dict, optional): Pagination key
**Returns:** dict - List of trust relationships
**Example:**
```python
my_trusts = API.run_job('trust.listbyusersinit', "your-username")
my_trusts = API.run_job('trust.listbyusersinit', "user-id-123")
```
---
@ -552,11 +572,11 @@ my_trusts = API.run_job('trust.listbyusersinit', "your-username")
Lists trust relationships where a user was the target.
```python
trusts = API.run_job('trust.listbyuserhas', username)
trusts = API.run_job('trust.listbyuserhas', user_id)
```
**Parameters:**
- `username` (str): The user who was targeted
- `user_id` (str): The user ID (not username) who was targeted
**Returns:** dict - List of trust relationships
@ -653,35 +673,21 @@ print(f"Following feed items: {len(following_feed.get('Items', []))}")
## Block Jobs
Block users or content.
### ⚠️ NOT IMPLEMENTED
### block.[notimplemented]
Block functionality is not yet implemented in this wrapper. The TrustCafé API may support blocking, but no job or wrapper functions exist yet.
Block functionality is defined in the backend but not yet implemented in the wrapper.
**Status:** TODO
**Implementation needed:**
- Job function creation
- Payload structure definition
- Error handling
**Status:** TODO - See development.md for details
---
## Mute Jobs
Mute users or content.
### ⚠️ NOT IMPLEMENTED
### mute.[notimplemented]
Mute functionality is not yet implemented in this wrapper. The TrustCafé API may support muting, but no job or wrapper functions exist yet.
Mute functionality is pending implementation.
**Status:** TODO
**Implementation needed:**
- Job function creation
- Payload structure definition
- Error handling
**Status:** TODO - See development.md for details
---

View file

@ -118,7 +118,7 @@ If you can't find the answer you're looking for:
1. **Check the FAQs section** - Common questions and answers
2. **Review the Troubleshooting guide** - For specific error handling
3. **Contact WikiTribune team** - Via company channels
4. **File an issue on GitLab** - [Repository Issues](https://gitlab.com/trustcafe/trustcafe-api-wrapper/-/issues)
4. **File an issue on Forgejo** - [Repository Issues](https://git.jezzahehn.com/KrustyPlanet/trustcafe-api-wrapper/issues)
---
@ -128,7 +128,7 @@ Document version updates should be listed here.
### v0.2.0 (Current)
- Complete rewrite and enhancement of all documentation
- Added comprehensive API reference
- Added full API reference
- Added wrappers guide
- Added custom requests guide
- Added detailed troubleshooting section
@ -159,4 +159,4 @@ When contributing documentation remember:
---
**Last Updated:** April 17, 2026
**Last Updated:** April 18, 2026

View file

@ -729,8 +729,8 @@ requests_log.propagate = True
If you've tried all of the above and still have issues:
1. **Check the Code**: Review the latest version on GitLab
- [GitLab Repository](https://gitlab.com/trustcafe/trustcafe-api-wrapper)
1. **Check the Code**: Review the latest version on Forgejo
- [Forgejo Repository](https://git.jezzahehn.com/KrustyPlanet/trustcafe-api-wrapper)
2. **Check TrustCafé Status**: Verify services are up
- [Production](https://trustcafe.io)

View file

@ -157,8 +157,9 @@ Updates an existing post.
from trustcafeapiwrapper.wrappers.post.update_post import update_post
API.wrapped(update_post(
post_id="post-uuid",
new_post_text="New post content"
post_text="New post content",
post_path="my-post-slug", # OR use post_key
parent_path="/"
))
```
@ -166,15 +167,19 @@ API.wrapped(update_post(
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `post_id` | str | **Required** | The post to update (pk/sk) |
| `new_post_text` | str | **Required** | The new post content |
| Optional fields per the API (e.g., blurLabel, cardUrl, etc.)
| `post_text` | str | **Required** | The new post content |
| `post_path` | str | `None` | The slug of the post to update |
| `parent_path` | str | `'/'` | Parent path for the post |
| `post_key` | dict | `None` | Direct pk/sk dict if you have it |
| `blur_label` | str | `None` | Optional blur label for content |
| `card_url` | str | `None` | Optional URL for link preview card |
| `collaborative` | bool | `False` | Enable collaborative editing |
**Returns:** dict - Updated post data
**Returns:** dict - Job specification for update operation
**Important:** The post_id parameter should be set to the post's pk/sk. The wrapper internally maps the update parameters to the API's update payload structure.
**Important:** You must provide either `post_key` OR both `post_path` and `parent_path`.
**Example - Update Text:**
**Example - Update with Path:**
```python
from trustcafeapiwrapper.wrappers.post.update_post import update_post
@ -182,31 +187,33 @@ from trustcafeapiwrapper.wrappers.post.update_post import update_post
API.handle_token()
API.wrapped(update_post(
post_id="current-pk-same-as-sk",
new_post_text="Updated content here"
post_text="Updated content here",
post_path="my-post-slug",
parent_path="/music"
))
```
**Example - Update with Optional Fields:**
**Example - Update with Key:**
```python
API.wrapped(update_post(
post_id="current-pk-same-as-sk",
new_post_text="Updated with new card",
card_url="https://example.com/resource"
post_text="Updated with key",
post_key={"pk": "post#123", "sk": "post#123"}
))
```
**Example - Update Blur Label:**
**Example - Update with Blur:**
```python
API.wrapped(update_post(
post_id="current-pk-same-as-sk",
blur_label="sensitive"
post_text="Sensitive content",
post_path="my-post",
parent_path="/",
blur_label="nsfw"
))
```
See update_post.py for mapping of updated fields to the server payload.
See update_post.py for full implementation details.
## Comment Wrappers
@ -217,9 +224,17 @@ Creates a new comment on a post.
```python
from trustcafeapiwrapper.wrappers.comment.create_comment import create_comment
# Option 1: Using post_key
API.wrapped(create_comment(
comment_text="This is a comment",
parent_path="/"
post_key={"pk": "post#123", "sk": "post#123"}
))
# Option 2: Using parent_path + post_slug
API.wrapped(create_comment(
comment_text="This is a comment",
parent_path="/userprofile/my-username",
post_slug="my-post-slug"
))
```
@ -228,11 +243,17 @@ API.wrapped(create_comment(
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `comment_text` | str | **Required** | The comment content |
| `parent_path` | str | **Required** | Path to the parent post where comment will be created |
| `post_slug` | str | `None` | Slug of the post to comment on (required if not using post_key) |
| `parent_path` | str | `None` | Path in format `'userprofile/slug'` or `'subwiki/slug'` |
| `post_key` | dict | `None` | Direct pk/sk dict for the post |
| `blur_label` | str | `None` | Optional blur label for content |
| `version` | int | `3` | Comment structure version |
**Returns:** dict - Job execution result, contains success information
**Returns:** dict - Job specification for create operation
**Example - Basic Comment:**
**Important:** You must provide either `post_key` OR both `parent_path` AND `post_slug`.
**Example - Using post_key:**
```python
from trustcafeapiwrapper.wrappers.comment.create_comment import create_comment
@ -240,30 +261,29 @@ from trustcafeapiwrapper.wrappers.comment.create_comment import create_comment
API.handle_token()
API.wrapped(create_comment(
"Great post! I really enjoyed reading it.",
parent_path="/"
comment_text="Great post! I really enjoyed reading it.",
post_key={"pk": "post#abc123", "sk": "post#abc123"}
))
```
**Example - Comment on a Post:**
**Example - Using parent_path and post_slug:**
```python
# First get the post to find its path
post = API.run_job('post.get', "target-post-id")
# Then create a comment
API.wrapped(create_comment(
"I agree with your point about this.",
parent_path="/music" # Path to the post
comment_text="I agree with your point.",
parent_path="/userprofile/philosopher-jon",
post_slug="my-thoughts-on-truth"
))
```
**Example - Collaborative Comment:**
**Example - With blur label:**
```python
API.wrapped(create_comment(
"Let's work on this together!",
parent_path="/current-post"
comment_text="Spoiler content warning.",
parent_path="/subwiki/movies",
post_slug="movie-review",
blur_label="spoiler"
))
```
@ -489,6 +509,205 @@ result = create_in_branch(API, "music", "New music discussion")
result = create_in_branch(API, "science", "Research paper abstract", create_card=True)
```
## Follow Wrappers
### follow()
Follow or unfollow a user or subwiki.
```python
from trustcafeapiwrapper.wrappers.follow.follow import follow
API.wrapped(follow(
entity="userprofile",
is_following=True,
parent_slug="philosopher-jon"
))
```
**Parameters:**
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `entity` | str | **Required** | Type of entity: `'userprofile'` or `'subwiki'` |
| `is_following` | bool | **Required** | `True` to follow, `False` to unfollow |
| `parent_slug` | str | **Required** | Slug of the user or subwiki to follow |
**Returns:** dict - Job specification for follow operation
**Example - Follow a user:**
```python
from trustcafeapiwrapper.wrappers.follow.follow import follow
API.handle_token()
API.wrapped(follow(
entity="userprofile",
is_following=True,
parent_slug="philosopher-jon"
))
```
**Example - Unfollow a subwiki:**
```python
API.wrapped(follow(
entity="subwiki",
is_following=False,
parent_slug="music"
))
```
---
## Trust Wrappers
### trust()
Set trust level for a user.
```python
from trustcafeapiwrapper.wrappers.trust.trust import trust
API.wrapped(trust(
trustLevel="trusted",
userprofile_path="/userprofile/philosopher-jon"
))
```
**Parameters:**
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `trustLevel` | str | **Required** | Trust level to set (e.g., `'trusted'`, `'neutral'`, `'distrusted'`) |
| `userprofile_path` | str | **Required** | Path to the user profile |
**Returns:** dict - Job specification for trust operation
**Example:**
```python
from trustcafeapiwrapper.wrappers.trust.trust import trust
API.handle_token()
API.wrapped(trust(
trustLevel="trusted",
userprofile_path="/userprofile/some-user"
))
```
---
## Vote Wrappers
### votecast()
Cast a vote on a post or comment.
```python
from trustcafeapiwrapper.wrappers.vote.votecast import votecast
# Option 1: Using item_key
API.wrapped(votecast(
vote="up",
item_key={"pk": "post#123", "sk": "post#123"}
))
# Option 2: Using parent_path and item_path
API.wrapped(votecast(
vote="down",
parent_path="/userprofile/my-username",
item_path="my-post-slug"
))
```
**Parameters:**
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `vote` | str | **Required** | Vote type: `'up'` or `'down'` |
| `parent_path` | str | `None` | Parent path (required if not using item_key) |
| `item_path` | str | `None` | Item slug (required if not using item_key) |
| `item_key` | dict | `None` | Direct pk/sk dict for the item |
**Returns:** dict - Job specification for vote operation
**Example - Upvote with key:**
```python
from trustcafeapiwrapper.wrappers.vote.votecast import votecast
API.handle_token()
API.wrapped(votecast(
vote="up",
item_key={"pk": "post#abc", "sk": "post#abc"}
))
```
**Example - Downvote with paths:**
```python
API.wrapped(votecast(
vote="down",
parent_path="/subwiki/politics",
item_path="controversial-post"
))
```
---
## Reaction Wrappers
### react()
React to a post or comment.
```python
from trustcafeapiwrapper.wrappers.reaction.react import react
# Option 1: Using item_key
API.wrapped(react(
reaction_type="like",
item_key={"pk": "post#123", "sk": "post#123"}
))
# Option 2: Using parent_path and item_path
API.wrapped(react(
reaction_type="heart",
parent_path="/userprofile/my-username",
item_path="my-post-slug"
))
```
**Parameters:**
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `reaction_type` | str | **Required** | Type of reaction (e.g., `'like'`, `'heart'`, `'fire'`) |
| `parent_path` | str | `None` | Parent path (required if not using item_key) |
| `item_path` | str | `None` | Item slug (required if not using item_key) |
| `item_key` | dict | `None` | Direct pk/sk dict for the item |
**Returns:** dict - Job specification for reaction operation
**Important:** You must provide either `item_key` OR both `parent_path` AND `item_path`.
**Example:**
```python
from trustcafeapiwrapper.wrappers.reaction.react import react
API.handle_token()
API.wrapped(react(
reaction_type="fire",
item_key={"pk": "post#123", "sk": "post#123"}
))
```
---
## Summary