Просмотр исходного кода

Merge branch 'kudryashov-sv-fix-multiple-behaviours-issue'

Andreas Stenius 10 лет назад
Родитель
Сommit
0611cf81ea

+ 3 - 0
.gitignore

@@ -10,3 +10,6 @@ tests/output
 deps
 .emacs*
 .eunit
+/.edts
+/.rebar/
+/*.beam

+ 6 - 8
src/erlydtl_compiler_utils.erl

@@ -483,22 +483,21 @@ lib_module(Name, #dtl_context{ libraries=Libs }) ->
     Mod = proplists:get_value(Name, Libs, Name),
     case code:ensure_loaded(Mod) of
         {module, Mod} ->
-            IsLib = case proplists:get_value(behaviour, Mod:module_info(attributes)) of
-                        Behaviours when is_list(Behaviours) ->
-                            lists:member(erlydtl_library, Behaviours);
-                        _ -> false
-                    end,
-            if IsLib ->
+            case implements_behaviour(erlydtl_library, Mod) of
+                true ->
                     case Mod:version() of
                         ?LIB_VERSION -> {ok, Mod};
                         V -> {load_library, Name, Mod, {version, V}}
                     end;
-               true -> {load_library, Name, Mod, behaviour}
+               false -> {load_library, Name, Mod, behaviour}
             end;
         {error, Reason} ->
             {load_library, Name, Mod, Reason}
     end.
 
+implements_behaviour(Behaviour, Mod) ->
+    [] =:= [Behaviour] -- [B || [B] <- proplists:get_all_values(behaviour, Mod:module_info(attributes))].
+
 read_library(Mod, Section, Which) ->
     [{Name, lib_function(Mod, Fun)}
      || {Name, Fun} <- read_inventory(Mod, Section),
@@ -530,4 +529,3 @@ remove_first_quote(String) ->
 
 remove_last_quote(String) ->
     lists:reverse(remove_first_quote(lists:reverse(String))).
-  

+ 6 - 0
test/erlydtl_lib_test1.erl

@@ -3,6 +3,12 @@
 
 -export([version/0, inventory/1, reverse/1]).
 
+%% dummy behaviour for lib_test2
+-export([behaviour_info/1]).
+behaviour_info(callbacks) -> [].
+%% end behaviour
+
+
 version() -> 1.
 
 inventory(filters) -> [reverse];

+ 16 - 0
test/erlydtl_lib_test2.erl

@@ -0,0 +1,16 @@
+-module(erlydtl_lib_test2).
+%% test multiple behaviours
+-behaviour(erlydtl_lib_test1).
+-behaviour(erlydtl_library).
+
+-export([version/0, inventory/1, reverse/1]).
+
+version() -> 1.
+
+inventory(filters) -> [reverse];
+inventory(tags) -> [].
+
+reverse(String) when is_list(String) ->
+    lists:reverse(String);
+reverse(String) when is_binary(String) ->
+    reverse(binary_to_list(String)).

+ 6 - 0
test/erlydtl_test_defs.erl

@@ -1665,6 +1665,12 @@ all_test_defs() ->
         [{default_libraries, [test1]},
          {libraries, [{test1, erlydtl_lib_test1}]}],
         <<"ytrewQ">>
+       },
+       {"lib with multiple behaviours",
+        <<"{{ QWER|reverse }}">>, [{'QWER', "Qwerty"}], [],
+        [{default_libraries, [test2]},
+         {libraries, [{test2, erlydtl_lib_test2}]}],
+        <<"ytrewQ">>
        }
       ]},
      {"compile time default vars/constants",