Hello community,
here is the log from the commit of package ghc-language-puppet for
openSUSE:Factory checked in at 2017-08-31 20:57:04
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-language-puppet (Old)
and /work/SRC/openSUSE:Factory/.ghc-language-puppet.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-language-puppet"
Thu Aug 31 20:57:04 2017 rev:3 rq:513417 version:1.3.8.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-language-puppet/ghc-language-puppet.changes
2017-05-18 20:50:45.806571635 +0200
+++
/work/SRC/openSUSE:Factory/.ghc-language-puppet.new/ghc-language-puppet.changes
2017-08-31 20:57:06.050043645 +0200
@@ -1,0 +2,5 @@
+Thu Jul 27 14:08:07 UTC 2017 - [email protected]
+
+- Update to version 1.3.8.1.
+
+-------------------------------------------------------------------
Old:
----
language-puppet-1.3.7.tar.gz
New:
----
language-puppet-1.3.8.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ghc-language-puppet.spec ++++++
--- /var/tmp/diff_new_pack.Op7lNK/_old 2017-08-31 20:57:06.817935753 +0200
+++ /var/tmp/diff_new_pack.Op7lNK/_new 2017-08-31 20:57:06.821935192 +0200
@@ -19,7 +19,7 @@
%global pkg_name language-puppet
%bcond_with tests
Name: ghc-%{pkg_name}
-Version: 1.3.7
+Version: 1.3.8.1
Release: 0
Summary: Tools to parse and evaluate the Puppet DSL
License: BSD-3-Clause
++++++ language-puppet-1.3.7.tar.gz -> language-puppet-1.3.8.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/CHANGELOG.markdown
new/language-puppet-1.3.8.1/CHANGELOG.markdown
--- old/language-puppet-1.3.7/CHANGELOG.markdown 2017-03-14
18:12:30.000000000 +0100
+++ new/language-puppet-1.3.8.1/CHANGELOG.markdown 2017-07-21
12:04:15.000000000 +0200
@@ -1,3 +1,13 @@
+# v1.3.8.1 (2017/07/21)
+
+* Fix haddocks error (#208)
+
+# v1.3.8 (2017/07/20)
+
+* Add support for calling Functions in Strings (#199)
+* Add $facts hash for Puppet 4 (#198)
+* Initial support for datatype syntax (#206)
+
# v1.3.7 (2017/03/14)
* Add puppet `sprintf` function
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/Puppet/Daemon.hs
new/language-puppet-1.3.8.1/Puppet/Daemon.hs
--- old/language-puppet-1.3.7/Puppet/Daemon.hs 2017-01-12 07:15:51.000000000
+0100
+++ new/language-puppet-1.3.8.1/Puppet/Daemon.hs 2017-06-22
13:15:37.000000000 +0200
@@ -28,6 +28,7 @@
import System.Log.Handler (setFormatter)
import qualified System.Log.Handler.Simple as LOG (streamHandler)
import qualified System.Log.Logger as LOG
+import qualified Text.Megaparsec as P
import Erb.Compute
import Hiera.Server
@@ -184,7 +185,7 @@
cnt <- T.readFile fname
o <- case runPParser fname cnt of
Right r -> traceEventIO ("Stopped parsing " ++ fname) >> return
(S.Right r)
- Left rr -> traceEventIO ("Stopped parsing " ++ fname ++ " (failure: "
++ show rr ++ ")") >> return (S.Left (show rr))
+ Left rr -> traceEventIO ("Stopped parsing " ++ fname ++ " (failure: "
++ show rr ++ ")") >> return (S.Left (P.parseErrorPretty rr))
traceEventIO ("STOP parsing " ++ fname)
return o
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/language-puppet-1.3.7/Puppet/Interpreter/PrettyPrinter.hs
new/language-puppet-1.3.8.1/Puppet/Interpreter/PrettyPrinter.hs
--- old/language-puppet-1.3.7/Puppet/Interpreter/PrettyPrinter.hs
2017-01-12 07:15:51.000000000 +0100
+++ new/language-puppet-1.3.8.1/Puppet/Interpreter/PrettyPrinter.hs
2017-06-22 13:04:21.000000000 +0200
@@ -50,6 +50,7 @@
pretty (PResourceReference t n) = capitalize t <> brackets (text (T.unpack
n))
pretty (PArray v) = list (map pretty (V.toList v))
pretty (PHash g) = containerComma g
+ pretty (PType dt) = pretty dt
instance Pretty TopLevelType where
pretty TopNode = dullyellow (text "node")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/Puppet/Interpreter/Resolve.hs
new/language-puppet-1.3.8.1/Puppet/Interpreter/Resolve.hs
--- old/language-puppet-1.3.7/Puppet/Interpreter/Resolve.hs 2017-03-14
18:12:16.000000000 +0100
+++ new/language-puppet-1.3.8.1/Puppet/Interpreter/Resolve.hs 2017-06-22
13:11:40.000000000 +0200
@@ -1,4 +1,5 @@
{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE RankNTypes #-}
-- | This module is all about converting and resolving foreign data into
-- the fully exploitable corresponding data type. The main use case is the
-- conversion of 'Expression' to 'PValue'.
@@ -26,7 +27,8 @@
hfSetvars,
hfRestorevars,
toNumbers,
- fixResourceName
+ fixResourceName,
+ datatypeMatch
) where
import Control.Lens
@@ -45,7 +47,8 @@
import qualified Data.Foldable as F
import qualified Data.HashMap.Strict as HM
import qualified Data.HashSet as HS
-import Data.Maybe (fromMaybe, mapMaybe)
+import Data.List.NonEmpty (NonEmpty(..))
+import Data.Maybe (fromMaybe, mapMaybe,
catMaybes)
import qualified Data.Maybe.Strict as S
import Data.Scientific
import qualified Data.Text as T
@@ -285,6 +288,9 @@
Left (_,rr) -> throwPosError ("Could not match" <+> pretty
v <+> ":" <+> string rr)
Right Nothing -> checkCond xs
Right (Just _) -> resolveExpression ce
+ checkCond ((SelectorType dt :!: ce) : xs) = if datatypeMatch dt rese
+ then resolveExpression ce
+ else checkCond xs
checkCond ((SelectorValue uv :!: ce) : xs) = do
rv <- resolveValue uv
if puppetEquality rese rv
@@ -712,3 +718,40 @@
PHash hh -> return $ PHash $ HM.fromList $ map Prelude.fst
$ filter Prelude.snd $ Prelude.zip (HM.toList hh) res
x -> throwPosError ("Can't iterate on this data type:" <+>
pretty x)
x -> throwPosError ("This type of function is not supported yet by
language-puppet!" <+> pretty x)
+
+-- | Checks that a value matches a puppet datatype
+datatypeMatch :: DataType -> PValue -> Bool
+datatypeMatch dt v
+ = case dt of
+ DTType -> has _PType v
+ DTUndef -> v == PUndef
+ NotUndef -> v /= PUndef
+ DTString mmin mmax -> boundedBy _PString T.length mmin mmax
+ DTInteger mmin mmax -> boundedBy (_PNumber . to toBoundedInteger .
_Just) id mmin mmax
+ DTFloat mmin mmax -> boundedBy _PNumber toRealFloat mmin mmax
+ DTBoolean -> has _PBoolean v
+ DTArray sdt mi mmx -> container (_PArray . to V.toList) (datatypeMatch
sdt) mi mmx
+ DTHash kt sdt mi mmx -> container (_PHash . to itoList) (\(k,a)
->
datatypeMatch kt (PString k) && datatypeMatch sdt a) mi mmx
+ DTScalar -> datatypeMatch (DTVariant (DTInteger Nothing
Nothing :| [DTString Nothing Nothing, DTBoolean])) v
+ DTData -> datatypeMatch (DTVariant (DTScalar :| [DTArray
DTData 0 Nothing, DTHash DTScalar DTData 0 Nothing])) v
+ DTOptional sdt -> datatypeMatch (DTVariant (DTUndef :| [sdt])) v
+ DTVariant sdts -> any (`datatypeMatch` v) sdts
+ DTEnum lst -> maybe False (`elem` lst) (v ^? _PString)
+ DTAny -> True
+ DTCollection -> datatypeMatch (DTVariant (DTArray DTData 0
Nothing :| [DTHash DTScalar DTData 0 Nothing])) v
+ DTPattern patterns -> maybe False (\str -> any (checkPattern
(T.encodeUtf8 str)) patterns) (v ^? _PString)
+ where
+ checkPattern str (CompRegex _ ptrn)
+ = case execute' ptrn str of
+ Right (Just _) -> True
+ _ -> False
+ container :: Fold PValue [a] -> (a -> Bool) -> Int -> Maybe Int -> Bool
+ container f c mi mmx =
+ let lst = v ^. f
+ ln = length lst
+ in ln >= mi && (fmap (ln <=) mmx /= Just False) && all c lst
+ boundedBy :: Ord b => Fold PValue a -> (a -> b) -> Maybe b -> Maybe b ->
Bool
+ boundedBy prm f mmin mmax
+ = fromMaybe False $ do
+ vr <- f <$> v ^? prm
+ return $ and $ catMaybes [fmap (vr >=) mmin, fmap (vr <=) mmax]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/Puppet/Interpreter/Types.hs
new/language-puppet-1.3.8.1/Puppet/Interpreter/Types.hs
--- old/language-puppet-1.3.7/Puppet/Interpreter/Types.hs 2017-03-14
18:12:16.000000000 +0100
+++ new/language-puppet-1.3.8.1/Puppet/Interpreter/Types.hs 2017-06-22
10:15:07.000000000 +0200
@@ -41,7 +41,17 @@
, HasInterpreterState(..)
, InterpreterState(InterpreterState)
-- * Sum types
+ -- ** PValue
, PValue(..)
+ , _PType
+ , _PBoolean
+ , _PString
+ , _PResourceReference
+ , _PArray
+ , _PHash
+ , _PNumber
+ , _PUndef
+ -- ** Misc
, CurContainerDesc(..)
, ResourceCollectorType(..)
, RSearchExpression(..)
@@ -148,6 +158,7 @@
| PArray !(V.Vector PValue)
| PHash !(Container PValue)
| PNumber !Scientific
+ | PType DataType
deriving (Eq, Show)
instance IsString PValue where
@@ -270,7 +281,7 @@
, _readerGetStatement :: TopLevelType -> Text -> m (S.Either
PrettyError Statement)
, _readerGetTemplate :: Either Text T.Text -> InterpreterState ->
InterpreterReader m -> m (S.Either PrettyError T.Text)
, _readerPdbApi :: PuppetDBAPI m
- , _readerExternalFunc :: Container ([PValue] -> InterpreterMonad PValue)
+ , _readerExternalFunc :: Container ([PValue] -> InterpreterMonad
PValue) -- ^ external func such as stdlib or puppetlabs
, _readerNodename :: Text
, _readerHieraQuery :: HieraQueryFunc m
, _readerIoMethods :: IoMethods m
@@ -485,7 +496,7 @@
makeClassy ''NodeInfo
makeClassy ''WireCatalog
makeClassy ''FactInfo
-
+makePrisms ''PValue
class Monad m => MonadThrowPos m where
throwPosError :: Doc -> m a
@@ -531,6 +542,7 @@
parseJSON (Object o) = fmap PHash (TR.mapM parseJSON o)
instance ToJSON PValue where
+ toJSON (PType t) = toJSON t
toJSON (PBoolean b) = Bool b
toJSON PUndef = Null
toJSON (PString s) = String s
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/Puppet/Interpreter/Utils.hs
new/language-puppet-1.3.8.1/Puppet/Interpreter/Utils.hs
--- old/language-puppet-1.3.7/Puppet/Interpreter/Utils.hs 2017-01-12
07:15:51.000000000 +0100
+++ new/language-puppet-1.3.8.1/Puppet/Interpreter/Utils.hs 2017-06-14
10:52:51.000000000 +0200
@@ -31,7 +31,10 @@
initialState facts settings = InterpreterState baseVars initialclass mempty
[ContRoot] dummyppos mempty [] []
where
callervars = HM.fromList [("caller_module_name", PString "::" :!:
dummyppos :!: ContRoot), ("module_name", PString "::" :!: dummyppos :!:
ContRoot)]
- factvars = fmap (\x -> x :!: initialPPos "facts" :!: ContRoot) facts
+ factvars =
+ -- add the `facts` key:
https://docs.puppet.com/puppet/4.10/lang_facts_and_builtin_vars.html#accessing-facts-from-puppet-code
+ let facts' = HM.insert "facts" (PHash facts) facts
+ in fmap (\x -> x :!: initialPPos "facts" :!: ContRoot) facts'
settingvars = fmap (\x -> PString x :!: initialPPos "settings" :!:
ContClass "settings") settings
baseVars = HM.fromList [ ("::", ScopeInformation (factvars `mappend`
callervars) mempty mempty (CurContainer ContRoot mempty) mempty S.Nothing)
, ("settings", ScopeInformation settingvars
mempty mempty (CurContainer (ContClass "settings") mempty) mempty S.Nothing)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/Puppet/Interpreter.hs
new/language-puppet-1.3.8.1/Puppet/Interpreter.hs
--- old/language-puppet-1.3.7/Puppet/Interpreter.hs 2017-03-14
18:12:16.000000000 +0100
+++ new/language-puppet-1.3.8.1/Puppet/Interpreter.hs 2017-06-22
16:21:07.000000000 +0200
@@ -210,7 +210,7 @@
evaluateNode (NodeDecl _ sx inheritnode p) = do
curPos .= p
pushScope ContRoot
- unless (S.isNothing inheritnode) $ throwPosError "Node inheritance
is not handled yet, and will probably never be"
+ unless (S.isNothing inheritnode) $ throwPosError "Node inheritance
is not handled. It is deprecated since puppet v4"
mapM evaluateStatement sx >>= finalize . concat
noderes <- evaluateNode nd >>= finalStep . (++ (mainstage : topres))
@@ -557,11 +557,11 @@
--
-- It is able to fill unset parameters with values from Hiera (for classes
-- only) or default values.
-loadParameters :: Foldable f => Container PValue -> f (Pair Text (S.Maybe
Expression)) -> PPosition -> S.Maybe T.Text -> InterpreterMonad ()
+loadParameters :: Foldable f => Container PValue -> f (Pair (Pair Text
(S.Maybe DataType)) (S.Maybe Expression)) -> PPosition -> S.Maybe T.Text ->
InterpreterMonad ()
loadParameters params classParams defaultPos wHiera = do
p <- use curPos
curPos .= defaultPos
- let classParamSet = HS.fromList (classParams ^.. folded . _1)
+ let classParamSet = HS.fromList (classParams ^.. folded . _1 . _1)
spuriousParams = ikeys params `HS.difference` classParamSet
mclassdesc = S.maybe mempty ((\x -> mempty <+> "when
including class" <+> x) . ttext) wHiera
@@ -588,10 +588,12 @@
-- try to set a value to all parameters
-- The order of evaluation is defined / hiera / default
- unsetParams <- fmap concat $ for (toList classParams) $ \(k :!: defValue)
-> do
+ unsetParams <- fmap concat $ for (toList classParams) $ \(k :!: mtype :!:
defValue) -> do
ev <- runExceptT (checkDef k <|> checkHiera k <|> checkDefault
defValue)
case ev of
- Right v -> loadVariable k v >> return []
+ Right v -> do
+ forM_ mtype $ \dt -> unless (datatypeMatch dt v) (throwPosError
("Expected type" <+> pretty dt <+> "for parameter" <+> pretty k <+> "but its
value was:" <+> pretty v))
+ loadVariable k v >> return []
Left (Max True) -> loadVariable k PUndef >> return []
Left (Max False) -> return [k]
curPos .= p
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/Puppet/Lens.hs
new/language-puppet-1.3.8.1/Puppet/Lens.hs
--- old/language-puppet-1.3.7/Puppet/Lens.hs 2015-12-10 19:50:05.000000000
+0100
+++ new/language-puppet-1.3.8.1/Puppet/Lens.hs 2017-06-22 10:16:04.000000000
+0200
@@ -3,7 +3,7 @@
( -- * Pure resolution prisms
_PResolveExpression
, _PResolveValue
- -- * Prisms for PValues
+ -- * Prisms for PValues (reexport from "Puppet.Interpreter.Types")
, _PHash
, _PBoolean
, _PString
@@ -67,8 +67,6 @@
import Data.Tuple.Strict hiding (uncurry)
import Control.Exception (SomeException, toException, fromException)
--- Prisms
-makePrisms ''PValue
--makePrisms ''Statement
makePrisms ''Expression
@@ -152,6 +150,7 @@
toU (PResourceReference t n) = UResourceReference t (Terminal (UString
n))
toU (PArray r) = UArray (fmap (Terminal . toU) r)
toU (PHash h) = UHash (V.fromList $ map (\(k,v) -> (Terminal (UString
k) :!: Terminal (toU v))) $ HM.toList h)
+ toU (PType _) = error "TODO, _PResolveValue PType undefined"
-- | Extracts the statements from 'ClassDeclaration', 'DefineDeclaration',
-- 'Node' and the spurious statements of 'TopContainer'.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/Puppet/Parser/PrettyPrinter.hs
new/language-puppet-1.3.8.1/Puppet/Parser/PrettyPrinter.hs
--- old/language-puppet-1.3.7/Puppet/Parser/PrettyPrinter.hs 2015-12-10
19:50:05.000000000 +0100
+++ new/language-puppet-1.3.8.1/Puppet/Parser/PrettyPrinter.hs 2017-06-22
13:23:58.000000000 +0200
@@ -34,6 +34,32 @@
escapeChar x = T.singleton x
{-# INLINE stringEscape #-}
+instance Pretty DataType where
+ pretty t = case t of
+ DTType -> "Type"
+ DTString ma mb -> bounded "String" ma mb
+ DTInteger ma mb -> bounded "Integer" ma mb
+ DTFloat ma mb -> bounded "Float" ma mb
+ DTBoolean -> "Boolean"
+ DTArray dt mi mmx -> "Array" <> list (pretty dt : pretty mi :
maybe [] (pure . pretty) mmx)
+ DTHash kt dt mi mmx -> "Hash" <> list (pretty kt : pretty dt :
pretty mi : maybe [] (pure . pretty) mmx)
+ DTUndef -> "Undef"
+ DTScalar -> "Scalar"
+ DTData -> "Data"
+ DTOptional o -> "Optional" <> brackets (pretty o)
+ NotUndef -> "NotUndef"
+ DTVariant vs -> "Variant" <> list (foldMap (pure .
pretty) vs)
+ DTPattern vs -> "Pattern" <> list (foldMap (pure .
pretty) vs)
+ DTEnum tx -> "Enum" <> list (foldMap (pure . text .
T.unpack) tx)
+ DTAny -> "Any"
+ DTCollection -> "Collection"
+ where
+ bounded :: (Pretty a, Pretty b) => Doc -> Maybe a -> Maybe b -> Doc
+ bounded s ma mb = s <> case (ma, mb) of
+ (Just a, Nothing) -> list [pretty a]
+ (Just a, Just b) -> list [pretty a, pretty b]
+ _ -> mempty
+
instance Pretty Expression where
pretty (Equal a b) = parens (pretty a <+> text "==" <+> pretty
b)
pretty (Different a b) = parens (pretty a <+> text "!=" <+> pretty
b)
@@ -66,6 +92,7 @@
pretty LambReduce = bold $ red $ text "reduce"
pretty LambFilter = bold $ red $ text "filter"
pretty LambSlice = bold $ red $ text "slice"
+ pretty LambLookup = bold $ red $ text "lookup"
instance Pretty LambdaParameters where
pretty b = magenta (char '|') <+> vars <+> magenta (char '|')
@@ -96,11 +123,14 @@
pretty (UResourceReference t n) = capitalize t <> brackets (pretty n)
pretty (UArray v) = list (map pretty (V.toList v))
pretty (UHash g) = hashComma g
- pretty (URegexp (CompRegex r _)) = char '/' <> text (T.unpack r) <> char
'/'
+ pretty (URegexp r) = pretty r
pretty (UVariableReference v) = dullblue (char '$' <> text (T.unpack v))
pretty (UFunctionCall f args) = showFunc f args
pretty (UHOLambdaCall c) = pretty c
+instance Pretty CompRegex where
+ pretty (CompRegex r _) = char '/' <> text (T.unpack r) <> char '/'
+
instance Pretty HOLambdaCall where
pretty (HOLambdaCall hf me bp stts mee) = pretty hf <> mme <+> pretty bp
<+> nest 2 (char '{' <$> ppStatements stts <> mmee) <$> char '}'
where
@@ -112,6 +142,7 @@
S.Nothing -> mempty
instance Pretty SelectorCase where
pretty SelectorDefault = dullmagenta (text "default")
+ pretty (SelectorType t) = pretty t
pretty (SelectorValue v) = pretty v
instance Pretty LinkType where
@@ -138,15 +169,15 @@
maxlen = maximum (fmap (\(AttributeDecl k _ _) -> T.length k) vx)
prettyDecl (AttributeDecl k op v) = dullblue (fill maxlen (ttext k))
<+> pretty op <+> pretty v
-showArgs :: V.Vector (Pair T.Text (S.Maybe Expression)) -> Doc
+showArgs :: V.Vector (Pair (Pair T.Text (S.Maybe DataType)) (S.Maybe
Expression)) -> Doc
showArgs vec = tupled (map ra lst)
where
lst = V.toList vec
- maxlen = maximum (map (T.length . S.fst) lst)
- ra (argname :!: rval) = dullblue (char '$' <> fill maxlen (text
(T.unpack argname)))
- <> case rval of
- S.Nothing -> empty
- S.Just v -> empty <+> char '=' <+>
pretty v
+ maxlen = maximum (map (T.length . S.fst . S.fst) lst)
+ ra (argname :!: mtype :!: rval)
+ = dullblue (char '$' <> foldMap (\t -> pretty t <+> empty) mtype
+ <> fill maxlen (text (T.unpack argname)))
+ <> foldMap (\v -> empty <+> char '=' <+> pretty
v) rval
showFunc :: T.Text -> V.Vector Expression -> Doc
showFunc funcname args = bold (red (text (T.unpack funcname))) <> parensList
args
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/Puppet/Parser/Types.hs
new/language-puppet-1.3.8.1/Puppet/Parser/Types.hs
--- old/language-puppet-1.3.7/Puppet/Parser/Types.hs 2017-01-12
07:15:51.000000000 +0100
+++ new/language-puppet-1.3.8.1/Puppet/Parser/Types.hs 2017-07-21
11:58:54.000000000 +0200
@@ -30,6 +30,8 @@
Virtuality(..),
NodeDesc(..),
LinkType(..),
+ -- ** Datatypes
+ DataType(..),
-- ** Search Expressions
SearchExpression(..),
-- ** Statements
@@ -52,6 +54,7 @@
import Control.Lens
import Data.Aeson
+import Data.Aeson.TH (deriveToJSON)
import Data.Char (toUpper)
import Data.Hashable
import qualified Data.Maybe.Strict as S
@@ -61,6 +64,7 @@
import qualified Data.Text as T
import Data.Tuple.Strict
import qualified Data.Vector as V
+import Data.List.NonEmpty (NonEmpty)
import GHC.Exts
import GHC.Generics
@@ -110,6 +114,7 @@
| LambReduce
| LambFilter
| LambSlice
+ | LambLookup
deriving (Eq, Show)
-- | Lambda block parameters:
@@ -147,6 +152,10 @@
show (CompRegex t _) = show t
instance Eq CompRegex where
(CompRegex a _) == (CompRegex b _) = a == b
+instance FromJSON CompRegex where
+ parseJSON = fail "Can't deserialize a regular expression"
+instance ToJSON CompRegex where
+ toJSON (CompRegex t _) = toJSON t
-- | An unresolved value, typically the parser's output.
data UnresolvedValue
@@ -176,6 +185,7 @@
data SelectorCase
= SelectorValue !UnresolvedValue
+ | SelectorType !DataType
| SelectorDefault
deriving (Eq, Show)
@@ -207,6 +217,29 @@
| Terminal !UnresolvedValue -- ^ Terminal object contains no expression
deriving (Eq, Show)
+data DataType
+ = DTType
+ | DTString (Maybe Int) (Maybe Int)
+ | DTInteger (Maybe Int) (Maybe Int)
+ | DTFloat (Maybe Double) (Maybe Double)
+ | DTBoolean
+ | DTArray DataType Int (Maybe Int)
+ | DTHash DataType DataType Int (Maybe Int)
+ | DTUndef
+ | DTScalar
+ | DTData
+ | DTOptional DataType
+ | NotUndef
+ | DTVariant (NonEmpty DataType)
+ | DTPattern (NonEmpty CompRegex)
+ | DTEnum (NonEmpty Text)
+ | DTAny
+ | DTCollection
+ -- Tuple (NonEmpty DataType) Integer Integer
+ -- DTDefault
+ -- Struct TODO
+ deriving (Eq, Show)
+
instance IsList Expression where
type Item Expression = Expression
fromList = Terminal . fromList
@@ -299,8 +332,8 @@
-- (interpreted as "if first cond is true, choose first statements, else take
the next pair, check the condition ...")
data ConditionalDecl = ConditionalDecl !(V.Vector (Pair Expression (V.Vector
Statement))) !PPosition deriving (Eq, Show)
-data ClassDecl = ClassDecl !Text !(V.Vector (Pair Text (S.Maybe Expression)))
!(S.Maybe Text) !(V.Vector Statement) !PPosition deriving (Eq, Show)
-data DefineDecl = DefineDecl !Text !(V.Vector (Pair Text (S.Maybe
Expression))) !(V.Vector Statement) !PPosition deriving (Eq, Show)
+data ClassDecl = ClassDecl !Text !(V.Vector (Pair (Pair Text (S.Maybe
DataType)) (S.Maybe Expression))) !(S.Maybe Text) !(V.Vector Statement)
!PPosition deriving (Eq, Show)
+data DefineDecl = DefineDecl !Text !(V.Vector (Pair (Pair Text (S.Maybe
DataType)) (S.Maybe Expression))) !(V.Vector Statement) !PPosition deriving
(Eq, Show)
-- | A node is a collection of statements + maybe an inherit node
data NodeDecl = NodeDecl !NodeDesc !(V.Vector Statement) !(S.Maybe NodeDesc)
!PPosition deriving (Eq, Show)
@@ -338,3 +371,5 @@
deriving (Eq, Show)
makeClassy ''HOLambdaCall
+$(deriveToJSON defaultOptions ''DataType)
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/Puppet/Parser.hs
new/language-puppet-1.3.8.1/Puppet/Parser.hs
--- old/language-puppet-1.3.7/Puppet/Parser.hs 2017-01-12 07:15:51.000000000
+0100
+++ new/language-puppet-1.3.8.1/Puppet/Parser.hs 2017-06-22
13:21:05.000000000 +0200
@@ -6,6 +6,7 @@
-- * Parsers
, puppetParser
, expression
+ , datatype
) where
import Control.Applicative
@@ -13,7 +14,10 @@
import Control.Monad
import Data.Char
import qualified Data.Foldable as F
+import Data.List.NonEmpty (NonEmpty(..))
+import qualified Data.List.NonEmpty as NE
import qualified Data.Maybe.Strict as S
+import Data.Maybe (fromMaybe)
import Data.Scientific
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
@@ -86,16 +90,19 @@
symbolic '?'
return $ maybe trm ($ trm) lookups
let cas = do
- c <- (SelectorDefault <$ symbol "default") -- default case
- <|> fmap SelectorValue (fmap UVariableReference
variableReference
- <|> fmap UBoolean puppetBool
- <|> (UUndef <$ symbol "undef")
- <|> literalValue
- <|> fmap UInterpolable
interpolableString
- <|> (URegexp <$> termRegexp))
- void $ symbol "=>"
- e <- expression
- return (c :!: e)
+ c <- (SelectorDefault <$ symbol "default") -- default case
+ <|> fmap SelectorType (try datatype)
+ <|> fmap SelectorValue
+ ( fmap UVariableReference variableReference
+ <|> fmap UBoolean puppetBool
+ <|> (UUndef <$ symbol "undef")
+ <|> literalValue
+ <|> fmap UInterpolable interpolableString
+ <|> (URegexp <$> termRegexp)
+ )
+ void $ symbol "=>"
+ e <- expression
+ return (c :!: e)
cases <- braces (sepComma1 cas)
return (ConditionalValue selectedExpression (V.fromList cases))
@@ -198,17 +205,12 @@
return v
rvariable = Terminal . UVariableReference <$> rvariableName
simpleIndexing = Lookup <$> rvariable <*> between (symbolic '[')
(symbolic ']') expression
- interpolableVariableReference = try $ do
+ interpolableVariableReference = do
void (char '$')
- lookAhead anyChar >>= \c -> case c of
- '{' -> between (symbolic '{') (char '}') ( try
simpleIndexing
- <|> rvariable
- )
- -- This is not as robust as the "qualif"
- -- implementation, but considerably shorter.
- --
- -- This needs refactoring.
- _ -> rvariable
+ let fenced = try (simpleIndexing <* char '}')
+ <|> try (rvariable <* char '}')
+ <|> (expression <* char '}')
+ (symbolic '{' *> fenced) <|> try rvariable <|> pure (Terminal
(UString (T.singleton '$')))
regexp :: Parser T.Text
regexp = do
@@ -377,15 +379,17 @@
pe <- getPosition
return (DefineDecl name params st (p :!: pe))
-puppetClassParameters :: Parser (V.Vector (Pair T.Text (S.Maybe Expression)))
+puppetClassParameters :: Parser (V.Vector (Pair (Pair T.Text (S.Maybe
DataType)) (S.Maybe Expression)))
puppetClassParameters = V.fromList <$> parens (sepComma var)
where
toStrictMaybe (Just x) = S.Just x
toStrictMaybe Nothing = S.Nothing
- var :: Parser (Pair T.Text (S.Maybe Expression))
- var = (:!:)
- <$> variableReference
- <*> (toStrictMaybe <$> optional (symbolic '=' *> expression))
+ var :: Parser (Pair (Pair T.Text (S.Maybe DataType)) (S.Maybe
Expression))
+ var = do
+ tp <- toStrictMaybe <$> optional datatype
+ n <- variableReference
+ df <- toStrictMaybe <$> optional (symbolic '=' *> expression)
+ return (n :!: tp :!: df)
puppetIfStyleCondition :: Parser (Pair Expression (V.Vector Statement))
puppetIfStyleCondition = (:!:) <$> expression <*> braces statementList
@@ -631,6 +635,67 @@
<|> (pure . MainFunctionDeclaration <$> mainFuncDecl)
<?> "Statement"
+datatype :: Parser DataType
+datatype = dtString
+ <|> dtInteger
+ <|> dtFloat
+ <|> dtNumeric
+ <|> (DTBoolean <$ reserved "Boolean")
+ <|> (DTScalar <$ reserved "Scalar")
+ <|> (DTData <$ reserved "Data")
+ <|> (DTAny <$ reserved "Any")
+ <|> (DTCollection <$ reserved "Collection")
+ <|> dtArray
+ <|> dtHash
+ <|> (DTUndef <$ reserved "Undef")
+ <|> (reserved "Optional" *> (DTOptional <$> brackets datatype))
+ <|> (NotUndef <$ reserved "NotUndef")
+ <|> (reserved "Variant" *> (DTVariant . NE.fromList <$> brackets
(datatype `sepBy1` symbolic ',')))
+ <|> (reserved "Pattern" *> (DTPattern . NE.fromList <$> brackets
(termRegexp `sepBy1` symbolic ',')))
+ <|> (reserved "Enum" *> (DTEnum . NE.fromList <$> brackets
((stringLiteral' <|> bareword) `sepBy1` symbolic ',')))
+ <?> "DataType"
+ where
+ integer = integerOrDouble >>= either (return . fromIntegral) (const (fail
"Integer value expected"))
+ float = either fromIntegral id <$> integerOrDouble
+ dtArgs str def parseArgs = do
+ void $ reserved str
+ fromMaybe def <$> optional (brackets parseArgs)
+ dtbounded s constructor parser = dtArgs s (constructor Nothing Nothing) $
do
+ lst <- parser `sepBy` symbolic ','
+ case lst of
+ [minlen] -> return $ constructor (Just minlen) Nothing
+ [minlen,maxlen] -> return $ constructor (Just minlen) (Just maxlen)
+ _ -> fail ("Too many arguments to datatype " ++ s)
+ dtString = dtbounded "String" DTString integer
+ dtInteger = dtbounded "Integer" DTInteger integer
+ dtFloat = dtbounded "Float" DTFloat float
+ dtNumeric = dtbounded "Numeric" (\ma mb -> DTVariant (DTFloat ma mb :|
[DTInteger (truncate <$> ma) (truncate <$> mb)])) float
+ dtArray = do
+ reserved "Array"
+ ml <- optional $ brackets $ do
+ tp <- datatype
+ rst <- optional (symbolic ',' *> integer `sepBy1` symbolic ',')
+ return (tp, rst)
+ case ml of
+ Nothing -> return (DTArray DTData 0 Nothing)
+ Just (t, Nothing) -> return (DTArray t 0 Nothing)
+ Just (t, Just [mi]) -> return (DTArray t mi Nothing)
+ Just (t, Just [mi, mx]) -> return (DTArray t mi (Just mx))
+ Just (_, Just _) -> fail "Too many arguments to datatype Array"
+ dtHash = do
+ reserved "Hash"
+ ml <- optional $ brackets $ do
+ tk <- datatype
+ symbolic ','
+ tv <- datatype
+ rst <- optional (symbolic ',' *> integer `sepBy1` symbolic ',')
+ return (tk, tv, rst)
+ case ml of
+ Nothing -> return (DTHash DTScalar DTData 0 Nothing)
+ Just (tk, tv, Nothing) -> return (DTHash tk tv 0 Nothing)
+ Just (tk, tv, Just [mi]) -> return (DTHash tk tv mi Nothing)
+ Just (tk, tv, Just [mi, mx]) -> return (DTHash tk tv mi (Just mx))
+ Just (_, _, Just _) -> fail "Too many arguments to datatype Hash"
statementList :: Parser (V.Vector Statement)
statementList = (V.fromList . concat) <$> many statement
@@ -640,17 +705,18 @@
let toStrict (Just x) = S.Just x
toStrict Nothing = S.Nothing
HOLambdaCall <$> lambFunc
- <*> fmap (toStrict . join) (optional (parens (optional
expression)))
- <*> lambParams
- <*> (symbolic '{' *> fmap (V.fromList . concat) (many (try
statement)))
- <*> fmap toStrict (optional expression) <* symbolic '}'
+ <*> fmap (toStrict . join) (optional (parens (optional
expression)))
+ <*> lambParams
+ <*> (symbolic '{' *> fmap (V.fromList . concat) (many (try
statement)))
+ <*> fmap toStrict (optional expression) <* symbolic '}'
where
lambFunc :: Parser LambdaFunc
lambFunc = (reserved "each" *> pure LambEach)
- <|> (reserved "map" *> pure LambMap )
- <|> (reserved "reduce" *> pure LambReduce)
- <|> (reserved "filter" *> pure LambFilter)
- <|> (reserved "slice" *> pure LambSlice)
+ <|> (reserved "map" *> pure LambMap )
+ <|> (reserved "reduce" *> pure LambReduce)
+ <|> (reserved "filter" *> pure LambFilter)
+ <|> (reserved "slice" *> pure LambSlice)
+ <|> (reserved "lookup" *> pure LambLookup)
lambParams :: Parser LambdaParameters
lambParams = between (symbolic '|') (symbolic '|') hp
where
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/Puppet/Stdlib.hs
new/language-puppet-1.3.8.1/Puppet/Stdlib.hs
--- old/language-puppet-1.3.7/Puppet/Stdlib.hs 2017-03-14 18:12:16.000000000
+0100
+++ new/language-puppet-1.3.8.1/Puppet/Stdlib.hs 2017-06-22
10:17:30.000000000 +0200
@@ -23,7 +23,6 @@
import Puppet.Interpreter.Resolve
import Puppet.Interpreter.Types
import Puppet.Interpreter.Utils
-import Puppet.Lens
import Puppet.PP
-- | Contains the implementation of the StdLib functions.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/PuppetDB/TestDB.hs
new/language-puppet-1.3.8.1/PuppetDB/TestDB.hs
--- old/language-puppet-1.3.7/PuppetDB/TestDB.hs 2017-01-12
07:15:51.000000000 +0100
+++ new/language-puppet-1.3.8.1/PuppetDB/TestDB.hs 2017-06-22
10:17:44.000000000 +0200
@@ -28,7 +28,6 @@
import Text.Megaparsec.Pos
import Puppet.Interpreter.Types
-import Puppet.Lens
import Puppet.Parser.Types
import Puppet.PP
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/README.adoc
new/language-puppet-1.3.8.1/README.adoc
--- old/language-puppet-1.3.7/README.adoc 2017-03-14 18:12:16.000000000
+0100
+++ new/language-puppet-1.3.8.1/README.adoc 2017-06-19 12:43:44.000000000
+0200
@@ -17,11 +17,10 @@
git clone https://github.com/bartavelle/language-puppet.git
cd language-puppet
# Add ~/.local/bin to $PATH
+ln -s stack-8.0.yaml stack.yaml
stack install
```
-https://hub.docker.com/r/pierrer/language-puppet/[A docker image] is available.
-
== Puppetresources
The `puppetresources` command is a command line utility that let you
interactively compute catalogs on your local computer.
@@ -173,8 +172,12 @@
== Unsupported Puppet idioms or features
+OS::
+ * `OS X` is currently not supported
(https://github.com/bartavelle/language-puppet/issues/197[issue #197])
+
puppet functions::
* the `require` function is not supported (see
https://github.com/bartavelle/language-puppet/issues/17[issue #17])
- * the deprecated `import` function is not supported (see
https://github.com/bartavelle/language-puppet/issues/82[issue #82])
+ * the deprecated `import` function is not supported
+ * the deprecated node inheritance feature is not supported
custom ruby functions::
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/language-puppet.cabal
new/language-puppet-1.3.8.1/language-puppet.cabal
--- old/language-puppet-1.3.7/language-puppet.cabal 2017-03-14
18:12:16.000000000 +0100
+++ new/language-puppet-1.3.8.1/language-puppet.cabal 2017-07-21
12:03:54.000000000 +0200
@@ -2,7 +2,7 @@
-- documentation, see http://haskell.org/cabal/users-guide/
name: language-puppet
-version: 1.3.7
+version: 1.3.8.1
synopsis: Tools to parse and evaluate the Puppet DSL.
description: This is a set of tools that is supposed to fill all your
Puppet needs : syntax checks, catalog compilation, PuppetDB queries,
simulationg of complex interactions between nodes, Puppet master replacement,
and more !
homepage: http://lpuppet.banquise.net/
@@ -15,7 +15,7 @@
build-type: Simple
cabal-version: >=1.8
-Tested-With: GHC == 7.10.3, GHC == 8.0.1
+Tested-With: GHC == 7.10.3, GHC == 8.0.2
extra-source-files:
CHANGELOG.markdown
@@ -175,7 +175,7 @@
type: exitcode-stdio-1.0
ghc-options: -Wall -rtsopts -threaded
extensions: OverloadedStrings
- build-depends:
language-puppet,base,strict-base-types,lens,text,hspec,unordered-containers,megaparsec,vector,scientific,mtl
+ build-depends:
language-puppet,base,strict-base-types,lens,text,hspec,unordered-containers,megaparsec,vector,scientific,mtl,hspec-megaparsec
other-modules: Function.ShellquoteSpec
Function.SprintfSpec
Function.SizeSpec
@@ -187,6 +187,7 @@
InterpreterSpec
Interpreter.CollectorSpec
Interpreter.IfSpec
+ DT.Parser
Helpers
main-is: Spec.hs
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/progs/PuppetResources.hs
new/language-puppet-1.3.8.1/progs/PuppetResources.hs
--- old/language-puppet-1.3.7/progs/PuppetResources.hs 2017-01-12
07:15:51.000000000 +0100
+++ new/language-puppet-1.3.8.1/progs/PuppetResources.hs 2017-06-22
12:56:45.000000000 +0200
@@ -371,7 +371,7 @@
-- | Parse mode
run Options {_optParse = Just fp, ..} = parseFile fp >>= \case
- Left rr -> error ("parse error:" ++ show rr)
+ Left rr -> error (P.parseErrorPretty rr)
Right s -> if _optLoglevel == LOG.DEBUG
then mapM_ print s
else putDoc $ ppStatements s
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/tests/DT/Parser.hs
new/language-puppet-1.3.8.1/tests/DT/Parser.hs
--- old/language-puppet-1.3.7/tests/DT/Parser.hs 1970-01-01
01:00:00.000000000 +0100
+++ new/language-puppet-1.3.8.1/tests/DT/Parser.hs 2017-07-21
11:50:10.000000000 +0200
@@ -0,0 +1,19 @@
+module DT.Parser (spec) where
+
+import qualified Data.Text as T
+import Puppet.Parser
+import Puppet.Parser.Types
+import Test.Hspec
+import Test.Hspec.Megaparsec
+import Text.Megaparsec (parse)
+
+spec :: Spec
+spec = do
+ let prs s r = it s $ parse datatype "?" (T.pack s) `shouldParse` r
+ fl s = it s $ shouldFailOn (parse datatype "?") (T.pack s)
+ describe "String" $ do
+ "String" `prs` DTString Nothing Nothing
+ fl "String[]"
+ fl "String[4,5,6]"
+ "String[5]" `prs` DTString (Just 5) Nothing
+ "String[5,8]" `prs` DTString (Just 5) (Just 8)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/tests/Spec.hs
new/language-puppet-1.3.8.1/tests/Spec.hs
--- old/language-puppet-1.3.7/tests/Spec.hs 2017-03-14 18:12:16.000000000
+0100
+++ new/language-puppet-1.3.8.1/tests/Spec.hs 2017-06-19 13:28:05.000000000
+0200
@@ -11,12 +11,15 @@
import qualified Function.DeleteAtSpec
import qualified Interpreter.IfSpec
import qualified Function.SprintfSpec
+import qualified DT.Parser
main :: IO ()
main = hspec spec
spec :: Spec
spec = do
+ describe "Data types" $ do
+ describe "Parser" DT.Parser.spec
describe "Interpreter" $ do
describe "Collector" InterpreterSpec.collectorSpec
describe "Class include" InterpreterSpec.classIncludeSpec
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/tests/evals.hs
new/language-puppet-1.3.8.1/tests/evals.hs
--- old/language-puppet-1.3.7/tests/evals.hs 2015-10-29 20:18:03.000000000
+0100
+++ new/language-puppet-1.3.8.1/tests/evals.hs 2017-06-14 10:52:51.000000000
+0200
@@ -21,6 +21,8 @@
, "[1,2,3] << 10 == [1,2,3,10]"
, "[1,2,3] << [4,5] == [1,2,3,[4,5]]"
, "4 / 2.0 == 2"
+ , "$architecture == 'amd64'"
+ , "$facts['architecture'] == 'amd64'"
, "$settings::confdir == '/etc/puppet'"
, "regsubst('127', '([0-9]+)', '<\\1>', 'G') == '<127>'"
, "regsubst(['1','2','3'], '([0-9]+)', '<\\1>', 'G') ==
['<1>','<2>','<3>']"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/language-puppet-1.3.7/tests/expr.hs
new/language-puppet-1.3.8.1/tests/expr.hs
--- old/language-puppet-1.3.7/tests/expr.hs 2016-03-14 08:12:49.000000000
+0100
+++ new/language-puppet-1.3.8.1/tests/expr.hs 2017-06-14 10:52:51.000000000
+0200
@@ -23,9 +23,12 @@
(V.fromList [SelectorValue UUndef :!: Terminal (UString "undef")
,SelectorDefault :!: Terminal (UString "default")]))
, ("$x", Terminal (UVariableReference "x"))
+ , ("x($y)", Terminal (UFunctionCall "x" (V.singleton (Terminal
(UVariableReference "y")))))
, ("\"${x}\"", Terminal (UInterpolable (V.fromList [Terminal
(UVariableReference "x")])))
, ("\"${x[3]}\"", Terminal (UInterpolable (V.fromList [Lookup (Terminal
(UVariableReference "x")) 3])))
, ("\"${x[$y]}\"", Terminal (UInterpolable (V.fromList [Lookup (Terminal
(UVariableReference "x")) (Terminal (UVariableReference "y")) ])))
+ , ("\"${x($y)}\"", Terminal (UInterpolable (V.fromList [ Terminal
(UFunctionCall "x" (V.singleton (Terminal (UVariableReference "y")))) ])))
+ , ("\"${x($y)}$'\"", Terminal (UInterpolable (V.fromList [ Terminal
(UFunctionCall "x" (V.singleton (Terminal (UVariableReference "y")))),Terminal
(UString "$"),Terminal (UString "'")])))
]
main :: IO ()