Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,6 @@ stages:
- pip install -r test-requirements.txt
- pytest --cov=plane

pytest-3.7:
extends: .pytest
image: python:3.7-alpine
pytest-3.8:
extends: .pytest
image: python:3.8-alpine
pytest-3.9:
extends: .pytest
image: python:3.9-alpine
Expand All @@ -29,3 +23,9 @@ pytest-3.10:
pytest-3.11:
extends: .pytest
image: python:3.11-alpine
pytest-3.12:
extends: .pytest
image: python:3.12-alpine
pytest-3.13:
extends: .pytest
image: python:3.13-alpine
6 changes: 3 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# ref: https://docs.travis-ci.com/user/languages/python
language: python
python:
- "3.7"
- "3.8"
- "3.9"
- "3.10"
- "3.11"
- "3.12"
- "3.13"
# uncomment the following if needed
#- "3.11-dev" # 3.11 development branch
#- "3.13-dev" # 3.13 development branch
Comment on lines +7 to +10
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add explicit Ubuntu image to ensure Python 3.13 availability on Travis.

Travis may not provision 3.13 on older dist images. Recommend setting dist: jammy (or the current Travis image that supports 3.13) to avoid interpreter resolution failures.

Apply at the top of the file:

+dist: jammy
🤖 Prompt for AI Agents
In .travis.yml around lines 7 to 10, Travis may not provision Python 3.13 on
older default dist images; add an explicit dist (e.g., dist: jammy) at the top
of the file so the build uses an Ubuntu image that provides Python 3.13. Update
the file to set the dist key before the python versions list, choosing a current
Travis Ubuntu release that supports 3.13, and ensure indentation/position
follows Travis YAML schema.

