nemesis 2009.6.14.2 → 2009.6.14.3
raw patch · 7 files changed
+93/−10 lines, 7 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ System.Nemesis: current_namespace :: Nemesis -> [String]
+ System.Nemesis: display_name :: Task -> String
+ System.Nemesis: full_name :: Task -> String
+ System.Nemesis: namespace :: Task -> [String]
+ System.Nemesis.DSL: namespace :: String -> Unit -> Unit
- System.Nemesis: Nemesis :: Map String Task -> String -> Maybe String -> Nemesis
+ System.Nemesis: Nemesis :: Map String Task -> String -> Maybe String -> [String] -> Nemesis
- System.Nemesis: Task :: String -> IO () -> [String] -> Maybe String -> Task
+ System.Nemesis: Task :: String -> IO () -> [String] -> Maybe String -> [String] -> Task
Files
- Nemesis +16/−2
- changelog.md +7/−0
- nemesis.cabal +1/−1
- readme.md +26/−0
- src/System/Nemesis.hs +21/−6
- src/System/Nemesis/DSL.hs +17/−0
- src/System/Nemesis/Util.hs +5/−1
Nemesis view
@@ -8,15 +8,29 @@ , "nemesis-tmp.*" ] + desc "prepare cabal dist" task "dist" $ do sh "cabal clean" sh "cabal configure" sh "cabal sdist" - desc "start console"- task "i" (sh "ghci -isrc src/System/Nemesis.hs") desc "put all .hs files in manifest" task "manifest" $ do sh "find . | grep 'hs$' > manifest"+++ desc "start console"+ task "i" (sh "ghci -isrc src/System/Nemesis/DSL.hs")++ namespace "eat" $ do+ + task "bread: salad" $ putStrLn "eating bread"+ task "salad: /drink/coke" $ putStrLn "nice salad"+ + + namespace "drink" $ do+ + task "coke" $ putStrLn "drinking coke"+
changelog.md view
@@ -1,3 +1,10 @@+2009.6.14.3+-----------++### Feature++* new keyword namespace+ 2009.6.14.2 -----------
nemesis.cabal view
@@ -1,5 +1,5 @@ Name: nemesis-Version: 2009.6.14.2+Version: 2009.6.14.3 Build-type: Simple Synopsis: a rake like task management tool Description:
readme.md view
@@ -69,6 +69,32 @@ Haskell is awesome! +### Namespace++Suppose you have the following tasks++ namespace "eat" $ do++ task "bread: salad" $ putStrLn "eating bread"+ task "salad: /drink/coke" $ putStrLn "nice salad"+++ namespace "drink" $ do++ task "coke" $ putStrLn "drinking coke"++then++ ./.nemesis bread =>+ .nemesis: bread does not exist!+ + ./.nemesis eat/bread =>+ drinking coke+ nice salad+ eating bread+ + + Advance usage -------------
src/System/Nemesis.hs view
@@ -16,6 +16,7 @@ , action :: IO () , deps :: [String] , description :: Maybe String+ , namespace :: [String] } data Nemesis = Nemesis@@ -23,27 +24,34 @@ tasks :: Map String Task , target :: String , current_desc :: Maybe String+ , current_namespace :: [String] } deriving (Show) instance Default Nemesis where- def = Nemesis empty def def+ def = Nemesis empty def def def instance Default Task where- def = Task def (return ()) def def+ def = Task def (return ()) def def def +full_name :: Task -> String+full_name t = (t.name : t.namespace).reverse.join "/"++display_name :: Task -> String+display_name t = (t.name : t.namespace).reverse.map (rjust 10 ' ') .join " "+ instance Show Task where show x = case x.description of Nothing -> title Just s -> title ++ s where- title = x.name.ljust 20 ' ' ++ ": "+ title = x.display_name.rjust 34 ' ' ++ ": " instance Eq Task where a == b = a.name == b.name instance Ord Task where- compare = compare_by name+ compare = compare_by full_name type Unit = StateT Nemesis IO () @@ -67,9 +75,16 @@ insert_task t = do n <- get let description = n.current_desc- tasks' = n.tasks.insert (t.name) t {description}- + namespace = n.current_namespace+ deps' = t.deps.map (with_current namespace)+ task = t {deps = deps', description, namespace}+ tasks' = n.tasks.insert (task.full_name) task+ put n {tasks = tasks', current_desc = Nothing}+ where+ with_current namespace x+ | x.starts_with "/" = x.tail+ | otherwise = (x : namespace).reverse.join "/" run_nemesis :: Nemesis -> IO () run_nemesis n = run' (n.target)
src/System/Nemesis/DSL.hs view
@@ -31,6 +31,23 @@ task' name deps = insert_task def {name, deps, action} strip = dropWhile (== ' ') > reverse > dropWhile (== ' ') > reverse +namespace :: String -> Unit -> Unit+namespace name unit = do+ push name+ unit+ pop+ + where+ push s = do+ n <- get+ let current_namespace' = s : n.current_namespace+ put n {current_namespace = current_namespace'}+ + pop = do+ n <- get+ let current_namespace' = n.current_namespace.tail+ put n {current_namespace = current_namespace'}+ sh :: String -> IO () sh s = do status <- system s
src/System/Nemesis/Util.hs view
@@ -32,11 +32,15 @@ join' :: [[a]] -> [a] join' = concat -ljust :: Int -> a -> [a] -> [a]+ljust, rjust :: Int -> a -> [a] -> [a] ljust n x xs | n < xs.length = xs | otherwise = ( n.times x ++ xs ).reverse.take n.reverse +rjust n x xs+ | n < xs.length = xs+ | otherwise = ( xs ++ n.times x ).take n+ compare_by :: (Ord b) => (a -> b) -> a -> a -> Ordering compare_by = on compare