Skip to content

Commit e281969

Browse files
Merge pull request #103 from pepkit/24_pop
Added pop column
2 parents 21f39f0 + 855ea3f commit e281969

File tree

11 files changed

+91
-72
lines changed

11 files changed

+91
-72
lines changed

docs/changelog.md

+5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22

33
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html) and [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) format.
44

5+
## [0.7.0] -- 2023-XX-XX
6+
- Added pop to project table and annotation model
7+
- Switched to pydantic2
8+
- Updated requirements (psycopg2 -> psycopg3)
9+
510
## [0.6.0] -- 2023-08-24
611
- Added date filter to project annotation
712

pepdbagent/_version.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.6.0"
1+
__version__ = "0.7.0a1"

pepdbagent/db_utils.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
import datetime
22
import logging
3-
from typing import Any, Optional, List
3+
from typing import Optional, List
44

55
from sqlalchemy import (
66
BigInteger,
77
FetchedValue,
8-
PrimaryKeyConstraint,
98
Result,
109
Select,
1110
String,
1211
event,
1312
select,
1413
TIMESTAMP,
1514
ForeignKey,
16-
ForeignKeyConstraint,
1715
UniqueConstraint,
1816
)
1917
from sqlalchemy.dialects.postgresql import JSON
@@ -92,6 +90,7 @@ class Projects(Base):
9290
onupdate=deliver_update_date, default=deliver_update_date
9391
)
9492
pep_schema: Mapped[Optional[str]]
93+
pop: Mapped[Optional[bool]] = mapped_column(default=False)
9594
samples_mapping: Mapped[List["Samples"]] = relationship(
9695
back_populates="sample_mapping", cascade="all, delete-orphan"
9796
)

pepdbagent/models.py

+30-33
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
# file with pydantic models
2-
import datetime
32
from typing import List, Optional, Union
4-
5-
import peppy
6-
from pydantic import BaseModel, Extra, Field, validator
3+
from pydantic import BaseModel, Extra, Field, validator, ConfigDict, field_validator
74

85

96
class AnnotationModel(BaseModel):
@@ -21,12 +18,14 @@ class AnnotationModel(BaseModel):
2118
submission_date: Optional[str]
2219
digest: Optional[str]
2320
pep_schema: Optional[str]
21+
pop: Optional[bool] = False
2422

25-
class Config:
26-
allow_population_by_field_name = True
27-
validate_assignment = True
23+
model_config = ConfigDict(
24+
validate_assignment=True,
25+
populate_by_name=True,
26+
)
2827

29-
@validator("is_private")
28+
@field_validator("is_private")
3029
def is_private_should_be_bool(cls, v):
3130
if not isinstance(v, bool):
3231
return False
@@ -71,20 +70,20 @@ class UpdateItems(BaseModel):
7170
Model used for updating individual items in db
7271
"""
7372

74-
name: Optional[str]
75-
description: Optional[str]
76-
tag: Optional[str]
77-
is_private: Optional[bool]
78-
pep_schema: Optional[str]
79-
digest: Optional[str]
80-
config: Optional[dict]
81-
samples: Optional[List[dict]]
82-
subsamples: Optional[List[List[dict]]]
83-
description: Optional[str]
84-
85-
class Config:
86-
arbitrary_types_allowed = True
87-
extra = Extra.forbid
73+
name: Optional[str] = None
74+
description: Optional[str] = None
75+
tag: Optional[str] = None
76+
is_private: Optional[bool] = None
77+
pep_schema: Optional[str] = None
78+
digest: Optional[str] = None
79+
config: Optional[dict] = None
80+
samples: Optional[List[dict]] = None
81+
subsamples: Optional[List[List[dict]]] = None
82+
83+
model_config = ConfigDict(
84+
arbitrary_types_allowed=True,
85+
extra="forbid",
86+
)
8887

8988
@property
9089
def number_of_samples(self) -> Union[int, None]:
@@ -99,37 +98,35 @@ class UpdateModel(BaseModel):
9998
Model used for updating individual items and creating sql string in the code
10099
"""
101100

102-
config: Optional[dict]
101+
config: Optional[dict] = None
103102
name: Optional[str] = None
104103
tag: Optional[str] = None
105-
private: Optional[bool] = Field(alias="is_private")
106-
digest: Optional[str]
107-
number_of_samples: Optional[int]
108-
pep_schema: Optional[str]
104+
private: Optional[bool] = Field(alias="is_private", default=None)
105+
digest: Optional[str] = None
106+
number_of_samples: Optional[int] = None
107+
pep_schema: Optional[str] = None
109108
description: Optional[str] = ""
110109
# last_update_date: Optional[datetime.datetime] = datetime.datetime.now(datetime.timezone.utc)
111110

112-
@validator("tag", "name")
111+
@field_validator("tag", "name")
113112
def value_must_not_be_empty(cls, v):
114113
if "" == v:
115114
return None
116115
return v
117116

118-
@validator("tag", "name")
117+
@field_validator("tag", "name")
119118
def value_must_be_lowercase(cls, v):
120119
if v:
121120
return v.lower()
122121
return v
123122

124-
@validator("tag", "name")
123+
@field_validator("tag", "name")
125124
def value_should_not_contain_question(cls, v):
126125
if "?" in v:
127126
return ValueError("Question mark (?) is prohibited in name and tag.")
128127
return v
129128

130-
class Config:
131-
extra = Extra.forbid
132-
allow_population_by_field_name = True
129+
model_config = ConfigDict(populate_by_name=True, extra="forbid")
133130

134131

135132
class NamespaceInfo(BaseModel):

pepdbagent/modules/annotation.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
from datetime import datetime
33
from typing import List, Literal, Optional, Union
44

5-
from sqlalchemy import Engine, and_, func, or_, select
6-
from sqlalchemy.exc import IntegrityError
5+
from sqlalchemy import and_, func, or_, select
76
from sqlalchemy.sql.selectable import Select
87

98
from pepdbagent.const import (
@@ -189,6 +188,7 @@ def _get_single_annotation(
189188
Projects.last_update_date,
190189
Projects.digest,
191190
Projects.pep_schema,
191+
Projects.pop,
192192
).where(
193193
and_(
194194
Projects.name == name,
@@ -214,6 +214,7 @@ def _get_single_annotation(
214214
last_update_date=str(query_result.last_update_date),
215215
digest=query_result.digest,
216216
pep_schema=query_result.pep_schema,
217+
pop=query_result.pop,
217218
)
218219
_LOGGER.info(f"Annotation of the project '{namespace}/{name}:{tag}' has been found!")
219220
return annot
@@ -307,6 +308,7 @@ def _get_projects(
307308
Projects.last_update_date,
308309
Projects.digest,
309310
Projects.pep_schema,
311+
Projects.pop,
310312
).select_from(Projects)
311313

312314
statement = self._add_condition(
@@ -337,6 +339,7 @@ def _get_projects(
337339
last_update_date=str(result.last_update_date),
338340
digest=result.digest,
339341
pep_schema=result.pep_schema,
342+
pop=result.pop,
340343
)
341344
)
342345
return results_list
@@ -445,7 +448,7 @@ def _add_date_filter_if_provided(
445448
return statement
446449
else:
447450
if filter_by:
448-
_LOGGER.warning(f"filter_start_date was not provided, skipping filter...")
451+
_LOGGER.warning("filter_start_date was not provided, skipping filter...")
449452
return statement
450453

451454
def get_project_number_in_namespace(

0 commit comments

Comments
 (0)