extract doc generator to separate executable (#1671)

Closes #1443.

Also added `-Wunused-packages` to clean up dependencies.

## Demo

This still works as usual:

    stack run

Output editor keywords:

    stack run swarm-docs -- editors --emacs
This commit is contained in:
Karl Ostmo 2023-12-03 19:45:07 -08:00 committed by GitHub
parent 437f70418c
commit b8d37a9364
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 181 additions and 130 deletions

View File

@ -7,16 +7,13 @@
module Main where module Main where
import Data.Foldable qualified import Data.Foldable qualified
import Data.Maybe (fromMaybe)
import Data.Text (Text, pack) import Data.Text (Text, pack)
import Data.Text qualified as T
import Data.Text.IO qualified as Text import Data.Text.IO qualified as Text
import GitHash (GitInfo, giBranch, giHash, tGitInfoCwdTry) import GitHash (GitInfo, giBranch, giHash, tGitInfoCwdTry)
import Options.Applicative import Options.Applicative
import Prettyprinter import Prettyprinter
import Prettyprinter.Render.Text qualified as RT import Prettyprinter.Render.Text qualified as RT
import Swarm.App (appMain) import Swarm.App (appMain)
import Swarm.Doc.Gen (EditorType (..), GenerateDocs (..), PageAddress (..), SheetType (..), generateDocs)
import Swarm.Game.Scenario.Topography.Area (AreaDimensions (..)) import Swarm.Game.Scenario.Topography.Area (AreaDimensions (..))
import Swarm.Game.World.Render (OuputFormat (..), RenderOpts (..), doRenderCmd) import Swarm.Game.World.Render (OuputFormat (..), RenderOpts (..), doRenderCmd)
import Swarm.Language.LSP (lspMain) import Swarm.Language.LSP (lspMain)
@ -45,7 +42,6 @@ type Width = Int
data CLI data CLI
= Run AppOpts = Run AppOpts
| Format Input (Maybe Width) | Format Input (Maybe Width)
| DocGen GenerateDocs
| RenderMap FilePath RenderOpts | RenderMap FilePath RenderOpts
| LSP | LSP
| Version | Version
@ -55,7 +51,6 @@ cliParser =
subparser subparser
( mconcat ( mconcat
[ command "format" (info (Format <$> format <*> optional widthOpt <**> helper) (progDesc "Format a file")) [ command "format" (info (Format <$> format <*> optional widthOpt <**> helper) (progDesc "Format a file"))
, command "generate" (info (DocGen <$> docgen <**> helper) (progDesc "Generate docs"))
, command "map" (info (render <**> helper) (progDesc "Render a scenario world map.")) , command "map" (info (render <**> helper) (progDesc "Render a scenario world map."))
, command "lsp" (info (pure LSP) (progDesc "Start the LSP")) , command "lsp" (info (pure LSP) (progDesc "Start the LSP"))
, command "version" (info (pure Version) (progDesc "Get current and upstream version.")) , command "version" (info (pure Version) (progDesc "Get current and upstream version."))
@ -97,46 +92,6 @@ cliParser =
widthOpt :: Parser Width widthOpt :: Parser Width
widthOpt = option auto (long "width" <> metavar "COLUMNS" <> help "Use layout with maximum width") widthOpt = option auto (long "width" <> metavar "COLUMNS" <> help "Use layout with maximum width")
docgen :: Parser GenerateDocs
docgen =
subparser . mconcat $
[ command "recipes" (info (pure RecipeGraph) $ progDesc "Output graphviz dotfile of entity dependencies based on recipes")
, command "editors" (info (EditorKeywords <$> editor <**> helper) $ progDesc "Output editor keywords")
, command "keys" (info (pure SpecialKeyNames) $ progDesc "Output list of recognized special key names")
, command "cheatsheet" (info (CheatSheet <$> address <*> cheatsheet <**> helper) $ progDesc "Output nice Wiki tables")
, command "pedagogy" (info (pure TutorialCoverage) $ progDesc "Output tutorial coverage")
, command "endpoints" (info (pure WebAPIEndpoints) $ progDesc "Generate markdown Web API documentation.")
]
editor :: Parser (Maybe EditorType)
editor =
Data.Foldable.asum
[ pure Nothing
, Just VSCode <$ switch (long "code" <> help "Generate for the VS Code editor")
, Just Emacs <$ switch (long "emacs" <> help "Generate for the Emacs editor")
]
address :: Parser PageAddress
address =
let replace a b = T.unpack . T.replace a b . T.pack
opt n =
fmap (fromMaybe "") . optional $
option
str
( long n
<> metavar "ADDRESS"
<> help ("Set the address of " <> replace "-" " " n <> ". Default no link.")
)
in PageAddress <$> opt "entities-page" <*> opt "commands-page" <*> opt "capabilities-page" <*> opt "recipes-page"
cheatsheet :: Parser (Maybe SheetType)
cheatsheet =
Data.Foldable.asum
[ pure Nothing
, Just Entities <$ switch (long "entities" <> help "Generate entities page (uses data from entities.yaml)")
, Just Recipes <$ switch (long "recipes" <> help "Generate recipes page (uses data from recipes.yaml)")
, Just Capabilities <$ switch (long "capabilities" <> help "Generate capabilities page (uses entity map)")
, Just Commands <$ switch (long "commands" <> help "Generate commands page (uses constInfo, constCaps and inferConst)")
, Just Scenario <$ switch (long "scenario" <> help "Generate scenario schema page")
]
seed :: Parser (Maybe Int) seed :: Parser (Maybe Int)
seed = optional $ option auto (long "seed" <> short 's' <> metavar "INT" <> help "Seed to use for world generation") seed = optional $ option auto (long "seed" <> short 's' <> metavar "INT" <> help "Seed to use for world generation")
webPort :: Parser (Maybe Int) webPort :: Parser (Maybe Int)
@ -218,7 +173,6 @@ main = do
cli <- execParser cliInfo cli <- execParser cliInfo
case cli of case cli of
Run opts -> appMain opts Run opts -> appMain opts
DocGen g -> generateDocs g
Format fo w -> formatFile fo w Format fo w -> formatFile fo w
RenderMap mapPath opts -> doRenderCmd opts mapPath RenderMap mapPath opts -> doRenderCmd opts mapPath
LSP -> lspMain LSP -> lspMain

66
app/doc/Main.hs Normal file
View File

@ -0,0 +1,66 @@
{-# LANGUAGE OverloadedStrings #-}
-- |
-- SPDX-License-Identifier: BSD-3-Clause
module Main where
import Data.Foldable qualified
import Data.Maybe (fromMaybe)
import Data.Text qualified as T
import Options.Applicative
import Swarm.Doc.Gen (GenerateDocs (..), PageAddress (..), SheetType (..), generateDocs)
import Swarm.Doc.Keyword (EditorType (..))
cliParser :: Parser GenerateDocs
cliParser =
subparser $
mconcat
[ command "recipes" (info (pure RecipeGraph) $ progDesc "Output graphviz dotfile of entity dependencies based on recipes")
, command "editors" (info (EditorKeywords <$> editor <**> helper) $ progDesc "Output editor keywords")
, command "keys" (info (pure SpecialKeyNames) $ progDesc "Output list of recognized special key names")
, command "cheatsheet" (info (CheatSheet <$> address <*> cheatsheet <**> helper) $ progDesc "Output nice Wiki tables")
, command "pedagogy" (info (pure TutorialCoverage) $ progDesc "Output tutorial coverage")
, command "endpoints" (info (pure WebAPIEndpoints) $ progDesc "Generate markdown Web API documentation.")
]
where
editor :: Parser (Maybe EditorType)
editor =
Data.Foldable.asum
[ pure Nothing
, Just VSCode <$ switch (long "code" <> help "Generate for the VS Code editor")
, Just Emacs <$ switch (long "emacs" <> help "Generate for the Emacs editor")
]
address :: Parser PageAddress
address =
let replace a b = T.unpack . T.replace a b . T.pack
opt n =
fmap (fromMaybe "") . optional $
option
str
( long n
<> metavar "ADDRESS"
<> help ("Set the address of " <> replace "-" " " n <> ". Default no link.")
)
in PageAddress <$> opt "entities-page" <*> opt "commands-page" <*> opt "capabilities-page" <*> opt "recipes-page"
cheatsheet :: Parser (Maybe SheetType)
cheatsheet =
Data.Foldable.asum
[ pure Nothing
, Just Entities <$ switch (long "entities" <> help "Generate entities page (uses data from entities.yaml)")
, Just Recipes <$ switch (long "recipes" <> help "Generate recipes page (uses data from recipes.yaml)")
, Just Capabilities <$ switch (long "capabilities" <> help "Generate capabilities page (uses entity map)")
, Just Commands <$ switch (long "commands" <> help "Generate commands page (uses constInfo, constCaps and inferConst)")
, Just Scenario <$ switch (long "scenario" <> help "Generate scenario schema page")
]
cliInfo :: ParserInfo GenerateDocs
cliInfo =
info
(cliParser <**> helper)
( header "Swarm docs"
<> progDesc "Generate swarm documentation."
<> fullDesc
)
main :: IO ()
main = generateDocs =<< execParser cliInfo

View File

@ -1,4 +1,5 @@
{-# LANGUAGE DataKinds #-} {-# LANGUAGE DataKinds #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
-- | -- |
@ -9,15 +10,7 @@ module Swarm.Doc.Gen (
-- ** Main document generation function + types -- ** Main document generation function + types
generateDocs, generateDocs,
GenerateDocs (..), GenerateDocs (..),
EditorType (..),
SheetType (..), SheetType (..),
loadStandaloneScenario,
-- ** Formatted keyword lists
keywordsCommands,
keywordsDirections,
operatorNames,
builtinFunctionList,
-- ** Wiki pages -- ** Wiki pages
PageAddress (..), PageAddress (..),
@ -36,6 +29,7 @@ import Data.Text (Text, unpack)
import Data.Text qualified as T import Data.Text qualified as T
import Data.Text.IO qualified as T import Data.Text.IO qualified as T
import Data.Tuple (swap) import Data.Tuple (swap)
import Swarm.Doc.Keyword
import Swarm.Doc.Pedagogy import Swarm.Doc.Pedagogy
import Swarm.Doc.Util import Swarm.Doc.Util
import Swarm.Doc.Wiki.Cheatsheet import Swarm.Doc.Wiki.Cheatsheet
@ -47,8 +41,7 @@ import Swarm.Game.Scenario (loadStandaloneScenario)
import Swarm.Game.World.Gen (extractEntities) import Swarm.Game.World.Gen (extractEntities)
import Swarm.Game.World.Typecheck (Some (..), TTerm) import Swarm.Game.World.Typecheck (Some (..), TTerm)
import Swarm.Language.Key (specialKeyNames) import Swarm.Language.Key (specialKeyNames)
import Swarm.Language.Syntax qualified as Syntax import Swarm.Util (both, listEnums)
import Swarm.Util (both, listEnums, quote)
import Swarm.Util.Effect (simpleErrorHandle) import Swarm.Util.Effect (simpleErrorHandle)
import Swarm.Web (swarmApiMarkdown) import Swarm.Web (swarmApiMarkdown)
import Text.Dot (Dot, NodeId, (.->.)) import Text.Dot (Dot, NodeId, (.->.))
@ -78,11 +71,6 @@ data GenerateDocs where
WebAPIEndpoints :: GenerateDocs WebAPIEndpoints :: GenerateDocs
deriving (Eq, Show) deriving (Eq, Show)
-- | An enumeration of the editors supported by Swarm (currently,
-- Emacs and VS Code).
data EditorType = Emacs | VSCode | Vim
deriving (Eq, Show, Enum, Bounded)
-- | Generate the requested kind of documentation to stdout. -- | Generate the requested kind of documentation to stdout.
generateDocs :: GenerateDocs -> IO () generateDocs :: GenerateDocs -> IO ()
generateDocs = \case generateDocs = \case
@ -133,34 +121,6 @@ generateEditorKeywords = \case
putStr "\nsyn keyword Direction " putStr "\nsyn keyword Direction "
T.putStrLn $ keywordsDirections Vim T.putStrLn $ keywordsDirections Vim
builtinFunctionList :: EditorType -> Text
builtinFunctionList e = editorList e $ map constSyntax builtinFunctions
editorList :: EditorType -> [Text] -> Text
editorList = \case
Emacs -> T.unlines . map ((" " <>) . quote)
VSCode -> T.intercalate "|"
Vim -> T.intercalate " "
-- | Get formatted list of basic functions/commands.
keywordsCommands :: EditorType -> Text
keywordsCommands e = editorList e $ map constSyntax commands
-- | Get formatted list of directions.
keywordsDirections :: EditorType -> Text
keywordsDirections e = editorList e $ map Syntax.directionSyntax Syntax.allDirs
-- | A list of the names of all the operators in the language.
operatorNames :: Text
operatorNames = T.intercalate "|" $ map (escape . constSyntax) operators
where
special :: String
special = "*+$[]|^"
slashNotComment = \case
'/' -> "/(?![/|*])"
c -> T.singleton c
escape = T.concatMap (\c -> if c `elem` special then T.snoc "\\\\" c else slashNotComment c)
-- ---------------------------------------------------------------------------- -- ----------------------------------------------------------------------------
-- GENERATE SPECIAL KEY NAMES -- GENERATE SPECIAL KEY NAMES
-- ---------------------------------------------------------------------------- -- ----------------------------------------------------------------------------

View File

@ -1,3 +1,4 @@
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
-- | -- |

View File

@ -1,3 +1,4 @@
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
-- | -- |

View File

@ -26,7 +26,7 @@
(setq swarm-font-lock-keywords (setq swarm-font-lock-keywords
(let* ( (let* (
;; Generate the current keywords with: ;; Generate the current keywords with:
;; cabal run swarm:swarm -- generate editors --emacs ;; cabal run swarm:swarm-docs -- editors --emacs
(x-keywords '("def" "end" "let" "in" "require")) (x-keywords '("def" "end" "let" "in" "require"))
(x-builtins '( (x-builtins '(
"self" "self"

View File

@ -28,11 +28,11 @@
### Updating the syntax highlighting ### Updating the syntax highlighting
Whenever swarm language adds new features, the highlighing needs to be updated. Whenever swarm language adds new features, the highlighting needs to be updated.
To save some time, get the current reserved words by running `swarm generate`: To save some time, get the current reserved words by running `swarm-docs`:
```bash ```bash
cabal run swarm:swarm -- generate editors cabal run swarm:swarm-docs -- editors
``` ```
You still have to add for example types manually. You still have to add for example types manually.

55
src/Swarm/Doc/Keyword.hs Normal file
View File

@ -0,0 +1,55 @@
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
-- |
-- SPDX-License-Identifier: BSD-3-Clause
--
-- Collect keywords for documentation generation and testing.
module Swarm.Doc.Keyword (
EditorType (..),
-- ** Formatted keyword lists
keywordsCommands,
keywordsDirections,
operatorNames,
builtinFunctionList,
) where
import Data.Text (Text)
import Data.Text qualified as T
import Swarm.Doc.Util
import Swarm.Language.Syntax qualified as Syntax
import Swarm.Util (quote)
-- | An enumeration of the editors supported by Swarm (currently,
-- Emacs and VS Code).
data EditorType = Emacs | VSCode | Vim
deriving (Eq, Show, Enum, Bounded)
builtinFunctionList :: EditorType -> Text
builtinFunctionList e = editorList e $ map constSyntax builtinFunctions
editorList :: EditorType -> [Text] -> Text
editorList = \case
Emacs -> T.unlines . map ((" " <>) . quote)
VSCode -> T.intercalate "|"
Vim -> T.intercalate " "
-- | Get formatted list of basic functions/commands.
keywordsCommands :: EditorType -> Text
keywordsCommands e = editorList e $ map constSyntax commands
-- | Get formatted list of directions.
keywordsDirections :: EditorType -> Text
keywordsDirections e = editorList e $ map Syntax.directionSyntax Syntax.allDirs
-- | A list of the names of all the operators in the language.
operatorNames :: Text
operatorNames = T.intercalate "|" $ map (escape . constSyntax) operators
where
special :: String
special = "*+$[]|^"
slashNotComment = \case
'/' -> "/(?![/|*])"
c -> T.singleton c
escape = T.concatMap (\c -> if c `elem` special then T.snoc "\\\\" c else slashNotComment c)

View File

@ -17,13 +17,12 @@ import Data.Tuple.Extra (both)
import Data.Vector qualified as V import Data.Vector qualified as V
import Graphics.Vty.Attributes.Color240 import Graphics.Vty.Attributes.Color240
import Linear (V2 (..)) import Linear (V2 (..))
import Swarm.Doc.Gen (loadStandaloneScenario)
import Swarm.Game.Display (Attribute (AWorld), defaultChar, displayAttr) import Swarm.Game.Display (Attribute (AWorld), defaultChar, displayAttr)
import Swarm.Game.Entity.Cosmetic import Swarm.Game.Entity.Cosmetic
import Swarm.Game.Entity.Cosmetic.Assignment (terrainAttributes) import Swarm.Game.Entity.Cosmetic.Assignment (terrainAttributes)
import Swarm.Game.Location import Swarm.Game.Location
import Swarm.Game.ResourceLoading (initNameGenerator, readAppData) import Swarm.Game.ResourceLoading (initNameGenerator, readAppData)
import Swarm.Game.Scenario (Scenario, area, scenarioCosmetics, scenarioWorlds, ul, worldName) import Swarm.Game.Scenario (Scenario, area, loadStandaloneScenario, scenarioCosmetics, scenarioWorlds, ul, worldName)
import Swarm.Game.Scenario.Status (seedLaunchParams) import Swarm.Game.Scenario.Status (seedLaunchParams)
import Swarm.Game.Scenario.Topography.Area (AreaDimensions (..), getAreaDimensions, isEmpty, upperLeftToBottomRight) import Swarm.Game.Scenario.Topography.Area (AreaDimensions (..), getAreaDimensions, isEmpty, upperLeftToBottomRight)
import Swarm.Game.Scenario.Topography.Cell import Swarm.Game.Scenario.Topography.Cell

View File

@ -70,6 +70,7 @@ common stan-config
-- Harmless extensions from GHC2021 -- Harmless extensions from GHC2021
common ghc2021-extensions common ghc2021-extensions
ghc-options: -Wprepositive-qualified-module ghc-options: -Wprepositive-qualified-module
-Wunused-packages
default-extensions: default-extensions:
BangPatterns BangPatterns
DeriveAnyClass DeriveAnyClass
@ -100,15 +101,9 @@ library
Data.BoolExpr.Simplify Data.BoolExpr.Simplify
Swarm.App Swarm.App
Swarm.Constant Swarm.Constant
Swarm.Doc.Gen Swarm.Doc.Keyword
Swarm.Doc.Pedagogy Swarm.Doc.Pedagogy
Swarm.Doc.Schema.Arrangement
Swarm.Doc.Schema.Parse
Swarm.Doc.Schema.Refined
Swarm.Doc.Schema.Render
Swarm.Doc.Schema.SchemaType
Swarm.Doc.Util Swarm.Doc.Util
Swarm.Doc.Wiki.Cheatsheet
Swarm.Game.Failure Swarm.Game.Failure
Swarm.Game.Achievement.Attainment Swarm.Game.Achievement.Attainment
Swarm.Game.Achievement.Definitions Swarm.Game.Achievement.Definitions
@ -269,7 +264,6 @@ library
aeson >= 2 && < 2.2, aeson >= 2 && < 2.2,
array >= 0.5.4 && < 0.6, array >= 0.5.4 && < 0.6,
astar >= 0.3 && < 0.3.1, astar >= 0.3 && < 0.3.1,
blaze-html >= 0.9.1 && < 0.9.2,
boolexpr >= 0.2 && < 0.3, boolexpr >= 0.2 && < 0.3,
brick >= 2.1.1 && < 2.2, brick >= 2.1.1 && < 2.2,
bytestring >= 0.10 && < 0.12, bytestring >= 0.10 && < 0.12,
@ -279,7 +273,6 @@ library
commonmark-extensions >= 0.2 && < 0.3, commonmark-extensions >= 0.2 && < 0.3,
containers >= 0.6.2 && < 0.7, containers >= 0.6.2 && < 0.7,
directory >= 1.3 && < 1.4, directory >= 1.3 && < 1.4,
dotgen >= 0.4 && < 0.5,
either >= 5.0 && < 5.1, either >= 5.0 && < 5.1,
extra >= 1.7 && < 1.8, extra >= 1.7 && < 1.8,
filepath >= 1.4 && < 1.5, filepath >= 1.4 && < 1.5,
@ -300,8 +293,6 @@ library
minimorph >= 0.3 && < 0.4, minimorph >= 0.3 && < 0.4,
transformers >= 0.5 && < 0.7, transformers >= 0.5 && < 0.7,
mtl >= 2.2.2 && < 2.4, mtl >= 2.2.2 && < 2.4,
pandoc >= 3.0 && < 3.2,
pandoc-types >= 1.23 && < 1.24,
murmur3 >= 1.0.4 && < 1.1, murmur3 >= 1.0.4 && < 1.1,
natural-sort >= 0.1.2 && < 0.2, natural-sort >= 0.1.2 && < 0.2,
nonempty-containers >= 0.3.4 && < 0.3.5, nonempty-containers >= 0.3.4 && < 0.3.5,
@ -309,15 +300,12 @@ library
parser-combinators >= 1.2 && < 1.4, parser-combinators >= 1.2 && < 1.4,
prettyprinter >= 1.7.0 && < 1.8, prettyprinter >= 1.7.0 && < 1.8,
random >= 1.2.0 && < 1.3, random >= 1.2.0 && < 1.3,
scientific >= 0.3.6 && < 0.3.8,
wai-app-static >= 3.1.8 && < 3.1.9, wai-app-static >= 3.1.8 && < 3.1.9,
servant >= 0.19 && < 0.21,
servant-docs >= 0.12 && < 0.14, servant-docs >= 0.12 && < 0.14,
servant-server >= 0.19 && < 0.21, servant-server >= 0.19 && < 0.21,
SHA >= 1.6.4 && < 1.6.5, SHA >= 1.6.4 && < 1.6.5,
simple-enumeration >= 0.2 && < 0.3, simple-enumeration >= 0.2 && < 0.3,
split >= 0.2.3 && < 0.3, split >= 0.2.3 && < 0.3,
stm >= 2.5.0 && < 2.6,
syb >= 0.7 && < 0.8, syb >= 0.7 && < 0.8,
tagged >= 0.8 && < 0.9, tagged >= 0.8 && < 0.9,
template-haskell >= 2.16 && < 2.21, template-haskell >= 2.16 && < 2.21,
@ -330,7 +318,6 @@ library
unordered-containers >= 0.2.14 && < 0.3, unordered-containers >= 0.2.14 && < 0.3,
vector >= 0.12 && < 0.14, vector >= 0.12 && < 0.14,
vty >= 6.0 && < 6.1, vty >= 6.0 && < 6.1,
vty-crossplatform >= 0.2.0.0 && < 0.3,
wai >= 3.2 && < 3.3, wai >= 3.2 && < 3.3,
warp >= 3.2 && < 3.4, warp >= 3.2 && < 3.4,
witch >= 1.1.1.0 && < 1.3, witch >= 1.1.1.0 && < 1.3,
@ -354,6 +341,8 @@ executable swarm
build-depends: optparse-applicative >= 0.16 && < 0.19, build-depends: optparse-applicative >= 0.16 && < 0.19,
githash >= 0.1.6 && < 0.2, githash >= 0.1.6 && < 0.2,
terminal-size >= 0.3 && < 1.0, terminal-size >= 0.3 && < 1.0,
blaze-html >= 0.9.1 && < 0.9.2,
servant >= 0.19 && < 0.21,
-- Imports shared with the library don't need bounds -- Imports shared with the library don't need bounds
base, base,
text, text,
@ -364,6 +353,40 @@ executable swarm
ghc-options: -threaded ghc-options: -threaded
default-extensions: ImportQualifiedPost default-extensions: ImportQualifiedPost
executable swarm-docs
import: stan-config, common, ghc2021-extensions
main-is: Main.hs
other-modules: Swarm.Doc.Gen
Swarm.Doc.Schema.Arrangement
Swarm.Doc.Schema.Parse
Swarm.Doc.Schema.Refined
Swarm.Doc.Schema.Render
Swarm.Doc.Schema.SchemaType
Swarm.Doc.Wiki.Cheatsheet
build-depends: optparse-applicative >= 0.16 && < 0.19,
dotgen >= 0.4 && < 0.5,
pandoc >= 3.0 && < 3.2,
pandoc-types >= 1.23 && < 1.24,
scientific >= 0.3.6 && < 0.3.8,
-- Imports shared with the library don't need bounds
base,
aeson,
containers,
directory,
extra,
filepath,
fused-effects,
lens,
mtl,
swarm,
text,
transformers,
vector,
hs-source-dirs: app/doc
default-language: Haskell2010
ghc-options: -threaded
default-extensions: ImportQualifiedPost
test-suite swarm-unit test-suite swarm-unit
import: stan-config, common, ghc2021-extensions import: stan-config, common, ghc2021-extensions
main-is: Main.hs main-is: Main.hs
@ -394,7 +417,6 @@ test-suite swarm-unit
filepath, filepath,
hashable, hashable,
lens, lens,
linear,
mtl, mtl,
swarm, swarm,
text, text,
@ -412,19 +434,15 @@ test-suite swarm-integration
build-depends: tasty >= 0.10 && < 1.6, build-depends: tasty >= 0.10 && < 1.6,
tasty-hunit >= 0.10 && < 0.11, tasty-hunit >= 0.10 && < 0.11,
tasty-expected-failure >= 0.12 && < 0.13,
-- Imports shared with the library don't need bounds -- Imports shared with the library don't need bounds
base, base,
containers, containers,
directory,
filepath, filepath,
fused-effects, fused-effects,
lens, lens,
linear,
mtl, mtl,
swarm, swarm,
text, text,
transformers,
witch, witch,
yaml yaml
hs-source-dirs: test/integration hs-source-dirs: test/integration
@ -439,11 +457,8 @@ benchmark benchmark
build-depends: tasty-bench >= 0.3.1 && < 0.4, build-depends: tasty-bench >= 0.3.1 && < 0.4,
base, base,
lens, lens,
linear,
mtl, mtl,
random,
swarm, swarm,
text,
containers, containers,
default-language: Haskell2010 default-language: Haskell2010
ghc-options: -threaded ghc-options: -threaded

View File

@ -26,8 +26,8 @@ import Data.Text (Text)
import Data.Text qualified as T import Data.Text qualified as T
import Data.Text.IO qualified as T import Data.Text.IO qualified as T
import Data.Yaml (ParseException, prettyPrintParseException) import Data.Yaml (ParseException, prettyPrintParseException)
import Swarm.Doc.Gen (EditorType (..)) import Swarm.Doc.Keyword (EditorType (..))
import Swarm.Doc.Gen qualified as DocGen import Swarm.Doc.Keyword qualified as Keyword
import Swarm.Effect (runTimeIO) import Swarm.Effect (runTimeIO)
import Swarm.Game.Achievement.Definitions (GameplayAchievement (..)) import Swarm.Game.Achievement.Definitions (GameplayAchievement (..))
import Swarm.Game.CESK (emptyStore, getTickNumber, initMachine) import Swarm.Game.CESK (emptyStore, getTickNumber, initMachine)
@ -525,22 +525,22 @@ testEditorFiles =
"editors" "editors"
[ testGroup [ testGroup
"VS Code" "VS Code"
[ testTextInVSCode "operators" (const DocGen.operatorNames) [ testTextInVSCode "operators" (const Keyword.operatorNames)
, testTextInVSCode "builtin" DocGen.builtinFunctionList , testTextInVSCode "builtin" Keyword.builtinFunctionList
, testTextInVSCode "commands" DocGen.keywordsCommands , testTextInVSCode "commands" Keyword.keywordsCommands
, testTextInVSCode "directions" DocGen.keywordsDirections , testTextInVSCode "directions" Keyword.keywordsDirections
] ]
, testGroup , testGroup
"Emacs" "Emacs"
[ testTextInEmacs "builtin" DocGen.builtinFunctionList [ testTextInEmacs "builtin" Keyword.builtinFunctionList
, testTextInEmacs "commands" DocGen.keywordsCommands , testTextInEmacs "commands" Keyword.keywordsCommands
, testTextInEmacs "directions" DocGen.keywordsDirections , testTextInEmacs "directions" Keyword.keywordsDirections
] ]
, testGroup , testGroup
"Vim" "Vim"
[ testTextInVim "builtin" DocGen.builtinFunctionList [ testTextInVim "builtin" Keyword.builtinFunctionList
, testTextInVim "commands" DocGen.keywordsCommands , testTextInVim "commands" Keyword.keywordsCommands
, testTextInVim "directions" DocGen.keywordsDirections , testTextInVim "directions" Keyword.keywordsDirections
] ]
] ]
where where