Skip to content

Commit

Permalink
First commit, project generated and everything inside the minefield
Browse files Browse the repository at this point in the history
  • Loading branch information
amalbuquerque committed Sep 22, 2018
0 parents commit b3824b6
Show file tree
Hide file tree
Showing 9 changed files with 206 additions and 0 deletions.
4 changes: 4 additions & 0 deletions .formatter.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Used by "mix format"
[
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
]
24 changes: 24 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# The directory Mix will write compiled artifacts to.
/_build/

# If you run "mix test --cover", coverage assets end up here.
/cover/

# The directory Mix downloads your dependencies sources to.
/deps/

# Where 3rd-party dependencies like ExDoc output generated docs.
/doc/

# Ignore .fetch files in case you like to edit your project deps locally.
/.fetch

# If the VM crashes, it generates a dump, let's ignore it too.
erl_crash.dump

# Also ignore archive artifacts (built via "mix archive.build").
*.ez

# Ignore package tarball (built via "mix hex.build").
interceptor-*.tar

21 changes: 21 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Interceptor

**TODO: Add description**

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `interceptor` to your list of dependencies in `mix.exs`:

```elixir
def deps do
[
{:interceptor, "~> 0.1.0"}
]
end
```

Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at [https://hexdocs.pm/interceptor](https://hexdocs.pm/interceptor).

30 changes: 30 additions & 0 deletions config/config.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# This file is responsible for configuring your application
# and its dependencies with the aid of the Mix.Config module.
use Mix.Config

# This configuration is loaded before any dependency and is restricted
# to this project. If another project depends on this project, this
# file won't be loaded nor affect the parent project. For this reason,
# if you want to provide default values for your application for
# 3rd-party users, it should be done in your "mix.exs" file.

# You can configure your application as:
#
# config :interceptor, key: :value
#
# and access this configuration in your application as:
#
# Application.get_env(:interceptor, :key)
#
# You can also configure a 3rd-party app:
#
# config :logger, level: :info
#

# It is also possible to import configuration files, relative to this
# directory. For example, you can emulate configuration per environment
# by uncommenting the line below and defining dev.exs, test.exs and such.
# Configuration from the imported file will override the ones defined
# here (which is why it is important to import them last).
#
# import_config "#{Mix.env()}.exs"
18 changes: 18 additions & 0 deletions lib/interceptor.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
defmodule Interceptor do
@moduledoc """
Documentation for Interceptor.
"""

@doc """
Hello world.
## Examples
iex> Interceptor.hello()
:world
"""
def hello do
:world
end
end
72 changes: 72 additions & 0 deletions minefield.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
defmodule Outsider do
def count(message), do: IO.puts("OUTSIDE!!! #{message}")
end

defmodule Intercept do
defmacro me([do: {_block, _metadata, definitions} = do_block]) do
# IO.inspect(definitions)

updated_do_block = definitions
|> Enum.map(&add_calls/1)
|> update_block_definitions(do_block)

[do: updated_do_block]
end

def add_calls({:def, _metadata, [function_hdr | [[do: function_body]]]} = function) do
quoted_call = quote do
Kernel.apply(Outsider, :count, ["Hi there"])
end

new_function_body = prepend_to_function_body(function_body, quoted_call)

new_function = function
|> put_elem(2, [function_hdr | [[do: new_function_body]]])

IO.puts("NEW DEF function ####################")
IO.inspect(new_function)
end

def add_calls({:defp, _metadata, [function_hdr | [[do: function_body]]]} = function) do
function
end

def add_calls(something_else) do
something_else
end


defp prepend_to_function_body({:__block__, _metadata, statements} = body, quoted_call) do
body
|> put_elem(2, [quoted_call | statements])
end

defp prepend_to_function_body(single_statement, quoted_call) do
{:__block__, [], [quoted_call, single_statement]}
end

defp update_block_definitions(new_definitions, {_block, _metadata, _definitions} = do_block) do
do_block
|> put_elem(2, new_definitions)
end
end

defmodule Foo do
require Intercept

Intercept.me do
def abc(x) do
IO.puts("Hey abc #{x}")
IO.puts("second entry")
end

def yyy(), do: IO.puts("alo from yyy")
def zzz(), do: lalalu("From ZZZ")

defp lalalu(foo), do: "#{foo} Fa #{foo}"
end

def xyz(x) do
IO.puts("Hey xyz #{x}")
end
end
28 changes: 28 additions & 0 deletions mix.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
defmodule Interceptor.MixProject do
use Mix.Project

def project do
[
app: :interceptor,
version: "0.1.0",
elixir: "~> 1.7",
start_permanent: Mix.env() == :prod,
deps: deps()
]
end

# Run "mix help compile.app" to learn about applications.
def application do
[
extra_applications: [:logger]
]
end

# Run "mix help deps" to learn about dependencies.
defp deps do
[
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"},
]
end
end
8 changes: 8 additions & 0 deletions test/interceptor_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
defmodule InterceptorTest do
use ExUnit.Case
doctest Interceptor

test "greets the world" do
assert Interceptor.hello() == :world
end
end
1 change: 1 addition & 0 deletions test/test_helper.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ExUnit.start()

0 comments on commit b3824b6

Please sign in to comment.