Discovers Ecto schemas in a Phoenix/Elixir project.
Supports two discovery methods:
- File scanning: Scans lib/*/.ex files for
use Ecto.Schema - Module introspection: Uses Code.ensure_loaded? for compiled modules
Usage
schemas = Ectomancer.Installer.SchemaDiscovery.discover()
# Returns: [
# %{
# module: MyApp.Accounts.User,
# table: "users",
# context: "Accounts",
# associations: [:posts],
# writable_fields: [:email, :name]
# },
# ...
# ]
Summary
Functions
Analyzes a single schema module and extracts metadata.
Discovers all Ecto schemas in the current project.
Discovers schemas by scanning source files.
Discovers schemas using module introspection.
Functions
@spec analyze_module(module()) :: %{ table: String.t() | nil, associations: [atom()], writable_fields: [atom()] }
Analyzes a single schema module and extracts metadata.
@spec discover() :: [ %{ module: module(), table: String.t() | nil, context: String.t() | nil, associations: [atom()], writable_fields: [atom()] } ]
Discovers all Ecto schemas in the current project.
Tries module introspection first (faster for compiled code), then falls back to file scanning for any missed schemas.
@spec file_discovery() :: [map()]
Discovers schemas by scanning source files.
Useful for finding schemas that haven't been compiled yet.
@spec module_introspection() :: [map()]
Discovers schemas using module introspection.
Works best for compiled modules. Returns nil for embedded schemas.