packages feed

vty 5.2.11 → 5.3

raw patch · 28 files changed

+146/−189 lines, 28 filesdep ~Cabaldep ~QuickChecknew-uploader

Dependency ranges changed: Cabal, QuickCheck

Files

CHANGELOG view
@@ -1,5 +1,18 @@-5.2.12-  - unreleased+5.3+  - Upgraded QuickCheck dependency to 2.7+  - The standard IO Config (standardIOConfig) was overriding any provided application config.+    In addition, the inputFd and outputFd could not be changed if mkVty was used.+    Fixed.+  - Correct handling of display attributes at end of line. The output attributes are set to default+    at the end of content for the line and at the start of a new line.  Previously the current+    attribute would extend to the next start of content. This was odd to reason about and was the+    cause of https://github.com/coreyoconnor/vty/issues/76+    IIRC Yi requires the old behavior to display the selection region correctly.+  - shutdown of the input thread is now performed using killThread and synchronization on an MVar.+    For correct handling of the terminal read vmin and vtime the read must be a blocking read on an+    OS thread. This places a threadWaitRead, which will be interrupted by the killThread, prior to+    the uninterruptable read. An alternative would be to re-import the read foreign call as+    interruptable.  5.2.11   - deepseq bounds increased for tests.
Demo.hs view
@@ -20,7 +20,7 @@ main = do     vty <- if True -- change to false for emacs-like input processing             then mkVty def-            else mkVty (def { vmin = Just 2, vtime = Just 100 } )+            else mkVty (def { vmin = Just 2, vtime = Just 300 } )     _ <- execRWST (vtyInteract False) vty Seq.empty     shutdown vty 
README.md view
@@ -1,8 +1,20 @@-vty is a terminal interface library.+[![Build Status](https://travis-ci.org/coreyoconnor/vty.png)](https://travis-ci.org/coreyoconnor/vty) -Project is hosted on github.com: https://github.com/coreyoconnor/vty+`vty` is a terminal interface library. +This project is hosted on github.com: https://github.com/coreyoconnor/vty++Install via `git` with:++``` git clone git://github.com/coreyoconnor/vty.git+```++Install via `cabal` with:++```+cabal install vty+```  # Features 
− dist/build/verify-attribute-opsStub/verify-attribute-opsStub-tmp/verify-attribute-opsStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyAttributeOps ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-crop-span-generationStub/verify-crop-span-generationStub-tmp/verify-crop-span-generationStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyCropSpanGeneration ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-display-attributesStub/verify-display-attributesStub-tmp/verify-display-attributesStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyDisplayAttributes ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-empty-image-propsStub/verify-empty-image-propsStub-tmp/verify-empty-image-propsStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyEmptyImageProps ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-eval-terminfo-capsStub/verify-eval-terminfo-capsStub-tmp/verify-eval-terminfo-capsStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyEvalTerminfoCaps ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-image-opsStub/verify-image-opsStub-tmp/verify-image-opsStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyImageOps ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-image-transStub/verify-image-transStub-tmp/verify-image-transStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyImageTrans ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-inlineStub/verify-inlineStub-tmp/verify-inlineStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyInline ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-layers-span-generationStub/verify-layers-span-generationStub-tmp/verify-layers-span-generationStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyLayersSpanGeneration ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-parse-terminfo-capsStub/verify-parse-terminfo-capsStub-tmp/verify-parse-terminfo-capsStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyParseTerminfoCaps ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-simple-span-generationStub/verify-simple-span-generationStub-tmp/verify-simple-span-generationStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifySimpleSpanGeneration ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-terminalStub/verify-terminalStub-tmp/verify-terminalStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyOutput ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-using-mock-terminalStub/verify-using-mock-terminalStub-tmp/verify-using-mock-terminalStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyUsingMockTerminal ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-utf8-widthStub/verify-utf8-widthStub-tmp/verify-utf8-widthStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyUtf8Width ( tests )-main :: IO ()-main = stubMain tests
src/Graphics/Vty/Config.hs view
@@ -139,8 +139,8 @@         , vtime         = vtime c1    <|> vtime c0         , debugLog      = debugLog c1 <|> debugLog c0         , inputMap      = inputMap c0 <>  inputMap c1-        , inputFd      = inputFd c1 <|> inputFd c1-        , outputFd     = outputFd c1 <|> outputFd c1+        , inputFd      = inputFd c1 <|> inputFd c0+        , outputFd     = outputFd c1 <|> outputFd c0         , termName      = termName c1 <|> termName c0         } @@ -151,8 +151,8 @@ userConfig = do     configFile <- (mappend <$> getAppUserDataDirectory "vty" <*> pure "/config") >>= parseConfigFile     overrideConfig <- maybe (return def) parseConfigFile =<< getEnv "VTY_CONFIG_FILE"-    base <- (<> configFile <> overrideConfig) <$> standardIOConfig-    (mappend base) <$> overrideEnvConfig+    let base = configFile <> overrideConfig+    mappend base <$> overrideEnvConfig  overrideEnvConfig :: IO Config overrideEnvConfig = do
src/Graphics/Vty/Image.hs view
@@ -184,7 +184,8 @@                 where w = imageWidth  i + l                       h = imageHeight i --- | translates an image by padding or cropping the top and left.+-- | translates an image by padding or cropping the left and top. First param is amount to translate+-- left. Second param is amount to translate top. -- -- This can have an unexpected effect: Translating an image to less than (0,0) then to greater than -- (0,0) will crop the image.
src/Graphics/Vty/Inline/Unsafe.hs view
@@ -61,7 +61,7 @@     mout <- readIORef globalOutput     out <- case mout of         Nothing -> do-            config <- (<>) <$> userConfig <*> mkDupeConfig+            config <- mappend <$> userConfig <*> mkDupeConfig             out <- outputForConfig config             writeIORef globalOutput (Just out)             return out
src/Graphics/Vty/Input.hs view
@@ -145,6 +145,8 @@ #if !(MIN_VERSION_base(4,8,0)) import Data.Functor ((<$>)) import Data.Monoid+#else+import Data.Monoid ((<>)) #endif  -- | Set up the terminal with file descriptor `inputFd` for input.  Returns a 'Input'.@@ -201,4 +203,4 @@             _ <- installHandler continueProcess Ignore Nothing             unsetAttrs         }-inputForConfig config = mappend config <$> standardIOConfig >>= inputForConfig+inputForConfig config = (<> config) <$> standardIOConfig >>= inputForConfig
src/Graphics/Vty/Input/Loop.hs view
@@ -19,6 +19,7 @@  import Control.Applicative import Control.Concurrent+import Control.Exception (mask, try, SomeException) import Control.Lens import Control.Monad (when, mzero, forM_) import Control.Monad.IO.Class (liftIO)@@ -65,7 +66,6 @@     { _unprocessedBytes :: String     , _appliedConfig :: Config     , _inputBuffer :: InputBuffer-    , _stopRequestRef :: IORef Bool     , _classifier :: String -> KClass     } @@ -88,7 +88,7 @@     validEvents <- many parseEvent     forM_ validEvents emit     dropInvalid-    stopIfRequested <|> loopInputProcessor+    loopInputProcessor  addBytesToProcess :: String -> InputM () addBytesToProcess block = unprocessedBytes <>= block@@ -115,6 +115,11 @@     bufferPtr <- use $ inputBuffer.ptr     maxBytes  <- use $ inputBuffer.size     stringRep <- liftIO $ do+        -- The killThread used in shutdownInput will not interrupt the foreign call fdReadBuf uses+        -- this provides a location to be interrupted prior to the foreign call. If there is input+        -- on the FD then the fdReadBuf will return in a finite amount of time due to the vtime+        -- terminal setting.+        threadWaitRead fd         bytesRead <- fdReadBuf fd bufferPtr (fromIntegral maxBytes)         if bytesRead > 0         then fmap (map $ chr . fromIntegral) $ peekArray (fromIntegral bytesRead) bufferPtr@@ -147,18 +152,12 @@         logMsg "dropping input bytes"         unprocessedBytes .= [] -stopIfRequested :: InputM ()-stopIfRequested = do-    True <- (liftIO . readIORef) =<< use stopRequestRef-    return ()--runInputProcessorLoop :: ClassifyMap -> Input -> IORef Bool -> IO ()-runInputProcessorLoop classifyTable input stopFlag = do+runInputProcessorLoop :: ClassifyMap -> Input -> IO ()+runInputProcessorLoop classifyTable input = do     let bufferSize = 1024     allocaArray bufferSize $ \(bufferPtr :: Ptr Word8) -> do         s0 <- InputState [] <$> readIORef (_configRef input)                             <*> pure (InputBuffer bufferPtr bufferSize)-                            <*> pure stopFlag                             <*> pure (classify classifyTable)         runReaderT (evalStateT loopInputProcessor s0) input @@ -192,15 +191,23 @@     let Just fd = inputFd config     setFdOption fd NonBlockingRead False     applyConfig fd config-    stopFlag <- newIORef False+    stopSync <- newEmptyMVar     input <- Input <$> newChan-                   <*> pure (writeIORef stopFlag True)+                   <*> pure (return ())                    <*> newIORef config                    <*> maybe (return Nothing)                              (\f -> Just <$> openFile f AppendMode)                              (debugLog config)     logInitialInputState input classifyTable-    _ <- forkOS $ runInputProcessorLoop classifyTable input stopFlag-    return input+    inputThread <- forkOSFinally (runInputProcessorLoop classifyTable input)+                                 (\_ -> putMVar stopSync ())+    let killAndWait = do+          killThread inputThread+          takeMVar stopSync+    return $ input { shutdownInput = killAndWait }  foreign import ccall "vty_set_term_timing" setTermTiming :: Fd -> Int -> Int -> IO ()++forkOSFinally :: IO a -> (Either SomeException a -> IO ()) -> IO ThreadId+forkOSFinally action and_then =+  mask $ \restore -> forkOS $ try (restore action) >>= and_then
src/Graphics/Vty/Output.hs view
@@ -1,11 +1,5 @@-{-# LANGUAGE CPP #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE NamedFieldPuns #-}--#ifndef MIN_VERSION_base-#defined MIN_VERSION_base(x,y,z) 1-#endif- --  | Output interface. -- --  Access to the current terminal or a specific terminal device.@@ -13,8 +7,8 @@ --  See also: -- --  1. "Graphics.Vty.Output": This instantiates an abtract interface to the terminal interface based---  on the TERM and COLORTERM environment variables. ---  +--  on the TERM and COLORTERM environment variables.+-- --  2. "Graphics.Vty.Output.Interface": Defines the generic interface all terminals need to implement. -- --  3. "Graphics.Vty.Output.TerminfoBased": Defines a terminal instance that uses terminfo for all@@ -23,7 +17,7 @@ -- --  4. "Graphics.Vty.Output.XTermColor": This module contains an interface suitable for xterm-like --  terminals. These are the terminals where TERM == xterm. This does use terminfo for as many---  control codes as possible. +--  control codes as possible. module Graphics.Vty.Output ( module Graphics.Vty.Output                            , Output(..) -- \todo hide constructors                            , AssumedState(..)@@ -33,7 +27,6 @@                            )     where - import Graphics.Vty.Prelude  import Graphics.Vty.Config@@ -47,10 +40,7 @@ import Control.Monad.Trans  import Data.List (isPrefixOf)--#if !(MIN_VERSION_base(4,8,0))-import Data.Monoid (mappend)-#endif+import Data.Monoid ((<>))  -- | Returns a `Output` for the terminal specified in `Config` --@@ -76,9 +66,9 @@         -- Not an xterm-like terminal. try for generic terminfo.         else TerminfoBased.reserveTerminal termName fd     return t-outputForConfig config = mappend config <$> standardIOConfig >>= outputForConfig+outputForConfig config = (<> config) <$> standardIOConfig >>= outputForConfig --- | Sets the cursor position to the given output column and row. +-- | Sets the cursor position to the given output column and row. -- -- This is not necessarially the same as the character position with the same coordinates. -- Characters can be a variable number of columns in width.@@ -98,11 +88,10 @@     bounds <- displayBounds t     dc <- displayContext t bounds     liftIO $ outputByteBuffer t $ writeToByteString $ writeHideCursor dc-    + -- | Shows the cursor showCursor :: MonadIO m => Output -> m () showCursor t = do     bounds <- displayBounds t     dc <- displayContext t bounds     liftIO $ outputByteBuffer t $ writeToByteString $ writeShowCursor dc-
src/Graphics/Vty/Output/Interface.hs view
@@ -149,7 +149,6 @@                                   (Vector.toList ops)         -- build the Write corresponding to the output image         out = (if manipCursor then writeHideCursor dc else mempty)-              `mappend` writeDefaultAttr dc               `mappend` writeOutputOps dc initialAttr diffs ops               `mappend`                 (case picCursor pic of@@ -167,30 +166,31 @@     writeIORef (assumedStateRef $ contextDevice dc) as'  writeOutputOps :: DisplayContext -> FixedAttr -> [Bool] -> DisplayOps -> Write-writeOutputOps dc inFattr diffs ops =-    let (_, out, _, _) = Vector.foldl' writeOutputOps' -                                       (0, mempty, inFattr, diffs) +writeOutputOps dc initialAttr diffs ops =+    let (_, out, _) = Vector.foldl' writeOutputOps'+                                       (0, mempty, diffs)                                        ops     in out     where -        writeOutputOps' (y, out, fattr, True : diffs') spanOps-            = let (spanOut, fattr') = writeSpanOps dc y fattr spanOps-              in (y+1, out `mappend` spanOut, fattr', diffs')-        writeOutputOps' (y, out, fattr, False : diffs') _spanOps-            = (y + 1, out, fattr, diffs')-        writeOutputOps' (_y, _out, _fattr, []) _spanOps+        writeOutputOps' (y, out, True : diffs') spanOps+            = let spanOut = writeSpanOps dc y initialAttr spanOps+                  out' = out `mappend` spanOut+              in (y+1, out', diffs')+        writeOutputOps' (y, out, False : diffs') _spanOps+            = (y + 1, out, diffs')+        writeOutputOps' (_y, _out, []) _spanOps             = error "vty - output spans without a corresponding diff." -writeSpanOps :: DisplayContext -> Int -> FixedAttr -> SpanOps -> (Write, FixedAttr)-writeSpanOps dc y inFattr spanOps =+writeSpanOps :: DisplayContext -> Int -> FixedAttr -> SpanOps -> Write+writeSpanOps dc y initialAttr spanOps =     -- The first operation is to set the cursor to the start of the row-    let start = writeMoveCursor dc 0 y+    let start = writeMoveCursor dc 0 y `mappend` writeDefaultAttr dc     -- then the span ops are serialized in the order specified-    in Vector.foldl' (\(out, fattr) op -> case writeSpanOp dc op fattr of-                                            (opOut, fattr') -> (out `mappend` opOut, fattr')-                     )-                     (start, inFattr)-                     spanOps+    in fst $ Vector.foldl' (\(out, fattr) op -> case writeSpanOp dc op fattr of+                              (opOut, fattr') -> (out `mappend` opOut, fattr')+                           )+                           (start, initialAttr)+                           spanOps  writeSpanOp :: DisplayContext -> SpanOp -> FixedAttr -> (Write, FixedAttr) writeSpanOp dc (TextSpan attr _ _ str) fattr =@@ -201,7 +201,7 @@                `mappend` writeUtf8Text (T.encodeUtf8 $ TL.toStrict str)     in (out, fattr') writeSpanOp _dc (Skip _) _fattr = error "writeSpanOp for Skip"-writeSpanOp dc (RowEnd _) fattr = (writeRowEnd dc, fattr)+writeSpanOp dc (RowEnd _) fattr = (writeDefaultAttr dc `mappend` writeRowEnd dc, fattr)  -- | The cursor position is given in X,Y character offsets. Due to multi-column characters this -- needs to be translated to column, row positions.
src/Graphics/Vty/PictureToSpans.hs view
@@ -221,8 +221,7 @@         return ()     return outOps --- | Add the operations required to build a given image to the current set of row operations--- returns the number of columns and rows contributed to the output.+-- | Add the operations required to build a given image to the current set of row operations. startImageBuild :: Image -> BlitM s () startImageBuild image = do     outOfBounds <- isOutOfBounds image <$> get
test/Verify/Graphics/Vty/Output.hs view
@@ -1,5 +1,7 @@ module Verify.Graphics.Vty.Output where +import Control.Applicative ((<$>))+ import Graphics.Vty.Output.Mock  import qualified Data.ByteString as BS@@ -49,12 +51,11 @@  compareMockOutput :: MockData -> String -> IO Result compareMockOutput mockData expectedStr = do-    outBytes <- readIORef mockData >>= return . UTF8.toRep-    let expectedBytes :: BS.ByteString = UTF8.toRep $ UTF8.fromString expectedStr-    if outBytes /=  expectedBytes-        then return $ failed { reason = "bytes\n" ++ show outBytes+    outStr <- UTF8.toString <$> readIORef mockData+    if outStr /=  expectedStr+        then return $ failed { reason = "bytes\n" ++ outStr                                       ++ "\nare not the expected bytes\n"-                                      ++ show expectedBytes+                                      ++ expectedStr                              }         else return succeeded 
test/VerifyUsingMockTerminal.hs view
@@ -46,8 +46,8 @@     -- The mock output string that represents the output bytes a single line containing the T     -- string: Followed by h - 1 lines of a change to the background attribute and then the     -- background character-    let expected = "HD" ++ "MA" ++ replicate (fromEnum w) 'T'-                 ++ concat (replicate (fromEnum h - 1) $ "MA" ++ replicate (fromEnum w) 'B')+    let expected = "H" ++ "MDA" ++ replicate (fromEnum w) 'T'+                 ++ concat (replicate (fromEnum h - 1) $ "MDA" ++ replicate (fromEnum w) 'B')     compareMockOutput mockData expected      manyTRows :: MockWindow -> Property@@ -60,7 +60,7 @@     outputPicture dc pic     -- The UTF8 string that represents the output bytes is h repeats of a move, 'M', followed by an     -- attribute change. 'A', followed by w 'T's-    let expected = "HD" ++ concat (replicate (fromEnum h) $ "MA" ++ replicate (fromEnum w) 'T')+    let expected = "H" ++ concat (replicate (fromEnum h) $ "MDA" ++ replicate (fromEnum w) 'T')     compareMockOutput mockData expected  manyTRowsCroppedWidth :: MockWindow -> Property@@ -73,7 +73,7 @@     outputPicture dc pic     -- The UTF8 string that represents the output bytes is h repeats of a move, 'M', followed by an     -- attribute change. 'A', followed by w 'T's-    let expected = "HD" ++ concat (replicate (fromEnum h) $ "MA" ++ replicate (fromEnum w) 'T')+    let expected = "H" ++ concat (replicate (fromEnum h) $ "MDA" ++ replicate (fromEnum w) 'T')     compareMockOutput mockData expected  manyTRowsCroppedHeight :: MockWindow -> Property@@ -86,7 +86,7 @@     outputPicture dc pic     -- The UTF8 string that represents the output bytes is h repeats of a move, 'M', followed by an     -- attribute change. 'A', followed by w count 'T's-    let expected = "HD" ++ concat (replicate (fromEnum h) $ "MA" ++ replicate (fromEnum w) 'T')+    let expected = "H" ++ concat (replicate (fromEnum h) $ "MDA" ++ replicate (fromEnum w) 'T')     compareMockOutput mockData expected  tests :: IO [Test]
vty.cabal view
@@ -1,5 +1,5 @@ name:                vty-version:             5.2.11+version:             5.3 license:             BSD3 license-file:        LICENSE author:              AUTHORS@@ -8,30 +8,33 @@ category:            User Interfaces synopsis:            A simple terminal UI library description:-  vty is terminal GUI library in the niche of ncurses.  It is intended to be easy to use, have no-  confusing corner cases, and good support for common terminal types.+  vty is terminal GUI library in the niche of ncurses. It is intended to+  be easy to use, have no confusing corner cases, and good support for+  common terminal types.   .-  Included in the source distribution is a program test/interactive_terminal_test.hs that-  demonstrates the various features. +  Included in the source distribution is a program+  test/interactive_terminal_test.hs that demonstrates the various+  features.   .   Developers: See the "Graphics.Vty" module.   .   Users: See the "Graphics.Vty.Config" module.   .-  If your terminal is not behaving as expected the results of the vty-interactive-terminal-test-  executable should be sent to the Vty maintainter to aid in debugging the issue.+  If your terminal is not behaving as expected the results of the+  vty-interactive-terminal-test executable should be sent to the Vty+  maintainter to aid in debugging the issue.   .-  Notable infelicities: Assumes UTF-8 character encoding support by the terminal; Poor signal-  handling; Requires terminfo.+  Notable infelicities: Assumes UTF-8 character encoding support by the+  terminal; Poor signal handling; Requires terminfo.   .-  Project is hosted on github.com: https:\/\/github.com\/coreyoconnor\/vty+  This project is hosted on github.com: <https://github.com/coreyoconnor/vty>   .-  git clone git:\/\/github.com\/coreyoconnor\/vty.git+  > git clone git://github.com/coreyoconnor/vty.git   .   &#169; 2006-2007 Stefan O'Rear; BSD3 license.   .   &#169; Corey O'Connor; BSD3 license.-cabal-version:       >= 1.18.0+cabal-version:       >= 1.20.0 build-type:          Simple data-files:          README.md,                      TODO,@@ -136,8 +139,8 @@   hs-source-dirs:      test   test-module:         VerifyAttributeOps   build-depends:       vty,-                       Cabal >= 1.18,-                       QuickCheck >= 2.4,+                       Cabal >= 1.20,+                       QuickCheck >= 2.7,                        random >= 1.0 && < 1.2,                        base >= 4 && < 5,                        bytestring,@@ -168,8 +171,8 @@                        Verify.Graphics.Vty.Output    build-depends:       vty,-                       Cabal >= 1.18,-                       QuickCheck >= 2.4,+                       Cabal >= 1.20,+                       QuickCheck >= 2.7,                        random >= 1.0 && < 1.2,                        base >= 4 && < 5,                        bytestring,@@ -201,8 +204,8 @@                        Verify.Graphics.Vty.Output    build-depends:       vty,-                       Cabal >= 1.18,-                       QuickCheck >= 2.4,+                       Cabal >= 1.20,+                       QuickCheck >= 2.7,                        random >= 1.0 && < 1.2,                        base >= 4 && < 5,                        bytestring,@@ -235,8 +238,8 @@                        Verify.Graphics.Vty.Span    build-depends:       vty,-                       Cabal >= 1.18,-                       QuickCheck >= 2.4,+                       Cabal >= 1.20,+                       QuickCheck >= 2.7,                        random >= 1.0 && < 1.2,                        base >= 4 && < 5,                        bytestring,@@ -261,8 +264,8 @@   other-modules:       Verify    build-depends:       vty,-                       Cabal >= 1.18,-                       QuickCheck >= 2.4,+                       Cabal >= 1.20,+                       QuickCheck >= 2.7,                        random >= 1.0 && < 1.2,                        base >= 4 && < 5,                        bytestring,@@ -288,8 +291,8 @@                        Verify.Graphics.Vty.Output    build-depends:       vty,-                       Cabal >= 1.18,-                       QuickCheck >= 2.4,+                       Cabal >= 1.20,+                       QuickCheck >= 2.7,                        random >= 1.0 && < 1.2,                        base >= 4 && < 5,                        blaze-builder >= 0.3.3.2 && < 0.5,@@ -318,8 +321,8 @@                        Verify.Graphics.Vty.Image    build-depends:       vty,-                       Cabal >= 1.18,-                       QuickCheck >= 2.4,+                       Cabal >= 1.20,+                       QuickCheck >= 2.7,                        random >= 1.0 && < 1.2,                        base >= 4 && < 5,                        bytestring,@@ -346,8 +349,8 @@                        Verify.Graphics.Vty.Image    build-depends:       vty,-                       Cabal >= 1.18,-                       QuickCheck >= 2.4,+                       Cabal >= 1.20,+                       QuickCheck >= 2.7,                        random >= 1.0 && < 1.2,                        base >= 4 && < 5,                        bytestring,@@ -373,8 +376,8 @@                        Verify.Graphics.Vty.Output    build-depends:       vty,-                       Cabal >= 1.18,-                       QuickCheck >= 2.4,+                       Cabal >= 1.20,+                       QuickCheck >= 2.7,                        random >= 1.0 && < 1.2,                        base >= 4 && < 5,                        bytestring,@@ -401,8 +404,8 @@                        Verify.Graphics.Vty.Output    build-depends:       vty,-                       Cabal >= 1.18,-                       QuickCheck >= 2.4,+                       Cabal >= 1.20,+                       QuickCheck >= 2.7,                        random >= 1.0 && < 1.2,                        base >= 4 && < 5,                        bytestring,@@ -433,8 +436,8 @@                        Verify.Graphics.Vty.Span    build-depends:       vty,-                       Cabal >= 1.18,-                       QuickCheck >= 2.4,+                       Cabal >= 1.20,+                       QuickCheck >= 2.7,                        random >= 1.0 && < 1.2,                        base >= 4 && < 5,                        bytestring,@@ -465,8 +468,8 @@                        Verify.Graphics.Vty.Span    build-depends:       vty,-                       Cabal >= 1.18,-                       QuickCheck >= 2.4,+                       Cabal >= 1.20,+                       QuickCheck >= 2.7,                        random >= 1.0 && < 1.2,                        base >= 4 && < 5,                        bytestring,@@ -497,8 +500,8 @@                        Verify.Graphics.Vty.Span    build-depends:       vty,-                       Cabal >= 1.18,-                       QuickCheck >= 2.4,+                       Cabal >= 1.20,+                       QuickCheck >= 2.7,                        random >= 1.0 && < 1.2,                        base >= 4 && < 5,                        bytestring,@@ -523,8 +526,8 @@   other-modules:       Verify    build-depends:       vty,-                       Cabal >= 1.18,-                       QuickCheck >= 2.4,+                       Cabal >= 1.20,+                       QuickCheck >= 2.7,                        random >= 1.0 && < 1.2,                        base >= 4 && < 5,                        bytestring,@@ -547,9 +550,9 @@   main-is:             VerifyUsingMockInput.hs    build-depends:       vty,-                       Cabal >= 1.18,+                       Cabal >= 1.20,                        data-default >= 0.5.3,-                       QuickCheck >= 2.4,+                       QuickCheck >= 2.7,                        smallcheck == 1.*,                        quickcheck-assertions >= 0.1.1,                        test-framework == 0.8.*,@@ -580,10 +583,10 @@   main-is:             VerifyConfig.hs    build-depends:       vty,-                       Cabal >= 1.18,+                       Cabal >= 1.20,                        data-default >= 0.5.3,                        HUnit,-                       QuickCheck >= 2.4,+                       QuickCheck >= 2.7,                        smallcheck == 1.*,                        quickcheck-assertions >= 0.1.1,                        test-framework == 0.8.*,