X-Git-Url: http://gitweb.michael.orlitzky.com/?p=dead%2Fhalcyon.git;a=blobdiff_plain;f=src%2FTwitter%2FStatus.hs;h=ba27d527d44f14ceeb3c6766e326d24d8beae501;hp=92cf899fae1786562ad96b0c7e7a98ac5915e645;hb=1b72ed45ef890ed1329a32457b4d7f3a7fb37788;hpb=eed0d7b0f8ef28864c00925beef5c8853bcd44cc diff --git a/src/Twitter/Status.hs b/src/Twitter/Status.hs index 92cf899..ba27d52 100644 --- a/src/Twitter/Status.hs +++ b/src/Twitter/Status.hs @@ -7,29 +7,28 @@ module Twitter.Status ( get_max_status_id, pretty_print, status_tests, - utc_time_to_rfc822) + utc_time_to_rfc822 ) where -import Control.Applicative ((<$>), (<*>)) -import Control.Monad (liftM) -import Data.Aeson ((.:), FromJSON(..), Value(Object)) -import Data.Maybe (mapMaybe, isJust) -import Data.Monoid (mempty) -import Data.String.Utils (join, splitWs) -import Data.Text (pack) -import Data.Time (formatTime) -import Data.Time.Clock (UTCTime) -import Data.Time.Format (parseTime) -import Data.Time.LocalTime (TimeZone, utcToZonedTime) -import System.Locale (defaultTimeLocale, rfc822DateFormat) -import Test.Framework (Test, testGroup) -import Test.Framework.Providers.HUnit (testCase) -import Test.HUnit (Assertion, assertEqual) -import Text.Regex (matchRegex, mkRegex) - -import Html (replace_entities) -import StringUtils (listify) -import Twitter.User (User(..), screen_name_to_timeline_url) +import Control.Applicative ( (<$>), (<*>) ) +import Control.Monad ( liftM ) +import Data.Aeson ( (.:), FromJSON(..), Value(Object) ) +import Data.Maybe ( mapMaybe, isJust ) +import Data.Monoid ( mempty ) +import Data.String.Utils ( join, splitWs ) +import Data.Text ( pack ) +import Data.Time ( formatTime ) +import Data.Time.Clock ( UTCTime ) +import Data.Time.Format ( parseTime ) +import Data.Time.LocalTime ( TimeZone, utcToZonedTime ) +import System.Locale ( defaultTimeLocale, rfc822DateFormat ) +import Test.Tasty ( TestTree, testGroup ) +import Test.Tasty.HUnit ( (@?=), testCase ) +import Text.Regex ( matchRegex, mkRegex ) + +import Html ( replace_entities ) +import StringUtils ( listify ) +import Twitter.User ( User(..), screen_name_to_timeline_url ) data Status = Status { created_at :: Maybe UTCTime, @@ -37,8 +36,8 @@ data Status = Status { reply :: Bool, retweeted :: Bool, text :: String, - user :: User - } deriving (Show, Eq) + user :: User } + deriving (Eq, Show) type Timeline = [Status] @@ -66,6 +65,8 @@ instance FromJSON Status where -- Do whatever. parseJSON _ = mempty +-- | Parse a timestamp from a status into a UTCTime (or Nothing). +-- parse_status_time :: String -> Maybe UTCTime parse_status_time = parseTime defaultTimeLocale status_format @@ -74,6 +75,10 @@ parse_status_time = status_format :: String status_format = "%a %b %d %H:%M:%S %z %Y" + +-- | Given a 'TimeZone', convert a 'UTCTime' into an RFC822-format +-- time string. If no 'TimeZone' is given, assume UTC. +-- utc_time_to_rfc822 :: Maybe TimeZone -> UTCTime -> String utc_time_to_rfc822 mtz utc = case mtz of @@ -83,12 +88,18 @@ utc_time_to_rfc822 mtz utc = foo = formatTime defaultTimeLocale rfc822DateFormat +-- | Get the 'created_at' time out of a 'Status' and display it as an +-- RFC822-format time string. If there's no created-at time in the +-- status, you'll get an empty string instead. +-- show_created_at :: Maybe TimeZone -> Status -> String show_created_at mtz = (maybe "" (utc_time_to_rfc822 mtz)) . created_at + -- | Returns a nicely-formatted String representing the given 'Status' -- object. +-- pretty_print :: Maybe TimeZone -> Status -> String pretty_print mtz status = concat [ name, @@ -110,6 +121,7 @@ pretty_print mtz status = -- | Given a list of statuses, returns the greatest status_id -- belonging to one of the statuses in the list. +-- get_max_status_id :: Timeline -> Integer get_max_status_id statuses = maximum status_ids @@ -118,6 +130,7 @@ get_max_status_id statuses = -- | Parse one username from a word. +-- parse_username :: String -> Maybe String parse_username word = case matches of @@ -130,13 +143,16 @@ parse_username word = -- | Parse all usernames of the form \@username from a status. +-- parse_usernames_from_status :: Status -> [String] parse_usernames_from_status status = mapMaybe parse_username status_words where status_words = splitWs (text status) + -- | Get all referenced users' timeline URLs. +-- make_user_timeline_urls :: Status -> [String] make_user_timeline_urls status = map screen_name_to_timeline_url usernames @@ -144,20 +160,17 @@ make_user_timeline_urls status = usernames = parse_usernames_from_status status -status_tests :: Test +status_tests :: TestTree status_tests = - testGroup "Status Tests" [ tc1 ] - where - tc1 = testCase "All usernames are parsed." test_parse_usernames + testGroup "Status Tests" [ test_parse_usernames ] -test_parse_usernames :: Assertion +test_parse_usernames :: TestTree test_parse_usernames = - assertEqual - "All usernames are parsed." - expected_usernames - actual_usernames + testCase description $ actual @?= expected where + description = "all usernames are parsed" + dummy_user = User { screen_name = "nobody" } dummy_text = "Hypothesis: @donsbot and @bonus500 are two " ++ "personalities belonging to the same person." @@ -169,5 +182,5 @@ test_parse_usernames = retweeted = False } - actual_usernames = parse_usernames_from_status dummy_status - expected_usernames = ["donsbot", "bonus500"] + actual = parse_usernames_from_status dummy_status + expected = ["donsbot", "bonus500"]