Hello community,

here is the log from the commit of package ghc-optparse-generic for 
openSUSE:Factory checked in at 2017-05-06 18:28:48
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-optparse-generic (Old)
 and      /work/SRC/openSUSE:Factory/.ghc-optparse-generic.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ghc-optparse-generic"

Sat May  6 18:28:48 2017 rev:3 rq:491481 version:1.1.5

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/ghc-optparse-generic/ghc-optparse-generic.changes    
    2017-03-03 17:51:22.403167600 +0100
+++ 
/work/SRC/openSUSE:Factory/.ghc-optparse-generic.new/ghc-optparse-generic.changes
   2017-05-06 18:28:49.678199194 +0200
@@ -1,0 +2,5 @@
+Wed Apr 19 13:32:37 UTC 2017 - [email protected]
+
+- Update to version 1.1.5 with cabal2obs.
+
+-------------------------------------------------------------------

Old:
----
  optparse-generic-1.1.4.tar.gz

New:
----
  optparse-generic-1.1.5.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ghc-optparse-generic.spec ++++++
--- /var/tmp/diff_new_pack.7VsmuQ/_old  2017-05-06 18:28:50.710053594 +0200
+++ /var/tmp/diff_new_pack.7VsmuQ/_new  2017-05-06 18:28:50.714053029 +0200
@@ -18,7 +18,7 @@
 
 %global pkg_name optparse-generic
 Name:           ghc-%{pkg_name}
-Version:        1.1.4
+Version:        1.1.5
 Release:        0
 Summary:        Auto-generate a command-line parser for your datatype
 License:        BSD-3-Clause

++++++ optparse-generic-1.1.4.tar.gz -> optparse-generic-1.1.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/optparse-generic-1.1.4/optparse-generic.cabal 
new/optparse-generic-1.1.5/optparse-generic.cabal
--- old/optparse-generic-1.1.4/optparse-generic.cabal   2016-12-20 
07:26:29.000000000 +0100
+++ new/optparse-generic-1.1.5/optparse-generic.cabal   2017-04-12 
18:32:44.000000000 +0200
@@ -1,5 +1,5 @@
 Name: optparse-generic
-Version: 1.1.4
+Version: 1.1.5
 Cabal-Version: >=1.8.0.2
 Build-Type: Simple
 License: BSD3
@@ -27,7 +27,7 @@
         system-filepath      >= 0.3.1   && < 0.5 ,
         text                               < 1.3 ,
         transformers         >= 0.2.0.0 && < 0.6 ,
-        optparse-applicative >= 0.11.0  && < 0.14,
+        optparse-applicative >= 0.12.0  && < 0.14,
         time                 >= 1.5     && < 1.7 ,
         void                               < 0.8 ,
         bytestring                         < 0.11,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/optparse-generic-1.1.4/src/Options/Generic.hs 
