{"action":"created","comment":{"url":"https://api.github.com/repos/CartoDB/bigmetadata/pulls/comments/183691480","pull_request_review_id":114735402,"id":183691480,"diff_hunk":"@@ -0,0 +1,480 @@\n+import os\n+import urllib.request\n+import math\n+from datetime import datetime\n+from luigi import Task, IntParameter, LocalTarget\n+from lib.logger import get_logger\n+from tasks.meta import current_session\n+from tasks.util import (classpath, unqualified_task_id)\n+from tasks.targets import PostgresTarget\n+\n+LOGGER = get_logger(__name__)\n+MAX_ZOOM_LEVEL = 22\n+IDX_SUFFIX = '_idx'\n+VIEW_IDX_SUFFIX = '_view_idx'\n+DATA_COLUMN_PREFIX = 'ft_'\n+HOURS_IN_A_DAY = 24\n+DAYS_IN_A_WEEK = 7\n+MONDAY = 0\n+TUESDAY = 1\n+WEDNESDAY = 2\n+THURSDAY = 3\n+FRIDAY = 4\n+SATURDAY = 5\n+SUNDAY = 6\n+\n+\n+def quadkey2tile(quadkey):\n+    z = len(quadkey)\n+\n+    x = 0\n+    y = 0\n+    for i in range(len(quadkey)):\n+        x = x * 2\n+        if quadkey[i] in ['1', '3']:\n+            x = x + 1\n+\n+        y = y * 2\n+        if quadkey[i] in ['2', '3']:\n+            y = y + 1\n+\n+    y = (1 << z) - y - 1\n+\n+    return z, x, y\n+\n+\n+def tile2lnglat(z, x, y):\n+    n = 2.0 ** z\n+\n+    lon = x / n * 360.0 - 180.0\n+    lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * y / n)))\n+    lat = - math.degrees(lat_rad)\n+\n+    return lon, lat\n+\n+\n+def latlng2tile(lng, lat, z):\n+    x = math.floor((lng + 180) / 360 * math.pow(2, z))\n+    y = math.floor((1 - math.log(math.tan(lat * math.pi / 180) + 1 / math.cos(lat * math.pi / 180)) / math.pi) / 2 * math.pow(2, z))\n+    y = (1 << z) - y - 1\n+\n+    return z, x, y\n+\n+\n+def tile2bounds(z, x, y):\n+    lon0, lat0 = tile2lnglat(z, x, y)\n+    lon1, lat1 = tile2lnglat(z, x+1, y+1)\n+\n+    return lon0, lat0, lon1, lat1\n+\n+\n+def tile2quadkey(z, x, y):\n+    quadkey = ''\n+    y = (2**z - 1) - y\n+    for i in range(z, 0, -1):\n+        digit = 0\n+        mask = 1 << (i-1)\n+        if (x & mask) != 0:\n+            digit += 1\n+        if (y & mask) != 0:\n+            digit += 2\n+        quadkey += str(digit)\n+\n+    return quadkey\n+\n+\n+def find_columns_with_prefix(session, schema, tablename, column_prefix):\n+    query = '''\n+            SELECT column_name\n+                FROM information_schema.columns\n+                WHERE table_schema = '{schema}'\n+                AND table_name = lower('{table}')\n+                AND column_name like '{column_prefix}%';\n+            '''.format(\n+                schema=schema,\n+                table=tablename,\n+                column_prefix=column_prefix,\n+            )\n+    return [c[0] for c in session.execute(query).fetchall()]\n+\n+\n+def create_spatial_index(session, schema, tablename, suffix):\n+    query = '''\n+            CREATE INDEX {schema}_{table}{suffix}\n+            ON \"{schema}\".{table} USING GIST (the_geom)\n+            '''.format(\n+                schema=schema,\n+                table=tablename,\n+                suffix=suffix\n+            )\n+    session.execute(query)\n+\n+    query = '''\n+            CLUSTER \"{schema}\".{table}\n+            USING {schema}_{table}{suffix}\n+            '''.format(\n+                schema=schema,\n+                table=tablename,\n+                suffix=suffix\n+            )\n+    session.execute(query)\n+    session.commit()\n+\n+\n+class DownloadData(Task):\n+\n+    URL = 'YOUR_URL_HERE'\n+\n+    def run(self):\n+        self.output().makedirs()\n+        urllib.request.urlretrieve(self.URL, self.output().path)\n+\n+    def output(self):\n+        return LocalTarget(os.path.join('tmp', classpath(self),\n+                                        unqualified_task_id(self.task_id) + '.csv'))\n+\n+\n+class ImportData(Task):\n+    def requires(self):\n+        return DownloadData()\n+\n+    def _create_table(self):\n+        query = '''\n+                CREATE SCHEMA IF NOT EXISTS \"{schema}\";\n+                '''.format(\n+                    schema=self.output().schema\n+                )\n+        self._session.execute(query)\n+\n+        query = '''\n+                CREATE TABLE \"{schema}\".{table} (\n+                    quadkey TEXT,\n+                    the_geom GEOMETRY(GEOMETRY, 4326),\n+                    PRIMARY KEY (quadkey)\n+                )\n+                '''.format(\n+                    schema=self.output().schema,\n+                    table=self.output().tablename,\n+                )\n+        self._session.execute(query)\n+\n+        self._session.commit()\n+\n+    def _insert(self, quadkey, lon, lat):\n+        query = '''\n+                INSERT INTO \"{schema}\".{table} (quadkey, the_geom)\n+                SELECT '{quadkey}', ST_SnapToGrid(ST_SetSRID(ST_Point({lon}, {lat}), 4326), 0.000001)\n+                ON CONFLICT DO NOTHING\n+                '''.format(\n+                    schema=self.output().schema,\n+                    table=self.output().tablename,\n+                    quadkey=quadkey,\n+                    lon=lon,\n+                    lat=lat\n+                )\n+        self._session.execute(query)\n+\n+    def _create_date_column(self, date):\n+        query = '''\n+                ALTER TABLE \"{schema}\".{table}\n+                ADD COLUMN {column_prefix}{datecolumn} INTEGER[24]\n+                '''.format(\n+                    schema=self.output().schema,\n+                    table=self.output().tablename,\n+                    column_prefix=DATA_COLUMN_PREFIX,\n+                    datecolumn=date\n+                )\n+        self._session.execute(query)\n+        self._session.commit()\n+\n+    def _update_hour_value(self, quadkey, date, hour, value):\n+        query = '''\n+                UPDATE \"{schema}\".{table} SET {column_prefix}{datecolumn} = array_fill(0, ARRAY[24])\n+                WHERE quadkey = '{quadkey}'\n+                  AND {column_prefix}{datecolumn} IS NULL\n+                '''.format(\n+                    schema=self.output().schema,\n+                    table=self.output().tablename,\n+                    column_prefix=DATA_COLUMN_PREFIX,\n+                    datecolumn=date,\n+                    quadkey=quadkey\n+                )\n+        self._session.execute(query)\n+        query = '''\n+                UPDATE \"{schema}\".{table} SET {column_prefix}{datecolumn}[{hour}] = {value}\n+                WHERE quadkey = '{quadkey}'\n+                '''.format(\n+                    schema=self.output().schema,\n+                    table=self.output().tablename,\n+                    column_prefix=DATA_COLUMN_PREFIX,\n+                    datecolumn=date,\n+                    hour=int(hour) + 1,  # Postgres arrays are 1-based\n+                    value=value,\n+                    quadkey=quadkey\n+                )\n+        self._session.execute(query)\n+\n+    def _point_position(self, z, x, y):\n+        lon0, lat0, lon1, lat1 = tile2bounds(z, x, y)\n+        return (lon0 + lon1) / 2, (lat0 + lat1) / 2\n+\n+    def run(self):\n+        self._session = current_session()\n+        self._create_table()\n+\n+        with open(self.input().path, \"r\") as ins:\n+            dates = set()\n+            i = 0\n+            for line in ins:\n+                line = line.split(',')\n+\n+                quadkey = line[0]\n+                date = line[1].replace('-', '')\n+                hour = line[2]\n+                value = line[3]\n+\n+                # Insert (empty) quadkey\n+                z, x, y = quadkey2tile(quadkey)\n+                lon, lat = self._point_position(z, x, y)\n+                self._insert(quadkey, lon, lat)\n+\n+                # Create date column if needed\n+                if date not in dates:\n+                    self._create_date_column(date)\n+                    dates.add(date)\n+\n+                # Save quadkey/date/hour value\n+                self._update_hour_value(quadkey, date, hour, value)\n+\n+                i = i + 1\n+                if i % 10000 == 0:\n+                    self._session.commit()\n+                    LOGGER.info('Inserted {i} rows'.format(i=i))\n+\n+        self._session.commit()\n+        create_spatial_index(self._session, self.output().schema, self.output().tablename, IDX_SUFFIX)\n+\n+    def output(self):\n+        return PostgresTarget(classpath(self), unqualified_task_id(self.task_id))\n+\n+\n+class ZoomLevel(Task):\n+    zoom = IntParameter()\n+\n+    def requires(self):\n+        return ImportData()\n+\n+    def _create_table(self):\n+        query = '''\n+                CREATE TABLE \"{schema}\".{table} AS\n+                SELECT * FROM \"{input_schema}\".{input_table}\n+                WHERE 1=0\n+                '''.format(\n+                    schema=self.output().schema,\n+                    table=self.output().tablename,\n+                    input_schema=self.input().schema,\n+                    input_table=self.input().tablename,\n+                )\n+        self._session.execute(query)\n+\n+        self._session.commit()\n+\n+    def run(self):\n+        if self.zoom > MAX_ZOOM_LEVEL:\n+            raise ValueError('Zoom level {zoom} cannot be greater than the maximum available zoom level ({maxzoom})'.format(zoom=self.zoom, maxzoom=MAX_ZOOM_LEVEL))\n+\n+        self._session = current_session()\n+        self._create_table()\n+\n+        data_columns = find_columns_with_prefix(self._session, self.input().schema, self.input().tablename,\n+                                                DATA_COLUMN_PREFIX)\n+\n+        field_column = 'NULLIF(ARRAY[{sumfield}]::INTEGER[] , ARRAY_FILL(0, ARRAY[{size}])) {field}'\n+        sumfield = 'SUM((COALESCE({field}, array_fill(0, ARRAY[{size}])))[{i}])'\n+        query = '''\n+                INSERT INTO \"{schema}\".{table}\n+                SELECT SUBSTRING(quadkey FROM 1 FOR {zoom}) quadkey, ST_Centroid(ST_Union(the_geom)) the_geom,\n+                {fields}\n+                FROM \"{input_schema}\".{input_table}\n+                GROUP BY SUBSTRING(quadkey from 1 for {zoom});\n+                '''.format(\n+                    fields=','.join([field_column.format(sumfield=','.join([sumfield.format(field=c,\n+                                                                                            size=HOURS_IN_A_DAY,\n+                                                                                            i=i) for i in range(1, HOURS_IN_A_DAY + 1)]), size=HOURS_IN_A_DAY,","path":"tasks/foot_traffic.py","position":303,"original_position":303,"commit_id":"4c8f6b19f3faf056a1a85e241ded096bd2bec1bc","original_commit_id":"4c8f6b19f3faf056a1a85e241ded096bd2bec1bc","user":{"login":"houndci-bot","id":6697940,"avatar_url":"https://avatars0.githubusercontent.com/u/6697940?v=4","gravatar_id":"","url":"https://api.github.com/users/houndci-bot","html_url":"https://github.com/houndci-bot","followers_url":"https://api.github.com/users/houndci-bot/followers","following_url":"https://api.github.com/users/houndci-bot/following{/other_user}","gists_url":"https://api.github.com/users/houndci-bot/gists{/gist_id}","starred_url":"https://api.github.com/users/houndci-bot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/houndci-bot/subscriptions","organizations_url":"https://api.github.com/users/houndci-bot/orgs","repos_url":"https://api.github.com/users/houndci-bot/repos","events_url":"https://api.github.com/users/houndci-bot/events{/privacy}","received_events_url":"https://api.github.com/users/houndci-bot/received_events","type":"User","site_admin":false},"body":"line too long (158 > 120 characters)","created_at":"2018-04-24T11:14:13Z","updated_at":"2018-04-24T11:14:13Z","html_url":"https://github.com/CartoDB/bigmetadata/pull/479#discussion_r183691480","pull_request_url":"https://api.github.com/repos/CartoDB/bigmetadata/pulls/479","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/CartoDB/bigmetadata/pulls/comments/183691480"},"html":{"href":"https://github.com/CartoDB/bigmetadata/pull/479#discussion_r183691480"},"pull_request":{"href":"https://api.github.com/repos/CartoDB/bigmetadata/pulls/479"}}},"pull_request":{"url":"https://api.github.com/repos/CartoDB/bigmetadata/pulls/479","id":181456723,"html_url":"https://github.com/CartoDB/bigmetadata/pull/479","diff_url":"https://github.com/CartoDB/bigmetadata/pull/479.diff","patch_url":"https://github.com/CartoDB/bigmetadata/pull/479.patch","issue_url":"https://api.github.com/repos/CartoDB/bigmetadata/issues/479","number":479,"state":"open","locked":false,"title":"Foot traffic data import and aggregations","user":{"login":"antoniocarlon","id":6155203,"avatar_url":"https://avatars0.githubusercontent.com/u/6155203?v=4","gravatar_id":"","url":"https://api.github.com/users/antoniocarlon","html_url":"https://github.com/antoniocarlon","followers_url":"https://api.github.com/users/antoniocarlon/followers","following_url":"https://api.github.com/users/antoniocarlon/following{/other_user}","gists_url":"https://api.github.com/users/antoniocarlon/gists{/gist_id}","starred_url":"https://api.github.com/users/antoniocarlon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/antoniocarlon/subscriptions","organizations_url":"https://api.github.com/users/antoniocarlon/orgs","repos_url":"https://api.github.com/users/antoniocarlon/repos","events_url":"https://api.github.com/users/antoniocarlon/events{/privacy}","received_events_url":"https://api.github.com/users/antoniocarlon/received_events","type":"User","site_admin":false},"body":" - Import foot traffic data: https://github.com/CartoDB/bigmetadata/issues/474\r\n - Aggregate foot traffic data: https://github.com/CartoDB/bigmetadata/issues/475","created_at":"2018-04-13T11:09:48Z","updated_at":"2018-04-24T11:14:13Z","closed_at":null,"merged_at":null,"merge_commit_sha":"eaa55ee3894233670ed85f281d31b2ecd537b1e4","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/CartoDB/bigmetadata/pulls/479/commits","review_comments_url":"https://api.github.com/repos/CartoDB/bigmetadata/pulls/479/comments","review_comment_url":"https://api.github.com/repos/CartoDB/bigmetadata/pulls/comments{/number}","comments_url":"https://api.github.com/repos/CartoDB/bigmetadata/issues/479/comments","statuses_url":"https://api.github.com/repos/CartoDB/bigmetadata/statuses/4c8f6b19f3faf056a1a85e241ded096bd2bec1bc","head":{"label":"CartoDB:474-Import_foot_traffic_data_and_aggregations","ref":"474-Import_foot_traffic_data_and_aggregations","sha":"4c8f6b19f3faf056a1a85e241ded096bd2bec1bc","user":{"login":"CartoDB","id":1799254,"avatar_url":"https://avatars0.githubusercontent.com/u/1799254?v=4","gravatar_id":"","url":"https://api.github.com/users/CartoDB","html_url":"https://github.com/CartoDB","followers_url":"https://api.github.com/users/CartoDB/followers","following_url":"https://api.github.com/users/CartoDB/following{/other_user}","gists_url":"https://api.github.com/users/CartoDB/gists{/gist_id}","starred_url":"https://api.github.com/users/CartoDB/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CartoDB/subscriptions","organizations_url":"https://api.github.com/users/CartoDB/orgs","repos_url":"https://api.github.com/users/CartoDB/repos","events_url":"https://api.github.com/users/CartoDB/events{/privacy}","received_events_url":"https://api.github.com/users/CartoDB/received_events","type":"Organization","site_admin":false},"repo":{"id":47357348,"name":"bigmetadata","full_name":"CartoDB/bigmetadata","owner":{"login":"CartoDB","id":1799254,"avatar_url":"https://avatars0.githubusercontent.com/u/1799254?v=4","gravatar_id":"","url":"https://api.github.com/users/CartoDB","html_url":"https://github.com/CartoDB","followers_url":"https://api.github.com/users/CartoDB/followers","following_url":"https://api.github.com/users/CartoDB/following{/other_user}","gists_url":"https://api.github.com/users/CartoDB/gists{/gist_id}","starred_url":"https://api.github.com/users/CartoDB/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CartoDB/subscriptions","organizations_url":"https://api.github.com/users/CartoDB/orgs","repos_url":"https://api.github.com/users/CartoDB/repos","events_url":"https://api.github.com/users/CartoDB/events{/privacy}","received_events_url":"https://api.github.com/users/CartoDB/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/CartoDB/bigmetadata","description":null,"fork":false,"url":"https://api.github.com/repos/CartoDB/bigmetadata","forks_url":"https://api.github.com/repos/CartoDB/bigmetadata/forks","keys_url":"https://api.github.com/repos/CartoDB/bigmetadata/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CartoDB/bigmetadata/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CartoDB/bigmetadata/teams","hooks_url":"https://api.github.com/repos/CartoDB/bigmetadata/hooks","issue_events_url":"https://api.github.com/repos/CartoDB/bigmetadata/issues/events{/number}","events_url":"https://api.github.com/repos/CartoDB/bigmetadata/events","assignees_url":"https://api.github.com/repos/CartoDB/bigmetadata/assignees{/user}","branches_url":"https://api.github.com/repos/CartoDB/bigmetadata/branches{/branch}","tags_url":"https://api.github.com/repos/CartoDB/bigmetadata/tags","blobs_url":"https://api.github.com/repos/CartoDB/bigmetadata/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CartoDB/bigmetadata/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CartoDB/bigmetadata/git/refs{/sha}","trees_url":"https://api.github.com/repos/CartoDB/bigmetadata/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CartoDB/bigmetadata/statuses/{sha}","languages_url":"https://api.github.com/repos/CartoDB/bigmetadata/languages","stargazers_url":"https://api.github.com/repos/CartoDB/bigmetadata/stargazers","contributors_url":"https://api.github.com/repos/CartoDB/bigmetadata/contributors","subscribers_url":"https://api.github.com/repos/CartoDB/bigmetadata/subscribers","subscription_url":"https://api.github.com/repos/CartoDB/bigmetadata/subscription","commits_url":"https://api.github.com/repos/CartoDB/bigmetadata/commits{/sha}","git_commits_url":"https://api.github.com/repos/CartoDB/bigmetadata/git/commits{/sha}","comments_url":"https://api.github.com/repos/CartoDB/bigmetadata/comments{/number}","issue_comment_url":"https://api.github.com/repos/CartoDB/bigmetadata/issues/comments{/number}","contents_url":"https://api.github.com/repos/CartoDB/bigmetadata/contents/{+path}","compare_url":"https://api.github.com/repos/CartoDB/bigmetadata/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CartoDB/bigmetadata/merges","archive_url":"https://api.github.com/repos/CartoDB/bigmetadata/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CartoDB/bigmetadata/downloads","issues_url":"https://api.github.com/repos/CartoDB/bigmetadata/issues{/number}","pulls_url":"https://api.github.com/repos/CartoDB/bigmetadata/pulls{/number}","milestones_url":"https://api.github.com/repos/CartoDB/bigmetadata/milestones{/number}","notifications_url":"https://api.github.com/repos/CartoDB/bigmetadata/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CartoDB/bigmetadata/labels{/name}","releases_url":"https://api.github.com/repos/CartoDB/bigmetadata/releases{/id}","deployments_url":"https://api.github.com/repos/CartoDB/bigmetadata/deployments","created_at":"2015-12-03T20:09:45Z","updated_at":"2018-04-18T08:36:29Z","pushed_at":"2018-04-24T11:14:07Z","git_url":"git://github.com/CartoDB/bigmetadata.git","ssh_url":"git@github.com:CartoDB/bigmetadata.git","clone_url":"https://github.com/CartoDB/bigmetadata.git","svn_url":"https://github.com/CartoDB/bigmetadata","homepage":null,"size":683568,"stargazers_count":31,"watchers_count":31,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":6,"mirror_url":null,"archived":false,"open_issues_count":109,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause"},"forks":6,"open_issues":109,"watchers":31,"default_branch":"master"}},"base":{"label":"CartoDB:master","ref":"master","sha":"f3ec064d7f0d41ac643bcb3bda8fa966e60c7763","user":{"login":"CartoDB","id":1799254,"avatar_url":"https://avatars0.githubusercontent.com/u/1799254?v=4","gravatar_id":"","url":"https://api.github.com/users/CartoDB","html_url":"https://github.com/CartoDB","followers_url":"https://api.github.com/users/CartoDB/followers","following_url":"https://api.github.com/users/CartoDB/following{/other_user}","gists_url":"https://api.github.com/users/CartoDB/gists{/gist_id}","starred_url":"https://api.github.com/users/CartoDB/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CartoDB/subscriptions","organizations_url":"https://api.github.com/users/CartoDB/orgs","repos_url":"https://api.github.com/users/CartoDB/repos","events_url":"https://api.github.com/users/CartoDB/events{/privacy}","received_events_url":"https://api.github.com/users/CartoDB/received_events","type":"Organization","site_admin":false},"repo":{"id":47357348,"name":"bigmetadata","full_name":"CartoDB/bigmetadata","owner":{"login":"CartoDB","id":1799254,"avatar_url":"https://avatars0.githubusercontent.com/u/1799254?v=4","gravatar_id":"","url":"https://api.github.com/users/CartoDB","html_url":"https://github.com/CartoDB","followers_url":"https://api.github.com/users/CartoDB/followers","following_url":"https://api.github.com/users/CartoDB/following{/other_user}","gists_url":"https://api.github.com/users/CartoDB/gists{/gist_id}","starred_url":"https://api.github.com/users/CartoDB/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CartoDB/subscriptions","organizations_url":"https://api.github.com/users/CartoDB/orgs","repos_url":"https://api.github.com/users/CartoDB/repos","events_url":"https://api.github.com/users/CartoDB/events{/privacy}","received_events_url":"https://api.github.com/users/CartoDB/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/CartoDB/bigmetadata","description":null,"fork":false,"url":"https://api.github.com/repos/CartoDB/bigmetadata","forks_url":"https://api.github.com/repos/CartoDB/bigmetadata/forks","keys_url":"https://api.github.com/repos/CartoDB/bigmetadata/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CartoDB/bigmetadata/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CartoDB/bigmetadata/teams","hooks_url":"https://api.github.com/repos/CartoDB/bigmetadata/hooks","issue_events_url":"https://api.github.com/repos/CartoDB/bigmetadata/issues/events{/number}","events_url":"https://api.github.com/repos/CartoDB/bigmetadata/events","assignees_url":"https://api.github.com/repos/CartoDB/bigmetadata/assignees{/user}","branches_url":"https://api.github.com/repos/CartoDB/bigmetadata/branches{/branch}","tags_url":"https://api.github.com/repos/CartoDB/bigmetadata/tags","blobs_url":"https://api.github.com/repos/CartoDB/bigmetadata/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CartoDB/bigmetadata/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CartoDB/bigmetadata/git/refs{/sha}","trees_url":"https://api.github.com/repos/CartoDB/bigmetadata/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CartoDB/bigmetadata/statuses/{sha}","languages_url":"https://api.github.com/repos/CartoDB/bigmetadata/languages","stargazers_url":"https://api.github.com/repos/CartoDB/bigmetadata/stargazers","contributors_url":"https://api.github.com/repos/CartoDB/bigmetadata/contributors","subscribers_url":"https://api.github.com/repos/CartoDB/bigmetadata/subscribers","subscription_url":"https://api.github.com/repos/CartoDB/bigmetadata/subscription","commits_url":"https://api.github.com/repos/CartoDB/bigmetadata/commits{/sha}","git_commits_url":"https://api.github.com/repos/CartoDB/bigmetadata/git/commits{/sha}","comments_url":"https://api.github.com/repos/CartoDB/bigmetadata/comments{/number}","issue_comment_url":"https://api.github.com/repos/CartoDB/bigmetadata/issues/comments{/number}","contents_url":"https://api.github.com/repos/CartoDB/bigmetadata/contents/{+path}","compare_url":"https://api.github.com/repos/CartoDB/bigmetadata/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CartoDB/bigmetadata/merges","archive_url":"https://api.github.com/repos/CartoDB/bigmetadata/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CartoDB/bigmetadata/downloads","issues_url":"https://api.github.com/repos/CartoDB/bigmetadata/issues{/number}","pulls_url":"https://api.github.com/repos/CartoDB/bigmetadata/pulls{/number}","milestones_url":"https://api.github.com/repos/CartoDB/bigmetadata/milestones{/number}","notifications_url":"https://api.github.com/repos/CartoDB/bigmetadata/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CartoDB/bigmetadata/labels{/name}","releases_url":"https://api.github.com/repos/CartoDB/bigmetadata/releases{/id}","deployments_url":"https://api.github.com/repos/CartoDB/bigmetadata/deployments","created_at":"2015-12-03T20:09:45Z","updated_at":"2018-04-18T08:36:29Z","pushed_at":"2018-04-24T11:14:07Z","git_url":"git://github.com/CartoDB/bigmetadata.git","ssh_url":"git@github.com:CartoDB/bigmetadata.git","clone_url":"https://github.com/CartoDB/bigmetadata.git","svn_url":"https://github.com/CartoDB/bigmetadata","homepage":null,"size":683568,"stargazers_count":31,"watchers_count":31,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":6,"mirror_url":null,"archived":false,"open_issues_count":109,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause"},"forks":6,"open_issues":109,"watchers":31,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/CartoDB/bigmetadata/pulls/479"},"html":{"href":"https://github.com/CartoDB/bigmetadata/pull/479"},"issue":{"href":"https://api.github.com/repos/CartoDB/bigmetadata/issues/479"},"comments":{"href":"https://api.github.com/repos/CartoDB/bigmetadata/issues/479/comments"},"review_comments":{"href":"https://api.github.com/repos/CartoDB/bigmetadata/pulls/479/comments"},"review_comment":{"href":"https://api.github.com/repos/CartoDB/bigmetadata/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/CartoDB/bigmetadata/pulls/479/commits"},"statuses":{"href":"https://api.github.com/repos/CartoDB/bigmetadata/statuses/4c8f6b19f3faf056a1a85e241ded096bd2bec1bc"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"houndci-bot"}}