on 43c6451 help sign in
15 files changed+42−93
since splitsnapshots
unifiedsplit
.github/workflows/haskell.yml+1−3 cabal.project+1−10 cabal.project-nogtk−14 reflex-dom-core/ChangeLog.md−4 reflex-dom-core/reflex-dom-core.cabal+4−16 reflex-dom-core/src/Reflex/Dom/Builder/Class.hs+1−2 reflex-dom-core/src/Reflex/Dom/Builder/Immediate.hs+3−2 reflex-dom-core/src/Reflex/Dom/Builder/Static.hs+1−1 reflex-dom-core/src/Reflex/Dom/Main.hs+1 reflex-dom-core/src/Reflex/Dom/Widget/Lazy.hs+1−1 reflex-dom-core/test/hlint.hs+1−1 reflex-dom-core/test/hydration.hs+26−33 reflex-dom-test-selenium/reflex-dom-test-selenium.cabal+1−1 reflex-dom/ChangeLog.md−4 reflex-dom/reflex-dom.cabal+1−1
.github/workflows/haskell.yml+1−3
@@ -35,12 +35,10 @@ jobs:
3535 ${{ runner.os }}-${{ matrix.ghc }}-
3636 ${{ runner.os }}
3737
38− - name: Set up cabal project file to avoid webkit2gtk
39− run: cp cabal.project-nogtk cabal.project
4038 - name: Install dependencies
4139 run: |
4240 cabal update
43− cabal build --only-dependencies --enable-tests --enable-benchmarks all
41+ cabal build --only-dependencies --enable-tests --enable-benchmarks
4442 - name: Build
4543 run: cabal build --enable-tests --enable-benchmarks all
4644 - name: Run tests
cabal.project+1−10
@@ -1,10 +1 @@
1−packages:
2− reflex-dom-core/
3− reflex-dom/
4− chrome-test-utils/
5− reflex-dom-test-selenium/
6−
7−source-repository-package
8− type: git
9− location: https://github.com/dfordivam/hspec-webdriver-clone
10− tag: 0d748b7bb7cd74dce0a55a1ec86b01dbb8a71cd8
1+packages: chrome-test-utils, reflex-dom-core, reflex-dom, reflex-dom-test-selenium
cabal.project-nogtkdeleted−14
@@ -1,14 +0,0 @@
1−packages:
2− reflex-dom-core/
3− reflex-dom/
4−
5−package reflex-dom-core
6− flags: -hydration-tests -gc-tests
7−
8−package reflex-dom
9− flags: +use-warp -webkit2gtk
10−
11−source-repository-package
12− type: git
13− location: https://github.com/dfordivam/hspec-webdriver-clone
14− tag: 0d748b7bb7cd74dce0a55a1ec86b01dbb8a71cd8
reflex-dom-core/ChangeLog.md−4
@@ -1,9 +1,5 @@
11# Revision history for reflex-dom-core
22
3−## 0.6.2.1
4−
5−* Fix hlint complaints with newer GHC.
6−
73## 0.6.2.0
84
95* ([#400](https://github.com/reflex-frp/reflex-dom/pull/400/files)) Set value of input elements in static renderer
reflex-dom-core/reflex-dom-core.cabal+4−16
@@ -1,6 +1,6 @@
11cabal-version: 1.24
22Name: reflex-dom-core
3−Version: 0.6.2.1
3+Version: 0.6.2.0
44Synopsis: Functional Reactive Web Apps with Reflex
55Description:
66 Web applications without callbacks or side-effects.
@@ -54,16 +54,6 @@ flag split-these
5454 manual: False
5555 default: True
5656
57−flag hydration-tests
58− description: Whether to run the hydration tests (currently only available on linux)
59− default: True
60− manual: True
61−
62−flag gc-tests
63− description: Whether to run the gc tests (currently only available on linux)
64− default: True
65− manual: True
66−
6757library
6858 hs-source-dirs: src
6959 build-depends:
@@ -176,9 +166,7 @@ library
176166 Reflex.Dom.Builder.Class.TH
177167
178168test-suite hlint
179− build-depends:
180− base,
181− hlint >= 2.0 && < 4.0
169+ build-depends: base, hlint
182170 hs-source-dirs: test
183171 main-is: hlint.hs
184172 type: exitcode-stdio-1.0
@@ -230,7 +218,7 @@ test-suite hydration
230218 main-is: hydration.hs
231219 type: exitcode-stdio-1.0
232220 default-language: Haskell98
233− if !os(linux) || !arch(x86_64) || flag(profile-reflex) || !flag(hydration-tests)
221+ if !os(linux) || !arch(x86_64) || flag(profile-reflex)
234222 buildable: False
235223
236224-- broken test on base 4.11 & ghc 8.4.3
@@ -250,7 +238,7 @@ test-suite gc
250238 main-is: gc.hs
251239 type: exitcode-stdio-1.0
252240 default-language: Haskell98
253− if !os(linux) || !arch(x86_64) || !flag(gc-tests)
241+ if !os(linux) || !arch(x86_64)
254242 buildable: False
255243
256244source-repository head
reflex-dom-core/src/Reflex/Dom/Builder/Class.hs+1−2
@@ -9,12 +9,11 @@
99{-# LANGUAGE GeneralizedNewtypeDeriving #-}
1010#if !MIN_VERSION_base(4,9,0)
1111{-# LANGUAGE ImpredicativeTypes #-}
12−#else
13−{-# LANGUAGE Rank2Types #-} -- Implied by ImpredicativeTypes
1412#endif
1513{-# LANGUAGE LambdaCase #-}
1614{-# LANGUAGE OverloadedStrings #-}
1715{-# LANGUAGE PolyKinds #-}
16+{-# LANGUAGE Rank2Types #-}
1817{-# LANGUAGE RecursiveDo #-}
1918{-# LANGUAGE ScopedTypeVariables #-}
2019{-# LANGUAGE StandaloneDeriving #-}
reflex-dom-core/src/Reflex/Dom/Builder/Immediate.hs+3−2
@@ -2,6 +2,7 @@
22{-# LANGUAGE CPP #-}
33{-# LANGUAGE ConstraintKinds #-}
44{-# LANGUAGE DataKinds #-}
5+{-# LANGUAGE DeriveFunctor #-}
56{-# LANGUAGE DeriveTraversable #-}
67{-# LANGUAGE EmptyDataDecls #-}
78{-# LANGUAGE FlexibleContexts #-}
@@ -1876,14 +1877,14 @@ hoistTraverseWithKeyWithAdjust base mapPatch updateChildUnreadiness applyDomUpda
18761877 getHydrationMode >>= \case
18771878 HydrationMode_Hydrating -> addHydrationStepWithSetup (holdIncremental children0 children') $ \children -> do
18781879 dm :: DMap k (Compose (TraverseChild t m (Some k)) v') <- sample $ currentIncremental children
1879− phs <- sequenceA $ weakenDMapWith (either _traverseChildHydration_delayed (pure . _traverseChildImmediate_placeholder) . _traverseChild_mode . getCompose) dm
1880+ phs <- traverse id $ weakenDMapWith (either _traverseChildHydration_delayed (pure . _traverseChildImmediate_placeholder) . _traverseChild_mode . getCompose) dm
18801881 liftIO $ writeIORef placeholders $! phs
18811882 insertAfterPreviousNode lastPlaceholder
18821883 HydrationMode_Immediate -> do
18831884 let activate i = do
18841885 append $ toNode $ _traverseChildImmediate_fragment i
18851886 pure $ _traverseChildImmediate_placeholder i
1886− phs <- sequenceA $ weakenDMapWith (either (error "impossible") activate . _traverseChild_mode . getCompose) children0
1887+ phs <- traverse id $ weakenDMapWith (either (error "impossible") activate . _traverseChild_mode . getCompose) children0
18871888 liftIO $ writeIORef placeholders $! phs
18881889 append $ toNode lastPlaceholder
18891890 requestDomAction_ $ ffor children' $ \p -> do
reflex-dom-core/src/Reflex/Dom/Builder/Static.hs+1−1
@@ -274,7 +274,7 @@ instance SupportsStaticDomBuilder t m => DomBuilder t (StaticDomBuilderT t m) wh
274274 --TODO: Do not escape quotation marks; see https://stackoverflow.com/questions/25612166/what-characters-must-be-escaped-in-html-5
275275 shouldEscape <- asks _staticDomBuilderEnv_shouldEscape
276276 let escape = if shouldEscape then fromHtmlEscapedText else byteString . encodeUtf8
277− (modify . (:)) . (\c -> "<!--" <> c <> "-->") =<< case mSetContents of
277+ modify . (:) =<< (\c -> "<!--" <> c <> "-->") <$> case mSetContents of
278278 Nothing -> return (pure (escape initialContents))
279279 Just setContents -> hold (escape initialContents) $ fmapCheap escape setContents --Only because it doesn't get optimized when profiling is on
280280 return $ CommentNode ()
reflex-dom-core/src/Reflex/Dom/Main.hs+1
@@ -5,6 +5,7 @@
55{-# LANGUAGE GADTs #-}
66{-# LANGUAGE MultiParamTypeClasses #-}
77{-# LANGUAGE NoMonomorphismRestriction #-}
8+{-# LANGUAGE PatternSynonyms #-}
89{-# LANGUAGE RankNTypes #-}
910{-# LANGUAGE RecursiveDo #-}
1011{-# LANGUAGE ScopedTypeVariables #-}
reflex-dom-core/src/Reflex/Dom/Widget/Lazy.hs+1−1
@@ -117,7 +117,7 @@ virtualList heightPx rowPx maxIndex i0 setI keyToIndex items0 itemsUpdate itemBu
117117 "overflow" =: "hidden" <>
118118 "position" =: "relative"
119119 mkRow k = toStyleAttr $ "height" =: (T.pack (show rowPx) <> "px") <>
120− "top" =: (<> "px") (T.pack $ show $ keyToIndex k * rowPx) <>
120+ "top" =: ((<>"px") $ T.pack $ show $ keyToIndex k * rowPx) <>
121121 "position" =: "absolute" <>
122122 "width" =: "100%"
123123 findWindow sizeIncrement windowSize startingPosition =
reflex-dom-core/test/hlint.hs+1−1
@@ -1,4 +1,4 @@
1−import Language.Haskell.HLint (hlint)
1+import Language.Haskell.HLint3 (hlint)
22import System.Exit (exitFailure, exitSuccess)
33
44main :: IO ()
reflex-dom-core/test/hydration.hs+26−33
@@ -20,14 +20,6 @@
2020
2121{-# OPTIONS_GHC -fno-warn-orphans #-}
2222
23−-- Notice to those working on this test suite:
24−-- It doesn't appear to be possible to use --match to run a particular test, in
25−-- this situation the test may hang before reaching our code. This seems to
26−-- happen when the test is not the first test in the block. As a workaround, you
27−-- can just comment out the other tests. Also, using `xit` will cause the same
28−-- issue. `xit` tests must be the last tests in the session, or the session will
29−-- hang in the following test.
30−
3123import Prelude hiding (fail)
3224import Control.Concurrent
3325import qualified Control.Concurrent.Async as Async
@@ -154,13 +146,13 @@ main = do
154146 withDebugging <- isNothing <$> lookupEnv "NO_DEBUG"
155147 let wdConfig = WD.defaultConfig { WD.wdPort = fromIntegral $ _selenium_portNumber selenium }
156148 chromeCaps' = WD.getCaps $ chromeConfig browserPath chromeFlags
157− hspec (tests withDebugging wdConfig [(chromeCaps', "chrome")] selenium) `finally` _selenium_stopServer selenium
149+ hspec (tests withDebugging wdConfig [chromeCaps'] selenium) `finally` _selenium_stopServer selenium
158150
159−tests :: Bool -> WD.WDConfig -> [(Capabilities, String)] -> Selenium -> Spec
151+tests :: Bool -> WD.WDConfig -> [Capabilities] -> Selenium -> Spec
160152tests withDebugging wdConfig caps _selenium = do
161153 let putStrLnDebug :: MonadIO m => Text -> m ()
162154 putStrLnDebug m = when withDebugging $ liftIO $ putStrLn $ T.unpack m
163− session' t = sessionWith wdConfig t . using caps
155+ session' = sessionWith wdConfig "" . using (map (,"") caps)
164156 runWD m = runWDOptions (WdOptions False) $ do
165157 putStrLnDebug "before"
166158 r <- m
@@ -172,7 +164,7 @@ tests withDebugging wdConfig caps _selenium = do
172164 testWidget = testWidgetDebug True withDebugging
173165 testWidget' :: WD a -> (a -> WD b) -> (forall m js. TestWidget js (SpiderTimeline Global) m => m ()) -> WD b
174166 testWidget' = testWidgetDebug' True withDebugging
175− session' "text" $ do
167+ describe "text" $ session' $ do
176168 it "works" $ runWD $ do
177169 testWidgetStatic (checkBodyText "hello world") $ do
178170 text "hello world"
@@ -233,7 +225,7 @@ tests withDebugging wdConfig caps _selenium = do
233225 click <- button ""
234226 void $ textNode $ TextNodeConfig "initial" $ Just $ "after" <$ click
235227
236− session' "element" $ do
228+ describe "element" $ session' $ do
237229 it "works with domEvent Click" $ runWD $ do
238230 clickedRef <- liftIO $ newRef False
239231 testWidget' (findElemWithRetry $ WD.ByTag "div") WD.click $ do
@@ -297,8 +289,8 @@ tests withDebugging wdConfig caps _selenium = do
297289 let click = domEvent Click e
298290 return ()
299291
300− session' "inputElement" $ do
301− describe "static renderer" $ do
292+ describe "inputElement" $ do
293+ describe "static renderer" $ session' $ do
302294 it "sets value attribute" $ runWD $ do
303295 let checkStatic = do
304296 e <- findElemWithRetry $ WD.ByTag "input"
@@ -355,7 +347,7 @@ tests withDebugging wdConfig caps _selenium = do
355347 & inputElementConfig_initialChecked .~ False
356348 & inputElementConfig_setChecked .~ (True <$ pb)
357349 pure ()
358− describe "hydration" $ do
350+ describe "hydration" $ session' $ do
359351 it "doesn't wipe user input when switching over" $ runWD $ do
360352 inputRef <- newRef ("hello " :: Text)
361353 testWidget'
@@ -593,7 +585,8 @@ tests withDebugging wdConfig caps _selenium = do
593585 el "p" $ dynText $ _inputElement_value e
594586 performEvent_ $ consRef valRef <$> updated (_inputElement_value e)
595587 performEvent_ $ consRef inputRef <$> _inputElement_input e
596− describe "hydration/immediate" $ do
588+
589+ describe "hydration/immediate" $ session' $ do
597590 it "captures user input after switchover" $ runWD $ do
598591 inputRef :: IORef Text <- newRef ""
599592 let checkValue = do
@@ -673,8 +666,8 @@ tests withDebugging wdConfig caps _selenium = do
673666 names <- liftJSM $ traverse File.getName fs
674667 liftIO $ writeRef filesRef names
675668
676− session' "textAreaElement" $ do
677− describe "static renderer" $ do
669+ describe "textAreaElement" $ do
670+ describe "static renderer" $ session' $ do
678671 it "sets value attribute" $ runWD $ do
679672 let checkStatic = do
680673 e <- findElemWithRetry $ WD.ByTag "textarea"
@@ -697,7 +690,7 @@ tests withDebugging wdConfig caps _selenium = do
697690 & textAreaElementConfig_initialValue .~ "test"
698691 & textAreaElementConfig_setValue .~ ("test-updated" <$ pb)
699692 pure ()
700− describe "hydration" $ do
693+ describe "hydration" $ session' $ do
701694 it "doesn't wipe user input when switching over" $ runWD $ do
702695 inputRef <- newRef ("" :: Text)
703696 testWidget'
@@ -846,7 +839,7 @@ tests withDebugging wdConfig caps _selenium = do
846839 e <- textAreaElement $ def & textAreaElementConfig_setValue .~ ("pb" <$ pb)
847840 el "p" $ dynText $ _textAreaElement_value e
848841
849− describe "hydration/immediate" $ do
842+ describe "hydration/immediate" $ session' $ do
850843 it "captures user input after switchover" $ runWD $ do
851844 inputRef :: IORef Text <- newRef ""
852845 let checkValue = do
@@ -888,13 +881,13 @@ tests withDebugging wdConfig caps _selenium = do
888881 performEvent_ $ liftIO . writeRef valueByUIRef <$> _textAreaElement_input e
889882 performEvent_ $ liftIO . writeRef valueRef <$> updated (value e)
890883
891− session' "selectElement" $ do
884+ describe "selectElement" $ do
892885 let options :: DomBuilder t m => m ()
893886 options = do
894887 elAttr "option" ("value" =: "one" <> "id" =: "one") $ text "one"
895888 elAttr "option" ("value" =: "two" <> "id" =: "two") $ text "two"
896889 elAttr "option" ("value" =: "three" <> "id" =: "three") $ text "three"
897− describe "hydration" $ do
890+ describe "hydration" $ session' $ do
898891 it "sets initial value correctly" $ runWD $ do
899892 inputRef <- newRef ("" :: Text)
900893 let setup = do
@@ -968,7 +961,7 @@ tests withDebugging wdConfig caps _selenium = do
968961 performEvent_ $ liftIO . writeRef valueByUIRef <$> _selectElement_change e
969962 performEvent_ $ liftIO . writeRef valueRef <$> updated (_selectElement_value e)
970963
971− describe "hydration/immediate" $ do
964+ describe "hydration/immediate" $ session' $ do
972965 it "captures user input after switchover" $ runWD $ do
973966 inputRef :: IORef Text <- newRef ""
974967 let checkValue = do
@@ -1014,7 +1007,7 @@ tests withDebugging wdConfig caps _selenium = do
10141007 performEvent_ $ liftIO . writeRef valueByUIRef <$> _selectElement_change e
10151008 performEvent_ $ liftIO . writeRef valueRef <$> updated (_selectElement_value e)
10161009
1017− session' "prerender" $ do
1010+ describe "prerender" $ session' $ do
10181011 it "works in simple case" $ runWD $ do
10191012 testWidget (checkBodyText "One") (checkBodyText "Two") $ do
10201013 prerender_ (text "One") (text "Two")
@@ -1083,7 +1076,7 @@ tests withDebugging wdConfig caps _selenium = do
10831076 prerender_ (pure ()) (liftIO $ trigger "Client")
10841077 textNode $ TextNodeConfig "Initial" $ Just e
10851078
1086− session' "namespaces" $ do
1079+ describe "namespaces" $ session' $ do
10871080 it "dyn can be nested in namespaced widget" $ runWD $ do
10881081 testWidget (pure ()) (checkTextInTag "svg" "one") $ do
10891082 let svgRootCfg = def
@@ -1092,7 +1085,7 @@ tests withDebugging wdConfig caps _selenium = do
10921085 void $ element "svg" svgRootCfg $ do
10931086 dyn_ $ text "one" <$ pure ()
10941087
1095− session' "runWithReplace" $ do
1088+ describe "runWithReplace" $ session' $ do
10961089 it "works" $ runWD $ do
10971090 replaceChan :: Chan Text <- liftIO newChan
10981091 let setup = findElemWithRetry $ WD.ByTag "div"
@@ -1290,7 +1283,7 @@ tests withDebugging wdConfig caps _selenium = do
12901283 _ <- runWithReplace (text "inner1") $ el "p" (text "inner2") <$ replace
12911284 text "|after"
12921285
1293− session' "traverseDMapWithKeyWithAdjust" $ do
1286+ describe "traverseDMapWithKeyWithAdjust" $ session' $ do
12941287 let widget :: DomBuilder t m => DKey a -> Identity a -> m (Identity a)
12951288 widget k (Identity v) = elAttr "li" ("id" =: textKey k) $ do
12961289 elClass "span" "key" $ text $ textKey k
@@ -1393,7 +1386,7 @@ tests withDebugging wdConfig caps _selenium = do
13931386 (dmap, _evt) <- traverseDMapWithKeyWithAdjust widget keyMap $ leftmost [postBuildPatch <$ pb, replace]
13941387 liftIO $ dmap `H.shouldBe` keyMap
13951388
1396− session' "traverseIntMapWithKeyWithAdjust" $ do
1389+ describe "traverseIntMapWithKeyWithAdjust" $ session' $ do
13971390 let textKeyInt k = "key" <> T.pack (show k)
13981391 intMap = IntMap.fromList
13991392 [ (1, "one")
@@ -1500,7 +1493,7 @@ tests withDebugging wdConfig caps _selenium = do
15001493 (dmap, _evt) <- traverseIntMapWithKeyWithAdjust widget intMap $ leftmost [postBuildPatch <$ pb, replace]
15011494 liftIO $ dmap `H.shouldBe` intMap
15021495
1503− session' "traverseDMapWithKeyWithAdjustWithMove" $ do
1496+ describe "traverseDMapWithKeyWithAdjustWithMove" $ session' $ do
15041497 let widget :: DomBuilder t m => Key2 a -> Identity a -> m (Identity a)
15051498 widget k (Identity v) = elAttr "li" ("id" =: textKey2 k) $ do
15061499 elClass "span" "key" $ text $ textKey2 k
@@ -1580,8 +1573,8 @@ tests withDebugging wdConfig caps _selenium = do
15801573 (dmap, _evt) <- traverseDMapWithKeyWithAdjustWithMove widget initMap =<< triggerEventWithChan chan
15811574 liftIO $ assertEqual "DMap" initMap dmap
15821575
1583− session' "hydrating invalid HTML" $ do
1584− xit "can hydrate list in paragraph" $ runWD $ do
1576+ describe "hydrating invalid HTML" $ session' $ do
1577+ it "can hydrate list in paragraph" $ runWD $ do
15851578 let preSwitchover = do
15861579 checkBodyText "before\ninner\nafter"
15871580 -- Two <p> tags should be present
@@ -1610,7 +1603,7 @@ tests withDebugging wdConfig caps _selenium = do
16101603 -- TODO: This test presupposes the exact set of labels that "dropdown" places in the "value" fields to distinguish options.
16111604 -- This dependence on internal implementation details is undesirable in a test case, but seems fairly tricky to avoid.
16121605 -- It seems expedient for the time being to expect this test case to be updated, should those implementation details ever change.
1613− session' "dropdown" $ do
1606+ describe "dropdown" $ session' $ do
16141607 let doTest expectedOpts (initialValue :: Text) = do
16151608 let doCheck = do
16161609 es <- findElemsWithRetry $ WD.ByTag "option"
reflex-dom-test-selenium/reflex-dom-test-selenium.cabal+1−1
@@ -15,7 +15,7 @@ library
1515 hs-source-dirs: src
1616 build-depends:
1717 async,
18− base >= 4.7 && < 4.15,
18+ base >= 4.7 && < 4.14,
1919 bytestring == 0.10.*,
2020 chrome-test-utils,
2121 exceptions,
reflex-dom/ChangeLog.md−4
@@ -1,9 +1,5 @@
11# Revision history for reflex-dom
22
3−## 0.6.1.0-r1
4−
5−* Loosen reflex-dom-core version bounds
6−
73## 0.6.1.0
84
95* Update for new dependent-map and dependent-sum (after the "some" package split)
reflex-dom/reflex-dom.cabal+1−1
@@ -74,7 +74,7 @@ library
7474 base >= 4.7 && < 4.15,
7575 bytestring == 0.10.*,
7676 reflex >= 0.8 && < 0.9,
77− reflex-dom-core >= 0.6.1.0 && <0.7,
77+ reflex-dom-core == 0.6.1.0,
7878 text == 1.2.*
7979 if !impl(ghcjs)
8080 if flag(use-warp) && (os(linux) || os(osx))