Skip to content

Commit 44ede7c

Browse files
authored
Merge pull request #18 from franccesco/feat/add-archived-status-to-todos-and-issues
feat: add archived status to todos and issues
2 parents 43472c2 + a7dac33 commit 44ede7c

8 files changed

Lines changed: 17 additions & 1 deletion

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "bloomy-python"
3-
version = "0.21.2"
3+
version = "0.22.0"
44
description = "Python SDK for Bloom Growth API"
55
readme = "README.md"
66
authors = [{ name = "Franccesco Orozco", email = "franccesco@codingdose.info" }]

src/bloomy/models.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ def _parse_optional_float(v: Any) -> float | None:
3636
# Reusable annotated types for optional fields that may come as empty strings
3737
OptionalDatetime = Annotated[datetime | None, BeforeValidator(_parse_optional_datetime)]
3838
OptionalFloat = Annotated[float | None, BeforeValidator(_parse_optional_float)]
39+
# Coerces a nullable value (e.g. a datetime or None) into a bool (present = True)
40+
IsPresent = Annotated[bool, BeforeValidator(lambda v: v is not None and v != "")]
3941

4042

4143
class GoalStatus(StrEnum):
@@ -157,6 +159,7 @@ class Todo(BloomyBaseModel):
157159
meeting_id: int | None = Field(alias="OriginId", default=None)
158160
meeting_name: str | None = Field(alias="Origin", default=None)
159161
complete: bool = Field(alias="Complete", default=False)
162+
archived: IsPresent = Field(alias="CloseTime", default=False)
160163

161164

162165
class Issue(BloomyBaseModel):
@@ -301,6 +304,7 @@ class IssueDetails(BloomyBaseModel):
301304
notes_url: str
302305
created_at: str
303306
completed_at: str | None = None
307+
archived: bool = False
304308
meeting_id: int
305309
meeting_title: str
306310
user_id: int
@@ -314,6 +318,7 @@ class IssueListItem(BloomyBaseModel):
314318
title: str
315319
notes_url: str
316320
created_at: str
321+
archived: bool = False
317322
meeting_id: int
318323
meeting_title: str | None
319324

src/bloomy/operations/async_/todos.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ async def create(
120120
"DetailsUrl": data.get("DetailsUrl"),
121121
"DueDate": data.get("DueDate"),
122122
"CompleteTime": None,
123+
"CloseTime": None,
123124
"CreateTime": data.get("CreateTime", datetime.now(UTC).isoformat()),
124125
"OriginId": meeting_id,
125126
"Origin": None,

src/bloomy/operations/mixins/issues_transform.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def _transform_issue_details(self, data: dict[str, Any]) -> IssueDetails:
3333
notes_url=data["DetailsUrl"],
3434
created_at=data["CreateTime"],
3535
completed_at=data["CloseTime"],
36+
archived=data["Archived"],
3637
meeting_id=data["OriginId"],
3738
meeting_title=data["Origin"],
3839
user_id=data["Owner"]["Id"],
@@ -57,6 +58,7 @@ def _transform_issue_list(
5758
title=issue["Name"],
5859
notes_url=issue["DetailsUrl"],
5960
created_at=issue["CreateTime"],
61+
archived=issue["Archived"],
6062
meeting_id=issue["OriginId"],
6163
meeting_title=issue["Origin"],
6264
)

src/bloomy/operations/todos.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ def create(
120120
"DetailsUrl": data.get("DetailsUrl"),
121121
"DueDate": data.get("DueDate"),
122122
"CompleteTime": None,
123+
"CloseTime": None,
123124
"CreateTime": data.get("CreateTime", datetime.now(UTC).isoformat()),
124125
"OriginId": meeting_id,
125126
"Origin": None,

tests/conftest.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ def sample_todo_data() -> dict[str, Any]:
107107
"Complete": False,
108108
"CreateTime": "2024-01-01T10:00:00Z",
109109
"CompleteTime": None,
110+
"CloseTime": None,
110111
"Owner": {"Id": 123, "Name": "John Doe"},
111112
}
112113

@@ -170,6 +171,7 @@ def sample_issue_data() -> dict[str, Any]:
170171
"CreateTime": "2024-06-01T10:00:00Z",
171172
"CloseTime": None,
172173
"Complete": False,
174+
"Archived": False,
173175
"Owner": {"Id": 123, "Name": "John Doe"},
174176
"Origin": "Infrastructure Meeting",
175177
"OriginId": 456,

tests/test_adversarial_issues_headlines.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,7 @@ def test_owner_is_none_raises_type_error(self) -> None:
389389
"DetailsUrl": "http://example.com",
390390
"CreateTime": "2024-01-01",
391391
"CloseTime": None,
392+
"Archived": False,
392393
"OriginId": 10,
393394
"Origin": "Meeting",
394395
"Owner": None,
@@ -405,6 +406,7 @@ def test_close_time_none_succeeds(self) -> None:
405406
"DetailsUrl": "http://example.com",
406407
"CreateTime": "2024-01-01",
407408
"CloseTime": None,
409+
"Archived": False,
408410
"OriginId": 10,
409411
"Origin": "Meeting",
410412
"Owner": {"Id": 1, "Name": "John"},
@@ -421,6 +423,7 @@ def test_close_time_empty_string(self) -> None:
421423
"DetailsUrl": "http://example.com",
422424
"CreateTime": "2024-01-01",
423425
"CloseTime": "",
426+
"Archived": False,
424427
"OriginId": 10,
425428
"Origin": "Meeting",
426429
"Owner": {"Id": 1, "Name": "John"},

tests/test_issues.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ def test_list_user_issues(self, mock_http_client: Mock, mock_user_id: Mock) -> N
4141
"Origin": "Infrastructure Meeting",
4242
"OriginId": 456,
4343
"DetailsUrl": "https://example.com/issue/401",
44+
"Archived": False,
4445
}
4546
]
4647
mock_http_client.get.return_value = mock_response
@@ -68,6 +69,7 @@ def test_list_meeting_issues(self, mock_http_client: Mock) -> None:
6869
"Origin": "Infrastructure Meeting",
6970
"OriginId": 456,
7071
"DetailsUrl": "https://example.com/issue/401",
72+
"Archived": False,
7173
}
7274
]
7375
mock_http_client.get.return_value = mock_response

0 commit comments

Comments
 (0)