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  }