Skip to content

Instantly share code, notes, and snippets.

@igorlima
Last active August 29, 2015 14:16
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save igorlima/b31f1a26a5b100186a98 to your computer and use it in GitHub Desktop.
Save igorlima/b31f1a26a5b100186a98 to your computer and use it in GitHub Desktop.
JS unit testing using dependency injection

Gittip Donate Button

JS unit testing using dependency injection

You probably know that to do JavaScript testing is good and some hurdles to overcome is how to test our code in a manner to (i) inject mocks for other modules, (ii) to leak private variables or (iii) override variables within the module.

rewire is a tool for helping us on overcoming these hurdles. It provides us an easy way to dependency injection for unit testing and adds a special setter and getter to modules so we can modify their behaviour for better unit testing. What rewire does is to not load the file and eval the contents to emulate the load mechanism.

To get started with dependency injection, we'll create a twitter rest api server and do unit tests using mocks and overriding variables within modules. This example will focus on back-end unit testing but if you want to use rewire also on the client-side take a look at client-side bundlers.

An example

This example is a public HTTP API to retrieve Twitter user timelines. It has basically two files: server.js and twitter.js.

The first file creates an basic instance of express and defines a route for a GET request method, which is /twitter/timeline/:user.

The second one is a module responsible for retrieving data from Twitter. It requires:

  • twit: Twitter API Client for node
  • async: is a utility module which provides straight-forward, powerful functions for working with asynchronous JavaScript
  • moment: a lightweight JavaScript date library for parsing, validating, manipulating, and formatting dates.

Part of these modules will be mocked and overridden in our tests.

Running the example

This example is already running in a cloud. So you can reach the urls below and see it working:

To run it locally, clone this gist by git clone https://gist.github.com/b31f1a26a5b100186a98.git twitter-rest-api-server and set five environment variables. Those envs are listed below. For secure reason I won't share my token. To get yours, access Twitter developer documentation, create a new app and set up your credentials.

For Mac users, you can simply type:

export TwitterConsumerKey="xxxx"
export TwitterConsumerSecret="xxxx"
export TwitterAccessToken="xxxx"
export TwitterAccessTokenSecret="xxxx"
export MomentLang="pt-br"

For Windows users, do:

SET TwitterConsumerKey="xxxx"
SET TwitterConsumerSecret="xxxx"
SET TwitterAccessToken="xxxx"
SET TwitterAccessTokenSecret="xxxx"
SET MomentLang="pt-br"

After setting up the environment variables, go to twitter-rest-api-server folder, install all node dependencies by npm install, then run via terminal node server.js. It should be available at the port 5000. Go to your browser and reach http://localhost:5000/twitter/timeline/igorribeirolima.

running express app example locally

Writing unit tests

Mocha is the JavaScript test framework running we gonna use. It makes asynchronous testing simple and fun. Mocha allows you to use any assertion library you want, if it throws an error, it will work! In this example we are gonna utilize node's regular assert module.

Imagine you want to test this code twitter.js:

var Twit   = require('twit'),
    async  = require('async'),
    moment = require('moment'),
    T      = new Twit({
      consumer_key: process.env.TwitterConsumerKey || '...',
      consumer_secret: process.env.TwitterConsumerSecret || '...',
      access_token: process.env.TwitterAccessToken || '...',
      access_token_secret: process.env.TwitterAccessTokenSecret || '...'
    }),
    
    mapReducingTweets = function(tweet, callback) {
      callback(null, simplify(tweet));
    },

    simplify = function(tweet) {
      var date = moment(tweet.created_at, "ddd MMM DD HH:mm:ss zz YYYY");
      date.lang( process.env.MomentLang );
      return {
        date: date.format('MMMM Do YYYY, h:mm:ss a'),
        id: tweet.id,
        user: {
          id: tweet.user.id
        },
        tweet: tweet.text
      };
    };

module.exports = function(username, callback) {
  T.get("statuses/user_timeline", {
    screen_name: username,
    count: 25
  }, function(err, tweets) {
    if (err) callback(err);
    else async.map(tweets, mapReducingTweets, function(err, simplified_tweets) {
      callback(null, simplified_tweets);
    });
  })
};

To do that in a easy and fun way, let load this module using rewire. So within your test module twitter-spec.js:

var rewire  = require('rewire'),
    assert  = require('assert'),
    twitter = rewire('./twitter.js'),
    mock    = require('./twitter-spec-mock-data.js');

rewire acts exactly like require. Just with one difference: Your module will now export a special setter and getter for private variables.

myModule.__set__("path", "/dev/null");
myModule.__get__("path"); // = '/dev/null'

This allows you to mock everything in the top-level scope of the module, like the twitter module for example. Just pass the variable name as first parameter and your mock as second.

You may also override globals. These changes are only within the module, so you don't have to be concerned that other modules are influenced by your mock.

describe('twitter module', function(){

  describe('simplify function', function(){
    var simplify;
   
    before(function() {
      simplify = twitter.__get__('simplify');
    });

    it('should be defined', function(){
      assert.ok(simplify);
    });

    describe('simplify a tweet', function(){
      var tweet, mock;
     
      before(function() {
        mock = mocks[0];
        tweet = simplify(mock);
      });

      it('should have 4 properties', function() {
        assert.equal( Object.keys(tweet).length, 4 );
      });

      describe('format dates as `MMMM Do YYYY, h:mm:ss a`', function() {

        describe('English format', function() {
          before(function() {
            revert = twitter.__set__('process.env.MomentLang', 'en');
            tweet = simplify(mock);
          });

          it('should be `March 6th 2015, 2:29:13 am`', function() {
            assert.equal(tweet.date, 'March 6th 2015, 2:29:13 am');
          });

          after(function(){
            revert();
          });

        });

        describe('Brazilian format', function() {
          before(function() {
            revert = twitter.__set__('process.env.MomentLang', 'pt-br');
            tweet = simplify(mock);
          });

          it('should be `Março 6º 2015, 2:29:13 am`', function() {
            assert.equal(tweet.date, 'Março 6º 2015, 2:29:13 am');
          });

          after(function(){
            revert();
          });
          
        });

      });

    });

  });
  
  describe('retrieve timeline feed', function() {
    var revert;
    before(function() {
      revert = twitter.__set__("T.get", function( api, query, callback ) {
        callback( null, mocks);
      });
    });

    describe('igorribeirolima timeline', function() {
      var tweets;
      before(function(done){
        twitter('igorribeirolima', function(err, data) {
          tweets = data;
          done();
        });
      });

      it('should have 19 tweets', function() {
        assert.equal(tweets.length, 19);
      });

    });

    after(function() {
      revert();
    });

   });
});

__set__ returns a function which reverts the changes introduced by this particular __set__ call.

Running unit tests

Before we get into the test and walk through it, let install mocha CLI by npm install -g mocha. It will support us on running our tests just typing mocha twitter-spec.js. The following is an image that illustrates the test result.

image that ilustrates unit tests running

Take a look on this video and see step by step in detail everything discussed so far.

Conclusion

As you can see it's not painful on overcoming hurdles like (i) injecting mocks for other modules, (ii) leaking private variables or (iii) overriding variables within the module. That's it folks. Hope you catch the idea on how simple and fun is to do dependency injection for unit testing. Thanks for reading.

