on develop help sign in
Merge pull request #379 from reflex-frp/eac@test-reflex-dom-reexports

Add CI test to ensure reflex-dom re-exports everything from reflex-dom-core

commit903fbfd090546a50eb78620c4b0db513a3444203 authorElliot Cameron <3noch@users.noreply.github.com> dateMon 11 May 2020, 21:52 (6 years ago) parent1bf9bce8471a42
5 files changed+112−6
reflex-dom/ChangeLog.md+8 reflex-dom/reflex-dom.cabal+9−2 release.nix+13−4 test/default.nix+10 test/reflex-dom-reexports.hs+72
reflex-dom/ChangeLog.md+8
@@ -2,6 +2,14 @@
22
33## Unreleased
44
5+* ([#379](https://github.com/reflex-frp/reflex-dom/pull/379)) Re-export all modules from `reflex-dom-core`. The newly re-exported modules are:
6+ * `Foreign.JavaScript.Utils`
7+ * `Reflex.Dom.Builder.Hydratable`
8+ * `Reflex.Dom.Modals.Class`
9+ * `Reflex.Dom.Prerender`
10+ * `Reflex.Dom.Time`
11+ * `Reflex.Dom.WebSocket.Query`
12+ * `Reflex.Dom.Xhr.FormData`
513* ([#366](https://github.com/reflex-frp/reflex-dom/pull/366)) Bump bounds for `reflex` to include 0.7.
614
715## 0.5.3
reflex-dom/reflex-dom.cabal+9−2
@@ -91,10 +91,12 @@ library
9191 Reflex.Dom
9292 Reflex.Dom.Internal
9393 reexported-modules:
94− Foreign.JavaScript.TH
95− , Foreign.JavaScript.Orphans
94+ Foreign.JavaScript.Orphans
95+ , Foreign.JavaScript.TH
96+ , Foreign.JavaScript.Utils
9697 , Reflex.Dom.Builder.Class
9798 , Reflex.Dom.Builder.Class.Events
99+ , Reflex.Dom.Builder.Hydratable
98100 , Reflex.Dom.Builder.Immediate
99101 , Reflex.Dom.Builder.InputDisabled
100102 , Reflex.Dom.Builder.Static
@@ -102,14 +104,19 @@ library
102104 , Reflex.Dom.Core
103105 , Reflex.Dom.Location
104106 , Reflex.Dom.Main
107+ , Reflex.Dom.Modals.Class
105108 , Reflex.Dom.Old
109+ , Reflex.Dom.Prerender
110+ , Reflex.Dom.Time
106111 , Reflex.Dom.WebSocket
112+ , Reflex.Dom.WebSocket.Query
107113 , Reflex.Dom.Widget
108114 , Reflex.Dom.Widget.Basic
109115 , Reflex.Dom.Widget.Input
110116 , Reflex.Dom.Widget.Lazy
111117 , Reflex.Dom.Widget.Resize
112118 , Reflex.Dom.Xhr
119+ , Reflex.Dom.Xhr.FormData
113120 ghc-options: -Wall -fwarn-tabs -funbox-strict-fields -O2 -ferror-spans
114121 if flag(expose-all-unfoldings)
115122 ghc-options: -fexpose-all-unfoldings
release.nix+13−4
@@ -1,12 +1,14 @@
11{ reflex-platform-fun ? import ./dep/reflex-platform
2+, supportedSystems ? ["x86_64-linux" "x86_64-darwin"]
23}:
34
45let
56 native-reflex-platform = reflex-platform-fun {};
67 inherit (native-reflex-platform.nixpkgs) lib;
7− systems = ["x86_64-linux" "x86_64-darwin"];
88
9− perPlatform = lib.genAttrs systems (system: let
9+ tests = system: import ./test { pkgs = (reflex-platform-fun { inherit system; }).nixpkgs; };
10+
11+ perPlatform = lib.genAttrs supportedSystems (system: let
1012 reflex-platform = reflex-platform-fun { inherit system; };
1113 compilers = [
1214 "ghc"
@@ -25,15 +27,22 @@ let
2527 (self: super: {
2628 _dep = super._dep // {
2729 reflex-dom = builtins.filterSource (path: type: !(builtins.elem (baseNameOf path) [
28− "release.nix"
2930 ".git"
3031 "dist"
32+ "dist-newstyle"
33+ ]) && !(builtins.elem path [
34+ ./CONTRIBUTING.md
35+ ./FAQ.md
36+ ./Quickref.md
37+ ./README.md
38+ ./release.nix
39+ ./test
3140 ])) ./.;
3241 };
3342 })
3443 ];
3544 };
36− all = {
45+ all = tests system // {
3746 inherit (reflex-platform.${ghc})
3847 reflex-dom-core
3948 reflex-dom
test/default.nixnew file+10
@@ -0,0 +1,10 @@
1+{ pkgs ? (import ../dep/reflex-platform {}).nixpkgs }:
2+{
3+ test-reflex-dom-reexports = pkgs.runCommand "test-reflex-dom-reexports" {} (
4+ let
5+ ghc = pkgs.haskellPackages.ghcWithPackages (p: [p.Cabal]);
6+ in ''
7+ ${ghc}/bin/runhaskell ${./reflex-dom-reexports.hs} ${../reflex-dom/reflex-dom.cabal} ${../reflex-dom-core/reflex-dom-core.cabal}
8+ touch "$out"
9+ '');
10+}
test/reflex-dom-reexports.hsnew file+72
@@ -0,0 +1,72 @@
1+-- This tests that reflex-dom re-exports all of reflex-dom-core's modules.
2+-- Without this test they easily drift.
3+module Main where
4+
5+import Control.Monad (when)
6+import Data.List (intercalate)
7+import Data.Maybe (fromMaybe, isNothing, mapMaybe)
8+import qualified Data.Set as Set
9+import Distribution.Types.PackageName (mkPackageName)
10+import Distribution.Compiler (CompilerFlavor (GHC))
11+import Distribution.ModuleName (ModuleName, components)
12+import Distribution.PackageDescription.Parsec (parseGenericPackageDescription)
13+import qualified Distribution.Parsec.Common as Dist
14+import Distribution.Parsec.ParseResult (runParseResult)
15+import qualified Distribution.System as Dist
16+import Distribution.Types.BuildInfo (buildable, defaultExtensions, defaultLanguage, hsSourceDirs, options)
17+import Distribution.Types.CondTree (simplifyCondTree)
18+import Distribution.Types.GenericPackageDescription (ConfVar (Arch, Impl, OS), condLibrary)
19+import Distribution.Types.Library (exposedModules, libBuildInfo, reexportedModules)
20+import Distribution.Types.ModuleReexport (ModuleReexport, moduleReexportOriginalName, moduleReexportOriginalPackage)
21+import Distribution.Utils.Generic (toUTF8BS, readUTF8File)
22+import System.Environment (getArgs)
23+import qualified System.Info
24+
25+main :: IO ()
26+main = do
27+ [reflexDomFile, reflexDomCoreFile] <- getArgs
28+ (_, reflexDomReexports) <- parseCabalExports reflexDomFile
29+ (reflexDomCoreExports', _) <- parseCabalExports reflexDomCoreFile
30+
31+ let
32+ reflexDomCoreExports = Set.fromList reflexDomCoreExports'
33+ reflexDomCorePackageName = mkPackageName "reflex-dom-core"
34+ reflexDomReexportsFromCore
35+ = Set.fromList
36+ $ mapMaybe (\x -> if let origPackage = moduleReexportOriginalPackage x
37+ in isNothing origPackage || origPackage == Just reflexDomCorePackageName
38+ then Just $ moduleReexportOriginalName x
39+ else Nothing
40+ )
41+ reflexDomReexports
42+
43+ when (reflexDomCoreExports /= reflexDomReexportsFromCore) $ do
44+ error $ intercalate "\n\t"
45+ $ "reflex-dom does not re-export the following modules from reflex-dom-core:"
46+ : map
47+ (intercalate "." . components)
48+ (Set.toAscList $ reflexDomCoreExports `Set.difference` reflexDomReexportsFromCore)
49+
50+ putStrLn "Test passed."
51+
52+parseCabalExports :: FilePath -> IO ([ModuleName], [ModuleReexport])
53+parseCabalExports file = do
54+ contents <- readUTF8File file
55+ let
56+ (warnings, result) = runParseResult $ parseGenericPackageDescription $ toUTF8BS contents
57+ osConfVar = case System.Info.os of
58+ "linux" -> Just Dist.Linux
59+ "darwin" -> Just Dist.OSX
60+ _ -> error "Unrecgonized System.Info.os"
61+ archConfVar = Just Dist.X86_64
62+ evalConfVar v = Right $ case v of
63+ OS osVar -> Just osVar == osConfVar
64+ Arch archVar -> Just archVar == archConfVar
65+ Impl GHC _ -> True
66+ _ -> False
67+ pure $ case condLibrary <$> result of
68+ Right (Just condLib) ->
69+ let (_, lib) = simplifyCondTree evalConfVar condLib
70+ in (exposedModules lib, reexportedModules lib)
71+ Right Nothing -> error $ "Haskell package has no library component: " <> file
72+ Left (_, errors) -> error $ "Failed to parse " <> file <> ":\n" <> unlines (map show errors)