Hello community, here is the log from the commit of package ghc-xml-conduit for openSUSE:Factory checked in at 2016-05-17 17:16:05 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ghc-xml-conduit (Old) and /work/SRC/openSUSE:Factory/.ghc-xml-conduit.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-xml-conduit" Changes: -------- --- /work/SRC/openSUSE:Factory/ghc-xml-conduit/ghc-xml-conduit.changes 2016-04-28 17:02:16.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.ghc-xml-conduit.new/ghc-xml-conduit.changes 2016-05-17 17:16:06.000000000 +0200 @@ -1,0 +2,6 @@ +Thu May 12 13:39:32 UTC 2016 - mimi...@gmail.com + +- update to 1.3.5 +* Improvements for using xml-conduit for streaming XML protocols + +------------------------------------------------------------------- Old: ---- xml-conduit-1.3.4.2.tar.gz New: ---- xml-conduit-1.3.5.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ghc-xml-conduit.spec ++++++ --- /var/tmp/diff_new_pack.CBEq97/_old 2016-05-17 17:16:07.000000000 +0200 +++ /var/tmp/diff_new_pack.CBEq97/_new 2016-05-17 17:16:07.000000000 +0200 @@ -21,7 +21,7 @@ %bcond_with tests Name: ghc-xml-conduit -Version: 1.3.4.2 +Version: 1.3.5 Release: 0 Summary: Pure-Haskell utilities for dealing with XML with the conduit package License: BSD-2-Clause ++++++ xml-conduit-1.3.4.2.tar.gz -> xml-conduit-1.3.5.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xml-conduit-1.3.4.2/ChangeLog.md new/xml-conduit-1.3.5/ChangeLog.md --- old/xml-conduit-1.3.4.2/ChangeLog.md 2016-04-18 08:57:08.000000000 +0200 +++ new/xml-conduit-1.3.5/ChangeLog.md 2016-05-11 13:03:26.000000000 +0200 @@ -1,3 +1,7 @@ +## 1.3.5 + +* Improvements for using xml-conduit for streaming XML protocols [#85](https://github.com/snoyberg/xml/pull/85) + ## 1.3.4.2 * transformers dep bump diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xml-conduit-1.3.4.2/Text/XML/Stream/Render.hs new/xml-conduit-1.3.5/Text/XML/Stream/Render.hs --- old/xml-conduit-1.3.4.2/Text/XML/Stream/Render.hs 2016-04-18 08:57:08.000000000 +0200 +++ new/xml-conduit-1.3.5/Text/XML/Stream/Render.hs 2016-05-11 13:03:26.000000000 +0200 @@ -1,11 +1,13 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE RankNTypes #-} -- | 'Enumeratee's to render XML 'Event's. Unlike libxml-enumerator and -- expat-enumerator, this module does not provide IO and ST variants, since the -- underlying rendering operations are pure functions. module Text.XML.Stream.Render ( -- * Rendering XML files renderBuilder + , renderBuilderFlush , renderBytes , renderText , prettify @@ -115,31 +117,49 @@ -- the blaze-builder package, and allow the create of optimally sized -- 'ByteString's with minimal buffer copying. renderBuilder :: Monad m => RenderSettings -> Conduit Event m Builder -renderBuilder RenderSettings { rsPretty = True, rsNamespaces = n, rsUseCDATA = useCDATA } = prettify =$= renderBuilder' n True useCDATA -renderBuilder RenderSettings { rsPretty = False, rsNamespaces = n, rsUseCDATA = useCDATA } = renderBuilder' n False useCDATA +renderBuilder settings = CL.map Chunk =$= renderBuilder' yield' settings + where + yield' Flush = return () + yield' (Chunk bs) = yield bs + +-- | Same as 'renderBuilder' but allows you to flush XML stream to ensure that all +-- events at needed point are rendered. +-- +-- @since 1.3.5 +renderBuilderFlush :: Monad m => RenderSettings -> Conduit (Flush Event) m (Flush Builder) +renderBuilderFlush = renderBuilder' yield + +renderBuilder' :: Monad m => (Flush Builder -> Producer m o) -> RenderSettings -> Conduit (Flush Event) m o +renderBuilder' yield' settings = + if rsPretty settings + then prettify =$= renderEvent' + else renderEvent' + where + renderEvent' = renderEvent yield' settings -renderBuilder' :: Monad m => [(Text, Text)] -> Bool -> (Content -> Bool) -> Conduit Event m Builder -renderBuilder' namespaces0 isPretty useCDATA = do +renderEvent :: Monad m => (Flush Builder -> Producer m o) -> RenderSettings -> Conduit (Flush Event) m o +renderEvent yield' RenderSettings { rsPretty = isPretty, rsNamespaces = namespaces0, rsUseCDATA = useCDATA } = do loop [] where loop nslevels = await >>= maybe (return ()) (go nslevels) - go nslevels e = + go nslevels Flush = yield' Flush >> loop nslevels + go nslevels (Chunk e) = case e of EventBeginElement n1 as -> do mnext <- CL.peek isClosed <- case mnext of - Just (EventEndElement n2) | n1 == n2 -> do + Just (Chunk (EventEndElement n2)) | n1 == n2 -> do CL.drop 1 return True _ -> return False let (token, nslevels') = mkBeginToken isPretty isClosed namespaces0 nslevels n1 as - yield token + yield' $ Chunk token loop nslevels' _ -> do let (token, nslevels') = eventToToken nslevels useCDATA e - yield token + yield' $ Chunk token loop nslevels' eventToToken :: Stack -> (Content -> Bool) -> Event -> (Builder, [NSLevel]) @@ -260,35 +280,40 @@ -- | Convert a stream of 'Event's into a prettified one, adding extra -- whitespace. Note that this can change the meaning of your XML. -prettify :: Monad m => Conduit Event m Event +prettify :: Monad m => Conduit (Flush Event) m (Flush Event) prettify = prettify' 0 -prettify' :: Monad m => Int -> Conduit Event m Event +prettify' :: Monad m => Int -> Conduit (Flush Event) m (Flush Event) prettify' level = - await >>= maybe (return ()) go + await >>= maybe (return ()) goC where + yield' = yield . Chunk + + goC Flush = yield Flush >> prettify' level + goC (Chunk e) = go e + go e@EventBeginDocument = do - yield e - yield $ EventContent $ ContentText "\n" + yield' e + yield' $ EventContent $ ContentText "\n" prettify' level go e@EventBeginElement{} = do - yield before - yield e + yield' before + yield' e mnext <- CL.peek case mnext of - Just next@EventEndElement{} -> do + Just (Chunk next@EventEndElement{}) -> do CL.drop 1 - yield next - yield after + yield' next + yield' after prettify' level _ -> do - yield after + yield' after prettify' $ level + 1 go e@EventEndElement{} = do let level' = max 0 $ level - 1 - yield $ before' level' - yield e - yield after + yield' $ before' level' + yield' e + yield' after prettify' level' go (EventContent c) = do cs <- takeContents (c:) @@ -296,37 +321,37 @@ case cs' of [] -> return () _ -> do - yield before - mapM_ (yield . EventContent) cs' - yield after + yield' before + mapM_ (yield' . EventContent) cs' + yield' after prettify' level go (EventCDATA t) = go $ EventContent $ ContentText t go e@EventInstruction{} = do - yield before - yield e - yield after + yield' before + yield' e + yield' after prettify' level go (EventComment t) = do - yield before - yield $ EventComment $ T.concat + yield' before + yield' $ EventComment $ T.concat [ " " , T.unwords $ T.words t , " " ] - yield after + yield' after prettify' level - go e@EventEndDocument = yield e >> prettify' level - go e@EventBeginDoctype{} = yield e >> prettify' level - go e@EventEndDoctype{} = yield e >> yield after >> prettify' level + go e@EventEndDocument = yield' e >> prettify' level + go e@EventBeginDoctype{} = yield' e >> prettify' level + go e@EventEndDoctype{} = yield' e >> yield' after >> prettify' level takeContents front = do me <- CL.peek case me of - Just (EventContent c) -> do + Just (Chunk (EventContent c)) -> do CL.drop 1 takeContents $ front . (c:) - Just (EventCDATA t) -> do + Just (Chunk (EventCDATA t)) -> do CL.drop 1 takeContents $ front . (ContentText t:) _ -> return $ front [] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xml-conduit-1.3.4.2/Text/XML/Unresolved.hs new/xml-conduit-1.3.5/Text/XML/Unresolved.hs --- old/xml-conduit-1.3.4.2/Text/XML/Unresolved.hs 2016-04-18 08:57:08.000000000 +0200 +++ new/xml-conduit-1.3.5/Text/XML/Unresolved.hs 2016-05-11 13:03:26.000000000 +0200 @@ -23,7 +23,9 @@ , sinkDoc -- * Streaming functions , toEvents + , elementToEvents , fromEvents + , elementFromEvents , renderBuilder , renderBytes , renderText @@ -130,10 +132,24 @@ --renderText :: (MonadThrow m, MonadUnsafeIO m) => R.RenderSettings -> Document -> Producer m Text renderText rs doc = CL.sourceList (toEvents doc) =$= R.renderText rs +manyTries :: Monad m => m (Maybe a) -> m [a] +manyTries f = + go id + where + go front = do + x <- f + case x of + Nothing -> return $ front [] + Just y -> go (front . (:) y) + +dropReturn :: Monad m => a -> ConduitM i o m a +dropReturn x = CL.drop 1 >> return x + +-- | Parse a document from a stream of events. fromEvents :: MonadThrow m => Consumer P.EventPos m Document fromEvents = do skip EventBeginDocument - d <- Document <$> goP <*> require goE <*> goM + d <- Document <$> goP <*> require elementFromEvents <*> goM skip EventEndDocument y <- CL.head case y of @@ -145,15 +161,6 @@ skip e = do x <- CL.peek when (fmap snd x == Just e) (CL.drop 1) - many f = - go id - where - go front = do - x <- f - case x of - Nothing -> return $ front [] - Just y -> go (front . (:) y) - dropReturn x = CL.drop 1 >> return x require f = do x <- f case x of @@ -165,7 +172,7 @@ Just (_, EventEndDocument) -> lift $ monadThrow MissingRootElement Just y -> lift $ monadThrow $ ContentAfterRoot y goP = Prologue <$> goM <*> goD <*> goM - goM = many goM' + goM = manyTries goM' goM' = do x <- CL.peek case x of @@ -193,6 +200,13 @@ Just (_, EventEndDoctype) -> return () Just epos -> lift $ monadThrow $ InvalidInlineDoctype epos Nothing -> lift $ monadThrow UnterminatedInlineDoctype + +-- | Try to parse a document element (as defined in XML) from a stream of events. +-- +-- @since 1.3.5 +elementFromEvents :: MonadThrow m => Consumer P.EventPos m (Maybe Element) +elementFromEvents = goE + where goE = do x <- CL.peek case x of @@ -200,7 +214,7 @@ _ -> return Nothing goE' n as = do CL.drop 1 - ns <- many goN + ns <- manyTries goN y <- CL.head if fmap snd y == Just (EventEndElement n) then return $ Element n as $ compressNodes ns @@ -215,10 +229,11 @@ Just (_, EventCDATA t) -> dropReturn $ Just $ NodeContent $ ContentText t _ -> return Nothing +-- | Render a document into events. toEvents :: Document -> [Event] toEvents (Document prol root epi) = (EventBeginDocument :) - . goP prol . goE root . goM epi $ [EventEndDocument] + . goP prol . elementToEvents' root . goM epi $ [EventEndDocument] where goP (Prologue before doctype after) = goM before . maybe id goD doctype . goM after @@ -230,6 +245,16 @@ goD (Doctype name meid) = (:) (EventBeginDoctype name meid) . (:) EventEndDoctype + +-- | Render a document element into events. +-- +-- @since 1.3.5 +elementToEvents :: Element -> [Event] +elementToEvents e = elementToEvents' e [] + +elementToEvents' :: Element -> [Event] -> [Event] +elementToEvents' = goE + where goE (Element name as ns) = (EventBeginElement name as :) . goN ns diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xml-conduit-1.3.4.2/xml-conduit.cabal new/xml-conduit-1.3.5/xml-conduit.cabal --- old/xml-conduit-1.3.4.2/xml-conduit.cabal 2016-04-18 08:57:08.000000000 +0200 +++ new/xml-conduit-1.3.5/xml-conduit.cabal 2016-05-11 13:03:26.000000000 +0200 @@ -1,5 +1,5 @@ name: xml-conduit -version: 1.3.4.2 +version: 1.3.5 license: MIT license-file: LICENSE author: Michael Snoyman <mich...@snoyman.com>, Aristid Breitkreuz <arist...@googlemail.com>