Skip to content

Commit f4f9be4

Browse files
committed
Resolve data manager deprecations.
* Drop positional arguments and project_id from data objects. * Drop Ingestion.project_id. * FileCollection.ingest requires a project ID when build_table=True. * Ingestion.build_objects_async requires a project ID when build_table=True. * Adding ingredients via TableConfig.add_all_ingredients and TableConfig.add_all_ingredients_in_output requires a Team. * Drop ProjectCollection methods for data objects, as well as publishing/unpublishing datasets, owned_dataset_ids, and gemd_batch_delete.
1 parent cf23ab1 commit f4f9be4

24 files changed

+88
-1240
lines changed

src/citrine/_utils/functions.py

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -319,25 +319,3 @@ def resource_path(*,
319319
new_url = base._replace(path='/'.join(path), query=query).geturl()
320320

321321
return format_escaped_url(new_url, *action, **kwargs, uid=uid)
322-
323-
324-
def _data_manager_deprecation_checks(session, project_id: UUID, team_id: UUID, obj_type: str):
325-
if team_id is None:
326-
if project_id is None:
327-
raise TypeError("Missing one required argument: team_id.")
328-
329-
warn(f"{obj_type} now belong to Teams, so the project_id parameter was deprecated in "
330-
"3.4.0, and will be removed in 4.0. Please provide the team_id instead.",
331-
DeprecationWarning)
332-
# avoiding a circular import
333-
from citrine.resources.project import Project
334-
team_id = Project.get_team_id_from_project_id(session=session, project_id=project_id)
335-
return team_id
336-
337-
338-
def _pad_positional_args(args, n):
339-
if len(args) > 0:
340-
warn("Positional arguments are deprecated and will be removed in v4.0. Please use keyword "
341-
"arguments instead.",
342-
DeprecationWarning)
343-
return args + (None, ) * (n - len(args))

src/citrine/resources/data_concepts.py

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@
1818
from citrine._serialization.properties import UUID as PropertyUUID
1919
from citrine._serialization.serializable import Serializable
2020
from citrine._session import Session
21-
from citrine._utils.functions import _data_manager_deprecation_checks, format_escaped_url, \
22-
_pad_positional_args, replace_objects_with_links, scrub_none
21+
from citrine._utils.functions import format_escaped_url, replace_objects_with_links, scrub_none
2322
from citrine.exceptions import BadRequest
2423
from citrine.jobs.job import _poll_for_job_completion
2524
from citrine.resources.audit_info import AuditInfo
@@ -214,43 +213,27 @@ class DataConceptsCollection(Collection[ResourceType], ABC):
214213
215214
"""
216215

217-
def __init__(self,
218-
*args,
219-
session: Session = None,
220-
dataset_id: Optional[UUID] = None,
221-
team_id: UUID = None,
222-
project_id: Optional[UUID] = None):
223-
# Handle positional arguments for backward compatibility
224-
args = _pad_positional_args(args, 3)
225-
self.project_id = project_id or args[0]
226-
self.dataset_id = dataset_id or args[1]
227-
self.session = session or args[2]
228-
if self.session is None:
229-
raise TypeError("Missing one required argument: session.")
230-
231-
self.team_id = _data_manager_deprecation_checks(
232-
session=self.session,
233-
project_id=self.project_id,
234-
team_id=team_id,
235-
obj_type="GEMD Objects")
216+
def __init__(self, *, session: Session, team_id: UUID, dataset_id: Optional[UUID] = None):
217+
self.dataset_id = dataset_id
218+
self.session = session
219+
self.team_id = team_id
236220

237221
@classmethod
238222
@abstractmethod
239223
def get_type(cls) -> Type[Serializable]:
240224
"""Return the resource type in the collection."""
241225

226+
@property
227+
def _path_collection_key(self):
228+
return self._collection_key.replace("_", "-")
229+
242230
@property
243231
def _path_template(self):
244-
collection_key = self._collection_key.replace("_", "-")
245-
return f'teams/{self.team_id}/datasets/{self.dataset_id}/{collection_key}'
232+
return f'teams/{self.team_id}/datasets/{self.dataset_id}/{self._path_collection_key}'
246233

247-
# After Data Manager deprecation, both can use the `teams/...` path.
248234
@property
249235
def _dataset_agnostic_path_template(self):
250-
if self.project_id is None:
251-
return f'teams/{self.team_id}/{self._collection_key.replace("_", "-")}'
252-
else:
253-
return f'projects/{self.project_id}/{self._collection_key.replace("_", "-")}'
236+
return f'teams/{self.team_id}/{self._path_collection_key}'
254237

255238
def build(self, data: dict) -> ResourceType:
256239
"""

src/citrine/resources/dataset.py

Lines changed: 24 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
from gemd.entity.base_entity import BaseEntity
66
from gemd.entity.link_by_uid import LinkByUID
77

8-
from citrine._utils.functions import format_escaped_url, _pad_positional_args
8+
from citrine._utils.functions import format_escaped_url
99
from citrine._rest.collection import Collection
1010
from citrine._rest.resource import Resource, ResourceTypeEnum
1111
from citrine._serialization import properties
1212
from citrine._session import Session
13-
from citrine._utils.functions import scrub_none, _data_manager_deprecation_checks
13+
from citrine._utils.functions import scrub_none
1414
from citrine.exceptions import NotFound
1515
from citrine.resources.api_error import ApiError
1616
from citrine.resources.condition_template import ConditionTemplateCollection
@@ -80,10 +80,6 @@ class Dataset(Resource['Dataset']):
8080
"""int: Time the dataset was deleted, in seconds since epoch, if it is deleted."""
8181
public = properties.Optional(properties.Boolean(), 'public')
8282
"""bool: Flag indicating whether the dataset is publicly readable."""
83-
project_id = properties.Optional(properties.UUID(), 'project_id',
84-
serializable=False, deserializable=False)
85-
"""project_id will be needed here until deprecation is complete.
86-
This class property will be removed post deprecation"""
8783
team_id = properties.Optional(properties.UUID(), 'team_id',
8884
serializable=False, deserializable=False)
8985
session = properties.Optional(properties.Object(Session), 'session',
@@ -107,7 +103,6 @@ def __init__(self, name: str, *, summary: Optional[str] = None,
107103
self.update_time = None
108104
self.delete_time = None
109105
self.public = None
110-
self.project_id = None
111106
self.team_id = None
112107
self.session = None
113108

@@ -118,103 +113,101 @@ def __str__(self):
118113
def property_templates(self) -> PropertyTemplateCollection:
119114
"""Return a resource representing all property templates in this dataset."""
120115
return PropertyTemplateCollection(team_id=self.team_id, dataset_id=self.uid,
121-
session=self.session, project_id=self.project_id)
116+
session=self.session)
122117

123118
@property
124119
def condition_templates(self) -> ConditionTemplateCollection:
125120
"""Return a resource representing all condition templates in this dataset."""
126121
return ConditionTemplateCollection(team_id=self.team_id, dataset_id=self.uid,
127-
session=self.session, project_id=self.project_id)
122+
session=self.session)
128123

129124
@property
130125
def parameter_templates(self) -> ParameterTemplateCollection:
131126
"""Return a resource representing all parameter templates in this dataset."""
132127
return ParameterTemplateCollection(team_id=self.team_id, dataset_id=self.uid,
133-
session=self.session, project_id=self.project_id)
128+
session=self.session)
134129

