Compare commits
1 commit
f26b68cad4
...
7298686997
| Author | SHA1 | Date | |
|---|---|---|---|
| 7298686997 |
7 changed files with 53 additions and 228 deletions
|
|
@ -1,99 +0,0 @@
|
||||||
name: Haskell CI
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- dev
|
|
||||||
- main
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: docker
|
|
||||||
container:
|
|
||||||
image: elland/haddock2:latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
- name: Check versions
|
|
||||||
run: |
|
|
||||||
ghc --version
|
|
||||||
cabal --version
|
|
||||||
node --version
|
|
||||||
- name: Cache Cabal packages
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cabal/packages
|
|
||||||
~/.cabal/store
|
|
||||||
dist-newstyle
|
|
||||||
key: ${{ runner.os }}-haskell-9.10-cabal-${{ hashFiles('**/*.cabal', '**/cabal.project') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-haskell-9.10-cabal-
|
|
||||||
- name: Update Cabal package index
|
|
||||||
run: cabal update
|
|
||||||
- name: Configure project
|
|
||||||
run: cabal configure --enable-tests --enable-benchmarks
|
|
||||||
- name: Build dependencies
|
|
||||||
run: cabal build --only-dependencies --enable-tests --enable-benchmarks
|
|
||||||
- name: Build project
|
|
||||||
run: cabal build --enable-tests --enable-benchmarks
|
|
||||||
- name: Run documentation build
|
|
||||||
run: cabal haddock
|
|
||||||
|
|
||||||
test:
|
|
||||||
runs-on: docker
|
|
||||||
container:
|
|
||||||
image: elland/haddock2:latest
|
|
||||||
needs: build
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
- name: Cache Cabal packages
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cabal/packages
|
|
||||||
~/.cabal/store
|
|
||||||
dist-newstyle
|
|
||||||
key: ${{ runner.os }}-haskell-9.10-cabal-${{ hashFiles('**/*.cabal', '**/cabal.project') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-haskell-9.10-cabal-
|
|
||||||
- name: Update Cabal package index
|
|
||||||
run: cabal update
|
|
||||||
- name: Configure project
|
|
||||||
run: cabal configure --enable-tests --enable-benchmarks
|
|
||||||
- name: Build dependencies
|
|
||||||
run: cabal build --only-dependencies --enable-tests --enable-benchmarks
|
|
||||||
- name: Build project
|
|
||||||
run: cabal build --enable-tests --enable-benchmarks
|
|
||||||
- name: Run tests
|
|
||||||
run: cabal test --test-show-details=direct
|
|
||||||
|
|
||||||
fourmolu:
|
|
||||||
runs-on: docker
|
|
||||||
container:
|
|
||||||
image: elland/haddock2:latest
|
|
||||||
needs: build
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
- name: Run fourmolu
|
|
||||||
run: |
|
|
||||||
find src test app -name "*.hs" -exec fourmolu --check-idempotence {} \; 2>/dev/null || true
|
|
||||||
find src test app -name "*.hs" -exec fourmolu --mode check {} \;
|
|
||||||
|
|
||||||
hlint:
|
|
||||||
runs-on: docker
|
|
||||||
container:
|
|
||||||
image: elland/haddock2:latest
|
|
||||||
needs: build
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
- name: Run hlint
|
|
||||||
run: |
|
|
||||||
if [ -d src ]; then hlint src/; fi
|
|
||||||
if [ -d test ]; then hlint test/; fi
|
|
||||||
if [ -d app ]; then hlint app/; fi
|
|
||||||
36
Dockerfile
36
Dockerfile
|
|
@ -1,36 +0,0 @@
|
||||||
FROM haskell:9.10.2-bullseye AS builder
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y curl git && rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \
|
|
||||||
apt-get install -y nodejs && \
|
|
||||||
rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
RUN cabal update && \
|
|
||||||
cabal install --install-method=copy --installdir=/usr/local/bin \
|
|
||||||
fourmolu hlint cabal-gild
|
|
||||||
|
|
||||||
WORKDIR /workspace
|
|
||||||
|
|
||||||
FROM haskell:9.10.2-bullseye
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y \
|
|
||||||
libgmp10 \
|
|
||||||
curl \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \
|
|
||||||
apt-get install -y nodejs && \
|
|
||||||
rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
RUN cabal update
|
|
||||||
|
|
||||||
COPY --from=builder /usr/local/bin/cabal /usr/local/bin/
|
|
||||||
COPY --from=builder /usr/local/bin/fourmolu /usr/local/bin/
|
|
||||||
COPY --from=builder /usr/local/bin/hlint /usr/local/bin/
|
|
||||||
COPY --from=builder /usr/local/bin/cabal-gild /usr/local/bin/
|
|
||||||
|
|
||||||
WORKDIR /workspace
|
|
||||||
|
|
||||||
CMD [ "bash" ]
|
|
||||||
|
|
||||||
41
Makefile
41
Makefile
|
|
@ -1,44 +1,9 @@
|
||||||
.PHONY: help
|
.PHONY: help
|
||||||
help: ## Show this help
|
help: ## Show this help.
|
||||||
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
|
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
|
||||||
|
|
||||||
.PHONY: build
|
.PHONY: format
|
||||||
build: ## Build the project
|
format:
|
||||||
cabal build
|
|
||||||
|
|
||||||
.PHONY: test
|
|
||||||
test: ## Run tests
|
|
||||||
cabal test --test-show-details=direct
|
|
||||||
|
|
||||||
.PHONY: clean
|
|
||||||
clean: ## Clean build artifacts
|
|
||||||
cabal clean
|
|
||||||
|
|
||||||
.PHONY: fourmolu
|
|
||||||
fourmolu: ## Format Haskell code
|
|
||||||
find . -type f -name "*.hs" ! -path "./dist-newstyle/*" -exec fourmolu -i {} +
|
find . -type f -name "*.hs" ! -path "./dist-newstyle/*" -exec fourmolu -i {} +
|
||||||
|
|
||||||
.PHONY: fourmolu-check
|
|
||||||
fourmolu-check: ## Check if code is formatted
|
|
||||||
find . -type f -name "*.hs" ! -path "./dist-newstyle/*" -exec fourmolu --mode check {} \;
|
|
||||||
|
|
||||||
.PHONY: lint
|
|
||||||
lint: ## Run hlint
|
|
||||||
hlint src test app
|
|
||||||
|
|
||||||
.PHONY: cabal-gild
|
|
||||||
cabal-gild: ## Format cabal file
|
|
||||||
cabal-gild --io=haddock2.cabal
|
cabal-gild --io=haddock2.cabal
|
||||||
|
|
||||||
.PHONY: format
|
|
||||||
format: fourmolu cabal-gild ## Run all formatters
|
|
||||||
|
|
||||||
.PHONY: check
|
|
||||||
check: fourmolu-check lint ## Run all checks (CI-style)
|
|
||||||
|
|
||||||
.PHONY: ci
|
|
||||||
ci: build test check ## Run full CI pipeline locally
|
|
||||||
|
|
||||||
.PHONY: docs
|
|
||||||
docs: ## Generate documentation
|
|
||||||
cabal haddock --haddock-hyperlink-source
|
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,7 @@ located :: Parser a -> Parser (SourcePos, a)
|
||||||
located p = (,) <$> getPosition <*> p
|
located p = (,) <$> getPosition <*> p
|
||||||
|
|
||||||
tokenise :: [Parser a] -> Parser [(SourcePos, a)]
|
tokenise :: [Parser a] -> Parser [(SourcePos, a)]
|
||||||
tokenise = mapM located
|
tokenise = sequence . map located
|
||||||
|
|
||||||
lexer :: String -> Either ParseError [LocatedToken]
|
lexer :: String -> Either ParseError [LocatedToken]
|
||||||
lexer = Parsec.runParser lexText initialParserState "input" . Text.pack
|
lexer = Parsec.runParser lexText initialParserState "input" . Text.pack
|
||||||
|
|
@ -148,7 +148,7 @@ delimitedNoTrailing openP closeP openTok = asList <$> delimitedAsTuple (openTok
|
||||||
asList (a, tok, _) = [a, tok]
|
asList (a, tok, _) = [a, tok]
|
||||||
|
|
||||||
delimitedSymmetric :: Parser a -> Token -> Token -> Parser [LocatedToken]
|
delimitedSymmetric :: Parser a -> Token -> Token -> Parser [LocatedToken]
|
||||||
delimitedSymmetric s = delimited s s
|
delimitedSymmetric s t1 t2 = delimited s s t1 t2
|
||||||
|
|
||||||
eol :: Parser ()
|
eol :: Parser ()
|
||||||
eol = void "\n" <|> void "\r\n" <|> Parsec.eof
|
eol = void "\n" <|> void "\r\n" <|> Parsec.eof
|
||||||
|
|
|
||||||
|
|
@ -13,9 +13,7 @@ import Text.Parsec.Pos (updatePosChar)
|
||||||
Return everything consumed except for the end pattern itself.
|
Return everything consumed except for the end pattern itself.
|
||||||
-}
|
-}
|
||||||
takeUntil :: Text -> Parser Text
|
takeUntil :: Text -> Parser Text
|
||||||
takeUntil end_ =
|
takeUntil end_ = Text.dropEnd (Text.length end_) <$> requireEnd (scan p (False, end)) >>= gotSome
|
||||||
requireEnd (scan p (False, end))
|
|
||||||
>>= gotSome . Text.dropEnd (Text.length end_)
|
|
||||||
where
|
where
|
||||||
end = Text.unpack end_
|
end = Text.unpack end_
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,6 @@ module Types (
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
|
|
||||||
import Data.Foldable (fold)
|
|
||||||
|
|
||||||
newtype Document = Document
|
newtype Document = Document
|
||||||
{ meta :: Meta
|
{ meta :: Meta
|
||||||
}
|
}
|
||||||
|
|
@ -30,7 +28,6 @@ data Since = Since
|
||||||
|
|
||||||
-- Could have a better type?
|
-- Could have a better type?
|
||||||
type Version = [Int]
|
type Version = [Int]
|
||||||
|
|
||||||
type Package = String
|
type Package = String
|
||||||
|
|
||||||
data DocMarkup mod id
|
data DocMarkup mod id
|
||||||
|
|
@ -139,7 +136,7 @@ instance Semigroup (DocMarkup mod id) where
|
||||||
|
|
||||||
instance Monoid (DocMarkup mod id) where
|
instance Monoid (DocMarkup mod id) where
|
||||||
mempty = DocEmpty
|
mempty = DocEmpty
|
||||||
mconcat = fold
|
mconcat = foldr (<>) mempty
|
||||||
|
|
||||||
data ModuleLink id = ModuleLink
|
data ModuleLink id = ModuleLink
|
||||||
{ name :: String
|
{ name :: String
|
||||||
|
|
|
||||||
14
test/Spec.hs
14
test/Spec.hs
|
|
@ -1,15 +1,16 @@
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
{-# OPTIONS_GHC -Wno-orphans #-}
|
{-# OPTIONS_GHC -Wno-orphans #-}
|
||||||
|
|
||||||
import Data.String (IsString (..))
|
import Test.Hspec
|
||||||
import Data.Text (Text)
|
|
||||||
import GHC.Stack
|
|
||||||
import Identifier (Identifier)
|
import Identifier (Identifier)
|
||||||
import Lexer
|
import Lexer
|
||||||
import Parser
|
import Parser
|
||||||
import Types
|
import Types
|
||||||
|
|
||||||
import Test.Hspec
|
import Data.String (IsString (..))
|
||||||
|
import Data.Text (Text)
|
||||||
|
import GHC.Stack
|
||||||
import Text.Parsec.Pos
|
import Text.Parsec.Pos
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
|
|
@ -34,9 +35,9 @@ main = hspec $ do
|
||||||
|
|
||||||
describe "Parser" do
|
describe "Parser" do
|
||||||
it "Bold" do
|
it "Bold" do
|
||||||
"__bold__" `shouldParseTo` DocBold (DocString "bold")
|
"__bold__" `shouldParseTo` (DocBold (DocString "bold"))
|
||||||
it "Emphasis" do
|
it "Emphasis" do
|
||||||
"/emphasis/" `shouldParseTo` DocEmphasis (DocString "emphasis")
|
"/emphasis/" `shouldParseTo` (DocEmphasis (DocString "emphasis"))
|
||||||
|
|
||||||
------------
|
------------
|
||||||
-- Tests
|
-- Tests
|
||||||
|
|
@ -57,7 +58,6 @@ modules = do
|
||||||
`shouldLexTo` [ (1, 2, Module "OtherModule.Name")
|
`shouldLexTo` [ (1, 2, Module "OtherModule.Name")
|
||||||
, (1, 18, Anchor "myAnchor")
|
, (1, 18, Anchor "myAnchor")
|
||||||
]
|
]
|
||||||
|
|
||||||
link :: Expectation
|
link :: Expectation
|
||||||
link =
|
link =
|
||||||
"[link to](http://some.website)"
|
"[link to](http://some.website)"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue