Packages
metastatic
0.18.0
0.26.0
0.25.0
0.24.1
0.24.0
0.23.0
0.22.2
0.22.1
0.22.0
0.21.3
0.21.2
0.21.1
0.21.0
0.20.3
0.20.2
0.20.1
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.1
0.15.0
0.14.2
0.14.1
0.14.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.0
0.11.0
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.2
0.9.1
0.9.0
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.1
0.7.0
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.2
0.4.1
0.4.0
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
0.1.3
0.1.2
0.1.1
0.1.0
Cross-language code meta-model library using unified MetaAST representation. Parse, transform, and translate code across Python, Elixir, Ruby, Erlang, Haskell, and more via a shared three-tuple AST format.
Current section
Files
Jump to
Current section
Files
metastatic
mix.exs
mix.exs
defmodule Metastatic.MixProject do
use Mix.Project
@app :metastatic
@version "0.18.0"
@source_url "https://github.com/Oeditus/metastatic"
def project do
[
app: @app,
version: @version,
elixir: "~> 1.18",
elixirc_paths: elixirc_paths(Mix.env()),
start_permanent: Mix.env() == :prod,
consolidate_protocols: Mix.env() not in [:dev, :test],
deps: deps(),
description: description(),
package: package(),
docs: docs(),
aliases: aliases(),
test_coverage: [tool: ExCoveralls],
dialyzer: [
plt_file: {:no_warn, ".dialyzer/dialyzer.plt"},
plt_add_deps: :app_tree,
plt_add_apps: [:mix, :ex_unit],
plt_core_path: ".dialyzer",
list_unused_filters: true,
ignore_warnings: ".dialyzer/ignore.exs"
],
name: "Metastatic",
source_url: @source_url
]
end
defp elixirc_paths(:test), do: ["lib", "test/support"]
defp elixirc_paths(:dev), do: ["lib", "test/support"]
defp elixirc_paths(_), do: ["lib"]
def application do
[
extra_applications: [:logger],
mod: {Metastatic.Application, []}
]
end
def cli do
[
preferred_envs: [
coveralls: :test,
"coveralls.detail": :test,
"coveralls.post": :test,
"coveralls.html": :test,
"coveralls.json": :test
]
]
end
defp deps do
[
# Core dependencies
{:jason, "~> 1.4"},
{:ex_panda, "~> 0.2"},
# Development and documentation
{:ex_doc, "~> 0.34", only: :dev, runtime: false},
{:excoveralls, "~> 0.18", only: :test, runtime: false},
{:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false},
{:credo, "~> 1.7", only: [:dev, :test], runtime: false},
{:benchee, "~> 1.3", only: [:dev, :test], runtime: false},
{:benchee_html, "~> 1.0", only: [:dev, :test], runtime: false}
]
end
defp aliases do
[
quality: ["format", "credo --strict"],
"quality.ci": [
"format --check-formatted",
"credo --strict"
]
]
end
defp description do
"""
Cross-language code analysis library using unified MetaAST representation.
Build mutation operators, purity analyzers, and complexity metrics once in Elixir
and apply them across Python, JavaScript, Elixir, Ruby, Go, Rust, and more.
"""
end
defp package do
[
name: @app,
files: ~w(
lib
.formatter.exs
mix.exs
README.md
GETTING_STARTED.md
CHANGELOG.md
THEORETICAL_FOUNDATIONS.md
SUPPLEMENTAL_MODULES.md
METAST_SPEC.md
LICENSE
),
licenses: ["GPL-3.0", "CC-BY-SA-4.0"],
maintainers: ["Aleksei Matiushkin"],
links: %{
"GitHub" => @source_url,
"Documentation" => "https://hexdocs.pm/#{@app}"
}
]
end
defp docs do
[
main: "readme",
logo: "stuff/img/logo-48x48.png",
assets: %{"stuff/img" => "assets"},
extras: extras(),
extra_section: "GUIDES",
source_url: @source_url,
source_ref: "v#{@version}",
formatters: ["html", "epub"],
groups_for_modules: groups_for_modules(),
nest_modules_by_prefix: [
Metastatic.Adapters,
Metastatic.Analysis,
Metastatic.Analysis.BusinessLogic,
Metastatic.Analysis.Cohesion,
Metastatic.Analysis.Complexity,
Metastatic.Analysis.ControlFlow,
Metastatic.Analysis.DeadCode,
Metastatic.Analysis.Duplication,
Metastatic.Analysis.Encapsulation,
Metastatic.Analysis.Purity,
Metastatic.Analysis.Security,
Metastatic.Analysis.Smells,
Metastatic.Analysis.StateManagement,
Metastatic.Analysis.Taint,
Metastatic.Analysis.UnusedVariables,
Metastatic.CLI,
Metastatic.Semantic,
Metastatic.Semantic.Domains,
Metastatic.Supplemental
],
authors: ["Aleksei Matiushkin"],
canonical: "https://hexdocs.pm/#{@app}",
skip_undefined_reference_warnings_on: [],
before_closing_body_tag: &before_closing_body_tag/1
]
end
defp extras do
[
"README.md",
"GETTING_STARTED.md": [title: "Getting Started"],
"THEORETICAL_FOUNDATIONS.md": [title: "Theoretical Foundations"],
"SUPPLEMENTAL_MODULES.md": [title: "Supplemental Modules"],
"lib/metastatic/analysis/ANALYZER_PLUGIN_SYSTEM.md": [title: "Analyzer Plugin System"],
"lib/metastatic/analysis/ANALYZER_PLUGIN_DESIGN.md": [title: "Analyzer Plugin Design"],
"lib/metastatic/analysis/CUSTOM_ANALYZER_GUIDE.md": [title: "Custom Analyzer Guide"],
"METAST_SPEC.md": [title: "MetaAST Informal Specification"],
"CHANGELOG.md": [title: "Changelog"]
]
end
defp groups_for_modules do
[
"Core Components": [
Metastatic.AST,
Metastatic.Document,
Metastatic.Builder,
Metastatic.Validator
],
CLI: [
Metastatic.CLI,
Metastatic.CLI.Formatter,
Metastatic.CLI.Inspector,
Metastatic.CLI.Translator
],
Semantic: [
Metastatic.Semantic.Domains.Auth,
Metastatic.Semantic.Domains.Cache,
Metastatic.Semantic.Domains.Database,
Metastatic.Semantic.Domains.ExternalApi,
Metastatic.Semantic.Domains.File,
Metastatic.Semantic.Domains.Http,
Metastatic.Semantic.Domains.Queue,
Metastatic.Semantic.Enricher,
Metastatic.Semantic.OpKind,
Metastatic.Semantic.Patterns
],
Analysis: [
Metastatic.Analysis.Analyzer,
Metastatic.Analysis.ApiSurface,
Metastatic.Analysis.BusinessLogic.BlockingInPlug,
Metastatic.Analysis.BusinessLogic.CallbackHell,
Metastatic.Analysis.BusinessLogic.DirectStructUpdate,
Metastatic.Analysis.BusinessLogic.HardcodedValue,
Metastatic.Analysis.BusinessLogic.ImproperInputValidation,
Metastatic.Analysis.BusinessLogic.IncorrectAuthorization,
Metastatic.Analysis.BusinessLogic.InefficientFilter,
Metastatic.Analysis.BusinessLogic.InlineJavascript,
Metastatic.Analysis.BusinessLogic.InsecureDirectObjectReference,
Metastatic.Analysis.BusinessLogic.MissingAuthentication,
Metastatic.Analysis.BusinessLogic.MissingAuthorization,
Metastatic.Analysis.BusinessLogic.MissingCSRFProtection,
Metastatic.Analysis.BusinessLogic.MissingErrorHandling,
Metastatic.Analysis.BusinessLogic.MissingHandleAsync,
Metastatic.Analysis.BusinessLogic.MissingPreload,
Metastatic.Analysis.BusinessLogic.MissingTelemetryForExternalHttp,
Metastatic.Analysis.BusinessLogic.MissingTelemetryInAuthPlug,
Metastatic.Analysis.BusinessLogic.MissingTelemetryInLiveviewMount,
Metastatic.Analysis.BusinessLogic.MissingTelemetryInObanWorker,
Metastatic.Analysis.BusinessLogic.MissingThrottle,
Metastatic.Analysis.BusinessLogic.NPlusOneQuery,
Metastatic.Analysis.BusinessLogic.PathTraversal,
Metastatic.Analysis.BusinessLogic.SensitiveDataExposure,
Metastatic.Analysis.BusinessLogic.SilentErrorCase,
Metastatic.Analysis.BusinessLogic.SQLInjection,
Metastatic.Analysis.BusinessLogic.SSRFVulnerability,
Metastatic.Analysis.BusinessLogic.SwallowingException,
Metastatic.Analysis.BusinessLogic.SyncOverAsync,
Metastatic.Analysis.BusinessLogic.TelemetryInRecursiveFunction,
Metastatic.Analysis.BusinessLogic.TOCTOU,
Metastatic.Analysis.BusinessLogic.UnrestrictedFileUpload,
Metastatic.Analysis.BusinessLogic.UnmanagedTask,
Metastatic.Analysis.BusinessLogic.XSSVulnerability,
Metastatic.Analysis.Cohesion,
Metastatic.Analysis.Cohesion.Formatter,
Metastatic.Analysis.Cohesion.Result,
Metastatic.Analysis.Complexity,
Metastatic.Analysis.Complexity.Cognitive,
Metastatic.Analysis.Complexity.Cyclomatic,
Metastatic.Analysis.Complexity.Formatter,
Metastatic.Analysis.Complexity.FunctionMetrics,
Metastatic.Analysis.Complexity.Halstead,
Metastatic.Analysis.Complexity.LoC,
Metastatic.Analysis.Complexity.Nesting,
Metastatic.Analysis.Complexity.Result,
Metastatic.Analysis.ControlFlow,
Metastatic.Analysis.ControlFlow.Result,
Metastatic.Analysis.Coupling,
Metastatic.Analysis.DeadCode,
Metastatic.Analysis.DeadCodeAnalyzer,
Metastatic.Analysis.DeadCode.Result,
Metastatic.Analysis.Duplication,
Metastatic.Analysis.Duplication.Fingerprint,
Metastatic.Analysis.Duplication.Reporter,
Metastatic.Analysis.Duplication.Result,
Metastatic.Analysis.Duplication.Similarity,
Metastatic.Analysis.Duplication.Types,
Metastatic.Analysis.Encapsulation,
Metastatic.Analysis.Encapsulation.Formatter,
Metastatic.Analysis.Encapsulation.Result,
Metastatic.Analysis.NestingDepth,
Metastatic.Analysis.Purity,
Metastatic.Analysis.Purity.Effects,
Metastatic.Analysis.Purity.Formatter,
Metastatic.Analysis.Purity.Result,
Metastatic.Analysis.Registry,
Metastatic.Analysis.Runner,
Metastatic.Analysis.Security,
Metastatic.Analysis.Security.Result,
Metastatic.Analysis.SimplifyConditional,
Metastatic.Analysis.Smells,
Metastatic.Analysis.Smells.Result,
Metastatic.Analysis.StateManagement,
Metastatic.Analysis.StateManagement.Formatter,
Metastatic.Analysis.StateManagement.Result,
Metastatic.Analysis.Taint,
Metastatic.Analysis.Taint.Result,
Metastatic.Analysis.UnusedVariables,
Metastatic.Analysis.UnusedVariables.Result
],
"Language Adapters": [
Metastatic.Adapter,
Metastatic.Adapter.Registry,
Metastatic.Adapters.Elixir,
Metastatic.Adapters.Elixir.FromMeta,
Metastatic.Adapters.Elixir.MacroExpander,
Metastatic.Adapters.Elixir.ToMeta,
Metastatic.Adapters.Erlang,
Metastatic.Adapters.Erlang.FromMeta,
Metastatic.Adapters.Erlang.ToMeta,
Metastatic.Adapters.Python,
Metastatic.Adapters.Python.FromMeta,
Metastatic.Adapters.Python.Subprocess,
Metastatic.Adapters.Python.ToMeta,
Metastatic.Adapters.Haskell,
Metastatic.Adapters.Haskell.FromMeta,
Metastatic.Adapters.Haskell.Subprocess,
Metastatic.Adapters.Haskell.ToMeta,
Metastatic.Adapters.Ruby,
Metastatic.Adapters.Ruby.FromMeta,
Metastatic.Adapters.Ruby.Subprocess,
Metastatic.Adapters.Ruby.ToMeta
],
Supplemental: [
Metastatic.Supplemental,
Metastatic.Supplemental.CompatibilityMatrix,
Metastatic.Supplemental.Error,
Metastatic.Supplemental.Info,
Metastatic.Supplemental.Python.Asyncio,
Metastatic.Supplemental.Python.Pykka,
Metastatic.Supplemental.Registry,
Metastatic.Supplemental.Transformer,
Metastatic.Supplemental.Validator
],
Internals: [
Metastatic.Test.AdapterHelper,
Metastatic.Test.FixtureHelper
]
]
end
defp before_closing_body_tag(:html) do
"""
<script src="https://cdn.jsdelivr.net/npm/mermaid@10.9.0/dist/mermaid.min.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function () {
mermaid.initialize({
startOnLoad: true,
theme: "default",
flowchart: {
useMaxWidth: true,
htmlLabels: true,
curve: "basis"
}
});
window.mermaid = mermaid;
});
</script>
"""
end
defp before_closing_body_tag(_), do: ""
end