135130
@property
136131
def material_templates(self) -> MaterialTemplateCollection:
137132
"""Return a resource representing all material templates in this dataset."""
138133
return MaterialTemplateCollection(team_id=self.team_id, dataset_id=self.uid,
139-
session=self.session, project_id=self.project_id)
134+
session=self.session)
140135

141136
@property
142137
def measurement_templates(self) -> MeasurementTemplateCollection:
143138
"""Return a resource representing all measurement templates in this dataset."""
144139
return MeasurementTemplateCollection(team_id=self.team_id, dataset_id=self.uid,
145-
session=self.session, project_id=self.project_id)
140+
session=self.session)
146141

147142
@property
148143
def process_templates(self) -> ProcessTemplateCollection:
149144
"""Return a resource representing all process templates in this dataset."""
150145
return ProcessTemplateCollection(team_id=self.team_id, dataset_id=self.uid,
151-
session=self.session, project_id=self.project_id)
146+
session=self.session)
152147

153148
@property
154149
def process_runs(self) -> ProcessRunCollection:
155150
"""Return a resource representing all process runs in this dataset."""
156151
return ProcessRunCollection(team_id=self.team_id, dataset_id=self.uid,
157-
session=self.session, project_id=self.project_id)
152+
session=self.session)
158153

159154
@property
160155
def measurement_runs(self) -> MeasurementRunCollection:
161156
"""Return a resource representing all measurement runs in this dataset."""
162157
return MeasurementRunCollection(team_id=self.team_id, dataset_id=self.uid,
163-
session=self.session, project_id=self.project_id)
158+
session=self.session)
164159

