github.com/joey-fossa/fossa-cli@v0.7.34-0.20190708193710-569f1e8679f0/analyzers/python/pip.go (about) 1 package python 2 3 import ( 4 "github.com/fossas/fossa-cli/buildtools/pip" 5 "github.com/fossas/fossa-cli/pkg" 6 ) 7 8 func FromRequirements(reqs []pip.Requirement) []pkg.Import { 9 var imports []pkg.Import 10 for _, req := range reqs { 11 imports = append(imports, pkg.Import{ 12 Target: req.String(), 13 Resolved: pkg.ID{ 14 Type: pkg.Python, 15 Name: req.Name, 16 Revision: req.Revision, 17 }, 18 }) 19 } 20 return imports 21 } 22 23 func FromTree(tree []pip.DepTree) ([]pkg.Import, map[pkg.ID]pkg.Package) { 24 var imports []pkg.Import 25 for _, dep := range tree { 26 imports = append(imports, pkg.Import{ 27 Target: dep.Target, 28 Resolved: pkg.ID{ 29 Type: pkg.Python, 30 Name: dep.Package, 31 Revision: dep.Resolved, 32 }, 33 }) 34 } 35 36 graph := make(map[pkg.ID]pkg.Package) 37 for _, subtree := range tree { 38 flattenTree(graph, subtree) 39 } 40 41 return imports, graph 42 } 43 44 func flattenTree(graph map[pkg.ID]pkg.Package, tree pip.DepTree) { 45 for _, dep := range tree.Dependencies { 46 // Construct ID. 47 id := pkg.ID{ 48 Type: pkg.Python, 49 Name: dep.Package, 50 Revision: dep.Resolved, 51 } 52 // Don't process duplicates. 53 _, ok := graph[id] 54 if ok { 55 continue 56 } 57 // Get direct imports. 58 var imports []pkg.Import 59 for _, i := range dep.Dependencies { 60 imports = append(imports, pkg.Import{ 61 Resolved: pkg.ID{ 62 Type: pkg.Python, 63 Name: i.Package, 64 Revision: i.Resolved, 65 }, 66 }) 67 } 68 // Update map. 69 graph[id] = pkg.Package{ 70 ID: id, 71 Imports: imports, 72 } 73 // Recurse in imports. 74 flattenTree(graph, dep) 75 } 76 }