packages feed

twitter-types 0.9.0 → 0.10.0

raw patch · 15 files changed

+2428/−5 lines, 15 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Web.Twitter.Types: DisplayTextRange :: Int -> Int -> DisplayTextRange
+ Web.Twitter.Types: [displayTextRangeEnd] :: DisplayTextRange -> Int
+ Web.Twitter.Types: [displayTextRangeStart] :: DisplayTextRange -> Int
+ Web.Twitter.Types: [statusDisplayTextRange] :: Status -> Maybe DisplayTextRange
+ Web.Twitter.Types: data DisplayTextRange
+ Web.Twitter.Types: instance Data.Aeson.Types.FromJSON.FromJSON Web.Twitter.Types.DisplayTextRange
+ Web.Twitter.Types: instance Data.Aeson.Types.ToJSON.ToJSON Web.Twitter.Types.DisplayTextRange
+ Web.Twitter.Types: instance Data.Data.Data Web.Twitter.Types.DisplayTextRange
+ Web.Twitter.Types: instance GHC.Classes.Eq Web.Twitter.Types.DisplayTextRange
+ Web.Twitter.Types: instance GHC.Classes.Ord Web.Twitter.Types.DisplayTextRange
+ Web.Twitter.Types: instance GHC.Generics.Generic Web.Twitter.Types.DisplayTextRange
+ Web.Twitter.Types: instance GHC.Show.Show Web.Twitter.Types.DisplayTextRange
- Web.Twitter.Types: Status :: Maybe [Contributor] -> Maybe Coordinates -> UTCTime -> Maybe StatusId -> Maybe Entities -> Maybe ExtendedEntities -> Integer -> Maybe Bool -> Maybe Text -> StatusId -> Maybe Text -> Maybe StatusId -> Maybe UserId -> Maybe LanguageCode -> Maybe Place -> Maybe Bool -> Maybe Object -> Maybe StatusId -> Maybe Status -> Integer -> Maybe Bool -> Maybe Status -> Text -> Text -> Bool -> User -> Maybe Bool -> Maybe [Text] -> Maybe Text -> Status
+ Web.Twitter.Types: Status :: Maybe [Contributor] -> Maybe Coordinates -> UTCTime -> Maybe StatusId -> Maybe Entities -> Maybe ExtendedEntities -> Integer -> Maybe Bool -> Maybe Text -> StatusId -> Maybe Text -> Maybe StatusId -> Maybe UserId -> Maybe LanguageCode -> Maybe Place -> Maybe Bool -> Maybe Object -> Maybe StatusId -> Maybe Status -> Integer -> Maybe Bool -> Maybe Status -> Text -> Text -> Bool -> User -> Maybe Bool -> Maybe [Text] -> Maybe Text -> Maybe DisplayTextRange -> Status

Files