new/optparse-generic-1.1.5/src/Options/Generic.hs
--- old/optparse-generic-1.1.4/src/Options/Generic.hs   2016-12-20 
07:26:29.000000000 +0100
+++ new/optparse-generic-1.1.5/src/Options/Generic.hs   2017-04-12 
18:32:44.000000000 +0200
@@ -1,12 +1,16 @@
+{-# LANGUAGE ConstraintKinds            #-}
 {-# LANGUAGE CPP                        #-}
 {-# LANGUAGE DataKinds                  #-}
 {-# LANGUAGE DefaultSignatures          #-}
 {-# LANGUAGE DeriveGeneric              #-}
+{-# LANGUAGE EmptyDataDecls             #-}
 {-# LANGUAGE FlexibleInstances          #-}
 {-# LANGUAGE FlexibleContexts           #-}
 {-# LANGUAGE KindSignatures             #-}
+{-# LANGUAGE MultiParamTypeClasses      #-}
 {-# LANGUAGE RecordWildCards            #-}
 {-# LANGUAGE ScopedTypeVariables        #-}
+{-# LANGUAGE TypeFamilies               #-}
 {-# LANGUAGE TypeOperators              #-}
 
 -- | This library auto-generates command-line parsers for data types using
@@ -86,6 +90,36 @@
 -- > $ stack runghc Example.hs -- --foo 1 --bar 2.5
 -- > Example {foo = Helpful {unHelpful = 1}, bar = Helpful {unHelpful = 2.5}}
 --
+-- To avoid this, while still being able to document your fields, you may
+-- generalize the definition of your record with a parameter 'w', and use
+-- 'unwrapRecord'.
+--
+-- > {-# LANGUAGE DataKinds          #-}
+-- > {-# LANGUAGE DeriveGeneric      #-}
+-- > {-# LANGUAGE FlexibleInstances  #-}  -- One more extension.
+-- > {-# LANGUAGE OverloadedStrings  #-}
+-- > {-# LANGUAGE StandaloneDeriving #-}  -- To derive Show
+-- > {-# LANGUAGE TypeOperators      #-}
+-- >
+-- > import Options.Generic
+-- >
+-- > data Example w = Example
+-- >     { foo :: w ::: Int    <?> "Documentation for the foo flag"
+-- >     , bar :: w ::: Double <?> "Documentation for the bar flag"
+-- >     } deriving (Generic)
+-- >
+-- > instance ParseRecord (Example Wrapped)
+-- > deriving instance Show (Example Unwrapped)
+-- >
+-- > main = do
+-- >     x <- unwrapRecord "Test program"
+-- >     print (x :: Example Unwrapped)
+--
+-- @Example Unwrapped@ is equivalent to a record type with simple fields:
+--
+-- > $ stack runghc Example.hs -- --foo 1 --bar 2.5
+-- > Example {foo = 1, bar = 2.5}
+--
 -- For the following examples I encourage you to test what @--help@ output they
 -- generate.
 --
@@ -208,6 +242,8 @@
     -- * Parsers
       getRecord
     , getRecordPure
+    , unwrapRecord
+    , unwrapRecordPure
     , ParseRecord(..)
     , ParseFields(..)
     , ParseField(..)
@@ -216,9 +252,14 @@
     , Modifiers(..)
     , parseRecordWithModifiers
     , defaultModifiers
+    , lispCaseModifiers
 
     -- * Help
     , type (<?>)(..)
+    , type (:::)
+    , Wrapped
+    , Unwrapped
+    , Unwrappable
 
     -- * Re-exports
     , Generic
@@ -233,7 +274,7 @@
 
 import Control.Applicative
 import Control.Monad.IO.Class (MonadIO(..))
-import Data.Char (toLower, toUpper)
+import Data.Char (isUpper, toLower, toUpper)
 import Data.Monoid
 import Data.List.NonEmpty (NonEmpty((:|)))
 import Data.Proxy
@@ -613,6 +654,22 @@
 defaultModifiers :: Modifiers
 defaultModifiers = Modifiers id (map toLower)
 
+-- | Convert field and constructor names from @CamelCase@ to @lisp-case@.
+--
+-- Leading underscores are dropped, allowing one to use option names
+-- which are Haskell keywords or otherwise conflicting identifiers.
+--
+-- > BuildCommand -> build-command
+-- > someFlag -> --some-flag
+-- > _type -> --type
+-- > _splitAt -> --split-at
+lispCaseModifiers :: Modifiers
+lispCaseModifiers = Modifiers lispCase lispCase
+  where
+    lispCase = dropWhile (== '-') . (>>= lower) . dropWhile (== '_')
+    lower c | isUpper c = ['-', toLower c]
+            | otherwise = [c]
+
 class GenericParseRecord f where
     genericParseRecord :: Modifiers -> Parser (f p)
 
@@ -783,14 +840,9 @@
     => Text
     -- ^ Program description
     -> io a
-getRecord desc = liftIO (Options.customExecParser prefs info)
+getRecord desc = liftIO (Options.customExecParser defaultParserPrefs info)
   where
-    prefs = Options.defaultPrefs
-        { Options.prefMultiSuffix = "..."
-        }
-
     header = Options.header (Data.Text.unpack desc)
-
     info = Options.info parseRecord header
 
 {-| Pure version of `getRecord`
@@ -809,18 +861,71 @@
     -- ^ Command-line arguments
     -> Maybe a
 getRecordPure args = do
-    let prefs = Options.ParserPrefs
-            { prefMultiSuffix     = "..."
-            , prefDisambiguate    = False
-            , prefShowHelpOnError = False
-            , prefBacktrack       = True
-            , prefColumns         = 80
-#if MIN_VERSION_optparse_applicative(0,13,0)
-            , prefShowHelpOnEmpty = False
-#else
-#endif
-            }
     let header = Options.header ""
     let info   = Options.info parseRecord header
     let args'  = map Data.Text.unpack args
-    Options.getParseResult (Options.execParserPure prefs info args')
+    Options.getParseResult (Options.execParserPure defaultParserPrefs info 
args')
+
+-- | @optparse-generic@'s flavor of options.
+defaultParserPrefs :: Options.ParserPrefs
+defaultParserPrefs = Options.defaultPrefs
+  { Options.prefMultiSuffix = "..."
+  }
+
+-- | A type family to extract fields wrapped using '(<?>)'
+type family (:::) wrap wrapped
+type instance Wrapped ::: wrapped = wrapped
+type instance Unwrapped ::: (field <?> helper) = field
+
+infixr 0 :::
+
+-- | Flag to keep fields wrapped
+data Wrapped
+
+-- | Flag to unwrap fields annotated using '(<?>)'
+data Unwrapped
+
+-- | Constraint for types whose fields can be unwrapped
+type Unwrappable f = (Generic (f Wrapped), Generic (f Unwrapped), 
GenericUnwrappable (Rep (f Wrapped)) (Rep (f Unwrapped)))
+
+class GenericUnwrappable f f' where
+  genericUnwrap :: f p -> f' p
+
+instance GenericUnwrappable U1 U1 where
+  genericUnwrap = id
+
+instance GenericUnwrappable f f' => GenericUnwrappable (M1 i c f) (M1 i c f') 
where
+  genericUnwrap = M1 . genericUnwrap . unM1
+
+instance (GenericUnwrappable f f', GenericUnwrappable g g') => 
GenericUnwrappable (f :+: g) (f' :+: g') where
+  genericUnwrap (L1 f) = L1 (genericUnwrap f)
+  genericUnwrap (R1 g) = R1 (genericUnwrap g)
+
+instance (GenericUnwrappable f f', GenericUnwrappable g g') => 
GenericUnwrappable (f :*: g) (f' :*: g') where
+  genericUnwrap (f :*: g) = genericUnwrap f :*: genericUnwrap g
+
+instance GenericUnwrappable (K1 i c) (K1 i c) where
+  genericUnwrap = id
+
+instance GenericUnwrappable (K1 i (field <?> helper)) (K1 i field) where
+  genericUnwrap (K1 c) = K1 (unHelpful c)
+
+-- | Unwrap the fields of a constructor
+unwrap :: forall f . Unwrappable f => f Wrapped -> f Unwrapped
+unwrap = to . genericUnwrap . from
+
+-- | Marshal any value that implements 'ParseRecord' from the command line
+-- and unwrap its fields
+unwrapRecord
+    :: (Functor io, MonadIO io, ParseRecord (f Wrapped), Unwrappable f)
+    => Text
+    -> io (f Unwrapped)
+unwrapRecord = fmap unwrap . getRecord
+
+-- | Pure version of `unwrapRecord`
+unwrapRecordPure
+    :: (ParseRecord (f Wrapped), Unwrappable f)
+    => [Text]
+    -- ^ Command-line arguments
+    -> Maybe (f Unwrapped)
+unwrapRecordPure = fmap unwrap . getRecordPure


Reply via email to