#- "nightly" # nightly build
# command to install dependencies
install:
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ The Plane REST API
Visit our quick start guide and full API documentation at [developers.plane.so](https://developers.plane.so/api-reference/introduction).

- API version: 0.0.1
- Package version: 0.1.6
- Package version: 0.1.7
- Generator version: 7.13.0
- Build package: org.openapitools.codegen.languages.PythonPydanticV1ClientCodegen
- Build package: org.openapitools.codegen.languages.PythonClientCodegen
For more information, please visit [https://plane.so](https://plane.so)

## Requirements.

Python 3.7+
Python 3.9+
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Confirm packaging metadata matches Python 3.9+ bump.

Ensure python_requires and Trove classifiers reflect 3.9+ in pyproject.toml/setup.cfg/setup.py to avoid installing on unsupported interpreters.


🏁 Script executed:

#!/bin/bash
# Verify python_requires and classifiers advertise >=3.9
rg -nP 'python_requires\s*=\s*["'\'']>=? ?3\.9' -g 'pyproject.toml setup.cfg setup.py'
rg -nP 'Programming Language :: Python :: 3\.(9|10|11|12|13)' -g 'pyproject.toml setup.cfg setup.py' -C2

Length of output: 493


🏁 Script executed:

#!/bin/bash
# Locate packaging metadata files and verify Python requirement and Trove classifiers
files=$(fd -HI --type f '^(pyproject\.toml|setup\.cfg|setup\.py)$')
if [ -z "$files" ]; then
  echo "No packaging config files found"
  exit 0
fi
echo "Found config files:"
echo "$files"
for f in $files; do
  echo "------ $f ------"
  rg -n "python_requires" "$f" || echo "  ❌ No python_requires in $f"
  rg -n "Programming Language :: Python :: 3" "$f" || echo "  ❌ No Trove classifiers in $f"
done

Length of output: 1305


Add Python 3.9+ requirement to packaging metadata
The project’s pyproject.toml, setup.cfg, and setup.py all lack a python_requires declaration and Trove classifiers matching the “Python 3.9+” bump in README. Update your packaging files to include:

  • python_requires = ">=3.9"
  • classifiers:
    • Programming Language :: Python :: 3.9
    • Programming Language :: Python :: 3.10
    • …etc., up to the highest supported Python version.
🤖 Prompt for AI Agents
In README.md around line 14, the README states "Python 3.9+" but your packaging
metadata (pyproject.toml, setup.cfg, and setup.py) lacks python_requires and
matching Trove classifiers; update each packaging file to include
python_requires = ">=3.9" (or equivalent syntax for that file) and add
Programming Language :: Python :: 3.9 plus classifiers for each supported minor
version up to the highest you support (e.g., 3.10, 3.11, etc.), ensuring the
syntax matches the file format (pyproject.toml table keys, setup.cfg [options]
and [metadata] classifiers, and setup.py setup(... classifiers=[]) so package
metadata and README remain consistent.


## Installation & Usage
### pip install
Expand Down
30 changes: 18 additions & 12 deletions docs/AssetsApi.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,8 @@ Generate presigned URL for generic asset upload
* Api Key Authentication (ApiKeyAuthentication):
* OAuth Authentication (OAuth2Authentication):
* OAuth Authentication (OAuth2Authentication):

```python
import time
import os
import plane
from plane.models.generic_asset_upload_request import GenericAssetUploadRequest
from plane.rest import ApiException
Expand Down Expand Up @@ -71,6 +70,7 @@ with plane.ApiClient(configuration) as api_client:

### Parameters


Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**slug** | **str**| Workspace slug |
Expand All @@ -90,6 +90,7 @@ void (empty response body)
- **Accept**: Not defined

### HTTP response details

| Status code | Description | Response headers |
|-------------|-------------|------------------|
**401** | Authentication credentials were not provided or are invalid. | - |
Expand All @@ -113,9 +114,8 @@ Generate presigned URL for user asset upload
* Api Key Authentication (ApiKeyAuthentication):
* OAuth Authentication (OAuth2Authentication):
* OAuth Authentication (OAuth2Authentication):

```python
import time
import os
import plane
from plane.models.user_asset_upload_request import UserAssetUploadRequest
from plane.rest import ApiException
Expand Down Expand Up @@ -159,6 +159,7 @@ with plane.ApiClient(configuration) as api_client:

### Parameters


Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**user_asset_upload_request** | [**UserAssetUploadRequest**](UserAssetUploadRequest.md)| |
Expand All @@ -177,6 +178,7 @@ void (empty response body)
- **Accept**: Not defined

### HTTP response details

| Status code | Description | Response headers |
|-------------|-------------|------------------|
**401** | Authentication credentials were not provided or are invalid. | - |
Expand All @@ -201,9 +203,8 @@ This performs a soft delete by marking the asset as deleted and updating the use
* Api Key Authentication (ApiKeyAuthentication):
* OAuth Authentication (OAuth2Authentication):
* OAuth Authentication (OAuth2Authentication):

```python
import time
import os
import plane
from plane.rest import ApiException
from pprint import pprint
Expand Down Expand Up @@ -246,6 +247,7 @@ with plane.ApiClient(configuration) as api_client:

### Parameters


Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**asset_id** | **str**| Asset ID |
Expand All @@ -264,6 +266,7 @@ void (empty response body)
- **Accept**: Not defined

### HTTP response details

| Status code | Description | Response headers |
|-------------|-------------|------------------|
**401** | Authentication credentials were not provided or are invalid. | - |
Expand All @@ -285,9 +288,8 @@ Get presigned URL for asset download
* Api Key Authentication (ApiKeyAuthentication):
* OAuth Authentication (OAuth2Authentication):
* OAuth Authentication (OAuth2Authentication):

```python
import time
import os
import plane
from plane.rest import ApiException
from pprint import pprint
Expand Down Expand Up @@ -331,6 +333,7 @@ with plane.ApiClient(configuration) as api_client:

### Parameters


Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**asset_id** | **str**| |
Expand All @@ -350,6 +353,7 @@ void (empty response body)
- **Accept**: Not defined

### HTTP response details

| Status code | Description | Response headers |
|-------------|-------------|------------------|
**401** | Authentication credentials were not provided or are invalid. | - |
Expand All @@ -372,9 +376,8 @@ Update generic asset after upload completion
* Api Key Authentication (ApiKeyAuthentication):
* OAuth Authentication (OAuth2Authentication):
* OAuth Authentication (OAuth2Authentication):

```python
import time
import os
import plane
from plane.models.patched_generic_asset_update_request import PatchedGenericAssetUpdateRequest
from plane.rest import ApiException
Expand Down Expand Up @@ -420,6 +423,7 @@ with plane.ApiClient(configuration) as api_client:

### Parameters


Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**asset_id** | **str**| Asset ID |
Expand All @@ -440,6 +444,7 @@ void (empty response body)
- **Accept**: Not defined

### HTTP response details

| Status code | Description | Response headers |
|-------------|-------------|------------------|
**401** | Authentication credentials were not provided or are invalid. | - |
Expand All @@ -461,9 +466,8 @@ Mark user asset as uploaded
* Api Key Authentication (ApiKeyAuthentication):
* OAuth Authentication (OAuth2Authentication):
* OAuth Authentication (OAuth2Authentication):

```python
import time
import os
import plane
from plane.models.patched_asset_update_request import PatchedAssetUpdateRequest
from plane.rest import ApiException
Expand Down Expand Up @@ -508,6 +512,7 @@ with plane.ApiClient(configuration) as api_client:

### Parameters


Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**asset_id** | **str**| Asset ID |
Expand All @@ -527,6 +532,7 @@ void (empty response body)
- **Accept**: Not defined

### HTTP response details

| Status code | Description | Response headers |
|-------------|-------------|------------------|
**401** | Authentication credentials were not provided or are invalid. | - |
Expand Down
3 changes: 2 additions & 1 deletion docs/Cycle.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
Cycle serializer with comprehensive project metrics and time tracking. Provides cycle details including work item counts by status, progress estimates, and time-bound iteration data for project management and sprint planning.

## Properties

Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**id** | **str** | | [optional] [readonly]
Expand Down Expand Up @@ -47,7 +48,7 @@ json = "{}"
# create an instance of Cycle from a JSON string
cycle_instance = Cycle.from_json(json)
# print the JSON string representation of the object
print Cycle.to_json()
print(Cycle.to_json())
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix example: print instance JSON

Match the variable created above.

Apply:

-print(Cycle.to_json())
+print(cycle_instance.to_json())
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
print(Cycle.to_json())
print(cycle_instance.to_json())
🤖 Prompt for AI Agents
In docs/Cycle.md around line 51, the example calls the class method
print(Cycle.to_json()) but should call the instance created earlier; replace
that call with printing the instance's JSON (e.g., print(cycle.to_json())) so it
matches the variable created above.


# convert the object into a dict
cycle_dict = cycle_instance.to_dict()
Expand Down
3 changes: 2 additions & 1 deletion docs/CycleCreateRequest.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
Serializer for creating cycles with timezone handling and date validation. Manages cycle creation including project timezone conversion, date range validation, and UTC normalization for time-bound iteration planning and sprint management.

## Properties

Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**name** | **str** | |
Expand All @@ -24,7 +25,7 @@ json = "{}"
# create an instance of CycleCreateRequest from a JSON string
cycle_create_request_instance = CycleCreateRequest.from_json(json)
# print the JSON string representation of the object
print CycleCreateRequest.to_json()
print(CycleCreateRequest.to_json())
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix example: use the created instance when printing JSON

Use the instance variable defined above.

Apply:

-print(CycleCreateRequest.to_json())
+print(cycle_create_request_instance.to_json())
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
print(CycleCreateRequest.to_json())
print(cycle_create_request_instance.to_json())
🤖 Prompt for AI Agents
In docs/CycleCreateRequest.md around line 28, the example is calling
CycleCreateRequest.to_json() on the class rather than the instance; update the
print call to use the previously created instance variable (e.g.,
print(c.to_json())) so the JSON is produced from the actual object.


# convert the object into a dict
cycle_create_request_dict = cycle_create_request_instance.to_dict()
Expand Down
3 changes: 2 additions & 1 deletion docs/CycleIssue.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
Serializer for cycle-issue relationships with sub-issue counting. Manages the association between cycles and work items, including hierarchical issue tracking for nested work item structures.

## Properties

Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**id** | **str** | | [optional] [readonly]
Expand All @@ -27,7 +28,7 @@ json = "{}"
# create an instance of CycleIssue from a JSON string
cycle_issue_instance = CycleIssue.from_json(json)
# print the JSON string representation of the object
print CycleIssue.to_json()
print(CycleIssue.to_json())
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Call to_json() on the instance, not the class.

The example constructs an instance but prints via the class.

-print(CycleIssue.to_json())
+print(cycle_issue_instance.to_json())
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
print(CycleIssue.to_json())
print(cycle_issue_instance.to_json())
🤖 Prompt for AI Agents
In docs/CycleIssue.md around line 31, the example calls to_json() on the
CycleIssue class instead of the instantiated object; change the call to invoke
to_json() on the instance created earlier (i.e., replace the class method
invocation with the instance's method call) so the printed output uses the
instance state rather than the class.


# convert the object into a dict
cycle_issue_dict = cycle_issue_instance.to_dict()
Expand Down
3 changes: 2 additions & 1 deletion docs/CycleIssueRequestRequest.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
Serializer for bulk work item assignment to cycles. Validates work item ID lists for batch operations including cycle assignment and sprint planning workflows.

## Properties

Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**issues** | **List[str]** | List of issue IDs to add to the cycle |
Expand All @@ -17,7 +18,7 @@ json = "{}"
# create an instance of CycleIssueRequestRequest from a JSON string
cycle_issue_request_request_instance = CycleIssueRequestRequest.from_json(json)
# print the JSON string representation of the object
print CycleIssueRequestRequest.to_json()
print(CycleIssueRequestRequest.to_json())
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix example: instance vs class to_json()

Use the instance created two lines above.

Apply:

-print(CycleIssueRequestRequest.to_json())
+print(cycle_issue_request_request_instance.to_json())
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
print(CycleIssueRequestRequest.to_json())
print(cycle_issue_request_request_instance.to_json())
🤖 Prompt for AI Agents
In docs/CycleIssueRequestRequest.md around line 21, the code calls the class
method CycleIssueRequestRequest.to_json() instead of the instance's to_json();
change the call to use the instance created two lines above (e.g., replace
CycleIssueRequestRequest.to_json() with the instance variable's to_json()) so
the instance data is serialized rather than the class.


# convert the object into a dict
cycle_issue_request_request_dict = cycle_issue_request_request_instance.to_dict()
Expand Down
3 changes: 2 additions & 1 deletion docs/CycleLite.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
Lightweight cycle serializer for minimal data transfer. Provides essential cycle information without computed metrics, optimized for list views and reference lookups.

## Properties

Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**id** | **str** | | [optional] [readonly]
Expand Down Expand Up @@ -38,7 +39,7 @@ json = "{}"
# create an instance of CycleLite from a JSON string
cycle_lite_instance = CycleLite.from_json(json)
# print the JSON string representation of the object
print CycleLite.to_json()
print(CycleLite.to_json())

# convert the object into a dict
cycle_lite_dict = cycle_lite_instance.to_dict()
Expand Down
Loading