{"action":"created","comment":{"url":"https://api.github.com/repos/CartoDB/cartodb/pulls/comments/40896626","id":40896626,"diff_hunk":"@@ -0,0 +1,187 @@\n+# encoding: utf-8\n+\n+require_relative '../../spec_helper'\n+\n+describe Carto::VisualizationsExportService do\n+  before(:each) do\n+    bypass_named_maps\n+    ::User.any_instance\n+          .stubs(:has_feature_flag?)\n+          .with(Carto::VisualizationsExportService::FEATURE_FLAG_NAME)\n+          .returns(true)\n+  end\n+\n+  after(:each) do\n+    Carto::VisualizationBackup.delete_all\n+  end\n+\n+  it \"Calls data export upon visualization deletion\" do\n+    visualization = create_vis($user_1)\n+\n+    Carto::VisualizationsExportService.any_instance\n+                                      .expects(:export)\n+                                      .with(visualization.id)\n+                                      .returns(true)\n+\n+    visualization.delete\n+  end\n+\n+  it \"Exports data to DB\" do\n+    visualization = create_vis($user_1)\n+\n+    visualization_clone = visualization.dup\n+\n+    visualization.delete\n+\n+    backup = Carto::VisualizationBackup.where(visualization: visualization_clone.id).first\n+    backup.should_not eq nil\n+    backup.visualization.should eq visualization_clone.id\n+    backup.username.should eq visualization_clone.user.username\n+    backup.export_vizjson.should_not eq nil\n+    backup.export_vizjson.should_not eq \"\"\n+  end\n+\n+  it \"Purges old backup entries when told to do so\" do\n+    visualization = create_vis($user_1)\n+    visualization.delete\n+    visualization = create_vis($user_1)\n+    visualization.delete\n+    visualization = create_vis($user_1)\n+    visualization.delete\n+\n+    old_date = Date.today - (Carto::VisualizationsExportService::DAYS_TO_KEEP_BACKUP * 2).days\n+    Carto::VisualizationBackup.update_all \"created_at='#{old_date}'\"\n+\n+    purged_items = Carto::VisualizationsExportService.new.purge_old\n+\n+    purged_items.should eq 3\n+    Carto::VisualizationBackup.where(username: $user_1.username).count.should eq 0\n+  end\n+\n+  it \"Deletes backup after successfully restoring\" do\n+    visualization = create_vis($user_1)\n+\n+    visualization_clone = visualization.dup\n+\n+    visualization.delete\n+\n+    result = Carto::VisualizationsExportService.new.import(visualization_clone.id)\n+    result.should eq true\n+\n+    expect {\n+      Carto::VisualizationsExportService.new.import(visualization_clone.id)\n+    }.to raise_error Carto::VisualizationsExportServiceError\n+\n+    Carto::VisualizationBackup.where(visualization: visualization_clone.id).count.should eq 0\n+  end\n+\n+  it \"Imports data from DB\" do\n+    table_1 = create_table(user_id: $user_1.id)\n+    table_2 = create_table(user_id: $user_1.id)\n+\n+    blender = Visualization::TableBlender.new($user_1, [table_1, table_2])\n+    map = blender.blend\n+\n+    visualization = create_vis($user_1, map_id: map.id, description: 'description <strong>with tags</strong>')\n+\n+    # Keep data for later comparisons\n+    base_layer = visualization.layers(:base).first\n+    visualization_clone = visualization.dup\n+\n+    original_data_layer_names = visualization.layers(:carto_and_torque).map { |layer| layer.options[\"table_name\"] }\n+\n+    # As duplicating the vis only works fine with parent object, store also the vizjson for comparisons\n+    vizjson_options = {\n+      full: true,\n+      user_name: visualization.user.username,\n+      user_api_key: visualization.user.api_key,\n+      user: visualization.user,\n+      viewer_user: visualization.user\n+    }\n+    original_vizjson = CartoDB::Visualization::VizJSON.new(\n+      Carto::Api::VisualizationVizJSONAdapter.new(visualization, $tables_metadata), vizjson_options, Cartodb.config)\n+                                                      .to_poro\n+                                                      .to_json\n+    original_vizjson = ::JSON.parse(original_vizjson)\n+\n+    visualization.delete\n+\n+    Carto::VisualizationsExportService.new.import(visualization_clone.id)\n+\n+    # Restore maintains same visualization UUID\n+    restored_visualization = CartoDB::Visualization::Member.new(id: visualization_clone.id).fetch\n+    restored_visualization.nil?.should eq false\n+\n+    # Can reuse same vizjson options\n+    restored_vizjson = CartoDB::Visualization::VizJSON.new(\n+      Carto::Api::VisualizationVizJSONAdapter.new(restored_visualization, $tables_metadata),\n+      vizjson_options, Cartodb.config)\n+                                                      .to_poro\n+                                                      .to_json\n+    restored_vizjson = ::JSON.parse(restored_vizjson)\n+\n+    restored_data_layer_names = visualization.layers(:carto_and_torque).map { |layer| layer.options[\"table_name\"] }\n+\n+    # Base attributes checks\n+    restored_visualization.name.should eq visualization_clone.name\n+    restored_visualization.description.should eq visualization_clone.description\n+    restored_visualization.privacy.should eq CartoDB::Visualization::Member::PRIVACY_LINK\n+    # Vizjson checks\n+    restored_vizjson['map_provider'].should eq original_vizjson['map_provider']\n+    restored_vizjson['bounds'].should eq original_vizjson['bounds']\n+    restored_vizjson['center'].should eq original_vizjson['center']\n+    restored_vizjson['zoom'].should eq original_vizjson['zoom']\n+    restored_vizjson['overlays'].should eq original_vizjson['overlays']\n+\n+    (restored_vizjson[\"layers\"][1][\"options\"][\"named_map\"][\"layers\"] -\n+     original_vizjson[\"layers\"][1][\"options\"][\"named_map\"][\"layers\"]).should eq []\n+\n+    # Layer checks\n+    (restored_visualization.layers(:base).count > 0).should eq true\n+    restored_visualization.layers(:base).first[\"options\"].should eq base_layer[\"options\"]\n+    restored_visualization.layers(:carto_and_torque).count.should eq 2\n+    (restored_data_layer_names - original_data_layer_names).should eq []\n+\n+  end\n+\n+  it \"Doesn't imports when versioning changes except if forced\" do\n+    stubbed_version = -1\n+    Carto::VisualizationsExportService.any_instance.stubs(:export_version).returns(stubbed_version)\n+\n+    visualization = create_vis($user_1)\n+    visualization_id = visualization.id\n+    visualization.delete\n+\n+    Carto::VisualizationsExportService.any_instance.unstub(:export_version)\n+\n+    export_service = Carto::VisualizationsExportService.new\n+\n+    version = export_service.send (:export_version)\n+\n+    expect {\n+      export_service.import(visualization_id)\n+    }.to raise_exception Carto::VisualizationsExportServiceError,\n+                         \"Stored data has different version (#{stubbed_version}) than Service (#{version})\"\n+\n+    result = export_service.import(visualization_id, true)\n+    result.should eq true\n+  end\n+\n+  private\n+\n+  def create_vis(user, attributes = {})\n+    attrs = {\n+      user_id:                  user.id,\n+      name:                     attributes.fetch(:name, \"visualization #{rand(9999)}\"),\n+      map_id:                   attributes.fetch(:map_id, ::Map.create(user_id: user.id).id),\n+      description:              attributes.fetch(:description, 'bogus'),\n+      type:                     attributes.fetch(:type, 'derived'),","path":"spec/services/carto/visualizations_export_service_spec.rb","position":178,"original_position":178,"commit_id":"309e4d3694d43ae822524cc6bb71343c914ad7b4","original_commit_id":"309e4d3694d43ae822524cc6bb71343c914ad7b4","user":{"login":"houndci","id":6697940,"avatar_url":"https://avatars.githubusercontent.com/u/6697940?v=3","gravatar_id":"","url":"https://api.github.com/users/houndci","html_url":"https://github.com/houndci","followers_url":"https://api.github.com/users/houndci/followers","following_url":"https://api.github.com/users/houndci/following{/other_user}","gists_url":"https://api.github.com/users/houndci/gists{/gist_id}","starred_url":"https://api.github.com/users/houndci/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/houndci/subscriptions","organizations_url":"https://api.github.com/users/houndci/orgs","repos_url":"https://api.github.com/users/houndci/repos","events_url":"https://api.github.com/users/houndci/events{/privacy}","received_events_url":"https://api.github.com/users/houndci/received_events","type":"User","site_admin":false},"body":"Unnecessary spacing detected.","created_at":"2015-10-01T09:55:15Z","updated_at":"2015-10-01T09:55:15Z","html_url":"https://github.com/CartoDB/cartodb/pull/5820#discussion_r40896626","pull_request_url":"https://api.github.com/repos/CartoDB/cartodb/pulls/5820","_links":{"self":{"href":"https://api.github.com/repos/CartoDB/cartodb/pulls/comments/40896626"},"html":{"href":"https://github.com/CartoDB/cartodb/pull/5820#discussion_r40896626"},"pull_request":{"href":"https://api.github.com/repos/CartoDB/cartodb/pulls/5820"}}},"pull_request":{"url":"https://api.github.com/repos/CartoDB/cartodb/pulls/5820","id":46504199,"html_url":"https://github.com/CartoDB/cartodb/pull/5820","diff_url":"https://github.com/CartoDB/cartodb/pull/5820.diff","patch_url":"https://github.com/CartoDB/cartodb/pull/5820.patch","issue_url":"https://api.github.com/repos/CartoDB/cartodb/issues/5820","number":5820,"state":"open","locked":false,"title":"Visualization export/restore v1.0","user":{"login":"Kartones","id":2085449,"avatar_url":"https://avatars.githubusercontent.com/u/2085449?v=3","gravatar_id":"","url":"https://api.github.com/users/Kartones","html_url":"https://github.com/Kartones","followers_url":"https://api.github.com/users/Kartones/followers","following_url":"https://api.github.com/users/Kartones/following{/other_user}","gists_url":"https://api.github.com/users/Kartones/gists{/gist_id}","starred_url":"https://api.github.com/users/Kartones/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Kartones/subscriptions","organizations_url":"https://api.github.com/users/Kartones/orgs","repos_url":"https://api.github.com/users/Kartones/repos","events_url":"https://api.github.com/users/Kartones/events{/privacy}","received_events_url":"https://api.github.com/users/Kartones/received_events","type":"User","site_admin":false},"body":"Closes #5710 ","created_at":"2015-10-01T09:54:36Z","updated_at":"2015-10-01T09:55:15Z","closed_at":null,"merged_at":null,"merge_commit_sha":"92444405ebad6e9445f524af665e1a277f9c4589","assignee":{"login":"Kartones","id":2085449,"avatar_url":"https://avatars.githubusercontent.com/u/2085449?v=3","gravatar_id":"","url":"https://api.github.com/users/Kartones","html_url":"https://github.com/Kartones","followers_url":"https://api.github.com/users/Kartones/followers","following_url":"https://api.github.com/users/Kartones/following{/other_user}","gists_url":"https://api.github.com/users/Kartones/gists{/gist_id}","starred_url":"https://api.github.com/users/Kartones/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Kartones/subscriptions","organizations_url":"https://api.github.com/users/Kartones/orgs","repos_url":"https://api.github.com/users/Kartones/repos","events_url":"https://api.github.com/users/Kartones/events{/privacy}","received_events_url":"https://api.github.com/users/Kartones/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/CartoDB/cartodb/pulls/5820/commits","review_comments_url":"https://api.github.com/repos/CartoDB/cartodb/pulls/5820/comments","review_comment_url":"https://api.github.com/repos/CartoDB/cartodb/pulls/comments{/number}","comments_url":"https://api.github.com/repos/CartoDB/cartodb/issues/5820/comments","statuses_url":"https://api.github.com/repos/CartoDB/cartodb/statuses/309e4d3694d43ae822524cc6bb71343c914ad7b4","head":{"label":"CartoDB:5710-viz-backup-restore","ref":"5710-viz-backup-restore","sha":"309e4d3694d43ae822524cc6bb71343c914ad7b4","user":{"login":"CartoDB","id":1799254,"avatar_url":"https://avatars.githubusercontent.com/u/1799254?v=3","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":4909355,"name":"cartodb","full_name":"CartoDB/cartodb","owner":{"login":"CartoDB","id":1799254,"avatar_url":"https://avatars.githubusercontent.com/u/1799254?v=3","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/cartodb","description":"Location Intelligence & Data Visualization tool","fork":false,"url":"https://api.github.com/repos/CartoDB/cartodb","forks_url":"https://api.github.com/repos/CartoDB/cartodb/forks","keys_url":"https://api.github.com/repos/CartoDB/cartodb/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CartoDB/cartodb/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CartoDB/cartodb/teams","hooks_url":"https://api.github.com/repos/CartoDB/cartodb/hooks","issue_events_url":"https://api.github.com/repos/CartoDB/cartodb/issues/events{/number}","events_url":"https://api.github.com/repos/CartoDB/cartodb/events","assignees_url":"https://api.github.com/repos/CartoDB/cartodb/assignees{/user}","branches_url":"https://api.github.com/repos/CartoDB/cartodb/branches{/branch}","tags_url":"https://api.github.com/repos/CartoDB/cartodb/tags","blobs_url":"https://api.github.com/repos/CartoDB/cartodb/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CartoDB/cartodb/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CartoDB/cartodb/git/refs{/sha}","trees_url":"https://api.github.com/repos/CartoDB/cartodb/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CartoDB/cartodb/statuses/{sha}","languages_url":"https://api.github.com/repos/CartoDB/cartodb/languages","stargazers_url":"https://api.github.com/repos/CartoDB/cartodb/stargazers","contributors_url":"https://api.github.com/repos/CartoDB/cartodb/contributors","subscribers_url":"https://api.github.com/repos/CartoDB/cartodb/subscribers","subscription_url":"https://api.github.com/repos/CartoDB/cartodb/subscription","commits_url":"https://api.github.com/repos/CartoDB/cartodb/commits{/sha}","git_commits_url":"https://api.github.com/repos/CartoDB/cartodb/git/commits{/sha}","comments_url":"https://api.github.com/repos/CartoDB/cartodb/comments{/number}","issue_comment_url":"https://api.github.com/repos/CartoDB/cartodb/issues/comments{/number}","contents_url":"https://api.github.com/repos/CartoDB/cartodb/contents/{+path}","compare_url":"https://api.github.com/repos/CartoDB/cartodb/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CartoDB/cartodb/merges","archive_url":"https://api.github.com/repos/CartoDB/cartodb/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CartoDB/cartodb/downloads","issues_url":"https://api.github.com/repos/CartoDB/cartodb/issues{/number}","pulls_url":"https://api.github.com/repos/CartoDB/cartodb/pulls{/number}","milestones_url":"https://api.github.com/repos/CartoDB/cartodb/milestones{/number}","notifications_url":"https://api.github.com/repos/CartoDB/cartodb/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CartoDB/cartodb/labels{/name}","releases_url":"https://api.github.com/repos/CartoDB/cartodb/releases{/id}","created_at":"2012-07-05T15:23:45Z","updated_at":"2015-10-01T02:16:48Z","pushed_at":"2015-10-01T09:54:38Z","git_url":"git://github.com/CartoDB/cartodb.git","ssh_url":"git@github.com:CartoDB/cartodb.git","clone_url":"https://github.com/CartoDB/cartodb.git","svn_url":"https://github.com/CartoDB/cartodb","homepage":"http://cartodb.com","size":512217,"stargazers_count":947,"watchers_count":947,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":224,"mirror_url":null,"open_issues_count":821,"forks":224,"open_issues":821,"watchers":947,"default_branch":"master"}},"base":{"label":"CartoDB:master","ref":"master","sha":"27275542c8ef7524579b2755e93809ef7faa7d96","user":{"login":"CartoDB","id":1799254,"avatar_url":"https://avatars.githubusercontent.com/u/1799254?v=3","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":4909355,"name":"cartodb","full_name":"CartoDB/cartodb","owner":{"login":"CartoDB","id":1799254,"avatar_url":"https://avatars.githubusercontent.com/u/1799254?v=3","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/cartodb","description":"Location Intelligence & Data Visualization tool","fork":false,"url":"https://api.github.com/repos/CartoDB/cartodb","forks_url":"https://api.github.com/repos/CartoDB/cartodb/forks","keys_url":"https://api.github.com/repos/CartoDB/cartodb/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CartoDB/cartodb/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CartoDB/cartodb/teams","hooks_url":"https://api.github.com/repos/CartoDB/cartodb/hooks","issue_events_url":"https://api.github.com/repos/CartoDB/cartodb/issues/events{/number}","events_url":"https://api.github.com/repos/CartoDB/cartodb/events","assignees_url":"https://api.github.com/repos/CartoDB/cartodb/assignees{/user}","branches_url":"https://api.github.com/repos/CartoDB/cartodb/branches{/branch}","tags_url":"https://api.github.com/repos/CartoDB/cartodb/tags","blobs_url":"https://api.github.com/repos/CartoDB/cartodb/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CartoDB/cartodb/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CartoDB/cartodb/git/refs{/sha}","trees_url":"https://api.github.com/repos/CartoDB/cartodb/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CartoDB/cartodb/statuses/{sha}","languages_url":"https://api.github.com/repos/CartoDB/cartodb/languages","stargazers_url":"https://api.github.com/repos/CartoDB/cartodb/stargazers","contributors_url":"https://api.github.com/repos/CartoDB/cartodb/contributors","subscribers_url":"https://api.github.com/repos/CartoDB/cartodb/subscribers","subscription_url":"https://api.github.com/repos/CartoDB/cartodb/subscription","commits_url":"https://api.github.com/repos/CartoDB/cartodb/commits{/sha}","git_commits_url":"https://api.github.com/repos/CartoDB/cartodb/git/commits{/sha}","comments_url":"https://api.github.com/repos/CartoDB/cartodb/comments{/number}","issue_comment_url":"https://api.github.com/repos/CartoDB/cartodb/issues/comments{/number}","contents_url":"https://api.github.com/repos/CartoDB/cartodb/contents/{+path}","compare_url":"https://api.github.com/repos/CartoDB/cartodb/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CartoDB/cartodb/merges","archive_url":"https://api.github.com/repos/CartoDB/cartodb/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CartoDB/cartodb/downloads","issues_url":"https://api.github.com/repos/CartoDB/cartodb/issues{/number}","pulls_url":"https://api.github.com/repos/CartoDB/cartodb/pulls{/number}","milestones_url":"https://api.github.com/repos/CartoDB/cartodb/milestones{/number}","notifications_url":"https://api.github.com/repos/CartoDB/cartodb/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CartoDB/cartodb/labels{/name}","releases_url":"https://api.github.com/repos/CartoDB/cartodb/releases{/id}","created_at":"2012-07-05T15:23:45Z","updated_at":"2015-10-01T02:16:48Z","pushed_at":"2015-10-01T09:54:38Z","git_url":"git://github.com/CartoDB/cartodb.git","ssh_url":"git@github.com:CartoDB/cartodb.git","clone_url":"https://github.com/CartoDB/cartodb.git","svn_url":"https://github.com/CartoDB/cartodb","homepage":"http://cartodb.com","size":512217,"stargazers_count":947,"watchers_count":947,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":224,"mirror_url":null,"open_issues_count":821,"forks":224,"open_issues":821,"watchers":947,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/CartoDB/cartodb/pulls/5820"},"html":{"href":"https://github.com/CartoDB/cartodb/pull/5820"},"issue":{"href":"https://api.github.com/repos/CartoDB/cartodb/issues/5820"},"comments":{"href":"https://api.github.com/repos/CartoDB/cartodb/issues/5820/comments"},"review_comments":{"href":"https://api.github.com/repos/CartoDB/cartodb/pulls/5820/comments"},"review_comment":{"href":"https://api.github.com/repos/CartoDB/cartodb/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/CartoDB/cartodb/pulls/5820/commits"},"statuses":{"href":"https://api.github.com/repos/CartoDB/cartodb/statuses/309e4d3694d43ae822524cc6bb71343c914ad7b4"}}}}