14
14
)
15
15
16
16
import higlass_schema as hgs
17
- from pydantic import BaseModel
17
+ from pydantic import RootModel
18
18
19
19
import higlass ._display as display
20
20
import higlass ._utils as utils
21
21
22
22
__all__ = [
23
+ "CombinedTrack" ,
23
24
"EnumTrack" ,
24
25
"HeatmapTrack" ,
25
26
"IndependentViewportProjectionTrack" ,
26
- "CombinedTrack" ,
27
27
"PluginTrack" ,
28
28
"TrackT" ,
29
29
"View" ,
30
30
"ViewT" ,
31
31
"Viewconf" ,
32
+ "combine" ,
32
33
"concat" ,
34
+ "divide" ,
33
35
"hconcat" ,
34
- "vconcat " ,
36
+ "lock " ,
35
37
"track" ,
38
+ "vconcat" ,
36
39
"view" ,
37
- "combine" ,
38
- "divide" ,
39
- "lock" ,
40
40
]
41
41
42
42
if TYPE_CHECKING :
@@ -383,13 +383,13 @@ def _repr_mimebundle_(self, include=None, exclude=None):
383
383
""" "Displays the view config in an IPython environment."""
384
384
renderer = display .renderers .get ()
385
385
plugin_urls = [] if self .views is None else gather_plugin_urls (self .views )
386
- return renderer (self .dict (), plugin_urls = plugin_urls )
386
+ return renderer (self .model_dump (), plugin_urls = plugin_urls )
387
387
388
388
def widget (self , ** kwargs ):
389
389
"""Create a Jupyter Widget display for this view config."""
390
390
from higlass ._widget import HiGlassWidget
391
391
392
- return HiGlassWidget (self .dict (), ** kwargs )
392
+ return HiGlassWidget (self .model_dump (), ** kwargs )
393
393
394
394
@classmethod
395
395
def from_url (cls , url : str , ** kwargs ):
@@ -416,7 +416,7 @@ def from_url(cls, url: str, **kwargs):
416
416
with urllib .urlopen (request ) as response :
417
417
raw = response .read ()
418
418
419
- return cls .parse_raw (raw )
419
+ return cls .model_validate_json (raw )
420
420
421
421
def locks (
422
422
self ,
@@ -603,7 +603,7 @@ def mapper(view):
603
603
raise ValueError ("concat method must be 'vertical' or 'horizontal'." )
604
604
605
605
# gather views and adjust layout
606
- views = [v .copy (deep = True ) for v in b .views ]
606
+ views = [v .model_copy (deep = True ) for v in b .views ]
607
607
offset = 0 if a .views is None else max (map (mapper , a .views ))
608
608
for view in views :
609
609
curr = getattr (view .layout , field )
@@ -616,7 +616,7 @@ def mapper(view):
616
616
locks = getattr (b , lockattr )
617
617
if locks :
618
618
if getattr (a , lockattr ) is None :
619
- setattr (a , lockattr , locks .copy (deep = True ))
619
+ setattr (a , lockattr , locks .model_copy (deep = True ))
620
620
else :
621
621
getattr (a , lockattr ).locksByViewUid .update (locks .locksByViewUid )
622
622
getattr (a , lockattr ).locksDict .update (locks .locksDict )
@@ -634,18 +634,18 @@ def mapper(view):
634
634
# TODO: register plugins globally to work here?
635
635
636
636
637
- class _TrackCreator (BaseModel ):
637
+ class _TrackCreator (RootModel ):
638
638
"""Create track instances from their track type.
639
639
640
640
Used internally by `hg.track` to leverage pydantic's ability to get
641
641
the appropriate base model by the track type.
642
642
643
643
Example:
644
644
-------
645
- >>> assert isinstance(_TrackCreator(type="heatmap").__root__ , HeatmapTrack)
645
+ >>> assert isinstance(_TrackCreator(type="heatmap").root , HeatmapTrack)
646
646
"""
647
647
648
- __root__ : Track
648
+ root : Track
649
649
650
650
651
651
@overload
@@ -688,7 +688,7 @@ def track(
688
688
if uid is None :
689
689
uid = utils .uid ()
690
690
data = dict (type = type_ , uid = uid , ** kwargs )
691
- return _TrackCreator .parse_obj (data ).__root__
691
+ return _TrackCreator .model_validate (data ).root
692
692
693
693
694
694
def view (
@@ -745,16 +745,16 @@ def view(
745
745
if layout is None :
746
746
layout = hgs .Layout (x = x , y = y , w = width , h = height )
747
747
else :
748
- layout = hgs .Layout (** layout .dict ())
748
+ layout = hgs .Layout (** layout .model_dump ())
749
749
750
750
if tracks is None :
751
751
data = defaultdict (list )
752
752
else :
753
- data = defaultdict (list , tracks .dict ())
753
+ data = defaultdict (list , tracks .model_dump ())
754
754
755
755
for track in _tracks :
756
756
if isinstance (track , hgs .Tracks ):
757
- track = track .dict ()
757
+ track = track .model_dump ()
758
758
for position , track_list in track .items ():
759
759
data [position ].extend (track_list )
760
760
else :
@@ -806,16 +806,16 @@ def combine(t1: Track, t2: Track, uid: str | None = None, **kwargs) -> CombinedT
806
806
uid = utils .uid ()
807
807
808
808
if isinstance (t1 , CombinedTrack ):
809
- copy = CombinedTrack (** t1 .dict ())
810
- copy .contents .append (t2 .__class__ (** t2 .dict ()))
809
+ copy = CombinedTrack (** t1 .model_dump ())
810
+ copy .contents .append (t2 .__class__ (** t2 .model_dump ()))
811
811
for key , val in kwargs .items ():
812
812
setattr (copy , key , val )
813
813
return copy
814
814
815
815
return CombinedTrack (
816
816
type = "combined" ,
817
817
uid = uid ,
818
- contents = [track .__class__ (** track .dict ()) for track in (t1 , t2 )],
818
+ contents = [track .__class__ (** track .model_dump ()) for track in (t1 , t2 )],
819
819
** kwargs ,
820
820
)
821
821
0 commit comments