pyvikunja 0.7__tar.gz → 0.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pyvikunja
3
- Version: 0.7
3
+ Version: 0.9
4
4
  Summary: A Python wrapper for Vikunja API
5
5
  Author: Joseph Shufflebotham
6
6
  License: AGPL
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pyvikunja"
7
- version = "0.7"
7
+ version = "0.9"
8
8
  description = "A Python wrapper for Vikunja API"
9
9
  authors = [
10
10
  {name = "Joseph Shufflebotham"}
@@ -74,6 +74,22 @@ class VikunjaAPI:
74
74
  logger.error(f"Unexpected error occurred: {e} | URL: {url}")
75
75
  return None
76
76
 
77
+ async def ping(self) -> bool:
78
+ """Tests if the API key is valid by calling the /projects endpoint."""
79
+ """Not chosen the /user endpoint here because it was always returning 401 with an API Token"""
80
+ url = f"{self.api_base_url}/projects"
81
+
82
+ try:
83
+ response = await self.client.get(url, headers=self.headers, timeout=10)
84
+ response.raise_for_status()
85
+
86
+ if response.status_code == 200:
87
+ return True
88
+ else:
89
+ raise httpx.HTTPError(f"Non-200 Response from server {response.status_code}")
90
+ except httpx.HTTPError as e:
91
+ raise e
92
+
77
93
  # Projects
78
94
  async def get_projects(self, page: int = 1, per_page: int = 20) -> List[Project]:
79
95
  response = await self._request("GET", "/projects", params={"page": page, "per_page": per_page})
@@ -1,7 +1,7 @@
1
- from enum import Enum
1
+ from enum import IntEnum
2
2
 
3
3
 
4
- class RepeatMode(Enum):
4
+ class RepeatMode(IntEnum):
5
5
  DEFAULT = 0
6
6
  MONTHLY = 1
7
7
  FROM_CURRENT_DATE = 2
@@ -33,6 +33,23 @@ class Task(BaseModel):
33
33
  self.labels: List[Label] = [Label(label_data) for label_data in data.get('labels', []) or []]
34
34
  self.assignees: List[User] = [User(user_data) for user_data in data.get('assignees', []) or []]
35
35
 
36
+ # Parse repeat_mode into an enum
37
+ self.repeat_mode: RepeatMode = self._parse_repeat_mode(data.get('repeat_mode'))
38
+
39
+ # Parse repeat_after into timedelta
40
+ self.repeat_after: Optional[timedelta] = self._parse_repeat_after(data.get('repeat_after'))
41
+
42
+ def _parse_repeat_mode(self, mode: Optional[int]) -> Optional[RepeatMode]:
43
+ """Convert repeat_mode integer into an Enum value, defaulting to NONE."""
44
+ try:
45
+ return RepeatMode(mode) if mode is not None else None
46
+ except ValueError:
47
+ return None
48
+
49
+ def _parse_repeat_after(self, seconds: Optional[int]) -> Optional[timedelta]:
50
+ """Convert repeat_after seconds into a timedelta."""
51
+ return timedelta(seconds=seconds) if seconds else None
52
+
36
53
  async def update(self, data: Dict) -> 'Task':
37
54
  # Merge self.data with the new data (data overrides keys in self.data)
38
55
  combined = {**self.data, **data}
@@ -94,12 +111,14 @@ class Task(BaseModel):
94
111
  iso_date = str(date.isoformat())
95
112
  return await self.update({'end_date': iso_date})
96
113
 
97
- async def set_repeating_interval(self, interval: timedelta, mode: RepeatMode = RepeatMode.DEFAULT) -> 'Task':
98
- # Convert the timedelta to total seconds
99
- total_seconds = int(interval.total_seconds())
100
- # Update the repeating interval for the task
114
+ async def set_repeating_interval(self, interval: Optional[timedelta] = None, mode: Optional[RepeatMode] = None) -> 'Task':
115
+ new_interval = interval if interval else self.repeat_after
116
+ total_seconds = int(new_interval.total_seconds())
117
+
118
+ new_mode = mode if mode else self.repeat_mode
119
+
101
120
  return await self.update({'repeat_after': total_seconds,
102
- 'repeat_mode': mode.value})
121
+ 'repeat_mode': new_mode.value})
103
122
 
104
123
  async def delete_task(self) -> Dict:
105
124
  return await self.api.delete_task(self.id)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pyvikunja
3
- Version: 0.7
3
+ Version: 0.9
4
4
  Summary: A Python wrapper for Vikunja API
5
5
  Author: Joseph Shufflebotham
6
6
  License: AGPL
File without changes
File without changes
File without changes
File without changes