165160
@property
166161
def material_runs(self) -> MaterialRunCollection:
167162
"""Return a resource representing all material runs in this dataset."""
168163
return MaterialRunCollection(team_id=self.team_id, dataset_id=self.uid,
169-
session=self.session, project_id=self.project_id)
164+
session=self.session)
170165

171166
@property
172167
def ingredient_runs(self) -> IngredientRunCollection:
173168
"""Return a resource representing all ingredient runs in this dataset."""
174169
return IngredientRunCollection(team_id=self.team_id, dataset_id=self.uid,
175-
session=self.session, project_id=self.project_id)
170+
session=self.session)
176171

177172
@property
178173
def process_specs(self) -> ProcessSpecCollection:
179174
"""Return a resource representing all process specs in this dataset."""
180175
return ProcessSpecCollection(team_id=self.team_id, dataset_id=self.uid,
181-
session=self.session, project_id=self.project_id)
176+
session=self.session)
182177

183178
@property
184179
def measurement_specs(self) -> MeasurementSpecCollection:
185180
"""Return a resource representing all measurement specs in this dataset."""
186181
return MeasurementSpecCollection(team_id=self.team_id, dataset_id=self.uid,
187-
session=self.session, project_id=self.project_id)
182+
session=self.session)
188183

189184
@property
190185
def material_specs(self) -> MaterialSpecCollection:
191186
"""Return a resource representing all material specs in this dataset."""
192187
return MaterialSpecCollection(team_id=self.team_id, dataset_id=self.uid,
193-
session=self.session, project_id=self.project_id)
188+
session=self.session)
194189

195190
@property
196191
def ingredient_specs(self) -> IngredientSpecCollection:
197192
"""Return a resource representing all ingredient specs in this dataset."""
198193
return IngredientSpecCollection(team_id=self.team_id, dataset_id=self.uid,
199-
session=self.session, project_id=self.project_id)
194+
session=self.session)
200195

201196
@property
202197
def gemd(self) -> GEMDResourceCollection:
203198
"""Return a resource representing all GEMD objects/templates in this dataset."""
204199
return GEMDResourceCollection(team_id=self.team_id, dataset_id=self.uid,
205-
session=self.session, project_id=self.project_id)
200+
session=self.session)
206201

207202
@property
208203
def files(self) -> FileCollection:
209204
"""Return a resource representing all files in the dataset."""
210-
return FileCollection(team_id=self.team_id, dataset_id=self.uid,
211-
session=self.session, project_id=self.project_id)
205+
return FileCollection(team_id=self.team_id, dataset_id=self.uid, session=self.session)
212206

213207
@property
214208
def ingestions(self) -> IngestionCollection:
215209
"""Return a resource representing all files in the dataset."""
216-
return IngestionCollection(team_id=self.team_id, dataset_id=self.uid,
217-
session=self.session, project_id=self.project_id)
210+
return IngestionCollection(team_id=self.team_id, dataset_id=self.uid, session=self.session)
218211

