anchor.diff:  
   process_macros(Doc, AppDir) ->
       Funs = [<<"shows">>, <<"lists">>, <<"updates">>, <<"filters">>,
  -        <<"spatial">>, <<"validate_update_doc">>],
  +        <<"spatial">>, <<"validate_doc_update">>],
       %% apply macros too functions
       {Doc1, Objects} = process_macros_fun(Funs, Doc, [], Doc, AppDir),
       {Doc2, FinalObjects} = case couchbeam_doc:get_value(<<"views">>, Doc1) of
  
positive.code:         {Sources} ->
              ?DEBUG("process function ~p ~n", [Prop]),
              Sources1 = lists:foldl(fun({Fun1, Source}, Acc) ->
                      Source1 = apply_macros(Source, Doc, AppDir),
                      Parsed = if Source =/= Source1 ->
                              SourceId = get_source_id(Source1),
                              {Fun1, Source1, SourceId,
  
negative.code: get_source_id(Source) ->
      lists:flatten([io_lib:format("~.16b",[N])
              || N <-binary_to_list(crypto:md5(Source))]).
  
  remove_function_name(Source) ->
      re:replace(Source, "^\s*function\s+[^(]*", "function ", [ multiline, caseless, {return, binary}]).
  
  