Initial commit
This commit is contained in:
commit
fbfdfb5b61
15 changed files with 311 additions and 0 deletions
12
.gitignore
vendored
Normal file
12
.gitignore
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
# App artifacts
|
||||
/_build
|
||||
/db
|
||||
/deps
|
||||
/*.ez
|
||||
|
||||
# Nerves artifacts
|
||||
/_images
|
||||
/.nerves
|
||||
|
||||
# Generate on crash by the VM
|
||||
erl_crash.dump
|
29
README.md
Normal file
29
README.md
Normal file
|
@ -0,0 +1,29 @@
|
|||
# DuckTag
|
||||
|
||||
## Targets
|
||||
|
||||
Nerves applications produce images for hardware targets based on the
|
||||
`MIX_TARGET` environment variable. If `MIX_TARGET` is unset, `mix` builds an
|
||||
image that runs on the host (e.g., your laptop). This is useful for executing
|
||||
logic tests, running utilities, and debugging. Other targets are represented by
|
||||
a short name like `rpi3` that maps to a Nerves system image for that platform.
|
||||
All of this logic is in the generated `mix.exs` and may be customized. For more
|
||||
information about targets see:
|
||||
|
||||
https://hexdocs.pm/nerves/targets.html#content
|
||||
|
||||
## Getting Started
|
||||
|
||||
To start your Nerves app:
|
||||
* `export MIX_TARGET=my_target` or prefix every command with
|
||||
`MIX_TARGET=my_target`. For example, `MIX_TARGET=rpi3`
|
||||
* Install dependencies with `mix deps.get`
|
||||
* Create firmware with `mix firmware`
|
||||
* Burn to an SD card with `mix firmware.burn`
|
||||
|
||||
## Learn more
|
||||
|
||||
* Official docs: https://hexdocs.pm/nerves/getting-started.html
|
||||
* Official website: http://www.nerves-project.org/
|
||||
* Discussion Slack elixir-lang #nerves ([Invite](https://elixir-slackin.herokuapp.com/))
|
||||
* Source: https://github.com/nerves-project/nerves
|
32
config/config.exs
Normal file
32
config/config.exs
Normal file
|
@ -0,0 +1,32 @@
|
|||
# This file is responsible for configuring your application
|
||||
# and its dependencies with the aid of the Mix.Config module.
|
||||
#
|
||||
# This configuration file is loaded before any dependency and
|
||||
# is restricted to this project.
|
||||
use Mix.Config
|
||||
|
||||
# Customize the firmware. Uncomment all or parts of the following
|
||||
# to add files to the root filesystem or modify the firmware
|
||||
# archive.
|
||||
|
||||
# config :nerves, :firmware,
|
||||
# rootfs_overlay: "rootfs_overlay",
|
||||
# fwup_conf: "config/fwup.conf"
|
||||
|
||||
# Use bootloader to start the main application. See the bootloader
|
||||
# docs for separating out critical OTP applications such as those
|
||||
# involved with firmware updates.
|
||||
config :bootloader,
|
||||
init: [:nerves_runtime, :nerves_init_gadget],
|
||||
app: :duck_tag
|
||||
|
||||
config :nerves_firmware_ssh,
|
||||
authorized_keys: [
|
||||
File.read!(Path.join(['ssh', 'id_nerves.pub']))
|
||||
]
|
||||
|
||||
# Import target specific config. This must remain at the bottom
|
||||
# of this file so it overrides the configuration defined above.
|
||||
# Uncomment to use target specific configurations
|
||||
|
||||
# import_config "#{Mix.Project.config[:target]}.exs"
|
3
lib/duck_tag.ex
Normal file
3
lib/duck_tag.ex
Normal file
|
@ -0,0 +1,3 @@
|
|||
defmodule DuckTag do
|
||||
|
||||
end
|
20
lib/duck_tag/application.ex
Normal file
20
lib/duck_tag/application.ex
Normal file
|
@ -0,0 +1,20 @@
|
|||
defmodule DuckTag.Application do
|
||||
use Application
|
||||
|
||||
# See http://elixir-lang.org/docs/stable/elixir/Application.html
|
||||
# for more information on OTP Applications
|
||||
def start(_type, _args) do
|
||||
import Supervisor.Spec, warn: false
|
||||
|
||||
# Define workers and child supervisors to be supervised
|
||||
children = [
|
||||
# worker(DuckTag.Worker, [arg1, arg2, arg3]),
|
||||
worker(Nerves.IO.RC522, [{DuckTag.RFIDHandler, :tag_scanned}])
|
||||
]
|
||||
|
||||
# See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
|
||||
# for other strategies and supported options
|
||||
opts = [strategy: :one_for_one, name: DuckTag.Supervisor]
|
||||
Supervisor.start_link(children, opts)
|
||||
end
|
||||
end
|
6
lib/duck_tag/rfid_handler.ex
Normal file
6
lib/duck_tag/rfid_handler.ex
Normal file
|
@ -0,0 +1,6 @@
|
|||
defmodule DuckTag.RFIDHandler do
|
||||
def tag_scanned(uid) do
|
||||
IO.puts("TAG SCANNED")
|
||||
IO.inspect(uid)
|
||||
end
|
||||
end
|
86
mix.exs
Normal file
86
mix.exs
Normal file
|
@ -0,0 +1,86 @@
|
|||
defmodule DuckTag.Mixfile do
|
||||
use Mix.Project
|
||||
|
||||
@target System.get_env("MIX_TARGET") || "host"
|
||||
|
||||
Mix.shell.info([:green, """
|
||||
Mix environment
|
||||
MIX_TARGET: #{@target}
|
||||
MIX_ENV: #{Mix.env}
|
||||
""", :reset])
|
||||
|
||||
def project do
|
||||
[app: :duck_tag,
|
||||
version: "0.1.0",
|
||||
elixir: "~> 1.4",
|
||||
target: @target,
|
||||
archives: [nerves_bootstrap: "~> 0.6"],
|
||||
deps_path: "deps/#{@target}",
|
||||
build_path: "_build/#{@target}",
|
||||
lockfile: "mix.lock.#{@target}",
|
||||
build_embedded: Mix.env == :prod,
|
||||
start_permanent: Mix.env == :prod,
|
||||
aliases: aliases(@target),
|
||||
deps: deps()]
|
||||
end
|
||||
|
||||
# Configuration for the OTP application.
|
||||
#
|
||||
# Type `mix help compile.app` for more information.
|
||||
def application, do: application(@target)
|
||||
|
||||
# Specify target specific application configurations
|
||||
# It is common that the application start function will start and supervise
|
||||
# applications which could cause the host to fail. Because of this, we only
|
||||
# invoke DuckTag.start/2 when running on a target.
|
||||
def application("host") do
|
||||
[extra_applications: [:logger]]
|
||||
end
|
||||
def application(_target) do
|
||||
[mod: {DuckTag.Application, []},
|
||||
extra_applications: [:logger]]
|
||||
end
|
||||
|
||||
# Dependencies can be Hex packages:
|
||||
#
|
||||
# {:my_dep, "~> 0.3.0"}
|
||||
#
|
||||
# Or git/path repositories:
|
||||
#
|
||||
# {:my_dep, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
|
||||
#
|
||||
# Type "mix help deps" for more examples and options
|
||||
def deps do
|
||||
[{:nerves, "~> 0.7", runtime: false}] ++
|
||||
deps(@target)
|
||||
end
|
||||
|
||||
# Specify target specific dependencies
|
||||
def deps("host"), do: []
|
||||
def deps(target) do
|
||||
[
|
||||
{:bootloader, "~> 0.1"},
|
||||
{:nerves_runtime, "~> 0.4"},
|
||||
{:nerves_init_gadget, "~> 0.2"},
|
||||
{:nerves_io_rc522, "~> 0.1.0"}
|
||||
] ++ system(target)
|
||||
end
|
||||
|
||||
def system("rpi"), do: [{:nerves_system_rpi, ">= 0.0.0", runtime: false}]
|
||||
def system("rpi0"), do: [{:nerves_system_rpi0, ">= 0.0.0", runtime: false}]
|
||||
def system("rpi2"), do: [{:nerves_system_rpi2, ">= 0.0.0", runtime: false}]
|
||||
def system("rpi3"), do: [{:nerves_system_rpi3, ">= 0.0.0", runtime: false}]
|
||||
def system("bbb"), do: [{:nerves_system_bbb, ">= 0.0.0", runtime: false}]
|
||||
def system("linkit"), do: [{:nerves_system_linkit, ">= 0.0.0", runtime: false}]
|
||||
def system("ev3"), do: [{:nerves_system_ev3, ">= 0.0.0", runtime: false}]
|
||||
def system("qemu_arm"), do: [{:nerves_system_qemu_arm, ">= 0.0.0", runtime: false}]
|
||||
def system(target), do: Mix.raise "Unknown MIX_TARGET: #{target}"
|
||||
|
||||
# We do not invoke the Nerves Env when running on the Host
|
||||
def aliases("host"), do: []
|
||||
def aliases(_target) do
|
||||
["deps.precompile": ["nerves.precompile", "deps.precompile"],
|
||||
"deps.loadpaths": ["deps.loadpaths", "nerves.loadpaths"]]
|
||||
end
|
||||
|
||||
end
|
2
mix.lock.host
Normal file
2
mix.lock.host
Normal file
|
@ -0,0 +1,2 @@
|
|||
%{"distillery": {:hex, :distillery, "1.5.2", "eec18b2d37b55b0bcb670cf2bcf64228ed38ce8b046bb30a9b636a6f5a4c0080", [], [], "hexpm"},
|
||||
"nerves": {:hex, :nerves, "0.7.5", "3aa6a336b2ad6c1c9589cc2b577511b3c4c375c1ba6c533ab9f88adb8c21f0c3", [], [{:distillery, "~> 1.4", [hex: :distillery, repo: "hexpm", optional: false]}], "hexpm"}}
|
19
mix.lock.rpi0
Normal file
19
mix.lock.rpi0
Normal file
|
@ -0,0 +1,19 @@
|
|||
%{"bootloader": {:hex, :bootloader, "0.1.2", "835ddcf50b796714658f342061d5d48ebc34cbd0d81cdbd5a5a8ae00705d72b1", [], [{:distillery, "~> 1.0", [hex: :distillery, repo: "hexpm", optional: false]}], "hexpm"},
|
||||
"distillery": {:hex, :distillery, "1.5.2", "eec18b2d37b55b0bcb670cf2bcf64228ed38ce8b046bb30a9b636a6f5a4c0080", [], [], "hexpm"},
|
||||
"dns": {:hex, :dns, "1.0.1", "1d88187fdf564d937cee202949141090707fd0c9d7fcae903a6878ef24ef5d1e", [], [{:socket, "~> 0.3.12", [hex: :socket, repo: "hexpm", optional: false]}], "hexpm"},
|
||||
"elixir_make": {:hex, :elixir_make, "0.4.0", "992f38fabe705bb45821a728f20914c554b276838433349d4f2341f7a687cddf", [], [], "hexpm"},
|
||||
"mdns": {:hex, :mdns, "0.1.6", "b51b902b15b50e0e1522483c6a5fb073413e3d3d6ef52a44b93a541460b47d29", [], [{:dns, "~> 1.0", [hex: :dns, repo: "hexpm", optional: false]}], "hexpm"},
|
||||
"nerves": {:hex, :nerves, "0.7.5", "3aa6a336b2ad6c1c9589cc2b577511b3c4c375c1ba6c533ab9f88adb8c21f0c3", [], [{:distillery, "~> 1.4", [hex: :distillery, repo: "hexpm", optional: false]}], "hexpm"},
|
||||
"nerves_firmware_ssh": {:hex, :nerves_firmware_ssh, "0.3.1", "e8b1967fa0aff255230be539c68ec868d33884193a385caff957ebad7d6aa8af", [], [{:nerves_runtime, "~> 0.4", [hex: :nerves_runtime, repo: "hexpm", optional: false]}], "hexpm"},
|
||||
"nerves_init_gadget": {:hex, :nerves_init_gadget, "0.2.1", "20f36dd062fb00e2be8817ddff1b9ced9762877cfe23f6ec1d5936a37e3fc2c8", [], [{:mdns, "~> 0.1", [hex: :mdns, repo: "hexpm", optional: false]}, {:nerves_firmware_ssh, "~> 0.2", [hex: :nerves_firmware_ssh, repo: "hexpm", optional: false]}, {:nerves_network, "~> 0.3", [hex: :nerves_network, repo: "hexpm", optional: false]}, {:nerves_runtime, "~> 0.3", [hex: :nerves_runtime, repo: "hexpm", optional: false]}], "hexpm"},
|
||||
"nerves_io_rc522": {:hex, :nerves_io_rc522, "0.1.0", "5a84a23ff2ac6e4c9cc0ea2931e43cf06d175b991bfd8b0ef664192cee25b7a4", [], [{:elixir_make, "~> 0.3", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"},
|
||||
"nerves_network": {:hex, :nerves_network, "0.3.4", "c50a36b8263cda2bee18f408287d0f4474f8367702d170864325abbd5d424e4d", [], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:nerves_network_interface, "~> 0.4.0", [hex: :nerves_network_interface, repo: "hexpm", optional: false]}, {:nerves_wpa_supplicant, "~> 0.3.0", [hex: :nerves_wpa_supplicant, repo: "hexpm", optional: false]}, {:system_registry, "~> 0.4", [hex: :system_registry, repo: "hexpm", optional: false]}], "hexpm"},
|
||||
"nerves_network_interface": {:hex, :nerves_network_interface, "0.4.2", "7a3663a07803f2f9f1e37146714d24ccec1e9349268586e4ed8c41f38641d837", [], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"},
|
||||
"nerves_runtime": {:hex, :nerves_runtime, "0.5.0", "5f4135fe3c94ca5c9e25d677350fbb136f279d14aac4871236961b6f5ccbcfa5", [], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:system_registry, "~> 0.5", [hex: :system_registry, repo: "hexpm", optional: false]}], "hexpm"},
|
||||
"nerves_system_br": {:hex, :nerves_system_br, "0.14.0", "bff3e310e93c7143525257289cc1ba957ebaeebbaf6e97428d0d01c13f440e49", [], [], "hexpm"},
|
||||
"nerves_system_rpi0": {:hex, :nerves_system_rpi0, "0.18.1", "7d24a99b2f456af9d1d99b04618336859344e55954262c920904bc5b9f081508", [], [{:nerves, "~> 0.7", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_system_br, "~> 0.14.0", [hex: :nerves_system_br, repo: "hexpm", optional: false]}, {:nerves_toolchain_armv6_rpi_linux_gnueabi, "~> 0.11.0", [hex: :nerves_toolchain_armv6_rpi_linux_gnueabi, repo: "hexpm", optional: false]}], "hexpm"},
|
||||
"nerves_toolchain_armv6_rpi_linux_gnueabi": {:hex, :nerves_toolchain_armv6_rpi_linux_gnueabi, "0.11.0", "74ee72f15baffe773e41bae1baeef3942fc8f97fa47d9d1bf9db07c17eca90bd", [], [{:nerves, "~> 0.7", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_toolchain_ctng, "~> 1.1", [hex: :nerves_toolchain_ctng, repo: "hexpm", optional: false]}], "hexpm"},
|
||||
"nerves_toolchain_ctng": {:hex, :nerves_toolchain_ctng, "1.1.0", "0f03e4a3f3beef5fe271de0148b9f106c417e57f303f635c21c74b4bd6eb68ee", [], [], "hexpm"},
|
||||
"nerves_wpa_supplicant": {:hex, :nerves_wpa_supplicant, "0.3.2", "19dc7e1248336e7f542b11b2b857ceb5b088d3eb41a6ca75b7b76628dcf67aad", [], [{:elixir_make, "~> 0.3", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"},
|
||||
"socket": {:hex, :socket, "0.3.12", "4a6543815136503fee67eff0932da1742fad83f84c49130c854114153cc549a6", [], [], "hexpm"},
|
||||
"system_registry": {:hex, :system_registry, "0.6.0", "31642177e6002d3cff2ada3553ed4e9c0a6ca015797d62d7d17c0ab8696185fc", [], [], "hexpm"}}
|
40
rel/config.exs
Normal file
40
rel/config.exs
Normal file
|
@ -0,0 +1,40 @@
|
|||
use Mix.Releases.Config,
|
||||
# This sets the default release built by `mix release`
|
||||
default_release: :default,
|
||||
# This sets the default environment used by `mix release`
|
||||
default_environment: :dev
|
||||
|
||||
# For a full list of config options for both releases
|
||||
# and environments, visit https://hexdocs.pm/distillery/configuration.html
|
||||
|
||||
|
||||
# You may define one or more environments in this file,
|
||||
# an environment's settings will override those of a release
|
||||
# when building in that environment, this combination of release
|
||||
# and environment configuration is called a profile
|
||||
|
||||
environment :dev do
|
||||
set cookie: :"JNP[nh_b9$D%]1P{_P2?()9*mv`Z1:E18T.w;kRLZX`_$E;es@1~3k7Upmg*IhH3"
|
||||
end
|
||||
|
||||
environment :prod do
|
||||
set cookie: :"JNP[nh_b9$D%]1P{_P2?()9*mv`Z1:E18T.w;kRLZX`_$E;es@1~3k7Upmg*IhH3"
|
||||
end
|
||||
|
||||
# You may define one or more releases in this file.
|
||||
# If you have not set a default release, or selected one
|
||||
# when running `mix release`, the first release in the file
|
||||
# will be used by default
|
||||
|
||||
release :duck_tag do
|
||||
set version: current_version(:duck_tag)
|
||||
plugin Bootloader.Plugin
|
||||
if System.get_env("NERVES_SYSTEM") do
|
||||
set dev_mode: false
|
||||
set include_src: false
|
||||
set include_erts: System.get_env("ERL_LIB_DIR")
|
||||
set include_system_libs: System.get_env("ERL_SYSTEM_LIB_DIR")
|
||||
set vm_args: "rel/vm.args"
|
||||
end
|
||||
end
|
||||
|
25
rel/vm.args
Normal file
25
rel/vm.args
Normal file
|
@ -0,0 +1,25 @@
|
|||
## Add custom options here
|
||||
|
||||
## Distributed Erlang Options
|
||||
## The cookie needs to be configured prior to vm boot for
|
||||
## for read only filesystem.
|
||||
|
||||
# -name duck_tag@0.0.0.0
|
||||
-setcookie QzZpjmW58COOicHqloZZKRdTN688yjYr6XL8Klbcr6cCT0br3dlKjVeABjGp5nOr
|
||||
|
||||
## Use Ctrl-C to interrupt the current shell rather than invoking the emulator's
|
||||
## break handler and possibly exiting the VM.
|
||||
+Bc
|
||||
|
||||
## Save the shell history between reboots
|
||||
## See http://erlang.org/doc/man/kernel_app.html for additional options
|
||||
-kernel shell_history enabled
|
||||
|
||||
## Start the Elixir shell
|
||||
|
||||
-noshell
|
||||
-user Elixir.IEx.CLI
|
||||
|
||||
## Options added after -extra are interpreted as plain arguments and
|
||||
## can be retrieved using :init.get_plain_arguments().
|
||||
-extra --no-halt
|
27
ssh/id_nerves
Normal file
27
ssh/id_nerves
Normal file
|
@ -0,0 +1,27 @@
|
|||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpQIBAAKCAQEAusMwKRvBtC39nz5qKC3AeeF9iwYWGNZ/Oj8EfyWdcbji4wCv
|
||||
3x3UvxcGAGY307yVNGHRdC8WRUXutpzr5ry/pgs6w8q9P/jUx+MZlRXDJ6/XOeqh
|
||||
95yrV45AdlP6Ke6kP/Gthy9G8pgVjCkwxi8w30EC4FAtvUzaIVWvT9vrflgg93zB
|
||||
9wfnLXM535G8UArz4B+t1+ciWqg/gxF5C9WSvg/hI7dONW0yFpc27oboVOnM+HaH
|
||||
wx0eI5IQ/EtB95EJnWb5wwJGy03M9qHVEj/ueBkZP6WdCquDK87OT7gaWIWcDo9O
|
||||
bSVjRyLGXGEzX7huEMxh8ceySiSgO2z11vXFCQIDAQABAoIBAGMMQ415uAhb38dF
|
||||
rb0zToIVMaS6jJuNnpoAc90O0OpQGJw1cBCPXJYfmsI5c+AqgqLuQcwxcMk6ZniY
|
||||
zo9niOiByh+udSHpUMfVzGqBySdSHX4MzutoPoLH4a4fqWv1sUxsWxB35VOhjsPv
|
||||
0Hs66dttOh5Gx4s+p+zH6Zsb0lAFezikdmAEi7YC7dljkhrbtU5505FTT7QffP1s
|
||||
JxKPkLCqYqRfZTr5MiAmxB9L8hhRx5JyRNF+YuHHPtfHDhbniC1xlkeV5p5QiOG0
|
||||
vfUj88WEhCWLj8+4CanqkyWGGj6/F3M1N1qMxYzOq3qLERFUGHlAkRTisVf9T48s
|
||||
lq4fBeUCgYEA3jIx9GAf30v8iKwBCnjCYk4ulXQrL4I0HRnWpcngr2/sMKkdetnS
|
||||
0Xno4F72pQvCMNUWqvTUTpautoUdHEVqVhWuGjVd7IHmFRvlp/cBs+OGNX9GjZ48
|
||||
sIGENTOuGPr1IwsH0jjOkpD6jw7ca1uCTClbx5vD7VDa6+5F/LeM268CgYEA1yz4
|
||||
YGLc5XF5nCQu4NRFu1LEf1AZTh1ZMNzYAc8pao/pfi6l+0LO0YddxAhZPYB/2xid
|
||||
YGfSkEAtINS4zWRjy/+PL984WDkLoHmNE6jlQzWM46mhCX4JkU/olgAm2Zuo5R8K
|
||||
oxpcQA7ImnZAuGYapWk/bcldxA4xiqsehMm5AMcCgYEAqeOdOGlq1TPnQaSqIxSU
|
||||
I8/9ZD5vaqLWL836xcZmah1cbRRROwZjX9EjkrJpSWaFMwsqisoprnEd4uZCjMQy
|
||||
euGWvelCCDyF7GvpG5UMEzwK+Mp46n0rkBVnPbpnCiiP2Bxt/Xl70KrTOSC2vcs5
|
||||
A/y3dRaPJtukl7IWhxTcuXcCgYEAwweOpIZXI1vD1wNwvfWIsq3lTmPCW+v78G7r
|
||||
FlC3gE+qWeVcKi42mPFxyoGqqTT0LhjUZBIWZwrUHILScc/BKKCdHs3bGxOxdyVU
|
||||
+nHGQzGhXqRcQudLMrtT28mNbQVKg0mscYMuBB2iM2ZlaP2avzxy8kZmx5H5028g
|
||||
PUk9dvcCgYEAgsdiL/IjgaCitgypZfsP01IrMOvt3iVwk4syg7Yz58OiDhrcLt8/
|
||||
gxcdBAmBW705UyhNQPMsReb7kjOJ8rKq/+Ps/YGveExp8e1AcB1c4N1ub7P7hDcj
|
||||
4cZXdvtqt+L5yKDXaZHwL5utMc6NWFqCjGYK8uH1sz+tDLR651LsVRQ=
|
||||
-----END RSA PRIVATE KEY-----
|
1
ssh/id_nerves.pub
Normal file
1
ssh/id_nerves.pub
Normal file
|
@ -0,0 +1 @@
|
|||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6wzApG8G0Lf2fPmooLcB54X2LBhYY1n86PwR/JZ1xuOLjAK/fHdS/FwYAZjfTvJU0YdF0LxZFRe62nOvmvL+mCzrDyr0/+NTH4xmVFcMnr9c56qH3nKtXjkB2U/op7qQ/8a2HL0bymBWMKTDGLzDfQQLgUC29TNohVa9P2+t+WCD3fMH3B+ctcznfkbxQCvPgH63X5yJaqD+DEXkL1ZK+D+Ejt041bTIWlzbuhuhU6cz4dofDHR4jkhD8S0H3kQmdZvnDAkbLTcz2odUSP+54GRk/pZ0Kq4Mrzs5PuBpYhZwOj05tJWNHIsZcYTNfuG4QzGHxx7JKJKA7bPXW9cUJ
|
8
test/duck_tag_test.exs
Normal file
8
test/duck_tag_test.exs
Normal file
|
@ -0,0 +1,8 @@
|
|||
defmodule DuckTagTest do
|
||||
use ExUnit.Case
|
||||
doctest DuckTag
|
||||
|
||||
test "the truth" do
|
||||
assert 1 + 1 == 2
|
||||
end
|
||||
end
|
1
test/test_helper.exs
Normal file
1
test/test_helper.exs
Normal file
|
@ -0,0 +1 @@
|
|||
ExUnit.start
|
Loading…
Reference in a new issue