defmodule Argos.MixProject do use Mix.Project def project do [ app: :argos, version: "2.0.0", elixir: "~> 1.18.2-otp-27", start_permanent: Mix.env() == :prod, aliases: aliases(), deps: deps(), description: description(), preferred_cli_env: [ bench: :dev, coveralls: :test, "coveralls.detail": :test, "coveralls.post": :test, "coveralls.html": :test ], test_coverage: [tool: ExCoveralls], dialyzer: [ignore_warnings: ".dialyzer_ignore.exs"], package: package(), source_url: "https://github.com/lorenzo-sf/argos", homepage_url: "https://hex.pm/packages/argos", docs: [ main: "readme", extras: ["README.md", "CHANGELOG.md", "LICENSE"], source_ref: "v1.0.0", source_url: "https://github.com/lorenzo-sf/argos" ], escript: [main_module: Argos.CLI, path: "argos"] ] end def application do [ extra_applications: [:logger, :runtime_tools], mod: {Argos.Application, []} ] end defp aliases do [ gen: [ "deps.get", "compile", "escript.build", "deploy", "tools_version" ], deploy: fn _ -> dest_dir = Path.expand("~/.Ypsilon") File.mkdir_p!(dest_dir) File.cp!("argos", Path.join(dest_dir, "argos")) IO.puts("✅ Escript instalado en #{dest_dir}/argos") end, tools_version: fn _ -> dest_dir = Path.expand("~/.Ypsilon") tool_versions_path = Path.join(dest_dir, ".tool-versions") File.write!(tool_versions_path, """ erlang 27.2 elixir 1.18.2-otp-27 """) IO.puts("✅ Archivo .tool-versions creado en #{tool_versions_path}") end, formating: [ fn _ -> case Mix.shell().cmd("mix format --check-formatted", quiet: true) do 0 -> Mix.shell().info("✅ FORMAT: código formateado correctamente") 0 _ -> IO.puts("⚠️ FORMAT: Es necesario corregir el formato. Aplicando formateo automático...") case Mix.shell().cmd("mix format", quiet: true) do 0 -> IO.puts("✅ FORMAT: formateo aplicado correctamente") 0 code -> IO.puts("❌ FORMAT: falló con código #{code}. Lanza 'mix format' para más detalles") code end end end ], clean_build: [ fn _ -> IO.write("🧹 CLEAN: limpiando directorios _build y deps...") File.rm_rf("_build") File.rm_rf("deps") IO.puts(" ✅") 0 end ], deps: [ fn _ -> IO.write("📦 DEPS: obteniendo dependencias...") case Mix.shell().cmd("mix deps.get", quiet: true) do 0 -> IO.puts(" ✅") 0 code -> IO.puts(" ❌ falló al obtener dependencias. Lanza 'mix deps.get' para más detalles") code end end ], "compile.strict": [ fn _ -> IO.write("🔨 COMPILE: compilando con warnings como errores...") case Mix.shell().cmd("mix compile --warnings-as-errors", quiet: true) do 0 -> IO.puts(" ✅") 0 code -> IO.puts(" ❌ encontró problemas (código #{code}). Lanza 'mix compile --warnings-as-errors' para más detalles") code end end ], testing: [ fn _ -> IO.write("🧪 TEST: ejecutando tests con cobertura...") case Mix.shell().cmd("MIX_ENV=test mix coveralls", quiet: true) do 0 -> IO.puts(" ✅") 0 code -> IO.puts(" ❌ algunos tests fallaron (código #{code}). Lanza 'MIX_ENV=test mix coveralls' para más detalles") code end end ], creding: [ fn _ -> IO.write("🔍 CREDO: analizando código...") case Mix.shell().cmd("mix credo --strict --format=oneline", quiet: true) do 0 -> IO.puts(" ✅") 0 code -> IO.puts(" ❌ encontró problemas (código #{code}). Lanza 'mix credo --strict --format=oneline' para más detalles") code end end ], dialyzing: [ fn _ -> IO.write("🔬 DIALYZER: analizando tipos...") case Mix.shell().cmd("mix dialyzer", quiet: true) do 0 -> IO.puts(" ✅") 0 code -> IO.puts(" ❌ encontró problemas (código #{code}). Lanza 'mix dialyzer' para más detalles") code end end ], check: [ "formating", "compile.strict", "testing", "creding" ], quality: [ "formating", "clean_build", "deps", "compile.strict", "testing", "creding", "dialyzing", "bench" ], bench: [ fn _ -> case Mix.Task.run("mix run bench", []) do :ok -> Mix.shell().info("✅ BENCHEE terminado") Mix.shell().info("✅✅✅✅ ESTO ES SOFTWARE DE CALIDAD ✅✅✅✅") {:ok, _} -> Mix.shell().info("✅ BENCHEE terminado") Mix.shell().info("✅✅✅✅ ESTO ES SOFTWARE DE CALIDAD ✅✅✅✅") {:error, _} = error -> Mix.shell().error("❌ BENCHEE falló") error other -> Mix.shell().error("❌ BENCHEE falló: #{inspect(other)}") {:error, other} end end ], hex_prepare: [ "quality", "docs", "cmd mix hex.build" ], hex_publish: [ "hex_prepare", "cmd mix hex.publish" ] ] end defp deps do [ {:benchee, "~> 1.3", only: [:dev, :test]}, {:aurora, "~> 3.0.0"}, {:mix_test_watch, "~> 1.1", only: :dev, runtime: false}, {:propcheck, "~> 1.4", only: :test}, {:credo, "~> 1.7.11", only: [:dev, :test], runtime: false}, {:dialyxir, "~> 1.4", only: [:dev], runtime: false}, {:ex_doc, "~> 0.34", runtime: false}, {:jason, "~> 1.4"}, {:telemetry, "~> 1.0"}, # Test dependencies for 100% coverage {:excoveralls, "~> 0.18", only: :test, runtime: false}, {:mox, "~> 1.1", only: :test} ] end defp description do "Librería base para ejecución de comandos del sistema y gestión de tareas asíncronas con resultados estructurados." end defp package do [ name: "argos", licenses: ["Apache-2.0"], maintainers: ["Lorenzo Sánchez Fraile"], links: %{ "GitHub" => "https://github.com/lorenzo-sf/argos", "Docs" => "https://hexdocs.pm/argos" }, files: ~w(lib mix.exs README.md CHANGELOG.md LICENSE .dialyzer_ignore.exs) ] end end