{"action":"created","comment":{"url":"https://api.github.com/repos/caskdata/cdap/pulls/comments/38132032","id":38132032,"diff_hunk":"@@ -0,0 +1,434 @@\n+#!/usr/bin/env python\n+# -*- coding: utf-8 -*-\n+\n+#  Copyright © 2015 Cask Data, Inc.\n+#\n+#  Licensed under the Apache License, Version 2.0 (the \"License\");\n+#  you may not use this file except in compliance with the License.\n+#  You may obtain a copy of the License at\n+#\n+#     http://www.apache.org/licenses/LICENSE-2.0\n+#\n+#  Unless required by applicable law or agreed to in writing, software\n+#  distributed under the License is distributed on an \"AS IS\" BASIS,\n+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+#  See the License for the specific language governing permissions and\n+#  limitations under the License.\n+\n+# Builds an rst table to document the cdap-default.xml file\n+# Any property names listed in cdap-default-exclusions.txt are excluded.\n+# Any properties marked \"final\" are placed in second table after the first.\n+#\n+# python doc-cdap-default.py <source-filepath> <output-filepath>\n+# python doc-cdap-default.py <output-filepath>\n+#\n+# If <source-filepath> not provided, uses CDAP_DEFAULT_XML\n+# if <output-filepath> not provided, outputs to standard out\n+\n+\n+# Steps:\n+#\n+# Load source code cdap-default.xml\n+# keys: name of property\n+# values: Property class object (value and description)\n+# Defaults in source code are in no particular order.\n+# \n+# Sort by key\n+# Output rst table to standard out\n+# If filepath provided, writes to file instead\n+\n+import os\n+import sys\n+import textwrap\n+import xml.etree.ElementTree as ET\n+\n+from datetime import datetime\n+\n+RELATIVE_PATH = '../..'\n+CDAP_DEFAULT_XML = 'cdap-common/src/main/resources/cdap-default.xml'\n+CDAP_DEFAULT_EXCLUSIONS = 'cdap-default-exclusions.txt'\n+\n+FIRST_TWO_SECTIONS = ['General Configuration', 'Global Configuration']\n+\n+\n+RST_TABLE_HEADER = \"\"\"\n+.. list-table::\n+   :widths: 30 35 35\n+   :header-rows: 1\n+\n+   * - Parameter Name\n+     - Default Value\n+     - Description\"\"\"\n+\n+RST_TABLE_HEADER_FINAL = \"\"\"\n+\n+Final Configurations\n+--------------------\n+These properties are marked as ``final``, meaning that their value cannot be changed, even\n+with a setting in the ``cdap-site.xml``:\n+\"\"\" + RST_TABLE_HEADER + '\\n'\n+\n+NAME_START  = '   * - '\n+VALUE_START = '     - '\n+BLOCK_START = '| ``'\n+BLOCK_JOIN  = '``\\n       | ``'\n+DESC_START  = '     - '\n+\n+SECTION_START = NAME_START + '|\\n       | '\n+\n+# The XML_HEADER is not ascii text due to the copyright symbol in the fourth line\n+\n+XML_HEADER = u\"\"\"<?xml version=\"1.0\"?>\n+<?xml-stylesheet type=\"text/xsl\" href=\"configuration.xsl\"?>\n+<!--\n+  Copyright © 2014-%d Cask Data, Inc.\n+\n+  Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n+  use this file except in compliance with the License. You may obtain a copy of\n+  the License at\n+\n+  http://www.apache.org/licenses/LICENSE-2.0\n+\n+  Unless required by applicable law or agreed to in writing, software\n+  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n+  License for the specific language governing permissions and limitations under\n+  the License.\n+  -->\n+\"\"\" % datetime.now().year\n+\n+\n+class Item:\n+    @staticmethod\n+    def encode(value):\n+        import cgi\n+        if value:\n+            return cgi.escape(value).encode('ascii', 'xmlcharrefreplace')\n+        else:\n+            return ''\n+\n+    def __init__(self, name='', value='', description ='', final=None):\n+        self.name = name\n+        self.value = self.encode(value)\n+        self.description = self.encode(description)\n+        self.final = final\n+    \n+    def __str__(self):\n+        if self.final != None:\n+            return \"%s:\\n%s (%s)\\n%s\" % (self.name, self.value, self.final, self.description)\n+        else:\n+            return \"%s:\\n%s\\n%s\" % (self.name, self.value, self.description)\n+\n+    def _append(self, name, value):\n+        if self.__dict__[name]:\n+            self.__dict__[name] = \"%s\\n%s\" % (self.__dict__[name], value)\n+        else:\n+            self.__dict__[name] = value\n+    \n+    def rst(self):\n+        name = \"``%s``\" % self.name\n+        if self.value.find(' ') != -1:\n+            value = BLOCK_START + BLOCK_JOIN.join(self.value.split()) + '``'\n+        elif not self.value:\n+            value = ''\n+        else:\n+            value = \"``%s``\" % self.value\n+        rst = \"%s%s\\n%s%s\\n%s%s\" % (NAME_START, name,\n+                                    VALUE_START, value,\n+                                    DESC_START, self.description)\n+        return rst\n+    \n+    def set_attribute(self, name, value):\n+        v1 = \"%s\" % self.encode(value)\n+        if name == 'description' and v1 == 'None':\n+            v = ''\n+        elif name == 'description':\n+            v = \" \".join(v1.split())\n+        elif name == 'final':\n+            v = (v1.lower() == 'true')\n+        else:\n+            v = v1\n+        self.__dict__[name] = v\n+            \n+    def get_attribute(self, name):\n+        if name == 'rst':\n+            return self._rst()\n+        else:\n+            return self.__dict__[name]\n+    \n+    def append_value(self, value):\n+        self._append(\"value\", value)\n+\n+    def append_description(self, description):\n+        self._append(\"description\", description)\n+    \n+    def display(self):\n+        print self.name\n+\n+\n+class Section:\n+\n+    def __init__(self, name=''):\n+        self.name = name.strip()\n+        self.final = None\n+\n+    def rst(self):\n+        CONFIG = ' Configuration'\n+        name = self.name.strip()\n+        if name.endswith(CONFIG):\n+            name = name[0:-len(CONFIG)]\n+        underline = \"-\" * len(name)\n+        rst = \"\\n%s\\n%s\\n%s\" % (name, underline, RST_TABLE_HEADER)\n+        return rst\n+\n+    def display(self):\n+        print \"\\nSection %s\" % self.name\n+       \n+\n+class PIParser(ET.XMLTreeBuilder):\n+    \"\"\"An XML parser that preserves processing instructions and comments\"\"\"\n+\n+    def __init__(self):\n+        ET.XMLTreeBuilder.__init__(self)\n+        # assumes ElementTree 1.2.X\n+        self._parser.CommentHandler = self.handle_comment\n+        self._parser.ProcessingInstructionHandler = self.handle_pi\n+        self._target.start(\"document\", {})\n+\n+    def close(self):\n+        self._target.end(\"document\")\n+        return ET.XMLTreeBuilder.close(self)\n+\n+    def handle_comment(self, data):\n+        self._target.start(ET.Comment, {})\n+        self._target.data(data)\n+        self._target.end(ET.Comment)\n+\n+    def handle_pi(self, target, data):\n+        self._target.start(ET.PI, {})\n+        self._target.data(target + \" \" + data)\n+        self._target.end(ET.PI)\n+\n+\n+def default_xml_filepath(extra_path=''):\n+    source_path = os.path.dirname(os.path.abspath(__file__))\n+    return os.path.join(source_path, RELATIVE_PATH, CDAP_DEFAULT_XML + extra_path)\n+    \n+def load_exclusions():\n+    source_path = os.path.dirname(os.path.abspath(__file__))\n+    exclusions_path = os.path.join(source_path, CDAP_DEFAULT_EXCLUSIONS)\n+    if not os.path.isfile(exclusions_path):\n+        raise Exception(func, \"'%s' not a valid path\" % exclusions_path)\n+    return [line.rstrip('\\n') for line in open(exclusions_path)]\n+\n+def load_defaults(filesource, include_exclusions=False):\n+    func = 'load_defaults'\n+\n+    if filesource:\n+        xml_path = filesource    \n+    else:\n+        xml_path = default_xml_filepath()\n+    if not os.path.isfile(xml_path):\n+        raise Exception(func, \"'%s' not a valid path\" % xml_path)\n+    \n+    if include_exclusions:\n+        exclusions = []\n+    else:\n+        exclusions = load_exclusions()\n+    \n+    items = []\n+    parser = PIParser()\n+    tree = ET.parse(xml_path, parser=parser)\n+    root = tree.getroot()\n+    for outer_element in root:\n+        for inner_element in outer_element:\n+            if inner_element.tag == 'property':\n+                item = Item()\n+                for attribute in inner_element:\n+                    item.set_attribute(attribute.tag, attribute.text)                \n+                if item.name not in exclusions:\n+                    items.append(item)                \n+            else:\n+                items.append(Section(inner_element.text))\n+\n+    return items\n+\n+def create_rst(items):\n+    \"\"\"Create rst from items\"\"\"\n+    table = ''\n+    final_items =[]\n+    \n+    for item in items:\n+        if not item.final:\n+            table += item.rst() + '\\n'\n+        else:\n+            final_items.append(item)\n+            \n+    if final_items:\n+        table += RST_TABLE_HEADER_FINAL\n+        for item in final_items:\n+            table += item.rst() + '\\n'\n+\n+    return table\n+\n+def rebuild():\n+    \"\"\"Loads the cdap-default.xml, and rebuilds it according to these rules:\n+    - First two sections: \n+        General Configuration\n+        Global Configuration\n+    - Remaining sections alphabetical\n+    - Properties within a section alphabetical\n+    - Descriptions wrapped to a 70 character line-length\"\"\"\n+    \n+    print 'Rebuilding cdap-default.xml'\n+    items = load_defaults('', include_exclusions=True)\n+    exclusions = load_exclusions()\n+    in_section = True\n+    defaults = {}\n+    section = []\n+    section_counter = 0\n+    properties_counter = 0\n+    for item in items:\n+        if str(item.__class__) == '__main__.Section':\n+            if section: # End old section\n+                defaults[section_name] = section\n+                section = []\n+            # Start new section\n+            section_counter += 1\n+            section_name = item.name\n+        else:\n+            properties_counter += 1\n+            section.append(item)\n+    if section: # End old section\n+        defaults[section_name] = section\n+        section = []  \n+    \n+    print \"Sections: %d Keys: %d Properties: %d\" % (section_counter, len(defaults.keys()), properties_counter)\n+\n+    # Build XML file\n+    XML_CONFIG_OPEN   = '<configuration>\\n'\n+    XML_SECTION_SUB   = \"\\n    <!-- %s -->\\n\\n\"\n+    XML_PROP_OPEN     = '    <property>\\n'\n+    XML_NAME_SUB      = \"        <name>%s</name>\\n\"\n+    XML_VALUE_SUB     = \"        <value>%s</value>\\n\"\n+    XML_DESCRIP_OPEN  = '        <description>\\n'\n+    XML_DESCRIP_SUB   = \"            %s\\n\"\n+    XML_DESCRIP_CLOSE = '        </description>\\n'\n+    XML_FINAL         = '        <final>true</final>\\n'\n+    XML_PROP_CLOSE    = '    </property>\\n\\n'\n+    XML_CONFIG_CLOSE  = '</configuration>\\n'\n+\n+    xml = XML_CONFIG_OPEN\n+    keys = defaults.keys()\n+    for key in FIRST_TWO_SECTIONS:\n+        keys.remove(key)\n+    keys.sort()        \n+    keys = FIRST_TWO_SECTIONS + keys\n+    for key in keys:\n+        xml += XML_SECTION_SUB % key\n+        props = defaults[key]\n+        props.sort(key = lambda p: p.name)\n+        for prop in props:\n+            xml += XML_PROP_OPEN\n+            xml += XML_NAME_SUB % prop.name\n+            xml += XML_VALUE_SUB % prop.value\n+            xml += XML_DESCRIP_OPEN\n+            if prop.description:\n+                for line in textwrap.wrap(prop.description):\n+                    xml += XML_DESCRIP_SUB % line\n+            else:\n+                print \"WARNING: No description for property %s\" % prop.name\n+                if prop.name in exclusions:\n+                    print \"but in the list of exclusions\"\n+            xml += XML_DESCRIP_CLOSE\n+            if prop.final:\n+                xml += XML_FINAL\n+            xml += XML_PROP_CLOSE\n+    xml += XML_CONFIG_CLOSE\n+    \n+    filepath = default_xml_filepath('_revised.xml')\n+    f = open(filepath, 'wb')","path":"cdap-docs/tools/doc-cdap-default.py","position":350,"original_position":350,"commit_id":"7c5fca684086625a7d1cf1491141298fe75b55de","original_commit_id":"7c5fca684086625a7d1cf1491141298fe75b55de","user":{"login":"bdmogal","id":3895099,"avatar_url":"https://avatars.githubusercontent.com/u/3895099?v=3","gravatar_id":"","url":"https://api.github.com/users/bdmogal","html_url":"https://github.com/bdmogal","followers_url":"https://api.github.com/users/bdmogal/followers","following_url":"https://api.github.com/users/bdmogal/following{/other_user}","gists_url":"https://api.github.com/users/bdmogal/gists{/gist_id}","starred_url":"https://api.github.com/users/bdmogal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bdmogal/subscriptions","organizations_url":"https://api.github.com/users/bdmogal/orgs","repos_url":"https://api.github.com/users/bdmogal/repos","events_url":"https://api.github.com/users/bdmogal/events{/privacy}","received_events_url":"https://api.github.com/users/bdmogal/received_events","type":"User","site_admin":false},"body":":+1: ","created_at":"2015-08-27T18:49:14Z","updated_at":"2015-08-27T18:49:14Z","html_url":"https://github.com/caskdata/cdap/pull/3581#discussion_r38132032","pull_request_url":"https://api.github.com/repos/caskdata/cdap/pulls/3581","_links":{"self":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/comments/38132032"},"html":{"href":"https://github.com/caskdata/cdap/pull/3581#discussion_r38132032"},"pull_request":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/3581"}}},"pull_request":{"url":"https://api.github.com/repos/caskdata/cdap/pulls/3581","id":42311299,"html_url":"https://github.com/caskdata/cdap/pull/3581","diff_url":"https://github.com/caskdata/cdap/pull/3581.diff","patch_url":"https://github.com/caskdata/cdap/pull/3581.patch","issue_url":"https://api.github.com/repos/caskdata/cdap/issues/3581","number":3581,"state":"open","locked":false,"title":"Document cdap-site properties dynamically","user":{"login":"awholegunch","id":6394794,"avatar_url":"https://avatars.githubusercontent.com/u/6394794?v=3","gravatar_id":"","url":"https://api.github.com/users/awholegunch","html_url":"https://github.com/awholegunch","followers_url":"https://api.github.com/users/awholegunch/followers","following_url":"https://api.github.com/users/awholegunch/following{/other_user}","gists_url":"https://api.github.com/users/awholegunch/gists{/gist_id}","starred_url":"https://api.github.com/users/awholegunch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/awholegunch/subscriptions","organizations_url":"https://api.github.com/users/awholegunch/orgs","repos_url":"https://api.github.com/users/awholegunch/repos","events_url":"https://api.github.com/users/awholegunch/events{/privacy}","received_events_url":"https://api.github.com/users/awholegunch/received_events","type":"User","site_admin":false},"body":"Change the documentation of the cdap-site properties to be based on cdap-default.xml.\r\n\r\nAdds to the build the calling of a python script that writes an rst table that is included in the documentation.\r\n\r\nStaged at:\r\n- [**New Appendix**](http://docs-staging.cask.co/staging/cdap/3.2.0-SNAPSHOT-feature-3.1_cdap_site_xml/en/admin-manual/installation/cdap-site.html#appendix-cdap-site-xml)\r\n- [Current Appendix](http://docs-staging.cask.co/staging/cdap/3.2.0-SNAPSHOT/en/admin-manual/installation/cdap-site.html#appendix-cdap-site-xml)\r\n\r\n**Note:** Even though the branch starts with \"3.1\", that's a mistake, as this was intended for 3.2...\r\n\r\nFix for issue: https://issues.cask.co/browse/CDAP-3257","created_at":"2015-08-13T03:04:54Z","updated_at":"2015-08-27T18:49:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7f932049a4ffe2eb150ee078f3a9935407fafc3c","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/caskdata/cdap/pulls/3581/commits","review_comments_url":"https://api.github.com/repos/caskdata/cdap/pulls/3581/comments","review_comment_url":"https://api.github.com/repos/caskdata/cdap/pulls/comments{/number}","comments_url":"https://api.github.com/repos/caskdata/cdap/issues/3581/comments","statuses_url":"https://api.github.com/repos/caskdata/cdap/statuses/7c5fca684086625a7d1cf1491141298fe75b55de","head":{"label":"caskdata:feature/3.1_cdap_site_xml","ref":"feature/3.1_cdap_site_xml","sha":"7c5fca684086625a7d1cf1491141298fe75b55de","user":{"login":"caskdata","id":8123023,"avatar_url":"https://avatars.githubusercontent.com/u/8123023?v=3","gravatar_id":"","url":"https://api.github.com/users/caskdata","html_url":"https://github.com/caskdata","followers_url":"https://api.github.com/users/caskdata/followers","following_url":"https://api.github.com/users/caskdata/following{/other_user}","gists_url":"https://api.github.com/users/caskdata/gists{/gist_id}","starred_url":"https://api.github.com/users/caskdata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caskdata/subscriptions","organizations_url":"https://api.github.com/users/caskdata/orgs","repos_url":"https://api.github.com/users/caskdata/repos","events_url":"https://api.github.com/users/caskdata/events{/privacy}","received_events_url":"https://api.github.com/users/caskdata/received_events","type":"Organization","site_admin":false},"repo":{"id":22542759,"name":"cdap","full_name":"caskdata/cdap","owner":{"login":"caskdata","id":8123023,"avatar_url":"https://avatars.githubusercontent.com/u/8123023?v=3","gravatar_id":"","url":"https://api.github.com/users/caskdata","html_url":"https://github.com/caskdata","followers_url":"https://api.github.com/users/caskdata/followers","following_url":"https://api.github.com/users/caskdata/following{/other_user}","gists_url":"https://api.github.com/users/caskdata/gists{/gist_id}","starred_url":"https://api.github.com/users/caskdata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caskdata/subscriptions","organizations_url":"https://api.github.com/users/caskdata/orgs","repos_url":"https://api.github.com/users/caskdata/repos","events_url":"https://api.github.com/users/caskdata/events{/privacy}","received_events_url":"https://api.github.com/users/caskdata/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/caskdata/cdap","description":"Cask Data Application Platform (CDAP)","fork":false,"url":"https://api.github.com/repos/caskdata/cdap","forks_url":"https://api.github.com/repos/caskdata/cdap/forks","keys_url":"https://api.github.com/repos/caskdata/cdap/keys{/key_id}","collaborators_url":"https://api.github.com/repos/caskdata/cdap/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/caskdata/cdap/teams","hooks_url":"https://api.github.com/repos/caskdata/cdap/hooks","issue_events_url":"https://api.github.com/repos/caskdata/cdap/issues/events{/number}","events_url":"https://api.github.com/repos/caskdata/cdap/events","assignees_url":"https://api.github.com/repos/caskdata/cdap/assignees{/user}","branches_url":"https://api.github.com/repos/caskdata/cdap/branches{/branch}","tags_url":"https://api.github.com/repos/caskdata/cdap/tags","blobs_url":"https://api.github.com/repos/caskdata/cdap/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/caskdata/cdap/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/caskdata/cdap/git/refs{/sha}","trees_url":"https://api.github.com/repos/caskdata/cdap/git/trees{/sha}","statuses_url":"https://api.github.com/repos/caskdata/cdap/statuses/{sha}","languages_url":"https://api.github.com/repos/caskdata/cdap/languages","stargazers_url":"https://api.github.com/repos/caskdata/cdap/stargazers","contributors_url":"https://api.github.com/repos/caskdata/cdap/contributors","subscribers_url":"https://api.github.com/repos/caskdata/cdap/subscribers","subscription_url":"https://api.github.com/repos/caskdata/cdap/subscription","commits_url":"https://api.github.com/repos/caskdata/cdap/commits{/sha}","git_commits_url":"https://api.github.com/repos/caskdata/cdap/git/commits{/sha}","comments_url":"https://api.github.com/repos/caskdata/cdap/comments{/number}","issue_comment_url":"https://api.github.com/repos/caskdata/cdap/issues/comments{/number}","contents_url":"https://api.github.com/repos/caskdata/cdap/contents/{+path}","compare_url":"https://api.github.com/repos/caskdata/cdap/compare/{base}...{head}","merges_url":"https://api.github.com/repos/caskdata/cdap/merges","archive_url":"https://api.github.com/repos/caskdata/cdap/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/caskdata/cdap/downloads","issues_url":"https://api.github.com/repos/caskdata/cdap/issues{/number}","pulls_url":"https://api.github.com/repos/caskdata/cdap/pulls{/number}","milestones_url":"https://api.github.com/repos/caskdata/cdap/milestones{/number}","notifications_url":"https://api.github.com/repos/caskdata/cdap/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/caskdata/cdap/labels{/name}","releases_url":"https://api.github.com/repos/caskdata/cdap/releases{/id}","created_at":"2014-08-02T09:00:10Z","updated_at":"2015-08-27T16:07:37Z","pushed_at":"2015-08-27T18:46:37Z","git_url":"git://github.com/caskdata/cdap.git","ssh_url":"git@github.com:caskdata/cdap.git","clone_url":"https://github.com/caskdata/cdap.git","svn_url":"https://github.com/caskdata/cdap","homepage":"http://cdap.io","size":856362,"stargazers_count":62,"watchers_count":62,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":19,"mirror_url":null,"open_issues_count":11,"forks":19,"open_issues":11,"watchers":62,"default_branch":"develop"}},"base":{"label":"caskdata:develop","ref":"develop","sha":"5ab4f6720fbb8ec606803fb881d62a88ff1f836b","user":{"login":"caskdata","id":8123023,"avatar_url":"https://avatars.githubusercontent.com/u/8123023?v=3","gravatar_id":"","url":"https://api.github.com/users/caskdata","html_url":"https://github.com/caskdata","followers_url":"https://api.github.com/users/caskdata/followers","following_url":"https://api.github.com/users/caskdata/following{/other_user}","gists_url":"https://api.github.com/users/caskdata/gists{/gist_id}","starred_url":"https://api.github.com/users/caskdata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caskdata/subscriptions","organizations_url":"https://api.github.com/users/caskdata/orgs","repos_url":"https://api.github.com/users/caskdata/repos","events_url":"https://api.github.com/users/caskdata/events{/privacy}","received_events_url":"https://api.github.com/users/caskdata/received_events","type":"Organization","site_admin":false},"repo":{"id":22542759,"name":"cdap","full_name":"caskdata/cdap","owner":{"login":"caskdata","id":8123023,"avatar_url":"https://avatars.githubusercontent.com/u/8123023?v=3","gravatar_id":"","url":"https://api.github.com/users/caskdata","html_url":"https://github.com/caskdata","followers_url":"https://api.github.com/users/caskdata/followers","following_url":"https://api.github.com/users/caskdata/following{/other_user}","gists_url":"https://api.github.com/users/caskdata/gists{/gist_id}","starred_url":"https://api.github.com/users/caskdata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caskdata/subscriptions","organizations_url":"https://api.github.com/users/caskdata/orgs","repos_url":"https://api.github.com/users/caskdata/repos","events_url":"https://api.github.com/users/caskdata/events{/privacy}","received_events_url":"https://api.github.com/users/caskdata/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/caskdata/cdap","description":"Cask Data Application Platform (CDAP)","fork":false,"url":"https://api.github.com/repos/caskdata/cdap","forks_url":"https://api.github.com/repos/caskdata/cdap/forks","keys_url":"https://api.github.com/repos/caskdata/cdap/keys{/key_id}","collaborators_url":"https://api.github.com/repos/caskdata/cdap/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/caskdata/cdap/teams","hooks_url":"https://api.github.com/repos/caskdata/cdap/hooks","issue_events_url":"https://api.github.com/repos/caskdata/cdap/issues/events{/number}","events_url":"https://api.github.com/repos/caskdata/cdap/events","assignees_url":"https://api.github.com/repos/caskdata/cdap/assignees{/user}","branches_url":"https://api.github.com/repos/caskdata/cdap/branches{/branch}","tags_url":"https://api.github.com/repos/caskdata/cdap/tags","blobs_url":"https://api.github.com/repos/caskdata/cdap/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/caskdata/cdap/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/caskdata/cdap/git/refs{/sha}","trees_url":"https://api.github.com/repos/caskdata/cdap/git/trees{/sha}","statuses_url":"https://api.github.com/repos/caskdata/cdap/statuses/{sha}","languages_url":"https://api.github.com/repos/caskdata/cdap/languages","stargazers_url":"https://api.github.com/repos/caskdata/cdap/stargazers","contributors_url":"https://api.github.com/repos/caskdata/cdap/contributors","subscribers_url":"https://api.github.com/repos/caskdata/cdap/subscribers","subscription_url":"https://api.github.com/repos/caskdata/cdap/subscription","commits_url":"https://api.github.com/repos/caskdata/cdap/commits{/sha}","git_commits_url":"https://api.github.com/repos/caskdata/cdap/git/commits{/sha}","comments_url":"https://api.github.com/repos/caskdata/cdap/comments{/number}","issue_comment_url":"https://api.github.com/repos/caskdata/cdap/issues/comments{/number}","contents_url":"https://api.github.com/repos/caskdata/cdap/contents/{+path}","compare_url":"https://api.github.com/repos/caskdata/cdap/compare/{base}...{head}","merges_url":"https://api.github.com/repos/caskdata/cdap/merges","archive_url":"https://api.github.com/repos/caskdata/cdap/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/caskdata/cdap/downloads","issues_url":"https://api.github.com/repos/caskdata/cdap/issues{/number}","pulls_url":"https://api.github.com/repos/caskdata/cdap/pulls{/number}","milestones_url":"https://api.github.com/repos/caskdata/cdap/milestones{/number}","notifications_url":"https://api.github.com/repos/caskdata/cdap/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/caskdata/cdap/labels{/name}","releases_url":"https://api.github.com/repos/caskdata/cdap/releases{/id}","created_at":"2014-08-02T09:00:10Z","updated_at":"2015-08-27T16:07:37Z","pushed_at":"2015-08-27T18:46:37Z","git_url":"git://github.com/caskdata/cdap.git","ssh_url":"git@github.com:caskdata/cdap.git","clone_url":"https://github.com/caskdata/cdap.git","svn_url":"https://github.com/caskdata/cdap","homepage":"http://cdap.io","size":856362,"stargazers_count":62,"watchers_count":62,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":19,"mirror_url":null,"open_issues_count":11,"forks":19,"open_issues":11,"watchers":62,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/3581"},"html":{"href":"https://github.com/caskdata/cdap/pull/3581"},"issue":{"href":"https://api.github.com/repos/caskdata/cdap/issues/3581"},"comments":{"href":"https://api.github.com/repos/caskdata/cdap/issues/3581/comments"},"review_comments":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/3581/comments"},"review_comment":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/3581/commits"},"statuses":{"href":"https://api.github.com/repos/caskdata/cdap/statuses/7c5fca684086625a7d1cf1491141298fe75b55de"}}}}