rss-conduit 0.4.0.0 → 0.4.1.0
raw patch · 11 files changed
+127/−108 lines, 11 filesdep ~vinylPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: vinyl
API changes (from Hackage documentation)
+ Text.RSS.Extensions.DublinCore: channelDcMetaData :: RssChannelExtension DublinCoreModule -> DcMetaData
+ Text.RSS.Extensions.DublinCore: itemDcMetaData :: RssItemExtension DublinCoreModule -> DcMetaData
+ Text.RSS.Lens: channelExtensionL :: SingI a => RElem a e (RIndex a e) => Lens' (RssDocument e) (RssChannelExtension a)
+ Text.RSS.Lens: itemExtensionL :: SingI a => RElem a e (RIndex a e) => Lens' (RssItem e) (RssItemExtension a)
Files
- Text/RSS/Conduit/Parse.hs +3/−3
- Text/RSS/Conduit/Parse/Simple.hs +1/−1
- Text/RSS/Conduit/Render.hs +5/−10
- Text/RSS/Extensions/Atom.hs +4/−2
- Text/RSS/Extensions/Content.hs +2/−1
- Text/RSS/Extensions/DublinCore.hs +6/−2
- Text/RSS/Extensions/Syndication.hs +2/−1
- Text/RSS/Lens.hs +16/−3
- Text/RSS/Types.hs +1/−1
- Text/RSS1/Conduit/Parse.hs +3/−3
- rss-conduit.cabal +84/−81
Text/RSS/Conduit/Parse.hs view
@@ -35,7 +35,6 @@ import Data.List.NonEmpty (NonEmpty (..), nonEmpty) import Data.Maybe import Data.Monoid-import Data.MonoTraversable import Data.Set hiding (fold) import Data.Text as Text import Data.Text.Encoding@@ -46,6 +45,7 @@ import Data.XML.Types import Lens.Simple import Prelude hiding (last, lookup)+import Safe import Text.ParserCombinators.ReadP (readP_to_S) import Text.Read (readMaybe) import Text.XML.Stream.Parse@@ -204,7 +204,7 @@ -- | Parse an @\<item\>@ element. ----- RSS extensions are automatically parsed based on the expected result type.+-- RSS extensions are automatically parsed based on the inferred result type. rssItem :: ParseRssExtensions e => MonadThrow m => ConduitM Event o m (Maybe (RssItem e)) rssItem = tagIgnoreAttrs "item" $ (manyYield' (choose piece) =$= parser) <* many ignoreAnyTreeContent where parser = getZipConduit $ RssItem@@ -246,7 +246,7 @@ -- | Parse an @\<rss\>@ element. ----- RSS extensions are automatically parsed based on the expected result type.+-- RSS extensions are automatically parsed based on the inferred result type. rssDocument :: ParseRssExtensions e => MonadThrow m => ConduitM Event o m (Maybe (RssDocument e)) rssDocument = tagName' "rss" attributes $ \version -> force "Missing <channel>" $ tagIgnoreAttrs "channel" (manyYield' (choose piece) =$= parser version) <* many ignoreAnyTreeContent where parser version = getZipConduit $ RssDocument version
Text/RSS/Conduit/Parse/Simple.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE RankNTypes #-} -- | Streaming parsers for the RSS 2.0 standard. ----- This module re-exports a monomorphic version of the parsers from 'Text.RSS.Conduit.Parse' that ignores RSS extensions.+-- This module re-exports a monomorphic version of the parsers from "Text.RSS.Conduit.Parse" that ignores RSS extensions. module Text.RSS.Conduit.Parse.Simple ( -- * Top-level rssDocument
Text/RSS/Conduit/Render.hs view
@@ -21,11 +21,10 @@ import Text.RSS.Types import Control.Monad- import Data.Conduit import Data.Monoid-import Data.MonoTraversable import Data.Set (Set)+import qualified Data.Set as Set import Data.Text as Text hiding (map) import Data.Text.Encoding import Data.Time.Clock@@ -33,13 +32,9 @@ import Data.Time.RFC822 import Data.Version import Data.XML.Types- import Lens.Simple- import Safe- import Text.XML.Stream.Render- import URI.ByteString -- }}} @@ -153,11 +148,11 @@ -- | Render a @\<skipDays\>@ element. renderRssSkipDays :: (Monad m) => Set Day -> Source m Event-renderRssSkipDays s = unless (onull s) $ tag "skipDays" mempty $ forM_ s $ textTag "day" . tshow+renderRssSkipDays s = unless (Set.null s) $ tag "skipDays" mempty $ forM_ s $ textTag "day" . tshow -- | Render a @\<skipHours\>@ element. renderRssSkipHours :: (Monad m) => Set Hour -> Source m Event-renderRssSkipHours s = unless (onull s) $ tag "skipHour" mempty $ forM_ s $ textTag "hour" . tshow+renderRssSkipHours s = unless (Set.null s) $ tag "skipHour" mempty $ forM_ s $ textTag "hour" . tshow -- {{{ Utils@@ -167,8 +162,8 @@ textTag :: (Monad m) => Name -> Text -> Source m Event textTag name = tag name mempty . content -optionalTextTag :: (Monad m) => Name -> Text -> Source m Event-optionalTextTag name value = unless (onull value) $ textTag name value+optionalTextTag :: Monad m => Name -> Text -> Source m Event+optionalTextTag name value = unless (Text.null value) $ textTag name value dateTag :: (Monad m) => Name -> UTCTime -> Source m Event dateTag name = tag name mempty . content . formatTimeRFC822 . utcToZonedTime utc
Text/RSS/Extensions/Atom.hs view
@@ -30,5 +30,7 @@ parseRssChannelExtension = AtomChannel <$> (manyYield' atomLink =$= headC) parseRssItemExtension = AtomItem <$> (manyYield' atomLink =$= headC) -data instance RssChannelExtension AtomModule = AtomChannel (Maybe AtomLink) deriving(Eq, Generic, Show)-data instance RssItemExtension AtomModule = AtomItem (Maybe AtomLink) deriving(Eq, Generic, Show)+data instance RssChannelExtension AtomModule = AtomChannel { channelAtomLink :: Maybe AtomLink }+ deriving(Eq, Generic, Show)+data instance RssItemExtension AtomModule = AtomItem { itemAtomLink :: Maybe AtomLink }+ deriving(Eq, Generic, Show)
Text/RSS/Extensions/Content.hs view
@@ -48,7 +48,8 @@ data instance RssChannelExtension ContentModule = ContentChannel deriving(Eq, Generic, Ord, Show)-data instance RssItemExtension ContentModule = ContentItem Text deriving(Eq, Generic, Ord, Show)+data instance RssItemExtension ContentModule = ContentItem { itemContent :: Text }+ deriving(Eq, Generic, Ord, Show) -- | XML prefix is @content@.
Text/RSS/Extensions/DublinCore.hs view
@@ -10,7 +10,9 @@ module Text.RSS.Extensions.DublinCore ( DublinCoreModule(..) , RssChannelExtension(DublinCoreChannel)+ , channelDcMetaData , RssItemExtension(DublinCoreItem)+ , itemDcMetaData , DcMetaData(..) , mkDcMetaData ) where@@ -126,5 +128,7 @@ parseRssItemExtension = DublinCoreItem <$> dcMetadata -data instance RssChannelExtension DublinCoreModule = DublinCoreChannel DcMetaData deriving(Eq, Generic, Ord, Show)-data instance RssItemExtension DublinCoreModule = DublinCoreItem DcMetaData deriving(Eq, Generic, Ord, Show)+data instance RssChannelExtension DublinCoreModule = DublinCoreChannel { channelDcMetaData :: DcMetaData }+ deriving(Eq, Generic, Ord, Show)+data instance RssItemExtension DublinCoreModule = DublinCoreItem { itemDcMetaData :: DcMetaData }+ deriving(Eq, Generic, Ord, Show)
Text/RSS/Extensions/Syndication.hs view
@@ -150,5 +150,6 @@ parseRssItemExtension = pure SyndicationItem -data instance RssChannelExtension SyndicationModule = SyndicationChannel SyndicationInfo deriving(Eq, Generic, Ord, Show)+data instance RssChannelExtension SyndicationModule = SyndicationChannel { channelSyndicationInfo :: SyndicationInfo}+ deriving(Eq, Generic, Ord, Show) data instance RssItemExtension SyndicationModule = SyndicationItem deriving(Eq, Generic, Ord, Show)
Text/RSS/Lens.hs view
@@ -1,11 +1,14 @@-{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE TemplateHaskell #-} module Text.RSS.Lens (module Text.RSS.Lens) where -- {{{ Imports-import Lens.Simple- import Text.RSS.Types +import Data.Singletons.Prelude+import Data.Vinyl.Lens+import Data.Vinyl.TypeLevel+import Lens.Simple import URI.ByteString -- }}} @@ -29,6 +32,11 @@ itemEnclosureL inj a@RssItem { itemEnclosure = e } = (\x -> a { itemEnclosure = e }) <$> traverse inj e {-# INLINE itemEnclosureL #-} +itemExtensionL :: SingI a => RElem a e (RIndex a e) => Lens' (RssItem e) (RssItemExtension a)+itemExtensionL = itemExtensionsL . f . rlens sing where+ f inj (RssItemExtensions a) = RssItemExtensions <$> inj a+{-# INLINE itemExtensionL #-}+ $(makeLensesBy (\n -> Just (n ++ "L")) ''RssTextInput) $(makeLensesBy (\n -> Just (n ++ "L")) ''RssCloud) $(makeLensesBy (\n -> Just (n ++ "L")) ''RssImage)@@ -46,3 +54,8 @@ channelCategoriesL :: Traversal' (RssDocument e) RssCategory channelCategoriesL inj a@RssDocument { channelCategories = c } = (\x -> a { channelCategories = c }) <$> traverse inj c {-# INLINE channelCategoriesL #-}++channelExtensionL :: SingI a => RElem a e (RIndex a e) => Lens' (RssDocument e) (RssChannelExtension a)+channelExtensionL = channelExtensionsL . f . rlens sing where+ f inj (RssChannelExtensions a) = RssChannelExtensions <$> inj a+{-# INLINE channelExtensionL #-}
Text/RSS/Types.hs view
@@ -288,7 +288,7 @@ -- > data instance RssChannelExtension MyExtension = MyExtensionChannel { {- ... fields -} } -- > data instance RssItemExtension MyExtension = MyExtensionItem { {- ... fields -} } ----- - Implement corresponding parsers (cf 'Text.RSS.Extensions').+-- - Implement corresponding parsers (cf "Text.RSS.Extensions"). -- | @\<channel\>@ extension type. data family RssChannelExtension extensionTag :: *
Text/RSS1/Conduit/Parse.hs view
@@ -120,7 +120,7 @@ -- | Parse an @\<item\>@ element. ----- RSS extensions are automatically parsed based on the expected result type.+-- RSS extensions are automatically parsed based on the inferred result type. rss1Item :: ParseRssExtensions e => MonadCatch m => ConduitM Event o m (Maybe (RssItem e)) rss1Item = rss1Tag "item" attributes $ \uri -> (manyYield' (choose piece) =$= parser uri) <* many ignoreAnyTreeContent where parser uri = getZipConduit $ RssItem@@ -196,7 +196,7 @@ -- | Parse a @\<channel\>@ element. ----- RSS extensions are automatically parsed based on the expected result type.+-- RSS extensions are automatically parsed based on the inferred result type. rss1Channel :: ParseRssExtensions e => MonadThrow m => ConduitM Event o m (Maybe (Rss1Channel e)) rss1Channel = rss1Tag "channel" attributes $ \channelId -> (manyYield' (choose piece) =$= parser channelId) <* many ignoreAnyTreeContent where parser channelId = getZipConduit $ Rss1Channel channelId@@ -255,7 +255,7 @@ -- | Parse an @\<RDF\>@ element. ----- RSS extensions are automatically parsed based on the expected result type.+-- RSS extensions are automatically parsed based on the inferred result type. rss1Document :: ParseRssExtensions e => MonadCatch m => ConduitM Event o m (Maybe (RssDocument e)) rss1Document = fmap (fmap rss1ToRss2) $ rdfTag "RDF" ignoreAttrs $ const $ (manyYield' (choose piece) =$= parser) <* many ignoreAnyTreeContent where parser = getZipConduit $ Rss1Document
rss-conduit.cabal view
@@ -1,86 +1,89 @@-name: rss-conduit-version: 0.4.0.0-synopsis: Streaming parser/renderer for the RSS standard.-description: Cf README file.-license: PublicDomain-license-file: LICENSE-author: koral-maintainer: koral att mailoo dott org-category: XML, Conduit-build-type: Simple-extra-source-files: README.md-cabal-version: >=1.10+name: rss-conduit+version: 0.4.1.0+cabal-version: >=1.10+build-type: Simple+license: PublicDomain+license-file: LICENSE+maintainer: koral att mailoo dott org+synopsis: Streaming parser/renderer for the RSS standard.+description:+ Cf README file.+category: XML, Conduit+author: koral+extra-source-files:+ README.md source-repository head- type: git- location: git://github.com/k0ral/rss-conduit.git+ type: git+ location: git://github.com/k0ral/rss-conduit.git library- exposed-modules:- Text.RSS1.Conduit.Parse- Text.RSS.Conduit.Parse- Text.RSS.Conduit.Parse.Simple- Text.RSS.Conduit.Render- Text.RSS.Extensions- Text.RSS.Extensions.Atom- Text.RSS.Extensions.Content- Text.RSS.Extensions.DublinCore- Text.RSS.Extensions.Syndication- Text.RSS.Lens- Text.RSS.Types- -- other-modules:- build-depends:- atom-conduit- , base >= 4.8 && < 5- , conduit- , conduit-combinators- , containers- , dublincore-xml-conduit- , safe-exceptions- , lens-simple- , mono-traversable- , safe- , singletons- , text- , time >= 1.5- , timerep >= 2.0- , uri-bytestring >= 0.2- , vinyl- , xml-conduit >= 1.5- , xml-types- if impl(ghc < 8)- build-depends: semigroups- default-language: Haskell2010 -test-suite Tests- type: exitcode-stdio-1.0- hs-source-dirs: test- main-is: Main.hs- other-modules: Arbitrary- build-depends:- rss-conduit- , atom-conduit- , base >= 4.8 && < 5- , bytestring- , conduit- , conduit-combinators- , data-default- , dublincore-xml-conduit- , hlint- , lens-simple- , mono-traversable- , QuickCheck- , quickcheck-instances- , resourcet- , safe-exceptions- , singletons- , tasty- , tasty-hunit- , tasty-quickcheck- , time >= 1.5- , text- , uri-bytestring >= 0.2- , vinyl- , xml-conduit >= 1.3- , xml-types- default-language: Haskell2010+ if impl(ghc <8)+ build-depends:+ semigroups -any+ exposed-modules:+ Text.RSS1.Conduit.Parse+ Text.RSS.Conduit.Parse+ Text.RSS.Conduit.Parse.Simple+ Text.RSS.Conduit.Render+ Text.RSS.Extensions+ Text.RSS.Extensions.Atom+ Text.RSS.Extensions.Content+ Text.RSS.Extensions.DublinCore+ Text.RSS.Extensions.Syndication+ Text.RSS.Lens+ Text.RSS.Types+ build-depends:+ atom-conduit -any,+ base >=4.8 && <5,+ conduit -any,+ conduit-combinators -any,+ containers -any,+ dublincore-xml-conduit -any,+ safe-exceptions -any,+ lens-simple -any,+ safe -any,+ singletons -any,+ text -any,+ time >=1.5,+ timerep >=2.0,+ uri-bytestring >=0.2,+ vinyl -any,+ xml-conduit >=1.5,+ xml-types -any+ default-language: Haskell2010++test-suite Tests+ type: exitcode-stdio-1.0+ main-is: Main.hs+ build-depends:+ rss-conduit -any,+ atom-conduit -any,+ base >=4.8 && <5,+ bytestring -any,+ conduit -any,+ conduit-combinators -any,+ data-default -any,+ dublincore-xml-conduit -any,+ hlint -any,+ lens-simple -any,+ mono-traversable -any,+ QuickCheck -any,+ quickcheck-instances -any,+ resourcet -any,+ safe-exceptions -any,+ singletons -any,+ tasty -any,+ tasty-hunit -any,+ tasty-quickcheck -any,+ time >=1.5,+ text -any,+ uri-bytestring >=0.2,+ vinyl -any,+ xml-conduit >=1.3,+ xml-types -any+ default-language: Haskell2010+ hs-source-dirs: test+ other-modules:+ Arbitrary