Initial commit
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
require 'yaml'
|
||||
require_relative '../../../../spec/rspec_configuration'
|
||||
|
||||
require_relative '../../lib/datasources'
|
||||
require_relative '../doubles/user'
|
||||
require 'spec_helper_min'
|
||||
|
||||
include CartoDB::Datasources
|
||||
|
||||
describe DatasourcesFactory do
|
||||
|
||||
def get_config
|
||||
@config ||= YAML.load_file("#{File.dirname(__FILE__)}/../../../../config/app_config.yml")['defaults']
|
||||
end
|
||||
|
||||
describe '#provider_instantiations' do
|
||||
it 'tests all available provider instantiations' do
|
||||
user = FactoryGirl.build(:user)
|
||||
user.stubs('has_feature_flag?').with('gnip_v2').returns(false)
|
||||
DatasourcesFactory.set_config(get_config)
|
||||
|
||||
dropbox_provider = DatasourcesFactory.get_datasource(Url::Dropbox::DATASOURCE_NAME, user)
|
||||
dropbox_provider.is_a?(Url::Dropbox).should eq true
|
||||
|
||||
dropbox_provider = DatasourcesFactory.get_datasource(Url::Box::DATASOURCE_NAME, user)
|
||||
dropbox_provider.is_a?(Url::Box).should eq true
|
||||
|
||||
# Stubs Google Drive client for connectionless testing
|
||||
Google::Apis::DriveV2::DriveService.any_instance.stubs(:get_file)
|
||||
Google::Apis::DriveV2::DriveService.any_instance.stubs(:export_file)
|
||||
Google::Apis::DriveV2::DriveService.any_instance.stubs(:list_files)
|
||||
gdrive_provider = DatasourcesFactory.get_datasource(Url::GDrive::DATASOURCE_NAME, user)
|
||||
gdrive_provider.is_a?(Url::GDrive).should eq true
|
||||
|
||||
url_provider = DatasourcesFactory.get_datasource(Url::PublicUrl::DATASOURCE_NAME, user)
|
||||
url_provider.is_a?(Url::PublicUrl).should eq true
|
||||
|
||||
twitter_provider = DatasourcesFactory.get_datasource(Search::Twitter::DATASOURCE_NAME, user)
|
||||
twitter_provider.is_a?(Search::Twitter).should eq true
|
||||
|
||||
nil_provider = DatasourcesFactory.get_datasource(nil, user)
|
||||
nil_provider.nil?.should eq true
|
||||
|
||||
expect {
|
||||
DatasourcesFactory.get_datasource('blablabla...', user)
|
||||
}.to raise_exception MissingConfigurationError
|
||||
end
|
||||
end
|
||||
|
||||
describe '#customized_config?' do
|
||||
let(:twitter_datasource) { CartoDB::Datasources::Search::Twitter::DATASOURCE_NAME }
|
||||
|
||||
before(:each) do
|
||||
@config = get_config
|
||||
end
|
||||
|
||||
it 'returns false for a random user' do
|
||||
user = FactoryGirl.build(:carto_user, username: 'wadus')
|
||||
DatasourcesFactory.customized_config?(twitter_datasource, user).should be_false
|
||||
end
|
||||
|
||||
it 'returns true for a user with custom config' do
|
||||
user = FactoryGirl.build(:carto_user, username: 'wadus')
|
||||
@config['datasource_search']['twitter_search']['customized_user_list'] = [user.username]
|
||||
DatasourcesFactory.set_config(@config)
|
||||
|
||||
DatasourcesFactory.customized_config?(twitter_datasource, user).should be_true
|
||||
end
|
||||
|
||||
it 'returns true for a user in an organization with custom config' do
|
||||
organization = Carto::Organization.new(name: 'wadus-org')
|
||||
user = FactoryGirl.build(:carto_user, username: 'nowadus', organization: organization)
|
||||
@config['datasource_search']['twitter_search']['customized_orgs_list'] = [organization.name]
|
||||
DatasourcesFactory.set_config(@config)
|
||||
|
||||
DatasourcesFactory.customized_config?(twitter_datasource, user).should be_true
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,35 @@
|
||||
require 'yaml'
|
||||
require_relative '../../lib/datasources'
|
||||
require_relative '../doubles/user'
|
||||
|
||||
include CartoDB::Datasources
|
||||
|
||||
describe Url::Dropbox do
|
||||
|
||||
def get_config
|
||||
@config ||= YAML.load_file("#{File.dirname(__FILE__)}/../../../../config/app_config.yml")['defaults']['oauth']['dropbox']
|
||||
end #get_config
|
||||
|
||||
describe '#manual_test' do
|
||||
it 'with user interaction, tests the full oauth flow and lists files of an account' do
|
||||
user_mock = CartoDB::Datasources::Doubles::User.new
|
||||
|
||||
config = get_config
|
||||
dropbox_datasource = Url::Dropbox.get_new(config, user_mock)
|
||||
|
||||
if config.include?(:access_token)
|
||||
dropbox_datasource.token = config[:access_token]
|
||||
else
|
||||
pending('This test requires manual run, opening the url in a browser, grabbing the code and setting "input" to it')
|
||||
puts dropbox_datasource.get_auth_url
|
||||
input = ''
|
||||
dropbox_datasource.validate_auth_code(input)
|
||||
puts dropbox_datasource.token
|
||||
end
|
||||
data = dropbox_datasource.get_resources_list
|
||||
puts data
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
require 'yaml'
|
||||
require_relative '../../lib/datasources'
|
||||
require_relative '../doubles/user'
|
||||
|
||||
include CartoDB::Datasources
|
||||
|
||||
describe Url::GDrive do
|
||||
|
||||
def get_config
|
||||
@config ||= YAML.load_file("#{File.dirname(__FILE__)}/../../../../config/app_config.yml")['defaults']['oauth']['gdrive']
|
||||
end
|
||||
|
||||
describe '#manual_test' do
|
||||
it 'with user interaction, tests the full oauth flow and lists files of an account' do
|
||||
config = get_config
|
||||
if !config.include?(:refresh_token)
|
||||
pending('If config unset, this test requires manual running. Check its source code to see what to do')
|
||||
end
|
||||
|
||||
user_mock = CartoDB::Datasources::Doubles::User.new
|
||||
gdrive_datasource = Url::GDrive.get_new(config, user_mock)
|
||||
|
||||
if config.include?(:refresh_token)
|
||||
gdrive_datasource.token = config[:refresh_token]
|
||||
else
|
||||
# Manual testing
|
||||
puts gdrive_datasource.get_auth_url
|
||||
input = ''
|
||||
gdrive_datasource.validate_auth_code(input)
|
||||
puts gdrive_datasource.token
|
||||
end
|
||||
data = gdrive_datasource.get_resources_list
|
||||
puts data
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,36 @@
|
||||
require_relative '../../lib/datasources'
|
||||
require_relative '../../../../spec/helpers/file_server_helper'
|
||||
|
||||
include CartoDB::Datasources
|
||||
include FileServerHelper
|
||||
|
||||
describe Url::PublicUrl do
|
||||
|
||||
describe '#basic_tests' do
|
||||
it 'Some basic download flows of this file provider, including error handling' do
|
||||
url_provider = Url::PublicUrl.get_new
|
||||
|
||||
serve_file 'spec/support/data/cartofante_blue.png' do |url|
|
||||
invalid_url = url + 'invalid'
|
||||
|
||||
data = url_provider.get_resource(url)
|
||||
data.empty?.should eq false
|
||||
expect {
|
||||
url_provider.get_resource(invalid_url)
|
||||
}.to raise_exception DataDownloadError
|
||||
|
||||
url_provider.fetch_headers(url)
|
||||
url_provider.etag_header.empty?.should eq false
|
||||
|
||||
url_provider.fetch_headers(invalid_url).should == {}
|
||||
|
||||
url_provider.etag_header.should be_empty
|
||||
|
||||
url_provider.last_modified_header.should be_empty
|
||||
|
||||
# puts data
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,20 @@
|
||||
module CartoDB
|
||||
module Datasources
|
||||
module Doubles
|
||||
class DataImport
|
||||
|
||||
attr_accessor :id,
|
||||
:service_item_id
|
||||
|
||||
def initialize(attrs = {})
|
||||
@id = attrs.fetch(:id, '123456')
|
||||
@service_item_id = attrs.fetch(:service_item_id, '67890')
|
||||
end
|
||||
|
||||
def save
|
||||
self
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,23 @@
|
||||
module CartoDB
|
||||
module TwitterSearch
|
||||
module Doubles
|
||||
class JSONToCSVConverter
|
||||
|
||||
def initialize(attrs = {})
|
||||
end
|
||||
|
||||
def process(input_data = [], add_headers = false, additional_fields = {})
|
||||
input_data.join("\n")
|
||||
end
|
||||
|
||||
def generate_headers(additional_fields = {})
|
||||
if additional_fields.nil? || additional_fields.empty?
|
||||
''
|
||||
else
|
||||
additional_fields.join(',')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,18 @@
|
||||
module CartoDB
|
||||
module Datasources
|
||||
module Doubles
|
||||
class Organization
|
||||
|
||||
attr_accessor :twitter_datasource_enabled
|
||||
|
||||
def initialize(attrs = {})
|
||||
@twitter_datasource_enabled = attrs.fetch(:twitter_datasource_enabled, true)
|
||||
end
|
||||
|
||||
def save
|
||||
self
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,26 @@
|
||||
module CartoDB
|
||||
module Datasources
|
||||
module Doubles
|
||||
class SearchTweet
|
||||
|
||||
attr_accessor :user_id,
|
||||
:data_import_id,
|
||||
:service_item_id,
|
||||
:retrieved_items,
|
||||
:state
|
||||
|
||||
def set_importing_state
|
||||
@state = 'importing'
|
||||
end
|
||||
|
||||
def set_complete_state
|
||||
@state = 'complete'
|
||||
end
|
||||
|
||||
def save
|
||||
self
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,45 @@
|
||||
module CartoDB
|
||||
module Datasources
|
||||
module Doubles
|
||||
class User
|
||||
|
||||
attr_accessor :twitter_datasource_enabled,
|
||||
:soft_twitter_datasource_limit,
|
||||
:twitter_datasource_quota,
|
||||
:username,
|
||||
:id
|
||||
|
||||
def initialize(attrs = {})
|
||||
@twitter_datasource_enabled = attrs.fetch(:twitter_datasource_enabled, true)
|
||||
@soft_twitter_datasource_limit = attrs.fetch(:soft_twitter_datasource_limit, false)
|
||||
@twitter_datasource_quota = attrs.fetch(:twitter_datasource_quota, 123)
|
||||
@username = attrs.fetch(:username, 'wadus')
|
||||
@id = attrs.fetch(:id, '000-000')
|
||||
@organization = attrs.fetch(:has_org, false) \
|
||||
? Organization.new({
|
||||
twitter_datasource_enabled: attrs.fetch(:org_twitter_datasource_enabled, true),
|
||||
twitter_datasource_quota: attrs.fetch(:org_twitter_datasource_quota, 123)
|
||||
}) \
|
||||
: nil
|
||||
end
|
||||
|
||||
def organization
|
||||
@organization
|
||||
end
|
||||
|
||||
def save
|
||||
self
|
||||
end
|
||||
|
||||
def remaining_twitter_quota
|
||||
if @organization.nil?
|
||||
@twitter_datasource_quota
|
||||
else
|
||||
@organization.twitter_datasource_quota
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"displayFieldName": "NAME",
|
||||
"fieldAliases": {
|
||||
"OBJECTID": "OBJECTID",
|
||||
"WDPAID": "WDPAID",
|
||||
"NAME": "NAME"
|
||||
},
|
||||
"geometryType": "esriGeometryPolygon",
|
||||
"spatialReference": {
|
||||
"wkid": 4326,
|
||||
"latestWkid": 4326
|
||||
},
|
||||
"fields": [
|
||||
{
|
||||
"name": "OBJECTID",
|
||||
"type": "esriFieldTypeOID",
|
||||
"alias": "OBJECTID"
|
||||
},
|
||||
{
|
||||
"name": "WDPAID",
|
||||
"type": "esriFieldTypeInteger",
|
||||
"alias": "WDPAID"
|
||||
},
|
||||
{
|
||||
"name": "NAME",
|
||||
"type": "esriFieldTypeString",
|
||||
"alias": "NAME",
|
||||
"length": 254
|
||||
}
|
||||
],
|
||||
"features": [
|
||||
{
|
||||
"attributes": {
|
||||
"OBJECTID": 1,
|
||||
"WDPAID": 991,
|
||||
"NAME": "Name of object 1"
|
||||
},
|
||||
"geometry": {
|
||||
"fake": "geom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"attributes": {
|
||||
"OBJECTID": 2,
|
||||
"WDPAID": 992,
|
||||
"NAME": "Name of object 2"
|
||||
},
|
||||
"geometry": {
|
||||
"fake": "geom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"attributes": {
|
||||
"OBJECTID": 3,
|
||||
"WDPAID": 993,
|
||||
"NAME": "Name of object 3"
|
||||
},
|
||||
"geometry": {
|
||||
"fake": "geom"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{"objectIdFieldName":"OBJECTID","objectIds":[1,2,3,4,5,6,7,8,9,10]}
|
||||
@@ -0,0 +1 @@
|
||||
{"objectIdFieldName":"OBJECTID","objectIds":[1,2,3]}
|
||||
@@ -0,0 +1,3 @@
|
||||
{"layers":[
|
||||
{"id":0, "name":"first layer", "type":"Feature Layer"}
|
||||
]}
|
||||
@@ -0,0 +1,22 @@
|
||||
{"currentVersion":10.22,
|
||||
"id":0,
|
||||
"name":"Test Feature",
|
||||
"type":"Feature Layer",
|
||||
"description":"Sample metadata payload",
|
||||
"geometryType":"esriGeometryPolygon",
|
||||
"copyrightText":"CartoDB",
|
||||
"fields":[
|
||||
{"name":"OBJECTID",
|
||||
"type":"esriFieldTypeOID",
|
||||
"alias":"OBJECTID",
|
||||
"domain":null},
|
||||
{"name":"NAME",
|
||||
"type":"esriFieldTypeString",
|
||||
"alias":"NAME",
|
||||
"length":254,
|
||||
"domain":null}
|
||||
],
|
||||
"maxRecordCount":1000,
|
||||
"supportsAdvancedQueries":true,
|
||||
"supportedQueryFormats":"JSON,AMF",
|
||||
"useStandardizedQueries":true}
|
||||
@@ -0,0 +1 @@
|
||||
{"objectIdFieldName":"OBJECTID","objectIds":[7,6,10,4,5,2,1,8,9,3]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
||||
"link","body","objectType","postedTime","favoritesCount","twitter_lang","retweetCount","actor_id","actor_displayName","actor_image","actor_summary","actor_postedTime","actor_location","actor_utcOffset","actor_preferredUsername","actor_friendsCount","actor_followersCount","actor_listedCount","actor_statusesCount","actor_verified","inReplyTo_link","geo","twitter_entities","location_geo","location_name","the_geom","category_name","category_terms"
|
||||
"http://twitter.com/charley_glynn/statuses/834008296361172992","RT @uSIG_CCHS_CSIC: Carto tips: Using blend modes and opacity levels-https://t.co/eGDWGkfWCv via @OrdnanceSurvey https://t.co/qEfFQpLGvL","activity","2017-02-21T11:54:07.000Z","0","en","6","id:twitter.com:492926788","Charley Glynn","https://pbs.twimg.com/profile_images/740123846951460864/gi1ee2lJ_normal.jpg","happy husband, doting dad, Everton fan, music, film & design fan, pushing pixels and joining dots @ordnancesurvey working on #GeoDataViz","2012-02-15T08:23:02.000Z","{""objectType"":""place"",""displayName"":""Southampton, England""}","0","charley_glynn","2482","1415","168","7536","false",,,"{""hashtags"":[],""urls"":[{""url"":""https://t.co/eGDWGkfWCv"",""expanded_url"":""https://www.ordnancesurvey.co.uk/blog/2017/02/carto-tips-using-blend-modes-opacity-levels/"",""display_url"":""ordnancesurvey.co.uk/blog/2017/02/c…"",""indices"":[69,92]}],""user_mentions"":[{""screen_name"":""uSIG_CCHS_CSIC"",""name"":""uSIG (CCHS-CSIC)"",""id"":704613732614344704,""id_str"":""704613732614344704"",""indices"":[3,18]},{""screen_name"":""OrdnanceSurvey"",""name"":""Ordnance Survey"",""id"":22614266,""id_str"":""22614266"",""indices"":[97,112]}],""symbols"":[],""media"":[{""id"":833943995302760449,""id_str"":""833943995302760449"",""indices"":[113,136],""media_url"":""http://pbs.twimg.com/tweet_video_thumb/C5LDpTKXUAE1xex.jpg"",""media_url_https"":""https://pbs.twimg.com/tweet_video_thumb/C5LDpTKXUAE1xex.jpg"",""url"":""https://t.co/qEfFQpLGvL"",""display_url"":""pic.twitter.com/qEfFQpLGvL"",""expanded_url"":""https://twitter.com/uSIG_CCHS_CSIC/status/833972033960620032/photo/1"",""type"":""photo"",""sizes"":{""medium"":{""w"":600,""h"":415,""resize"":""fit""},""large"":{""w"":650,""h"":450,""resize"":""fit""},""thumb"":{""w"":150,""h"":150,""resize"":""crop""},""small"":{""w"":340,""h"":235,""resize"":""fit""}},""source_status_id"":833972033960620032,""source_status_id_str"":""833972033960620032"",""source_user_id"":704613732614344704,""source_user_id_str"":""704613732614344704""}]}",,,"{""coordinates"":[-1.40428,50.90395],""type"":""point""}","1","carto"
|
||||
|
@@ -0,0 +1,409 @@
|
||||
{
|
||||
"results": [
|
||||
{
|
||||
"id": "tag:search.twitter.com,2005:834008296361172992",
|
||||
"objectType": "activity",
|
||||
"verb": "share",
|
||||
"postedTime": "2017-02-21T11:54:07.000Z",
|
||||
"generator": {
|
||||
"displayName": "Twitter Web Client",
|
||||
"link": "http://twitter.com"
|
||||
},
|
||||
"provider": {
|
||||
"objectType": "service",
|
||||
"displayName": "Twitter",
|
||||
"link": "http://www.twitter.com"
|
||||
},
|
||||
"link": "http://twitter.com/charley_glynn/statuses/834008296361172992",
|
||||
"body": "RT @uSIG_CCHS_CSIC: Carto tips: Using blend modes and opacity levels-https://t.co/eGDWGkfWCv via @OrdnanceSurvey https://t.co/qEfFQpLGvL",
|
||||
"actor": {
|
||||
"objectType": "person",
|
||||
"id": "id:twitter.com:492926788",
|
||||
"link": "http://www.twitter.com/charley_glynn",
|
||||
"displayName": "Charley Glynn",
|
||||
"postedTime": "2012-02-15T08:23:02.000Z",
|
||||
"image": "https://pbs.twimg.com/profile_images/740123846951460864/gi1ee2lJ_normal.jpg",
|
||||
"summary": "happy husband, doting dad, Everton fan, music, film & design fan, pushing pixels and joining dots @ordnancesurvey working on #GeoDataViz",
|
||||
"friendsCount": 2482,
|
||||
"followersCount": 1415,
|
||||
"listedCount": 168,
|
||||
"statusesCount": 7536,
|
||||
"twitterTimeZone": "London",
|
||||
"verified": false,
|
||||
"utcOffset": "0",
|
||||
"preferredUsername": "charley_glynn",
|
||||
"languages": [
|
||||
"en"
|
||||
],
|
||||
"links": [
|
||||
{
|
||||
"href": "http://www.cartoblography.wordpress.com",
|
||||
"rel": "me"
|
||||
}
|
||||
],
|
||||
"location": {
|
||||
"objectType": "place",
|
||||
"displayName": "Southampton, England"
|
||||
},
|
||||
"favoritesCount": 7414
|
||||
},
|
||||
"object": {
|
||||
"id": "tag:search.twitter.com,2005:833972033960620032",
|
||||
"objectType": "activity",
|
||||
"verb": "post",
|
||||
"postedTime": "2017-02-21T09:30:02.000Z",
|
||||
"generator": {
|
||||
"displayName": "TweetDeck",
|
||||
"link": "https://about.twitter.com/products/tweetdeck"
|
||||
},
|
||||
"provider": {
|
||||
"objectType": "service",
|
||||
"displayName": "Twitter",
|
||||
"link": "http://www.twitter.com"
|
||||
},
|
||||
"link": "http://twitter.com/uSIG_CCHS_CSIC/statuses/833972033960620032",
|
||||
"body": "Carto tips: Using blend modes and opacity levels-https://t.co/eGDWGkfWCv via @OrdnanceSurvey https://t.co/qEfFQpLGvL",
|
||||
"display_text_range": [
|
||||
0,
|
||||
92
|
||||
],
|
||||
"actor": {
|
||||
"objectType": "person",
|
||||
"id": "id:twitter.com:704613732614344704",
|
||||
"link": "http://www.twitter.com/uSIG_CCHS_CSIC",
|
||||
"displayName": "uSIG (CCHS-CSIC)",
|
||||
"postedTime": "2016-03-01T10:26:19.759Z",
|
||||
"image": "https://pbs.twimg.com/profile_images/802141753553854464/4ZSz4PI-_normal.jpg",
|
||||
"summary": "Unidad SIG. Espacio, tiempo, ciencia y tecnología #SIG #Cartografía y #Teledetección en Ciencias Humanas y Sociales @CSIC. #GIS #Cartography #RemoteSensing",
|
||||
"friendsCount": 317,
|
||||
"followersCount": 515,
|
||||
"listedCount": 41,
|
||||
"statusesCount": 1462,
|
||||
"twitterTimeZone": null,
|
||||
"verified": false,
|
||||
"utcOffset": null,
|
||||
"preferredUsername": "uSIG_CCHS_CSIC",
|
||||
"languages": [
|
||||
"es"
|
||||
],
|
||||
"links": [
|
||||
{
|
||||
"href": "http://unidadsig.cchs.csic.es/sig/",
|
||||
"rel": "me"
|
||||
}
|
||||
],
|
||||
"location": {
|
||||
"objectType": "place",
|
||||
"displayName": "Madrid, España"
|
||||
},
|
||||
"favoritesCount": 811
|
||||
},
|
||||
"object": {
|
||||
"objectType": "note",
|
||||
"id": "object:search.twitter.com,2005:833972033960620032",
|
||||
"summary": "Carto tips: Using blend modes and opacity levels-https://t.co/eGDWGkfWCv via @OrdnanceSurvey https://t.co/qEfFQpLGvL",
|
||||
"link": "http://twitter.com/uSIG_CCHS_CSIC/statuses/833972033960620032",
|
||||
"postedTime": "2017-02-21T09:30:02.000Z"
|
||||
},
|
||||
"favoritesCount": 11,
|
||||
"twitter_entities": {
|
||||
"hashtags": [],
|
||||
"urls": [
|
||||
{
|
||||
"url": "https://t.co/eGDWGkfWCv",
|
||||
"expanded_url": "https://www.ordnancesurvey.co.uk/blog/2017/02/carto-tips-using-blend-modes-opacity-levels/",
|
||||
"display_url": "ordnancesurvey.co.uk/blog/2017/02/c…",
|
||||
"indices": [
|
||||
49,
|
||||
72
|
||||
]
|
||||
}
|
||||
],
|
||||
"user_mentions": [
|
||||
{
|
||||
"screen_name": "OrdnanceSurvey",
|
||||
"name": "Ordnance Survey",
|
||||
"id": 22614266,
|
||||
"id_str": "22614266",
|
||||
"indices": [
|
||||
77,
|
||||
92
|
||||
]
|
||||
}
|
||||
],
|
||||
"symbols": [],
|
||||
"media": [
|
||||
{
|
||||
"id": 833943995302760449,
|
||||
"id_str": "833943995302760449",
|
||||
"indices": [
|
||||
93,
|
||||
116
|
||||
],
|
||||
"media_url": "http://pbs.twimg.com/tweet_video_thumb/C5LDpTKXUAE1xex.jpg",
|
||||
"media_url_https": "https://pbs.twimg.com/tweet_video_thumb/C5LDpTKXUAE1xex.jpg",
|
||||
"url": "https://t.co/qEfFQpLGvL",
|
||||
"display_url": "pic.twitter.com/qEfFQpLGvL",
|
||||
"expanded_url": "https://twitter.com/uSIG_CCHS_CSIC/status/833972033960620032/photo/1",
|
||||
"type": "photo",
|
||||
"sizes": {
|
||||
"medium": {
|
||||
"w": 600,
|
||||
"h": 415,
|
||||
"resize": "fit"
|
||||
},
|
||||
"large": {
|
||||
"w": 650,
|
||||
"h": 450,
|
||||
"resize": "fit"
|
||||
},
|
||||
"thumb": {
|
||||
"w": 150,
|
||||
"h": 150,
|
||||
"resize": "crop"
|
||||
},
|
||||
"small": {
|
||||
"w": 340,
|
||||
"h": 235,
|
||||
"resize": "fit"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"twitter_extended_entities": {
|
||||
"media": [
|
||||
{
|
||||
"id": 833943995302760449,
|
||||
"id_str": "833943995302760449",
|
||||
"indices": [
|
||||
93,
|
||||
116
|
||||
],
|
||||
"media_url": "http://pbs.twimg.com/tweet_video_thumb/C5LDpTKXUAE1xex.jpg",
|
||||
"media_url_https": "https://pbs.twimg.com/tweet_video_thumb/C5LDpTKXUAE1xex.jpg",
|
||||
"url": "https://t.co/qEfFQpLGvL",
|
||||
"display_url": "pic.twitter.com/qEfFQpLGvL",
|
||||
"expanded_url": "https://twitter.com/uSIG_CCHS_CSIC/status/833972033960620032/photo/1",
|
||||
"type": "animated_gif",
|
||||
"sizes": {
|
||||
"medium": {
|
||||
"w": 600,
|
||||
"h": 415,
|
||||
"resize": "fit"
|
||||
},
|
||||
"large": {
|
||||
"w": 650,
|
||||
"h": 450,
|
||||
"resize": "fit"
|
||||
},
|
||||
"thumb": {
|
||||
"w": 150,
|
||||
"h": 150,
|
||||
"resize": "crop"
|
||||
},
|
||||
"small": {
|
||||
"w": 340,
|
||||
"h": 235,
|
||||
"resize": "fit"
|
||||
}
|
||||
},
|
||||
"video_info": {
|
||||
"aspect_ratio": [
|
||||
13,
|
||||
9
|
||||
],
|
||||
"variants": [
|
||||
{
|
||||
"bitrate": 0,
|
||||
"content_type": "video/mp4",
|
||||
"url": "https://video.twimg.com/tweet_video/C5LDpTKXUAE1xex.mp4"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"twitter_lang": "en",
|
||||
"twitter_filter_level": "low"
|
||||
},
|
||||
"favoritesCount": 0,
|
||||
"twitter_entities": {
|
||||
"hashtags": [],
|
||||
"urls": [
|
||||
{
|
||||
"url": "https://t.co/eGDWGkfWCv",
|
||||
"expanded_url": "https://www.ordnancesurvey.co.uk/blog/2017/02/carto-tips-using-blend-modes-opacity-levels/",
|
||||
"display_url": "ordnancesurvey.co.uk/blog/2017/02/c…",
|
||||
"indices": [
|
||||
69,
|
||||
92
|
||||
]
|
||||
}
|
||||
],
|
||||
"user_mentions": [
|
||||
{
|
||||
"screen_name": "uSIG_CCHS_CSIC",
|
||||
"name": "uSIG (CCHS-CSIC)",
|
||||
"id": 704613732614344704,
|
||||
"id_str": "704613732614344704",
|
||||
"indices": [
|
||||
3,
|
||||
18
|
||||
]
|
||||
},
|
||||
{
|
||||
"screen_name": "OrdnanceSurvey",
|
||||
"name": "Ordnance Survey",
|
||||
"id": 22614266,
|
||||
"id_str": "22614266",
|
||||
"indices": [
|
||||
97,
|
||||
112
|
||||
]
|
||||
}
|
||||
],
|
||||
"symbols": [],
|
||||
"media": [
|
||||
{
|
||||
"id": 833943995302760449,
|
||||
"id_str": "833943995302760449",
|
||||
"indices": [
|
||||
113,
|
||||
136
|
||||
],
|
||||
"media_url": "http://pbs.twimg.com/tweet_video_thumb/C5LDpTKXUAE1xex.jpg",
|
||||
"media_url_https": "https://pbs.twimg.com/tweet_video_thumb/C5LDpTKXUAE1xex.jpg",
|
||||
"url": "https://t.co/qEfFQpLGvL",
|
||||
"display_url": "pic.twitter.com/qEfFQpLGvL",
|
||||
"expanded_url": "https://twitter.com/uSIG_CCHS_CSIC/status/833972033960620032/photo/1",
|
||||
"type": "photo",
|
||||
"sizes": {
|
||||
"medium": {
|
||||
"w": 600,
|
||||
"h": 415,
|
||||
"resize": "fit"
|
||||
},
|
||||
"large": {
|
||||
"w": 650,
|
||||
"h": 450,
|
||||
"resize": "fit"
|
||||
},
|
||||
"thumb": {
|
||||
"w": 150,
|
||||
"h": 150,
|
||||
"resize": "crop"
|
||||
},
|
||||
"small": {
|
||||
"w": 340,
|
||||
"h": 235,
|
||||
"resize": "fit"
|
||||
}
|
||||
},
|
||||
"source_status_id": 833972033960620032,
|
||||
"source_status_id_str": "833972033960620032",
|
||||
"source_user_id": 704613732614344704,
|
||||
"source_user_id_str": "704613732614344704"
|
||||
}
|
||||
]
|
||||
},
|
||||
"twitter_extended_entities": {
|
||||
"media": [
|
||||
{
|
||||
"id": 833943995302760449,
|
||||
"id_str": "833943995302760449",
|
||||
"indices": [
|
||||
113,
|
||||
136
|
||||
],
|
||||
"media_url": "http://pbs.twimg.com/tweet_video_thumb/C5LDpTKXUAE1xex.jpg",
|
||||
"media_url_https": "https://pbs.twimg.com/tweet_video_thumb/C5LDpTKXUAE1xex.jpg",
|
||||
"url": "https://t.co/qEfFQpLGvL",
|
||||
"display_url": "pic.twitter.com/qEfFQpLGvL",
|
||||
"expanded_url": "https://twitter.com/uSIG_CCHS_CSIC/status/833972033960620032/photo/1",
|
||||
"type": "animated_gif",
|
||||
"sizes": {
|
||||
"medium": {
|
||||
"w": 600,
|
||||
"h": 415,
|
||||
"resize": "fit"
|
||||
},
|
||||
"large": {
|
||||
"w": 650,
|
||||
"h": 450,
|
||||
"resize": "fit"
|
||||
},
|
||||
"thumb": {
|
||||
"w": 150,
|
||||
"h": 150,
|
||||
"resize": "crop"
|
||||
},
|
||||
"small": {
|
||||
"w": 340,
|
||||
"h": 235,
|
||||
"resize": "fit"
|
||||
}
|
||||
},
|
||||
"source_status_id": 833972033960620032,
|
||||
"source_status_id_str": "833972033960620032",
|
||||
"source_user_id": 704613732614344704,
|
||||
"source_user_id_str": "704613732614344704",
|
||||
"video_info": {
|
||||
"aspect_ratio": [
|
||||
13,
|
||||
9
|
||||
],
|
||||
"variants": [
|
||||
{
|
||||
"bitrate": 0,
|
||||
"content_type": "video/mp4",
|
||||
"url": "https://video.twimg.com/tweet_video/C5LDpTKXUAE1xex.mp4"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"twitter_lang": "en",
|
||||
"retweetCount": 6,
|
||||
"gnip": {
|
||||
"profileLocations": [
|
||||
{
|
||||
"address": {
|
||||
"country": "United Kingdom",
|
||||
"countryCode": "GB",
|
||||
"locality": "Southampton",
|
||||
"region": "England",
|
||||
"subRegion": "City of Southampton"
|
||||
},
|
||||
"displayName": "Southampton, England, United Kingdom",
|
||||
"geo": {
|
||||
"coordinates": [
|
||||
-1.40428,
|
||||
50.90395
|
||||
],
|
||||
"type": "point"
|
||||
},
|
||||
"objectType": "place"
|
||||
}
|
||||
],
|
||||
"matching_rules": [
|
||||
{
|
||||
"value": "(carto) (has:geo OR has:profile_geo)",
|
||||
"tag": null
|
||||
}
|
||||
],
|
||||
"urls": [
|
||||
{
|
||||
"url": "https://t.co/eGDWGkfWCv",
|
||||
"expanded_url": "https://www.ordnancesurvey.co.uk/blog/2017/02/carto-tips-using-blend-modes-opacity-levels/",
|
||||
"expanded_status": 200,
|
||||
"expanded_url_title": "Carto tips: Using blend modes and opacity levels - Ordnance Survey Blog",
|
||||
"expanded_url_description": "Colour is one of the main graphic elements that a cartographer uses to make their map clear to read. Amongst other things we use colour to create familiarity, to differentiate features and to create a clear visual hierarchy. There are many things we can do to the features on our maps to change their appearance... Read More"
|
||||
}
|
||||
]
|
||||
},
|
||||
"twitter_filter_level": "low"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
stream_input_1
|
||||
@@ -0,0 +1 @@
|
||||
stream_input_2
|
||||
@@ -0,0 +1,40 @@
|
||||
"id","verb","link","body","objectType","postedTime","favoritesCount","twitter_filter_level","twitter_lang","retweetCount","actor_objectType","actor_id","actor_link","actor_displayName","actor_image","actor_summary","actor_postedTime","actor_links","actor_location","actor_utcOffset","actor_preferredUsername","actor_languages","actor_twitterTimeZone","actor_friendsCount","actor_followersCount","actor_listedCount","actor_statusesCount","actor_verified","generator_displayName","generator_link","provider_objectType","provider_displayName","provider_link","inReplyTo_link","geo","twitter_entities","object_objectType","object_id","object_summary","object_postedTime","object_link","location_objectType","location_displayName","location_link","location_geo","location_streetAddress","location_name","gnip","the_geom","category_name","category_terms"
|
||||
"tag:search.twitter.com,2005:496274441584668672","post","http://twitter.com/erictheise/statuses/496274441584668672","sad to be the guy that knocked ""locahost"" out of @cartoDB's docs for #Odyssey.js; i've certainly had that sentiment towards my dev machine.","activity","2014-08-04T12:40:21.000Z","0","medium","en","0","person","id:twitter.com:94817737","http://www.twitter.com/erictheise","Eric Theise","https://pbs.twimg.com/profile_images/1994194116/Theise_normal.jpg","Software engineer; photographer, experimental filmmaker, cartographer, geographer, vocalizer, yoga student, reader & writer, eater & drinker.","2009-12-05T16:06:12.000Z","[{""href"":null,""rel"":""me""}]","{""objectType"":""place"",""displayName"":""San Francisco""}","-25200","erictheise","[""en""]","Pacific Time (US & Canada)","698","306","25","1322","false","Twitter Web Client","http://twitter.com","service","Twitter","http://www.twitter.com",,,"{""hashtags"":[{""text"":""Odyssey"",""indices"":[69,77]}],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[49,57]}],""symbols"":[]}","note","object:search.twitter.com,2005:496274441584668672","sad to be the guy that knocked ""locahost"" out of @cartoDB's docs for #Odyssey.js; i've certainly had that sentiment towards my dev machine.","2014-08-04T12:40:21.000Z","http://twitter.com/erictheise/statuses/496274441584668672","place","San Francisco, CA","https://api.twitter.com/1.1/geo/id/5a110d312052166f.json","{""type"":""Polygon"",""coordinates"":[[[-122.514926,37.708075],[-122.514926,37.833238],[-122.328001,37.833238],[-122.328001,37.708075]]]}",,"San Francisco","{""klout_score"":41,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-122.514926,37.708075],[-122.514926,37.833238],[-122.328001,37.833238],[-122.328001,37.708075]]]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:495565956908064769","post","http://twitter.com/Jmholleran/statuses/495565956908064769","FrackMap #map http://t.co/BLWl3zYKTn","activity","2014-08-02T13:45:05.000Z","0","medium","en","0","person","id:twitter.com:27128139","http://www.twitter.com/Jmholleran","John Munro Holleran","https://pbs.twimg.com/profile_images/460662090819051520/lzLtBzUb_normal.png","Modest! intelligent, articulate & generally just amazing! Trade Unionist, learning facilitator 'n that","2009-03-27T23:36:39.000Z","[{""href"":null,""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Glasgow/Scotland""}",,"Jmholleran","[""en""]",,"411","192","1","1643","false","Twitter for Android","http://twitter.com/download/android","service","Twitter","http://www.twitter.com",,"{""type"":""Point"",""coordinates"":[55.8641,-4.282299]}","{""hashtags"":[{""text"":""map"",""indices"":[9,13]}],""trends"":[],""urls"":[{""url"":""http://t.co/BLWl3zYKTn"",""expanded_url"":""http://energydesk.cartodb.com/viz/18162194-ecbd-11e3-aba1-0e230854a1cb/embed_map?title=true&description=true&search=false&shareable=true&cartodb_logo=true&layer_selector=false&legends=true&scrollwheel=true&fullscreen=true&sublayer_options=1%7C1%7C1%7C1&sql=&sw_lat=49.97948776108648&sw_lon=-12.7001953125&ne_lat=56.80087831233043&ne_lon=8.96484375"",""display_url"":""energydesk.cartodb.com/viz/18162194-e…"",""indices"":[14,36]}],""user_mentions"":[],""symbols"":[]}","note","object:search.twitter.com,2005:495565956908064769","FrackMap #map http://t.co/BLWl3zYKTn","2014-08-02T13:45:05.000Z","http://twitter.com/Jmholleran/statuses/495565956908064769","place","Glasgow","https://api.twitter.com/1.1/geo/id/791e00bcadc4615f.json","{""type"":""Polygon"",""coordinates"":[[[-4.3932845,55.796184],[-4.3932845,55.9204214],[-4.0902182,55.9204214],[-4.0902182,55.796184]]]}",,"Glasgow","{""urls"":[{""url"":""http://t.co/BLWl3zYKTn"",""expanded_url"":""http://energydesk.cartodb.com/viz/18162194-ecbd-11e3-aba1-0e230854a1cb/embed_map?title=true&description=true&search=false&shareable=true&cartodb_logo=true&layer_selector=false&legends=true&scrollwheel=true&fullscreen=true&sublayer_options=1%7C1%7C1%7C1&sql&sw_lat=49.97948776108648&sw_lon=-12.7001953125&ne_lat=56.80087831233043&ne_lon=8.96484375"",""expanded_status"":200}],""klout_score"":23}","{""type"":""Point"",""coordinates"":[-4.282299,55.8641]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:494521462682685440","post","http://twitter.com/SonOfJorEl/statuses/494521462682685440","@iriberri1 @cartoDB you are saying it is not supported, but you have an entire blog post about said feature : http://t.co/gvuUWv9sge","activity","2014-07-30T16:34:39.000Z","0","medium","en","0","person","id:twitter.com:15628310","http://www.twitter.com/SonOfJorEl","Joey Schluchter","https://pbs.twimg.com/profile_images/466697750013562880/ngwKpO1j_normal.jpeg","Recovering golfer. Helping feed the world to software. Still love persimmon.","2008-07-28T05:34:03.000Z","[{""href"":""http://www.exzeo.com"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Clearwater, FL""}","-14400","SonOfJorEl","[""en""]","Eastern Time (US & Canada)","368","2053","5","2143","false","Tweetbot for Mac","http://tapbots.com/software/tweetbot/mac","service","Twitter","http://www.twitter.com","http://twitter.com/iriberri1/statuses/494488277765091328",,"{""hashtags"":[],""symbols"":[],""urls"":[{""url"":""http://t.co/gvuUWv9sge"",""expanded_url"":""http://blog.cartodb.com/got-files-weve-got-a-import-api/"",""display_url"":""blog.cartodb.com/got-files-weve…"",""indices"":[110,132]}],""user_mentions"":[{""screen_name"":""iriberri1"",""name"":""Carla"",""id"":102197411,""id_str"":""102197411"",""indices"":[0,10]},{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[11,19]}]}","note","object:search.twitter.com,2005:494521462682685440","@iriberri1 @cartoDB you are saying it is not supported, but you have an entire blog post about said feature : http://t.co/gvuUWv9sge","2014-07-30T16:34:39.000Z","http://twitter.com/SonOfJorEl/statuses/494521462682685440","place","Tampa, FL","https://api.twitter.com/1.1/geo/id/dc62519fda13b4ec.json","{""type"":""Polygon"",""coordinates"":[[[-82.648358,27.821353],[-82.648358,28.171245],[-82.289105,28.171245],[-82.289105,27.821353]]]}",,"Tampa","{""urls"":[{""url"":""http://t.co/gvuUWv9sge"",""expanded_url"":""http://blog.cartodb.com/got-files-weve-got-a-import-api/"",""expanded_status"":200}],""klout_score"":42,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-82.648358,27.821353],[-82.648358,28.171245],[-82.289105,28.171245],[-82.289105,27.821353]]]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:494511938563342336","post","http://twitter.com/xavijam/statuses/494511938563342336",". @Javier is giving birth last @cartodb feature. All I can say is … GIF over maps! http://t.co/oC3DEK5cP6","activity","2014-07-30T15:56:48.000Z","0","medium","en","0","person","id:twitter.com:26775253","http://www.twitter.com/xavijam","Javier Álvarez","https://pbs.twimg.com/profile_images/3025038956/a2919d353eb2b1a22756d7ac79847480_normal.jpeg","I love gentoo penguins","2009-03-26T15:36:52.000Z","[{""href"":""http://xavij.am"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Antarctic Peninsula""}","7200","xavijam","[""en""]","Madrid","250","395","26","4981","false","Tweetbot for iΟS","http://tapbots.com/tweetbot","service","Twitter","http://www.twitter.com",,,"{""hashtags"":[],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""javier"",""name"":""Javier Arce"",""id"":39083,""id_str"":""39083"",""indices"":[2,9]},{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[31,39]}],""symbols"":[],""media"":[{""id"":494511934629093378,""id_str"":""494511934629093378"",""indices"":[83,105],""media_url"":""http://pbs.twimg.com/media/Btzb_AjCIAI0cLr.jpg"",""media_url_https"":""https://pbs.twimg.com/media/Btzb_AjCIAI0cLr.jpg"",""url"":""http://t.co/oC3DEK5cP6"",""display_url"":""pic.twitter.com/oC3DEK5cP6"",""expanded_url"":""http://twitter.com/xavijam/status/494511938563342336/photo/1"",""type"":""photo"",""sizes"":{""small"":{""w"":340,""h"":255,""resize"":""fit""},""medium"":{""w"":600,""h"":450,""resize"":""fit""},""large"":{""w"":1024,""h"":768,""resize"":""fit""},""thumb"":{""w"":150,""h"":150,""resize"":""crop""}}}]}","note","object:search.twitter.com,2005:494511938563342336",". @Javier is giving birth last @cartodb feature. All I can say is … GIF over maps! http://t.co/oC3DEK5cP6","2014-07-30T15:56:48.000Z","http://twitter.com/xavijam/statuses/494511938563342336","place","Trafalgar","https://api.twitter.com/1.1/geo/id/0144b1172069289c.json","{""type"":""Polygon"",""coordinates"":[[[-3.70582,40.4275708],[-3.70582,40.4386747],[-3.6956326,40.4386747],[-3.6956326,40.4275708]]]}",,"Trafalgar","{""urls"":[{""url"":""http://t.co/oC3DEK5cP6"",""expanded_url"":""http://twitter.com/xavijam/status/494511938563342336/photo/1"",""expanded_status"":200}],""klout_score"":39,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-3.70582,40.4275708],[-3.70582,40.4386747],[-3.6956326,40.4386747],[-3.6956326,40.4275708]]]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:494485754848894978","post","http://twitter.com/SonOfJorEl/statuses/494485754848894978","@cartoDB I’ve emailed support (which you claim has a 24hr turnaround) with minimal response. I am a paying customer ($149 mo). For how long?","activity","2014-07-30T14:12:45.000Z","0","medium","en","0","person","id:twitter.com:15628310","http://www.twitter.com/SonOfJorEl","Joey Schluchter","https://pbs.twimg.com/profile_images/466697750013562880/ngwKpO1j_normal.jpeg","Recovering golfer. Helping feed the world to software. Still love persimmon.","2008-07-28T05:34:03.000Z","[{""href"":""http://www.exzeo.com"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Clearwater, FL""}","-14400","SonOfJorEl","[""en""]","Eastern Time (US & Canada)","368","2053","5","2142","false","Tweetbot for Mac","http://tapbots.com/software/tweetbot/mac","service","Twitter","http://www.twitter.com",,,"{""hashtags"":[],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[0,8]}],""symbols"":[]}","note","object:search.twitter.com,2005:494485754848894978","@cartoDB I’ve emailed support (which you claim has a 24hr turnaround) with minimal response. I am a paying customer ($149 mo). For how long?","2014-07-30T14:12:45.000Z","http://twitter.com/SonOfJorEl/statuses/494485754848894978","place","Tampa, FL","https://api.twitter.com/1.1/geo/id/dc62519fda13b4ec.json","{""type"":""Polygon"",""coordinates"":[[[-82.648358,27.821353],[-82.648358,28.171245],[-82.289105,28.171245],[-82.289105,27.821353]]]}",,"Tampa","{""klout_score"":42,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-82.648358,27.821353],[-82.648358,28.171245],[-82.289105,28.171245],[-82.289105,27.821353]]]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:494276921765543936","post","http://twitter.com/httsan/statuses/494276921765543936","""@gisuser: Online Mapping for Beginners – The Map Academy from CartoDB: TweetSomething innovative from… http://t.co/Zhh882TV2F""","activity","2014-07-30T00:22:56.000Z","0","medium","en","0","person","id:twitter.com:28471178","http://www.twitter.com/httsan","hartanto","https://pbs.twimg.com/profile_images/2217327231/IMG0033_normal.jpg","Lahir di Indonesia | Nguli di @NEOnetBPPT @BPPTeknologi | Ngobrol di @RSGISForum @PadangZaitun | Nyantri di @MichiganStateU","2009-04-03T01:32:35.000Z","[{""href"":""http://about.me/httsan"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""East Lansing""}","-14400","httsan","[""en""]","Eastern Time (US & Canada)","976","873","12","25725","false","Twitter for Android","http://twitter.com/download/android","service","Twitter","http://www.twitter.com",,"{""type"":""Point"",""coordinates"":[42.7539688,-84.4221123]}","{""hashtags"":[],""symbols"":[],""urls"":[{""url"":""http://t.co/Zhh882TV2F"",""expanded_url"":""http://goo.gl/fb/xVB5rr"",""display_url"":""goo.gl/fb/xVB5rr"",""indices"":[104,126]}],""user_mentions"":[{""screen_name"":""gisuser"",""name"":""GISuser GeoTech News"",""id"":16958615,""id_str"":""16958615"",""indices"":[1,9]}]}","note","object:search.twitter.com,2005:494276921765543936","""@gisuser: Online Mapping for Beginners – The Map Academy from CartoDB: TweetSomething innovative from… http://t.co/Zhh882TV2F""","2014-07-30T00:22:56.000Z","http://twitter.com/httsan/statuses/494276921765543936","place","Haslett, MI","https://api.twitter.com/1.1/geo/id/4399b5004a3b4d9a.json","{""type"":""Polygon"",""coordinates"":[[[-84.447506,42.731229],[-84.447506,42.769688],[-84.363432,42.769688],[-84.363432,42.731229]]]}",,"Haslett","{""urls"":[{""url"":""http://t.co/Zhh882TV2F"",""expanded_url"":""http://blog.gisuser.com/2014/07/29/online-mapping-for-beginners-the-map-academy-from-cartodb/?utm_source=feedburner&utm_medium=twitter&utm_campaign=Feed:%20gisuser%20(GISUser.com%20-%20GIS,%20Mapping,%20Geospatial,%20and%20location%20technology%20news)"",""expanded_status"":200}],""klout_score"":51,""language"":{""value"":""en""}}","{""type"":""Point"",""coordinates"":[-84.4221123,42.7539688]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:494274906528288769","post","http://twitter.com/carygeo/statuses/494274906528288769","Attention mappers: iframe, #javascript, app development examples from the #CartoDB API/team! Well done @andrewxhill. http://t.co/cJM5fzgoyL","activity","2014-07-30T00:14:55.000Z","0","medium","en","0","person","id:twitter.com:2641688154","http://www.twitter.com/carygeo","Cary Greenwood","https://pbs.twimg.com/profile_images/488501325697544192/gFMxHuLV_normal.jpeg","geography, maps, data visualization, ui/ux design","2014-07-14T01:35:22.000Z","[{""href"":null,""rel"":""me""}]",,,"carygeo","[""en""]",,"109","46","0","47","false","Twitter for iPhone","http://twitter.com/download/iphone","service","Twitter","http://www.twitter.com",,"{""type"":""Point"",""coordinates"":[34.13846767,-118.3620715]}","{""hashtags"":[{""text"":""javascript"",""indices"":[27,38]},{""text"":""CartoDB"",""indices"":[74,82]}],""symbols"":[],""urls"":[{""url"":""http://t.co/cJM5fzgoyL"",""expanded_url"":""http://vimeo.com/m/101936210"",""display_url"":""vimeo.com/m/101936210"",""indices"":[117,139]}],""user_mentions"":[{""screen_name"":""andrewxhill"",""name"":""Andrew W Hill"",""id"":19893224,""id_str"":""19893224"",""indices"":[103,115]}]}","note","object:search.twitter.com,2005:494274906528288769","Attention mappers: iframe, #javascript, app development examples from the #CartoDB API/team! Well done @andrewxhill. http://t.co/cJM5fzgoyL","2014-07-30T00:14:55.000Z","http://twitter.com/carygeo/statuses/494274906528288769","place","Los Angeles, CA","https://api.twitter.com/1.1/geo/id/3b77caf94bfc81fe.json","{""type"":""Polygon"",""coordinates"":[[[-118.668404,33.704538],[-118.668404,34.330724],[-118.155409,34.330724],[-118.155409,33.704538]]]}",,"Los Angeles","{""urls"":[{""url"":""http://t.co/cJM5fzgoyL"",""expanded_url"":""http://vimeo.com/101936210"",""expanded_status"":200}],""klout_score"":31,""language"":{""value"":""en""}}","{""type"":""Point"",""coordinates"":[-118.3620715,34.13846767]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:494194150133481472","post","http://twitter.com/juanjeojeda/statuses/494194150133481472","@dig_geo_com Your welcome :-) Keep in mind that some parts of @cartoDB still doesn't work fine. We're waiting for update from our provider.","activity","2014-07-29T18:54:01.000Z","0","medium","en","0","person","id:twitter.com:12679112","http://www.twitter.com/juanjeojeda","Juanje Ojeda ","https://pbs.twimg.com/profile_images/46025702/juanje_normal.jpg","Canarian guy who likes the open knowledge, the freedom and learn things every day. #OpenSource #DevOps #PaaS #Canarias","2008-01-25T11:49:15.000Z","[{""href"":""http://about.me/juanje"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Las Palmas de Gran Canaria""}","3600","juanjeojeda","[""es""]","London","416","1006","86","17700","false","Twitter Web Client","http://twitter.com","service","Twitter","http://www.twitter.com","http://twitter.com/dig_geo_com/statuses/494191759078211584",,"{""hashtags"":[],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""dig_geo_com"",""name"":""digital-geography"",""id"":231016902,""id_str"":""231016902"",""indices"":[0,12]},{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[62,70]}],""symbols"":[]}","note","object:search.twitter.com,2005:494194150133481472","@dig_geo_com Your welcome :-) Keep in mind that some parts of @cartoDB still doesn't work fine. We're waiting for update from our provider.","2014-07-29T18:54:01.000Z","http://twitter.com/juanjeojeda/statuses/494194150133481472","place","Las Palmas de Gran Canaria, Las Palmas","https://api.twitter.com/1.1/geo/id/00ab08eef1b62e92.json","{""type"":""Polygon"",""coordinates"":[[[-15.5255036,28.0248125],[-15.5255036,28.1812125],[-15.3941943,28.1812125],[-15.3941943,28.0248125]]]}",,"Las Palmas de Gran Canaria","{""klout_score"":56,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-15.5255036,28.0248125],[-15.5255036,28.1812125],[-15.3941943,28.1812125],[-15.3941943,28.0248125]]]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:494191583240388608","post","http://twitter.com/juanjeojeda/statuses/494191583240388608","@dig_geo_com Hi, @cartoDB blog is already back. We had some issues with our hosting provider. Sorry for the inconveniences.","activity","2014-07-29T18:43:49.000Z","0","medium","en","0","person","id:twitter.com:12679112","http://www.twitter.com/juanjeojeda","Juanje Ojeda ","https://pbs.twimg.com/profile_images/46025702/juanje_normal.jpg","Canarian guy who likes the open knowledge, the freedom and learn things every day. #OpenSource #DevOps #PaaS #Canarias","2008-01-25T11:49:15.000Z","[{""href"":""http://about.me/juanje"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Las Palmas de Gran Canaria""}","3600","juanjeojeda","[""es""]","London","416","1006","86","17698","false","Twitter Web Client","http://twitter.com","service","Twitter","http://www.twitter.com","http://twitter.com/dig_geo_com/statuses/494181592685117442",,"{""hashtags"":[],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""dig_geo_com"",""name"":""digital-geography"",""id"":231016902,""id_str"":""231016902"",""indices"":[0,12]},{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[17,25]}],""symbols"":[]}","note","object:search.twitter.com,2005:494191583240388608","@dig_geo_com Hi, @cartoDB blog is already back. We had some issues with our hosting provider. Sorry for the inconveniences.","2014-07-29T18:43:49.000Z","http://twitter.com/juanjeojeda/statuses/494191583240388608","place","Las Palmas de Gran Canaria, Las Palmas","https://api.twitter.com/1.1/geo/id/00ab08eef1b62e92.json","{""type"":""Polygon"",""coordinates"":[[[-15.5255036,28.0248125],[-15.5255036,28.1812125],[-15.3941943,28.1812125],[-15.3941943,28.0248125]]]}",,"Las Palmas de Gran Canaria","{""klout_score"":56,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-15.5255036,28.0248125],[-15.5255036,28.1812125],[-15.3941943,28.1812125],[-15.3941943,28.0248125]]]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:494141648922611712","post","http://twitter.com/spara/statuses/494141648922611712","@vtcraghead @briantimoney @billdollins CartoDB needs to cut a deal with a cloud provider, they’re a bit too parsimonious on disk space","activity","2014-07-29T15:25:24.000Z","0","medium","en","0","person","id:twitter.com:14629939","http://www.twitter.com/spara","spara","https://pbs.twimg.com/profile_images/469468370413166592/uuOHhLby_normal.jpeg","Ut mitterent eos in faciem.","2008-05-02T19:24:50.000Z","[{""href"":""http://sproke.blogspot.com"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""San Antonio Francisco""}","-25200","spara","[""en""]","Pacific Time (US & Canada)","1311","1276","128","24585","false","Tweetbot for Mac","http://tapbots.com/software/tweetbot/mac","service","Twitter","http://www.twitter.com","http://twitter.com/vtcraghead/statuses/494140334226833408",,"{""hashtags"":[],""symbols"":[],""urls"":[],""user_mentions"":[{""screen_name"":""vtcraghead"",""name"":""Bill Morris"",""id"":278873782,""id_str"":""278873782"",""indices"":[0,11]},{""screen_name"":""briantimoney"",""name"":""Brian Timoney"",""id"":17546328,""id_str"":""17546328"",""indices"":[12,25]},{""screen_name"":""billdollins"",""name"":""Bill Dollins"",""id"":12405802,""id_str"":""12405802"",""indices"":[26,38]}]}","note","object:search.twitter.com,2005:494141648922611712","@vtcraghead @briantimoney @billdollins CartoDB needs to cut a deal with a cloud provider, they’re a bit too parsimonious on disk space","2014-07-29T15:25:24.000Z","http://twitter.com/spara/statuses/494141648922611712","place","Highland Park, San Antonio","https://api.twitter.com/1.1/geo/id/097c1754d9aa7b39.json","{""type"":""Polygon"",""coordinates"":[[[-98.478227,29.384112],[-98.478227,29.401578],[-98.448015,29.401578],[-98.448015,29.384112]]]}",,"Highland Park","{""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-98.478227,29.384112],[-98.478227,29.401578],[-98.448015,29.401578],[-98.448015,29.384112]]]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:496274441584668672","post","http://twitter.com/erictheise/statuses/496274441584668672","sad to be the guy that knocked ""locahost"" out of @cartoDB's docs for #Odyssey.js; i've certainly had that sentiment towards my dev machine.","activity","2014-08-04T12:40:21.000Z","0","medium","en","0","person","id:twitter.com:94817737","http://www.twitter.com/erictheise","Eric Theise","https://pbs.twimg.com/profile_images/1994194116/Theise_normal.jpg","Software engineer; photographer, experimental filmmaker, cartographer, geographer, vocalizer, yoga student, reader & writer, eater & drinker.","2009-12-05T16:06:12.000Z","[{""href"":null,""rel"":""me""}]","{""objectType"":""place"",""displayName"":""San Francisco""}","-25200","erictheise","[""en""]","Pacific Time (US & Canada)","698","306","25","1322","false","Twitter Web Client","http://twitter.com","service","Twitter","http://www.twitter.com",,,"{""hashtags"":[{""text"":""Odyssey"",""indices"":[69,77]}],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[49,57]}],""symbols"":[]}","note","object:search.twitter.com,2005:496274441584668672","sad to be the guy that knocked ""locahost"" out of @cartoDB's docs for #Odyssey.js; i've certainly had that sentiment towards my dev machine.","2014-08-04T12:40:21.000Z","http://twitter.com/erictheise/statuses/496274441584668672","place","San Francisco, CA","https://api.twitter.com/1.1/geo/id/5a110d312052166f.json","{""type"":""Polygon"",""coordinates"":[[[-122.514926,37.708075],[-122.514926,37.833238],[-122.328001,37.833238],[-122.328001,37.708075]]]}",,"San Francisco","{""klout_score"":41,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-122.514926,37.708075],[-122.514926,37.833238],[-122.328001,37.833238],[-122.328001,37.708075]]]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:495565956908064769","post","http://twitter.com/Jmholleran/statuses/495565956908064769","FrackMap #map http://t.co/BLWl3zYKTn","activity","2014-08-02T13:45:05.000Z","0","medium","en","0","person","id:twitter.com:27128139","http://www.twitter.com/Jmholleran","John Munro Holleran","https://pbs.twimg.com/profile_images/460662090819051520/lzLtBzUb_normal.png","Modest! intelligent, articulate & generally just amazing! Trade Unionist, learning facilitator 'n that","2009-03-27T23:36:39.000Z","[{""href"":null,""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Glasgow/Scotland""}",,"Jmholleran","[""en""]",,"411","192","1","1643","false","Twitter for Android","http://twitter.com/download/android","service","Twitter","http://www.twitter.com",,"{""type"":""Point"",""coordinates"":[55.8641,-4.282299]}","{""hashtags"":[{""text"":""map"",""indices"":[9,13]}],""trends"":[],""urls"":[{""url"":""http://t.co/BLWl3zYKTn"",""expanded_url"":""http://energydesk.cartodb.com/viz/18162194-ecbd-11e3-aba1-0e230854a1cb/embed_map?title=true&description=true&search=false&shareable=true&cartodb_logo=true&layer_selector=false&legends=true&scrollwheel=true&fullscreen=true&sublayer_options=1%7C1%7C1%7C1&sql=&sw_lat=49.97948776108648&sw_lon=-12.7001953125&ne_lat=56.80087831233043&ne_lon=8.96484375"",""display_url"":""energydesk.cartodb.com/viz/18162194-e…"",""indices"":[14,36]}],""user_mentions"":[],""symbols"":[]}","note","object:search.twitter.com,2005:495565956908064769","FrackMap #map http://t.co/BLWl3zYKTn","2014-08-02T13:45:05.000Z","http://twitter.com/Jmholleran/statuses/495565956908064769","place","Glasgow","https://api.twitter.com/1.1/geo/id/791e00bcadc4615f.json","{""type"":""Polygon"",""coordinates"":[[[-4.3932845,55.796184],[-4.3932845,55.9204214],[-4.0902182,55.9204214],[-4.0902182,55.796184]]]}",,"Glasgow","{""urls"":[{""url"":""http://t.co/BLWl3zYKTn"",""expanded_url"":""http://energydesk.cartodb.com/viz/18162194-ecbd-11e3-aba1-0e230854a1cb/embed_map?title=true&description=true&search=false&shareable=true&cartodb_logo=true&layer_selector=false&legends=true&scrollwheel=true&fullscreen=true&sublayer_options=1%7C1%7C1%7C1&sql&sw_lat=49.97948776108648&sw_lon=-12.7001953125&ne_lat=56.80087831233043&ne_lon=8.96484375"",""expanded_status"":200}],""klout_score"":23}","{""type"":""Point"",""coordinates"":[-4.282299,55.8641]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:494521462682685440","post","http://twitter.com/SonOfJorEl/statuses/494521462682685440","@iriberri1 @cartoDB you are saying it is not supported, but you have an entire blog post about said feature : http://t.co/gvuUWv9sge","activity","2014-07-30T16:34:39.000Z","0","medium","en","0","person","id:twitter.com:15628310","http://www.twitter.com/SonOfJorEl","Joey Schluchter","https://pbs.twimg.com/profile_images/466697750013562880/ngwKpO1j_normal.jpeg","Recovering golfer. Helping feed the world to software. Still love persimmon.","2008-07-28T05:34:03.000Z","[{""href"":""http://www.exzeo.com"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Clearwater, FL""}","-14400","SonOfJorEl","[""en""]","Eastern Time (US & Canada)","368","2053","5","2143","false","Tweetbot for Mac","http://tapbots.com/software/tweetbot/mac","service","Twitter","http://www.twitter.com","http://twitter.com/iriberri1/statuses/494488277765091328",,"{""hashtags"":[],""symbols"":[],""urls"":[{""url"":""http://t.co/gvuUWv9sge"",""expanded_url"":""http://blog.cartodb.com/got-files-weve-got-a-import-api/"",""display_url"":""blog.cartodb.com/got-files-weve…"",""indices"":[110,132]}],""user_mentions"":[{""screen_name"":""iriberri1"",""name"":""Carla"",""id"":102197411,""id_str"":""102197411"",""indices"":[0,10]},{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[11,19]}]}","note","object:search.twitter.com,2005:494521462682685440","@iriberri1 @cartoDB you are saying it is not supported, but you have an entire blog post about said feature : http://t.co/gvuUWv9sge","2014-07-30T16:34:39.000Z","http://twitter.com/SonOfJorEl/statuses/494521462682685440","place","Tampa, FL","https://api.twitter.com/1.1/geo/id/dc62519fda13b4ec.json","{""type"":""Polygon"",""coordinates"":[[[-82.648358,27.821353],[-82.648358,28.171245],[-82.289105,28.171245],[-82.289105,27.821353]]]}",,"Tampa","{""urls"":[{""url"":""http://t.co/gvuUWv9sge"",""expanded_url"":""http://blog.cartodb.com/got-files-weve-got-a-import-api/"",""expanded_status"":200}],""klout_score"":42,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-82.648358,27.821353],[-82.648358,28.171245],[-82.289105,28.171245],[-82.289105,27.821353]]]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:494511938563342336","post","http://twitter.com/xavijam/statuses/494511938563342336",". @Javier is giving birth last @cartodb feature. All I can say is … GIF over maps! http://t.co/oC3DEK5cP6","activity","2014-07-30T15:56:48.000Z","0","medium","en","0","person","id:twitter.com:26775253","http://www.twitter.com/xavijam","Javier Álvarez","https://pbs.twimg.com/profile_images/3025038956/a2919d353eb2b1a22756d7ac79847480_normal.jpeg","I love gentoo penguins","2009-03-26T15:36:52.000Z","[{""href"":""http://xavij.am"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Antarctic Peninsula""}","7200","xavijam","[""en""]","Madrid","250","395","26","4981","false","Tweetbot for iΟS","http://tapbots.com/tweetbot","service","Twitter","http://www.twitter.com",,,"{""hashtags"":[],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""javier"",""name"":""Javier Arce"",""id"":39083,""id_str"":""39083"",""indices"":[2,9]},{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[31,39]}],""symbols"":[],""media"":[{""id"":494511934629093378,""id_str"":""494511934629093378"",""indices"":[83,105],""media_url"":""http://pbs.twimg.com/media/Btzb_AjCIAI0cLr.jpg"",""media_url_https"":""https://pbs.twimg.com/media/Btzb_AjCIAI0cLr.jpg"",""url"":""http://t.co/oC3DEK5cP6"",""display_url"":""pic.twitter.com/oC3DEK5cP6"",""expanded_url"":""http://twitter.com/xavijam/status/494511938563342336/photo/1"",""type"":""photo"",""sizes"":{""small"":{""w"":340,""h"":255,""resize"":""fit""},""medium"":{""w"":600,""h"":450,""resize"":""fit""},""large"":{""w"":1024,""h"":768,""resize"":""fit""},""thumb"":{""w"":150,""h"":150,""resize"":""crop""}}}]}","note","object:search.twitter.com,2005:494511938563342336",". @Javier is giving birth last @cartodb feature. All I can say is … GIF over maps! http://t.co/oC3DEK5cP6","2014-07-30T15:56:48.000Z","http://twitter.com/xavijam/statuses/494511938563342336","place","Trafalgar","https://api.twitter.com/1.1/geo/id/0144b1172069289c.json","{""type"":""Polygon"",""coordinates"":[[[-3.70582,40.4275708],[-3.70582,40.4386747],[-3.6956326,40.4386747],[-3.6956326,40.4275708]]]}",,"Trafalgar","{""urls"":[{""url"":""http://t.co/oC3DEK5cP6"",""expanded_url"":""http://twitter.com/xavijam/status/494511938563342336/photo/1"",""expanded_status"":200}],""klout_score"":39,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-3.70582,40.4275708],[-3.70582,40.4386747],[-3.6956326,40.4386747],[-3.6956326,40.4275708]]]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:494485754848894978","post","http://twitter.com/SonOfJorEl/statuses/494485754848894978","@cartoDB I’ve emailed support (which you claim has a 24hr turnaround) with minimal response. I am a paying customer ($149 mo). For how long?","activity","2014-07-30T14:12:45.000Z","0","medium","en","0","person","id:twitter.com:15628310","http://www.twitter.com/SonOfJorEl","Joey Schluchter","https://pbs.twimg.com/profile_images/466697750013562880/ngwKpO1j_normal.jpeg","Recovering golfer. Helping feed the world to software. Still love persimmon.","2008-07-28T05:34:03.000Z","[{""href"":""http://www.exzeo.com"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Clearwater, FL""}","-14400","SonOfJorEl","[""en""]","Eastern Time (US & Canada)","368","2053","5","2142","false","Tweetbot for Mac","http://tapbots.com/software/tweetbot/mac","service","Twitter","http://www.twitter.com",,,"{""hashtags"":[],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[0,8]}],""symbols"":[]}","note","object:search.twitter.com,2005:494485754848894978","@cartoDB I’ve emailed support (which you claim has a 24hr turnaround) with minimal response. I am a paying customer ($149 mo). For how long?","2014-07-30T14:12:45.000Z","http://twitter.com/SonOfJorEl/statuses/494485754848894978","place","Tampa, FL","https://api.twitter.com/1.1/geo/id/dc62519fda13b4ec.json","{""type"":""Polygon"",""coordinates"":[[[-82.648358,27.821353],[-82.648358,28.171245],[-82.289105,28.171245],[-82.289105,27.821353]]]}",,"Tampa","{""klout_score"":42,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-82.648358,27.821353],[-82.648358,28.171245],[-82.289105,28.171245],[-82.289105,27.821353]]]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:494276921765543936","post","http://twitter.com/httsan/statuses/494276921765543936","""@gisuser: Online Mapping for Beginners – The Map Academy from CartoDB: TweetSomething innovative from… http://t.co/Zhh882TV2F""","activity","2014-07-30T00:22:56.000Z","0","medium","en","0","person","id:twitter.com:28471178","http://www.twitter.com/httsan","hartanto","https://pbs.twimg.com/profile_images/2217327231/IMG0033_normal.jpg","Lahir di Indonesia | Nguli di @NEOnetBPPT @BPPTeknologi | Ngobrol di @RSGISForum @PadangZaitun | Nyantri di @MichiganStateU","2009-04-03T01:32:35.000Z","[{""href"":""http://about.me/httsan"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""East Lansing""}","-14400","httsan","[""en""]","Eastern Time (US & Canada)","976","873","12","25725","false","Twitter for Android","http://twitter.com/download/android","service","Twitter","http://www.twitter.com",,"{""type"":""Point"",""coordinates"":[42.7539688,-84.4221123]}","{""hashtags"":[],""symbols"":[],""urls"":[{""url"":""http://t.co/Zhh882TV2F"",""expanded_url"":""http://goo.gl/fb/xVB5rr"",""display_url"":""goo.gl/fb/xVB5rr"",""indices"":[104,126]}],""user_mentions"":[{""screen_name"":""gisuser"",""name"":""GISuser GeoTech News"",""id"":16958615,""id_str"":""16958615"",""indices"":[1,9]}]}","note","object:search.twitter.com,2005:494276921765543936","""@gisuser: Online Mapping for Beginners – The Map Academy from CartoDB: TweetSomething innovative from… http://t.co/Zhh882TV2F""","2014-07-30T00:22:56.000Z","http://twitter.com/httsan/statuses/494276921765543936","place","Haslett, MI","https://api.twitter.com/1.1/geo/id/4399b5004a3b4d9a.json","{""type"":""Polygon"",""coordinates"":[[[-84.447506,42.731229],[-84.447506,42.769688],[-84.363432,42.769688],[-84.363432,42.731229]]]}",,"Haslett","{""urls"":[{""url"":""http://t.co/Zhh882TV2F"",""expanded_url"":""http://blog.gisuser.com/2014/07/29/online-mapping-for-beginners-the-map-academy-from-cartodb/?utm_source=feedburner&utm_medium=twitter&utm_campaign=Feed:%20gisuser%20(GISUser.com%20-%20GIS,%20Mapping,%20Geospatial,%20and%20location%20technology%20news)"",""expanded_status"":200}],""klout_score"":51,""language"":{""value"":""en""}}","{""type"":""Point"",""coordinates"":[-84.4221123,42.7539688]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:494274906528288769","post","http://twitter.com/carygeo/statuses/494274906528288769","Attention mappers: iframe, #javascript, app development examples from the #CartoDB API/team! Well done @andrewxhill. http://t.co/cJM5fzgoyL","activity","2014-07-30T00:14:55.000Z","0","medium","en","0","person","id:twitter.com:2641688154","http://www.twitter.com/carygeo","Cary Greenwood","https://pbs.twimg.com/profile_images/488501325697544192/gFMxHuLV_normal.jpeg","geography, maps, data visualization, ui/ux design","2014-07-14T01:35:22.000Z","[{""href"":null,""rel"":""me""}]",,,"carygeo","[""en""]",,"109","46","0","47","false","Twitter for iPhone","http://twitter.com/download/iphone","service","Twitter","http://www.twitter.com",,"{""type"":""Point"",""coordinates"":[34.13846767,-118.3620715]}","{""hashtags"":[{""text"":""javascript"",""indices"":[27,38]},{""text"":""CartoDB"",""indices"":[74,82]}],""symbols"":[],""urls"":[{""url"":""http://t.co/cJM5fzgoyL"",""expanded_url"":""http://vimeo.com/m/101936210"",""display_url"":""vimeo.com/m/101936210"",""indices"":[117,139]}],""user_mentions"":[{""screen_name"":""andrewxhill"",""name"":""Andrew W Hill"",""id"":19893224,""id_str"":""19893224"",""indices"":[103,115]}]}","note","object:search.twitter.com,2005:494274906528288769","Attention mappers: iframe, #javascript, app development examples from the #CartoDB API/team! Well done @andrewxhill. http://t.co/cJM5fzgoyL","2014-07-30T00:14:55.000Z","http://twitter.com/carygeo/statuses/494274906528288769","place","Los Angeles, CA","https://api.twitter.com/1.1/geo/id/3b77caf94bfc81fe.json","{""type"":""Polygon"",""coordinates"":[[[-118.668404,33.704538],[-118.668404,34.330724],[-118.155409,34.330724],[-118.155409,33.704538]]]}",,"Los Angeles","{""urls"":[{""url"":""http://t.co/cJM5fzgoyL"",""expanded_url"":""http://vimeo.com/101936210"",""expanded_status"":200}],""klout_score"":31,""language"":{""value"":""en""}}","{""type"":""Point"",""coordinates"":[-118.3620715,34.13846767]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:494194150133481472","post","http://twitter.com/juanjeojeda/statuses/494194150133481472","@dig_geo_com Your welcome :-) Keep in mind that some parts of @cartoDB still doesn't work fine. We're waiting for update from our provider.","activity","2014-07-29T18:54:01.000Z","0","medium","en","0","person","id:twitter.com:12679112","http://www.twitter.com/juanjeojeda","Juanje Ojeda ","https://pbs.twimg.com/profile_images/46025702/juanje_normal.jpg","Canarian guy who likes the open knowledge, the freedom and learn things every day. #OpenSource #DevOps #PaaS #Canarias","2008-01-25T11:49:15.000Z","[{""href"":""http://about.me/juanje"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Las Palmas de Gran Canaria""}","3600","juanjeojeda","[""es""]","London","416","1006","86","17700","false","Twitter Web Client","http://twitter.com","service","Twitter","http://www.twitter.com","http://twitter.com/dig_geo_com/statuses/494191759078211584",,"{""hashtags"":[],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""dig_geo_com"",""name"":""digital-geography"",""id"":231016902,""id_str"":""231016902"",""indices"":[0,12]},{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[62,70]}],""symbols"":[]}","note","object:search.twitter.com,2005:494194150133481472","@dig_geo_com Your welcome :-) Keep in mind that some parts of @cartoDB still doesn't work fine. We're waiting for update from our provider.","2014-07-29T18:54:01.000Z","http://twitter.com/juanjeojeda/statuses/494194150133481472","place","Las Palmas de Gran Canaria, Las Palmas","https://api.twitter.com/1.1/geo/id/00ab08eef1b62e92.json","{""type"":""Polygon"",""coordinates"":[[[-15.5255036,28.0248125],[-15.5255036,28.1812125],[-15.3941943,28.1812125],[-15.3941943,28.0248125]]]}",,"Las Palmas de Gran Canaria","{""klout_score"":56,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-15.5255036,28.0248125],[-15.5255036,28.1812125],[-15.3941943,28.1812125],[-15.3941943,28.0248125]]]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:494191583240388608","post","http://twitter.com/juanjeojeda/statuses/494191583240388608","@dig_geo_com Hi, @cartoDB blog is already back. We had some issues with our hosting provider. Sorry for the inconveniences.","activity","2014-07-29T18:43:49.000Z","0","medium","en","0","person","id:twitter.com:12679112","http://www.twitter.com/juanjeojeda","Juanje Ojeda ","https://pbs.twimg.com/profile_images/46025702/juanje_normal.jpg","Canarian guy who likes the open knowledge, the freedom and learn things every day. #OpenSource #DevOps #PaaS #Canarias","2008-01-25T11:49:15.000Z","[{""href"":""http://about.me/juanje"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Las Palmas de Gran Canaria""}","3600","juanjeojeda","[""es""]","London","416","1006","86","17698","false","Twitter Web Client","http://twitter.com","service","Twitter","http://www.twitter.com","http://twitter.com/dig_geo_com/statuses/494181592685117442",,"{""hashtags"":[],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""dig_geo_com"",""name"":""digital-geography"",""id"":231016902,""id_str"":""231016902"",""indices"":[0,12]},{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[17,25]}],""symbols"":[]}","note","object:search.twitter.com,2005:494191583240388608","@dig_geo_com Hi, @cartoDB blog is already back. We had some issues with our hosting provider. Sorry for the inconveniences.","2014-07-29T18:43:49.000Z","http://twitter.com/juanjeojeda/statuses/494191583240388608","place","Las Palmas de Gran Canaria, Las Palmas","https://api.twitter.com/1.1/geo/id/00ab08eef1b62e92.json","{""type"":""Polygon"",""coordinates"":[[[-15.5255036,28.0248125],[-15.5255036,28.1812125],[-15.3941943,28.1812125],[-15.3941943,28.0248125]]]}",,"Las Palmas de Gran Canaria","{""klout_score"":56,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-15.5255036,28.0248125],[-15.5255036,28.1812125],[-15.3941943,28.1812125],[-15.3941943,28.0248125]]]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:494141648922611712","post","http://twitter.com/spara/statuses/494141648922611712","@vtcraghead @briantimoney @billdollins CartoDB needs to cut a deal with a cloud provider, they’re a bit too parsimonious on disk space","activity","2014-07-29T15:25:24.000Z","0","medium","en","0","person","id:twitter.com:14629939","http://www.twitter.com/spara","spara","https://pbs.twimg.com/profile_images/469468370413166592/uuOHhLby_normal.jpeg","Ut mitterent eos in faciem.","2008-05-02T19:24:50.000Z","[{""href"":""http://sproke.blogspot.com"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""San Antonio Francisco""}","-25200","spara","[""en""]","Pacific Time (US & Canada)","1311","1276","128","24585","false","Tweetbot for Mac","http://tapbots.com/software/tweetbot/mac","service","Twitter","http://www.twitter.com","http://twitter.com/vtcraghead/statuses/494140334226833408",,"{""hashtags"":[],""symbols"":[],""urls"":[],""user_mentions"":[{""screen_name"":""vtcraghead"",""name"":""Bill Morris"",""id"":278873782,""id_str"":""278873782"",""indices"":[0,11]},{""screen_name"":""briantimoney"",""name"":""Brian Timoney"",""id"":17546328,""id_str"":""17546328"",""indices"":[12,25]},{""screen_name"":""billdollins"",""name"":""Bill Dollins"",""id"":12405802,""id_str"":""12405802"",""indices"":[26,38]}]}","note","object:search.twitter.com,2005:494141648922611712","@vtcraghead @briantimoney @billdollins CartoDB needs to cut a deal with a cloud provider, they’re a bit too parsimonious on disk space","2014-07-29T15:25:24.000Z","http://twitter.com/spara/statuses/494141648922611712","place","Highland Park, San Antonio","https://api.twitter.com/1.1/geo/id/097c1754d9aa7b39.json","{""type"":""Polygon"",""coordinates"":[[[-98.478227,29.384112],[-98.478227,29.401578],[-98.448015,29.401578],[-98.448015,29.384112]]]}",,"Highland Park","{""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-98.478227,29.384112],[-98.478227,29.401578],[-98.448015,29.401578],[-98.448015,29.384112]]]}","Category 1","uno, @dos, #tres"
|
||||
"tag:search.twitter.com,2005:496274441584668672","post","http://twitter.com/erictheise/statuses/496274441584668672","sad to be the guy that knocked ""locahost"" out of @cartoDB's docs for #Odyssey.js; i've certainly had that sentiment towards my dev machine.","activity","2014-08-04T12:40:21.000Z","0","medium","en","0","person","id:twitter.com:94817737","http://www.twitter.com/erictheise","Eric Theise","https://pbs.twimg.com/profile_images/1994194116/Theise_normal.jpg","Software engineer; photographer, experimental filmmaker, cartographer, geographer, vocalizer, yoga student, reader & writer, eater & drinker.","2009-12-05T16:06:12.000Z","[{""href"":null,""rel"":""me""}]","{""objectType"":""place"",""displayName"":""San Francisco""}","-25200","erictheise","[""en""]","Pacific Time (US & Canada)","698","306","25","1322","false","Twitter Web Client","http://twitter.com","service","Twitter","http://www.twitter.com",,,"{""hashtags"":[{""text"":""Odyssey"",""indices"":[69,77]}],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[49,57]}],""symbols"":[]}","note","object:search.twitter.com,2005:496274441584668672","sad to be the guy that knocked ""locahost"" out of @cartoDB's docs for #Odyssey.js; i've certainly had that sentiment towards my dev machine.","2014-08-04T12:40:21.000Z","http://twitter.com/erictheise/statuses/496274441584668672","place","San Francisco, CA","https://api.twitter.com/1.1/geo/id/5a110d312052166f.json","{""type"":""Polygon"",""coordinates"":[[[-122.514926,37.708075],[-122.514926,37.833238],[-122.328001,37.833238],[-122.328001,37.708075]]]}",,"San Francisco","{""klout_score"":41,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-122.514926,37.708075],[-122.514926,37.833238],[-122.328001,37.833238],[-122.328001,37.708075]]]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:495565956908064769","post","http://twitter.com/Jmholleran/statuses/495565956908064769","FrackMap #map http://t.co/BLWl3zYKTn","activity","2014-08-02T13:45:05.000Z","0","medium","en","0","person","id:twitter.com:27128139","http://www.twitter.com/Jmholleran","John Munro Holleran","https://pbs.twimg.com/profile_images/460662090819051520/lzLtBzUb_normal.png","Modest! intelligent, articulate & generally just amazing! Trade Unionist, learning facilitator 'n that","2009-03-27T23:36:39.000Z","[{""href"":null,""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Glasgow/Scotland""}",,"Jmholleran","[""en""]",,"411","192","1","1643","false","Twitter for Android","http://twitter.com/download/android","service","Twitter","http://www.twitter.com",,"{""type"":""Point"",""coordinates"":[55.8641,-4.282299]}","{""hashtags"":[{""text"":""map"",""indices"":[9,13]}],""trends"":[],""urls"":[{""url"":""http://t.co/BLWl3zYKTn"",""expanded_url"":""http://energydesk.cartodb.com/viz/18162194-ecbd-11e3-aba1-0e230854a1cb/embed_map?title=true&description=true&search=false&shareable=true&cartodb_logo=true&layer_selector=false&legends=true&scrollwheel=true&fullscreen=true&sublayer_options=1%7C1%7C1%7C1&sql=&sw_lat=49.97948776108648&sw_lon=-12.7001953125&ne_lat=56.80087831233043&ne_lon=8.96484375"",""display_url"":""energydesk.cartodb.com/viz/18162194-e…"",""indices"":[14,36]}],""user_mentions"":[],""symbols"":[]}","note","object:search.twitter.com,2005:495565956908064769","FrackMap #map http://t.co/BLWl3zYKTn","2014-08-02T13:45:05.000Z","http://twitter.com/Jmholleran/statuses/495565956908064769","place","Glasgow","https://api.twitter.com/1.1/geo/id/791e00bcadc4615f.json","{""type"":""Polygon"",""coordinates"":[[[-4.3932845,55.796184],[-4.3932845,55.9204214],[-4.0902182,55.9204214],[-4.0902182,55.796184]]]}",,"Glasgow","{""urls"":[{""url"":""http://t.co/BLWl3zYKTn"",""expanded_url"":""http://energydesk.cartodb.com/viz/18162194-ecbd-11e3-aba1-0e230854a1cb/embed_map?title=true&description=true&search=false&shareable=true&cartodb_logo=true&layer_selector=false&legends=true&scrollwheel=true&fullscreen=true&sublayer_options=1%7C1%7C1%7C1&sql&sw_lat=49.97948776108648&sw_lon=-12.7001953125&ne_lat=56.80087831233043&ne_lon=8.96484375"",""expanded_status"":200}],""klout_score"":23}","{""type"":""Point"",""coordinates"":[-4.282299,55.8641]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:494521462682685440","post","http://twitter.com/SonOfJorEl/statuses/494521462682685440","@iriberri1 @cartoDB you are saying it is not supported, but you have an entire blog post about said feature : http://t.co/gvuUWv9sge","activity","2014-07-30T16:34:39.000Z","0","medium","en","0","person","id:twitter.com:15628310","http://www.twitter.com/SonOfJorEl","Joey Schluchter","https://pbs.twimg.com/profile_images/466697750013562880/ngwKpO1j_normal.jpeg","Recovering golfer. Helping feed the world to software. Still love persimmon.","2008-07-28T05:34:03.000Z","[{""href"":""http://www.exzeo.com"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Clearwater, FL""}","-14400","SonOfJorEl","[""en""]","Eastern Time (US & Canada)","368","2053","5","2143","false","Tweetbot for Mac","http://tapbots.com/software/tweetbot/mac","service","Twitter","http://www.twitter.com","http://twitter.com/iriberri1/statuses/494488277765091328",,"{""hashtags"":[],""symbols"":[],""urls"":[{""url"":""http://t.co/gvuUWv9sge"",""expanded_url"":""http://blog.cartodb.com/got-files-weve-got-a-import-api/"",""display_url"":""blog.cartodb.com/got-files-weve…"",""indices"":[110,132]}],""user_mentions"":[{""screen_name"":""iriberri1"",""name"":""Carla"",""id"":102197411,""id_str"":""102197411"",""indices"":[0,10]},{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[11,19]}]}","note","object:search.twitter.com,2005:494521462682685440","@iriberri1 @cartoDB you are saying it is not supported, but you have an entire blog post about said feature : http://t.co/gvuUWv9sge","2014-07-30T16:34:39.000Z","http://twitter.com/SonOfJorEl/statuses/494521462682685440","place","Tampa, FL","https://api.twitter.com/1.1/geo/id/dc62519fda13b4ec.json","{""type"":""Polygon"",""coordinates"":[[[-82.648358,27.821353],[-82.648358,28.171245],[-82.289105,28.171245],[-82.289105,27.821353]]]}",,"Tampa","{""urls"":[{""url"":""http://t.co/gvuUWv9sge"",""expanded_url"":""http://blog.cartodb.com/got-files-weve-got-a-import-api/"",""expanded_status"":200}],""klout_score"":42,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-82.648358,27.821353],[-82.648358,28.171245],[-82.289105,28.171245],[-82.289105,27.821353]]]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:494511938563342336","post","http://twitter.com/xavijam/statuses/494511938563342336",". @Javier is giving birth last @cartodb feature. All I can say is … GIF over maps! http://t.co/oC3DEK5cP6","activity","2014-07-30T15:56:48.000Z","0","medium","en","0","person","id:twitter.com:26775253","http://www.twitter.com/xavijam","Javier Álvarez","https://pbs.twimg.com/profile_images/3025038956/a2919d353eb2b1a22756d7ac79847480_normal.jpeg","I love gentoo penguins","2009-03-26T15:36:52.000Z","[{""href"":""http://xavij.am"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Antarctic Peninsula""}","7200","xavijam","[""en""]","Madrid","250","395","26","4981","false","Tweetbot for iΟS","http://tapbots.com/tweetbot","service","Twitter","http://www.twitter.com",,,"{""hashtags"":[],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""javier"",""name"":""Javier Arce"",""id"":39083,""id_str"":""39083"",""indices"":[2,9]},{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[31,39]}],""symbols"":[],""media"":[{""id"":494511934629093378,""id_str"":""494511934629093378"",""indices"":[83,105],""media_url"":""http://pbs.twimg.com/media/Btzb_AjCIAI0cLr.jpg"",""media_url_https"":""https://pbs.twimg.com/media/Btzb_AjCIAI0cLr.jpg"",""url"":""http://t.co/oC3DEK5cP6"",""display_url"":""pic.twitter.com/oC3DEK5cP6"",""expanded_url"":""http://twitter.com/xavijam/status/494511938563342336/photo/1"",""type"":""photo"",""sizes"":{""small"":{""w"":340,""h"":255,""resize"":""fit""},""medium"":{""w"":600,""h"":450,""resize"":""fit""},""large"":{""w"":1024,""h"":768,""resize"":""fit""},""thumb"":{""w"":150,""h"":150,""resize"":""crop""}}}]}","note","object:search.twitter.com,2005:494511938563342336",". @Javier is giving birth last @cartodb feature. All I can say is … GIF over maps! http://t.co/oC3DEK5cP6","2014-07-30T15:56:48.000Z","http://twitter.com/xavijam/statuses/494511938563342336","place","Trafalgar","https://api.twitter.com/1.1/geo/id/0144b1172069289c.json","{""type"":""Polygon"",""coordinates"":[[[-3.70582,40.4275708],[-3.70582,40.4386747],[-3.6956326,40.4386747],[-3.6956326,40.4275708]]]}",,"Trafalgar","{""urls"":[{""url"":""http://t.co/oC3DEK5cP6"",""expanded_url"":""http://twitter.com/xavijam/status/494511938563342336/photo/1"",""expanded_status"":200}],""klout_score"":39,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-3.70582,40.4275708],[-3.70582,40.4386747],[-3.6956326,40.4386747],[-3.6956326,40.4275708]]]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:494485754848894978","post","http://twitter.com/SonOfJorEl/statuses/494485754848894978","@cartoDB I’ve emailed support (which you claim has a 24hr turnaround) with minimal response. I am a paying customer ($149 mo). For how long?","activity","2014-07-30T14:12:45.000Z","0","medium","en","0","person","id:twitter.com:15628310","http://www.twitter.com/SonOfJorEl","Joey Schluchter","https://pbs.twimg.com/profile_images/466697750013562880/ngwKpO1j_normal.jpeg","Recovering golfer. Helping feed the world to software. Still love persimmon.","2008-07-28T05:34:03.000Z","[{""href"":""http://www.exzeo.com"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Clearwater, FL""}","-14400","SonOfJorEl","[""en""]","Eastern Time (US & Canada)","368","2053","5","2142","false","Tweetbot for Mac","http://tapbots.com/software/tweetbot/mac","service","Twitter","http://www.twitter.com",,,"{""hashtags"":[],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[0,8]}],""symbols"":[]}","note","object:search.twitter.com,2005:494485754848894978","@cartoDB I’ve emailed support (which you claim has a 24hr turnaround) with minimal response. I am a paying customer ($149 mo). For how long?","2014-07-30T14:12:45.000Z","http://twitter.com/SonOfJorEl/statuses/494485754848894978","place","Tampa, FL","https://api.twitter.com/1.1/geo/id/dc62519fda13b4ec.json","{""type"":""Polygon"",""coordinates"":[[[-82.648358,27.821353],[-82.648358,28.171245],[-82.289105,28.171245],[-82.289105,27.821353]]]}",,"Tampa","{""klout_score"":42,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-82.648358,27.821353],[-82.648358,28.171245],[-82.289105,28.171245],[-82.289105,27.821353]]]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:494276921765543936","post","http://twitter.com/httsan/statuses/494276921765543936","""@gisuser: Online Mapping for Beginners – The Map Academy from CartoDB: TweetSomething innovative from… http://t.co/Zhh882TV2F""","activity","2014-07-30T00:22:56.000Z","0","medium","en","0","person","id:twitter.com:28471178","http://www.twitter.com/httsan","hartanto","https://pbs.twimg.com/profile_images/2217327231/IMG0033_normal.jpg","Lahir di Indonesia | Nguli di @NEOnetBPPT @BPPTeknologi | Ngobrol di @RSGISForum @PadangZaitun | Nyantri di @MichiganStateU","2009-04-03T01:32:35.000Z","[{""href"":""http://about.me/httsan"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""East Lansing""}","-14400","httsan","[""en""]","Eastern Time (US & Canada)","976","873","12","25725","false","Twitter for Android","http://twitter.com/download/android","service","Twitter","http://www.twitter.com",,"{""type"":""Point"",""coordinates"":[42.7539688,-84.4221123]}","{""hashtags"":[],""symbols"":[],""urls"":[{""url"":""http://t.co/Zhh882TV2F"",""expanded_url"":""http://goo.gl/fb/xVB5rr"",""display_url"":""goo.gl/fb/xVB5rr"",""indices"":[104,126]}],""user_mentions"":[{""screen_name"":""gisuser"",""name"":""GISuser GeoTech News"",""id"":16958615,""id_str"":""16958615"",""indices"":[1,9]}]}","note","object:search.twitter.com,2005:494276921765543936","""@gisuser: Online Mapping for Beginners – The Map Academy from CartoDB: TweetSomething innovative from… http://t.co/Zhh882TV2F""","2014-07-30T00:22:56.000Z","http://twitter.com/httsan/statuses/494276921765543936","place","Haslett, MI","https://api.twitter.com/1.1/geo/id/4399b5004a3b4d9a.json","{""type"":""Polygon"",""coordinates"":[[[-84.447506,42.731229],[-84.447506,42.769688],[-84.363432,42.769688],[-84.363432,42.731229]]]}",,"Haslett","{""urls"":[{""url"":""http://t.co/Zhh882TV2F"",""expanded_url"":""http://blog.gisuser.com/2014/07/29/online-mapping-for-beginners-the-map-academy-from-cartodb/?utm_source=feedburner&utm_medium=twitter&utm_campaign=Feed:%20gisuser%20(GISUser.com%20-%20GIS,%20Mapping,%20Geospatial,%20and%20location%20technology%20news)"",""expanded_status"":200}],""klout_score"":51,""language"":{""value"":""en""}}","{""type"":""Point"",""coordinates"":[-84.4221123,42.7539688]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:494274906528288769","post","http://twitter.com/carygeo/statuses/494274906528288769","Attention mappers: iframe, #javascript, app development examples from the #CartoDB API/team! Well done @andrewxhill. http://t.co/cJM5fzgoyL","activity","2014-07-30T00:14:55.000Z","0","medium","en","0","person","id:twitter.com:2641688154","http://www.twitter.com/carygeo","Cary Greenwood","https://pbs.twimg.com/profile_images/488501325697544192/gFMxHuLV_normal.jpeg","geography, maps, data visualization, ui/ux design","2014-07-14T01:35:22.000Z","[{""href"":null,""rel"":""me""}]",,,"carygeo","[""en""]",,"109","46","0","47","false","Twitter for iPhone","http://twitter.com/download/iphone","service","Twitter","http://www.twitter.com",,"{""type"":""Point"",""coordinates"":[34.13846767,-118.3620715]}","{""hashtags"":[{""text"":""javascript"",""indices"":[27,38]},{""text"":""CartoDB"",""indices"":[74,82]}],""symbols"":[],""urls"":[{""url"":""http://t.co/cJM5fzgoyL"",""expanded_url"":""http://vimeo.com/m/101936210"",""display_url"":""vimeo.com/m/101936210"",""indices"":[117,139]}],""user_mentions"":[{""screen_name"":""andrewxhill"",""name"":""Andrew W Hill"",""id"":19893224,""id_str"":""19893224"",""indices"":[103,115]}]}","note","object:search.twitter.com,2005:494274906528288769","Attention mappers: iframe, #javascript, app development examples from the #CartoDB API/team! Well done @andrewxhill. http://t.co/cJM5fzgoyL","2014-07-30T00:14:55.000Z","http://twitter.com/carygeo/statuses/494274906528288769","place","Los Angeles, CA","https://api.twitter.com/1.1/geo/id/3b77caf94bfc81fe.json","{""type"":""Polygon"",""coordinates"":[[[-118.668404,33.704538],[-118.668404,34.330724],[-118.155409,34.330724],[-118.155409,33.704538]]]}",,"Los Angeles","{""urls"":[{""url"":""http://t.co/cJM5fzgoyL"",""expanded_url"":""http://vimeo.com/101936210"",""expanded_status"":200}],""klout_score"":31,""language"":{""value"":""en""}}","{""type"":""Point"",""coordinates"":[-118.3620715,34.13846767]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:494194150133481472","post","http://twitter.com/juanjeojeda/statuses/494194150133481472","@dig_geo_com Your welcome :-) Keep in mind that some parts of @cartoDB still doesn't work fine. We're waiting for update from our provider.","activity","2014-07-29T18:54:01.000Z","0","medium","en","0","person","id:twitter.com:12679112","http://www.twitter.com/juanjeojeda","Juanje Ojeda ","https://pbs.twimg.com/profile_images/46025702/juanje_normal.jpg","Canarian guy who likes the open knowledge, the freedom and learn things every day. #OpenSource #DevOps #PaaS #Canarias","2008-01-25T11:49:15.000Z","[{""href"":""http://about.me/juanje"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Las Palmas de Gran Canaria""}","3600","juanjeojeda","[""es""]","London","416","1006","86","17700","false","Twitter Web Client","http://twitter.com","service","Twitter","http://www.twitter.com","http://twitter.com/dig_geo_com/statuses/494191759078211584",,"{""hashtags"":[],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""dig_geo_com"",""name"":""digital-geography"",""id"":231016902,""id_str"":""231016902"",""indices"":[0,12]},{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[62,70]}],""symbols"":[]}","note","object:search.twitter.com,2005:494194150133481472","@dig_geo_com Your welcome :-) Keep in mind that some parts of @cartoDB still doesn't work fine. We're waiting for update from our provider.","2014-07-29T18:54:01.000Z","http://twitter.com/juanjeojeda/statuses/494194150133481472","place","Las Palmas de Gran Canaria, Las Palmas","https://api.twitter.com/1.1/geo/id/00ab08eef1b62e92.json","{""type"":""Polygon"",""coordinates"":[[[-15.5255036,28.0248125],[-15.5255036,28.1812125],[-15.3941943,28.1812125],[-15.3941943,28.0248125]]]}",,"Las Palmas de Gran Canaria","{""klout_score"":56,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-15.5255036,28.0248125],[-15.5255036,28.1812125],[-15.3941943,28.1812125],[-15.3941943,28.0248125]]]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:494191583240388608","post","http://twitter.com/juanjeojeda/statuses/494191583240388608","@dig_geo_com Hi, @cartoDB blog is already back. We had some issues with our hosting provider. Sorry for the inconveniences.","activity","2014-07-29T18:43:49.000Z","0","medium","en","0","person","id:twitter.com:12679112","http://www.twitter.com/juanjeojeda","Juanje Ojeda ","https://pbs.twimg.com/profile_images/46025702/juanje_normal.jpg","Canarian guy who likes the open knowledge, the freedom and learn things every day. #OpenSource #DevOps #PaaS #Canarias","2008-01-25T11:49:15.000Z","[{""href"":""http://about.me/juanje"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Las Palmas de Gran Canaria""}","3600","juanjeojeda","[""es""]","London","416","1006","86","17698","false","Twitter Web Client","http://twitter.com","service","Twitter","http://www.twitter.com","http://twitter.com/dig_geo_com/statuses/494181592685117442",,"{""hashtags"":[],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""dig_geo_com"",""name"":""digital-geography"",""id"":231016902,""id_str"":""231016902"",""indices"":[0,12]},{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[17,25]}],""symbols"":[]}","note","object:search.twitter.com,2005:494191583240388608","@dig_geo_com Hi, @cartoDB blog is already back. We had some issues with our hosting provider. Sorry for the inconveniences.","2014-07-29T18:43:49.000Z","http://twitter.com/juanjeojeda/statuses/494191583240388608","place","Las Palmas de Gran Canaria, Las Palmas","https://api.twitter.com/1.1/geo/id/00ab08eef1b62e92.json","{""type"":""Polygon"",""coordinates"":[[[-15.5255036,28.0248125],[-15.5255036,28.1812125],[-15.3941943,28.1812125],[-15.3941943,28.0248125]]]}",,"Las Palmas de Gran Canaria","{""klout_score"":56,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-15.5255036,28.0248125],[-15.5255036,28.1812125],[-15.3941943,28.1812125],[-15.3941943,28.0248125]]]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:494141648922611712","post","http://twitter.com/spara/statuses/494141648922611712","@vtcraghead @briantimoney @billdollins CartoDB needs to cut a deal with a cloud provider, they’re a bit too parsimonious on disk space","activity","2014-07-29T15:25:24.000Z","0","medium","en","0","person","id:twitter.com:14629939","http://www.twitter.com/spara","spara","https://pbs.twimg.com/profile_images/469468370413166592/uuOHhLby_normal.jpeg","Ut mitterent eos in faciem.","2008-05-02T19:24:50.000Z","[{""href"":""http://sproke.blogspot.com"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""San Antonio Francisco""}","-25200","spara","[""en""]","Pacific Time (US & Canada)","1311","1276","128","24585","false","Tweetbot for Mac","http://tapbots.com/software/tweetbot/mac","service","Twitter","http://www.twitter.com","http://twitter.com/vtcraghead/statuses/494140334226833408",,"{""hashtags"":[],""symbols"":[],""urls"":[],""user_mentions"":[{""screen_name"":""vtcraghead"",""name"":""Bill Morris"",""id"":278873782,""id_str"":""278873782"",""indices"":[0,11]},{""screen_name"":""briantimoney"",""name"":""Brian Timoney"",""id"":17546328,""id_str"":""17546328"",""indices"":[12,25]},{""screen_name"":""billdollins"",""name"":""Bill Dollins"",""id"":12405802,""id_str"":""12405802"",""indices"":[26,38]}]}","note","object:search.twitter.com,2005:494141648922611712","@vtcraghead @briantimoney @billdollins CartoDB needs to cut a deal with a cloud provider, they’re a bit too parsimonious on disk space","2014-07-29T15:25:24.000Z","http://twitter.com/spara/statuses/494141648922611712","place","Highland Park, San Antonio","https://api.twitter.com/1.1/geo/id/097c1754d9aa7b39.json","{""type"":""Polygon"",""coordinates"":[[[-98.478227,29.384112],[-98.478227,29.401578],[-98.448015,29.401578],[-98.448015,29.384112]]]}",,"Highland Park","{""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-98.478227,29.384112],[-98.478227,29.401578],[-98.448015,29.401578],[-98.448015,29.384112]]]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:496274441584668672","post","http://twitter.com/erictheise/statuses/496274441584668672","sad to be the guy that knocked ""locahost"" out of @cartoDB's docs for #Odyssey.js; i've certainly had that sentiment towards my dev machine.","activity","2014-08-04T12:40:21.000Z","0","medium","en","0","person","id:twitter.com:94817737","http://www.twitter.com/erictheise","Eric Theise","https://pbs.twimg.com/profile_images/1994194116/Theise_normal.jpg","Software engineer; photographer, experimental filmmaker, cartographer, geographer, vocalizer, yoga student, reader & writer, eater & drinker.","2009-12-05T16:06:12.000Z","[{""href"":null,""rel"":""me""}]","{""objectType"":""place"",""displayName"":""San Francisco""}","-25200","erictheise","[""en""]","Pacific Time (US & Canada)","698","306","25","1322","false","Twitter Web Client","http://twitter.com","service","Twitter","http://www.twitter.com",,,"{""hashtags"":[{""text"":""Odyssey"",""indices"":[69,77]}],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[49,57]}],""symbols"":[]}","note","object:search.twitter.com,2005:496274441584668672","sad to be the guy that knocked ""locahost"" out of @cartoDB's docs for #Odyssey.js; i've certainly had that sentiment towards my dev machine.","2014-08-04T12:40:21.000Z","http://twitter.com/erictheise/statuses/496274441584668672","place","San Francisco, CA","https://api.twitter.com/1.1/geo/id/5a110d312052166f.json","{""type"":""Polygon"",""coordinates"":[[[-122.514926,37.708075],[-122.514926,37.833238],[-122.328001,37.833238],[-122.328001,37.708075]]]}",,"San Francisco","{""klout_score"":41,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-122.514926,37.708075],[-122.514926,37.833238],[-122.328001,37.833238],[-122.328001,37.708075]]]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:495565956908064769","post","http://twitter.com/Jmholleran/statuses/495565956908064769","FrackMap #map http://t.co/BLWl3zYKTn","activity","2014-08-02T13:45:05.000Z","0","medium","en","0","person","id:twitter.com:27128139","http://www.twitter.com/Jmholleran","John Munro Holleran","https://pbs.twimg.com/profile_images/460662090819051520/lzLtBzUb_normal.png","Modest! intelligent, articulate & generally just amazing! Trade Unionist, learning facilitator 'n that","2009-03-27T23:36:39.000Z","[{""href"":null,""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Glasgow/Scotland""}",,"Jmholleran","[""en""]",,"411","192","1","1643","false","Twitter for Android","http://twitter.com/download/android","service","Twitter","http://www.twitter.com",,"{""type"":""Point"",""coordinates"":[55.8641,-4.282299]}","{""hashtags"":[{""text"":""map"",""indices"":[9,13]}],""trends"":[],""urls"":[{""url"":""http://t.co/BLWl3zYKTn"",""expanded_url"":""http://energydesk.cartodb.com/viz/18162194-ecbd-11e3-aba1-0e230854a1cb/embed_map?title=true&description=true&search=false&shareable=true&cartodb_logo=true&layer_selector=false&legends=true&scrollwheel=true&fullscreen=true&sublayer_options=1%7C1%7C1%7C1&sql=&sw_lat=49.97948776108648&sw_lon=-12.7001953125&ne_lat=56.80087831233043&ne_lon=8.96484375"",""display_url"":""energydesk.cartodb.com/viz/18162194-e…"",""indices"":[14,36]}],""user_mentions"":[],""symbols"":[]}","note","object:search.twitter.com,2005:495565956908064769","FrackMap #map http://t.co/BLWl3zYKTn","2014-08-02T13:45:05.000Z","http://twitter.com/Jmholleran/statuses/495565956908064769","place","Glasgow","https://api.twitter.com/1.1/geo/id/791e00bcadc4615f.json","{""type"":""Polygon"",""coordinates"":[[[-4.3932845,55.796184],[-4.3932845,55.9204214],[-4.0902182,55.9204214],[-4.0902182,55.796184]]]}",,"Glasgow","{""urls"":[{""url"":""http://t.co/BLWl3zYKTn"",""expanded_url"":""http://energydesk.cartodb.com/viz/18162194-ecbd-11e3-aba1-0e230854a1cb/embed_map?title=true&description=true&search=false&shareable=true&cartodb_logo=true&layer_selector=false&legends=true&scrollwheel=true&fullscreen=true&sublayer_options=1%7C1%7C1%7C1&sql&sw_lat=49.97948776108648&sw_lon=-12.7001953125&ne_lat=56.80087831233043&ne_lon=8.96484375"",""expanded_status"":200}],""klout_score"":23}","{""type"":""Point"",""coordinates"":[-4.282299,55.8641]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:494521462682685440","post","http://twitter.com/SonOfJorEl/statuses/494521462682685440","@iriberri1 @cartoDB you are saying it is not supported, but you have an entire blog post about said feature : http://t.co/gvuUWv9sge","activity","2014-07-30T16:34:39.000Z","0","medium","en","0","person","id:twitter.com:15628310","http://www.twitter.com/SonOfJorEl","Joey Schluchter","https://pbs.twimg.com/profile_images/466697750013562880/ngwKpO1j_normal.jpeg","Recovering golfer. Helping feed the world to software. Still love persimmon.","2008-07-28T05:34:03.000Z","[{""href"":""http://www.exzeo.com"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Clearwater, FL""}","-14400","SonOfJorEl","[""en""]","Eastern Time (US & Canada)","368","2053","5","2143","false","Tweetbot for Mac","http://tapbots.com/software/tweetbot/mac","service","Twitter","http://www.twitter.com","http://twitter.com/iriberri1/statuses/494488277765091328",,"{""hashtags"":[],""symbols"":[],""urls"":[{""url"":""http://t.co/gvuUWv9sge"",""expanded_url"":""http://blog.cartodb.com/got-files-weve-got-a-import-api/"",""display_url"":""blog.cartodb.com/got-files-weve…"",""indices"":[110,132]}],""user_mentions"":[{""screen_name"":""iriberri1"",""name"":""Carla"",""id"":102197411,""id_str"":""102197411"",""indices"":[0,10]},{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[11,19]}]}","note","object:search.twitter.com,2005:494521462682685440","@iriberri1 @cartoDB you are saying it is not supported, but you have an entire blog post about said feature : http://t.co/gvuUWv9sge","2014-07-30T16:34:39.000Z","http://twitter.com/SonOfJorEl/statuses/494521462682685440","place","Tampa, FL","https://api.twitter.com/1.1/geo/id/dc62519fda13b4ec.json","{""type"":""Polygon"",""coordinates"":[[[-82.648358,27.821353],[-82.648358,28.171245],[-82.289105,28.171245],[-82.289105,27.821353]]]}",,"Tampa","{""urls"":[{""url"":""http://t.co/gvuUWv9sge"",""expanded_url"":""http://blog.cartodb.com/got-files-weve-got-a-import-api/"",""expanded_status"":200}],""klout_score"":42,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-82.648358,27.821353],[-82.648358,28.171245],[-82.289105,28.171245],[-82.289105,27.821353]]]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:494511938563342336","post","http://twitter.com/xavijam/statuses/494511938563342336",". @Javier is giving birth last @cartodb feature. All I can say is … GIF over maps! http://t.co/oC3DEK5cP6","activity","2014-07-30T15:56:48.000Z","0","medium","en","0","person","id:twitter.com:26775253","http://www.twitter.com/xavijam","Javier Álvarez","https://pbs.twimg.com/profile_images/3025038956/a2919d353eb2b1a22756d7ac79847480_normal.jpeg","I love gentoo penguins","2009-03-26T15:36:52.000Z","[{""href"":""http://xavij.am"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Antarctic Peninsula""}","7200","xavijam","[""en""]","Madrid","250","395","26","4981","false","Tweetbot for iΟS","http://tapbots.com/tweetbot","service","Twitter","http://www.twitter.com",,,"{""hashtags"":[],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""javier"",""name"":""Javier Arce"",""id"":39083,""id_str"":""39083"",""indices"":[2,9]},{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[31,39]}],""symbols"":[],""media"":[{""id"":494511934629093378,""id_str"":""494511934629093378"",""indices"":[83,105],""media_url"":""http://pbs.twimg.com/media/Btzb_AjCIAI0cLr.jpg"",""media_url_https"":""https://pbs.twimg.com/media/Btzb_AjCIAI0cLr.jpg"",""url"":""http://t.co/oC3DEK5cP6"",""display_url"":""pic.twitter.com/oC3DEK5cP6"",""expanded_url"":""http://twitter.com/xavijam/status/494511938563342336/photo/1"",""type"":""photo"",""sizes"":{""small"":{""w"":340,""h"":255,""resize"":""fit""},""medium"":{""w"":600,""h"":450,""resize"":""fit""},""large"":{""w"":1024,""h"":768,""resize"":""fit""},""thumb"":{""w"":150,""h"":150,""resize"":""crop""}}}]}","note","object:search.twitter.com,2005:494511938563342336",". @Javier is giving birth last @cartodb feature. All I can say is … GIF over maps! http://t.co/oC3DEK5cP6","2014-07-30T15:56:48.000Z","http://twitter.com/xavijam/statuses/494511938563342336","place","Trafalgar","https://api.twitter.com/1.1/geo/id/0144b1172069289c.json","{""type"":""Polygon"",""coordinates"":[[[-3.70582,40.4275708],[-3.70582,40.4386747],[-3.6956326,40.4386747],[-3.6956326,40.4275708]]]}",,"Trafalgar","{""urls"":[{""url"":""http://t.co/oC3DEK5cP6"",""expanded_url"":""http://twitter.com/xavijam/status/494511938563342336/photo/1"",""expanded_status"":200}],""klout_score"":39,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-3.70582,40.4275708],[-3.70582,40.4386747],[-3.6956326,40.4386747],[-3.6956326,40.4275708]]]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:494485754848894978","post","http://twitter.com/SonOfJorEl/statuses/494485754848894978","@cartoDB I’ve emailed support (which you claim has a 24hr turnaround) with minimal response. I am a paying customer ($149 mo). For how long?","activity","2014-07-30T14:12:45.000Z","0","medium","en","0","person","id:twitter.com:15628310","http://www.twitter.com/SonOfJorEl","Joey Schluchter","https://pbs.twimg.com/profile_images/466697750013562880/ngwKpO1j_normal.jpeg","Recovering golfer. Helping feed the world to software. Still love persimmon.","2008-07-28T05:34:03.000Z","[{""href"":""http://www.exzeo.com"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Clearwater, FL""}","-14400","SonOfJorEl","[""en""]","Eastern Time (US & Canada)","368","2053","5","2142","false","Tweetbot for Mac","http://tapbots.com/software/tweetbot/mac","service","Twitter","http://www.twitter.com",,,"{""hashtags"":[],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[0,8]}],""symbols"":[]}","note","object:search.twitter.com,2005:494485754848894978","@cartoDB I’ve emailed support (which you claim has a 24hr turnaround) with minimal response. I am a paying customer ($149 mo). For how long?","2014-07-30T14:12:45.000Z","http://twitter.com/SonOfJorEl/statuses/494485754848894978","place","Tampa, FL","https://api.twitter.com/1.1/geo/id/dc62519fda13b4ec.json","{""type"":""Polygon"",""coordinates"":[[[-82.648358,27.821353],[-82.648358,28.171245],[-82.289105,28.171245],[-82.289105,27.821353]]]}",,"Tampa","{""klout_score"":42,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-82.648358,27.821353],[-82.648358,28.171245],[-82.289105,28.171245],[-82.289105,27.821353]]]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:494276921765543936","post","http://twitter.com/httsan/statuses/494276921765543936","""@gisuser: Online Mapping for Beginners – The Map Academy from CartoDB: TweetSomething innovative from… http://t.co/Zhh882TV2F""","activity","2014-07-30T00:22:56.000Z","0","medium","en","0","person","id:twitter.com:28471178","http://www.twitter.com/httsan","hartanto","https://pbs.twimg.com/profile_images/2217327231/IMG0033_normal.jpg","Lahir di Indonesia | Nguli di @NEOnetBPPT @BPPTeknologi | Ngobrol di @RSGISForum @PadangZaitun | Nyantri di @MichiganStateU","2009-04-03T01:32:35.000Z","[{""href"":""http://about.me/httsan"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""East Lansing""}","-14400","httsan","[""en""]","Eastern Time (US & Canada)","976","873","12","25725","false","Twitter for Android","http://twitter.com/download/android","service","Twitter","http://www.twitter.com",,"{""type"":""Point"",""coordinates"":[42.7539688,-84.4221123]}","{""hashtags"":[],""symbols"":[],""urls"":[{""url"":""http://t.co/Zhh882TV2F"",""expanded_url"":""http://goo.gl/fb/xVB5rr"",""display_url"":""goo.gl/fb/xVB5rr"",""indices"":[104,126]}],""user_mentions"":[{""screen_name"":""gisuser"",""name"":""GISuser GeoTech News"",""id"":16958615,""id_str"":""16958615"",""indices"":[1,9]}]}","note","object:search.twitter.com,2005:494276921765543936","""@gisuser: Online Mapping for Beginners – The Map Academy from CartoDB: TweetSomething innovative from… http://t.co/Zhh882TV2F""","2014-07-30T00:22:56.000Z","http://twitter.com/httsan/statuses/494276921765543936","place","Haslett, MI","https://api.twitter.com/1.1/geo/id/4399b5004a3b4d9a.json","{""type"":""Polygon"",""coordinates"":[[[-84.447506,42.731229],[-84.447506,42.769688],[-84.363432,42.769688],[-84.363432,42.731229]]]}",,"Haslett","{""urls"":[{""url"":""http://t.co/Zhh882TV2F"",""expanded_url"":""http://blog.gisuser.com/2014/07/29/online-mapping-for-beginners-the-map-academy-from-cartodb/?utm_source=feedburner&utm_medium=twitter&utm_campaign=Feed:%20gisuser%20(GISUser.com%20-%20GIS,%20Mapping,%20Geospatial,%20and%20location%20technology%20news)"",""expanded_status"":200}],""klout_score"":51,""language"":{""value"":""en""}}","{""type"":""Point"",""coordinates"":[-84.4221123,42.7539688]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:494274906528288769","post","http://twitter.com/carygeo/statuses/494274906528288769","Attention mappers: iframe, #javascript, app development examples from the #CartoDB API/team! Well done @andrewxhill. http://t.co/cJM5fzgoyL","activity","2014-07-30T00:14:55.000Z","0","medium","en","0","person","id:twitter.com:2641688154","http://www.twitter.com/carygeo","Cary Greenwood","https://pbs.twimg.com/profile_images/488501325697544192/gFMxHuLV_normal.jpeg","geography, maps, data visualization, ui/ux design","2014-07-14T01:35:22.000Z","[{""href"":null,""rel"":""me""}]",,,"carygeo","[""en""]",,"109","46","0","47","false","Twitter for iPhone","http://twitter.com/download/iphone","service","Twitter","http://www.twitter.com",,"{""type"":""Point"",""coordinates"":[34.13846767,-118.3620715]}","{""hashtags"":[{""text"":""javascript"",""indices"":[27,38]},{""text"":""CartoDB"",""indices"":[74,82]}],""symbols"":[],""urls"":[{""url"":""http://t.co/cJM5fzgoyL"",""expanded_url"":""http://vimeo.com/m/101936210"",""display_url"":""vimeo.com/m/101936210"",""indices"":[117,139]}],""user_mentions"":[{""screen_name"":""andrewxhill"",""name"":""Andrew W Hill"",""id"":19893224,""id_str"":""19893224"",""indices"":[103,115]}]}","note","object:search.twitter.com,2005:494274906528288769","Attention mappers: iframe, #javascript, app development examples from the #CartoDB API/team! Well done @andrewxhill. http://t.co/cJM5fzgoyL","2014-07-30T00:14:55.000Z","http://twitter.com/carygeo/statuses/494274906528288769","place","Los Angeles, CA","https://api.twitter.com/1.1/geo/id/3b77caf94bfc81fe.json","{""type"":""Polygon"",""coordinates"":[[[-118.668404,33.704538],[-118.668404,34.330724],[-118.155409,34.330724],[-118.155409,33.704538]]]}",,"Los Angeles","{""urls"":[{""url"":""http://t.co/cJM5fzgoyL"",""expanded_url"":""http://vimeo.com/101936210"",""expanded_status"":200}],""klout_score"":31,""language"":{""value"":""en""}}","{""type"":""Point"",""coordinates"":[-118.3620715,34.13846767]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:494194150133481472","post","http://twitter.com/juanjeojeda/statuses/494194150133481472","@dig_geo_com Your welcome :-) Keep in mind that some parts of @cartoDB still doesn't work fine. We're waiting for update from our provider.","activity","2014-07-29T18:54:01.000Z","0","medium","en","0","person","id:twitter.com:12679112","http://www.twitter.com/juanjeojeda","Juanje Ojeda ","https://pbs.twimg.com/profile_images/46025702/juanje_normal.jpg","Canarian guy who likes the open knowledge, the freedom and learn things every day. #OpenSource #DevOps #PaaS #Canarias","2008-01-25T11:49:15.000Z","[{""href"":""http://about.me/juanje"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Las Palmas de Gran Canaria""}","3600","juanjeojeda","[""es""]","London","416","1006","86","17700","false","Twitter Web Client","http://twitter.com","service","Twitter","http://www.twitter.com","http://twitter.com/dig_geo_com/statuses/494191759078211584",,"{""hashtags"":[],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""dig_geo_com"",""name"":""digital-geography"",""id"":231016902,""id_str"":""231016902"",""indices"":[0,12]},{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[62,70]}],""symbols"":[]}","note","object:search.twitter.com,2005:494194150133481472","@dig_geo_com Your welcome :-) Keep in mind that some parts of @cartoDB still doesn't work fine. We're waiting for update from our provider.","2014-07-29T18:54:01.000Z","http://twitter.com/juanjeojeda/statuses/494194150133481472","place","Las Palmas de Gran Canaria, Las Palmas","https://api.twitter.com/1.1/geo/id/00ab08eef1b62e92.json","{""type"":""Polygon"",""coordinates"":[[[-15.5255036,28.0248125],[-15.5255036,28.1812125],[-15.3941943,28.1812125],[-15.3941943,28.0248125]]]}",,"Las Palmas de Gran Canaria","{""klout_score"":56,""language"":{""value"":""en""}}","{""type"":""Polygon"",""coordinates"":[[[-15.5255036,28.0248125],[-15.5255036,28.1812125],[-15.3941943,28.1812125],[-15.3941943,28.0248125]]]}","Category 2","aaa, bbb"
|
||||
"tag:search.twitter.com,2005:494191583240388608","post","http://twitter.com/juanjeojeda/statuses/494191583240388608","@dig_geo_com Hi, @cartoDB blog is already back. We had some issues with our hosting provider. Sorry for the inconveniences.","activity","2014-07-29T18:43:49.000Z","0","medium","en","0","person","id:twitter.com:12679112","http://www.twitter.com/juanjeojeda","Juanje Ojeda ","https://pbs.twimg.com/profile_images/46025702/juanje_normal.jpg","Canarian guy who likes the open knowledge, the freedom and learn things every day. #OpenSource #DevOps #PaaS #Canarias","2008-01-25T11:49:15.000Z","[{""href"":""http://about.me/juanje"",""rel"":""me""}]","{""objectType"":""place"",""displayName"":""Las Palmas de Gran Canaria""}","3600","juanjeojeda","[""es""]","London","416","1006","86","17698","false","Twitter Web Client","http://twitter.com","service","Twitter","http://www.twitter.com","http://twitter.com/dig_geo_com/statuses/494181592685117442",,"{""hashtags"":[],""trends"":[],""urls"":[],""user_mentions"":[{""screen_name"":""dig_geo_com"",""name"":""digital-geography"",""id"":231016902,""id_str"":""231016902"",""indices"":[0,12]},{""screen_name"":""cartoDB"",""name"":""CartoDB"",""id"":241079136,""id_str"":""241079136"",""indices"":[17,25]}],""symbols"":[]}","note","object:search.twitter.com,2005:494191583240388608","@dig_geo_com Hi, @cartoDB blog is already back. We had some issues with our hosting provider. Sorry for the inconveniences.","2014-07-29T18:43:49.000Z","http://twitter.com/juanjeojeda/statuses/494191583240388608","place","Las Palmas de Gran Canaria, Las Palmas","https://api.twitter.com/1.1/geo/id/00ab08eef1b62e92.json","{""type"":""Polygon"",""coordinates"":[[[-15.5255036,28.0248125],[-15.5255036,28.1812125],[-15.3941943,28.1812125],[-15.3941943,28.0248125]]]}
|
||||
|
Can't render this file because it contains an unexpected character in line 40 and column 1807.
|
@@ -0,0 +1,51 @@
|
||||
require_relative '../../lib/datasources'
|
||||
require_relative '../doubles/json_to_csv_converter'
|
||||
|
||||
include CartoDB::Datasources
|
||||
|
||||
describe CSVFileDumper do
|
||||
|
||||
before(:each) do
|
||||
end
|
||||
|
||||
describe '#dumping data' do
|
||||
it 'tests streaming dump' do
|
||||
output_stream_name ='/tmp/csv_file_dumper_test.csv'
|
||||
|
||||
File.unlink(output_stream_name) if File.exists?(output_stream_name)
|
||||
|
||||
converter_mock = CartoDB::TwitterSearch::Doubles::JSONToCSVConverter.new
|
||||
|
||||
dumper = CSVFileDumper.new(converter_mock, false)
|
||||
|
||||
dumper.buffer_size=2
|
||||
|
||||
input_filename_1 = 'stream_input_1'
|
||||
input_filename_2 = 'stream_input_2'
|
||||
input_data1 = File.read(File.join(File.dirname(__FILE__), "../fixtures/#{input_filename_1}"))
|
||||
input_data2 = File.read(File.join(File.dirname(__FILE__), "../fixtures/#{input_filename_2}"))
|
||||
|
||||
names_list = [ input_filename_1, input_filename_2 ]
|
||||
|
||||
stream = File.open(output_stream_name, 'wb')
|
||||
|
||||
dumper.begin_dump(input_filename_1)
|
||||
dumper.dump(input_filename_1, [input_data1])
|
||||
dumper.end_dump(input_filename_1)
|
||||
dumper.begin_dump(input_filename_2)
|
||||
dumper.dump(input_filename_2, [input_data2])
|
||||
dumper.end_dump(input_filename_2)
|
||||
|
||||
dumper.merge_dumps_into_stream(names_list, stream)
|
||||
|
||||
stream.close
|
||||
|
||||
data = File.read(output_stream_name)
|
||||
data.should eq "\n#{input_data1}\n#{input_data2}\n"
|
||||
File.unlink(output_stream_name)
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
require_relative '../../lib/datasources'
|
||||
require_relative '../doubles/organization'
|
||||
require_relative '../doubles/user'
|
||||
require_relative '../doubles/search_tweet'
|
||||
require_relative '../doubles/data_import'
|
||||
require_relative '../../../../lib/cartodb/logger'
|
||||
|
||||
include CartoDB::Datasources
|
||||
|
||||
describe Search::Twitter do
|
||||
|
||||
def get_config
|
||||
{
|
||||
'auth_required' => false,
|
||||
'username' => '',
|
||||
'password' => '',
|
||||
'search_url' => 'http://fakeurl.carto',
|
||||
}
|
||||
end
|
||||
|
||||
before(:each) do
|
||||
Typhoeus::Expectation.clear
|
||||
end
|
||||
|
||||
describe '#search' do
|
||||
it 'tests basic full search flow with streaming' do
|
||||
user_quota = 100
|
||||
user_mock = CartoDB::Datasources::Doubles::User.new({twitter_datasource_quota: user_quota})
|
||||
data_import_mock = CartoDB::Datasources::Doubles::DataImport.new(id: '123456789', service_item_id: '987654321')
|
||||
twitter_datasource = Search::Twitter.get_new(get_config, user_mock)
|
||||
|
||||
input_terms = terms_fixture
|
||||
input_dates = dates_fixture
|
||||
|
||||
Typhoeus.stub(/fakeurl\.carto/) do |request|
|
||||
accept = (request.options[:headers]||{})['Accept'] || 'application/json'
|
||||
format = accept.split(',').first
|
||||
|
||||
request.base_url.should eq 'http://fakeurl.carto'
|
||||
request.options[:params].key?(:pusblisher).should eq false
|
||||
body = data_from_file('sample_tweets_v2.json')
|
||||
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => format },
|
||||
body: body
|
||||
)
|
||||
end
|
||||
|
||||
twitter_datasource.send :audit_entry, CartoDB::Datasources::Doubles::SearchTweet
|
||||
twitter_datasource.data_import_item = data_import_mock
|
||||
stream_location = '/tmp/sample_tweets_v2.csv'
|
||||
File.unlink(stream_location) if File.exists?(stream_location)
|
||||
stream = File.open(stream_location, 'wb')
|
||||
twitter_datasource.stream_resource(::JSON.dump(
|
||||
{
|
||||
categories: input_terms[:categories],
|
||||
dates: input_dates[:dates]
|
||||
}
|
||||
), stream)
|
||||
stream.close
|
||||
|
||||
stored_data = data_from_file(stream_location, true)
|
||||
stored_data.should eq data_from_file('sample_tweets_v2.csv')
|
||||
File.unlink(stream_location)
|
||||
end
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def terms_fixture
|
||||
{
|
||||
categories: [
|
||||
{
|
||||
category: '1',
|
||||
terms: ['carto']
|
||||
}
|
||||
]
|
||||
}
|
||||
end
|
||||
|
||||
def dates_fixture
|
||||
{
|
||||
dates: {
|
||||
fromDate: '2017-02-21',
|
||||
fromHour: '11',
|
||||
fromMin: '45',
|
||||
toDate: '2017-02-21',
|
||||
toHour: '12',
|
||||
toMin: '00'
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
def data_from_file(filename, fullpath=false)
|
||||
if fullpath
|
||||
File.read(filename)
|
||||
else
|
||||
File.read(File.join(File.dirname(__FILE__), "../fixtures/#{filename}"))
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,521 @@
|
||||
require 'active_support/core_ext'
|
||||
|
||||
require_relative '../../lib/datasources'
|
||||
require_relative '../doubles/user'
|
||||
|
||||
include CartoDB::Datasources
|
||||
|
||||
describe Url::ArcGIS do
|
||||
|
||||
before(:all) do
|
||||
@url = 'http://myserver/arcgis/rest/services/MyFakeService/featurename'
|
||||
@invalid_url = 'http://myserver/mysite/rest/myfakefolder/MyFakeService/featurename'
|
||||
@user = CartoDB::Datasources::Doubles::User.new
|
||||
end
|
||||
|
||||
before(:each) do
|
||||
Typhoeus::Expectation.clear
|
||||
end
|
||||
|
||||
describe '#set_data_from' do
|
||||
it 'tests preparing the correct url from the one given from the UI' do
|
||||
invalid_1 = 'http://myserver/services/MyFakeService/featurename/MapServer'
|
||||
invalid_2 = 'myserver/services/MyFakeService/featurename/MapServer'
|
||||
|
||||
test1 = 'http://myserver/arcgis/rest/services/MyFakeService/featurename/MapServer'
|
||||
test2 = 'http://myserver/arcgis/rest/services/MyFakeService/featurename/MapServer/'
|
||||
test3 = 'http://myserver/arcgis/rest/services/MyFakeService/featurename/MapServer/0'
|
||||
test4 = 'http://myserver/arcgis/rest/services/MyFakeService/featurename/MapServer/0?'
|
||||
test5 = 'http://myserver/arcgis/rest/services/MyFakeService/featurename/MapServer/0?q=blablabla'
|
||||
test6 = 'http://myserver/arcgis/rest/services/MyFakeService/featurename/MapServer?q=blablabla'
|
||||
|
||||
valid_map = 'http://myserver/arcgis/rest/services/MyFakeService/featurename/MapServer'
|
||||
valid_map_trailing_slash = 'http://myserver/arcgis/rest/services/MyFakeService/featurename/MapServer/'
|
||||
valid_layer = 'http://myserver/arcgis/rest/services/MyFakeService/featurename/MapServer/0'
|
||||
|
||||
# Should be treated as ok
|
||||
test7 = 'http://myserver/arcgis/rest/services/MyFakeService/featurename/2314/'
|
||||
valid_7 = 'http://myserver/arcgis/rest/services/MyFakeService/featurename/2314/'
|
||||
|
||||
arcgis = Url::ArcGIS.get_new(@user)
|
||||
|
||||
expect {
|
||||
arcgis.send(:sanitize_id, invalid_1)
|
||||
}.to raise_error InvalidInputDataError
|
||||
expect {
|
||||
arcgis.send(:sanitize_id, invalid_2)
|
||||
}.to raise_error InvalidInputDataError
|
||||
|
||||
arcgis.send(:sanitize_id, test1).should eq valid_map
|
||||
arcgis.send(:sanitize_id, test2).should eq valid_map_trailing_slash
|
||||
arcgis.send(:sanitize_id, test3).should eq valid_layer
|
||||
arcgis.send(:sanitize_id, test4).should eq valid_layer
|
||||
arcgis.send(:sanitize_id, test5).should eq valid_layer
|
||||
arcgis.send(:sanitize_id, test6).should eq valid_map
|
||||
arcgis.send(:sanitize_id, test7).should eq valid_7
|
||||
end
|
||||
end
|
||||
|
||||
describe '#get_resource_metadata' do
|
||||
it 'tests error scenarios' do
|
||||
arcgis = Url::ArcGIS.get_new(@user)
|
||||
|
||||
sub_id = '0'
|
||||
|
||||
# 'general http error (non-200)'
|
||||
Typhoeus.stub(/\/arcgis\/rest\/services\/MyFakeService\/featurename\/layers/) do
|
||||
Typhoeus::Response.new(
|
||||
code: 400,
|
||||
headers: { 'Content-Type' => 'application/json' },
|
||||
body: ''
|
||||
)
|
||||
end
|
||||
|
||||
expect {
|
||||
arcgis.get_resource_metadata(@url)
|
||||
}.to raise_error DataDownloadError
|
||||
|
||||
# Stub layers request (so now works)
|
||||
Typhoeus.stub(/\/arcgis\/rest\/services\/MyFakeService\/featurename\/layers/) do |request|
|
||||
body = File.read(File.join(File.dirname(__FILE__), "../fixtures/arcgis_layers.json"))
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => 'application/json' },
|
||||
body: ::JSON.dump(::JSON.parse(body))
|
||||
)
|
||||
end
|
||||
|
||||
layers_data = arcgis.get_resource_metadata(@url)
|
||||
layers_data_expected = {
|
||||
id: @url,
|
||||
subresources: [{
|
||||
id: "#{@url}/#{sub_id}",
|
||||
title: 'first layer'
|
||||
}]
|
||||
}
|
||||
layers_data.should eq layers_data_expected
|
||||
|
||||
# 'fields' part
|
||||
Typhoeus.stub(/\/arcgis\/rest\/services\/MyFakeService\/featurename\/0/) do |request|
|
||||
body = File.read(File.join(File.dirname(__FILE__), "../fixtures/arcgis_metadata_minimal.json"))
|
||||
|
||||
body = ::JSON.parse(body)
|
||||
body.delete('fields')
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => 'application/json' },
|
||||
body: ::JSON.dump(body)
|
||||
)
|
||||
end
|
||||
|
||||
expect {
|
||||
arcgis.send(:get_subresource_metadata, @url, sub_id)
|
||||
}.to raise_error ResponseError
|
||||
|
||||
# Another required field
|
||||
Typhoeus.stub(/\/arcgis\/rest\/services\/MyFakeService\/featurename\/0/) do |request|
|
||||
body = File.read(File.join(File.dirname(__FILE__), "../fixtures/arcgis_metadata_minimal.json"))
|
||||
|
||||
body = ::JSON.parse(body)
|
||||
body.delete('name')
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => 'application/json' },
|
||||
body: ::JSON.dump(body)
|
||||
)
|
||||
end
|
||||
|
||||
expect {
|
||||
arcgis.send(:get_subresource_metadata, @url, sub_id)
|
||||
}.to raise_error ResponseError
|
||||
|
||||
# Invalid ArcGIS version
|
||||
Typhoeus.stub(/\/arcgis\/rest\/services\/MyFakeService\/featurename\/0/) do |request|
|
||||
body = File.read(File.join(File.dirname(__FILE__), "../fixtures/arcgis_metadata_minimal.json"))
|
||||
|
||||
body = ::JSON.parse(body)
|
||||
body['currentVersion'] = 9.0
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => 'application/json' },
|
||||
body: ::JSON.dump(body)
|
||||
)
|
||||
end
|
||||
|
||||
expect {
|
||||
arcgis.send(:get_subresource_metadata, @url, sub_id)
|
||||
}.to raise_error InvalidServiceError
|
||||
|
||||
# Invalid ArcGIS URL
|
||||
expect {
|
||||
arcgis.send(:get_resource_metadata, @invalid_url)
|
||||
}.to raise_error InvalidInputDataError
|
||||
end
|
||||
|
||||
it 'tests metadata retrieval' do
|
||||
arcgis = Url::ArcGIS.get_new(@user)
|
||||
|
||||
# Stub layers request (so now works)
|
||||
Typhoeus.stub(/\/arcgis\/rest\/services\/MyFakeService\/featurename\/layers/) do |request|
|
||||
body = File.read(File.join(File.dirname(__FILE__), "../fixtures/arcgis_layers.json"))
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => 'application/json' },
|
||||
body: ::JSON.dump(::JSON.parse(body))
|
||||
)
|
||||
end
|
||||
|
||||
Typhoeus.stub(/\/arcgis\/rest\/services\/MyFakeService\/featurename\/0/) do |request|
|
||||
accept = (request.options[:headers]||{})['Accept'] || 'application/json'
|
||||
format = accept.split(',').first
|
||||
|
||||
body = File.read(File.join(File.dirname(__FILE__), "../fixtures/arcgis_metadata_minimal.json"))
|
||||
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => format },
|
||||
body: body
|
||||
)
|
||||
end
|
||||
|
||||
expected_metadata = {
|
||||
:arcgis_version=>10.22,
|
||||
:name=>"Test Feature",
|
||||
:description=>"Sample metadata payload",
|
||||
:type=>"Feature Layer",
|
||||
:geometry_type=>"esriGeometryPolygon",
|
||||
:copyright=>"CartoDB",
|
||||
:fields=>[
|
||||
{
|
||||
:name => "OBJECTID",
|
||||
:type => "esriFieldTypeOID"
|
||||
},
|
||||
{
|
||||
:name => "NAME",
|
||||
:type => "esriFieldTypeString"
|
||||
}
|
||||
],
|
||||
:max_records_per_query=>1000,
|
||||
:supported_formats=>["JSON", "AMF"],
|
||||
:advanced_queries_supported=>true
|
||||
}
|
||||
|
||||
expected_metadata_response = {
|
||||
id: @url + '/0',
|
||||
title: 'Test Feature',
|
||||
url: nil,
|
||||
service: Url::ArcGIS::DATASOURCE_NAME,
|
||||
checksum: nil,
|
||||
size: 0,
|
||||
filename: 'test_feature.json'
|
||||
}
|
||||
|
||||
# Multi-resource scenario already tested above
|
||||
response = arcgis.get_resource_metadata(@url + '/0')
|
||||
|
||||
response.nil?.should be false
|
||||
arcgis.metadata.should eq expected_metadata
|
||||
|
||||
response.should eq expected_metadata_response
|
||||
end
|
||||
end
|
||||
|
||||
describe '#get_resource' do
|
||||
it 'tests the get_ids_list() private method with error scenarios' do
|
||||
arcgis = Url::ArcGIS.get_new(@user)
|
||||
|
||||
id = arcgis.send(:sanitize_id, @url)
|
||||
|
||||
# 'general http error (non-200)'
|
||||
Typhoeus.stub(/\/arcgis\/rest\//) do
|
||||
Typhoeus::Response.new(
|
||||
code: 400,
|
||||
headers: { 'Content-Type' => 'application/json' },
|
||||
body: ''
|
||||
)
|
||||
end
|
||||
|
||||
expect {
|
||||
arcgis.send(:get_ids_list, id)
|
||||
}.to raise_error DataDownloadError
|
||||
|
||||
# 'objectIds' not present
|
||||
Typhoeus::Expectation.clear
|
||||
Typhoeus.stub(/\/arcgis\/rest\//) do
|
||||
body = File.read(File.join(File.dirname(__FILE__), "../fixtures/arcgis_ids_list.json"))
|
||||
|
||||
body = ::JSON.parse(body)
|
||||
body.delete('objectIds')
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => 'application/json' },
|
||||
body: ::JSON.dump(body)
|
||||
)
|
||||
end
|
||||
|
||||
expect {
|
||||
arcgis.send(:get_ids_list, id)
|
||||
}.to raise_error ResponseError
|
||||
|
||||
# 'objectIds' empty
|
||||
Typhoeus::Expectation.clear
|
||||
Typhoeus.stub(/\/arcgis\/rest\//) do
|
||||
body = File.read(File.join(File.dirname(__FILE__), "../fixtures/arcgis_ids_list.json"))
|
||||
|
||||
body = ::JSON.parse(body)
|
||||
body['objectIds'] = []
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => 'application/json' },
|
||||
body: ::JSON.dump(body)
|
||||
)
|
||||
end
|
||||
|
||||
expect {
|
||||
arcgis.send(:get_ids_list, id)
|
||||
}.to raise_error ResponseError
|
||||
|
||||
end
|
||||
|
||||
it 'tests the get_ids_list() private method' do
|
||||
arcgis = Url::ArcGIS.get_new(@user)
|
||||
|
||||
id = arcgis.send(:sanitize_id, @url)
|
||||
|
||||
Typhoeus.stub(/\/arcgis\/rest\//) do |request|
|
||||
body = File.read(File.join(File.dirname(__FILE__), "../fixtures/arcgis_ids_list.json"))
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => 'application/json' },
|
||||
body: body
|
||||
)
|
||||
end
|
||||
|
||||
expected_ids = [1,2,3,4,5,6,7,8,9,10]
|
||||
|
||||
respose_ids = arcgis.send(:get_ids_list, id)
|
||||
|
||||
respose_ids.nil?.should be false
|
||||
respose_ids.should eq expected_ids
|
||||
end
|
||||
|
||||
it 'tests the get_ids_list() private method on out-of-order ids' do
|
||||
arcgis = Url::ArcGIS.get_new(@user)
|
||||
|
||||
id = arcgis.send(:sanitize_id, @url)
|
||||
|
||||
Typhoeus.stub(/\/arcgis\/rest\//) do |request|
|
||||
body = File.read(File.join(File.dirname(__FILE__), "../fixtures/arcgis_unordered_ids_list.json"))
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => 'application/json' },
|
||||
body: body
|
||||
)
|
||||
end
|
||||
|
||||
expected_ids = [1,2,3,4,5,6,7,8,9,10]
|
||||
|
||||
respose_ids = arcgis.send(:get_ids_list, id)
|
||||
|
||||
respose_ids.nil?.should be false
|
||||
respose_ids.should eq expected_ids
|
||||
end
|
||||
|
||||
it 'tests the get_by_ids() private method with error scenarios' do
|
||||
arcgis = Url::ArcGIS.get_new(@user)
|
||||
|
||||
id = arcgis.send(:sanitize_id, @url)
|
||||
|
||||
# Empty ids
|
||||
expect {
|
||||
arcgis.send(:get_by_ids, id, [], [{ key: 'value' }])
|
||||
}.to raise_error InvalidInputDataError
|
||||
|
||||
# Empty fields
|
||||
expect {
|
||||
arcgis.send(:get_by_ids, id, [1], [])
|
||||
}.to raise_error InvalidInputDataError
|
||||
|
||||
|
||||
# 'general http error (non-200)'
|
||||
Typhoeus.stub(/\/arcgis\/rest\//) do
|
||||
Typhoeus::Response.new(
|
||||
code: 400,
|
||||
headers: { 'Content-Type' => 'application/json' },
|
||||
body: ''
|
||||
)
|
||||
end
|
||||
|
||||
expect {
|
||||
arcgis.send(:get_by_ids, id, [1], [{ key: 'value' }])
|
||||
}.to raise_error DataDownloadError
|
||||
end
|
||||
|
||||
it 'tests the get_by_ids() private method' do
|
||||
arcgis = Url::ArcGIS.get_new(@user)
|
||||
|
||||
id = arcgis.send(:sanitize_id, @url)
|
||||
|
||||
Typhoeus.stub(/\/arcgis\/rest\//) do
|
||||
body = File.read(File.join(File.dirname(__FILE__), "../fixtures/arcgis_data_01.json"))
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => 'application/json' },
|
||||
body: body
|
||||
)
|
||||
end
|
||||
|
||||
expected_response_data = {
|
||||
geometryType: "esriGeometryPolygon",
|
||||
spatialReference: {
|
||||
"wkid" => 4326,
|
||||
"latestWkid" => 4326
|
||||
},
|
||||
fields: [
|
||||
{
|
||||
"name" => "OBJECTID",
|
||||
"type" => "esriFieldTypeOID",
|
||||
"alias" => "OBJECTID"
|
||||
},
|
||||
{
|
||||
"name" => "WDPAID",
|
||||
"type" => "esriFieldTypeInteger",
|
||||
"alias" => "WDPAID"
|
||||
},
|
||||
{
|
||||
"name" => "NAME",
|
||||
"type" => "esriFieldTypeString",
|
||||
"alias" => "NAME",
|
||||
"length" => 254
|
||||
}
|
||||
],
|
||||
features: [
|
||||
{"attributes"=>{"OBJECTID"=>1, "NAME"=>"Name of object 1"}, "geometry"=>{"fake"=>"geom"}},
|
||||
{"attributes"=>{"OBJECTID"=>2, "NAME"=>"Name of object 2"}, "geometry"=>{"fake"=>"geom"}},
|
||||
{"attributes"=>{"OBJECTID"=>3, "NAME"=>"Name of object 3"}, "geometry"=>{"fake"=>"geom"}}
|
||||
]
|
||||
}
|
||||
|
||||
ids_to_retrieve = [1,2,3]
|
||||
# WDPAID also present, but left on purpose untouched
|
||||
fields_to_retrieve = [{
|
||||
name: 'OBJECTID',
|
||||
type: 'esriFieldTypeOID'
|
||||
},
|
||||
{
|
||||
name: 'NAME',
|
||||
type: 'esriFieldTypeString'
|
||||
}]
|
||||
|
||||
response_data = arcgis.send(:get_by_ids, id, ids_to_retrieve, fields_to_retrieve)
|
||||
|
||||
response_data.nil?.should eq false
|
||||
response_data[:features].length.should eq 3
|
||||
|
||||
response_data.should eq expected_response_data
|
||||
|
||||
end
|
||||
|
||||
it 'tests retrieval of data' do
|
||||
arcgis = Url::ArcGIS.get_new(@user)
|
||||
|
||||
feature_names = []
|
||||
|
||||
# Layers request
|
||||
Typhoeus.stub(/\/arcgis\/rest\/services\/MyFakeService\/featurename\/layers/) do |request|
|
||||
body = File.read(File.join(File.dirname(__FILE__), "../fixtures/arcgis_layers.json"))
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => 'application/json' },
|
||||
body: ::JSON.dump(::JSON.parse(body))
|
||||
)
|
||||
end
|
||||
|
||||
# Metadata of a layer
|
||||
Typhoeus.stub(/\/arcgis\/rest\/services\/MyFakeService\/featurename\/0\?f=json/) do
|
||||
body = File.read(File.join(File.dirname(__FILE__), "../fixtures/arcgis_metadata_minimal.json"))
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => 'application/json' },
|
||||
body: body
|
||||
)
|
||||
end
|
||||
|
||||
# IDs list of a layer
|
||||
Typhoeus.stub(/\/arcgis\/rest\/(.*)query\?where=/) do
|
||||
body = File.read(File.join(File.dirname(__FILE__), "../fixtures/arcgis_ids_list_01.json"))
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => 'application/json' },
|
||||
body: body
|
||||
)
|
||||
end
|
||||
|
||||
Typhoeus.stub(/\/arcgis\/rest\/(.*)query$/) do |response|
|
||||
if response.options[:body][:objectIds].to_i == 1
|
||||
# First item fetch of a layer
|
||||
body = File.read(File.join(File.dirname(__FILE__), "../fixtures/arcgis_data_01.json"))
|
||||
body = ::JSON.parse(body)
|
||||
|
||||
feature_names.push body['features'][0]['attributes']['NAME']
|
||||
body['features'] = [ body['features'][0] ]
|
||||
else
|
||||
# Remaining items fetch of a layer, will not use :objectIds
|
||||
body = File.read(File.join(File.dirname(__FILE__), "../fixtures/arcgis_data_01.json"))
|
||||
body = ::JSON.parse(body)
|
||||
|
||||
feature_names.push body['features'][1]['attributes']['NAME']
|
||||
feature_names.push body['features'][2]['attributes']['NAME']
|
||||
body['features'] = [ body['features'][1], body['features'][2] ]
|
||||
end
|
||||
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => 'application/json' },
|
||||
body: ::JSON.dump(body)
|
||||
)
|
||||
end
|
||||
|
||||
# 1) Retrieve lists of layers
|
||||
metadata = arcgis.get_resource_metadata(@url)
|
||||
|
||||
# 2) Retrieve metadata of a specific layer (doesn't adds much, but to replicate flow)
|
||||
item_metadata = arcgis.get_resource_metadata(metadata[:subresources].first[:id])
|
||||
|
||||
item_metadata.nil?.should eq false
|
||||
# No more checks as will fail later if missing something
|
||||
|
||||
spatial_ref_expectation = {"wkid"=>4326, "latestWkid"=>4326}
|
||||
|
||||
initial_stream_data = arcgis.initial_stream(item_metadata[:id])
|
||||
|
||||
initial_stream_data.nil?.should eq false
|
||||
initial_stream_data = ::JSON.parse(initial_stream_data)
|
||||
initial_stream_data['geometryType'].should eq 'esriGeometryPolygon'
|
||||
initial_stream_data['spatialReference'].should eq spatial_ref_expectation
|
||||
initial_stream_data['fields'].count.should eq 3
|
||||
initial_stream_data['fields'][0]['name'].should eq 'OBJECTID'
|
||||
initial_stream_data['fields'][1]['name'].should eq 'WDPAID'
|
||||
initial_stream_data['fields'][2]['name'].should eq 'NAME'
|
||||
initial_stream_data['features'].count.should eq 1
|
||||
initial_stream_data['features'][0]['attributes'].nil?.should eq false
|
||||
initial_stream_data['features'][0]['attributes']['NAME'].should eq feature_names[0]
|
||||
initial_stream_data['features'][0]['geometry'].nil?.should eq false
|
||||
|
||||
streamed_data = arcgis.stream_resource(item_metadata[:id])
|
||||
|
||||
streamed_data.nil?.should eq false
|
||||
streamed_data = ::JSON.parse(streamed_data)
|
||||
streamed_data['geometryType'].should eq 'esriGeometryPolygon'
|
||||
streamed_data['spatialReference'].should eq spatial_ref_expectation
|
||||
streamed_data['fields'].count.should eq 3
|
||||
streamed_data['fields'][0]['name'].should eq 'OBJECTID'
|
||||
streamed_data['fields'][1]['name'].should eq 'WDPAID'
|
||||
streamed_data['fields'][2]['name'].should eq 'NAME'
|
||||
streamed_data['features'].count.should eq 2
|
||||
streamed_data['features'][0]['attributes']['NAME'].should eq feature_names[1]
|
||||
streamed_data['features'][1]['attributes']['NAME'].should eq feature_names[2]
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,31 @@
|
||||
require_relative '../../lib/datasources'
|
||||
require_relative '../doubles/user'
|
||||
|
||||
include CartoDB::Datasources
|
||||
|
||||
describe Url::Box do
|
||||
def get_config
|
||||
{
|
||||
'box_host' => '',
|
||||
'application_name' => '',
|
||||
'client_id' => '',
|
||||
'client_secret' => '',
|
||||
'callback_url' => ''
|
||||
}
|
||||
end
|
||||
|
||||
describe '#filters' do
|
||||
it 'test that filter sets correctly' do
|
||||
user_mock = CartoDB::Datasources::Doubles::User.new
|
||||
|
||||
box_provider = Url::Box.get_new(get_config, user_mock)
|
||||
|
||||
box_provider.filter.should eq nil
|
||||
|
||||
# Filter to 'documents'
|
||||
formats = ['csv', 'xls']
|
||||
box_provider.filter = formats
|
||||
box_provider.filter.should eq formats
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,47 @@
|
||||
require_relative '../../lib/datasources'
|
||||
require_relative '../doubles/user'
|
||||
|
||||
include CartoDB::Datasources
|
||||
|
||||
describe Url::Dropbox do
|
||||
|
||||
def get_config
|
||||
{
|
||||
'app_key' => '',
|
||||
'app_secret' => '',
|
||||
'callback_url' => ''
|
||||
}
|
||||
end #get_config
|
||||
|
||||
describe '#filters' do
|
||||
it 'test that filter options work correctly' do
|
||||
user_mock = CartoDB::Datasources::Doubles::User.new
|
||||
|
||||
dropbox_provider = Url::Dropbox.get_new(get_config, user_mock)
|
||||
|
||||
# No filter = all formats allowed
|
||||
filter = []
|
||||
Url::Dropbox::FORMATS_TO_SEARCH_QUERIES.each do |id, search_queries|
|
||||
search_queries.each do |search_query|
|
||||
filter = filter.push(search_query)
|
||||
end
|
||||
end
|
||||
dropbox_provider.filter.should eq filter
|
||||
|
||||
# Filter to 'documents'
|
||||
filter = []
|
||||
format_ids = [ Url::Dropbox::FORMAT_CSV, Url::Dropbox::FORMAT_EXCEL ]
|
||||
Url::Dropbox::FORMATS_TO_SEARCH_QUERIES.each do |id, search_queries|
|
||||
if format_ids.include?(id)
|
||||
search_queries.each do |search_query|
|
||||
filter = filter.push(search_query)
|
||||
end
|
||||
end
|
||||
end
|
||||
dropbox_provider.filter = format_ids
|
||||
dropbox_provider.filter.should eq filter
|
||||
end
|
||||
end #run
|
||||
|
||||
end
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
require_relative '../../../../spec/rspec_configuration'
|
||||
require_relative '../../lib/datasources'
|
||||
require_relative '../doubles/user'
|
||||
|
||||
include CartoDB::Datasources
|
||||
|
||||
describe Url::GDrive do
|
||||
|
||||
def get_config
|
||||
{
|
||||
'application_name' => '',
|
||||
'client_id' => '',
|
||||
'client_secret' => '',
|
||||
'callback_url' => 'http://localhost/callback'
|
||||
}
|
||||
end #get_config
|
||||
|
||||
describe '#filters' do
|
||||
it 'test that filter options work correctly' do
|
||||
# Stubs Google Drive client for connectionless testing
|
||||
Google::Apis::DriveV2::DriveService.any_instance.stubs(:get_file)
|
||||
Google::Apis::DriveV2::DriveService.any_instance.stubs(:export_file)
|
||||
Google::Apis::DriveV2::DriveService.any_instance.stubs(:list_files)
|
||||
user_mock = CartoDB::Datasources::Doubles::User.new
|
||||
|
||||
gdrive_provider = Url::GDrive.get_new(get_config, user_mock)
|
||||
|
||||
# No filter = all formats allowed
|
||||
filter = []
|
||||
Url::GDrive::FORMATS_TO_MIME_TYPES.each do |id, mime_types|
|
||||
mime_types.each do |mime_type|
|
||||
filter = filter.push(mime_type)
|
||||
end
|
||||
end
|
||||
gdrive_provider.filter.should eq filter
|
||||
|
||||
# Filter to 'documents'
|
||||
filter = []
|
||||
format_ids = [ Url::GDrive::FORMAT_CSV, Url::GDrive::FORMAT_EXCEL ]
|
||||
Url::GDrive::FORMATS_TO_MIME_TYPES.each do |id, mime_types|
|
||||
if format_ids.include?(id)
|
||||
mime_types.each do |mime_type|
|
||||
filter = filter.push(mime_type)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
gdrive_provider.filter = format_ids
|
||||
gdrive_provider.filter.should eq filter
|
||||
end
|
||||
end #run
|
||||
|
||||
end
|
||||
@@ -0,0 +1,372 @@
|
||||
require_relative '../../lib/datasources'
|
||||
require_relative '../doubles/organization'
|
||||
require_relative '../doubles/user'
|
||||
require_relative '../doubles/search_tweet'
|
||||
require_relative '../doubles/data_import'
|
||||
require_relative '../../../../lib/cartodb/logger'
|
||||
|
||||
include CartoDB::Datasources
|
||||
|
||||
describe Search::Twitter do
|
||||
|
||||
def get_config
|
||||
{
|
||||
'auth_required' => false,
|
||||
'username' => '',
|
||||
'password' => '',
|
||||
'search_url' => 'http://fakeurl.carto',
|
||||
}
|
||||
end #get_config
|
||||
|
||||
before(:each) do
|
||||
Typhoeus::Expectation.clear
|
||||
end
|
||||
|
||||
describe '#filters' do
|
||||
it 'tests max and total results filters' do
|
||||
big_quota = 123456
|
||||
user = CartoDB::Datasources::Doubles::User.new({
|
||||
twitter_datasource_quota: big_quota
|
||||
})
|
||||
twitter_datasource = Search::Twitter.get_new(get_config, user)
|
||||
|
||||
maxresults_filter = twitter_datasource.send :build_maxresults_field, user
|
||||
maxresults_filter.should eq CartoDB::TwitterSearch::SearchAPI::MAX_PAGE_RESULTS
|
||||
totalresults_filter = twitter_datasource.send :build_total_results_field, user
|
||||
totalresults_filter.should eq big_quota
|
||||
|
||||
small_quota = 13
|
||||
user = CartoDB::Datasources::Doubles::User.new({
|
||||
twitter_datasource_quota: small_quota,
|
||||
soft_twitter_datasource_limit: false
|
||||
})
|
||||
twitter_datasource = Search::Twitter.get_new(get_config, user)
|
||||
maxresults_filter = twitter_datasource.send :build_maxresults_field, user
|
||||
maxresults_filter.should eq small_quota
|
||||
totalresults_filter = twitter_datasource.send :build_total_results_field, user
|
||||
totalresults_filter.should eq small_quota
|
||||
|
||||
user = CartoDB::Datasources::Doubles::User.new({
|
||||
twitter_datasource_quota: small_quota,
|
||||
soft_twitter_datasource_limit: true
|
||||
})
|
||||
maxresults_filter = twitter_datasource.send :build_maxresults_field, user
|
||||
maxresults_filter.should eq CartoDB::TwitterSearch::SearchAPI::MAX_PAGE_RESULTS
|
||||
totalresults_filter = twitter_datasource.send :build_total_results_field, user
|
||||
totalresults_filter.should eq Search::Twitter::NO_TOTAL_RESULTS
|
||||
end
|
||||
|
||||
it 'tests category filters' do
|
||||
user_mock = CartoDB::Datasources::Doubles::User.new
|
||||
twitter_datasource = Search::Twitter.get_new(get_config, user_mock)
|
||||
|
||||
input_terms = terms_fixture
|
||||
|
||||
expected_output_terms = [
|
||||
{
|
||||
Search::Twitter::CATEGORY_NAME_KEY => 'Category 1',
|
||||
Search::Twitter::CATEGORY_TERMS_KEY => '(uno OR @dos OR #tres) (has:geo OR has:profile_geo)'
|
||||
},
|
||||
{
|
||||
Search::Twitter::CATEGORY_NAME_KEY => 'Category 2',
|
||||
Search::Twitter::CATEGORY_TERMS_KEY => '(aaa OR bbb) (has:geo OR has:profile_geo)'
|
||||
}
|
||||
]
|
||||
|
||||
output = twitter_datasource.send :build_queries_from_fields, input_terms
|
||||
|
||||
output.should eq expected_output_terms
|
||||
end
|
||||
|
||||
it 'tests search term cut if too many' do
|
||||
user_mock = CartoDB::Datasources::Doubles::User.new
|
||||
twitter_datasource = Search::Twitter.get_new(get_config, user_mock)
|
||||
|
||||
input_terms = {
|
||||
categories: [
|
||||
{
|
||||
category: 'Category 1',
|
||||
terms: Array(1..35)
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
expected_output_terms = [
|
||||
{
|
||||
Search::Twitter::CATEGORY_NAME_KEY => 'Category 1',
|
||||
Search::Twitter::CATEGORY_TERMS_KEY => '(1 OR 2 OR 3 OR 4 OR 5 OR 6 OR 7 OR 8 OR 9 OR 10 OR 11 OR 12 OR 13 OR 14 OR 15 OR 16 OR 17 OR 18 OR 19 OR 20 OR 21 OR 22 OR 23 OR 24 OR 25 OR 26 OR 27 OR 28 OR 29) (has:geo OR has:profile_geo)'
|
||||
},
|
||||
]
|
||||
|
||||
output = twitter_datasource.send :build_queries_from_fields, input_terms
|
||||
output.should eq expected_output_terms
|
||||
end
|
||||
|
||||
it 'tests search term cut if too big (even if amount is ok)' do
|
||||
user_mock = CartoDB::Datasources::Doubles::User.new
|
||||
twitter_datasource = Search::Twitter.get_new(get_config, user_mock)
|
||||
|
||||
input_terms = {
|
||||
categories: [
|
||||
{
|
||||
category: 'Category 1',
|
||||
terms: ['wadus1', 'wadus2', 'wadus3' * 500]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
expect {
|
||||
output = twitter_datasource.send :build_queries_from_fields, input_terms
|
||||
|
||||
}.to raise_error ParameterError
|
||||
end
|
||||
|
||||
|
||||
it 'tests date filters' do
|
||||
user_mock = CartoDB::Datasources::Doubles::User.new
|
||||
twitter_datasource = Search::Twitter.get_new(get_config, user_mock)
|
||||
|
||||
input_dates = dates_fixture
|
||||
|
||||
output = twitter_datasource.send :build_date_from_fields, input_dates, 'from'
|
||||
output.should eq '201403031349'
|
||||
|
||||
output = twitter_datasource.send :build_date_from_fields, input_dates, 'to'
|
||||
output.should eq '201403041159'
|
||||
|
||||
expect {
|
||||
twitter_datasource.send :build_date_from_fields, input_dates, 'wadus'
|
||||
}.to raise_error ParameterError
|
||||
|
||||
|
||||
current_time = Time.now.utc
|
||||
output = twitter_datasource.send :build_date_from_fields, {
|
||||
dates: {
|
||||
toDate: current_time.strftime("%Y-%m-%d"),
|
||||
toHour: current_time.hour + 1, # Set into the future
|
||||
toMin: current_time.min
|
||||
}
|
||||
}, 'to'
|
||||
output.should eq nil
|
||||
|
||||
end
|
||||
|
||||
it 'tests twitter search integration (without conversion to CSV)' do
|
||||
# This test bridges lots of internal calls to simulate only up until twitter search call and results
|
||||
user_mock = CartoDB::Datasources::Doubles::User.new
|
||||
twitter_datasource = Search::Twitter.get_new(get_config, user_mock)
|
||||
|
||||
input_terms = terms_fixture
|
||||
input_dates = dates_fixture
|
||||
|
||||
Typhoeus.stub(/fakeurl\.carto/) do |request|
|
||||
accept = (request.options[:headers]||{})['Accept'] || 'application/json'
|
||||
format = accept.split(',').first
|
||||
|
||||
if request.options[:params][:next].nil?
|
||||
body = data_from_file('sample_tweets.json')
|
||||
else
|
||||
body = data_from_file('sample_tweets_2.json')
|
||||
end
|
||||
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => format },
|
||||
body: body
|
||||
)
|
||||
end
|
||||
|
||||
twitter_api_config = twitter_datasource.send :search_api_config
|
||||
twitter_api = CartoDB::TwitterSearch::SearchAPI.new(twitter_api_config)
|
||||
|
||||
fields = {
|
||||
categories: input_terms[:categories],
|
||||
dates: input_dates[:dates]
|
||||
}
|
||||
filters = {
|
||||
Search::Twitter::FILTER_CATEGORIES => (twitter_datasource.send :build_queries_from_fields, fields),
|
||||
Search::Twitter::FILTER_FROMDATE => (twitter_datasource.send :build_date_from_fields, fields, 'from'),
|
||||
Search::Twitter::FILTER_TODATE => (twitter_datasource.send :build_date_from_fields, fields, 'to'),
|
||||
Search::Twitter::FILTER_MAXRESULTS => 500,
|
||||
Search::Twitter::FILTER_TOTAL_RESULTS => Search::Twitter::NO_TOTAL_RESULTS
|
||||
}
|
||||
|
||||
category = {
|
||||
name: input_terms[:categories].first[:category],
|
||||
terms: input_terms[:categories].first[:terms],
|
||||
}
|
||||
csv_dumper = twitter_datasource.send :csv_dumper
|
||||
csv_dumper.begin_dump(input_terms[:categories][0][:category])
|
||||
csv_dumper.begin_dump(input_terms[:categories][1][:category])
|
||||
csv_dumper.additional_fields = { category[:name] => category }
|
||||
|
||||
output = twitter_datasource.send :search_by_category, twitter_api, filters, category
|
||||
|
||||
# 2 pages of 10 results per category search
|
||||
output.should eq 20
|
||||
|
||||
csv_dumper.send :destroy_files
|
||||
end
|
||||
|
||||
it 'tests stopping search if runs out of quota' do
|
||||
# Should equal to sample_tweets_3.json number of results, and always >= 10 (because is Gnip's minimum)
|
||||
remaining_tweets_quota = 11
|
||||
|
||||
user_mock = CartoDB::Datasources::Doubles::User.new(
|
||||
twitter_datasource_quota: remaining_tweets_quota
|
||||
)
|
||||
twitter_datasource = Search::Twitter.get_new(get_config, user_mock)
|
||||
|
||||
input_terms = terms_fixture
|
||||
input_dates = dates_fixture
|
||||
|
||||
Typhoeus.stub(/fakeurl\.carto/) do |request|
|
||||
accept = (request.options[:headers]||{})['Accept'] || 'application/json'
|
||||
format = accept.split(',').first
|
||||
|
||||
if request.options[:params][:next].nil?
|
||||
# This dataset has 11 items and a "next"
|
||||
body = data_from_file('sample_tweets_3.json')
|
||||
else
|
||||
body = data_from_file('sample_tweets_2.json')
|
||||
end
|
||||
|
||||
Typhoeus::Response.new(
|
||||
code: 200,
|
||||
headers: { 'Content-Type' => format },
|
||||
body: body
|
||||
)
|
||||
end
|
||||
|
||||
twitter_api_config = twitter_datasource.send :search_api_config
|
||||
twitter_api = CartoDB::TwitterSearch::SearchAPI.new(twitter_api_config)
|
||||
|
||||
fields = {
|
||||
categories: input_terms[:categories],
|
||||
dates: input_dates[:dates]
|
||||
}
|
||||
filters = {
|
||||
Search::Twitter::FILTER_CATEGORIES => (twitter_datasource.send :build_queries_from_fields, fields),
|
||||
Search::Twitter::FILTER_FROMDATE => (twitter_datasource.send :build_date_from_fields, fields, 'from'),
|
||||
Search::Twitter::FILTER_TODATE => (twitter_datasource.send :build_date_from_fields, fields, 'to'),
|
||||
Search::Twitter::FILTER_MAXRESULTS => 500,
|
||||
Search::Twitter::FILTER_TOTAL_RESULTS => Search::Twitter::NO_TOTAL_RESULTS
|
||||
}
|
||||
|
||||
category = {
|
||||
name: input_terms[:categories].first[:category],
|
||||
terms: input_terms[:categories].first[:terms],
|
||||
}
|
||||
csv_dumper = twitter_datasource.send :csv_dumper
|
||||
csv_dumper.begin_dump(input_terms[:categories][0][:category])
|
||||
csv_dumper.begin_dump(input_terms[:categories][1][:category])
|
||||
csv_dumper.additional_fields = { category[:name] => category }
|
||||
|
||||
output = twitter_datasource.send :search_by_category, twitter_api, filters, category
|
||||
|
||||
output.should eq remaining_tweets_quota
|
||||
|
||||
csv_dumper.send :destroy_files
|
||||
end
|
||||
|
||||
it 'tests user limits on datasource usage' do
|
||||
user_mock = CartoDB::Datasources::Doubles::User.new
|
||||
twitter_datasource = Search::Twitter.get_new(get_config, user_mock)
|
||||
|
||||
# Service enabled tests
|
||||
result = twitter_datasource.send :is_service_enabled?, CartoDB::Datasources::Doubles::User.new({
|
||||
has_org: true,
|
||||
twitter_datasource_enabled: true,
|
||||
org_twitter_datasource_enabled: true
|
||||
})
|
||||
result.should eq true
|
||||
|
||||
result = twitter_datasource.send :is_service_enabled?, CartoDB::Datasources::Doubles::User.new({
|
||||
has_org: true,
|
||||
twitter_datasource_enabled: false,
|
||||
org_twitter_datasource_enabled: true
|
||||
})
|
||||
result.should eq false
|
||||
|
||||
result = twitter_datasource.send :is_service_enabled?, CartoDB::Datasources::Doubles::User.new({
|
||||
twitter_datasource_enabled: true,
|
||||
})
|
||||
result.should eq true
|
||||
|
||||
result = twitter_datasource.send :is_service_enabled?, CartoDB::Datasources::Doubles::User.new({
|
||||
twitter_datasource_enabled: false,
|
||||
})
|
||||
result.should eq false
|
||||
|
||||
# Quota & soft limit tests
|
||||
result = twitter_datasource.send :has_enough_quota?, CartoDB::Datasources::Doubles::User.new({
|
||||
soft_twitter_datasource_limit: false,
|
||||
twitter_datasource_quota: 10,
|
||||
})
|
||||
result.should eq true
|
||||
|
||||
result = twitter_datasource.send :has_enough_quota?, CartoDB::Datasources::Doubles::User.new({
|
||||
soft_twitter_datasource_limit: true,
|
||||
twitter_datasource_quota: 0,
|
||||
})
|
||||
result.should eq true
|
||||
|
||||
result = twitter_datasource.send :has_enough_quota?, CartoDB::Datasources::Doubles::User.new({
|
||||
soft_twitter_datasource_limit: false,
|
||||
twitter_datasource_quota: 0,
|
||||
})
|
||||
result.should eq false
|
||||
end
|
||||
|
||||
it 'checks terms sanitize method' do
|
||||
user_mock = CartoDB::Datasources::Doubles::User.new
|
||||
twitter_datasource = Search::Twitter.get_new(get_config, user_mock)
|
||||
|
||||
terms = [ 'a', ' b', 'c ', ' d ', ' e f', 'g h ', ' i j ', ' 1 2 3 4 ', ' ' ]
|
||||
terms_expected = [ 'a', 'b', 'c', 'd', '"e f"', '"g h"', '"i j"', '"1 2 3 4"' ]
|
||||
|
||||
result = twitter_datasource.send :sanitize_terms, terms
|
||||
result.should eq terms_expected
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def terms_fixture
|
||||
{
|
||||
categories: [
|
||||
{
|
||||
category: 'Category 1',
|
||||
terms: ['uno', '@dos', '#tres']
|
||||
},
|
||||
{
|
||||
category: 'Category 2',
|
||||
terms: ['aaa', 'bbb']
|
||||
}
|
||||
]
|
||||
}
|
||||
end
|
||||
|
||||
def dates_fixture
|
||||
{
|
||||
dates: {
|
||||
fromDate: '2014-03-03',
|
||||
fromHour: '13',
|
||||
fromMin: '49',
|
||||
toDate: '2014-03-04',
|
||||
toHour: '11',
|
||||
toMin: '59'
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
def data_from_file(filename, fullpath=false)
|
||||
if fullpath
|
||||
File.read(filename)
|
||||
else
|
||||
File.read(File.join(File.dirname(__FILE__), "../fixtures/#{filename}"))
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user