packages feed

scuttlebutt-types 0.3.0 → 0.4.0

raw patch · 4 files changed

+65/−43 lines, 4 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Ssb.Types.Message: Branch :: [MessageLink] -> Branch
- Ssb.Types.Message: Mention :: Link -> Maybe Text -> Mention
- Ssb.Types.Message: Mentions :: [Mention] -> Mentions
- Ssb.Types.Message: [fromBranch] :: Branch -> [MessageLink]
- Ssb.Types.Message: [fromMentions] :: Mentions -> [Mention]
- Ssb.Types.Message: [mentionLink] :: Mention -> Link
- Ssb.Types.Message: [mentionName] :: Mention -> Maybe Text
- Ssb.Types.Message: data Mention
- Ssb.Types.Message: instance Data.Aeson.Types.FromJSON.FromJSON Ssb.Types.Message.Branch
- Ssb.Types.Message: instance Data.Aeson.Types.FromJSON.FromJSON Ssb.Types.Message.Mention
- Ssb.Types.Message: instance Data.Aeson.Types.FromJSON.FromJSON Ssb.Types.Message.Mentions
- Ssb.Types.Message: instance GHC.Base.Monoid Ssb.Types.Message.Branch
- Ssb.Types.Message: instance GHC.Base.Monoid Ssb.Types.Message.Mentions
- Ssb.Types.Message: instance GHC.Classes.Eq Ssb.Types.Message.Branch
- Ssb.Types.Message: instance GHC.Classes.Eq Ssb.Types.Message.Mention
- Ssb.Types.Message: instance GHC.Classes.Eq Ssb.Types.Message.Mentions
- Ssb.Types.Message: instance GHC.Generics.Generic Ssb.Types.Message.Mention
- Ssb.Types.Message: instance GHC.Show.Show Ssb.Types.Message.Branch
- Ssb.Types.Message: instance GHC.Show.Show Ssb.Types.Message.Mention
- Ssb.Types.Message: instance GHC.Show.Show Ssb.Types.Message.Mentions
- Ssb.Types.Message: newtype Branch
- Ssb.Types.Message: newtype Mentions
+ Ssb.Types.Message: UserLink :: Link -> Maybe Text -> UserLink
+ Ssb.Types.Message: [userLink] :: UserLink -> Link
+ Ssb.Types.Message: [userName] :: UserLink -> Maybe Text
+ Ssb.Types.Message: data UserLink
+ Ssb.Types.Message: instance Data.Aeson.Types.FromJSON.FromJSON Ssb.Types.Message.UserLink
+ Ssb.Types.Message: instance GHC.Classes.Eq Ssb.Types.Message.UserLink
+ Ssb.Types.Message: instance GHC.Generics.Generic Ssb.Types.Message.UserLink
+ Ssb.Types.Message: instance GHC.Show.Show Ssb.Types.Message.UserLink
- Ssb.Types.Link: class IsLink t where toJSONLink = toJSON . toLink fromJSONLink o = do { l <- parseJSON o; either fail pure (fromLink l) }
+ Ssb.Types.Link: class IsLink t
- Ssb.Types.Message: Post :: Text -> Maybe Text -> Maybe MessageLink -> Maybe Branch -> Maybe [FeedLink] -> Maybe Mentions -> Post
+ Ssb.Types.Message: Post :: Text -> Maybe Text -> Maybe MessageLink -> [MessageLink] -> [UserLink] -> [UserLink] -> Post
- Ssb.Types.Message: [branch] :: Post -> Maybe Branch
+ Ssb.Types.Message: [branch] :: Post -> [MessageLink]
- Ssb.Types.Message: [mentions] :: Post -> Maybe Mentions
+ Ssb.Types.Message: [mentions] :: Post -> [UserLink]
- Ssb.Types.Message: [recps] :: Post -> Maybe [FeedLink]
+ Ssb.Types.Message: [recps] :: Post -> [UserLink]

Files

