Packages
double_down
0.50.1
0.69.0
0.68.0
0.66.0
0.65.0
0.64.1
0.64.0
0.63.3
0.63.2
0.63.1
0.63.0
0.62.1
0.61.0
0.60.4
0.60.3
0.60.2
0.60.1
0.60.0
0.59.0
0.58.0
0.57.0
0.56.1
0.56.0
0.55.0
0.54.0
0.53.0
0.52.3
0.52.2
0.52.1
0.52.0
0.51.0
0.50.1
0.50.0
0.49.0
0.48.1
0.48.0
0.47.2
0.47.1
0.47.0
0.46.3
0.46.2
0.46.1
0.46.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.1
0.41.0
0.40.0
0.39.0
0.38.0
0.37.2
0.37.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.1
0.31.0
0.30.1
0.30.0
0.29.0
0.28.1
0.28.0
0.27.0
0.26.0
0.24.0
Builds on the Mox pattern — generates behaviours and dispatch facades from `defcallback` declarations — and adds stateful test doubles powerful enough to test Ecto.Repo operations without a database.
Current section
Files
Jump to
Current section
Files
lib/double_down/facade/compile_helper.ex
defmodule DoubleDown.Facade.CompileHelper do
@moduledoc false
# Helper for ensuring behaviour modules are compiled and their .beam
# files are on disk before BehaviourFacade facades that depend on them.
#
# This is only needed when the behaviour and facade are compiled in the
# same batch (e.g. both in test/support/). In normal usage the behaviour
# would be in lib/ or a dependency, compiled in a prior batch.
@doc false
@spec ensure_compiled!(Path.t()) :: :ok
def ensure_compiled!(source_path) do
# Compile the file — returns [{module, binary}, ...]
compiled = Code.compile_file(source_path)
# Write each beam binary to the build output directory so
# Code.Typespec.fetch_callbacks/1 can find them.
for {module, binary} <- compiled do
beam_path = beam_output_path(module)
File.mkdir_p!(Path.dirname(beam_path))
File.write!(beam_path, binary)
# Load the binary so the code server also has it
:code.load_binary(module, String.to_charlist(beam_path), binary)
end
:ok
end
defp beam_output_path(module) do
# Use the first code path entry that looks like a build directory
ebin_dir =
:code.get_path()
|> Enum.map(&to_string/1)
|> Enum.find(&String.contains?(&1, "_build"))
if ebin_dir do
Path.join(ebin_dir, "#{module}.beam")
else
# Fallback: write to a temp directory and add it to the code path
tmp = Path.join(System.tmp_dir!(), "double_down_beams")
File.mkdir_p!(tmp)
:code.add_patha(String.to_charlist(tmp))
Path.join(tmp, "#{module}.beam")
end
end
end