Web/Twitter/Types.hs view
@@ -1,4 +1,8 @@-{-# LANGUAGE OverloadedStrings, DeriveDataTypeable, RecordWildCards, DeriveGeneric #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RecordWildCards #-}  module Web.Twitter.Types        ( UserId@@ -35,6 +39,7 @@        , Contributor(..)        , UploadedMedia (..)        , ImageSizeType (..)+       , DisplayTextRange (..)        , checkError        , twitterTimeFormat        )@@ -147,6 +152,7 @@     , statusWithheldCopyright :: Maybe Bool     , statusWithheldInCountries :: Maybe [Text]     , statusWithheldScope :: Maybe Text+    , statusDisplayTextRange :: Maybe DisplayTextRange     } deriving (Show, Eq, Data, Typeable, Generic)  instance FromJSON Status where@@ -174,12 +180,13 @@                <*> o .:? "retweeted"                <*> o .:? "retweeted_status"                <*> o .:  "source"-               <*> o .:  "text"+               <*> (o .: "full_text" <|> o .: "text")                <*> o .:  "truncated"                <*> o .:  "user"                <*> o .:? "withheld_copyright"                <*> o .:? "withheld_in_countries"                <*> o .:? "withheld_scope"+               <*> o .:? "display_text_range"     parseJSON v = fail $ "couldn't parse status from: " ++ show v  instance ToJSON Status where@@ -214,6 +221,7 @@                                , "withheld_copyright"       .= statusWithheldCopyright                                , "withheld_in_countries"    .= statusWithheldInCountries                                , "withheld_scope"           .= statusWithheldScope+                               , "display_text_range"       .= statusDisplayTextRange                                ]  data SearchResult body =@@ -978,3 +986,18 @@                                       , "size"      .= uploadedMediaSize                                       , "image"     .= uploadedMediaImage                                       ]++-- | unicode code point indices, identifying the inclusive start and exclusive end of the displayable content of the Tweet.+data DisplayTextRange = DisplayTextRange+    { displayTextRangeStart :: Int+    , displayTextRangeEnd :: Int -- ^ exclusive+    } deriving (Show, Eq, Ord, Data, Typeable, Generic)++instance FromJSON DisplayTextRange where+    parseJSON v = do+        parseJSON v >>= \case+            [s, e] -> pure $ DisplayTextRange s e+            unexpected ->+                fail $ "parsing DisplayTextRange failed, expected [Int, Int], but got: " ++ show unexpected+instance ToJSON DisplayTextRange where+    toJSON (DisplayTextRange s e) = toJSON [s, e]
tests/Instances.hs view
@@ -69,6 +69,7 @@                <*> arbitrary                <*> arbitrary                <*> arbitrary+               <*> arbitrary  instance Arbitrary SearchStatus where     arbitrary = genericArbitraryU@@ -159,4 +160,6 @@ instance Arbitrary ImageSizeType where     arbitrary = genericArbitraryU instance Arbitrary UploadedMedia where+    arbitrary = genericArbitraryU+instance Arbitrary DisplayTextRange where     arbitrary = genericArbitraryU
+ tests/StatusTest.hs view
@@ -0,0 +1,169 @@+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE OverloadedStrings #-}++module StatusTest where++import Data.Aeson+import qualified Data.Aeson.Types as Aeson+import qualified Data.HashMap.Strict as M+import Data.Maybe+import Fixtures+import Instances()+import Test.Tasty+import Test.Tasty.HUnit+import Test.Tasty.TH+import Web.Twitter.Types++example_compatibility_classic_13995 :: Status -> Assertion+example_compatibility_classic_13995 obj = do+    statusCreatedAt obj @?= "Mon Mar 07 15:13:47 +0000 2016"+    statusId obj @?= 706860403981099008+    statusText obj @?= "Peek-a-boo! https://t.co/R3P6waHxRa"+    statusSource obj @?= "<a href=\"http://www.apple.com/\" rel=\"nofollow\">OS X</a>"+    statusTruncated obj @?= False+    statusEntities obj @?=+        Just+            (Entities+             { enHashTags = []+             , enUserMentions = []+             , enURLs = []+             , enMedia =+                   [ Entity+                     { entityBody =+                           MediaEntity+                           { meType = "photo"+                           , meId = 706860403746181121+                           , meSizes =+                                 M.fromList+                                     [ ( "small"+                                       , MediaSize+                                         { msWidth = 340+                                         , msHeight = 226+                                         , msResize = "fit"+                                         })+                                     , ( "large"+                                       , MediaSize+                                         { msWidth = 1024+                                         , msHeight = 680+                                         , msResize = "fit"+                                         })+                                     , ( "medium"+                                       , MediaSize+                                         { msWidth = 600+                                         , msHeight = 398+                                         , msResize = "fit"+                                         })+                                     , ( "thumb"+                                       , MediaSize+                                         { msWidth = 150+                                         , msHeight = 150+                                         , msResize = "crop"+                                         })+                                     ]+                           , meMediaURL = "http://pbs.twimg.com/media/Cc9FyscUkAEQaOw.jpg"+                           , meMediaURLHttps = "https://pbs.twimg.com/media/Cc9FyscUkAEQaOw.jpg"+                           , meURL =+                                 URLEntity+                                 { ueURL = "https://t.co/R3P6waHxRa"+                                 , ueExpanded = "http://twitter.com/jeremycloud/status/706860403981099008/photo/1"+                                 , ueDisplay = "pic.twitter.com/R3P6waHxRa"+                                 }+                           }+                     , entityIndices = [12, 35]+                     }+                   ]+             })+    statusExtendedEntities obj @?=+        Just+            (ExtendedEntities+             { exeMedia =+                   [ Entity+                     { entityBody =+                           ExtendedEntity+                           { exeID = 706860403746181121+                           , exeMediaUrl = "http://pbs.twimg.com/media/Cc9FyscUkAEQaOw.jpg"+                           , exeMediaUrlHttps = "https://pbs.twimg.com/media/Cc9FyscUkAEQaOw.jpg"+                           , exeSizes =+                                 M.fromList+                                     [ ( "small"+                                       , MediaSize+                                         { msWidth = 340+                                         , msHeight = 226+                                         , msResize = "fit"+                                         })+                                     , ( "large"+                                       , MediaSize+                                         { msWidth = 1024+                                         , msHeight = 680+                                         , msResize = "fit"+                                         })+                                     , ( "medium"+                                       , MediaSize+                                         { msWidth = 600+                                         , msHeight = 398+                                         , msResize = "fit"+                                         })+                                     , ( "thumb"+                                       , MediaSize+                                         { msWidth = 150+                                         , msHeight = 150+                                         , msResize = "crop"+                                         })+                                     ]+                           , exeType = "photo"+                           , exeDurationMillis = Nothing+                           , exeExtAltText = Nothing+                           , exeURL =+                                 URLEntity+                                 { ueURL = "https://t.co/R3P6waHxRa"+                                 , ueExpanded = "http://twitter.com/jeremycloud/status/706860403981099008/photo/1"+                                 , ueDisplay = "pic.twitter.com/R3P6waHxRa"+                                 }+                           }+                     , entityIndices = [12, 35]+                     }+                   ]+             })+    statusInReplyToStatusId obj @?= Nothing+    statusInReplyToUserId obj @?= Nothing+    statusFavorited obj @?= Just False+    statusQuotedStatus obj @?= Nothing+    statusQuotedStatusId obj @?= Nothing+    statusRetweetCount obj @?= 0+    (userScreenName . statusUser) obj @?= "jeremycloud"+    statusRetweetedStatus obj @?= Nothing+    statusPlace obj @?= Nothing+    statusFavoriteCount obj @?= 8+    statusLang obj @?= Just "en"+    statusPossiblySensitive obj @?= Just False+    statusCoordinates obj @?= Nothing++case_compatibility_classic_13995 :: Assertion+case_compatibility_classic_13995 = do+    withFixtureJSON "tweet-updates/compatibility_classic_13995.json" $ example_compatibility_classic_13995+    withFixtureJSON "tweet-updates/compatibility_classic_13995_extended.json" $ example_compatibility_classic_13995++-- case_compatibility_classic_hidden_13797 :: Assertion+-- case_compatibility_classic_hidden_13797 = withFixtureJSON "tweet-updates/compatibility_classic_hidden_13797" $ \obj -> do+-- case_compatibility_extended_13996 :: Assertion+-- case_compatibility_extended_13996 = withFixtureJSON "tweet-updates/compatibility_extended_13996" $ \obj -> do+-- case_compatibilityplus_classic_13994 :: Assertion+-- case_compatibilityplus_classic_13994 = withFixtureJSON "tweet-updates/compatibilityplus_classic_13994" $ \obj -> do+-- case_compatibilityplus_classic_hidden_13797 :: Assertion+-- case_compatibilityplus_classic_hidden_13797 = withFixtureJSON "tweet-updates/compatibilityplus_classic_hidden_13797" $ \obj -> do+-- case_compatibilityplus_extended_13997 :: Assertion+-- case_compatibilityplus_extended_13997 = withFixtureJSON "tweet-updates/compatibilityplus_extended_13997" $ \obj -> do+-- case_extended_classic_14002 :: Assertion+-- case_extended_classic_14002 = withFixtureJSON "tweet-updates/extended_classic_14002" $ \obj -> do+-- case_extended_classic_hidden_13761 :: Assertion+-- case_extended_classic_hidden_13761 = withFixtureJSON "tweet-updates/extended_classic_hidden_13761" $ \obj -> do++case_extended_extended_14001 :: Assertion+case_extended_extended_14001 = withFixtureJSON "tweet-updates/extended_extended_14001.json" $ \obj -> do+    statusText obj @?= "@twitter @twitterdev has more details about these changes at https://t.co/ZnXoRQy8mK.  Thanks for making @twitter more expressive! https://t.co/AWmiH870F7"+    statusTruncated obj @?= False+    statusDisplayTextRange obj @?= Just (DisplayTextRange 9 130)++tests :: TestTree+tests = $(testGroupGenerator)+
+ tests/fixtures/tweet-updates/compatibility_classic_13995.json view
@@ -0,0 +1,169 @@+{+  "created_at": "Mon Mar 07 15:13:47 +0000 2016",+  "id": 706860403981099008,+  "id_str": "706860403981099008",+  "text": "Peek-a-boo! https://t.co/R3P6waHxRa",+  "entities": {+    "hashtags": [],+    "symbols": [],+    "user_mentions": [],+    "urls": [],+    "media": [+      {+        "id": 706860403746181121,+        "id_str": "706860403746181121",+        "indices": [+          12,+          35+        ],+        "media_url": "http://pbs.twimg.com/media/Cc9FyscUkAEQaOw.jpg",+        "media_url_https": "https://pbs.twimg.com/media/Cc9FyscUkAEQaOw.jpg",+        "url": "https://t.co/R3P6waHxRa",+        "display_url": "pic.twitter.com/R3P6waHxRa",+        "expanded_url": "http://twitter.com/jeremycloud/status/706860403981099008/photo/1",+        "type": "photo",+        "sizes": {+          "medium": {+            "w": 600,+            "h": 398,+            "resize": "fit"+          },+          "small": {+            "w": 340,+            "h": 226,+            "resize": "fit"+          },+          "thumb": {+            "w": 150,+            "h": 150,+            "resize": "crop"+          },+          "large": {+            "w": 1024,+            "h": 680,+            "resize": "fit"+          }+        }+      }+    ]+  },+  "extended_entities": {+    "media": [+      {+        "id": 706860403746181121,+        "id_str": "706860403746181121",+        "indices": [+          12,+          35+        ],+        "media_url": "http://pbs.twimg.com/media/Cc9FyscUkAEQaOw.jpg",+        "media_url_https": "https://pbs.twimg.com/media/Cc9FyscUkAEQaOw.jpg",+        "url": "https://t.co/R3P6waHxRa",+        "display_url": "pic.twitter.com/R3P6waHxRa",+        "expanded_url": "http://twitter.com/jeremycloud/status/706860403981099008/photo/1",+        "type": "photo",+        "sizes": {+          "medium": {+            "w": 600,+            "h": 398,+            "resize": "fit"+          },+          "small": {+            "w": 340,+            "h": 226,+            "resize": "fit"+          },+          "thumb": {+            "w": 150,+            "h": 150,+            "resize": "crop"+          },+          "large": {+            "w": 1024,+            "h": 680,+            "resize": "fit"+          }+        }+      }+    ]+  },+  "truncated": false,+  "source": "<a href=\"http://www.apple.com/\" rel=\"nofollow\">OS X</a>",+  "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": 15062340,+    "id_str": "15062340",+    "name": "/dev/cloud/jeremy",+    "screen_name": "jeremycloud",+    "location": "Madison, Wisconsin",+    "description": "Professional yak shaver. Amateur bike shedder.",+    "url": "https://t.co/FcYeBkOpVY",+    "entities": {+      "url": {+        "urls": [+          {+            "url": "https://t.co/FcYeBkOpVY",+            "expanded_url": "http://about.me/jeremy.cloud",+            "display_url": "about.me/jeremy.cloud",+            "indices": [+              0,+              23+            ]+          }+        ]+      },+      "description": {+        "urls": []+      }+    },+    "protected": false,+    "followers_count": 4324,+    "friends_count": 410,+    "listed_count": 103,+    "created_at": "Mon Jun 09 17:00:58 +0000 2008",+    "favourites_count": 815,+    "utc_offset": -18000,+    "time_zone": "Central Time (US & Canada)",+    "geo_enabled": true,+    "verified": false,+    "statuses_count": 2218,+    "lang": "en",+    "contributors_enabled": false,+    "is_translator": false,+    "is_translation_enabled": false,+    "profile_background_color": "000000",+    "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/436903139183054849/i_MbCcoW_normal.jpeg",+    "profile_image_url_https": "https://pbs.twimg.com/profile_images/436903139183054849/i_MbCcoW_normal.jpeg",+    "profile_banner_url": "https://pbs.twimg.com/profile_banners/15062340/1447451621",+    "profile_link_color": "4A913C",+    "profile_sidebar_border_color": "000000",+    "profile_sidebar_fill_color": "000000",+    "profile_text_color": "000000",+    "profile_use_background_image": false,+    "has_extended_profile": true,+    "default_profile": false,+    "default_profile_image": false,+    "following": true,+    "follow_request_sent": false,+    "notifications": false+  },+  "geo": null,+  "coordinates": null,+  "place": null,+  "contributors": null,+  "is_quote_status": false,+  "retweet_count": 0,+  "favorite_count": 8,+  "favorited": false,+  "retweeted": false,+  "possibly_sensitive": false,+  "possibly_sensitive_appealable": false,+  "lang": "en"+}
+ tests/fixtures/tweet-updates/compatibility_classic_13995_extended.json view
@@ -0,0 +1,173 @@+{+  "created_at": "Mon Mar 07 15:13:47 +0000 2016",+  "id": 706860403981099008,+  "id_str": "706860403981099008",+  "full_text": "Peek-a-boo! https://t.co/R3P6waHxRa",+  "display_text_range": [+    0,+    35+  ],+  "entities": {+    "hashtags": [],+    "symbols": [],+    "user_mentions": [],+    "urls": [],+    "media": [+      {+        "id": 706860403746181121,+        "id_str": "706860403746181121",+        "indices": [+          12,+          35+        ],+        "media_url": "http://pbs.twimg.com/media/Cc9FyscUkAEQaOw.jpg",+        "media_url_https": "https://pbs.twimg.com/media/Cc9FyscUkAEQaOw.jpg",+        "url": "https://t.co/R3P6waHxRa",+        "display_url": "pic.twitter.com/R3P6waHxRa",+        "expanded_url": "http://twitter.com/jeremycloud/status/706860403981099008/photo/1",+        "type": "photo",+        "sizes": {+          "medium": {+            "w": 600,+            "h": 398,+            "resize": "fit"+          },+          "small": {+            "w": 340,+            "h": 226,+            "resize": "fit"+          },+          "thumb": {+            "w": 150,+            "h": 150,+            "resize": "crop"+          },+          "large": {+            "w": 1024,+            "h": 680,+            "resize": "fit"+          }+        }+      }+    ]+  },+  "extended_entities": {+    "media": [+      {+        "id": 706860403746181121,+        "id_str": "706860403746181121",+        "indices": [+          12,+          35+        ],+        "media_url": "http://pbs.twimg.com/media/Cc9FyscUkAEQaOw.jpg",+        "media_url_https": "https://pbs.twimg.com/media/Cc9FyscUkAEQaOw.jpg",+        "url": "https://t.co/R3P6waHxRa",+        "display_url": "pic.twitter.com/R3P6waHxRa",+        "expanded_url": "http://twitter.com/jeremycloud/status/706860403981099008/photo/1",+        "type": "photo",+        "sizes": {+          "medium": {+            "w": 600,+            "h": 398,+            "resize": "fit"+          },+          "small": {+            "w": 340,+            "h": 226,+            "resize": "fit"+          },+          "thumb": {+            "w": 150,+            "h": 150,+            "resize": "crop"+          },+          "large": {+            "w": 1024,+            "h": 680,+            "resize": "fit"+          }+        }+      }+    ]+  },+  "truncated": false,+  "source": "<a href=\"http://www.apple.com/\" rel=\"nofollow\">OS X</a>",+  "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": 15062340,+    "id_str": "15062340",+    "name": "/dev/cloud/jeremy",+    "screen_name": "jeremycloud",+    "location": "Madison, Wisconsin",+    "description": "Professional yak shaver. Amateur bike shedder.",+    "url": "https://t.co/FcYeBkOpVY",+    "entities": {+      "url": {+        "urls": [+          {+            "url": "https://t.co/FcYeBkOpVY",+            "expanded_url": "http://about.me/jeremy.cloud",+            "display_url": "about.me/jeremy.cloud",+            "indices": [+              0,+              23+            ]+          }+        ]+      },+      "description": {+        "urls": []+      }+    },+    "protected": false,+    "followers_count": 4324,+    "friends_count": 410,+    "listed_count": 103,+    "created_at": "Mon Jun 09 17:00:58 +0000 2008",+    "favourites_count": 815,+    "utc_offset": -18000,+    "time_zone": "Central Time (US & Canada)",+    "geo_enabled": true,+    "verified": false,+    "statuses_count": 2218,+    "lang": "en",+    "contributors_enabled": false,+    "is_translator": false,+    "is_translation_enabled": false,+    "profile_background_color": "000000",+    "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/436903139183054849/i_MbCcoW_normal.jpeg",+    "profile_image_url_https": "https://pbs.twimg.com/profile_images/436903139183054849/i_MbCcoW_normal.jpeg",+    "profile_banner_url": "https://pbs.twimg.com/profile_banners/15062340/1447451621",+    "profile_link_color": "4A913C",+    "profile_sidebar_border_color": "000000",+    "profile_sidebar_fill_color": "000000",+    "profile_text_color": "000000",+    "profile_use_background_image": false,+    "has_extended_profile": true,+    "default_profile": false,+    "default_profile_image": false,+    "following": true,+    "follow_request_sent": false,+    "notifications": false+  },+  "geo": null,+  "coordinates": null,+  "place": null,+  "contributors": null,+  "is_quote_status": false,+  "retweet_count": 0,+  "favorite_count": 8,+  "favorited": false,+  "retweeted": false,+  "possibly_sensitive": false,+  "possibly_sensitive_appealable": false,+  "lang": "en"+}
+ tests/fixtures/tweet-updates/compatibility_classic_hidden_13797.json view
@@ -0,0 +1,270 @@+{+  "created_at": "Thu Mar 10 23:12:12 +0000 2016",+  "id": 708067963060916224,+  "id_str": "708067963060916224",+  "text": "@jeremycloud Who would win in a battle between a Barred Owl and a Cooper's Hawk? https://t.co/FamikDro2h",+  "entities": {+    "hashtags": [],+    "symbols": [],+    "user_mentions": [+      {+        "screen_name": "jeremycloud",+        "name": "/dev/cloud/jeremy",+        "id": 15062340,+        "id_str": "15062340",+        "indices": [+          0,+          12+        ]+      }+    ],+    "urls": [+      {+        "url": "https://t.co/FamikDro2h",+        "expanded_url": "https://twitter.com/jeremycloud/status/703621193417379840",+        "display_url": "twitter.com/jeremycloud/st…",+        "indices": [+          81,+          104+        ]+      }+    ]+  },+  "truncated": false,+  "source": "bonesTwurl",+  "in_reply_to_status_id": 704059336788606976,+  "in_reply_to_status_id_str": "704059336788606976",+  "in_reply_to_user_id": 15062340,+  "in_reply_to_user_id_str": "15062340",+  "in_reply_to_screen_name": "jeremycloud",+  "user": {+    "id": 4449621923,+    "id_str": "4449621923",+    "name": "Mr Bones",+    "screen_name": "MrBonesDroid",+    "location": "",+    "profile_location": null,+    "description": "",+    "url": null,+    "entities": {+    "description": {+    "urls": []+     }+    },+    "protected": true,+    "followers_count": 5,+    "friends_count": 7,+    "listed_count": 0,+    "created_at": "Fri Dec 11 15:18:02 +0000 2015",+    "favourites_count": 7,+    "utc_offset": -25200,+    "time_zone": "Pacific Time (US & Canada)",+    "geo_enabled": false,+    "verified": false,+    "statuses_count": 35,+    "lang": "en-gb",+    "contributors_enabled": false,+    "is_translator": false,+    "is_translation_enabled": false,+    "profile_background_color": "F5F8FA",+    "profile_background_image_url": null,+    "profile_background_image_url_https": null,+    "profile_background_tile": false,+    "profile_image_url": "http://pbs.twimg.com/profile_images/677097663288860672/zZxWCPSI_normal.jpg",+    "profile_image_url_https": "https://pbs.twimg.com/profile_images/677097663288860672/zZxWCPSI_normal.jpg",+    "profile_link_color": "2B7BB9",+    "profile_sidebar_border_color": "C0DEED",+    "profile_sidebar_fill_color": "DDEEF6",+    "profile_text_color": "333333",+    "profile_use_background_image": true,+    "has_extended_profile": false,+    "default_profile": true,+    "default_profile_image": false,+    "following": true,+    "follow_request_sent": false,+    "notifications": false+  },+  "geo": null,+  "coordinates": null,+  "place": null,+  "contributors": null,+  "quoted_status_id": 703621193417379840,+  "quoted_status_id_str": "703621193417379840",+  "quoted_status": {+    "created_at": "Sat Feb 27 16:42:19 +0000 2016",+    "id": 703621193417379840,+    "id_str": "703621193417379840",+    "text": "Cooper’s Hawk https://t.co/nppuOGne9X",+    "entities": {+      "hashtags": [],+      "symbols": [],+      "user_mentions": [],+      "urls": [],+      "media": [+        {+          "id": 703621193182502913,+          "id_str": "703621193182502913",+          "indices": [+            14,+            37+          ],+          "media_url": "http://pbs.twimg.com/media/CcPDv0wUYAE3D-2.jpg",+          "media_url_https": "https://pbs.twimg.com/media/CcPDv0wUYAE3D-2.jpg",+          "url": "https://t.co/nppuOGne9X",+          "display_url": "pic.twitter.com/nppuOGne9X",+          "expanded_url": "http://twitter.com/jeremycloud/status/703621193417379840/photo/1",+          "type": "photo",+          "sizes": {+            "medium": {+              "w": 600,+              "h": 398,+              "resize": "fit"+            },+            "thumb": {+              "w": 150,+              "h": 150,+              "resize": "crop"+            },+            "large": {+              "w": 1024,+              "h": 680,+              "resize": "fit"+            },+            "small": {+              "w": 340,+              "h": 226,+              "resize": "fit"+            }+          }+        }+      ]+    },+    "extended_entities": {+      "media": [+        {+          "id": 703621193182502913,+          "id_str": "703621193182502913",+          "indices": [+            14,+            37+          ],+          "media_url": "http://pbs.twimg.com/media/CcPDv0wUYAE3D-2.jpg",+          "media_url_https": "https://pbs.twimg.com/media/CcPDv0wUYAE3D-2.jpg",+          "url": "https://t.co/nppuOGne9X",+          "display_url": "pic.twitter.com/nppuOGne9X",+          "expanded_url": "http://twitter.com/jeremycloud/status/703621193417379840/photo/1",+          "type": "photo",+          "sizes": {+            "medium": {+              "w": 600,+              "h": 398,+              "resize": "fit"+            },+            "thumb": {+              "w": 150,+              "h": 150,+              "resize": "crop"+            },+            "large": {+              "w": 1024,+              "h": 680,+              "resize": "fit"+            },+            "small": {+              "w": 340,+              "h": 226,+              "resize": "fit"+            }+          }+        }+      ]+    },+    "truncated": false,+    "source": "<a href=\"http://www.apple.com/\" rel=\"nofollow\">OS X</a>",+    "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": 15062340,+      "id_str": "15062340",+      "name": "/dev/cloud/jeremy",+      "screen_name": "jeremycloud",+      "location": "Madison, Wisconsin",+      "description": "Professional yak shaver. Amateur bike shedder.",+      "url": "https://t.co/FcYeBkOpVY",+      "entities": {+        "url": {+          "urls": [+            {+              "url": "https://t.co/FcYeBkOpVY",+              "expanded_url": "http://about.me/jeremy.cloud",+              "display_url": "about.me/jeremy.cloud",+              "indices": [+                0,+                23+              ]+            }+          ]+        },+        "description": {+          "urls": []+        }+      },+      "protected": false,+      "followers_count": 4329,+      "friends_count": 411,+      "listed_count": 103,+      "created_at": "Mon Jun 09 17:00:58 +0000 2008",+      "favourites_count": 803,+      "utc_offset": -21600,+      "time_zone": "Central Time (US & Canada)",+      "geo_enabled": true,+      "verified": false,+      "statuses_count": 2216,+      "lang": "en",+      "contributors_enabled": false,+      "is_translator": false,+      "is_translation_enabled": false,+      "profile_background_color": "000000",+      "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/436903139183054849/i_MbCcoW_normal.jpeg",+      "profile_image_url_https": "https://pbs.twimg.com/profile_images/436903139183054849/i_MbCcoW_normal.jpeg",+      "profile_banner_url": "https://pbs.twimg.com/profile_banners/15062340/1447451621",+      "profile_link_color": "4A913C",+      "profile_sidebar_border_color": "000000",+      "profile_sidebar_fill_color": "000000",+      "profile_text_color": "000000",+      "profile_use_background_image": false,+      "has_extended_profile": true,+      "default_profile": false,+      "default_profile_image": false,+      "following": true,+      "follow_request_sent": false,+      "notifications": false+    },+    "geo": null,+    "coordinates": null,+    "place": null,+    "contributors": null,+    "is_quote_status": false,+    "retweet_count": 0,+    "favorite_count": 2,+    "favorited": false,+    "retweeted": false,+    "possibly_sensitive": false,+    "possibly_sensitive_appealable": false,+    "lang": "en"+  },+  "is_quote_status": true,+  "retweet_count": 0,+  "favorite_count": 0,+  "favorited": false,+  "retweeted": false,+  "possibly_sensitive": false,+  "possibly_sensitive_appealable": false,+  "lang": "en"+}
+ tests/fixtures/tweet-updates/compatibility_extended_13996.json view
@@ -0,0 +1,278 @@+{+  "created_at": "Thu Mar 10 23:12:12 +0000 2016",+  "id": 708067963060916224,+  "id_str": "708067963060916224",+  "full_text": "@jeremycloud Who would win in a battle between a Barred Owl and a Cooper's Hawk? https://t.co/FamikDro2h",+  "display_text_range": [+    13,+    80+  ],+  "entities": {+    "hashtags": [],+    "symbols": [],+    "user_mentions": [+      {+        "screen_name": "jeremycloud",+        "name": "/dev/cloud/jeremy",+        "id": 15062340,+        "id_str": "15062340",+        "indices": [+          0,+          12+        ]+      }+    ],+    "urls": [+      {+        "url": "https://t.co/FamikDro2h",+        "expanded_url": "https://twitter.com/jeremycloud/status/703621193417379840",+        "display_url": "twitter.com/jeremycloud/st…",+        "indices": [+          81,+          104+        ]+      }+    ]+  },+  "truncated": false,+  "source": "bonesTwurl",+  "in_reply_to_status_id": 704059336788606976,+  "in_reply_to_status_id_str": "704059336788606976",+  "in_reply_to_user_id": 15062340,+  "in_reply_to_user_id_str": "15062340",+  "in_reply_to_screen_name": "jeremycloud",+  "user": {+    "id": 4449621923,+    "id_str": "4449621923",+    "name": "Mr Bones",+    "screen_name": "MrBonesDroid",+    "location": "",+    "profile_location": null,+    "description": "",+    "url": null,+    "entities": {+    "description": {+    "urls": []+     }+    },+    "protected": true,+    "followers_count": 5,+    "friends_count": 7,+    "listed_count": 0,+    "created_at": "Fri Dec 11 15:18:02 +0000 2015",+    "favourites_count": 7,+    "utc_offset": -25200,+    "time_zone": "Pacific Time (US & Canada)",+    "geo_enabled": false,+    "verified": false,+    "statuses_count": 35,+    "lang": "en-gb",+    "contributors_enabled": false,+    "is_translator": false,+    "is_translation_enabled": false,+    "profile_background_color": "F5F8FA",+    "profile_background_image_url": null,+    "profile_background_image_url_https": null,+    "profile_background_tile": false,+    "profile_image_url": "http://pbs.twimg.com/profile_images/677097663288860672/zZxWCPSI_normal.jpg",+    "profile_image_url_https": "https://pbs.twimg.com/profile_images/677097663288860672/zZxWCPSI_normal.jpg",+    "profile_link_color": "2B7BB9",+    "profile_sidebar_border_color": "C0DEED",+    "profile_sidebar_fill_color": "DDEEF6",+    "profile_text_color": "333333",+    "profile_use_background_image": true,+    "has_extended_profile": false,+    "default_profile": true,+    "default_profile_image": false,+    "following": true,+    "follow_request_sent": false,+    "notifications": false+  },+  "geo": null,+  "coordinates": null,+  "place": null,+  "contributors": null,+  "quoted_status_id": 703621193417379840,+  "quoted_status_id_str": "703621193417379840",+  "quoted_status": {+    "created_at": "Sat Feb 27 16:42:19 +0000 2016",+    "id": 703621193417379840,+    "id_str": "703621193417379840",+    "full_text": "Cooper’s Hawk https://t.co/nppuOGne9X",+    "display_text_range": [+      0,+      37+    ],+    "entities": {+      "hashtags": [],+      "symbols": [],+      "user_mentions": [],+      "urls": [],+      "media": [+        {+          "id": 703621193182502913,+          "id_str": "703621193182502913",+          "indices": [+            14,+            37+          ],+          "media_url": "http://pbs.twimg.com/media/CcPDv0wUYAE3D-2.jpg",+          "media_url_https": "https://pbs.twimg.com/media/CcPDv0wUYAE3D-2.jpg",+          "url": "https://t.co/nppuOGne9X",+          "display_url": "pic.twitter.com/nppuOGne9X",+          "expanded_url": "http://twitter.com/jeremycloud/status/703621193417379840/photo/1",+          "type": "photo",+          "sizes": {+            "medium": {+              "w": 600,+              "h": 398,+              "resize": "fit"+            },+            "thumb": {+              "w": 150,+              "h": 150,+              "resize": "crop"+            },+            "large": {+              "w": 1024,+              "h": 680,+              "resize": "fit"+            },+            "small": {+              "w": 340,+              "h": 226,+              "resize": "fit"+            }+          }+        }+      ]+    },+    "extended_entities": {+      "media": [+        {+          "id": 703621193182502913,+          "id_str": "703621193182502913",+          "indices": [+            14,+            37+          ],+          "media_url": "http://pbs.twimg.com/media/CcPDv0wUYAE3D-2.jpg",+          "media_url_https": "https://pbs.twimg.com/media/CcPDv0wUYAE3D-2.jpg",+          "url": "https://t.co/nppuOGne9X",+          "display_url": "pic.twitter.com/nppuOGne9X",+          "expanded_url": "http://twitter.com/jeremycloud/status/703621193417379840/photo/1",+          "type": "photo",+          "sizes": {+            "medium": {+              "w": 600,+              "h": 398,+              "resize": "fit"+            },+            "thumb": {+              "w": 150,+              "h": 150,+              "resize": "crop"+            },+            "large": {+              "w": 1024,+              "h": 680,+              "resize": "fit"+            },+            "small": {+              "w": 340,+              "h": 226,+              "resize": "fit"+            }+          }+        }+      ]+    },+    "truncated": false,+    "source": "<a href=\"http://www.apple.com/\" rel=\"nofollow\">OS X</a>",+    "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": 15062340,+      "id_str": "15062340",+      "name": "/dev/cloud/jeremy",+      "screen_name": "jeremycloud",+      "location": "Madison, Wisconsin",+      "description": "Professional yak shaver. Amateur bike shedder.",+      "url": "https://t.co/FcYeBkOpVY",+      "entities": {+        "url": {+          "urls": [+            {+              "url": "https://t.co/FcYeBkOpVY",+              "expanded_url": "http://about.me/jeremy.cloud",+              "display_url": "about.me/jeremy.cloud",+              "indices": [+                0,+                23+              ]+            }+          ]+        },+        "description": {+          "urls": []+        }+      },+      "protected": false,+      "followers_count": 4329,+      "friends_count": 411,+      "listed_count": 103,+      "created_at": "Mon Jun 09 17:00:58 +0000 2008",+      "favourites_count": 803,+      "utc_offset": -21600,+      "time_zone": "Central Time (US & Canada)",+      "geo_enabled": true,+      "verified": false,+      "statuses_count": 2216,+      "lang": "en",+      "contributors_enabled": false,+      "is_translator": false,+      "is_translation_enabled": false,+      "profile_background_color": "000000",+      "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/436903139183054849/i_MbCcoW_normal.jpeg",+      "profile_image_url_https": "https://pbs.twimg.com/profile_images/436903139183054849/i_MbCcoW_normal.jpeg",+      "profile_banner_url": "https://pbs.twimg.com/profile_banners/15062340/1447451621",+      "profile_link_color": "4A913C",+      "profile_sidebar_border_color": "000000",+      "profile_sidebar_fill_color": "000000",+      "profile_text_color": "000000",+      "profile_use_background_image": false,+      "has_extended_profile": true,+      "default_profile": false,+      "default_profile_image": false,+      "following": true,+      "follow_request_sent": false,+      "notifications": false+    },+    "geo": null,+    "coordinates": null,+    "place": null,+    "contributors": null,+    "is_quote_status": false,+    "retweet_count": 0,+    "favorite_count": 2,+    "favorited": false,+    "retweeted": false,+    "possibly_sensitive": false,+    "possibly_sensitive_appealable": false,+    "lang": "en"+  },+  "is_quote_status": true,+  "retweet_count": 0,+  "favorite_count": 0,+  "favorited": false,+  "retweeted": false,+  "possibly_sensitive": false,+  "possibly_sensitive_appealable": false,+  "lang": "en"+}
+ tests/fixtures/tweet-updates/compatibilityplus_classic_13994.json view
@@ -0,0 +1,270 @@+{+  "created_at": "Mon Mar 28 14:39:13 +0000 2016",+  "id": 714461850188926976,+  "id_str": "714461850188926976",+  "text": "@jeremycloud It's neat to have owls and raccoons around until you realize that raccoons will eat the eggs from the … https://t.co/OY7qmdJQnO",+  "entities": {+    "hashtags": [],+    "symbols": [],+    "user_mentions": [+      {+        "screen_name": "jeremycloud",+        "name": "/dev/cloud/jeremy",+        "id": 15062340,+        "id_str": "15062340",+        "indices": [+          0,+          12+        ]+      }+    ],+    "urls": [+      {+        "url": "https://t.co/OY7qmdJQnO",+        "expanded_url": "https://twitter.com/i/web/status/714461850188926976",+        "display_url": "twitter.com/i/web/status/7…",+        "indices": [+          117,+          140+        ]+      }+    ]+  },+  "truncated": true,+  "source": "<a href=\"http://twitter.com\" rel=\"nofollow\">Twitter Web Client</a>",+  "in_reply_to_status_id": 706860403981099008,+  "in_reply_to_status_id_str": "706860403981099008",+  "in_reply_to_user_id": 15062340,+  "in_reply_to_user_id_str": "15062340",+  "in_reply_to_screen_name": "jeremycloud",+  "user": {+    "id": 4449621923,+    "id_str": "4449621923",+    "name": "Mr Bones",+    "screen_name": "MrBonesDroid",+    "location": "",+    "profile_location": null,+    "description": "",+    "url": null,+    "entities": {+    "description": {+    "urls": []+     }+    },+    "protected": true,+    "followers_count": 5,+    "friends_count": 7,+    "listed_count": 0,+    "created_at": "Fri Dec 11 15:18:02 +0000 2015",+    "favourites_count": 7,+    "utc_offset": -25200,+    "time_zone": "Pacific Time (US & Canada)",+    "geo_enabled": false,+    "verified": false,+    "statuses_count": 35,+    "lang": "en-gb",+    "contributors_enabled": false,+    "is_translator": false,+    "is_translation_enabled": false,+    "profile_background_color": "F5F8FA",+    "profile_background_image_url": null,+    "profile_background_image_url_https": null,+    "profile_background_tile": false,+    "profile_image_url": "http://pbs.twimg.com/profile_images/677097663288860672/zZxWCPSI_normal.jpg",+    "profile_image_url_https": "https://pbs.twimg.com/profile_images/677097663288860672/zZxWCPSI_normal.jpg",+    "profile_link_color": "2B7BB9",+    "profile_sidebar_border_color": "C0DEED",+    "profile_sidebar_fill_color": "DDEEF6",+    "profile_text_color": "333333",+    "profile_use_background_image": true,+    "has_extended_profile": false,+    "default_profile": true,+    "default_profile_image": false,+    "following": true,+    "follow_request_sent": false,+    "notifications": false+  },+  "geo": null,+  "coordinates": null,+  "place": null,+  "contributors": null,+  "quoted_status_id": 704059336788606976,+  "quoted_status_id_str": "704059336788606976",+  "quoted_status": {+    "created_at": "Sun Feb 28 21:43:21 +0000 2016",+    "id": 704059336788606976,+    "id_str": "704059336788606976",+    "text": "My favorite photographic subject, up closer than ever before. https://t.co/K958bKh9Sd",+    "entities": {+      "hashtags": [],+      "symbols": [],+      "user_mentions": [],+      "urls": [],+      "media": [+        {+          "id": 704059330149031936,+          "id_str": "704059330149031936",+          "indices": [+            62,+            85+          ],+          "media_url": "http://pbs.twimg.com/media/CcVSOwJVIAAKwE6.jpg",+          "media_url_https": "https://pbs.twimg.com/media/CcVSOwJVIAAKwE6.jpg",+          "url": "https://t.co/K958bKh9Sd",+          "display_url": "pic.twitter.com/K958bKh9Sd",+          "expanded_url": "http://twitter.com/jeremycloud/status/704059336788606976/photo/1",+          "type": "photo",+          "sizes": {+            "medium": {+              "w": 600,+              "h": 600,+              "resize": "fit"+            },+            "thumb": {+              "w": 150,+              "h": 150,+              "resize": "crop"+            },+            "large": {+              "w": 871,+              "h": 871,+              "resize": "fit"+            },+            "small": {+              "w": 340,+              "h": 340,+              "resize": "fit"+            }+          }+        }+      ]+    },+    "extended_entities": {+      "media": [+        {+          "id": 704059330149031936,+          "id_str": "704059330149031936",+          "indices": [+            62,+            85+          ],+          "media_url": "http://pbs.twimg.com/media/CcVSOwJVIAAKwE6.jpg",+          "media_url_https": "https://pbs.twimg.com/media/CcVSOwJVIAAKwE6.jpg",+          "url": "https://t.co/K958bKh9Sd",+          "display_url": "pic.twitter.com/K958bKh9Sd",+          "expanded_url": "http://twitter.com/jeremycloud/status/704059336788606976/photo/1",+          "type": "photo",+          "sizes": {+            "medium": {+              "w": 600,+              "h": 600,+              "resize": "fit"+            },+            "thumb": {+              "w": 150,+              "h": 150,+              "resize": "crop"+            },+            "large": {+              "w": 871,+              "h": 871,+              "resize": "fit"+            },+            "small": {+              "w": 340,+              "h": 340,+              "resize": "fit"+            }+          }+        }+      ]+    },+    "truncated": false,+    "source": "<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>",+    "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": 15062340,+      "id_str": "15062340",+      "name": "/dev/cloud/jeremy",+      "screen_name": "jeremycloud",+      "location": "Madison, Wisconsin",+      "description": "Professional yak shaver. Amateur bike shedder.",+      "url": "https://t.co/FcYeBkOpVY",+      "entities": {+        "url": {+          "urls": [+            {+              "url": "https://t.co/FcYeBkOpVY",+              "expanded_url": "http://about.me/jeremy.cloud",+              "display_url": "about.me/jeremy.cloud",+              "indices": [+                0,+                23+              ]+            }+          ]+        },+        "description": {+          "urls": []+        }+      },+      "protected": false,+      "followers_count": 4324,+      "friends_count": 410,+      "listed_count": 103,+      "created_at": "Mon Jun 09 17:00:58 +0000 2008",+      "favourites_count": 815,+      "utc_offset": -18000,+      "time_zone": "Central Time (US & Canada)",+      "geo_enabled": true,+      "verified": false,+      "statuses_count": 2218,+      "lang": "en",+      "contributors_enabled": false,+      "is_translator": false,+      "is_translation_enabled": false,+      "profile_background_color": "000000",+      "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/436903139183054849/i_MbCcoW_normal.jpeg",+      "profile_image_url_https": "https://pbs.twimg.com/profile_images/436903139183054849/i_MbCcoW_normal.jpeg",+      "profile_banner_url": "https://pbs.twimg.com/profile_banners/15062340/1447451621",+      "profile_link_color": "4A913C",+      "profile_sidebar_border_color": "000000",+      "profile_sidebar_fill_color": "000000",+      "profile_text_color": "000000",+      "profile_use_background_image": false,+      "has_extended_profile": true,+      "default_profile": false,+      "default_profile_image": false,+      "following": true,+      "follow_request_sent": false,+      "notifications": false+    },+    "geo": null,+    "coordinates": null,+    "place": null,+    "contributors": null,+    "is_quote_status": false,+    "retweet_count": 0,+    "favorite_count": 11,+    "favorited": false,+    "retweeted": false,+    "possibly_sensitive": false,+    "possibly_sensitive_appealable": false,+    "lang": "en"+  },+  "is_quote_status": true,+  "retweet_count": 0,+  "favorite_count": 0,+  "favorited": false,+  "retweeted": false,+  "possibly_sensitive": false,+  "possibly_sensitive_appealable": false,+  "lang": "en"+}
+ tests/fixtures/tweet-updates/compatibilityplus_classic_hidden_13797.json view
@@ -0,0 +1,304 @@+{+  "created_at": "Mon Mar 28 14:39:13 +0000 2016",+  "id": 714461850188926976,+  "id_str": "714461850188926976",+  "text": "@jeremycloud It's neat to have owls and raccoons around until you realize that raccoons will eat the eggs from the … https://t.co/OY7qmdJQnO",+  "entities": {+    "hashtags": [],+    "symbols": [],+    "user_mentions": [+      {+        "screen_name": "jeremycloud",+        "name": "/dev/cloud/jeremy",+        "id": 15062340,+        "id_str": "15062340",+        "indices": [+          0,+          12+        ]+      }+    ],+    "urls": [+      {+        "url": "https://t.co/OY7qmdJQnO",+        "expanded_url": "https://twitter.com/i/web/status/714461850188926976",+        "display_url": "twitter.com/i/web/status/7…",+        "indices": [+          117,+          140+        ]+      }+    ]+  },+  "truncated": true,+  "extended_tweet": {+    "full_text": "@jeremycloud It's neat to have owls and raccoons around until you realize that raccoons will eat the eggs from the owl's nest https://t.co/Q0pkaU4ORH",+    "display_text_range": [+      13,+      125+    ],+    "entities": {+      "hashtags": [],+      "symbols": [],+      "user_mentions": [+        {+          "screen_name": "jeremycloud",+          "name": "/dev/cloud/jeremy",+          "id": 15062340,+          "id_str": "15062340",+          "indices": [+            0,+            12+          ]+        }+      ],+      "urls": [+        {+          "url": "https://t.co/Q0pkaU4ORH",+          "expanded_url": "https://twitter.com/jeremycloud/status/704059336788606976",+          "display_url": "twitter.com/jeremycloud/st…",+          "indices": [+            126,+            149+          ]+        }+      ]+    }+  },+  "source": "<a href=\"http://twitter.com\" rel=\"nofollow\">Twitter Web Client</a>",+  "in_reply_to_status_id": 706860403981099008,+  "in_reply_to_status_id_str": "706860403981099008",+  "in_reply_to_user_id": 15062340,+  "in_reply_to_user_id_str": "15062340",+  "in_reply_to_screen_name": "jeremycloud",+  "user": {+    "id": 4449621923,+    "id_str": "4449621923",+    "name": "Mr Bones",+    "screen_name": "MrBonesDroid",+    "location": "",+    "profile_location": null,+    "description": "",+    "url": null,+    "entities": {+    "description": {+    "urls": []+     }+    },+    "protected": true,+    "followers_count": 5,+    "friends_count": 7,+    "listed_count": 0,+    "created_at": "Fri Dec 11 15:18:02 +0000 2015",+    "favourites_count": 7,+    "utc_offset": -25200,+    "time_zone": "Pacific Time (US & Canada)",+    "geo_enabled": false,+    "verified": false,+    "statuses_count": 35,+    "lang": "en-gb",+    "contributors_enabled": false,+    "is_translator": false,+    "is_translation_enabled": false,+    "profile_background_color": "F5F8FA",+    "profile_background_image_url": null,+    "profile_background_image_url_https": null,+    "profile_background_tile": false,+    "profile_image_url": "http://pbs.twimg.com/profile_images/677097663288860672/zZxWCPSI_normal.jpg",+    "profile_image_url_https": "https://pbs.twimg.com/profile_images/677097663288860672/zZxWCPSI_normal.jpg",+    "profile_link_color": "2B7BB9",+    "profile_sidebar_border_color": "C0DEED",+    "profile_sidebar_fill_color": "DDEEF6",+    "profile_text_color": "333333",+    "profile_use_background_image": true,+    "has_extended_profile": false,+    "default_profile": true,+    "default_profile_image": false,+    "following": true,+    "follow_request_sent": false,+    "notifications": false+  },+  "geo": null,+  "coordinates": null,+  "place": null,+  "contributors": null,+  "quoted_status_id": 704059336788606976,+  "quoted_status_id_str": "704059336788606976",+  "quoted_status": {+    "created_at": "Sun Feb 28 21:43:21 +0000 2016",+    "id": 704059336788606976,+    "id_str": "704059336788606976",+    "text": "My favorite photographic subject, up closer than ever before. https://t.co/K958bKh9Sd",+    "entities": {+      "hashtags": [],+      "symbols": [],+      "user_mentions": [],+      "urls": [],+      "media": [+        {+          "id": 704059330149031936,+          "id_str": "704059330149031936",+          "indices": [+            62,+            85+          ],+          "media_url": "http://pbs.twimg.com/media/CcVSOwJVIAAKwE6.jpg",+          "media_url_https": "https://pbs.twimg.com/media/CcVSOwJVIAAKwE6.jpg",+          "url": "https://t.co/K958bKh9Sd",+          "display_url": "pic.twitter.com/K958bKh9Sd",+          "expanded_url": "http://twitter.com/jeremycloud/status/704059336788606976/photo/1",+          "type": "photo",+          "sizes": {+            "medium": {+              "w": 600,+              "h": 600,+              "resize": "fit"+            },+            "thumb": {+              "w": 150,+              "h": 150,+              "resize": "crop"+            },+            "large": {+              "w": 871,+              "h": 871,+              "resize": "fit"+            },+            "small": {+              "w": 340,+              "h": 340,+              "resize": "fit"+            }+          }+        }+      ]+    },+    "extended_entities": {+      "media": [+        {+          "id": 704059330149031936,+          "id_str": "704059330149031936",+          "indices": [+            62,+            85+          ],+          "media_url": "http://pbs.twimg.com/media/CcVSOwJVIAAKwE6.jpg",+          "media_url_https": "https://pbs.twimg.com/media/CcVSOwJVIAAKwE6.jpg",+          "url": "https://t.co/K958bKh9Sd",+          "display_url": "pic.twitter.com/K958bKh9Sd",+          "expanded_url": "http://twitter.com/jeremycloud/status/704059336788606976/photo/1",+          "type": "photo",+          "sizes": {+            "medium": {+              "w": 600,+              "h": 600,+              "resize": "fit"+            },+            "thumb": {+              "w": 150,+              "h": 150,+              "resize": "crop"+            },+            "large": {+              "w": 871,+              "h": 871,+              "resize": "fit"+            },+            "small": {+              "w": 340,+              "h": 340,+              "resize": "fit"+            }+          }+        }+      ]+    },+    "truncated": false,+    "source": "<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>",+    "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": 15062340,+      "id_str": "15062340",+      "name": "/dev/cloud/jeremy",+      "screen_name": "jeremycloud",+      "location": "Madison, Wisconsin",+      "description": "Professional yak shaver. Amateur bike shedder.",+      "url": "https://t.co/FcYeBkOpVY",+      "entities": {+        "url": {+          "urls": [+            {+              "url": "https://t.co/FcYeBkOpVY",+              "expanded_url": "http://about.me/jeremy.cloud",+              "display_url": "about.me/jeremy.cloud",+              "indices": [+                0,+                23+              ]+            }+          ]+        },+        "description": {+          "urls": []+        }+      },+      "protected": false,+      "followers_count": 4324,+      "friends_count": 410,+      "listed_count": 103,+      "created_at": "Mon Jun 09 17:00:58 +0000 2008",+      "favourites_count": 815,+      "utc_offset": -18000,+      "time_zone": "Central Time (US & Canada)",+      "geo_enabled": true,+      "verified": false,+      "statuses_count": 2218,+      "lang": "en",+      "contributors_enabled": false,+      "is_translator": false,+      "is_translation_enabled": false,+      "profile_background_color": "000000",+      "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/436903139183054849/i_MbCcoW_normal.jpeg",+      "profile_image_url_https": "https://pbs.twimg.com/profile_images/436903139183054849/i_MbCcoW_normal.jpeg",+      "profile_banner_url": "https://pbs.twimg.com/profile_banners/15062340/1447451621",+      "profile_link_color": "4A913C",+      "profile_sidebar_border_color": "000000",+      "profile_sidebar_fill_color": "000000",+      "profile_text_color": "000000",+      "profile_use_background_image": false,+      "has_extended_profile": true,+      "default_profile": false,+      "default_profile_image": false,+      "following": true,+      "follow_request_sent": false,+      "notifications": false+    },+    "geo": null,+    "coordinates": null,+    "place": null,+    "contributors": null,+    "is_quote_status": false,+    "retweet_count": 0,+    "favorite_count": 11,+    "favorited": false,+    "retweeted": false,+    "possibly_sensitive": false,+    "possibly_sensitive_appealable": false,+    "lang": "en"+  },+  "is_quote_status": true,+  "retweet_count": 0,+  "favorite_count": 0,+  "favorited": false,+  "retweeted": false,+  "possibly_sensitive": false,+  "possibly_sensitive_appealable": false,+  "lang": "en"+}
+ tests/fixtures/tweet-updates/compatibilityplus_extended_13997.json view
@@ -0,0 +1,278 @@+{+  "created_at": "Mon Mar 28 14:39:13 +0000 2016",+  "id": 714461850188926976,+  "id_str": "714461850188926976",+  "full_text": "@jeremycloud It's neat to have owls and raccoons around until you realize that raccoons will eat the eggs from the owl's nest https://t.co/Q0pkaU4ORH",+  "display_text_range": [+    13,+    125+  ],+  "entities": {+    "hashtags": [],+    "symbols": [],+    "user_mentions": [+      {+        "screen_name": "jeremycloud",+        "name": "/dev/cloud/jeremy",+        "id": 15062340,+        "id_str": "15062340",+        "indices": [+          0,+          12+        ]+      }+    ],+    "urls": [+      {+        "url": "https://t.co/Q0pkaU4ORH",+        "expanded_url": "https://twitter.com/jeremycloud/status/704059336788606976",+        "display_url": "twitter.com/jeremycloud/st…",+        "indices": [+          126,+          149+        ]+      }+    ]+  },+  "truncated": false,+  "source": "<a href=\"http://twitter.com\" rel=\"nofollow\">Twitter Web Client</a>",+  "in_reply_to_status_id": 706860403981099008,+  "in_reply_to_status_id_str": "706860403981099008",+  "in_reply_to_user_id": 15062340,+  "in_reply_to_user_id_str": "15062340",+  "in_reply_to_screen_name": "jeremycloud",+  "user": {+    "id": 4449621923,+    "id_str": "4449621923",+    "name": "Mr Bones",+    "screen_name": "MrBonesDroid",+    "location": "",+    "profile_location": null,+    "description": "",+    "url": null,+    "entities": {+    "description": {+    "urls": []+     }+    },+    "protected": true,+    "followers_count": 5,+    "friends_count": 7,+    "listed_count": 0,+    "created_at": "Fri Dec 11 15:18:02 +0000 2015",+    "favourites_count": 7,+    "utc_offset": -25200,+    "time_zone": "Pacific Time (US & Canada)",+    "geo_enabled": false,+    "verified": false,+    "statuses_count": 35,+    "lang": "en-gb",+    "contributors_enabled": false,+    "is_translator": false,+    "is_translation_enabled": false,+    "profile_background_color": "F5F8FA",+    "profile_background_image_url": null,+    "profile_background_image_url_https": null,+    "profile_background_tile": false,+    "profile_image_url": "http://pbs.twimg.com/profile_images/677097663288860672/zZxWCPSI_normal.jpg",+    "profile_image_url_https": "https://pbs.twimg.com/profile_images/677097663288860672/zZxWCPSI_normal.jpg",+    "profile_link_color": "2B7BB9",+    "profile_sidebar_border_color": "C0DEED",+    "profile_sidebar_fill_color": "DDEEF6",+    "profile_text_color": "333333",+    "profile_use_background_image": true,+    "has_extended_profile": false,+    "default_profile": true,+    "default_profile_image": false,+    "following": true,+    "follow_request_sent": false,+    "notifications": false+  },+  "geo": null,+  "coordinates": null,+  "place": null,+  "contributors": null,+  "quoted_status_id": 704059336788606976,+  "quoted_status_id_str": "704059336788606976",+  "quoted_status": {+    "created_at": "Sun Feb 28 21:43:21 +0000 2016",+    "id": 704059336788606976,+    "id_str": "704059336788606976",+    "full_text": "My favorite photographic subject, up closer than ever before. https://t.co/K958bKh9Sd",+    "display_text_range": [+      0,+      85+    ],+    "entities": {+      "hashtags": [],+      "symbols": [],+      "user_mentions": [],+      "urls": [],+      "media": [+        {+          "id": 704059330149031936,+          "id_str": "704059330149031936",+          "indices": [+            62,+            85+          ],+          "media_url": "http://pbs.twimg.com/media/CcVSOwJVIAAKwE6.jpg",+          "media_url_https": "https://pbs.twimg.com/media/CcVSOwJVIAAKwE6.jpg",+          "url": "https://t.co/K958bKh9Sd",+          "display_url": "pic.twitter.com/K958bKh9Sd",+          "expanded_url": "http://twitter.com/jeremycloud/status/704059336788606976/photo/1",+          "type": "photo",+          "sizes": {+            "medium": {+              "w": 600,+              "h": 600,+              "resize": "fit"+            },+            "thumb": {+              "w": 150,+              "h": 150,+              "resize": "crop"+            },+            "large": {+              "w": 871,+              "h": 871,+              "resize": "fit"+            },+            "small": {+              "w": 340,+              "h": 340,+              "resize": "fit"+            }+          }+        }+      ]+    },+    "extended_entities": {+      "media": [+        {+          "id": 704059330149031936,+          "id_str": "704059330149031936",+          "indices": [+            62,+            85+          ],+          "media_url": "http://pbs.twimg.com/media/CcVSOwJVIAAKwE6.jpg",+          "media_url_https": "https://pbs.twimg.com/media/CcVSOwJVIAAKwE6.jpg",+          "url": "https://t.co/K958bKh9Sd",+          "display_url": "pic.twitter.com/K958bKh9Sd",+          "expanded_url": "http://twitter.com/jeremycloud/status/704059336788606976/photo/1",+          "type": "photo",+          "sizes": {+            "medium": {+              "w": 600,+              "h": 600,+              "resize": "fit"+            },+            "thumb": {+              "w": 150,+              "h": 150,+              "resize": "crop"+            },+            "large": {+              "w": 871,+              "h": 871,+              "resize": "fit"+            },+            "small": {+              "w": 340,+              "h": 340,+              "resize": "fit"+            }+          }+        }+      ]+    },+    "truncated": false,+    "source": "<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>",+    "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": 15062340,+      "id_str": "15062340",+      "name": "/dev/cloud/jeremy",+      "screen_name": "jeremycloud",+      "location": "Madison, Wisconsin",+      "description": "Professional yak shaver. Amateur bike shedder.",+      "url": "https://t.co/FcYeBkOpVY",+      "entities": {+        "url": {+          "urls": [+            {+              "url": "https://t.co/FcYeBkOpVY",+              "expanded_url": "http://about.me/jeremy.cloud",+              "display_url": "about.me/jeremy.cloud",+              "indices": [+                0,+                23+              ]+            }+          ]+        },+        "description": {+          "urls": []+        }+      },+      "protected": false,+      "followers_count": 4324,+      "friends_count": 410,+      "listed_count": 103,+      "created_at": "Mon Jun 09 17:00:58 +0000 2008",+      "favourites_count": 815,+      "utc_offset": -18000,+      "time_zone": "Central Time (US & Canada)",+      "geo_enabled": true,+      "verified": false,+      "statuses_count": 2218,+      "lang": "en",+      "contributors_enabled": false,+      "is_translator": false,+      "is_translation_enabled": false,+      "profile_background_color": "000000",+      "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/436903139183054849/i_MbCcoW_normal.jpeg",+      "profile_image_url_https": "https://pbs.twimg.com/profile_images/436903139183054849/i_MbCcoW_normal.jpeg",+      "profile_banner_url": "https://pbs.twimg.com/profile_banners/15062340/1447451621",+      "profile_link_color": "4A913C",+      "profile_sidebar_border_color": "000000",+      "profile_sidebar_fill_color": "000000",+      "profile_text_color": "000000",+      "profile_use_background_image": false,+      "has_extended_profile": true,+      "default_profile": false,+      "default_profile_image": false,+      "following": true,+      "follow_request_sent": false,+      "notifications": false+    },+    "geo": null,+    "coordinates": null,+    "place": null,+    "contributors": null,+    "is_quote_status": false,+    "retweet_count": 0,+    "favorite_count": 11,+    "favorited": false,+    "retweeted": false,+    "possibly_sensitive": false,+    "possibly_sensitive_appealable": false,+    "lang": "en"+  },+  "is_quote_status": true,+  "retweet_count": 0,+  "favorite_count": 0,+  "favorited": false,+  "retweeted": false,+  "possibly_sensitive": false,+  "possibly_sensitive_appealable": false,+  "lang": "en"+}
+ tests/fixtures/tweet-updates/extended_classic_14002.json view
@@ -0,0 +1,87 @@+{+  "created_at": "Thu Jun 16 15:57:14 +0000 2016",+  "id": 743472511740870657,+  "id_str": "743472511740870657",+  "full_text": "Just setting up my Twitter. #myfirstTweet",+  "truncated": false,+  "display_text_range": [+    0,+    41+  ],+  "entities": {+    "hashtags": [+      {+        "text": "myfirstTweet",+        "indices": [+          28,+          41+        ]+      }+    ],+    "symbols": [],+    "user_mentions": [],+    "urls": []+  },+  "source": "&lt;a href=\"http://twitter.com\" rel=\"nofollow\"&gt;Twitter Web Client&lt;/a&gt;",+  "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": 3883872981,+    "id_str": "3883872981",+    "name": "Beyond 140",+    "screen_name": "beyond_oneforty",+    "location": "",+    "description": "",+    "url": null,+    "entities": {+      "description": {+        "urls": []+      }+    },+    "protected": true,+    "followers_count": 51,+    "friends_count": 0,+    "listed_count": 0,+    "created_at": "Tue Oct 06 21:08:37 +0000 2015",+    "favourites_count": 1,+    "utc_offset": null,+    "time_zone": null,+    "geo_enabled": false,+    "verified": false,+    "statuses_count": 9,+    "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/651506565225271296/PMEWfvS__normal.jpg",+    "profile_image_url_https": "https://pbs.twimg.com/profile_images/651506565225271296/PMEWfvS__normal.jpg",+    "profile_link_color": "0084B4",+    "profile_sidebar_border_color": "C0DEED",+    "profile_sidebar_fill_color": "DDEEF6",+    "profile_text_color": "333333",+    "profile_use_background_image": true,+    "has_extended_profile": false,+    "default_profile": true,+    "default_profile_image": false,+    "following": false,+    "follow_request_sent": false,+    "notifications": false+  },+  "geo": null,+  "coordinates": null,+  "place": null,+  "contributors": null,+  "is_quote_status": false,+  "retweet_count": 0,+  "favorite_count": 1,+  "favorited": false,+  "retweeted": false,+  "lang": "en"+}
+ tests/fixtures/tweet-updates/extended_classic_hidden_13761.json view
@@ -0,0 +1,183 @@+{+  "created_at": "Thu Jun 16 16:24:44 +0000 2016",+  "id": 743479431658758145,+  "id_str": "743479431658758145",+  "full_text": "@TwitterDev I'm really excited for this change! https://t.co/VnJMDg3cbS",+  "truncated": false,+  "display_text_range": [+    12,+    47+  ],+  "entities": {+    "hashtags": [],+    "symbols": [],+    "user_mentions": [+      {+        "screen_name": "TwitterDev",+        "name": "TwitterDev",+        "id": 2244994945,+        "id_str": "2244994945",+        "indices": [+          0,+          11+        ]+      }+    ],+    "urls": [],+    "media": [+      {+        "id": 743479379079004160,+        "id_str": "743479379079004160",+        "indices": [+          48,+          71+        ],+        "media_url": "http://pbs.twimg.com/tweet_video_thumb/ClFejl_VAAAo9Xk.jpg",+        "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/ClFejl_VAAAo9Xk.jpg",+        "url": "https://t.co/VnJMDg3cbS",+        "display_url": "pic.twitter.com/VnJMDg3cbS",+        "expanded_url": "http://twitter.com/beyond_oneforty/status/743479431658758145/photo/1",+        "type": "photo",+        "sizes": {+          "medium": {+            "w": 480,+            "h": 268,+            "resize": "fit"+          },+          "thumb": {+            "w": 150,+            "h": 150,+            "resize": "crop"+          },+          "large": {+            "w": 480,+            "h": 268,+            "resize": "fit"+          },+          "small": {+            "w": 340,+            "h": 190,+            "resize": "fit"+          }+        }+      }+    ]+  },+  "extended_entities": {+    "media": [+      {+        "id": 743479379079004160,+        "id_str": "743479379079004160",+        "indices": [+          48,+          71+        ],+        "media_url": "http://pbs.twimg.com/tweet_video_thumb/ClFejl_VAAAo9Xk.jpg",+        "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/ClFejl_VAAAo9Xk.jpg",+        "url": "https://t.co/VnJMDg3cbS",+        "display_url": "pic.twitter.com/VnJMDg3cbS",+        "expanded_url": "http://twitter.com/beyond_oneforty/status/743479431658758145/photo/1",+        "type": "animated_gif",+        "sizes": {+          "medium": {+            "w": 480,+            "h": 268,+            "resize": "fit"+          },+          "thumb": {+            "w": 150,+            "h": 150,+            "resize": "crop"+          },+          "large": {+            "w": 480,+            "h": 268,+            "resize": "fit"+          },+          "small": {+            "w": 340,+            "h": 190,+            "resize": "fit"+          }+        },+        "video_info": {+          "aspect_ratio": [+            120,+            67+          ],+          "variants": [+            {+              "bitrate": 0,+              "content_type": "video/mp4",+              "url": "https://pbs.twimg.com/tweet_video/ClFejl_VAAAo9Xk.mp4"+            }+          ]+        }+      }+    ]+  },+  "source": "&lt;a href=\"http://twitter.com\" rel=\"nofollow\"&gt;Twitter Web Client&lt;/a&gt;",+  "in_reply_to_status_id": 735111578660438017,+  "in_reply_to_status_id_str": "735111578660438017",+  "in_reply_to_user_id": 2244994945,+  "in_reply_to_user_id_str": "2244994945",+  "in_reply_to_screen_name": "TwitterDev",+  "user": {+    "id": 3883872981,+    "id_str": "3883872981",+    "name": "Beyond 140",+    "screen_name": "beyond_oneforty",+    "location": "",+    "description": "",+    "url": null,+    "entities": {+      "description": {+        "urls": []+      }+    },+    "protected": true,+    "followers_count": 51,+    "friends_count": 0,+    "listed_count": 0,+    "created_at": "Tue Oct 06 21:08:37 +0000 2015",+    "favourites_count": 1,+    "utc_offset": null,+    "time_zone": null,+    "geo_enabled": false,+    "verified": false,+    "statuses_count": 10,+    "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/651506565225271296/PMEWfvS__normal.jpg",+    "profile_image_url_https": "https://pbs.twimg.com/profile_images/651506565225271296/PMEWfvS__normal.jpg",+    "profile_link_color": "0084B4",+    "profile_sidebar_border_color": "C0DEED",+    "profile_sidebar_fill_color": "DDEEF6",+    "profile_text_color": "333333",+    "profile_use_background_image": true,+    "has_extended_profile": false,+    "default_profile": true,+    "default_profile_image": false,+    "following": false,+    "follow_request_sent": false,+    "notifications": false+  },+  "geo": null,+  "coordinates": null,+  "place": null,+  "contributors": null,+  "is_quote_status": false,+  "retweet_count": 0,+  "favorite_count": 1,+  "favorited": false,+  "retweeted": false,+  "possibly_sensitive": false,+  "possibly_sensitive_appealable": false,+  "lang": "en"+}
+ tests/fixtures/tweet-updates/extended_extended_14001.json view
@@ -0,0 +1,213 @@+{+  "created_at": "Thu Jun 16 17:33:23 +0000 2016",+  "id": 743496707711733760,+  "id_str": "743496707711733760",+  "full_text": "@twitter @twitterdev has more details about these changes at https://t.co/ZnXoRQy8mK.  Thanks for making @twitter more expressive! https://t.co/AWmiH870F7",+  "truncated": false,+  "display_text_range": [+    9,+    130+  ],+  "entities": {+    "hashtags": [],+    "symbols": [],+    "user_mentions": [+      {+        "screen_name": "twitter",+        "name": "Twitter",+        "id": 783214,+        "id_str": "783214",+        "indices": [+          0,+          8+        ]+      },+      {+        "screen_name": "TwitterDev",+        "name": "TwitterDev",+        "id": 2244994945,+        "id_str": "2244994945",+        "indices": [+          9,+          20+        ]+      },+      {+        "screen_name": "twitter",+        "name": "Twitter",+        "id": 783214,+        "id_str": "783214",+        "indices": [+          105,+          113+        ]+      }+    ],+    "urls": [+      {+        "url": "https://t.co/ZnXoRQy8mK",+        "expanded_url": "https://blog.twitter.com/2016/doing-more-with-140-characters",+        "display_url": "blog.twitter.com/2016/doing-mor…",+        "indices": [+          61,+          84+        ]+      }+    ],+    "media": [+      {+        "id": 743495942192566272,+        "id_str": "743495942192566272",+        "indices": [+          131,+          154+        ],+        "media_url": "http://pbs.twimg.com/tweet_video_thumb/ClFtnsZVEAAE4oA.jpg",+        "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/ClFtnsZVEAAE4oA.jpg",+        "url": "https://t.co/AWmiH870F7",+        "display_url": "pic.twitter.com/AWmiH870F7",+        "expanded_url": "http://twitter.com/beyond_oneforty/status/743496707711733760/photo/1",+        "type": "photo",+        "sizes": {+          "small": {+            "w": 340,+            "h": 255,+            "resize": "fit"+          },+          "medium": {+            "w": 480,+            "h": 360,+            "resize": "fit"+          },+          "thumb": {+            "w": 150,+            "h": 150,+            "resize": "crop"+          },+          "large": {+            "w": 480,+            "h": 360,+            "resize": "fit"+          }+        }+      }+    ]+  },+  "extended_entities": {+    "media": [+      {+        "id": 743495942192566272,+        "id_str": "743495942192566272",+        "indices": [+          131,+          154+        ],+        "media_url": "http://pbs.twimg.com/tweet_video_thumb/ClFtnsZVEAAE4oA.jpg",+        "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/ClFtnsZVEAAE4oA.jpg",+        "url": "https://t.co/AWmiH870F7",+        "display_url": "pic.twitter.com/AWmiH870F7",+        "expanded_url": "http://twitter.com/beyond_oneforty/status/743496707711733760/photo/1",+        "type": "animated_gif",+        "sizes": {+          "small": {+            "w": 340,+            "h": 255,+            "resize": "fit"+          },+          "medium": {+            "w": 480,+            "h": 360,+            "resize": "fit"+          },+          "thumb": {+            "w": 150,+            "h": 150,+            "resize": "crop"+          },+          "large": {+            "w": 480,+            "h": 360,+            "resize": "fit"+          }+        },+        "video_info": {+          "aspect_ratio": [+            4,+            3+          ],+          "variants": [+            {+              "bitrate": 0,+              "content_type": "video/mp4",+              "url": "https://pbs.twimg.com/tweet_video/ClFtnsZVEAAE4oA.mp4"+            }+          ]+        }+      }+    ]+  },+  "source": "&lt;a href=\"http://twitter.com\" rel=\"nofollow\"&gt;Twitter Web Client&lt;/a&gt;",+  "in_reply_to_status_id": 735108260718469121,+  "in_reply_to_status_id_str": "735108260718469121",+  "in_reply_to_user_id": 783214,+  "in_reply_to_user_id_str": "783214",+  "in_reply_to_screen_name": "twitter",+  "user": {+    "id": 3883872981,+    "id_str": "3883872981",+    "name": "Beyond 140",+    "screen_name": "beyond_oneforty",+    "location": "",+    "description": "",+    "url": null,+    "entities": {+      "description": {+        "urls": []+      }+    },+    "protected": true,+    "followers_count": 51,+    "friends_count": 2,+    "listed_count": 0,+    "created_at": "Tue Oct 06 21:08:37 +0000 2015",+    "favourites_count": 1,+    "utc_offset": null,+    "time_zone": null,+    "geo_enabled": false,+    "verified": false,+    "statuses_count": 11,+    "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/743489433861685249/VOcKbH8Z_normal.jpg",+    "profile_image_url_https": "https://pbs.twimg.com/profile_images/743489433861685249/VOcKbH8Z_normal.jpg",+    "profile_link_color": "0084B4",+    "profile_sidebar_border_color": "C0DEED",+    "profile_sidebar_fill_color": "DDEEF6",+    "profile_text_color": "333333",+    "profile_use_background_image": true,+    "has_extended_profile": false,+    "default_profile": true,+    "default_profile_image": false,+    "following": false,+    "follow_request_sent": false,+    "notifications": false+  },+  "geo": null,+  "coordinates": null,+  "place": null,+  "contributors": null,+  "is_quote_status": false,+  "retweet_count": 0,+  "favorite_count": 0,+  "favorited": false,+  "retweeted": false,+  "possibly_sensitive": false,+  "possibly_sensitive_appealable": false,+  "lang": "en"+}
tests/spec_main.hs view
@@ -1,14 +1,15 @@ module Main where +import qualified PropFromToJSONTest+import qualified StatusTest import Test.Tasty import qualified TypesTest-import qualified PropFromToJSONTest  tests :: TestTree tests =     testGroup         "Tests"-        [ testGroup "Unit Test" [TypesTest.tests]+        [ testGroup "Unit Test" [TypesTest.tests, StatusTest.tests]         , testGroup "Property Test" [PropFromToJSONTest.tests]         ] 
twitter-types.cabal view
@@ -1,5 +1,5 @@ name:              twitter-types-version:           0.9.0+version:           0.10.0 license:           BSD3 license-file:      LICENSE author:            Takahiro HIMURA@@ -17,6 +17,7 @@ extra-source-files:   README.md   tests/fixtures/*.json+  tests/fixtures/tweet-updates/*.json  source-repository head   type: git@@ -61,6 +62,7 @@     Fixtures     Instances     PropFromToJSONTest+    StatusTest     TypesTest    ghc-options:       -Wall