219212
def register(self, model: DataConcepts, *, dry_run=False) -> DataConcepts:
220213
"""Register a data model object to the appropriate collection."""
@@ -408,7 +401,7 @@ def gemd_batch_delete(
408401

409402
class DatasetCollection(Collection[Dataset]):
410403
"""
411-
Represents the collection of all datasets associated with a project.
404+
Represents the collection of all datasets associated with a team.
412405
413406
Parameters
414407
----------
@@ -422,33 +415,11 @@ class DatasetCollection(Collection[Dataset]):
422415
_individual_key = None
423416
_collection_key = None
424417
_resource = Dataset
418+
_path_template = 'teams/{team_id}/datasets'
425419

426-
def __init__(self,
427-
*args,
428-
session: Session = None,
429-
team_id: UUID = None,
430-
project_id: Optional[UUID] = None):
431-
# Handle positional arguments for backward compatibility
432-
args = _pad_positional_args(args, 2)
433-
self.project_id = project_id or args[0]
434-
self.session = session or args[1]
435-
if self.session is None:
436-
raise TypeError("Missing one required argument: session.")
437-
438-
self.team_id = _data_manager_deprecation_checks(
439-
session=self.session,
440-
project_id=self.project_id,
441-
team_id=team_id,
442-
obj_type="Datasets")
443-
444-
# After the Data Manager deprecation
445-
# this can be a Class Variable using the `teams/...` endpoint
446-
@property
447-
def _path_template(self):
448-
if self.project_id is None:
449-
return f'teams/{self.team_id}/datasets'
450-
else:
451-
return f'projects/{self.project_id}/datasets'
420+
def __init__(self, *, session: Session, team_id: UUID):
421+
self.session = session
422+
self.team_id = team_id
452423

453424
def build(self, data: dict) -> Dataset:
454425
"""
@@ -468,7 +439,6 @@ def build(self, data: dict) -> Dataset:
468439
dataset = Dataset.build(data)
469440
dataset.team_id = self.team_id
470441
dataset.session = self.session
471-
dataset.project_id = self.project_id
472442
return dataset
473443

474444
def register(self, model: Dataset) -> Dataset:

src/citrine/resources/file_link.py

Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,13 @@
77
from urllib.parse import urlparse
88
from urllib.request import url2pathname
99
from uuid import UUID
10-
from warnings import warn
1110

1211
from citrine._rest.collection import Collection
1312
from citrine._rest.resource import GEMDResource
1413
from citrine._serialization import properties
1514
from citrine._serialization.serializable import Serializable
1615
from citrine._session import Session
17-
from citrine._utils.functions import _data_manager_deprecation_checks, _pad_positional_args, \
18-
rewrite_s3_links_locally, write_file_locally
16+
from citrine._utils.functions import rewrite_s3_links_locally, write_file_locally
1917
from citrine.resources.response import Response
2018
from gemd.entity.dict_serializable import DictSerializableMeta
2119
from gemd.entity.bounds.base_bounds import BaseBounds
@@ -198,28 +196,10 @@ class FileCollection(Collection[FileLink]):
198196
_collection_key = 'files'
199197
_resource = FileLink
200198

201-
def __init__(
202-
self,
203-
*args,
204-
session: Session = None,
205-
dataset_id: UUID = None,
206-
team_id: UUID = None,
207-
project_id: Optional[UUID] = None
208-
):
209-
args = _pad_positional_args(args, 3)
210-
self.project_id = project_id or args[0]
211-
self.dataset_id = dataset_id or args[1]
212-
self.session = session or args[2]
213-
if self.session is None:
214-
raise TypeError("Missing one required argument: session.")
215-
if self.dataset_id is None:
216-
raise TypeError("Missing one required argument: dataset_id.")
217-
218-
self.team_id = _data_manager_deprecation_checks(
219-
session=self.session,
220-
project_id=self.project_id,
221-
team_id=team_id,
222-
obj_type="File Links")
199+
def __init__(self, *, session: Session, dataset_id: UUID, team_id: UUID):
200+
self.dataset_id = dataset_id
201+
self.session = session
202+
self.team_id = team_id
223203

224204
def _get_path(self,
225205
uid: Optional[Union[UUID, str]] = None,
@@ -727,15 +707,7 @@ def ingest(self,
727707
from citrine.resources.project import Project # noqa: F401
728708

729709
if build_table and project is None:
730-
if self.project_id is None:
731-
raise ValueError("Building a table requires a target project.")
732-
else:
733-
warn(
734-
"Building a table with an implicit project is deprecated "
735-
"and will be removed in v4. Please pass a project explicitly.",
736-
DeprecationWarning
737-
)
738-
project = self.project_id
710+
raise ValueError("Building a table requires a target project.")
739711

740712
def resolve_with_local(candidate: Union[FileLink, Path, str]) -> FileLink:
741713
"""Resolve Path, str or FileLink to an absolute reference."""

0 commit comments

Comments
 (0)