{"action":"created","comment":{"url":"https://api.github.com/repos/2600hz/kazoo/pulls/comments/194578944","pull_request_review_id":127774753,"id":194578944,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5NDU3ODk0NA==","diff_hunk":"@@ -0,0 +1,282 @@\n+%%%-----------------------------------------------------------------------------\n+%%% @copyright (C) 2012-2018, 2600Hz\n+%%% @doc\n+%%% @end\n+%%%-----------------------------------------------------------------------------\n+-module(kz_fax_converter).\n+\n+-export([convert/4\n+        ,do_openoffice_to_pdf/2\n+        ]).\n+\n+-include_lib(\"kazoo_convert/include/kz_convert.hrl\").\n+\n+%%------------------------------------------------------------------------------\n+%% @doc This function converts the `Content' from the `To' mimetype to the\n+%% `From' mimetype.\n+%%\n+%% Arguments Description:\n+%% <ul>\n+%% <li><strong>From:</strong> is a mimetype binary that specifies the format of\n+%% the Content passed in to convert.</li>\n+%% <li><strong>To:</strong> is a mimetype binary that specifies the format the\n+%% Content is to be converted.</li>\n+%% <li><strong>Content:</strong> content can be filepath to the source file or\n+%% a binary containing the contents of the file to be converted.</li>\n+%% <li><strong>Optinos:</strong> a proplist of the converter options</li>\n+%% </ul>\n+%%\n+%% Options:\n+%% <ul>\n+%% <li><strong>job_id:</strong> the unique ID of the job (like a fax job_id).\n+%% Used for naming the output file with the extension derived from the `To' format</li>\n+%% <li><strong>output_type:</strong> return the converted doc as a raw `binary' containing\n+%% the contents of the file or `path' to receive a path to the converted file in the response.\n+%% The default is `path'.</li>\n+%% <li><strong>tmp_dir:</strong> the working directory where the conversion will take place.</li>\n+%% </ul>\n+%%\n+%% Cache file handling:\n+%% The converter (and any alternative modules) should always delete any files created in the process,\n+%% including the input file if the {'file', Filepath} `Content' format is specified.\n+%% If `output_type' is `path' the file converted file will be returned and deletion of this file will be\n+%% the responsiblity of the caller.\n+%%\n+%% @end\n+%%------------------------------------------------------------------------------\n+-spec convert(kz_term:ne_binary(), kz_term:ne_binary(), binary()|{'file', filename:name()}, kz_term:proplist()) ->\n+                     {'ok', any()}|{integer(), non_neg_integer()}|{'error', any()}.\n+convert(From, To, Content, Opts) ->\n+    Options = maps:from_list(\n+                [{<<\"from_format\">>, From}\n+                ,{<<\"to_format\">>, To}\n+                ,{<<\"job_id\">>, props:get_value(<<\"job_id\">>, Opts, kz_binary:rand_hex(12))}\n+                 | props:delete_keys([<<\"job_id\">>], Opts)\n+                ]),\n+    Filename = save_file(Content, Options),\n+    lager:info(\"converting document ~s from ~s to ~s\", [Filename, From, To]),\n+    case run_convert(eval_format(From, To), To, Filename, Options) of\n+        {'ok', _}=Ok ->\n+            lager:info(\"succesfully converted file: ~s to format: ~s\", [Filename, To]),\n+            Ok;\n+        {'ok', _, _}=Ok ->\n+            lager:info(\"succesfully converted file: ~s to format: ~s\", [Filename, To]),\n+            Ok;\n+        {'error', Message}=Error ->\n+            lager:error(\"conversion failed with error: ~p\", [Message]),\n+            Error\n+    end.\n+\n+-spec eval_format(kz_term:ne_binary(), kz_term:ne_binary()) -> kz_term:list().\n+eval_format(<<\"image/\", _SubType/binary>>, ?TIFF_MIME) ->\n+    [fun image_to_tiff/2\n+    ];\n+eval_format(Format, Format) ->\n+    [];\n+eval_format(?TIFF_MIME, ?PDF_MIME) ->\n+    [fun tiff_to_pdf/2\n+    ];\n+eval_format(?PDF_MIME, ?TIFF_MIME) ->\n+    [fun pdf_to_tiff/2\n+    ];\n+eval_format(<<?OPENXML_MIME_PREFIX, _/binary>>, ?TIFF_MIME) ->\n+    [fun openoffice_to_pdf/2\n+    ,fun pdf_to_tiff/2\n+    ];\n+eval_format(CT, ?TIFF_MIME) when ?OPENOFFICE_COMPATIBLE(CT) ->\n+    [fun openoffice_to_pdf/2\n+    ,fun pdf_to_tiff/2\n+    ];\n+eval_format(<<?OPENOFFICE_MIME_PREFIX, _/binary>>, ?TIFF_MIME) ->\n+    [fun openoffice_to_pdf/2\n+    ,fun pdf_to_tiff/2\n+    ];\n+eval_format(<<?OPENXML_MIME_PREFIX, _/binary>>, ?PDF_MIME) ->\n+    [fun openoffice_to_pdf/2\n+    ];\n+eval_format(<<?OPENOFFICE_MIME_PREFIX, _/binary>>, ?PDF_MIME) ->\n+    [fun openoffice_to_pdf/2\n+    ];\n+eval_format(CT, ?PDF_MIME) when ?OPENOFFICE_COMPATIBLE(CT) ->\n+    [fun openoffice_to_pdf/2\n+    ];\n+eval_format(FromFormat, ToFormat) ->\n+    {'error', <<\"invalid conversion requested: \", FromFormat/binary, \" to: \", ToFormat/binary>>}.\n+\n+-spec run_convert({atom(), kz_term:ne_binary()}, kz_term:ne_binary(), kz_term:ne_binary(), kz_term:proplist()) -> kz_term:list().\n+run_convert({'error', _}=Error, _ToFormat, _FilePath, _Options) ->\n+    Error;\n+run_convert([Operation|Operations], ToFormat, FilePath, Options) ->\n+    case Operation(FilePath, Options) of\n+        {'ok', OutputPath} ->\n+            maybe_delete_previous_file(FilePath, OutputPath),\n+            run_convert(Operations, ToFormat, OutputPath, Options);\n+        Error -> Error\n+    end;\n+run_convert([], ToFormat, FilePath, Options) ->\n+    case validate_output(ToFormat, FilePath, Options) of\n+        {'ok', _} ->\n+            format_output(ToFormat, FilePath, Options);\n+        Error -> Error\n+    end.\n+\n+-spec format_output(kz_term:ne_binary(), kz_term:ne_binary(), map()) ->\n+                           {'ok', any()}|{integer(), non_neg_integer()}|{'error', any()}.\n+format_output(?TIFF_MIME, FilePath, #{<<\"output_type\">> := 'path', <<\"count_pages\">> := 'true'}) ->\n+    {'ok', FilePath, get_sizes(FilePath)};\n+format_output(?TIFF_MIME, FilePath, #{<<\"output_type\">> := 'binary', <<\"count_pages\">> := 'true'}) ->\n+    case file:read_file(FilePath) of\n+        {'ok', Content} ->\n+            Sizes = get_sizes(FilePath),\n+            kz_util:delete_file(FilePath),\n+            {'ok', Content, Sizes};\n+        Error -> Error\n+    end;\n+format_output(?TIFF_MIME, FilePath, #{<<\"count_pages\">> := 'true'}) ->\n+    {'ok', FilePath, get_sizes(FilePath)};\n+format_output(_FromFormat, FilePath, #{<<\"output_type\">> := 'binary'}) ->\n+    case file:read_file(FilePath) of\n+        {'ok', Content} ->\n+            kz_util:delete_file(FilePath),\n+            {'ok', Content};\n+        Error -> Error\n+    end;\n+format_output(_FromFormat, FilePath, #{<<\"output_type\">> := 'path'}) ->\n+    {'ok', FilePath};\n+format_output(_FromFormat, FilePath, _Options) ->\n+    {'ok', FilePath}.\n+\n+-spec maybe_delete_previous_file(kz_term:ne_binary(), kz_term:ne_binary()) -> 'ok'.\n+maybe_delete_previous_file(Filename, Filename) ->\n+    'ok';\n+maybe_delete_previous_file(OldFilename, _NewFilename) ->\n+    kz_util:delete_file(OldFilename).\n+\n+-spec save_file({'file', kz_term:ne_binary()}|kz_term:ne_binary(), map()) -> kz_term:ne_binary().\n+save_file({'file', FilePath}, _Options) ->\n+    FilePath;\n+save_file(Content, #{<<\"tmp_dir\">> := TmpDir\n+                    ,<<\"job_id\">> := JobId\n+                    ,<<\"from_format\">> := FromFormat\n+                    }) ->\n+    Ext = kz_mime:to_extension(FromFormat),\n+    FilePath = filename:join(TmpDir, [JobId, <<\".\">>, Ext]),\n+    kz_util:write_file(FilePath, Content),\n+    FilePath.\n+\n+-spec image_to_tiff({atom(), kz_term:ne_binary()}, map()) -> {atom(), kz_term:ne_binary()}.\n+image_to_tiff(FromPath, #{<<\"job_id\">> := JobId, <<\"tmp_dir\">> := TmpDir}) ->\n+    ToPath = filename:join(TmpDir, [JobId, <<\".tiff\">>]),\n+    run_convert_command(?CONVERT_IMAGE_COMMAND, FromPath, ToPath, TmpDir).\n+\n+-spec tiff_to_pdf(kz_term:ne_binary(), map()) -> {atom(), kz_term:ne_binary()}.\n+tiff_to_pdf(FromPath, #{<<\"job_id\">> := JobId, <<\"tmp_dir\">> := TmpDir}) ->\n+    ToPath = filename:join(TmpDir, [JobId, <<\".pdf\">>]),\n+    run_convert_command(?CONVERT_TIFF_COMMAND, FromPath, ToPath, TmpDir).\n+\n+-spec pdf_to_tiff(kz_term:ne_binary(), map()) -> {atom(), kz_term:ne_binary()}.\n+pdf_to_tiff(FromPath, #{<<\"job_id\">> := JobId, <<\"tmp_dir\">> := TmpDir}) ->\n+    ToPath = filename:join(TmpDir, [JobId, <<\".tiff\">>]),\n+    run_convert_command(?CONVERT_PDF_COMMAND, FromPath, ToPath, TmpDir).\n+\n+-spec openoffice_to_pdf(kz_term:ne_binary(), map()) -> {atom(), kz_term:ne_binary()}.\n+openoffice_to_pdf(FromPath, Options) ->\n+    case ?ENABLE_OPENOFFICE of\n+        'true' ->\n+            case ?SERIALIZE_OPENOFFICE of\n+                'true' -> kz_openoffice_server:add(FromPath, Options);\n+                'false' -> do_openoffice_to_pdf(FromPath, Options)\n+            end;\n+        'false' ->\n+            {'error', <<\"openoffice compatible conversion is unsupported\">>}\n+    end.\n+\n+-spec do_openoffice_to_pdf(kz_term:ne_binary(), map()) -> {atom(), kz_term:ne_binary()}.\n+do_openoffice_to_pdf(FromPath, #{<<\"job_id\">> := JobId, <<\"tmp_dir\">> := TmpDir}) ->\n+    FinalToPath = filename:join(TmpDir, [JobId, <<\".pdf\">>]),\n+    TmpPath = filename:join(TmpDir, [filename:rootname(filename:basename(FromPath)), <<\".pdf\">>]),\n+    case run_convert_command(?CONVERT_OPENOFFICE_COMMAND, FromPath, FinalToPath, TmpDir) of\n+        {'ok', _} -> maybe_rename_tmp_file(TmpPath, FinalToPath);\n+        Else -> Else\n+    end.\n+\n+-spec maybe_rename_tmp_file(kz_term:ne_binary(), kz_term:ne_binary()) ->\n+                                   {'ok', kz_term:ne_binary()} | {'error', kz_term:ne_binary()}.\n+maybe_rename_tmp_file(TmpPath, NewPath) ->\n+    case filelib:is_file(NewPath) of\n+        'true' -> {'ok', NewPath};\n+        'false' ->\n+            case filelib:is_file(TmpPath) of\n+                'true' ->\n+                    kz_util:rename_file(TmpPath, NewPath),","path":"core/kazoo_convert/src/kz_fax_converter.erl","position":211,"original_position":211,"commit_id":"bf678364d2120b1e5e3f042c44b88e83e79abe28","original_commit_id":"bf678364d2120b1e5e3f042c44b88e83e79abe28","user":{"login":"icehess","id":4894215,"node_id":"MDQ6VXNlcjQ4OTQyMTU=","avatar_url":"https://avatars0.githubusercontent.com/u/4894215?v=4","gravatar_id":"","url":"https://api.github.com/users/icehess","html_url":"https://github.com/icehess","followers_url":"https://api.github.com/users/icehess/followers","following_url":"https://api.github.com/users/icehess/following{/other_user}","gists_url":"https://api.github.com/users/icehess/gists{/gist_id}","starred_url":"https://api.github.com/users/icehess/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/icehess/subscriptions","organizations_url":"https://api.github.com/users/icehess/orgs","repos_url":"https://api.github.com/users/icehess/repos","events_url":"https://api.github.com/users/icehess/events{/privacy}","received_events_url":"https://api.github.com/users/icehess/received_events","type":"User","site_admin":false},"body":"it is better to use `file:rename_file/2` directly to handle the error and stop.","created_at":"2018-06-11T23:38:57Z","updated_at":"2018-06-12T00:01:47Z","html_url":"https://github.com/2600hz/kazoo/pull/4904#discussion_r194578944","pull_request_url":"https://api.github.com/repos/2600hz/kazoo/pulls/4904","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/2600hz/kazoo/pulls/comments/194578944"},"html":{"href":"https://github.com/2600hz/kazoo/pull/4904#discussion_r194578944"},"pull_request":{"href":"https://api.github.com/repos/2600hz/kazoo/pulls/4904"}}},"pull_request":{"url":"https://api.github.com/repos/2600hz/kazoo/pulls/4904","id":193672472,"node_id":"MDExOlB1bGxSZXF1ZXN0MTkzNjcyNDcy","html_url":"https://github.com/2600hz/kazoo/pull/4904","diff_url":"https://github.com/2600hz/kazoo/pull/4904.diff","patch_url":"https://github.com/2600hz/kazoo/pull/4904.patch","issue_url":"https://api.github.com/repos/2600hz/kazoo/issues/4904","number":4904,"state":"open","locked":false,"title":"Help-36774: created a converter core library: kazoo_convert","user":{"login":"swysor","id":8356867,"node_id":"MDQ6VXNlcjgzNTY4Njc=","avatar_url":"https://avatars3.githubusercontent.com/u/8356867?v=4","gravatar_id":"","url":"https://api.github.com/users/swysor","html_url":"https://github.com/swysor","followers_url":"https://api.github.com/users/swysor/followers","following_url":"https://api.github.com/users/swysor/following{/other_user}","gists_url":"https://api.github.com/users/swysor/gists{/gist_id}","starred_url":"https://api.github.com/users/swysor/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/swysor/subscriptions","organizations_url":"https://api.github.com/users/swysor/orgs","repos_url":"https://api.github.com/users/swysor/repos","events_url":"https://api.github.com/users/swysor/events{/privacy}","received_events_url":"https://api.github.com/users/swysor/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-06-08T17:05:11Z","updated_at":"2018-06-12T00:01:47Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6616713fcc6346badb2b22f07554518257a222ff","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/2600hz/kazoo/pulls/4904/commits","review_comments_url":"https://api.github.com/repos/2600hz/kazoo/pulls/4904/comments","review_comment_url":"https://api.github.com/repos/2600hz/kazoo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/2600hz/kazoo/issues/4904/comments","statuses_url":"https://api.github.com/repos/2600hz/kazoo/statuses/bf678364d2120b1e5e3f042c44b88e83e79abe28","head":{"label":"2600hz:HELP-36774","ref":"HELP-36774","sha":"bf678364d2120b1e5e3f042c44b88e83e79abe28","user":{"login":"2600hz","id":408801,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQwODgwMQ==","avatar_url":"https://avatars3.githubusercontent.com/u/408801?v=4","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,"node_id":"MDEwOlJlcG9zaXRvcnkyOTY2MjQx","name":"kazoo","full_name":"2600hz/kazoo","owner":{"login":"2600hz","id":408801,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQwODgwMQ==","avatar_url":"https://avatars3.githubusercontent.com/u/408801?v=4","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":"The core of an open-source, distributed, highly scalable platform designed to provide robust telecom services","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":"2018-06-11T22:39:55Z","pushed_at":"2018-06-11T22:47:31Z","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":"http://www.2600hz.org/","size":369982,"stargazers_count":589,"watchers_count":589,"language":"Erlang","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":318,"mirror_url":null,"archived":false,"open_issues_count":24,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":318,"open_issues":24,"watchers":589,"default_branch":"master"}},"base":{"label":"2600hz:master","ref":"master","sha":"8032b52d3c2741c1dcd6730454d4220fd5063356","user":{"login":"2600hz","id":408801,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQwODgwMQ==","avatar_url":"https://avatars3.githubusercontent.com/u/408801?v=4","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,"node_id":"MDEwOlJlcG9zaXRvcnkyOTY2MjQx","name":"kazoo","full_name":"2600hz/kazoo","owner":{"login":"2600hz","id":408801,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQwODgwMQ==","avatar_url":"https://avatars3.githubusercontent.com/u/408801?v=4","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":"The core of an open-source, distributed, highly scalable platform designed to provide robust telecom services","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":"2018-06-11T22:39:55Z","pushed_at":"2018-06-11T22:47:31Z","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":"http://www.2600hz.org/","size":369982,"stargazers_count":589,"watchers_count":589,"language":"Erlang","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":318,"mirror_url":null,"archived":false,"open_issues_count":24,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":318,"open_issues":24,"watchers":589,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/2600hz/kazoo/pulls/4904"},"html":{"href":"https://github.com/2600hz/kazoo/pull/4904"},"issue":{"href":"https://api.github.com/repos/2600hz/kazoo/issues/4904"},"comments":{"href":"https://api.github.com/repos/2600hz/kazoo/issues/4904/comments"},"review_comments":{"href":"https://api.github.com/repos/2600hz/kazoo/pulls/4904/comments"},"review_comment":{"href":"https://api.github.com/repos/2600hz/kazoo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/2600hz/kazoo/pulls/4904/commits"},"statuses":{"href":"https://api.github.com/repos/2600hz/kazoo/statuses/bf678364d2120b1e5e3f042c44b88e83e79abe28"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"icehess"}}