lib/pypi/requirements.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 Pypi.Requirements do
  @behaviour Parser

  @moduledoc """
    Provides a requirements.txt dependency parser		
  """

  @impl Parser
  def parse!(content) do
    deps =
      content
      |> String.split()
      |> extract_deps()
      |> Enum.to_list()

    {deps, length(deps)}
  end

  @impl Parser
  def file_names(), do: ["*requirements*.txt"]

  # needs works
  defp extract_deps(deps) do
    patterns = ["==", ">=", "<=", "<", ">", "!=", "~=", "*"]
    regex = ~r{(==)|(>=)|(<=)|[<>]|(!=)|(\~=)|(\*)}

    deps
    |> Enum.reject(&String.starts_with?(&1, "#"))
    |> Enum.map(fn dep ->
      if String.contains?(dep, patterns) do
        [dep, version] = String.split(dep, regex, parts: 2)
        {dep, version}
      else
        {dep, ""}
      end
    end)
  end
end