@@ -123,8 +123,8 @@ class FullScanMetadata:
123
123
repository_id : str
124
124
branch : str
125
125
html_report_url : str
126
- repo : Optional [str ] = None # In docs, never shows up
127
- organization_slug : Optional [str ] = None # In docs, never shows up
126
+ repo : Optional [str ] = None
127
+ organization_slug : Optional [str ] = None
128
128
committers : Optional [List [str ]] = None
129
129
commit_message : Optional [str ] = None
130
130
commit_hash : Optional [str ] = None
@@ -189,26 +189,30 @@ def from_dict(cls, data: dict) -> "GetFullScanMetadataResponse":
189
189
data = FullScanMetadata .from_dict (data .get ("data" )) if data .get ("data" ) else None
190
190
)
191
191
192
- @dataclass
193
- class DependencyRef :
192
+ @dataclass ( kw_only = True )
193
+ class SocketArtifactLink :
194
194
topLevelAncestors : List [str ]
195
- direct : Optional [ bool ] = None
196
- manifestFiles : Optional [List [ SocketManifestReference ] ] = None
195
+ direct : bool = False
196
+ artifact : Optional [Dict ] = None
197
197
dependencies : Optional [List [str ]] = None
198
+ manifestFiles : Optional [List [SocketManifestReference ]] = None
198
199
199
200
def __getitem__ (self , key ): return getattr (self , key )
200
201
def to_dict (self ): return asdict (self )
201
202
202
203
@classmethod
203
- def from_dict (cls , data : dict ) -> "DependencyRef " :
204
+ def from_dict (cls , data : dict ) -> "SocketArtifactLink " :
204
205
manifest_files = data .get ("manifestFiles" )
206
+ direct_val = data .get ("direct" , False )
205
207
return cls (
206
208
topLevelAncestors = data ["topLevelAncestors" ],
207
- direct = data .get ("direct" ),
208
- manifestFiles = [SocketManifestReference .from_dict (m ) for m in manifest_files ] if manifest_files else None ,
209
- dependencies = data .get ("dependencies" )
209
+ direct = direct_val if isinstance (direct_val , bool ) else direct_val .lower () == "true" ,
210
+ artifact = data .get ("artifact" ),
211
+ dependencies = data .get ("dependencies" ),
212
+ manifestFiles = [SocketManifestReference .from_dict (m ) for m in manifest_files ] if manifest_files else None
210
213
)
211
214
215
+
212
216
@dataclass
213
217
class SocketScore :
214
218
supplyChain : float
@@ -360,11 +364,11 @@ def from_dict(cls, data: dict) -> "LicenseAttribution":
360
364
)
361
365
362
366
@dataclass
363
- class DiffArtifactAlert :
367
+ class SocketAlert :
364
368
key : str
365
369
type : str
366
- severity : Optional [ SocketIssueSeverity ] = None
367
- category : Optional [ SocketCategory ] = None
370
+ severity : SocketIssueSeverity
371
+ category : SocketCategory
368
372
file : Optional [str ] = None
369
373
start : Optional [int ] = None
370
374
end : Optional [int ] = None
@@ -376,14 +380,12 @@ def __getitem__(self, key): return getattr(self, key)
376
380
def to_dict (self ): return asdict (self )
377
381
378
382
@classmethod
379
- def from_dict (cls , data : dict ) -> "DiffArtifactAlert" :
380
- severity = data .get ("severity" )
381
- category = data .get ("category" )
383
+ def from_dict (cls , data : dict ) -> "SocketAlert" :
382
384
return cls (
383
385
key = data ["key" ],
384
386
type = data ["type" ],
385
- severity = SocketIssueSeverity (severity ) if severity else None ,
386
- category = SocketCategory (category ) if category else None ,
387
+ severity = SocketIssueSeverity (data [ " severity" ]) ,
388
+ category = SocketCategory (data [ " category" ]) ,
387
389
file = data .get ("file" ),
388
390
start = data .get ("start" ),
389
391
end = data .get ("end" ),
@@ -392,28 +394,29 @@ def from_dict(cls, data: dict) -> "DiffArtifactAlert":
392
394
actionPolicyIndex = data .get ("actionPolicyIndex" )
393
395
)
394
396
397
+
395
398
@dataclass
396
399
class DiffArtifact :
397
400
diffType : DiffType
398
401
id : str
399
402
type : str
400
403
name : str
401
- license : str
402
- scores : SocketScore
404
+ score : SocketScore
403
405
version : str
404
- alerts : List [DiffArtifactAlert ]
406
+ alerts : List [SocketAlert ]
407
+ author : List [str ] = field (default_factory = list )
405
408
licenseDetails : List [LicenseDetail ]
409
+ license : Optional [str ] = None
406
410
files : Optional [str ] = None
407
411
capabilities : Optional [SecurityCapabilities ] = None
408
- base : Optional [List [DependencyRef ]] = None
409
- head : Optional [List [DependencyRef ]] = None
412
+ base : Optional [List [SocketArtifactLink ]] = None
413
+ head : Optional [List [SocketArtifactLink ]] = None
410
414
namespace : Optional [str ] = None
411
415
subpath : Optional [str ] = None
412
416
artifact_id : Optional [str ] = None
413
417
artifactId : Optional [str ] = None
414
418
qualifiers : Optional [Dict [str , Any ]] = None
415
419
size : Optional [int ] = None
416
- author : Optional [str ] = None
417
420
state : Optional [str ] = None
418
421
error : Optional [str ] = None
419
422
licenseAttrib : Optional [List [LicenseAttribution ]] = None
@@ -430,22 +433,22 @@ def from_dict(cls, data: dict) -> "DiffArtifact":
430
433
id = data ["id" ],
431
434
type = data ["type" ],
432
435
name = data ["name" ],
433
- license = data .get ("license" , "" ),
434
- scores = SocketScore .from_dict (data ["score" ]),
436
+ score = SocketScore .from_dict (data ["score" ]),
435
437
version = data ["version" ],
436
- alerts = [DiffArtifactAlert .from_dict (alert ) for alert in data ["alerts" ]],
438
+ alerts = [SocketAlert .from_dict (alert ) for alert in data ["alerts" ]],
437
439
licenseDetails = [LicenseDetail .from_dict (detail ) for detail in data ["licenseDetails" ]],
438
440
files = data .get ("files" ),
441
+ license = data .get ("license" ),
439
442
capabilities = SecurityCapabilities .from_dict (data ["capabilities" ]) if data .get ("capabilities" ) else None ,
440
- base = [DependencyRef .from_dict (b ) for b in base_data ] if base_data else None ,
441
- head = [DependencyRef .from_dict (h ) for h in head_data ] if head_data else None ,
443
+ base = [SocketArtifactLink .from_dict (b ) for b in base_data ] if base_data else None ,
444
+ head = [SocketArtifactLink .from_dict (h ) for h in head_data ] if head_data else None ,
442
445
namespace = data .get ("namespace" ),
443
446
subpath = data .get ("subpath" ),
444
447
artifact_id = data .get ("artifact_id" ),
445
448
artifactId = data .get ("artifactId" ),
446
449
qualifiers = data .get ("qualifiers" ),
447
450
size = data .get ("size" ),
448
- author = data .get ("author" ),
451
+ author = data .get ("author" , [] ),
449
452
state = data .get ("state" ),
450
453
error = data .get ("error" ),
451
454
licenseAttrib = [LicenseAttribution .from_dict (attrib ) for attrib in data ["licenseAttrib" ]] if data .get ("licenseAttrib" ) else None
@@ -539,81 +542,26 @@ def from_dict(cls, data: dict) -> "StreamDiffResponse":
539
542
data = FullScanDiffReport .from_dict (data .get ("data" )) if data .get ("data" ) else None
540
543
)
541
544
542
- @dataclass (kw_only = True )
543
- class SocketArtifactLink :
544
- topLevelAncestors : List [str ]
545
- artifact : Optional [Dict ] = None
546
- dependencies : Optional [List [str ]] = None
547
- direct : Optional [bool ] = None
548
- manifestFiles : Optional [List [SocketManifestReference ]] = None
549
-
550
- def __getitem__ (self , key ): return getattr (self , key )
551
- def to_dict (self ): return asdict (self )
552
-
553
- @classmethod
554
- def from_dict (cls , data : dict ) -> "SocketArtifactLink" :
555
- manifest_files = data .get ("manifestFiles" )
556
- return cls (
557
- topLevelAncestors = data ["topLevelAncestors" ],
558
- artifact = data .get ("artifact" ),
559
- dependencies = data .get ("dependencies" ),
560
- direct = data .get ("direct" ),
561
- manifestFiles = [SocketManifestReference .from_dict (m ) for m in manifest_files ] if manifest_files else None
562
- )
563
-
564
- @dataclass
565
- class SocketAlert :
566
- key : str
567
- type : str
568
- severity : SocketIssueSeverity
569
- category : SocketCategory
570
- file : Optional [str ] = None
571
- start : Optional [int ] = None
572
- end : Optional [int ] = None
573
- props : Optional [Dict [str , Any ]] = None
574
- action : Optional [str ] = None
575
- actionPolicyIndex : Optional [int ] = None
576
-
577
- def __getitem__ (self , key ): return getattr (self , key )
578
- def to_dict (self ): return asdict (self )
579
-
580
- @classmethod
581
- def from_dict (cls , data : dict ) -> "SocketAlert" :
582
- return cls (
583
- key = data ["key" ],
584
- type = data ["type" ],
585
- severity = SocketIssueSeverity (data ["severity" ]),
586
- category = SocketCategory (data ["category" ]),
587
- file = data .get ("file" ),
588
- start = data .get ("start" ),
589
- end = data .get ("end" ),
590
- props = data .get ("props" ),
591
- action = data .get ("action" ),
592
- actionPolicyIndex = data .get ("actionPolicyIndex" )
593
- )
594
-
595
545
@dataclass (kw_only = True )
596
546
class SocketArtifact (SocketPURL , SocketArtifactLink ):
597
547
id : str
598
- alerts : Optional [List [SocketAlert ]] = field (default_factory = list )
548
+ alerts : List [SocketAlert ]
549
+ score : SocketScore
599
550
author : Optional [List [str ]] = field (default_factory = list )
600
551
batchIndex : Optional [int ] = None
601
552
license : Optional [str ] = None
602
553
licenseAttrib : Optional [List [LicenseAttribution ]] = field (default_factory = list )
603
554
licenseDetails : Optional [List [LicenseDetail ]] = field (default_factory = list )
604
- score : Optional [SocketScore ] = None
605
- size : Optional [float ] = None
555
+ size : Optional [int ] = None
606
556
607
557
def __getitem__ (self , key ): return getattr (self , key )
608
558
def to_dict (self ): return asdict (self )
609
559
610
560
@classmethod
611
561
def from_dict (cls , data : dict ) -> "SocketArtifact" :
612
- # First get the base class data
613
562
purl_data = {k : data .get (k ) for k in SocketPURL .__dataclass_fields__ }
614
563
link_data = {k : data .get (k ) for k in SocketArtifactLink .__dataclass_fields__ }
615
564
616
- # Handle nested types
617
565
alerts = data .get ("alerts" )
618
566
license_attrib = data .get ("licenseAttrib" )
619
567
license_details = data .get ("licenseDetails" )
@@ -665,7 +613,7 @@ def create_params_string(self, params: dict) -> str:
665
613
for name , value in params .items ():
666
614
if value :
667
615
if name == "committers" and isinstance (value , list ):
668
- # Handle committers specially - add multiple params
616
+
669
617
for committer in value :
670
618
param_str += f"&{ name } ={ committer } "
671
619
else :
@@ -706,7 +654,7 @@ def post(self, files: list, params: FullScanParams) -> CreateFullScanResponse:
706
654
org_slug = str (params .org_slug )
707
655
params_dict = params .to_dict ()
708
656
params_dict .pop ("org_slug" )
709
- params_arg = self .create_params_string (params_dict ) # Convert params to dict
657
+ params_arg = self .create_params_string (params_dict )
710
658
711
659
path = "orgs/" + org_slug + "/full-scans" + str (params_arg )
712
660
@@ -779,12 +727,12 @@ def stream(self, org_slug: str, full_scan_id: str) -> FullScanStreamResponse:
779
727
item = json .loads (line )
780
728
stream_str .append (item )
781
729
for val in stream_str :
782
- artifacts [val ["id" ]] = val # Just store the raw dict
730
+ artifacts [val ["id" ]] = val
783
731
784
732
return FullScanStreamResponse .from_dict ({
785
733
"success" : True ,
786
734
"status" : 200 ,
787
- "artifacts" : artifacts # Let from_dict handle the conversion
735
+ "artifacts" : artifacts
788
736
})
789
737
except Exception as e :
790
738
error_message = f"Error parsing stream response: { str (e )} "
0 commit comments