- Includes tests for templates and their applicationpull/72/head
@ -0,0 +1,59 @@ | |||
%%% This suite can't run tests for built-in templates because | |||
%%% they require being escriptize and we currently don't support | |||
%%% this in here! | |||
-module(rebar_new_SUITE). | |||
-compile(export_all). | |||
-include_lib("common_test/include/ct.hrl"). | |||
-include_lib("eunit/include/eunit.hrl"). | |||
all() -> [app]. | |||
init_per_testcase(Case, Config0) -> | |||
Config = rebar_test_utils:init_rebar_state(Config0), | |||
Name = rebar_test_utils:create_random_name(atom_to_list(Case)), | |||
Data = ?config(data_dir, Config), | |||
mock_home_dir(Data), | |||
mock_empty_escript_templates(), | |||
[{name, Name} | Config]. | |||
end_per_testcase(_, Config) -> | |||
meck:unload(), | |||
Config. | |||
mock_home_dir(Path) -> | |||
meck:new(rebar_dir, [passthrough]), | |||
meck:expect(rebar_dir, home_dir, fun() -> Path end). | |||
mock_empty_escript_templates() -> | |||
%% Can't find escript templates unless we run | |||
%% from the escript, which obviously crashes these here tests. | |||
meck:new(rebar_utils, [passthrough]), | |||
meck:expect(rebar_utils, escript_foldl, fun(_,_,_) -> {ok, []} end). | |||
app(Config) -> | |||
Name = ?config(name, Config), | |||
rebar_test_utils:run_and_check( | |||
Config, [], | |||
["new", "test_app", Name, "author_name=some_name"], | |||
{ok, []} | |||
), | |||
validate_files( | |||
Config, Name, | |||
[{"LICENSE", ["some_name", "anonymous@example.org"]}, | |||
{"README.md", [Name]}, | |||
{".gitignore", []}, | |||
{"rebar.config", []}, | |||
{filename:join(["src", Name++".app.src"]), [Name]}, | |||
{filename:join(["src", Name++"_sup.erl"]), [Name]}, | |||
{filename:join(["src", Name++"_app.erl"]), [Name]} | |||
]). | |||
validate_files(_Config, Name, Checks) -> | |||
[begin | |||
Path = filename:join([Name, File]), | |||
{ok, Bin} = file:read_file(Path), | |||
[{match, _} = re:run(Bin, Pattern, [multiline,global]) | |||
|| Pattern <- Patterns] | |||
end || {File, Patterns} <- Checks], | |||
ok. |
@ -0,0 +1,29 @@ | |||
Copyright (c) {{copyright_year}}, {{author_name}} <{{author_email}}>. | |||
All rights reserved. | |||
Redistribution and use in source and binary forms, with or without | |||
modification, are permitted provided that the following conditions are | |||
met: | |||
* Redistributions of source code must retain the above copyright | |||
notice, this list of conditions and the following disclaimer. | |||
* Redistributions in binary form must reproduce the above copyright | |||
notice, this list of conditions and the following disclaimer in the | |||
documentation and/or other materials provided with the distribution. | |||
* The names of its contributors may not be used to endorse or promote | |||
products derived from this software without specific prior written | |||
permission. | |||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
@ -0,0 +1,9 @@ | |||
{{name}} | |||
===== | |||
{{desc}} | |||
Build | |||
----- | |||
$ rebar3 compile |
@ -0,0 +1,27 @@ | |||
%%%------------------------------------------------------------------- | |||
%% @doc {{name}} public API | |||
%% @end | |||
%%%------------------------------------------------------------------- | |||
-module({{name}}_app). | |||
-behaviour(application). | |||
%% Application callbacks | |||
-export([start/2 | |||
,stop/1]). | |||
%%==================================================================== | |||
%% API | |||
%%==================================================================== | |||
start(_StartType, _StartArgs) -> | |||
{{name}}_sup:start_link(). | |||
%%-------------------------------------------------------------------- | |||
stop(_State) -> | |||
ok. | |||
%%==================================================================== | |||
%% Internal functions | |||
%%==================================================================== |
@ -0,0 +1,18 @@ | |||
.rebar3 | |||
_* | |||
.eunit | |||
*.o | |||
*.beam | |||
*.plt | |||
*.swp | |||
*.swo | |||
.erlang.cookie | |||
ebin | |||
log | |||
erl_crash.dump | |||
.rebar | |||
_rel | |||
_deps | |||
_plugins | |||
_tdeps | |||
logs |
@ -0,0 +1,12 @@ | |||
{application, {{name}}, | |||
[{description, "{{desc}}"} | |||
,{vsn, "0.1.0"} | |||
,{registered, []} | |||
,{mod, {'{{name}}_app', []}} | |||
,{applications, | |||
[kernel | |||
,stdlib | |||
]} | |||
,{env,[]} | |||
,{modules, []} | |||
]}. |
@ -0,0 +1,2 @@ | |||
{erl_opts, [debug_info]}. | |||
{deps, []}. |
@ -0,0 +1,35 @@ | |||
%%%------------------------------------------------------------------- | |||
%% @doc {{name}} top level supervisor. | |||
%% @end | |||
%%%------------------------------------------------------------------- | |||
-module({{name}}_sup). | |||
-behaviour(supervisor). | |||
%% API | |||
-export([start_link/0]). | |||
%% Supervisor callbacks | |||
-export([init/1]). | |||
-define(SERVER, ?MODULE). | |||
%%==================================================================== | |||
%% API functions | |||
%%==================================================================== | |||
start_link() -> | |||
supervisor:start_link({local, ?SERVER}, ?MODULE, []). | |||
%%==================================================================== | |||
%% Supervisor callbacks | |||
%%==================================================================== | |||
%% Child :: {Id,StartFunc,Restart,Shutdown,Type,Modules} | |||
init([]) -> | |||
{ok, { {one_for_all, 0, 1}, []} }. | |||
%%==================================================================== | |||
%% Internal functions | |||
%%==================================================================== |
@ -0,0 +1,12 @@ | |||
{description, "OTP Application"}. | |||
{variables, [ | |||
{name, "mylib", "Name of the OTP application"}, | |||
{desc, "An OTP application", "Short description of the app"} | |||
]}. | |||
{template, "app.erl.dtl", "{{name}}/src/{{name}}_app.erl"}. | |||
{template, "sup.erl.dtl", "{{name}}/src/{{name}}_sup.erl"}. | |||
{template, "otp_app.app.src.dtl", "{{name}}/src/{{name}}.app.src"}. | |||
{template, "rebar.config.dtl", "{{name}}/rebar.config"}. | |||
{template, "gitignore.dtl", "{{name}}/.gitignore"}. | |||
{template, "LICENSE.dtl", "{{name}}/LICENSE"}. | |||
{template, "README.md.dtl", "{{name}}/README.md"}. |