defmodule ExPropriate do @moduledoc """ ExPropriate is an Elixir library that allows you to decide whether or not a function is public at compile time. First you have to set up your configuration for `test` and any other environment you wish your functions to be expropriated in like this: ```elixir # config/test.exs config ExPropriate, enable: true ``` It may also be useful to configure your `dev` environment like this, so you can test expropriated functions in console. ```elixir # config/dev.exs config ExPropriate, enable: System.get_env("EXPROPRIATE_ENABLED") == "true" ``` ```bash EXPROPRIATE_ENABLED=true iex -S mix iex> ``` Once your config is setup, you can start using ExPropriate in your modules. There are two ways in which it can be used: - Module level granularity via `ExPropriate.FullModule` - Function level granularity via `ExPropriate.MarkedFunctions` """ alias ExPropriate.{FullModule, MarkedFunctions} defmacro __using__(opts \\ []) do from_config = Application.get_env(:ex_propriate, :enable, false) from_module = Keyword.get(opts, :expropriate_all, nil) # This setting is just for internal unit test purposes. from_config = Keyword.get(opts, :override_config_with) || from_config case {from_config, from_module} do # Expropriate full module {true, true} -> FullModule.generate_use_ast # Expropriate marked functions {true, nil} -> MarkedFunctions.generate_use_ast # Cleans up attributes to not raise any warnings with the unused @expropriate attrs. {false, nil} -> MarkedFunctions.generate_unused_ast # Don't do anything~ _ -> nil end end end