{"action":"created","comment":{"url":"https://api.github.com/repos/2600hz/kazoo/pulls/comments/78712689","id":78712689,"diff_hunk":"@@ -0,0 +1,648 @@\n+-module(fs_prop_usage).\n+\n+%% module for parsing ecallmgr modules, looking for Props from FreeSWITCH\n+\n+-export([process/0, process/1\n+        ,to_header_file/0\n+        ]).\n+\n+-include_lib(\"kazoo_ast/include/kz_ast.hrl\").\n+-include_lib(\"kazoo/src/kz_json.hrl\").\n+\n+-define(DEBUG(_Fmt, _Args), 'ok').\n+%% -define(DEBUG(Fmt, Args), io:format([$~, $p, $  | Fmt], [?LINE | Args])).\n+\n+to_header_file() ->\n+    Usage = process(),\n+    write_usage_to_header(Usage).\n+\n+write_usage_to_header(Usage) ->\n+    {'ok', IO} = file:open(event_filter_filename()\n+                          ,['write'\n+                           ,'delayed_write'\n+                           ]),\n+    write_usage_to_header(Usage, IO).\n+\n+write_usage_to_header(Usage, IO) ->\n+    EventFilters = lists:foldl(fun write_mod_usage/2, sets:new(), Usage),\n+    [First|Sorted] = lists:usort(sets:to_list(EventFilters)),\n+\n+    file:write(IO, io_lib:format(\"-define(FS_EVENT_FITLERS~n       ,[~p~n\", [First])),\n+    lists:foreach(fun(Filter) ->\n+                          file:write(IO, io_lib:format(\"        ,~p~n\", [Filter]))\n+                  end\n+                 ,Sorted\n+                 ),\n+    file:write(IO, \"        ]).\"),\n+    'ok' = file:close(IO),\n+    io:format(\"wrote ~s~n\", [event_filter_filename()]).\n+\n+write_mod_usage({_Mod, Usages}, AccSet) ->\n+    Keys = usage_keys(Usages),\n+    sets:union(AccSet, Keys).\n+\n+usage_keys(Usages) ->\n+    sets:from_list(\n+      lists:usort(\n+        lists:filter(fun is_binary/1\n+                    ,lists:foldl(fun usage_keys/2, [], Usages)\n+                    )\n+       )\n+     ).\n+\n+usage_keys({'props', 'get_value', Key, _VarName, _Default}, Acc) ->\n+    [Key |Acc];\n+usage_keys({'props', 'get_integer_value', Key, _VarName, _Default}, Acc) ->\n+    [Key |Acc];\n+usage_keys({'props', 'get_binary_value', Key, _VarName, _Default}, Acc) ->\n+    [Key |Acc];\n+usage_keys({'props', 'get_is_true', Key, _VarName, _Default}, Acc) ->\n+    [Key |Acc];\n+usage_keys({'props', 'is_true', Key, _VarName, _Default}, Acc) ->\n+    [Key |Acc];\n+usage_keys({'props', 'get_first_defined', Keys, _VarName, _Default}, Acc) ->\n+    Keys ++ Acc;\n+usage_keys({'props', 'delete_keys', Keys, _VarName, _Default}, Acc) ->\n+    Keys ++ Acc;\n+usage_keys({'props', 'filter', 'undefined', _VarName, _Default}, Acc) -> Acc;\n+usage_keys({'props', 'insert_values', _Keys, _VarName, _Default}, Acc) -> Acc;\n+usage_keys({'props', 'set_values', _Values, _VarName, 'undefined'}, Acc) -> Acc.\n+\n+event_filter_filename() ->\n+    filename:join([code:lib_dir('ecallmgr', 'src')\n+                  ,\"fs_event_filters.hrl\"\n+                  ]).\n+\n+-record(usage, {usages = [] %% places the Data is accessed\n+               ,data_var_name = 'Props' %% Tracks current var name\n+               ,data_var_aliases = [] %% typically when kz_json:set_value is used\n+               ,current_module %% what module are we currently in\n+               ,functions = [] %% AST functions loaded\n+               ,visited = [] %% MFAs visited (to stop recursion)\n+               }).\n+\n+-spec process() -> [{module(), list()}].\n+process() ->\n+    io:format(\"processing ecallmgr FreeSWITCH Props usage: \"),\n+    Usages = [{Module, Usages} ||\n+                 Module <- kz_ast_util:app_modules('ecallmgr'),\n+                 (Usages = process(Module)) =/= 'undefined'\n+             ],\n+    io:format(\" done~n\"),\n+    Usages.\n+\n+-spec process(module()) -> list().\n+process(Module) when is_atom(Module) ->\n+    U = process_action(Module),\n+    io:format(\".\"),\n+    ?DEBUG(\"  usage for ~p: ~p~n\", [Module, U]),\n+    U.\n+\n+process_action(Module) ->\n+    FArgs = function_args(Module),\n+    process_action(Module, FArgs).\n+\n+process_action(Module, {_F, _As}=FArg) ->\n+    process_action(Module, [FArg]);\n+process_action(Module, FArgs) ->\n+    case lists:foldl(fun({F, Args}, Acc) ->\n+                             process_action(Module, F, Args, Acc)\n+                     end\n+                    ,[]\n+                    ,FArgs\n+                    )\n+    of\n+        [] -> 'undefined';\n+        Usages -> Usages\n+    end.\n+\n+\n+process_action(_M, 'undefined', _As, Acc) -> Acc;\n+process_action(Module, Function, Args, Acc) ->\n+    #usage{usages=Us} = process_mfa_call(#usage{current_module=Module}\n+                                        ,Module, Function, Args\n+                                        ),\n+    Us ++ Acc.\n+\n+%% define entry points for modules\n+function_args('ecallmgr_fs_event_stream') ->\n+    {'handle_fs_props'\n+    ,[?VAR(0, 'UUID'), ?VAR(0, 'Props'), ?VAR(0, 'Node'), ?VAR(0, 'SwitchURI'), ?VAR(0, 'SwitchURL')]\n+    };\n+function_args('ecallmgr_call_events') ->\n+    {'process_channel_event'\n+    ,[?VAR(0, 'Props')]\n+    };\n+function_args('ecallmgr_fs_config') ->\n+    {'handle_config_req'\n+    ,[?VAR(0, 'Node'), ?VAR(0, 'Id'), ?VAR(0, 'Conf'), ?VAR(0, 'Props')]\n+    };\n+function_args('ecallmgr_fs_route') ->\n+    {'handle_fetch'\n+    ,[?VAR(0,'Section'), ?VAR(0, 'FSId'), ?VAR(0, 'CallId'), ?VAR(0, 'Props'), ?VAR(0, 'Node')]\n+    };\n+function_args('ecallmgr_fs_authn') ->\n+    {'handle_directory_lookup'\n+    ,[?VAR(0, 'Id'), ?VAR(0, 'Props'), ?VAR(0, 'Node')]\n+    };\n+function_args('ecallmgr_fs_authz') ->\n+    {'authorize'\n+    ,[?VAR(0, 'Props'), ?VAR(0, 'CallId'), ?VAR(0, 'Node')]\n+    };\n+function_args('ecallmgr_fs_channel') ->\n+    {'handle_fs_event'\n+    ,[?VAR(0, 'UUID'), ?VAR(0, 'Props'), ?VAR(0, 'Node'), ?VAR(0, 'Options')]\n+    };\n+function_args('ecallmgr_fs_conference') ->\n+    {'handle_conf_event'\n+    ,[?VAR(0, 'Props'), ?VAR(0, 'Node')]\n+    };\n+function_args('ecallmgr_fs_conferences') ->\n+    [{'conference_from_props'\n+     ,[?VAR(0, 'Props'), ?VAR(0, 'Node')]\n+     }\n+    ,{'participant_from_props'\n+     ,[?VAR(0, 'Props'), ?VAR(0, 'Node'), ?VAR(0, 'CallInfo')]\n+     }\n+    ];\n+function_args('ecallmgr_fs_loopback') ->\n+    {'filter'\n+    ,[?VAR(0, 'Node'), ?VAR(0, 'UUID'), ?VAR(0, 'Props')]\n+    };\n+function_args('ecallmgr_fs_msg') ->\n+    {'process_fs_event'\n+    ,[?VAR(0, 'Node'), ?VAR(0, 'Props')]\n+    };\n+function_args('ecallmgr_fs_recordings') ->\n+    {'process_event'\n+    ,[?VAR(0, 'UUID'), ?VAR(0, 'Props'), ?VAR(0, 'Node')]\n+    };\n+function_args('ecallmgr_fs_router_call') ->\n+    {'process_route_req'\n+    ,[?VAR(0,'Section'), ?VAR(0, 'Node'), ?VAR(0, 'FetchId'), ?VAR(0, 'CallId'), ?VAR(0, 'Props')]\n+    };\n+function_args('ecallmgr_fs_router_text') ->\n+    {'process_route_req'\n+    ,[?VAR(0,'Section'), ?VAR(0, 'Node'), ?VAR(0, 'FetchId'), ?VAR(0, 'MsgId'), ?VAR(0, 'Props')]\n+    };\n+function_args('ecallmgr_call_control') ->\n+    [{'handle_event_info'\n+     ,[?VAR(0, 'CallId'), ?VAR(0, 'Props'), ?VAR(0, 'State')]\n+     }\n+    ,{'handle_other_event_info'\n+     ,[?VAR(0, 'CallId'), ?VAR(0, 'Props'), ?VAR(0, 'State')]\n+     }\n+    ];\n+function_args(_M) ->\n+    {'undefined', []}.\n+\n+process_expression(Acc, ?TUPLE(Elements)) ->\n+    process_tuple(Acc, Elements);\n+process_expression(Acc, ?CLAUSE(Exprs, _Guards, Body)) ->\n+    process_clause_body(process_expressions(Acc, Exprs), Body);\n+process_expression(Acc, ?MATCH(Left, Right)) ->\n+    process_match(Acc, Left, Right);\n+process_expression(#usage{current_module=Module}=Acc, ?FUN_ARGS(Function, Args)) ->\n+    process_mfa(Acc, Module, Function, Args);\n+process_expression(Acc, ?DYN_FUN_ARGS(_Function, Args)) ->\n+    process_expressions(Acc, Args);\n+process_expression(Acc, ?MOD_FUN_ARGS(Module, Function, Args)) ->\n+    process_mfa(Acc, Module, Function, Args);\n+process_expression(Acc, ?DYN_MOD_FUN_ARGS(_Module, _Function, _Args)) ->\n+    ?DEBUG(\"  skipping dyn module call~n\", []),\n+    Acc;\n+process_expression(Acc, ?GEN_MOD_FUN_ARGS(_M, _F, _As)) ->\n+    ?DEBUG(\"  skipping (~p):~p(~p)\", [_M, _F, _As]),\n+    Acc;\n+process_expression(Acc, ?ANON(Clauses)) ->\n+    process_expressions(Acc, Clauses);\n+process_expression(Acc, ?MFA(_M, _F, _Arity)) ->\n+    Acc;\n+process_expression(#usage{current_module=M}=Acc, ?FA(F, Arity)) ->\n+    process_mf_arity(Acc, M, F, Arity);\n+process_expression(Acc, ?VAR(_Name)) ->\n+    %% Last expression is a variable to return to caller\n+    Acc;\n+process_expression(Acc, ?CATCH(Expression)) ->\n+    process_expression(Acc, Expression);\n+process_expression(Acc, ?LAGER) -> Acc;\n+process_expression(Acc, ?CASE(Expression, Clauses)) ->\n+    process_expressions(process_expression(Acc, Expression)\n+                       ,Clauses\n+                       );\n+process_expression(Acc, ?ATOM(_)) -> Acc;\n+process_expression(Acc, ?INTEGER(_)) -> Acc;\n+process_expression(Acc, ?CHAR(_)) -> Acc;\n+process_expression(Acc, ?BINARY_MATCH(_)) -> Acc;\n+process_expression(Acc, ?EMPTY_LIST) -> Acc;\n+process_expression(Acc, ?LIST(Head, Tail)) ->\n+    process_list(Acc, Head, Tail);\n+process_expression(Acc, ?RECORD(_Name, Fields)) ->\n+    process_record_fields(Acc, Fields);\n+process_expression(Acc, ?RECORD_FIELD_ACCESS(_RecordName, _Name, _Value)) ->\n+    Acc;\n+process_expression(Acc, ?RECORD_VAR(_VarName, _RecName, Fields)) ->\n+    process_expressions(Acc, Fields);\n+process_expression(Acc, ?RECORD_FIELD_BIND(_Key, Value)) ->\n+    process_expression(Acc, Value);\n+process_expression(Acc, ?RECORD_INDEX(_Name, _Field)) -> Acc;\n+process_expression(Acc, ?BINARY_OP(_, First, Second)) ->\n+    process_expressions(Acc, [First, Second]);\n+process_expression(Acc, ?UNARY_OP(_, Operand)) ->\n+    process_expression(Acc, Operand);\n+process_expression(Acc, ?STRING(_Value)) ->\n+    Acc;\n+process_expression(Acc, ?TRY_BODY(Body, CatchClauses)) ->\n+    process_expressions(process_expressions(Acc, Body)\n+                       ,CatchClauses\n+                       );\n+process_expression(Acc, ?TRY_EXPR(Exprs, Clauses, CatchClauses)) ->\n+    process_expressions(process_expressions(process_expressions(Acc, Exprs)\n+                                           ,Clauses\n+                                           )\n+                       ,CatchClauses\n+                       );\n+\n+process_expression(Acc, ?LC(Expr, Qualifiers)) ->\n+    process_expressions(process_expression(Acc, Expr)\n+                       ,Qualifiers\n+                       );\n+process_expression(Acc, ?LC_GENERATOR(Pattern, Expr)) ->\n+    process_expressions(Acc, [Pattern, Expr]);\n+process_expression(Acc, ?LC_BIN_GENERATOR(Pattern, Expr)) ->\n+    process_expressions(Acc, [Pattern, Expr]);\n+\n+process_expression(#usage{current_module=_M}=Acc, _Expression) ->\n+    io:format(\"~nskipping expression in ~p: ~p~n\", [_M, _Expression]),","path":"core/kazoo_ast/src/fs_prop_usage.erl","position":276,"original_position":276,"commit_id":"16cf454181ef58bd7118b62aaaac2d9f26bf97a4","original_commit_id":"16cf454181ef58bd7118b62aaaac2d9f26bf97a4","user":{"login":"fenollp","id":278727,"avatar_url":"https://avatars.githubusercontent.com/u/278727?v=3","gravatar_id":"","url":"https://api.github.com/users/fenollp","html_url":"https://github.com/fenollp","followers_url":"https://api.github.com/users/fenollp/followers","following_url":"https://api.github.com/users/fenollp/following{/other_user}","gists_url":"https://api.github.com/users/fenollp/gists{/gist_id}","starred_url":"https://api.github.com/users/fenollp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fenollp/subscriptions","organizations_url":"https://api.github.com/users/fenollp/orgs","repos_url":"https://api.github.com/users/fenollp/repos","events_url":"https://api.github.com/users/fenollp/events{/privacy}","received_events_url":"https://api.github.com/users/fenollp/received_events","type":"User","site_admin":false},"body":"should use ?DEBUG","created_at":"2016-09-14T09:13:15Z","updated_at":"2016-09-14T09:13:15Z","html_url":"https://github.com/2600hz/kazoo/pull/2547#discussion_r78712689","pull_request_url":"https://api.github.com/repos/2600hz/kazoo/pulls/2547","_links":{"self":{"href":"https://api.github.com/repos/2600hz/kazoo/pulls/comments/78712689"},"html":{"href":"https://github.com/2600hz/kazoo/pull/2547#discussion_r78712689"},"pull_request":{"href":"https://api.github.com/repos/2600hz/kazoo/pulls/2547"}}},"pull_request":{"url":"https://api.github.com/repos/2600hz/kazoo/pulls/2547","id":85137988,"html_url":"https://github.com/2600hz/kazoo/pull/2547","diff_url":"https://github.com/2600hz/kazoo/pull/2547.diff","patch_url":"https://github.com/2600hz/kazoo/pull/2547.patch","issue_url":"https://api.github.com/repos/2600hz/kazoo/issues/2547","number":2547,"state":"open","locked":false,"title":"Fs headers","user":{"login":"jamesaimonetti","id":160921,"avatar_url":"https://avatars.githubusercontent.com/u/160921?v=3","gravatar_id":"","url":"https://api.github.com/users/jamesaimonetti","html_url":"https://github.com/jamesaimonetti","followers_url":"https://api.github.com/users/jamesaimonetti/followers","following_url":"https://api.github.com/users/jamesaimonetti/following{/other_user}","gists_url":"https://api.github.com/users/jamesaimonetti/gists{/gist_id}","starred_url":"https://api.github.com/users/jamesaimonetti/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jamesaimonetti/subscriptions","organizations_url":"https://api.github.com/users/jamesaimonetti/orgs","repos_url":"https://api.github.com/users/jamesaimonetti/repos","events_url":"https://api.github.com/users/jamesaimonetti/events{/privacy}","received_events_url":"https://api.github.com/users/jamesaimonetti/received_events","type":"User","site_admin":false},"body":"build a header file with all known freeswitch event headers used. ","created_at":"2016-09-13T22:35:15Z","updated_at":"2016-09-14T09:13:15Z","closed_at":null,"merged_at":null,"merge_commit_sha":"37b3d60c27ab62de87443fc015c149ff77bba59d","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/2600hz/kazoo/pulls/2547/commits","review_comments_url":"https://api.github.com/repos/2600hz/kazoo/pulls/2547/comments","review_comment_url":"https://api.github.com/repos/2600hz/kazoo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/2600hz/kazoo/issues/2547/comments","statuses_url":"https://api.github.com/repos/2600hz/kazoo/statuses/16cf454181ef58bd7118b62aaaac2d9f26bf97a4","head":{"label":"2600hz:fs-headers","ref":"fs-headers","sha":"16cf454181ef58bd7118b62aaaac2d9f26bf97a4","user":{"login":"2600hz","id":408801,"avatar_url":"https://avatars.githubusercontent.com/u/408801?v=3","gravatar_id":"","url":"https://api.github.com/users/2600hz","html_url":"https://github.com/2600hz","followers_url":"https://api.github.com/users/2600hz/followers","following_url":"https://api.github.com/users/2600hz/following{/other_user}","gists_url":"https://api.github.com/users/2600hz/gists{/gist_id}","starred_url":"https://api.github.com/users/2600hz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/2600hz/subscriptions","organizations_url":"https://api.github.com/users/2600hz/orgs","repos_url":"https://api.github.com/users/2600hz/repos","events_url":"https://api.github.com/users/2600hz/events{/privacy}","received_events_url":"https://api.github.com/users/2600hz/received_events","type":"Organization","site_admin":false},"repo":{"id":2966241,"name":"kazoo","full_name":"2600hz/kazoo","owner":{"login":"2600hz","id":408801,"avatar_url":"https://avatars.githubusercontent.com/u/408801?v=3","gravatar_id":"","url":"https://api.github.com/users/2600hz","html_url":"https://github.com/2600hz","followers_url":"https://api.github.com/users/2600hz/followers","following_url":"https://api.github.com/users/2600hz/following{/other_user}","gists_url":"https://api.github.com/users/2600hz/gists{/gist_id}","starred_url":"https://api.github.com/users/2600hz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/2600hz/subscriptions","organizations_url":"https://api.github.com/users/2600hz/orgs","repos_url":"https://api.github.com/users/2600hz/repos","events_url":"https://api.github.com/users/2600hz/events{/privacy}","received_events_url":"https://api.github.com/users/2600hz/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/2600hz/kazoo","description":"","fork":false,"url":"https://api.github.com/repos/2600hz/kazoo","forks_url":"https://api.github.com/repos/2600hz/kazoo/forks","keys_url":"https://api.github.com/repos/2600hz/kazoo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/2600hz/kazoo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/2600hz/kazoo/teams","hooks_url":"https://api.github.com/repos/2600hz/kazoo/hooks","issue_events_url":"https://api.github.com/repos/2600hz/kazoo/issues/events{/number}","events_url":"https://api.github.com/repos/2600hz/kazoo/events","assignees_url":"https://api.github.com/repos/2600hz/kazoo/assignees{/user}","branches_url":"https://api.github.com/repos/2600hz/kazoo/branches{/branch}","tags_url":"https://api.github.com/repos/2600hz/kazoo/tags","blobs_url":"https://api.github.com/repos/2600hz/kazoo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/2600hz/kazoo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/2600hz/kazoo/git/refs{/sha}","trees_url":"https://api.github.com/repos/2600hz/kazoo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/2600hz/kazoo/statuses/{sha}","languages_url":"https://api.github.com/repos/2600hz/kazoo/languages","stargazers_url":"https://api.github.com/repos/2600hz/kazoo/stargazers","contributors_url":"https://api.github.com/repos/2600hz/kazoo/contributors","subscribers_url":"https://api.github.com/repos/2600hz/kazoo/subscribers","subscription_url":"https://api.github.com/repos/2600hz/kazoo/subscription","commits_url":"https://api.github.com/repos/2600hz/kazoo/commits{/sha}","git_commits_url":"https://api.github.com/repos/2600hz/kazoo/git/commits{/sha}","comments_url":"https://api.github.com/repos/2600hz/kazoo/comments{/number}","issue_comment_url":"https://api.github.com/repos/2600hz/kazoo/issues/comments{/number}","contents_url":"https://api.github.com/repos/2600hz/kazoo/contents/{+path}","compare_url":"https://api.github.com/repos/2600hz/kazoo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/2600hz/kazoo/merges","archive_url":"https://api.github.com/repos/2600hz/kazoo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/2600hz/kazoo/downloads","issues_url":"https://api.github.com/repos/2600hz/kazoo/issues{/number}","pulls_url":"https://api.github.com/repos/2600hz/kazoo/pulls{/number}","milestones_url":"https://api.github.com/repos/2600hz/kazoo/milestones{/number}","notifications_url":"https://api.github.com/repos/2600hz/kazoo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/2600hz/kazoo/labels{/name}","releases_url":"https://api.github.com/repos/2600hz/kazoo/releases{/id}","deployments_url":"https://api.github.com/repos/2600hz/kazoo/deployments","created_at":"2011-12-12T18:08:02Z","updated_at":"2016-09-11T19:32:59Z","pushed_at":"2016-09-14T09:08:29Z","git_url":"git://github.com/2600hz/kazoo.git","ssh_url":"git@github.com:2600hz/kazoo.git","clone_url":"https://github.com/2600hz/kazoo.git","svn_url":"https://github.com/2600hz/kazoo","homepage":"","size":445195,"stargazers_count":395,"watchers_count":395,"language":"Erlang","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":201,"mirror_url":null,"open_issues_count":10,"forks":201,"open_issues":10,"watchers":395,"default_branch":"master"}},"base":{"label":"2600hz:master","ref":"master","sha":"3acec8f352bcc42aec48e903018698f81bca53d2","user":{"login":"2600hz","id":408801,"avatar_url":"https://avatars.githubusercontent.com/u/408801?v=3","gravatar_id":"","url":"https://api.github.com/users/2600hz","html_url":"https://github.com/2600hz","followers_url":"https://api.github.com/users/2600hz/followers","following_url":"https://api.github.com/users/2600hz/following{/other_user}","gists_url":"https://api.github.com/users/2600hz/gists{/gist_id}","starred_url":"https://api.github.com/users/2600hz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/2600hz/subscriptions","organizations_url":"https://api.github.com/users/2600hz/orgs","repos_url":"https://api.github.com/users/2600hz/repos","events_url":"https://api.github.com/users/2600hz/events{/privacy}","received_events_url":"https://api.github.com/users/2600hz/received_events","type":"Organization","site_admin":false},"repo":{"id":2966241,"name":"kazoo","full_name":"2600hz/kazoo","owner":{"login":"2600hz","id":408801,"avatar_url":"https://avatars.githubusercontent.com/u/408801?v=3","gravatar_id":"","url":"https://api.github.com/users/2600hz","html_url":"https://github.com/2600hz","followers_url":"https://api.github.com/users/2600hz/followers","following_url":"https://api.github.com/users/2600hz/following{/other_user}","gists_url":"https://api.github.com/users/2600hz/gists{/gist_id}","starred_url":"https://api.github.com/users/2600hz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/2600hz/subscriptions","organizations_url":"https://api.github.com/users/2600hz/orgs","repos_url":"https://api.github.com/users/2600hz/repos","events_url":"https://api.github.com/users/2600hz/events{/privacy}","received_events_url":"https://api.github.com/users/2600hz/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/2600hz/kazoo","description":"","fork":false,"url":"https://api.github.com/repos/2600hz/kazoo","forks_url":"https://api.github.com/repos/2600hz/kazoo/forks","keys_url":"https://api.github.com/repos/2600hz/kazoo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/2600hz/kazoo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/2600hz/kazoo/teams","hooks_url":"https://api.github.com/repos/2600hz/kazoo/hooks","issue_events_url":"https://api.github.com/repos/2600hz/kazoo/issues/events{/number}","events_url":"https://api.github.com/repos/2600hz/kazoo/events","assignees_url":"https://api.github.com/repos/2600hz/kazoo/assignees{/user}","branches_url":"https://api.github.com/repos/2600hz/kazoo/branches{/branch}","tags_url":"https://api.github.com/repos/2600hz/kazoo/tags","blobs_url":"https://api.github.com/repos/2600hz/kazoo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/2600hz/kazoo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/2600hz/kazoo/git/refs{/sha}","trees_url":"https://api.github.com/repos/2600hz/kazoo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/2600hz/kazoo/statuses/{sha}","languages_url":"https://api.github.com/repos/2600hz/kazoo/languages","stargazers_url":"https://api.github.com/repos/2600hz/kazoo/stargazers","contributors_url":"https://api.github.com/repos/2600hz/kazoo/contributors","subscribers_url":"https://api.github.com/repos/2600hz/kazoo/subscribers","subscription_url":"https://api.github.com/repos/2600hz/kazoo/subscription","commits_url":"https://api.github.com/repos/2600hz/kazoo/commits{/sha}","git_commits_url":"https://api.github.com/repos/2600hz/kazoo/git/commits{/sha}","comments_url":"https://api.github.com/repos/2600hz/kazoo/comments{/number}","issue_comment_url":"https://api.github.com/repos/2600hz/kazoo/issues/comments{/number}","contents_url":"https://api.github.com/repos/2600hz/kazoo/contents/{+path}","compare_url":"https://api.github.com/repos/2600hz/kazoo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/2600hz/kazoo/merges","archive_url":"https://api.github.com/repos/2600hz/kazoo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/2600hz/kazoo/downloads","issues_url":"https://api.github.com/repos/2600hz/kazoo/issues{/number}","pulls_url":"https://api.github.com/repos/2600hz/kazoo/pulls{/number}","milestones_url":"https://api.github.com/repos/2600hz/kazoo/milestones{/number}","notifications_url":"https://api.github.com/repos/2600hz/kazoo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/2600hz/kazoo/labels{/name}","releases_url":"https://api.github.com/repos/2600hz/kazoo/releases{/id}","deployments_url":"https://api.github.com/repos/2600hz/kazoo/deployments","created_at":"2011-12-12T18:08:02Z","updated_at":"2016-09-11T19:32:59Z","pushed_at":"2016-09-14T09:08:29Z","git_url":"git://github.com/2600hz/kazoo.git","ssh_url":"git@github.com:2600hz/kazoo.git","clone_url":"https://github.com/2600hz/kazoo.git","svn_url":"https://github.com/2600hz/kazoo","homepage":"","size":445195,"stargazers_count":395,"watchers_count":395,"language":"Erlang","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":201,"mirror_url":null,"open_issues_count":10,"forks":201,"open_issues":10,"watchers":395,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/2600hz/kazoo/pulls/2547"},"html":{"href":"https://github.com/2600hz/kazoo/pull/2547"},"issue":{"href":"https://api.github.com/repos/2600hz/kazoo/issues/2547"},"comments":{"href":"https://api.github.com/repos/2600hz/kazoo/issues/2547/comments"},"review_comments":{"href":"https://api.github.com/repos/2600hz/kazoo/pulls/2547/comments"},"review_comment":{"href":"https://api.github.com/repos/2600hz/kazoo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/2600hz/kazoo/pulls/2547/commits"},"statuses":{"href":"https://api.github.com/repos/2600hz/kazoo/statuses/16cf454181ef58bd7118b62aaaac2d9f26bf97a4"}}}}
{"actor":{"display_login":"fenollp"}}