- 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"}. |