CHANGELOG view
@@ -1,3 +1,13 @@+scuttlebutt-types (0.4.0) unstable; urgency=medium++  * Simplified Post type (API change)+  * Support parsing a Post with a root or branch that has a value+    that is not a valid link.+  * Fix parsing of Post recps.+  * Mention renamed to UserLink. (API change)++ -- Joey Hess <id@joeyh.name>  Mon, 26 Feb 2018 14:32:59 -0400+ scuttlebutt-types (0.3.0) unstable; urgency=medium    * Handle about messages whose image field is a string linking to a blob,
scuttlebutt-types.cabal view
@@ -1,5 +1,5 @@ Name: scuttlebutt-types-Version: 0.3.0+Version: 0.4.0 License: BSD3 License-File: LICENSE Author: bkil.hu, Peter Ferenc Hajdu, Joey Hess
src/Ssb/Types/Message.hs view
@@ -10,9 +10,7 @@ 	narrowParse, 	PrivateContent(..), 	Post(..),-	Branch(..),-	Mentions(..),-	Mention(..),+	UserLink(..), 	About(..), 	AboutImage(..), 	Contact(..),@@ -32,6 +30,7 @@ import Data.List import Data.Char import Control.Applicative+import Control.Monad import qualified Data.Text as T import qualified Data.Vector as V import qualified Data.ByteString.Lazy as L@@ -111,48 +110,61 @@ 	{ text :: T.Text 	, channel :: Maybe T.Text 	, root :: Maybe MessageLink-	, branch :: Maybe Branch-	, recps :: Maybe [FeedLink]-	, mentions :: Maybe Mentions+	, branch :: [MessageLink]+	, recps :: [UserLink]+	, mentions :: [UserLink] 	} deriving (Show, Eq, Generic)  instance FromJSON Post where-	parseJSON = parseMessageType "post" (genericParseJSON defaultOptions)---- | Link to the message in the thread that a Post replies to.------ Generally there is only one link, but sometimes more than one.-newtype Branch = Branch { fromBranch :: [MessageLink] }-	deriving (Show, Eq, Monoid)--instance FromJSON Branch where-	parseJSON v@(String _) = Branch . (:[]) <$> parseJSON v-	parseJSON v@(Array _) = Branch <$> parseJSON v-	parseJSON invalid = typeMismatch "Branch" invalid--newtype Mentions = Mentions { fromMentions :: [Mention] }-	deriving (Show, Eq, Monoid)+	parseJSON = parseMessageType "post" $ withObject "Post" $ \o -> Post+		<$> o .: "text"+		<*> o .:? "channel"+		<*> parseroot o+		<*> parsebranch o+		<*> (o .:? "recps" .!= mempty)+		<*> parsementions o+	  where+	  	-- root is optional.+		-- Avoid failing if it contains something that is not a+		-- valid link.+		parseroot o = join <$> explicitParseFieldMaybe+			(pure . parseMaybe parseJSON)+			o "root"+		-- branch can be a string or an object, and is optional.+		-- Avoid failing if it contains something that is not a+		-- valid link.+		parsebranch o = do+			v <- explicitParseFieldMaybe+				(arrayOrSingleton (parseMaybe parseJSON))+				o "branch"+				.!= mempty+			return (catMaybes v)+		-- mentions can be an array or an object, and is optional.+		-- Avoid failing if it contains something that is not a+		-- valid link.+		parsementions o = do+			v <- explicitParseFieldMaybe+				(arrayOrSingleton (parseMaybe parseJSON))+				o "mentions"+				.!= mempty+			return (catMaybes v) --- | Sometimes it's an array of objects.--- Sometimes there is no array, but a single object.--- And sometimes the Mention contains an invalid Link; avoid failing on--- those.-instance FromJSON Mentions where-	parseJSON v@(Object _) = pure $-		Mentions $ catMaybes [parseMaybe parseJSON v]-	parseJSON (Array v) = pure $-		Mentions $ mapMaybe (parseMaybe parseJSON) (V.toList v)-	parseJSON invalid = typeMismatch "Mentions" invalid+-- | Apply a parser to each thing in an array, or to a single item not in+-- an array.+arrayOrSingleton :: (Value -> a) -> Value -> Parser [a]+arrayOrSingleton p v@(Object _) = pure [p v]+arrayOrSingleton p v@(String _) = pure [p v]+arrayOrSingleton p (Array v) = pure (map p (V.toList v))+arrayOrSingleton _ _ = fail "expected Array or Object" --- | A reference to other feeds, entities, or blobs that were mentioned in--- a Post.-data Mention = Mention-	{ mentionLink :: Link-	, mentionName :: Maybe T.Text+-- | A link to a user, sometimes including a name.+data UserLink = UserLink+	{ userLink :: Link+	, userName :: Maybe T.Text 	} deriving (Show, Eq, Generic) -instance FromJSON Mention where-	parseJSON = parseStrippingPrefix "mention"+instance FromJSON UserLink where+	parseJSON = parseStrippingPrefix "user"  -- | About-messages set attributes about someone or something. -- They can be used to set a name or picture for users, files, or messages.
test/MessageSpec.hs view
@@ -68,10 +68,10 @@ 		root (content message) `shouldBe` 			MessageLink <$> parseSha256 "rf1JvoFg1pHE6TkuuMxsjBNevFck7LQvXGhkLMNlaYs=" 		branch (content message) `shouldBe`-			Just (Branch [fromJust $ MessageLink <$> parseSha256 "G37a4PUTbysiETQazyYATwLkfn/ZzigmIheAx905MLU="])-		recps (content message) `shouldBe` Nothing-		map (linkTo . mentionLink) . fromMentions <$> (mentions (content message)) `shouldBe`-			Just [ "dnr1swLSAgf36g+FzGjNLgmytj2IIyDaYeKZ7F5GdzY=" ]+			[fromJust $ MessageLink <$> parseSha256 "G37a4PUTbysiETQazyYATwLkfn/ZzigmIheAx905MLU="]+		recps (content message) `shouldBe` mempty+		(map (linkTo . userLink) $ mentions $ content message) `shouldBe`+			[ "dnr1swLSAgf36g+FzGjNLgmytj2IIyDaYeKZ7F5GdzY=" ]  	it "does not parse content that is not a post" $ do 		(decode originalAbout :: Maybe (Message Post)) `shouldBe` Nothing