Packages

LowEndInsight is a simple 'bus-factor' risk analysis library for Open Source Software which is managed within a Git repository. Provide the git URL and the library will respond with a basic Elixir Map structure report.

Current section

Files

Jump to
lowendinsight lib project_ident.ex
Raw

lib/project_ident.ex

# Copyright (C) 2020 by the Georgia Tech Research Institute (GTRI)
# This software may be modified and distributed under the terms of
# the BSD 3-Clause license. See the LICENSE file for details.
defmodule ProjectIdent do
@moduledoc """
ProjectIdent module
"""
@doc """
find_files: Traverses paths according to the given repository and project type
and returns a list of matches
"""
@spec find_files(atom | %{path: any}, atom | %{files: any, path: any}) :: [binary]
def find_files(repo, project_type) do
Path.wildcard(
"#{repo.path}/#{project_type.path}/#{ProjectType.types_to_string(project_type)}"
)
end
@doc """
categorize_repo/1: takes in a Repository and will return a list
of found project types within the repo.
"""
def categorize_repo(repo, project_types) do
Enum.reduce(project_types, %{}, fn project_type, acc ->
search = find_files(repo, project_type)
if Enum.empty?(search) do
acc
else
Map.put(acc, project_type.name, search)
end
end)
end
@doc """
get_project_types_identified: takes in a Repository and will return a list of maps
of found project types within the repo.
"""
def get_project_types_identified(repo) do
## Non-metric data about repo
mix_type = %ProjectType{name: :mix, path: "", files: ["mix.exs,mix.lock"]}
python_type = %ProjectType{
name: :python,
path: "**",
files: ["setup.py,*requirements.txt*"]
}
node_type = %ProjectType{name: :node, path: "**", files: ["package*.json"]}
go_type = %ProjectType{name: :go_mod, path: "**", files: ["go.mod"]}
cargo_type = %ProjectType{name: :cargo, path: "**", files: ["Cargo.toml"]}
rubygem_type = %ProjectType{name: :rubygem, path: "**", files: ["Gemfile*,*.gemspec"]}
maven_type = %ProjectType{name: :maven, path: "**", files: ["pom.xml"]}
gradle_type = %ProjectType{name: :gradle, path: "**", files: ["build.gradle*"]}
project_types = [
mix_type,
python_type,
node_type,
go_type,
cargo_type,
rubygem_type,
maven_type,
gradle_type
]
if is_map(repo) && Map.has_key?(repo, :__struct__) do
categorize_repo(repo, project_types) |> Helpers.convert_config_to_list()
else
repo = %{path: repo}
categorize_repo(repo, project_types) |> Helpers.convert_config_to_list()
end
end
end