{
"name": "twitter-rest-api",
"version": "0.0.0",
"dependencies": {
"connect": "2.9.0",
"express": "~3.4.7",
"twit": "~1.1.11",
"async": "~0.2.9",
"moment": "~2.5.1",
"rewire": "2.3.1"
},
"engines": {
"node": ">=0.10.25"
}
}
var express = require('express'),
tweets = require('./twitter.js'),
response = function(req, res, err, data) {
if (req.query.callback) {
res.jsonp(err || data);
} else {
res.json(err || data);
}
};
var app = express()
.use(express.static(__dirname + './'))
.get('/twitter/timeline/:user', function(req, res) {
tweets(req.params.user, function(err, data) {
response(req, res, err, data);
});
})
.listen(process.env.PORT || 5000);
module.exports = [
{
"created_at": "Fri Mar 06 02:29:13 +0000 2015",
"id": 573671644562079740,
"id_str": "573671644562079744",
"text": "RT @TweetSmarter: Explain please… http://t.co/EjoXG50jfM",
"source": "<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 16436464,
"id_str": "16436464",
"name": "Martha Gabriel",
"screen_name": "marthagabriel",
"location": "São Paulo, Brazil",
"profile_location": null,
"description": "Experiencing Life ;-) Best seller author, MBA professor and consultant in Marketing, Innovation & Education. Keynote & awarded speaker, 4 TEDx, PhD.",
"url": "http://t.co/NQ07sWjCRA",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/NQ07sWjCRA",
"expanded_url": "http://www.martha.com.br",
"display_url": "martha.com.br",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 50977,
"friends_count": 308,
"listed_count": 1990,
"created_at": "Wed Sep 24 16:19:23 +0000 2008",
"favourites_count": 10006,
"utc_offset": -10800,
"time_zone": "Brasilia",
"geo_enabled": true,
"verified": false,
"statuses_count": 25473,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "666666",
"profile_background_image_url": "http://pbs.twimg.com/profile_background_images/665744661/c13ca3eb52467a18cd3f748d3852479a.png",
"profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/665744661/c13ca3eb52467a18cd3f748d3852479a.png",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/1766554716/martha-gabriel-avatar-twitter-2012_normal.jpg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/1766554716/martha-gabriel-avatar-twitter-2012_normal.jpg",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/16436464/1398558789",
"profile_link_color": "E67512",
"profile_sidebar_border_color": "FFFFFF",
"profile_sidebar_fill_color": "A0C5C7",
"profile_text_color": "000000",
"profile_use_background_image": false,
"default_profile": false,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweeted_status": {
"created_at": "Fri Mar 06 01:27:46 +0000 2015",
"id": 573656183149453300,
"id_str": "573656183149453312",
"text": "Explain please… http://t.co/EjoXG50jfM",
"source": "<a href=\"http://twitter.com\" rel=\"nofollow\">Twitter Web Client</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 15947185,
"id_str": "15947185",
"name": "TweetSmarter",
"screen_name": "TweetSmarter",
"location": "Minnesota, USA",
"profile_location": null,
"description": "Now in our 8th year helping everyone get the most out of #Twitter and #SocialMedia. Tweet us anytime! Tips, tools, Twitter news and tech support for everyone.",
"url": "http://t.co/hgnDW3vif6",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/hgnDW3vif6",
"expanded_url": "http://bit.ly/WhoIsTweetSmarter",
"display_url": "bit.ly/WhoIsTweetSmar…",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 398852,
"friends_count": 144459,
"listed_count": 18305,
"created_at": "Fri Aug 22 16:55:46 +0000 2008",
"favourites_count": 1888,
"utc_offset": -21600,
"time_zone": "Central Time (US & Canada)",
"geo_enabled": true,
"verified": false,
"statuses_count": 116555,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "B8D6BF",
"profile_background_image_url": "http://pbs.twimg.com/profile_background_images/314137004/temp_kuvva_restore_production_6262_1.png",
"profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/314137004/temp_kuvva_restore_production_6262_1.png",
"profile_background_tile": true,
"profile_image_url": "http://pbs.twimg.com/profile_images/572226162508570624/z308_Hpd_normal.jpeg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/572226162508570624/z308_Hpd_normal.jpeg",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/15947185/1398475198",
"profile_link_color": "2562FD",
"profile_sidebar_border_color": "FFFFFF",
"profile_sidebar_fill_color": "DDEEF6",
"profile_text_color": "1C1200",
"profile_use_background_image": true,
"default_profile": false,
"default_profile_image": false,
"following": false,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": {
"id": "8e9665cec9370f0f",
"url": "https://api.twitter.com/1.1/geo/id/8e9665cec9370f0f.json",
"place_type": "city",
"name": "Minneapolis",
"full_name": "Minneapolis, MN",
"country_code": "US",
"country": "United States",
"contained_within": [],
"bounding_box": {
"type": "Polygon",
"coordinates": [
[
[
-93.329148,
44.889964
],
[
-93.194578,
44.889964
],
[
-93.194578,
45.051257
],
[
-93.329148,
45.051257
]
]
]
},
"attributes": {}
},
"contributors": null,
"retweet_count": 5,
"favorite_count": 7,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [],
"urls": [],
"media": [
{
"id": 573656182415487000,
"id_str": "573656182415486976",
"indices": [
16,
38
],
"media_url": "http://pbs.twimg.com/tweet_video_thumb/B_YJQjAU8AAb9Ic.png",
"media_url_https": "https://pbs.twimg.com/tweet_video_thumb/B_YJQjAU8AAb9Ic.png",
"url": "http://t.co/EjoXG50jfM",
"display_url": "pic.twitter.com/EjoXG50jfM",
"expanded_url": "http://twitter.com/TweetSmarter/status/573656183149453312/photo/1",
"type": "photo",
"sizes": {
"large": {
"w": 480,
"h": 240,
"resize": "fit"
},
"thumb": {
"w": 150,
"h": 150,
"resize": "crop"
},
"small": {
"w": 340,
"h": 170,
"resize": "fit"
},
"medium": {
"w": 480,
"h": 240,
"resize": "fit"
}
}
}
]
},
"extended_entities": {
"media": [
{
"id": 573656182415487000,
"id_str": "573656182415486976",
"indices": [
16,
38
],
"media_url": "http://pbs.twimg.com/tweet_video_thumb/B_YJQjAU8AAb9Ic.png",
"media_url_https": "https://pbs.twimg.com/tweet_video_thumb/B_YJQjAU8AAb9Ic.png",
"url": "http://t.co/EjoXG50jfM",
"display_url": "pic.twitter.com/EjoXG50jfM",
"expanded_url": "http://twitter.com/TweetSmarter/status/573656183149453312/photo/1",
"type": "animated_gif",
"sizes": {
"large": {
"w": 480,
"h": 240,
"resize": "fit"
},
"thumb": {
"w": 150,
"h": 150,
"resize": "crop"
},
"small": {
"w": 340,
"h": 170,
"resize": "fit"
},
"medium": {
"w": 480,
"h": 240,
"resize": "fit"
}
},
"video_info": {
"aspect_ratio": [
2,
1
],
"variants": [
{
"bitrate": 0,
"content_type": "video/mp4",
"url": "https://pbs.twimg.com/tweet_video/B_YJQjAU8AAb9Ic.mp4"
}
]
}
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "en"
},
"retweet_count": 5,
"favorite_count": 0,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [
{
"screen_name": "TweetSmarter",
"name": "TweetSmarter",
"id": 15947185,
"id_str": "15947185",
"indices": [
3,
16
]
}
],
"urls": [],
"media": [
{
"id": 573656182415487000,
"id_str": "573656182415486976",
"indices": [
34,
56
],
"media_url": "http://pbs.twimg.com/tweet_video_thumb/B_YJQjAU8AAb9Ic.png",
"media_url_https": "https://pbs.twimg.com/tweet_video_thumb/B_YJQjAU8AAb9Ic.png",
"url": "http://t.co/EjoXG50jfM",
"display_url": "pic.twitter.com/EjoXG50jfM",
"expanded_url": "http://twitter.com/TweetSmarter/status/573656183149453312/photo/1",
"type": "photo",
"sizes": {
"large": {
"w": 480,
"h": 240,
"resize": "fit"
},
"thumb": {
"w": 150,
"h": 150,
"resize": "crop"
},
"small": {
"w": 340,
"h": 170,
"resize": "fit"
},
"medium": {
"w": 480,
"h": 240,
"resize": "fit"
}
},
"source_status_id": 573656183149453300,
"source_status_id_str": "573656183149453312",
"source_user_id": 15947185,
"source_user_id_str": "15947185"
}
]
},
"extended_entities": {
"media": [
{
"id": 573656182415487000,
"id_str": "573656182415486976",
"indices": [
34,
56
],
"media_url": "http://pbs.twimg.com/tweet_video_thumb/B_YJQjAU8AAb9Ic.png",
"media_url_https": "https://pbs.twimg.com/tweet_video_thumb/B_YJQjAU8AAb9Ic.png",
"url": "http://t.co/EjoXG50jfM",
"display_url": "pic.twitter.com/EjoXG50jfM",
"expanded_url": "http://twitter.com/TweetSmarter/status/573656183149453312/photo/1",
"type": "animated_gif",
"sizes": {
"large": {
"w": 480,
"h": 240,
"resize": "fit"
},
"thumb": {
"w": 150,
"h": 150,
"resize": "crop"
},
"small": {
"w": 340,
"h": 170,
"resize": "fit"
},
"medium": {
"w": 480,
"h": 240,
"resize": "fit"
}
},
"source_status_id": 573656183149453300,
"source_status_id_str": "573656183149453312",
"source_user_id": 15947185,
"source_user_id_str": "15947185",
"video_info": {
"aspect_ratio": [
2,
1
],
"variants": [
{
"bitrate": 0,
"content_type": "video/mp4",
"url": "https://pbs.twimg.com/tweet_video/B_YJQjAU8AAb9Ic.mp4"
}
]
}
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "en"
},
{
"created_at": "Fri Mar 06 02:22:11 +0000 2015",
"id": 573669877375877100,
"id_str": "573669877375877121",
"text": "Hard work, odd coincidences, fortuitous timing, personal networks—and dumb luck. “How They Got There” #design @khoi http://t.co/dYLwH9gJhK",
"source": "<a href=\"https://about.twitter.com/products/tweetdeck\" rel=\"nofollow\">TweetDeck</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 61133,
"id_str": "61133",
"name": "Jeffrey Zeldman",
"screen_name": "zeldman",
"location": "New York, NY",
"profile_location": null,
"description": "Founder, Happy Cog studios. Author, Designing With Web Standards. Publisher, A List Apart, A Book Apart. Co-founder, An Event Apart. Host, Big Web Show.",
"url": "http://t.co/DTN2fH5Q7F",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/DTN2fH5Q7F",
"expanded_url": "http://www.zeldman.com/",
"display_url": "zeldman.com",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 337837,
"friends_count": 2833,
"listed_count": 10812,
"created_at": "Tue Dec 12 17:11:41 +0000 2006",
"favourites_count": 26579,
"utc_offset": -18000,
"time_zone": "Eastern Time (US & Canada)",
"geo_enabled": true,
"verified": true,
"statuses_count": 39702,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "FFFFFF",
"profile_background_image_url": "http://pbs.twimg.com/profile_background_images/668422421/92c825dcac4081c34500cf2109158de9.png",
"profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/668422421/92c825dcac4081c34500cf2109158de9.png",
"profile_background_tile": true,
"profile_image_url": "http://pbs.twimg.com/profile_images/556907824723161088/6pEAR3vw_normal.jpeg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/556907824723161088/6pEAR3vw_normal.jpeg",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/61133/1421612609",
"profile_link_color": "CC0033",
"profile_sidebar_border_color": "FFFFFF",
"profile_sidebar_fill_color": "FF6600",
"profile_text_color": "000000",
"profile_use_background_image": false,
"default_profile": false,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweet_count": 3,
"favorite_count": 5,
"entities": {
"hashtags": [
{
"text": "design",
"indices": [
102,
109
]
}
],
"symbols": [],
"user_mentions": [
{
"screen_name": "khoi",
"name": "Khoi Vinh",
"id": 78453,
"id_str": "78453",
"indices": [
110,
115
]
}
],
"urls": [
{
"url": "http://t.co/dYLwH9gJhK",
"expanded_url": "http://howtheygotthere.us",
"display_url": "howtheygotthere.us",
"indices": [
116,
138
]
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "en"
},
{
"created_at": "Fri Mar 06 02:15:22 +0000 2015",
"id": 573668159464538100,
"id_str": "573668159464538112",
"text": "Words We Love Too Much http://t.co/eNINsyBJMw #grammarstuff #feedly",
"source": "<a href=\"http://www.hootsuite.com\" rel=\"nofollow\">Hootsuite</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 84136684,
"id_str": "84136684",
"name": "Pronuncian",
"screen_name": "pronuncian",
"location": "Seattle",
"profile_location": null,
"description": "American English pronunciation lessons, podcasts, news, and other interesting English bits.",
"url": "http://t.co/pe38XIyEzu",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/pe38XIyEzu",
"expanded_url": "http://www.pronuncian.com",
"display_url": "pronuncian.com",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 2175,
"friends_count": 89,
"listed_count": 96,
"created_at": "Wed Oct 21 19:04:06 +0000 2009",
"favourites_count": 35,
"utc_offset": -28800,
"time_zone": "Pacific Time (US & Canada)",
"geo_enabled": false,
"verified": false,
"statuses_count": 2162,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "1EA4C0",
"profile_background_image_url": "http://pbs.twimg.com/profile_background_images/378800000108604168/f89ff292247b64b7ed6a528daf7b3cb8.jpeg",
"profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/378800000108604168/f89ff292247b64b7ed6a528daf7b3cb8.jpeg",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/821520382/logo_small_normal.gif",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/821520382/logo_small_normal.gif",
"profile_link_color": "0084B4",
"profile_sidebar_border_color": "FFFFFF",
"profile_sidebar_fill_color": "DDEEF6",
"profile_text_color": "333333",
"profile_use_background_image": true,
"default_profile": false,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweet_count": 0,
"favorite_count": 1,
"entities": {
"hashtags": [
{
"text": "grammarstuff",
"indices": [
46,
59
]
},
{
"text": "feedly",
"indices": [
60,
67
]
}
],
"symbols": [],
"user_mentions": [],
"urls": [
{
"url": "http://t.co/eNINsyBJMw",
"expanded_url": "http://afterdeadline.blogs.nytimes.com/2015/03/03/words-we-love-too-much-15/",
"display_url": "afterdeadline.blogs.nytimes.com/2015/03/03/wor…",
"indices": [
23,
45
]
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "en"
},
{
"created_at": "Fri Mar 06 02:14:10 +0000 2015",
"id": 573667860205060100,
"id_str": "573667860205060096",
"text": "RT @briantford: Angular is in a great place to help foster diversity in the open source world, says @judytuna #ngconf http://t.co/NCA4QbOSjt",
"source": "<a href=\"http://twitter.com/download/android\" rel=\"nofollow\">Twitter for Android</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 16604718,
"id_str": "16604718",
"name": "Brad Green",
"screen_name": "bradlygreen",
"location": "Mountain View, CA",
"profile_location": null,
"description": "I work at Google where I manage AngularJS and Google's internal sales productivity applications. I'm a dad.",
"url": "http://t.co/spxfRmI7Pw",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/spxfRmI7Pw",
"expanded_url": "http://google.com/+BradGreen",
"display_url": "google.com/+BradGreen",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 11308,
"friends_count": 175,
"listed_count": 530,
"created_at": "Sun Oct 05 19:23:12 +0000 2008",
"favourites_count": 1517,
"utc_offset": -28800,
"time_zone": "Pacific Time (US & Canada)",
"geo_enabled": true,
"verified": false,
"statuses_count": 2441,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "308EBA",
"profile_background_image_url": "http://pbs.twimg.com/profile_background_images/378800000120361082/ea22a975d89accbb6bf7ca0b352e1f7d.png",
"profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/378800000120361082/ea22a975d89accbb6bf7ca0b352e1f7d.png",
"profile_background_tile": true,
"profile_image_url": "http://pbs.twimg.com/profile_images/2344189796/o5u8bz6cep1bfkasvsm1_normal.jpeg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/2344189796/o5u8bz6cep1bfkasvsm1_normal.jpeg",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/16604718/1398364530",
"profile_link_color": "0084B4",
"profile_sidebar_border_color": "FFFFFF",
"profile_sidebar_fill_color": "DDEEF6",
"profile_text_color": "333333",
"profile_use_background_image": true,
"default_profile": false,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweeted_status": {
"created_at": "Thu Mar 05 21:16:21 +0000 2015",
"id": 573592910953779200,
"id_str": "573592910953779200",
"text": "Angular is in a great place to help foster diversity in the open source world, says @judytuna #ngconf http://t.co/NCA4QbOSjt",
"source": "<a href=\"http://twitter.com/download/android\" rel=\"nofollow\">Twitter for Android</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 290864535,
"id_str": "290864535",
"name": "Brian Ford ",
"screen_name": "briantford",
"location": "San Francisco",
"profile_location": null,
"description": "@angularjs at @google ✨ javascript mystic ✨ the most millennial person in the room",
"url": "http://t.co/H4yEfDYOjh",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/H4yEfDYOjh",
"expanded_url": "http://briantford.com",
"display_url": "briantford.com",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 9301,
"friends_count": 691,
"listed_count": 480,
"created_at": "Sun May 01 02:30:04 +0000 2011",
"favourites_count": 6385,
"utc_offset": -28800,
"time_zone": "Pacific Time (US & Canada)",
"geo_enabled": true,
"verified": false,
"statuses_count": 7115,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "FEFEFE",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme14/bg.gif",
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme14/bg.gif",
"profile_background_tile": true,
"profile_image_url": "http://pbs.twimg.com/profile_images/561959487872200705/Do-3xJ0U_normal.jpeg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/561959487872200705/Do-3xJ0U_normal.jpeg",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/290864535/1424285509",
"profile_link_color": "444444",
"profile_sidebar_border_color": "FFFFFF",
"profile_sidebar_fill_color": "EFEFEF",
"profile_text_color": "333333",
"profile_use_background_image": true,
"default_profile": false,
"default_profile_image": false,
"following": false,
"follow_request_sent": false,
"notifications": false
},
"geo": {
"type": "Point",
"coordinates": [
40.7581107,
-111.891409
]
},
"coordinates": {
"type": "Point",
"coordinates": [
-111.891409,
40.7581107
]
},
"place": {
"id": "bd7c511e9f8bc5da",
"url": "https://api.twitter.com/1.1/geo/id/bd7c511e9f8bc5da.json",
"place_type": "city",
"name": "Salt Lake City",
"full_name": "Salt Lake City, UT",
"country_code": "US",
"country": "United States",
"contained_within": [],
"bounding_box": {
"type": "Polygon",
"coordinates": [
[
[
-112.0383105,
40.6998952
],
[
-111.795741,
40.6998952
],
[
-111.795741,
40.8317151
],
[
-112.0383105,
40.8317151
]
]
]
},
"attributes": {}
},
"contributors": null,
"retweet_count": 12,
"favorite_count": 17,
"entities": {
"hashtags": [
{
"text": "ngconf",
"indices": [
94,
101
]
}
],
"symbols": [],
"user_mentions": [
{
"screen_name": "judytuna",
"name": "judytuna",
"id": 759694,
"id_str": "759694",
"indices": [
84,
93
]
}
],
"urls": [],
"media": [
{
"id": 573592905383723000,
"id_str": "573592905383723008",
"indices": [
102,
124
],
"media_url": "http://pbs.twimg.com/media/B_XPtVsUwAAU9f2.jpg",
"media_url_https": "https://pbs.twimg.com/media/B_XPtVsUwAAU9f2.jpg",
"url": "http://t.co/NCA4QbOSjt",
"display_url": "pic.twitter.com/NCA4QbOSjt",
"expanded_url": "http://twitter.com/briantford/status/573592910953779200/photo/1",
"type": "photo",
"sizes": {
"small": {
"w": 340,
"h": 340,
"resize": "fit"
},
"thumb": {
"w": 150,
"h": 150,
"resize": "crop"
},
"medium": {
"w": 600,
"h": 600,
"resize": "fit"
},
"large": {
"w": 1024,
"h": 1024,
"resize": "fit"
}
}
}
]
},
"extended_entities": {
"media": [
{
"id": 573592905383723000,
"id_str": "573592905383723008",
"indices": [
102,
124
],
"media_url": "http://pbs.twimg.com/media/B_XPtVsUwAAU9f2.jpg",
"media_url_https": "https://pbs.twimg.com/media/B_XPtVsUwAAU9f2.jpg",
"url": "http://t.co/NCA4QbOSjt",
"display_url": "pic.twitter.com/NCA4QbOSjt",
"expanded_url": "http://twitter.com/briantford/status/573592910953779200/photo/1",
"type": "photo",
"sizes": {
"small": {
"w": 340,
"h": 340,
"resize": "fit"
},
"thumb": {
"w": 150,
"h": 150,
"resize": "crop"
},
"medium": {
"w": 600,
"h": 600,
"resize": "fit"
},
"large": {
"w": 1024,
"h": 1024,
"resize": "fit"
}
}
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "en"
},
"retweet_count": 12,
"favorite_count": 0,
"entities": {
"hashtags": [
{
"text": "ngconf",
"indices": [
110,
117
]
}
],
"symbols": [],
"user_mentions": [
{
"screen_name": "briantford",
"name": "Brian Ford ",
"id": 290864535,
"id_str": "290864535",
"indices": [
3,
14
]
},
{
"screen_name": "judytuna",
"name": "judytuna",
"id": 759694,
"id_str": "759694",
"indices": [
100,
109
]
}
],
"urls": [],
"media": [
{
"id": 573592905383723000,
"id_str": "573592905383723008",
"indices": [
118,
140
],
"media_url": "http://pbs.twimg.com/media/B_XPtVsUwAAU9f2.jpg",
"media_url_https": "https://pbs.twimg.com/media/B_XPtVsUwAAU9f2.jpg",
"url": "http://t.co/NCA4QbOSjt",
"display_url": "pic.twitter.com/NCA4QbOSjt",
"expanded_url": "http://twitter.com/briantford/status/573592910953779200/photo/1",
"type": "photo",
"sizes": {
"small": {
"w": 340,
"h": 340,
"resize": "fit"
},
"thumb": {
"w": 150,
"h": 150,
"resize": "crop"
},
"medium": {
"w": 600,
"h": 600,
"resize": "fit"
},
"large": {
"w": 1024,
"h": 1024,
"resize": "fit"
}
},
"source_status_id": 573592910953779200,
"source_status_id_str": "573592910953779200",
"source_user_id": 290864535,
"source_user_id_str": "290864535"
}
]
},
"extended_entities": {
"media": [
{
"id": 573592905383723000,
"id_str": "573592905383723008",
"indices": [
118,
140
],
"media_url": "http://pbs.twimg.com/media/B_XPtVsUwAAU9f2.jpg",
"media_url_https": "https://pbs.twimg.com/media/B_XPtVsUwAAU9f2.jpg",
"url": "http://t.co/NCA4QbOSjt",
"display_url": "pic.twitter.com/NCA4QbOSjt",
"expanded_url": "http://twitter.com/briantford/status/573592910953779200/photo/1",
"type": "photo",
"sizes": {
"small": {
"w": 340,
"h": 340,
"resize": "fit"
},
"thumb": {
"w": 150,
"h": 150,
"resize": "crop"
},
"medium": {
"w": 600,
"h": 600,
"resize": "fit"
},
"large": {
"w": 1024,
"h": 1024,
"resize": "fit"
}
},
"source_status_id": 573592910953779200,
"source_status_id_str": "573592910953779200",
"source_user_id": 290864535,
"source_user_id_str": "290864535"
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "en"
},
{
"created_at": "Fri Mar 06 02:07:56 +0000 2015",
"id": 573666291459956740,
"id_str": "573666291459956737",
"text": "RT @tenderlove: This means @united has direct flights to literally everywhere!!! https://t.co/iuoXh3dtAs",
"source": "<a href=\"http://twitter.com\" rel=\"nofollow\">Twitter Web Client</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 52593,
"id_str": "52593",
"name": "Avdi Grimm",
"screen_name": "avdi",
"location": "York, PA",
"profile_location": null,
"description": "80% angel, 10% daemon, the rest is hard to explain.",
"url": "http://t.co/vCUY54FsV1",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/vCUY54FsV1",
"expanded_url": "http://avdi.org",
"display_url": "avdi.org",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 13766,
"friends_count": 43,
"listed_count": 798,
"created_at": "Sat Dec 09 01:37:40 +0000 2006",
"favourites_count": 1473,
"utc_offset": -18000,
"time_zone": "Eastern Time (US & Canada)",
"geo_enabled": true,
"verified": false,
"statuses_count": 44181,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "9AE4E8",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/436586539229777920/4NQoTOEN_normal.png",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/436586539229777920/4NQoTOEN_normal.png",
"profile_link_color": "0000FF",
"profile_sidebar_border_color": "87BC44",
"profile_sidebar_fill_color": "E0FF92",
"profile_text_color": "000000",
"profile_use_background_image": true,
"default_profile": false,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": true
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweeted_status": {
"created_at": "Thu Mar 05 23:37:56 +0000 2015",
"id": 573628543323664400,
"id_str": "573628543323664384",
"text": "This means @united has direct flights to literally everywhere!!! https://t.co/iuoXh3dtAs",
"source": "<a href=\"http://www.echofon.com/\" rel=\"nofollow\">Echofon</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 14761655,
"id_str": "14761655",
"name": "Aaron Patterson",
"screen_name": "tenderlove",
"location": "Seattle, WA",
"profile_location": null,
"description": "ひげの山男。 When I'm not trimming my beard, I'm hanging out with my wife, @ebiltwin.",
"url": "http://t.co/gN1GLubxAe",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/gN1GLubxAe",
"expanded_url": "http://tenderlovemaking.com",
"display_url": "tenderlovemaking.com",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 25262,
"friends_count": 512,
"listed_count": 1433,
"created_at": "Tue May 13 17:25:31 +0000 2008",
"favourites_count": 4259,
"utc_offset": -28800,
"time_zone": "Pacific Time (US & Canada)",
"geo_enabled": true,
"verified": false,
"statuses_count": 35572,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "C0DEED",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/378800000325798111/ca48276f8ebbbbac9c6ce83aac3c8548_normal.jpeg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/378800000325798111/ca48276f8ebbbbac9c6ce83aac3c8548_normal.jpeg",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/14761655/1425591616",
"profile_link_color": "0084B4",
"profile_sidebar_border_color": "C0DEED",
"profile_sidebar_fill_color": "DDEEF6",
"profile_text_color": "333333",
"profile_use_background_image": true,
"default_profile": true,
"default_profile_image": false,
"following": false,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweet_count": 17,
"favorite_count": 14,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [
{
"screen_name": "united",
"name": "United",
"id": 260907612,
"id_str": "260907612",
"indices": [
11,
18
]
}
],
"urls": [
{
"url": "https://t.co/iuoXh3dtAs",
"expanded_url": "https://twitter.com/united/status/573625507843043328",
"display_url": "twitter.com/united/status/…",
"indices": [
65,
88
]
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "en"
},
"retweet_count": 17,
"favorite_count": 0,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [
{
"screen_name": "tenderlove",
"name": "Aaron Patterson",
"id": 14761655,
"id_str": "14761655",
"indices": [
3,
14
]
},
{
"screen_name": "united",
"name": "United",
"id": 260907612,
"id_str": "260907612",
"indices": [
27,
34
]
}
],
"urls": [
{
"url": "https://t.co/iuoXh3dtAs",
"expanded_url": "https://twitter.com/united/status/573625507843043328",
"display_url": "twitter.com/united/status/…",
"indices": [
81,
104
]
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "en"
},
{
"created_at": "Fri Mar 06 02:05:22 +0000 2015",
"id": 573665642542428160,
"id_str": "573665642542428162",
"text": ". @united @tenderlove @searls I suggest you go on to prove that black is white. Watch out for zebras.",
"source": "<a href=\"http://twitter.com\" rel=\"nofollow\">Twitter Web Client</a>",
"truncated": false,
"in_reply_to_status_id": 573625507843043300,
"in_reply_to_status_id_str": "573625507843043328",
"in_reply_to_user_id": 260907612,
"in_reply_to_user_id_str": "260907612",
"in_reply_to_screen_name": "united",
"user": {
"id": 52593,
"id_str": "52593",
"name": "Avdi Grimm",
"screen_name": "avdi",
"location": "York, PA",
"profile_location": null,
"description": "80% angel, 10% daemon, the rest is hard to explain.",
"url": "http://t.co/vCUY54FsV1",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/vCUY54FsV1",
"expanded_url": "http://avdi.org",
"display_url": "avdi.org",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 13766,
"friends_count": 43,
"listed_count": 798,
"created_at": "Sat Dec 09 01:37:40 +0000 2006",
"favourites_count": 1473,
"utc_offset": -18000,
"time_zone": "Eastern Time (US & Canada)",
"geo_enabled": true,
"verified": false,
"statuses_count": 44181,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "9AE4E8",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/436586539229777920/4NQoTOEN_normal.png",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/436586539229777920/4NQoTOEN_normal.png",
"profile_link_color": "0000FF",
"profile_sidebar_border_color": "87BC44",
"profile_sidebar_fill_color": "E0FF92",
"profile_text_color": "000000",
"profile_use_background_image": true,
"default_profile": false,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": true
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweet_count": 0,
"favorite_count": 2,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [
{
"screen_name": "united",
"name": "United",
"id": 260907612,
"id_str": "260907612",
"indices": [
2,
9
]
},
{
"screen_name": "tenderlove",
"name": "Aaron Patterson",
"id": 14761655,
"id_str": "14761655",
"indices": [
10,
21
]
},
{
"screen_name": "searls",
"name": "Justin Searls",
"id": 9038902,
"id_str": "9038902",
"indices": [
22,
29
]
}
],
"urls": []
},
"favorited": false,
"retweeted": false,
"lang": "en"
},
{
"created_at": "Fri Mar 06 02:04:37 +0000 2015",
"id": 573665457217093600,
"id_str": "573665457217093633",
"text": "RT @united: @searls A direct flight means that there is a stop &amp; a possible change of gates/planes. A non-stop flight means that there is n…",
"source": "<a href=\"http://twitter.com\" rel=\"nofollow\">Twitter Web Client</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 52593,
"id_str": "52593",
"name": "Avdi Grimm",
"screen_name": "avdi",
"location": "York, PA",
"profile_location": null,
"description": "80% angel, 10% daemon, the rest is hard to explain.",
"url": "http://t.co/vCUY54FsV1",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/vCUY54FsV1",
"expanded_url": "http://avdi.org",
"display_url": "avdi.org",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 13766,
"friends_count": 43,
"listed_count": 798,
"created_at": "Sat Dec 09 01:37:40 +0000 2006",
"favourites_count": 1473,
"utc_offset": -18000,
"time_zone": "Eastern Time (US & Canada)",
"geo_enabled": true,
"verified": false,
"statuses_count": 44181,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "9AE4E8",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/436586539229777920/4NQoTOEN_normal.png",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/436586539229777920/4NQoTOEN_normal.png",
"profile_link_color": "0000FF",
"profile_sidebar_border_color": "87BC44",
"profile_sidebar_fill_color": "E0FF92",
"profile_text_color": "000000",
"profile_use_background_image": true,
"default_profile": false,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": true
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweeted_status": {
"created_at": "Thu Mar 05 23:25:53 +0000 2015",
"id": 573625507843043300,
"id_str": "573625507843043328",
"text": "@searls A direct flight means that there is a stop &amp; a possible change of gates/planes. A non-stop flight means that there is no stop. ^GJ",
"source": "<a href=\"http://www.radian6.com\" rel=\"nofollow\">Radian6 -Social Media Management</a>",
"truncated": false,
"in_reply_to_status_id": 573614339132796900,
"in_reply_to_status_id_str": "573614339132796928",
"in_reply_to_user_id": 9038902,
"in_reply_to_user_id_str": "9038902",
"in_reply_to_screen_name": "searls",
"user": {
"id": 260907612,
"id_str": "260907612",
"name": "United",
"screen_name": "united",
"location": "",
"profile_location": null,
"description": "Welcome to our official Twitter page, where our conversations with you are 140 characters-friendly. We like hearing from you. Tweet us anytime.",
"url": "http://t.co/C3OPYCDhGt",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/C3OPYCDhGt",
"expanded_url": "http://unitedhub.com",
"display_url": "unitedhub.com",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 625269,
"friends_count": 35063,
"listed_count": 4492,
"created_at": "Fri Mar 04 21:23:11 +0000 2011",
"favourites_count": 510,
"utc_offset": -21600,
"time_zone": "Central Time (US & Canada)",
"geo_enabled": false,
"verified": true,
"statuses_count": 401588,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "000000",
"profile_background_image_url": "http://pbs.twimg.com/profile_background_images/454004296250454016/RQtA5shm.png",
"profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/454004296250454016/RQtA5shm.png",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/2449279853/Twitter-profile-mobile_0005_6_normal.jpg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/2449279853/Twitter-profile-mobile_0005_6_normal.jpg",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/260907612/1411648983",
"profile_link_color": "0084B4",
"profile_sidebar_border_color": "FFFFFF",
"profile_sidebar_fill_color": "DDEEF6",
"profile_text_color": "333333",
"profile_use_background_image": true,
"default_profile": false,
"default_profile_image": false,
"following": false,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweet_count": 96,
"favorite_count": 23,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [
{
"screen_name": "searls",
"name": "Justin Searls",
"id": 9038902,
"id_str": "9038902",
"indices": [
0,
7
]
}
],
"urls": []
},
"favorited": false,
"retweeted": false,
"lang": "en"
},
"retweet_count": 96,
"favorite_count": 0,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [
{
"screen_name": "united",
"name": "United",
"id": 260907612,
"id_str": "260907612",
"indices": [
3,
10
]
},
{
"screen_name": "searls",
"name": "Justin Searls",
"id": 9038902,
"id_str": "9038902",
"indices": [
12,
19
]
}
],
"urls": []
},
"favorited": false,
"retweeted": false,
"lang": "en"
},
{
"created_at": "Fri Mar 06 02:00:17 +0000 2015",
"id": 573664365523509250,
"id_str": "573664365523509248",
"text": "RT @billwscott: The more talent density u have the less process you need. The more process u create the less talent you retain.\n\n-- Reed Ha…",
"source": "<a href=\"http://tapbots.com/tweetbot\" rel=\"nofollow\">Tweetbot for iΟS</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 697893,
"id_str": "697893",
"name": "Brandon Keepers",
"screen_name": "bkeepers",
"location": "Holland, MI, USA",
"profile_location": null,
"description": "Open Source at GitHub. In a previous life I was probably a hermit. In the life before that, I was most definitely an explorer.",
"url": "http://t.co/55BXm287SP",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/55BXm287SP",
"expanded_url": "http://opensoul.org",
"display_url": "opensoul.org",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 3246,
"friends_count": 667,
"listed_count": 197,
"created_at": "Thu Jan 25 01:28:46 +0000 2007",
"favourites_count": 858,
"utc_offset": -18000,
"time_zone": "Eastern Time (US & Canada)",
"geo_enabled": true,
"verified": false,
"statuses_count": 10470,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "1A1B1F",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme9/bg.gif",
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme9/bg.gif",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/552937026094239744/LOMJGQZL_normal.jpeg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/552937026094239744/LOMJGQZL_normal.jpeg",
"profile_link_color": "2FC2EF",
"profile_sidebar_border_color": "181A1E",
"profile_sidebar_fill_color": "252429",
"profile_text_color": "666666",
"profile_use_background_image": true,
"default_profile": false,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweeted_status": {
"created_at": "Sat Feb 28 20:00:49 +0000 2015",
"id": 571761964839505900,
"id_str": "571761964839505920",
"text": "The more talent density u have the less process you need. The more process u create the less talent you retain.\n\n-- Reed Hastings (@netflix)",
"source": "<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 17383191,
"id_str": "17383191",
"name": "Bill Scott",
"screen_name": "billwscott",
"location": "Morgan Hill, CA",
"profile_location": null,
"description": "VP, Payment Products, PayPal. Eng & UX Thought Leader, Author, Speaker, Lean UX/Lean Eng advocate. Former @netflix & @yahoo. Early Mac Game Developer (GATO)",
"url": "http://t.co/wjoQpahmwe",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/wjoQpahmwe",
"expanded_url": "http://looksgoodworkswell.com",
"display_url": "looksgoodworkswell.com",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 9357,
"friends_count": 1060,
"listed_count": 792,
"created_at": "Fri Nov 14 07:09:53 +0000 2008",
"favourites_count": 4005,
"utc_offset": -28800,
"time_zone": "Pacific Time (US & Canada)",
"geo_enabled": true,
"verified": false,
"statuses_count": 6722,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "C0DEED",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/555602433498701824/vY5RzWYo_normal.jpeg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/555602433498701824/vY5RzWYo_normal.jpeg",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/17383191/1393734401",
"profile_link_color": "0084B4",
"profile_sidebar_border_color": "C0DEED",
"profile_sidebar_fill_color": "DDEEF6",
"profile_text_color": "333333",
"profile_use_background_image": true,
"default_profile": true,
"default_profile_image": false,
"following": false,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweet_count": 1349,
"favorite_count": 963,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [
{
"screen_name": "netflix",
"name": "Netflix US",
"id": 16573941,
"id_str": "16573941",
"indices": [
131,
139
]
}
],
"urls": []
},
"favorited": false,
"retweeted": false,
"lang": "en"
},
"retweet_count": 1349,
"favorite_count": 0,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [
{
"screen_name": "billwscott",
"name": "Bill Scott",
"id": 17383191,
"id_str": "17383191",
"indices": [
3,
14
]
},
{
"screen_name": "netflix",
"name": "Netflix US",
"id": 16573941,
"id_str": "16573941",
"indices": [
139,
140
]
}
],
"urls": []
},
"favorited": false,
"retweeted": false,
"lang": "en"
},
{
"created_at": "Fri Mar 06 01:15:31 +0000 2015",
"id": 573653097265893400,
"id_str": "573653097265893377",
"text": "A Firefox Experience for iOS https://t.co/YDF708fTfs via @tanay1337",
"source": "<a href=\"http://www.hootsuite.com\" rel=\"nofollow\">Hootsuite</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 14490962,
"id_str": "14490962",
"name": "Tuts+ Code",
"screen_name": "TutsPlusCode",
"location": "",
"profile_location": null,
"description": "Tutorials, articles, tips, and community for web developers. Incorporating @nettuts, @mobiletuts, @wptuts and @activetuts.",
"url": "http://t.co/wTPX3qkZJq",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/wTPX3qkZJq",
"expanded_url": "http://code.tutsplus.com",
"display_url": "code.tutsplus.com",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 144426,
"friends_count": 292,
"listed_count": 7318,
"created_at": "Wed Apr 23 10:18:17 +0000 2008",
"favourites_count": 128,
"utc_offset": -18000,
"time_zone": "Quito",
"geo_enabled": false,
"verified": false,
"statuses_count": 13761,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "2A3745",
"profile_background_image_url": "http://pbs.twimg.com/profile_background_images/709535255/cda9eb737de0613a506bddfd7a73d315.png",
"profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/709535255/cda9eb737de0613a506bddfd7a73d315.png",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/440360139866910721/CSiOk6MT_normal.png",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/440360139866910721/CSiOk6MT_normal.png",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/14490962/1404878993",
"profile_link_color": "488276",
"profile_sidebar_border_color": "000000",
"profile_sidebar_fill_color": "D5D3CD",
"profile_text_color": "333333",
"profile_use_background_image": false,
"default_profile": false,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweet_count": 2,
"favorite_count": 7,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [
{
"screen_name": "tanay1337",
"name": "Tanay Pant",
"id": 2254315993,
"id_str": "2254315993",
"indices": [
57,
67
]
}
],
"urls": [
{
"url": "https://t.co/YDF708fTfs",
"expanded_url": "https://code.tutsplus.com/articles/a-firefox-experience-for-ios--cms-23247",
"display_url": "code.tutsplus.com/articles/a-fir…",
"indices": [
29,
52
]
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "en"
},
{
"created_at": "Fri Mar 06 01:11:52 +0000 2015",
"id": 573652180172939260,
"id_str": "573652180172939264",
"text": "AMS new feature proposal \"Adding fetch_multi to Cache Strategy\" would like to hear some thoughts. https://t.co/GofyCAsAix :)",
"source": "<a href=\"http://itunes.apple.com/us/app/twitter/id409789998?mt=12\" rel=\"nofollow\">Twitter for Mac</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 42511667,
"id_str": "42511667",
"name": "João Moura",
"screen_name": "joaomdmoura",
"location": "Brazil",
"profile_location": null,
"description": "CEO & Founder at @ giocohq, a gamification platform. I'm an FullStack Developer and a Passionate Speaker, that also loves Open Source.",
"url": "http://t.co/kMDMH9bY0Z",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/kMDMH9bY0Z",
"expanded_url": "http://goo.gl/SA3tiI",
"display_url": "goo.gl/SA3tiI",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 571,
"friends_count": 473,
"listed_count": 38,
"created_at": "Mon May 25 23:21:48 +0000 2009",
"favourites_count": 684,
"utc_offset": -7200,
"time_zone": "Mid-Atlantic",
"geo_enabled": true,
"verified": false,
"statuses_count": 3282,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "FFFFFF",
"profile_background_image_url": "http://pbs.twimg.com/profile_background_images/82438834/lo_jm3.jpg",
"profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/82438834/lo_jm3.jpg",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/520837701235261442/gAMwuIu-_normal.jpeg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/520837701235261442/gAMwuIu-_normal.jpeg",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/42511667/1358599052",
"profile_link_color": "5BAAC7",
"profile_sidebar_border_color": "CEE5F0",
"profile_sidebar_fill_color": "F7F7F7",
"profile_text_color": "333333",
"profile_use_background_image": false,
"default_profile": false,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweet_count": 2,
"favorite_count": 3,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [],
"urls": [
{
"url": "https://t.co/GofyCAsAix",
"expanded_url": "https://github.com/rails-api/active_model_serializers/issues/827",
"display_url": "github.com/rails-api/acti…",
"indices": [
98,
121
]
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "en"
},
{
"created_at": "Fri Mar 06 01:11:08 +0000 2015",
"id": 573651994998542340,
"id_str": "573651994998542337",
"text": "Wabi Sabi, the cure to OCD.",
"source": "<a href=\"http://tapbots.com/software/tweetbot/mac\" rel=\"nofollow\">Tweetbot for Mac</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 6896972,
"id_str": "6896972",
"name": "◖(•_•)◗",
"screen_name": "simurai",
"location": "Sapporo, Japan",
"profile_location": null,
"description": "Kanonenfutter Designer",
"url": "http://t.co/ZKdG5qt57y",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/ZKdG5qt57y",
"expanded_url": "http://simurai.com",
"display_url": "simurai.com",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 11906,
"friends_count": 144,
"listed_count": 859,
"created_at": "Mon Jun 18 18:22:20 +0000 2007",
"favourites_count": 323,
"utc_offset": 32400,
"time_zone": "Sapporo",
"geo_enabled": true,
"verified": false,
"statuses_count": 11388,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "FAF8ED",
"profile_background_image_url": "http://pbs.twimg.com/profile_background_images/383373883/project_papper.png",
"profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/383373883/project_papper.png",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/497627360162623489/T2LXKQuJ_normal.jpeg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/497627360162623489/T2LXKQuJ_normal.jpeg",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/6896972/1348061248",
"profile_link_color": "FB7C61",
"profile_sidebar_border_color": "FFFFFF",
"profile_sidebar_fill_color": "F0FDFF",
"profile_text_color": "333333",
"profile_use_background_image": false,
"default_profile": false,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweet_count": 0,
"favorite_count": 5,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [],
"urls": []
},
"favorited": false,
"retweeted": false,
"lang": "tl"
},
{
"created_at": "Fri Mar 06 01:03:13 +0000 2015",
"id": 573650002515525600,
"id_str": "573650002515525633",
"text": "DEVWEEKVIX!!! Foi incrivel. Obg a todos :)\n#devweekvix #developerweek https://t.co/kof7WsU3mO",
"source": "<a href=\"http://instagram.com\" rel=\"nofollow\">Instagram</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 17681607,
"id_str": "17681607",
"name": "bernarddeluna",
"screen_name": "bernarddeluna",
"location": "Rio de Janeiro, Brazil",
"profile_location": null,
"description": "I'm Product Manager at iMasters ✦ Founder of 3Days ✦ http://t.co/tf3VIS3dyn co-Founder ✦ Startups Mentor ✦ Sexy web projects Specialist ✦ Speaker and Dancer",
"url": "http://t.co/VHw5XFP9JA",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/VHw5XFP9JA",
"expanded_url": "http://bernarddeluna.com",
"display_url": "bernarddeluna.com",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": [
{
"url": "http://t.co/tf3VIS3dyn",
"expanded_url": "http://Freteiros.com",
"display_url": "Freteiros.com",
"indices": [
53,
75
]
}
]
}
},
"protected": false,
"followers_count": 3996,
"friends_count": 209,
"listed_count": 170,
"created_at": "Thu Nov 27 16:10:23 +0000 2008",
"favourites_count": 621,
"utc_offset": -10800,
"time_zone": "Santiago",
"geo_enabled": true,
"verified": false,
"statuses_count": 9621,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "F5F5F5",
"profile_background_image_url": "http://pbs.twimg.com/profile_background_images/653436003/fex1gq0kbxvux5jpzmku.jpeg",
"profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/653436003/fex1gq0kbxvux5jpzmku.jpeg",
"profile_background_tile": true,
"profile_image_url": "http://pbs.twimg.com/profile_images/3116572592/fb0023861300f52bc9c65d35761c2dfc_normal.jpeg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/3116572592/fb0023861300f52bc9c65d35761c2dfc_normal.jpeg",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/17681607/1396539642",
"profile_link_color": "E74C3C",
"profile_sidebar_border_color": "000000",
"profile_sidebar_fill_color": "FFFFFF",
"profile_text_color": "3D3D3D",
"profile_use_background_image": false,
"default_profile": false,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": true
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweet_count": 2,
"favorite_count": 5,
"entities": {
"hashtags": [
{
"text": "devweekvix",
"indices": [
43,
54
]
},
{
"text": "developerweek",
"indices": [
55,
69
]
}
],
"symbols": [],
"user_mentions": [],
"urls": [
{
"url": "https://t.co/kof7WsU3mO",
"expanded_url": "https://instagram.com/p/z3frwKzeiT/",
"display_url": "instagram.com/p/z3frwKzeiT/",
"indices": [
70,
93
]
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "pt"
},
{
"created_at": "Fri Mar 06 00:30:10 +0000 2015",
"id": 573641686640762900,
"id_str": "573641686640762880",
"text": "Apple Watch vs. Android Wear, in screenshots\nhttp://t.co/g6Rp0F8uKr\n\nht/ @malpern http://t.co/tV4vrJscbV",
"source": "<a href=\"http://itunes.apple.com/us/app/twitter/id409789998?mt=12\" rel=\"nofollow\">Twitter for Mac</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 13889622,
"id_str": "13889622",
"name": "Luke Wroblewski",
"screen_name": "lukew",
"location": "Silicon Valley",
"profile_location": null,
"description": "Humanizing technology. Founded: Polar (Google acquired) Bagcheck (Twitter acquired) Wrote: Mobile First, Web Form Design, Site Seeing. Worked: Yahoo, eBay, NCSA",
"url": "http://t.co/xvfIIovxoh",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/xvfIIovxoh",
"expanded_url": "http://www.lukew.com",
"display_url": "lukew.com",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 115800,
"friends_count": 93,
"listed_count": 7393,
"created_at": "Sun Feb 24 04:01:42 +0000 2008",
"favourites_count": 2929,
"utc_offset": -28800,
"time_zone": "Pacific Time (US & Canada)",
"geo_enabled": true,
"verified": false,
"statuses_count": 14953,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "FFFFFF",
"profile_background_image_url": "http://pbs.twimg.com/profile_background_images/333653482/Screen_shot_2011-09-20_at_10.32.22_AM.png",
"profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/333653482/Screen_shot_2011-09-20_at_10.32.22_AM.png",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/477610446917103616/_cjU3_ga_normal.png",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/477610446917103616/_cjU3_ga_normal.png",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/13889622/1404191333",
"profile_link_color": "449400",
"profile_sidebar_border_color": "88D822",
"profile_sidebar_fill_color": "E3F8AF",
"profile_text_color": "484242",
"profile_use_background_image": true,
"default_profile": false,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweet_count": 33,
"favorite_count": 43,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [
{
"screen_name": "malpern",
"name": "Micah Alpern",
"id": 1483,
"id_str": "1483",
"indices": [
73,
81
]
}
],
"urls": [
{
"url": "http://t.co/g6Rp0F8uKr",
"expanded_url": "http://arstechnica.com/apple/2014/09/smartwatch-wars-the-apple-watch-versus-android-wear-in-screenshots/",
"display_url": "arstechnica.com/apple/2014/09/…",
"indices": [
45,
67
]
}
],
"media": [
{
"id": 573641684468138000,
"id_str": "573641684468137984",
"indices": [
82,
104
],
"media_url": "http://pbs.twimg.com/media/B_X8Ep8UgAAYBXc.png",
"media_url_https": "https://pbs.twimg.com/media/B_X8Ep8UgAAYBXc.png",
"url": "http://t.co/tV4vrJscbV",
"display_url": "pic.twitter.com/tV4vrJscbV",
"expanded_url": "http://twitter.com/lukew/status/573641686640762880/photo/1",
"type": "photo",
"sizes": {
"large": {
"w": 1024,
"h": 530,
"resize": "fit"
},
"thumb": {
"w": 150,
"h": 150,
"resize": "crop"
},
"small": {
"w": 340,
"h": 175,
"resize": "fit"
},
"medium": {
"w": 600,
"h": 310,
"resize": "fit"
}
}
}
]
},
"extended_entities": {
"media": [
{
"id": 573641684468138000,
"id_str": "573641684468137984",
"indices": [
82,
104
],
"media_url": "http://pbs.twimg.com/media/B_X8Ep8UgAAYBXc.png",
"media_url_https": "https://pbs.twimg.com/media/B_X8Ep8UgAAYBXc.png",
"url": "http://t.co/tV4vrJscbV",
"display_url": "pic.twitter.com/tV4vrJscbV",
"expanded_url": "http://twitter.com/lukew/status/573641686640762880/photo/1",
"type": "photo",
"sizes": {
"large": {
"w": 1024,
"h": 530,
"resize": "fit"
},
"thumb": {
"w": 150,
"h": 150,
"resize": "crop"
},
"small": {
"w": 340,
"h": 175,
"resize": "fit"
},
"medium": {
"w": 600,
"h": 310,
"resize": "fit"
}
}
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "en"
},
{
"created_at": "Fri Mar 06 00:27:12 +0000 2015",
"id": 573640941497679900,
"id_str": "573640941497679872",
"text": "O @lfcipriani do twitter falando sobre o Fabric.\n#devweekvix #developerweek \n@imasters https://t.co/uDwxjXaZRt",
"source": "<a href=\"http://instagram.com\" rel=\"nofollow\">Instagram</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 17681607,
"id_str": "17681607",
"name": "bernarddeluna",
"screen_name": "bernarddeluna",
"location": "Rio de Janeiro, Brazil",
"profile_location": null,
"description": "I'm Product Manager at iMasters ✦ Founder of 3Days ✦ http://t.co/tf3VIS3dyn co-Founder ✦ Startups Mentor ✦ Sexy web projects Specialist ✦ Speaker and Dancer",
"url": "http://t.co/VHw5XFP9JA",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/VHw5XFP9JA",
"expanded_url": "http://bernarddeluna.com",
"display_url": "bernarddeluna.com",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": [
{
"url": "http://t.co/tf3VIS3dyn",
"expanded_url": "http://Freteiros.com",
"display_url": "Freteiros.com",
"indices": [
53,
75
]
}
]
}
},
"protected": false,
"followers_count": 3996,
"friends_count": 209,
"listed_count": 170,
"created_at": "Thu Nov 27 16:10:23 +0000 2008",
"favourites_count": 621,
"utc_offset": -10800,
"time_zone": "Santiago",
"geo_enabled": true,
"verified": false,
"statuses_count": 9621,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "F5F5F5",
"profile_background_image_url": "http://pbs.twimg.com/profile_background_images/653436003/fex1gq0kbxvux5jpzmku.jpeg",
"profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/653436003/fex1gq0kbxvux5jpzmku.jpeg",
"profile_background_tile": true,
"profile_image_url": "http://pbs.twimg.com/profile_images/3116572592/fb0023861300f52bc9c65d35761c2dfc_normal.jpeg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/3116572592/fb0023861300f52bc9c65d35761c2dfc_normal.jpeg",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/17681607/1396539642",
"profile_link_color": "E74C3C",
"profile_sidebar_border_color": "000000",
"profile_sidebar_fill_color": "FFFFFF",
"profile_text_color": "3D3D3D",
"profile_use_background_image": false,
"default_profile": false,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": true
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweet_count": 1,
"favorite_count": 2,
"entities": {
"hashtags": [
{
"text": "devweekvix",
"indices": [
49,
60
]
},
{
"text": "developerweek",
"indices": [
61,
75
]
}
],
"symbols": [],
"user_mentions": [
{
"screen_name": "lfcipriani",
"name": "Luis Cipriani",
"id": 17347849,
"id_str": "17347849",
"indices": [
2,
13
]
},
{
"screen_name": "iMasters",
"name": "iMasters",
"id": 9105972,
"id_str": "9105972",
"indices": [
77,
86
]
}
],
"urls": [
{
"url": "https://t.co/uDwxjXaZRt",
"expanded_url": "https://instagram.com/p/z3bkCfTerX/",
"display_url": "instagram.com/p/z3bkCfTerX/",
"indices": [
87,
110
]
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "pt"
},
{
"created_at": "Fri Mar 06 00:21:31 +0000 2015",
"id": 573639507846651900,
"id_str": "573639507846651906",
"text": "RT @DZoneLinks: Demo of Node.js Process Manager with nginx and Multi-Host Support Plus a GUI - http://t.co/DP8rIADFeG - @DZoneLinks Big Lin…",
"source": "<a href=\"http://sproutsocial.com\" rel=\"nofollow\">Sprout Social</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 1002392005,
"id_str": "1002392005",
"name": "StrongLoop",
"screen_name": "StrongLoop",
"location": "San Francisco & Amsterdam",
"profile_location": null,
"description": "Develop, manage and scale REST APIs with Node.js",
"url": "http://t.co/VMoxuFnPwD",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/VMoxuFnPwD",
"expanded_url": "http://strongloop.com",
"display_url": "strongloop.com",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 4081,
"friends_count": 245,
"listed_count": 197,
"created_at": "Mon Dec 10 20:05:57 +0000 2012",
"favourites_count": 13,
"utc_offset": -28800,
"time_zone": "Pacific Time (US & Canada)",
"geo_enabled": false,
"verified": false,
"statuses_count": 3306,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "C0DEED",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/483653379021746176/dzkYsMnH_normal.png",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/483653379021746176/dzkYsMnH_normal.png",
"profile_link_color": "0084B4",
"profile_sidebar_border_color": "C0DEED",
"profile_sidebar_fill_color": "DDEEF6",
"profile_text_color": "333333",
"profile_use_background_image": true,
"default_profile": true,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweeted_status": {
"created_at": "Fri Mar 06 00:06:10 +0000 2015",
"id": 573635647233110000,
"id_str": "573635647233110016",
"text": "Demo of Node.js Process Manager with nginx and Multi-Host Support Plus a GUI - http://t.co/DP8rIADFeG - @DZoneLinks Big Link by stronglooper",
"source": "<a href=\"http://www.dzone.com/links\" rel=\"nofollow\">DZone Links</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 2375301294,
"id_str": "2375301294",
"name": "DZone Links",
"screen_name": "DZoneLinks",
"location": "Cary, NC USA",
"profile_location": null,
"description": "The best and most popular links from DZone's global community of technology experts and professionals. Get connected with DZone today!",
"url": "http://t.co/4l9DkonFmN",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/4l9DkonFmN",
"expanded_url": "http://dzone.com",
"display_url": "dzone.com",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 1165,
"friends_count": 191,
"listed_count": 55,
"created_at": "Thu Mar 06 12:36:48 +0000 2014",
"favourites_count": 7,
"utc_offset": -18000,
"time_zone": "Eastern Time (US & Canada)",
"geo_enabled": false,
"verified": false,
"statuses_count": 9133,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "A3A3A3",
"profile_background_image_url": "http://pbs.twimg.com/profile_background_images/441954371434078208/QUcVAi3Y.jpeg",
"profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/441954371434078208/QUcVAi3Y.jpeg",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/441695143964319744/40oMPffR_normal.png",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/441695143964319744/40oMPffR_normal.png",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/2375301294/1394143316",
"profile_link_color": "6EAF34",
"profile_sidebar_border_color": "FFFFFF",
"profile_sidebar_fill_color": "DDEEF6",
"profile_text_color": "333333",
"profile_use_background_image": true,
"default_profile": false,
"default_profile_image": false,
"following": false,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweet_count": 2,
"favorite_count": 1,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [
{
"screen_name": "DZoneLinks",
"name": "DZone Links",
"id": 2375301294,
"id_str": "2375301294",
"indices": [
104,
115
]
}
],
"urls": [
{
"url": "http://t.co/DP8rIADFeG",
"expanded_url": "http://dzone.com/POxQ0",
"display_url": "dzone.com/POxQ0",
"indices": [
79,
101
]
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "en"
},
"retweet_count": 2,
"favorite_count": 0,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [
{
"screen_name": "DZoneLinks",
"name": "DZone Links",
"id": 2375301294,
"id_str": "2375301294",
"indices": [
3,
14
]
},
{
"screen_name": "DZoneLinks",
"name": "DZone Links",
"id": 2375301294,
"id_str": "2375301294",
"indices": [
120,
131
]
}
],
"urls": [
{
"url": "http://t.co/DP8rIADFeG",
"expanded_url": "http://dzone.com/POxQ0",
"display_url": "dzone.com/POxQ0",
"indices": [
95,
117
]
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "en"
},
{
"created_at": "Fri Mar 06 00:15:45 +0000 2015",
"id": 573638060111368200,
"id_str": "573638060111368192",
"text": "Our operations engineer @_MattTse discusses expanded beta for private backups in Firebase: https://t.co/ySk4iYdNbl",
"source": "<a href=\"http://twitter.com\" rel=\"nofollow\">Twitter Web Client</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 447644824,
"id_str": "447644824",
"name": "Firebase",
"screen_name": "Firebase",
"location": "San Francisco",
"profile_location": null,
"description": "The Realtime App Platform. Build realtime mobile and web apps in minutes. // Status: @FirebaseStatus",
"url": "https://t.co/Rv5rRk5xTJ",
"entities": {
"url": {
"urls": [
{
"url": "https://t.co/Rv5rRk5xTJ",
"expanded_url": "https://Firebase.com",
"display_url": "Firebase.com",
"indices": [
0,
23
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 23718,
"friends_count": 3,
"listed_count": 535,
"created_at": "Tue Dec 27 03:47:52 +0000 2011",
"favourites_count": 4720,
"utc_offset": -32400,
"time_zone": "Alaska",
"geo_enabled": true,
"verified": false,
"statuses_count": 1246,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "EBEBEB",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme7/bg.gif",
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme7/bg.gif",
"profile_background_tile": true,
"profile_image_url": "http://pbs.twimg.com/profile_images/1974595305/firebase_branding_r4_FINAL_03_normal.png",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/1974595305/firebase_branding_r4_FINAL_03_normal.png",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/447644824/1399680183",
"profile_link_color": "0073FF",
"profile_sidebar_border_color": "DFDFDF",
"profile_sidebar_fill_color": "F3F3F3",
"profile_text_color": "333333",
"profile_use_background_image": false,
"default_profile": false,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweet_count": 0,
"favorite_count": 1,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [
{
"screen_name": "_MattTse",
"name": "Matthew Tse",
"id": 322368276,
"id_str": "322368276",
"indices": [
24,
33
]
}
],
"urls": [
{
"url": "https://t.co/ySk4iYdNbl",
"expanded_url": "https://www.firebase.com/blog/2015-03-05-private-backups-for-firebase-data.html",
"display_url": "firebase.com/blog/2015-03-0…",
"indices": [
91,
114
]
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "en"
},
{
"created_at": "Fri Mar 06 00:10:00 +0000 2015",
"id": 573636613617492000,
"id_str": "573636613617491968",
"text": "HypnotoadSVN: Plugin for SublimeText3 that enables SVN commands. http://t.co/J1ABGgK5TE",
"source": "<a href=\"http://twitterfeed.com\" rel=\"nofollow\">twitterfeed</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 610648816,
"id_str": "610648816",
"name": "Sublime Packages",
"screen_name": "SublimePackages",
"location": "",
"profile_location": null,
"description": "Latest published packages for #SublimeText 2 & 3, news, tutorials, tips & tricks from the users community. Gently curated by @n1k0.",
"url": "http://t.co/6mH5hVQass",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/6mH5hVQass",
"expanded_url": "http://sublime.wbond.net/",
"display_url": "sublime.wbond.net",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 10169,
"friends_count": 6,
"listed_count": 362,
"created_at": "Sun Jun 17 08:56:56 +0000 2012",
"favourites_count": 1,
"utc_offset": null,
"time_zone": null,
"geo_enabled": false,
"verified": false,
"statuses_count": 2637,
"lang": "fr",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "C0DEED",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/2316722487/sublimepackages_icon_normal.png",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/2316722487/sublimepackages_icon_normal.png",
"profile_link_color": "0084B4",
"profile_sidebar_border_color": "C0DEED",
"profile_sidebar_fill_color": "DDEEF6",
"profile_text_color": "333333",
"profile_use_background_image": true,
"default_profile": true,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweet_count": 1,
"favorite_count": 3,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [],
"urls": [
{
"url": "http://t.co/J1ABGgK5TE",
"expanded_url": "http://bit.ly/1CDXsgw",
"display_url": "bit.ly/1CDXsgw",
"indices": [
65,
87
]
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "en"
},
{
"created_at": "Fri Mar 06 00:10:00 +0000 2015",
"id": 573636612724150300,
"id_str": "573636612724150273",
"text": "Terminal In Packages: Sublime text plugin for opening a terminal in the packages directory http://t.co/zPW9J2k7dA",
"source": "<a href=\"http://twitterfeed.com\" rel=\"nofollow\">twitterfeed</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 610648816,
"id_str": "610648816",
"name": "Sublime Packages",
"screen_name": "SublimePackages",
"location": "",
"profile_location": null,
"description": "Latest published packages for #SublimeText 2 & 3, news, tutorials, tips & tricks from the users community. Gently curated by @n1k0.",
"url": "http://t.co/6mH5hVQass",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/6mH5hVQass",
"expanded_url": "http://sublime.wbond.net/",
"display_url": "sublime.wbond.net",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 10169,
"friends_count": 6,
"listed_count": 362,
"created_at": "Sun Jun 17 08:56:56 +0000 2012",
"favourites_count": 1,
"utc_offset": null,
"time_zone": null,
"geo_enabled": false,
"verified": false,
"statuses_count": 2637,
"lang": "fr",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "C0DEED",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/2316722487/sublimepackages_icon_normal.png",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/2316722487/sublimepackages_icon_normal.png",
"profile_link_color": "0084B4",
"profile_sidebar_border_color": "C0DEED",
"profile_sidebar_fill_color": "DDEEF6",
"profile_text_color": "333333",
"profile_use_background_image": true,
"default_profile": true,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweet_count": 1,
"favorite_count": 2,
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [],
"urls": [
{
"url": "http://t.co/zPW9J2k7dA",
"expanded_url": "http://bit.ly/1CDXpRY",
"display_url": "bit.ly/1CDXpRY",
"indices": [
91,
113
]
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "en"
},
{
"created_at": "Fri Mar 06 00:00:03 +0000 2015",
"id": 573634107659317250,
"id_str": "573634107659317248",
"text": "All it takes is npm install -g strongloop to get started building APIs in #nodejs - Check out how easy it is: http://t.co/tAxGc335jB",
"source": "<a href=\"http://sproutsocial.com\" rel=\"nofollow\">Sprout Social</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 1002392005,
"id_str": "1002392005",
"name": "StrongLoop",
"screen_name": "StrongLoop",
"location": "San Francisco & Amsterdam",
"profile_location": null,
"description": "Develop, manage and scale REST APIs with Node.js",
"url": "http://t.co/VMoxuFnPwD",
"entities": {
"url": {
"urls": [
{
"url": "http://t.co/VMoxuFnPwD",
"expanded_url": "http://strongloop.com",
"display_url": "strongloop.com",
"indices": [
0,
22
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 4081,
"friends_count": 245,
"listed_count": 197,
"created_at": "Mon Dec 10 20:05:57 +0000 2012",
"favourites_count": 13,
"utc_offset": -28800,
"time_zone": "Pacific Time (US & Canada)",
"geo_enabled": false,
"verified": false,
"statuses_count": 3306,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "C0DEED",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/483653379021746176/dzkYsMnH_normal.png",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/483653379021746176/dzkYsMnH_normal.png",
"profile_link_color": "0084B4",
"profile_sidebar_border_color": "C0DEED",
"profile_sidebar_fill_color": "DDEEF6",
"profile_text_color": "333333",
"profile_use_background_image": true,
"default_profile": true,
"default_profile_image": false,
"following": true,
"follow_request_sent": false,
"notifications": false
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"retweet_count": 2,
"favorite_count": 2,
"entities": {
"hashtags": [
{
"text": "nodejs",
"indices": [
74,
81
]
}
],
"symbols": [],
"user_mentions": [],
"urls": [
{
"url": "http://t.co/tAxGc335jB",
"expanded_url": "http://bit.ly/1KWEpA7",
"display_url": "bit.ly/1KWEpA7",
"indices": [
110,
132
]
}
]
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"possibly_sensitive_appealable": false,
"lang": "en"
}
];
var rewire = require('rewire'),
assert = require('assert'),
twitter = rewire('./twitter.js'),
mocks = require('./twitter-spec-mock-data.js');
describe('twitter module', function(){
describe('simplify function', function(){
var simplify;
before(function() {
simplify = twitter.__get__('simplify');
});
it('should be defined', function(){
assert.ok(simplify);
});
describe('simplify a tweet', function(){
var tweet, mock;
before(function() {
mock = mocks[0];
tweet = simplify(mock);
});
it('should have 4 properties', function() {
assert.equal( Object.keys(tweet).length, 4 );
});
it('should have date property', function() {
assert.ok(tweet.date);
});
it('should have id property', function() {
assert.ok(tweet.id);
});
it('should have user property', function() {
assert.ok(tweet.user);
});
it('should have id property within user', function() {
assert.ok(tweet.user.id);
});
it('should have tweet property', function() {
assert.ok(tweet.tweet);
});
describe('format dates as `MMMM Do YYYY, h:mm:ss a`', function() {
var revert;
describe('English format', function() {
before(function() {
revert = twitter.__set__('process.env.MomentLang', 'en');
tweet = simplify(mock);
});
it('should be `March 6th 2015, 2:29:13 am`', function() {
assert.equal(tweet.date, 'March 6th 2015, 2:29:13 am');
});
after(function(){
revert();
});
});
describe('Brazilian format', function() {
before(function() {
revert = twitter.__set__('process.env.MomentLang', 'pt-br');
tweet = simplify(mock);
});
it('should be `Março 6º 2015, 2:29:13 am`', function() {
assert.equal(tweet.date, 'Março 6º 2015, 2:29:13 am');
});
after(function(){
revert();
});
});
});
});
});
describe('retrieve timeline feed', function() {
var revert;
before(function() {
revert = twitter.__set__("T.get", function( api, query, callback ) {
callback( null, mocks);
});
});
describe('igorribeirolima timeline', function() {
var tweets;
before(function(done){
twitter('igorribeirolima', function(err, data) {
tweets = data;
done();
});
});
it('should have 19 tweets', function() {
assert.equal(tweets.length, 19);
});
});
after(function() {
revert();
});
});
});
var Twit = require('twit'),
async = require('async'),
moment = require('moment'),
T = new Twit({
consumer_key: process.env.TwitterConsumerKey || '...',
consumer_secret: process.env.TwitterConsumerSecret || '...',
access_token: process.env.TwitterAccessToken || '...',
access_token_secret: process.env.TwitterAccessTokenSecret || '...'
}),
mapReducingTweets = function(tweet, callback) {
callback(null, simplify(tweet));
},
simplify = function(tweet) {
var date = moment(tweet.created_at, "ddd MMM DD HH:mm:ss zz YYYY");
date.lang( process.env.MomentLang );
return {
date: date.format('MMMM Do YYYY, h:mm:ss a'),
id: tweet.id,
user: {
id: tweet.user.id
},
tweet: tweet.text
};
};
module.exports = function(username, callback) {
T.get("statuses/user_timeline", {
screen_name: username,
count: 25
}, function(err, tweets) {
if (err) callback(err);
else async.map(tweets, mapReducingTweets, function(err, simplified_tweets) {
callback(null, simplified_tweets);
});
})
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment