diff --git a/test-fixtures/monorepo/1161-regression/package-b/spago.yaml b/test-fixtures/monorepo/1161-regression/package-b/spago.yaml new file mode 100644 index 000000000..d6279c6b9 --- /dev/null +++ b/test-fixtures/monorepo/1161-regression/package-b/spago.yaml @@ -0,0 +1,11 @@ +package: + name: package-b + dependencies: + - either + - prelude + test: + main: Test.PACKAGE.B + dependencies: + - console + - effect + - prelude diff --git a/test-fixtures/monorepo/1161-regression/package-b/src/Main.purs b/test-fixtures/monorepo/1161-regression/package-b/src/Main.purs new file mode 100644 index 000000000..f490a800c --- /dev/null +++ b/test-fixtures/monorepo/1161-regression/package-b/src/Main.purs @@ -0,0 +1,10 @@ +module Src.PACKAGE.B where + +import Prelude +import Data.Either + +libraryUsage :: String +libraryUsage = packageNameValue <> EITHER.packageNameValue + +packageNameValue :: String +packageNameValue = "package name " <> "package-b" \ No newline at end of file diff --git a/test-fixtures/monorepo/1161-regression/package-b/test/Main.purs b/test-fixtures/monorepo/1161-regression/package-b/test/Main.purs new file mode 100644 index 000000000..47c8ab24d --- /dev/null +++ b/test-fixtures/monorepo/1161-regression/package-b/test/Main.purs @@ -0,0 +1,12 @@ +module Test.PACKAGE.B where + +import Prelude + +import Effect (Effect) +import Effect.Console (log) +import Src.PACKAGE.B as PACKAGE.B +import Data.Either + +main :: Effect Unit +main = do + log $ "Test for " <> PACKAGE.B.packageNameValue <> EITHER.packageNameValue \ No newline at end of file diff --git a/test-fixtures/monorepo/1161-regression/spago.yaml b/test-fixtures/monorepo/1161-regression/spago.yaml new file mode 100644 index 000000000..a68310db0 --- /dev/null +++ b/test-fixtures/monorepo/1161-regression/spago.yaml @@ -0,0 +1,18 @@ +package: + name: root + dependencies: [] + test: + main: Test.Main + dependencies: [] +workspace: + package_set: + registry: 20.0.1 + extra_packages: + either: + git: https://github.com/purescript/purescript-either.git + ref: af655a04ed2fd694b6688af39ee20d7907ad0763 + dependencies: + - control + - invariant + - maybe + - prelude diff --git a/test-fixtures/monorepo/case1-independent-packages/package-a/spago.yaml b/test-fixtures/monorepo/case1-independent-packages/package-a/spago.yaml new file mode 100644 index 000000000..04b43dfd7 --- /dev/null +++ b/test-fixtures/monorepo/case1-independent-packages/package-a/spago.yaml @@ -0,0 +1,10 @@ +package: + name: package-a + dependencies: + - prelude + test: + main: Test.PACKAGE.A + dependencies: + - console + - effect + - prelude diff --git a/test-fixtures/monorepo/case1-independent-packages/package-a/src/Main.purs b/test-fixtures/monorepo/case1-independent-packages/package-a/src/Main.purs new file mode 100644 index 000000000..7fd43c0ea --- /dev/null +++ b/test-fixtures/monorepo/case1-independent-packages/package-a/src/Main.purs @@ -0,0 +1,9 @@ +module Src.PACKAGE.A where + +import Prelude + +libraryUsage :: String +libraryUsage = packageNameValue <> "no deps" + +packageNameValue :: String +packageNameValue = "package name " <> "package-a" \ No newline at end of file diff --git a/test-fixtures/monorepo/case1-independent-packages/package-a/test/Main.purs b/test-fixtures/monorepo/case1-independent-packages/package-a/test/Main.purs new file mode 100644 index 000000000..6a1f7f3a4 --- /dev/null +++ b/test-fixtures/monorepo/case1-independent-packages/package-a/test/Main.purs @@ -0,0 +1,11 @@ +module Test.PACKAGE.A where + +import Prelude + +import Effect (Effect) +import Effect.Console (log) +import Src.PACKAGE.A as PACKAGE.A + +main :: Effect Unit +main = do + log $ "Test for " <> PACKAGE.A.packageNameValue <> "no deps" \ No newline at end of file diff --git a/test-fixtures/monorepo/case1-independent-packages/package-b/spago.yaml b/test-fixtures/monorepo/case1-independent-packages/package-b/spago.yaml new file mode 100644 index 000000000..88a98b1bf --- /dev/null +++ b/test-fixtures/monorepo/case1-independent-packages/package-b/spago.yaml @@ -0,0 +1,10 @@ +package: + name: package-b + dependencies: + - prelude + test: + main: Test.PACKAGE.B + dependencies: + - console + - effect + - prelude diff --git a/test-fixtures/monorepo/case1-independent-packages/package-b/src/Main.purs b/test-fixtures/monorepo/case1-independent-packages/package-b/src/Main.purs new file mode 100644 index 000000000..7558e51e6 --- /dev/null +++ b/test-fixtures/monorepo/case1-independent-packages/package-b/src/Main.purs @@ -0,0 +1,9 @@ +module Src.PACKAGE.B where + +import Prelude + +libraryUsage :: String +libraryUsage = packageNameValue <> "no deps" + +packageNameValue :: String +packageNameValue = "package name " <> "package-b" \ No newline at end of file diff --git a/test-fixtures/monorepo/case1-independent-packages/package-b/test/Main.purs b/test-fixtures/monorepo/case1-independent-packages/package-b/test/Main.purs new file mode 100644 index 000000000..19d1bfe81 --- /dev/null +++ b/test-fixtures/monorepo/case1-independent-packages/package-b/test/Main.purs @@ -0,0 +1,11 @@ +module Test.PACKAGE.B where + +import Prelude + +import Effect (Effect) +import Effect.Console (log) +import Src.PACKAGE.B as PACKAGE.B + +main :: Effect Unit +main = do + log $ "Test for " <> PACKAGE.B.packageNameValue <> "no deps" \ No newline at end of file diff --git a/test-fixtures/monorepo/case1-independent-packages/package-c/spago.yaml b/test-fixtures/monorepo/case1-independent-packages/package-c/spago.yaml new file mode 100644 index 000000000..20eeeb986 --- /dev/null +++ b/test-fixtures/monorepo/case1-independent-packages/package-c/spago.yaml @@ -0,0 +1,10 @@ +package: + name: package-c + dependencies: + - prelude + test: + main: Test.PACKAGE.C + dependencies: + - console + - effect + - prelude diff --git a/test-fixtures/monorepo/case1-independent-packages/package-c/src/Main.purs b/test-fixtures/monorepo/case1-independent-packages/package-c/src/Main.purs new file mode 100644 index 000000000..a47e1e349 --- /dev/null +++ b/test-fixtures/monorepo/case1-independent-packages/package-c/src/Main.purs @@ -0,0 +1,9 @@ +module Src.PACKAGE.C where + +import Prelude + +libraryUsage :: String +libraryUsage = packageNameValue <> "no deps" + +packageNameValue :: String +packageNameValue = "package name " <> "package-c" \ No newline at end of file diff --git a/test-fixtures/monorepo/case1-independent-packages/package-c/test/Main.purs b/test-fixtures/monorepo/case1-independent-packages/package-c/test/Main.purs new file mode 100644 index 000000000..230f3e809 --- /dev/null +++ b/test-fixtures/monorepo/case1-independent-packages/package-c/test/Main.purs @@ -0,0 +1,11 @@ +module Test.PACKAGE.C where + +import Prelude + +import Effect (Effect) +import Effect.Console (log) +import Src.PACKAGE.C as PACKAGE.C + +main :: Effect Unit +main = do + log $ "Test for " <> PACKAGE.C.packageNameValue <> "no deps" \ No newline at end of file diff --git a/test-fixtures/monorepo/case1-independent-packages/spago.yaml b/test-fixtures/monorepo/case1-independent-packages/spago.yaml new file mode 100644 index 000000000..8b53e2798 --- /dev/null +++ b/test-fixtures/monorepo/case1-independent-packages/spago.yaml @@ -0,0 +1,4 @@ +workspace: + package_set: + registry: 0.0.1 + extra_packages: {} diff --git a/test-fixtures/monorepo/case2-shared-dependencies1/package-a/spago.yaml b/test-fixtures/monorepo/case2-shared-dependencies1/package-a/spago.yaml new file mode 100644 index 000000000..2f4f971e4 --- /dev/null +++ b/test-fixtures/monorepo/case2-shared-dependencies1/package-a/spago.yaml @@ -0,0 +1,11 @@ +package: + name: package-a + dependencies: + - package-shared + - prelude + test: + main: Test.PACKAGE.A + dependencies: + - console + - effect + - prelude diff --git a/test-fixtures/monorepo/case2-shared-dependencies1/package-a/src/Main.purs b/test-fixtures/monorepo/case2-shared-dependencies1/package-a/src/Main.purs new file mode 100644 index 000000000..dbe5bbad5 --- /dev/null +++ b/test-fixtures/monorepo/case2-shared-dependencies1/package-a/src/Main.purs @@ -0,0 +1,10 @@ +module Src.PACKAGE.A where + +import Prelude +import Src.PACKAGE.SHARED as PACKAGE.SHARED + +libraryUsage :: String +libraryUsage = packageNameValue <> PACKAGE.SHARED.packageNameValue + +packageNameValue :: String +packageNameValue = "package name " <> "package-a" \ No newline at end of file diff --git a/test-fixtures/monorepo/case2-shared-dependencies1/package-a/test/Main.purs b/test-fixtures/monorepo/case2-shared-dependencies1/package-a/test/Main.purs new file mode 100644 index 000000000..a4ba880cd --- /dev/null +++ b/test-fixtures/monorepo/case2-shared-dependencies1/package-a/test/Main.purs @@ -0,0 +1,12 @@ +module Test.PACKAGE.A where + +import Prelude + +import Effect (Effect) +import Effect.Console (log) +import Src.PACKAGE.A as PACKAGE.A +import Src.PACKAGE.SHARED as PACKAGE.SHARED + +main :: Effect Unit +main = do + log $ "Test for " <> PACKAGE.A.packageNameValue <> PACKAGE.SHARED.packageNameValue \ No newline at end of file diff --git a/test-fixtures/monorepo/case2-shared-dependencies1/package-b/spago.yaml b/test-fixtures/monorepo/case2-shared-dependencies1/package-b/spago.yaml new file mode 100644 index 000000000..fcc554478 --- /dev/null +++ b/test-fixtures/monorepo/case2-shared-dependencies1/package-b/spago.yaml @@ -0,0 +1,11 @@ +package: + name: package-b + dependencies: + - package-shared + - prelude + test: + main: Test.PACKAGE.B + dependencies: + - console + - effect + - prelude diff --git a/test-fixtures/monorepo/case2-shared-dependencies1/package-b/src/Main.purs b/test-fixtures/monorepo/case2-shared-dependencies1/package-b/src/Main.purs new file mode 100644 index 000000000..a9d016887 --- /dev/null +++ b/test-fixtures/monorepo/case2-shared-dependencies1/package-b/src/Main.purs @@ -0,0 +1,10 @@ +module Src.PACKAGE.B where + +import Prelude +import Src.PACKAGE.SHARED as PACKAGE.SHARED + +libraryUsage :: String +libraryUsage = packageNameValue <> PACKAGE.SHARED.packageNameValue + +packageNameValue :: String +packageNameValue = "package name " <> "package-b" \ No newline at end of file diff --git a/test-fixtures/monorepo/case2-shared-dependencies1/package-b/test/Main.purs b/test-fixtures/monorepo/case2-shared-dependencies1/package-b/test/Main.purs new file mode 100644 index 000000000..5021a4b0f --- /dev/null +++ b/test-fixtures/monorepo/case2-shared-dependencies1/package-b/test/Main.purs @@ -0,0 +1,12 @@ +module Test.PACKAGE.B where + +import Prelude + +import Effect (Effect) +import Effect.Console (log) +import Src.PACKAGE.B as PACKAGE.B +import Src.PACKAGE.SHARED as PACKAGE.SHARED + +main :: Effect Unit +main = do + log $ "Test for " <> PACKAGE.B.packageNameValue <> PACKAGE.SHARED.packageNameValue \ No newline at end of file diff --git a/test-fixtures/monorepo/case2-shared-dependencies1/package-shared/spago.yaml b/test-fixtures/monorepo/case2-shared-dependencies1/package-shared/spago.yaml new file mode 100644 index 000000000..570609122 --- /dev/null +++ b/test-fixtures/monorepo/case2-shared-dependencies1/package-shared/spago.yaml @@ -0,0 +1,10 @@ +package: + name: package-shared + dependencies: + - prelude + test: + main: Test.PACKAGE.SHARED + dependencies: + - console + - effect + - prelude diff --git a/test-fixtures/monorepo/case2-shared-dependencies1/package-shared/src/Main.purs b/test-fixtures/monorepo/case2-shared-dependencies1/package-shared/src/Main.purs new file mode 100644 index 000000000..7e3b24fa5 --- /dev/null +++ b/test-fixtures/monorepo/case2-shared-dependencies1/package-shared/src/Main.purs @@ -0,0 +1,9 @@ +module Src.PACKAGE.SHARED where + +import Prelude + +libraryUsage :: String +libraryUsage = packageNameValue <> "no deps" + +packageNameValue :: String +packageNameValue = "package name " <> "package-shared" \ No newline at end of file diff --git a/test-fixtures/monorepo/case2-shared-dependencies1/spago.yaml b/test-fixtures/monorepo/case2-shared-dependencies1/spago.yaml new file mode 100644 index 000000000..8b53e2798 --- /dev/null +++ b/test-fixtures/monorepo/case2-shared-dependencies1/spago.yaml @@ -0,0 +1,4 @@ +workspace: + package_set: + registry: 0.0.1 + extra_packages: {} diff --git a/test-fixtures/monorepo/case3-shared-dependencies2/package-a/spago.yaml b/test-fixtures/monorepo/case3-shared-dependencies2/package-a/spago.yaml new file mode 100644 index 000000000..8e34d2355 --- /dev/null +++ b/test-fixtures/monorepo/case3-shared-dependencies2/package-a/spago.yaml @@ -0,0 +1,12 @@ +package: + name: package-a + dependencies: + - package-b + - package-c + - prelude + test: + main: Test.PACKAGE.A + dependencies: + - console + - effect + - prelude diff --git a/test-fixtures/monorepo/case3-shared-dependencies2/package-a/src/Main.purs b/test-fixtures/monorepo/case3-shared-dependencies2/package-a/src/Main.purs new file mode 100644 index 000000000..faa40c606 --- /dev/null +++ b/test-fixtures/monorepo/case3-shared-dependencies2/package-a/src/Main.purs @@ -0,0 +1,11 @@ +module Src.PACKAGE.A where + +import Prelude +import Src.PACKAGE.C as PACKAGE.C +import Src.PACKAGE.B as PACKAGE.B + +libraryUsage :: String +libraryUsage = packageNameValue <> PACKAGE.C.packageNameValue <> PACKAGE.B.packageNameValue + +packageNameValue :: String +packageNameValue = "package name " <> "package-a" \ No newline at end of file diff --git a/test-fixtures/monorepo/case3-shared-dependencies2/package-a/test/Main.purs b/test-fixtures/monorepo/case3-shared-dependencies2/package-a/test/Main.purs new file mode 100644 index 000000000..72d7e61a1 --- /dev/null +++ b/test-fixtures/monorepo/case3-shared-dependencies2/package-a/test/Main.purs @@ -0,0 +1,13 @@ +module Test.PACKAGE.A where + +import Prelude + +import Effect (Effect) +import Effect.Console (log) +import Src.PACKAGE.A as PACKAGE.A +import Src.PACKAGE.C as PACKAGE.C +import Src.PACKAGE.B as PACKAGE.B + +main :: Effect Unit +main = do + log $ "Test for " <> PACKAGE.A.packageNameValue <> PACKAGE.C.packageNameValue <> PACKAGE.B.packageNameValue \ No newline at end of file diff --git a/test-fixtures/monorepo/case3-shared-dependencies2/package-b/spago.yaml b/test-fixtures/monorepo/case3-shared-dependencies2/package-b/spago.yaml new file mode 100644 index 000000000..db3bfa76f --- /dev/null +++ b/test-fixtures/monorepo/case3-shared-dependencies2/package-b/spago.yaml @@ -0,0 +1,11 @@ +package: + name: package-b + dependencies: + - package-c + - prelude + test: + main: Test.PACKAGE.B + dependencies: + - console + - effect + - prelude diff --git a/test-fixtures/monorepo/case3-shared-dependencies2/package-b/src/Main.purs b/test-fixtures/monorepo/case3-shared-dependencies2/package-b/src/Main.purs new file mode 100644 index 000000000..aa6b0659f --- /dev/null +++ b/test-fixtures/monorepo/case3-shared-dependencies2/package-b/src/Main.purs @@ -0,0 +1,10 @@ +module Src.PACKAGE.B where + +import Prelude +import Src.PACKAGE.C as PACKAGE.C + +libraryUsage :: String +libraryUsage = packageNameValue <> PACKAGE.C.packageNameValue + +packageNameValue :: String +packageNameValue = "package name " <> "package-b" \ No newline at end of file diff --git a/test-fixtures/monorepo/case3-shared-dependencies2/package-b/test/Main.purs b/test-fixtures/monorepo/case3-shared-dependencies2/package-b/test/Main.purs new file mode 100644 index 000000000..366ea2ea3 --- /dev/null +++ b/test-fixtures/monorepo/case3-shared-dependencies2/package-b/test/Main.purs @@ -0,0 +1,12 @@ +module Test.PACKAGE.B where + +import Prelude + +import Effect (Effect) +import Effect.Console (log) +import Src.PACKAGE.B as PACKAGE.B +import Src.PACKAGE.C as PACKAGE.C + +main :: Effect Unit +main = do + log $ "Test for " <> PACKAGE.B.packageNameValue <> PACKAGE.C.packageNameValue \ No newline at end of file diff --git a/test-fixtures/monorepo/case3-shared-dependencies2/package-c/spago.yaml b/test-fixtures/monorepo/case3-shared-dependencies2/package-c/spago.yaml new file mode 100644 index 000000000..20eeeb986 --- /dev/null +++ b/test-fixtures/monorepo/case3-shared-dependencies2/package-c/spago.yaml @@ -0,0 +1,10 @@ +package: + name: package-c + dependencies: + - prelude + test: + main: Test.PACKAGE.C + dependencies: + - console + - effect + - prelude diff --git a/test-fixtures/monorepo/case3-shared-dependencies2/package-c/src/Main.purs b/test-fixtures/monorepo/case3-shared-dependencies2/package-c/src/Main.purs new file mode 100644 index 000000000..a47e1e349 --- /dev/null +++ b/test-fixtures/monorepo/case3-shared-dependencies2/package-c/src/Main.purs @@ -0,0 +1,9 @@ +module Src.PACKAGE.C where + +import Prelude + +libraryUsage :: String +libraryUsage = packageNameValue <> "no deps" + +packageNameValue :: String +packageNameValue = "package name " <> "package-c" \ No newline at end of file diff --git a/test-fixtures/monorepo/case3-shared-dependencies2/spago.yaml b/test-fixtures/monorepo/case3-shared-dependencies2/spago.yaml new file mode 100644 index 000000000..8b53e2798 --- /dev/null +++ b/test-fixtures/monorepo/case3-shared-dependencies2/spago.yaml @@ -0,0 +1,4 @@ +workspace: + package_set: + registry: 0.0.1 + extra_packages: {} diff --git a/test-fixtures/monorepo/ensure-ranges-no-root-package/non-root-package-a/spago.yaml b/test-fixtures/monorepo/ensure-ranges-no-root-package/non-root-package-a/spago.yaml new file mode 100644 index 000000000..381f18bfe --- /dev/null +++ b/test-fixtures/monorepo/ensure-ranges-no-root-package/non-root-package-a/spago.yaml @@ -0,0 +1,4 @@ +package: + name: non-root-package-a + dependencies: + - prelude diff --git a/test-fixtures/monorepo/ensure-ranges-no-root-package/non-root-package-a/src/Main.purs b/test-fixtures/monorepo/ensure-ranges-no-root-package/non-root-package-a/src/Main.purs new file mode 100644 index 000000000..e2499ed8f --- /dev/null +++ b/test-fixtures/monorepo/ensure-ranges-no-root-package/non-root-package-a/src/Main.purs @@ -0,0 +1,6 @@ +module Subpackage.NON.ROOT.PACKAGE.A where + +import Prelude + +packageName :: String +packageName = "package" <> "non-root-package-a" \ No newline at end of file diff --git a/test-fixtures/monorepo/ensure-ranges-no-root-package/non-root-package-b/spago.yaml b/test-fixtures/monorepo/ensure-ranges-no-root-package/non-root-package-b/spago.yaml new file mode 100644 index 000000000..d294f8c28 --- /dev/null +++ b/test-fixtures/monorepo/ensure-ranges-no-root-package/non-root-package-b/spago.yaml @@ -0,0 +1,4 @@ +package: + name: non-root-package-b + dependencies: + - prelude diff --git a/test-fixtures/monorepo/ensure-ranges-no-root-package/non-root-package-b/src/Main.purs b/test-fixtures/monorepo/ensure-ranges-no-root-package/non-root-package-b/src/Main.purs new file mode 100644 index 000000000..42a4da81b --- /dev/null +++ b/test-fixtures/monorepo/ensure-ranges-no-root-package/non-root-package-b/src/Main.purs @@ -0,0 +1,6 @@ +module Subpackage.NON.ROOT.PACKAGE.B where + +import Prelude + +packageName :: String +packageName = "package" <> "non-root-package-b" \ No newline at end of file diff --git a/test-fixtures/monorepo/ensure-ranges-no-root-package/spago.yaml b/test-fixtures/monorepo/ensure-ranges-no-root-package/spago.yaml new file mode 100644 index 000000000..8b53e2798 --- /dev/null +++ b/test-fixtures/monorepo/ensure-ranges-no-root-package/spago.yaml @@ -0,0 +1,4 @@ +workspace: + package_set: + registry: 0.0.1 + extra_packages: {} diff --git a/test-fixtures/monorepo/ensure-ranges-root-package/non-root-package-a/spago.yaml b/test-fixtures/monorepo/ensure-ranges-root-package/non-root-package-a/spago.yaml new file mode 100644 index 000000000..381f18bfe --- /dev/null +++ b/test-fixtures/monorepo/ensure-ranges-root-package/non-root-package-a/spago.yaml @@ -0,0 +1,4 @@ +package: + name: non-root-package-a + dependencies: + - prelude diff --git a/test-fixtures/monorepo/ensure-ranges-root-package/non-root-package-a/src/Main.purs b/test-fixtures/monorepo/ensure-ranges-root-package/non-root-package-a/src/Main.purs new file mode 100644 index 000000000..e2499ed8f --- /dev/null +++ b/test-fixtures/monorepo/ensure-ranges-root-package/non-root-package-a/src/Main.purs @@ -0,0 +1,6 @@ +module Subpackage.NON.ROOT.PACKAGE.A where + +import Prelude + +packageName :: String +packageName = "package" <> "non-root-package-a" \ No newline at end of file diff --git a/test-fixtures/monorepo/ensure-ranges-root-package/non-root-package-b/spago.yaml b/test-fixtures/monorepo/ensure-ranges-root-package/non-root-package-b/spago.yaml new file mode 100644 index 000000000..d294f8c28 --- /dev/null +++ b/test-fixtures/monorepo/ensure-ranges-root-package/non-root-package-b/spago.yaml @@ -0,0 +1,4 @@ +package: + name: non-root-package-b + dependencies: + - prelude diff --git a/test-fixtures/monorepo/ensure-ranges-root-package/non-root-package-b/src/Main.purs b/test-fixtures/monorepo/ensure-ranges-root-package/non-root-package-b/src/Main.purs new file mode 100644 index 000000000..42a4da81b --- /dev/null +++ b/test-fixtures/monorepo/ensure-ranges-root-package/non-root-package-b/src/Main.purs @@ -0,0 +1,6 @@ +module Subpackage.NON.ROOT.PACKAGE.B where + +import Prelude + +packageName :: String +packageName = "package" <> "non-root-package-b" \ No newline at end of file diff --git a/test-fixtures/monorepo/ensure-ranges-root-package/spago.yaml b/test-fixtures/monorepo/ensure-ranges-root-package/spago.yaml new file mode 100644 index 000000000..91847eb3e --- /dev/null +++ b/test-fixtures/monorepo/ensure-ranges-root-package/spago.yaml @@ -0,0 +1,13 @@ +package: + name: 7368613235362d69416e687077724e7736334c56644e794374 + dependencies: + - console: ">=6.0.0 <7.0.0" + - effect: ">=4.0.0 <5.0.0" + - prelude: ">=6.0.1 <7.0.0" + test: + main: Test.Main + dependencies: [] +workspace: + package_set: + registry: 0.0.1 + extra_packages: {} diff --git a/test-fixtures/monorepo/ensure-ranges-root-package/src/Main.purs b/test-fixtures/monorepo/ensure-ranges-root-package/src/Main.purs new file mode 100644 index 000000000..a4363b879 --- /dev/null +++ b/test-fixtures/monorepo/ensure-ranges-root-package/src/Main.purs @@ -0,0 +1,11 @@ +module Main where + +import Prelude + +import Effect (Effect) +import Effect.Console (log) + +main :: Effect Unit +main = do + log "🍝" + diff --git a/test-fixtures/monorepo/ensure-ranges-root-package/test/Test/Main.purs b/test-fixtures/monorepo/ensure-ranges-root-package/test/Test/Main.purs new file mode 100644 index 000000000..e6169302e --- /dev/null +++ b/test-fixtures/monorepo/ensure-ranges-root-package/test/Test/Main.purs @@ -0,0 +1,12 @@ +module Test.Main where + +import Prelude + +import Effect (Effect) +import Effect.Class.Console (log) + +main :: Effect Unit +main = do + log "🍕" + log "You should add some tests." + diff --git a/test-fixtures/monorepo/pedantic-config/package-a/spago.yaml b/test-fixtures/monorepo/pedantic-config/package-a/spago.yaml new file mode 100644 index 000000000..2b69e1588 --- /dev/null +++ b/test-fixtures/monorepo/pedantic-config/package-a/spago.yaml @@ -0,0 +1,14 @@ +package: + name: package-a + dependencies: + - control + - prelude + - tuples + build: + pedantic_packages: true + test: + main: Test.PACKAGE.A + dependencies: + - control + - either + - prelude diff --git a/test-fixtures/monorepo/pedantic-config/package-a/src/Main.purs b/test-fixtures/monorepo/pedantic-config/package-a/src/Main.purs new file mode 100644 index 000000000..ffe5d911d --- /dev/null +++ b/test-fixtures/monorepo/pedantic-config/package-a/src/Main.purs @@ -0,0 +1,8 @@ +module Src.PACKAGE.A where + +import Prelude +import Control.Alt as Control +import Data.Newtype as Newtype + +packageName :: String +packageName = "package" <> "package-a" \ No newline at end of file diff --git a/test-fixtures/monorepo/pedantic-config/package-a/test/Main.purs b/test-fixtures/monorepo/pedantic-config/package-a/test/Main.purs new file mode 100644 index 000000000..254b4bc44 --- /dev/null +++ b/test-fixtures/monorepo/pedantic-config/package-a/test/Main.purs @@ -0,0 +1,8 @@ +module Test.PACKAGE.A where + +import Prelude +import Control.Alt as Control +import Safe.Coerce as Coerce + +packageName :: String +packageName = "package" <> "package-a" \ No newline at end of file diff --git a/test-fixtures/monorepo/pedantic-config/package-b/spago.yaml b/test-fixtures/monorepo/pedantic-config/package-b/spago.yaml new file mode 100644 index 000000000..1cf787de0 --- /dev/null +++ b/test-fixtures/monorepo/pedantic-config/package-b/spago.yaml @@ -0,0 +1,13 @@ +package: + name: package-b + dependencies: + - control + - prelude + - tuples + test: + main: Test.PACKAGE.B + pedantic_packages: true + dependencies: + - control + - either + - prelude diff --git a/test-fixtures/monorepo/pedantic-config/package-b/src/Main.purs b/test-fixtures/monorepo/pedantic-config/package-b/src/Main.purs new file mode 100644 index 000000000..c87611083 --- /dev/null +++ b/test-fixtures/monorepo/pedantic-config/package-b/src/Main.purs @@ -0,0 +1,8 @@ +module Src.PACKAGE.B where + +import Prelude +import Control.Alt as Control +import Data.Newtype as Newtype + +packageName :: String +packageName = "package" <> "package-b" \ No newline at end of file diff --git a/test-fixtures/monorepo/pedantic-config/package-b/test/Main.purs b/test-fixtures/monorepo/pedantic-config/package-b/test/Main.purs new file mode 100644 index 000000000..f61b04dd1 --- /dev/null +++ b/test-fixtures/monorepo/pedantic-config/package-b/test/Main.purs @@ -0,0 +1,8 @@ +module Test.PACKAGE.B where + +import Prelude +import Control.Alt as Control +import Safe.Coerce as Coerce + +packageName :: String +packageName = "package" <> "package-b" \ No newline at end of file diff --git a/test-fixtures/monorepo/pedantic-config/package-c/spago.yaml b/test-fixtures/monorepo/pedantic-config/package-c/spago.yaml new file mode 100644 index 000000000..e8ef8c33f --- /dev/null +++ b/test-fixtures/monorepo/pedantic-config/package-c/spago.yaml @@ -0,0 +1,15 @@ +package: + name: package-c + dependencies: + - control + - prelude + - tuples + build: + pedantic_packages: true + test: + main: Test.PACKAGE.C + pedantic_packages: true + dependencies: + - control + - either + - prelude diff --git a/test-fixtures/monorepo/pedantic-config/package-c/src/Main.purs b/test-fixtures/monorepo/pedantic-config/package-c/src/Main.purs new file mode 100644 index 000000000..0762c9efb --- /dev/null +++ b/test-fixtures/monorepo/pedantic-config/package-c/src/Main.purs @@ -0,0 +1,8 @@ +module Src.PACKAGE.C where + +import Prelude +import Control.Alt as Control +import Data.Newtype as Newtype + +packageName :: String +packageName = "package" <> "package-c" \ No newline at end of file diff --git a/test-fixtures/monorepo/pedantic-config/package-c/test/Main.purs b/test-fixtures/monorepo/pedantic-config/package-c/test/Main.purs new file mode 100644 index 000000000..0eb64302f --- /dev/null +++ b/test-fixtures/monorepo/pedantic-config/package-c/test/Main.purs @@ -0,0 +1,8 @@ +module Test.PACKAGE.C where + +import Prelude +import Control.Alt as Control +import Safe.Coerce as Coerce + +packageName :: String +packageName = "package" <> "package-c" \ No newline at end of file diff --git a/test-fixtures/monorepo/pedantic-config/spago.yaml b/test-fixtures/monorepo/pedantic-config/spago.yaml new file mode 100644 index 000000000..8b53e2798 --- /dev/null +++ b/test-fixtures/monorepo/pedantic-config/spago.yaml @@ -0,0 +1,4 @@ +workspace: + package_set: + registry: 0.0.1 + extra_packages: {} diff --git a/test-fixtures/monorepo/pedantic-flag/package-a/spago.yaml b/test-fixtures/monorepo/pedantic-flag/package-a/spago.yaml new file mode 100644 index 000000000..2b69e1588 --- /dev/null +++ b/test-fixtures/monorepo/pedantic-flag/package-a/spago.yaml @@ -0,0 +1,14 @@ +package: + name: package-a + dependencies: + - control + - prelude + - tuples + build: + pedantic_packages: true + test: + main: Test.PACKAGE.A + dependencies: + - control + - either + - prelude diff --git a/test-fixtures/monorepo/pedantic-flag/package-a/src/Main.purs b/test-fixtures/monorepo/pedantic-flag/package-a/src/Main.purs new file mode 100644 index 000000000..ffe5d911d --- /dev/null +++ b/test-fixtures/monorepo/pedantic-flag/package-a/src/Main.purs @@ -0,0 +1,8 @@ +module Src.PACKAGE.A where + +import Prelude +import Control.Alt as Control +import Data.Newtype as Newtype + +packageName :: String +packageName = "package" <> "package-a" \ No newline at end of file diff --git a/test-fixtures/monorepo/pedantic-flag/package-a/test/Main.purs b/test-fixtures/monorepo/pedantic-flag/package-a/test/Main.purs new file mode 100644 index 000000000..254b4bc44 --- /dev/null +++ b/test-fixtures/monorepo/pedantic-flag/package-a/test/Main.purs @@ -0,0 +1,8 @@ +module Test.PACKAGE.A where + +import Prelude +import Control.Alt as Control +import Safe.Coerce as Coerce + +packageName :: String +packageName = "package" <> "package-a" \ No newline at end of file diff --git a/test-fixtures/monorepo/pedantic-flag/package-b/spago.yaml b/test-fixtures/monorepo/pedantic-flag/package-b/spago.yaml new file mode 100644 index 000000000..1cf787de0 --- /dev/null +++ b/test-fixtures/monorepo/pedantic-flag/package-b/spago.yaml @@ -0,0 +1,13 @@ +package: + name: package-b + dependencies: + - control + - prelude + - tuples + test: + main: Test.PACKAGE.B + pedantic_packages: true + dependencies: + - control + - either + - prelude diff --git a/test-fixtures/monorepo/pedantic-flag/package-b/src/Main.purs b/test-fixtures/monorepo/pedantic-flag/package-b/src/Main.purs new file mode 100644 index 000000000..c87611083 --- /dev/null +++ b/test-fixtures/monorepo/pedantic-flag/package-b/src/Main.purs @@ -0,0 +1,8 @@ +module Src.PACKAGE.B where + +import Prelude +import Control.Alt as Control +import Data.Newtype as Newtype + +packageName :: String +packageName = "package" <> "package-b" \ No newline at end of file diff --git a/test-fixtures/monorepo/pedantic-flag/package-b/test/Main.purs b/test-fixtures/monorepo/pedantic-flag/package-b/test/Main.purs new file mode 100644 index 000000000..f61b04dd1 --- /dev/null +++ b/test-fixtures/monorepo/pedantic-flag/package-b/test/Main.purs @@ -0,0 +1,8 @@ +module Test.PACKAGE.B where + +import Prelude +import Control.Alt as Control +import Safe.Coerce as Coerce + +packageName :: String +packageName = "package" <> "package-b" \ No newline at end of file diff --git a/test-fixtures/monorepo/pedantic-flag/package-c/spago.yaml b/test-fixtures/monorepo/pedantic-flag/package-c/spago.yaml new file mode 100644 index 000000000..e8ef8c33f --- /dev/null +++ b/test-fixtures/monorepo/pedantic-flag/package-c/spago.yaml @@ -0,0 +1,15 @@ +package: + name: package-c + dependencies: + - control + - prelude + - tuples + build: + pedantic_packages: true + test: + main: Test.PACKAGE.C + pedantic_packages: true + dependencies: + - control + - either + - prelude diff --git a/test-fixtures/monorepo/pedantic-flag/package-c/src/Main.purs b/test-fixtures/monorepo/pedantic-flag/package-c/src/Main.purs new file mode 100644 index 000000000..0762c9efb --- /dev/null +++ b/test-fixtures/monorepo/pedantic-flag/package-c/src/Main.purs @@ -0,0 +1,8 @@ +module Src.PACKAGE.C where + +import Prelude +import Control.Alt as Control +import Data.Newtype as Newtype + +packageName :: String +packageName = "package" <> "package-c" \ No newline at end of file diff --git a/test-fixtures/monorepo/pedantic-flag/package-c/test/Main.purs b/test-fixtures/monorepo/pedantic-flag/package-c/test/Main.purs new file mode 100644 index 000000000..0eb64302f --- /dev/null +++ b/test-fixtures/monorepo/pedantic-flag/package-c/test/Main.purs @@ -0,0 +1,8 @@ +module Test.PACKAGE.C where + +import Prelude +import Control.Alt as Control +import Safe.Coerce as Coerce + +packageName :: String +packageName = "package" <> "package-c" \ No newline at end of file diff --git a/test-fixtures/monorepo/pedantic-flag/spago.yaml b/test-fixtures/monorepo/pedantic-flag/spago.yaml new file mode 100644 index 000000000..8b53e2798 --- /dev/null +++ b/test-fixtures/monorepo/pedantic-flag/spago.yaml @@ -0,0 +1,4 @@ +workspace: + package_set: + registry: 0.0.1 + extra_packages: {} diff --git a/test-fixtures/monorepo/strict-true-censored-warnings/package-a/spago.yaml b/test-fixtures/monorepo/strict-true-censored-warnings/package-a/spago.yaml new file mode 100644 index 000000000..6753da1bd --- /dev/null +++ b/test-fixtures/monorepo/strict-true-censored-warnings/package-a/spago.yaml @@ -0,0 +1,8 @@ +package: + name: package-a + dependencies: + - prelude + build: + censor_project_warnings: + - UnusedName + strict: true diff --git a/test-fixtures/monorepo/strict-true-censored-warnings/package-a/src/Main.purs b/test-fixtures/monorepo/strict-true-censored-warnings/package-a/src/Main.purs new file mode 100644 index 000000000..22b89f7f7 --- /dev/null +++ b/test-fixtures/monorepo/strict-true-censored-warnings/package-a/src/Main.purs @@ -0,0 +1,7 @@ +module Src.PACKAGE.A where + +import Prelude + +packageName :: String -> String +packageName foo = + "package" <> "package-a" \ No newline at end of file diff --git a/test-fixtures/monorepo/strict-true-censored-warnings/package-b/spago.yaml b/test-fixtures/monorepo/strict-true-censored-warnings/package-b/spago.yaml new file mode 100644 index 000000000..8ec3f6266 --- /dev/null +++ b/test-fixtures/monorepo/strict-true-censored-warnings/package-b/spago.yaml @@ -0,0 +1,9 @@ +package: + name: package-b + dependencies: + - package-a + - prelude + build: + censor_project_warnings: + - UnusedName + strict: true diff --git a/test-fixtures/monorepo/strict-true-censored-warnings/package-b/src/Main.purs b/test-fixtures/monorepo/strict-true-censored-warnings/package-b/src/Main.purs new file mode 100644 index 000000000..828902c7e --- /dev/null +++ b/test-fixtures/monorepo/strict-true-censored-warnings/package-b/src/Main.purs @@ -0,0 +1,7 @@ +module Src.PACKAGE.B where + +import Prelude + +packageName :: String -> String +packageName foo = + "package" <> "package-b" \ No newline at end of file diff --git a/test-fixtures/monorepo/strict-true-censored-warnings/package-c/spago.yaml b/test-fixtures/monorepo/strict-true-censored-warnings/package-c/spago.yaml new file mode 100644 index 000000000..1a452f476 --- /dev/null +++ b/test-fixtures/monorepo/strict-true-censored-warnings/package-c/spago.yaml @@ -0,0 +1,10 @@ +package: + name: package-c + dependencies: + - package-a + - package-b + - prelude + build: + censor_project_warnings: + - UnusedName + strict: true diff --git a/test-fixtures/monorepo/strict-true-censored-warnings/package-c/src/Main.purs b/test-fixtures/monorepo/strict-true-censored-warnings/package-c/src/Main.purs new file mode 100644 index 000000000..634d45743 --- /dev/null +++ b/test-fixtures/monorepo/strict-true-censored-warnings/package-c/src/Main.purs @@ -0,0 +1,7 @@ +module Src.PACKAGE.C where + +import Prelude + +packageName :: String -> String +packageName foo = + "package" <> "package-c" \ No newline at end of file diff --git a/test-fixtures/monorepo/strict-true-censored-warnings/spago.yaml b/test-fixtures/monorepo/strict-true-censored-warnings/spago.yaml new file mode 100644 index 000000000..8b53e2798 --- /dev/null +++ b/test-fixtures/monorepo/strict-true-censored-warnings/spago.yaml @@ -0,0 +1,4 @@ +workspace: + package_set: + registry: 0.0.1 + extra_packages: {} diff --git a/test-fixtures/monorepo/strict-true-uncensored-warnings/package-a/spago.yaml b/test-fixtures/monorepo/strict-true-uncensored-warnings/package-a/spago.yaml new file mode 100644 index 000000000..6753da1bd --- /dev/null +++ b/test-fixtures/monorepo/strict-true-uncensored-warnings/package-a/spago.yaml @@ -0,0 +1,8 @@ +package: + name: package-a + dependencies: + - prelude + build: + censor_project_warnings: + - UnusedName + strict: true diff --git a/test-fixtures/monorepo/strict-true-uncensored-warnings/package-a/src/Main.purs b/test-fixtures/monorepo/strict-true-uncensored-warnings/package-a/src/Main.purs new file mode 100644 index 000000000..22b89f7f7 --- /dev/null +++ b/test-fixtures/monorepo/strict-true-uncensored-warnings/package-a/src/Main.purs @@ -0,0 +1,7 @@ +module Src.PACKAGE.A where + +import Prelude + +packageName :: String -> String +packageName foo = + "package" <> "package-a" \ No newline at end of file diff --git a/test-fixtures/monorepo/strict-true-uncensored-warnings/package-b/spago.yaml b/test-fixtures/monorepo/strict-true-uncensored-warnings/package-b/spago.yaml new file mode 100644 index 000000000..4a5d1aa3a --- /dev/null +++ b/test-fixtures/monorepo/strict-true-uncensored-warnings/package-b/spago.yaml @@ -0,0 +1,11 @@ +package: + name: package-b + dependencies: + - package-a + - prelude + build: + strict: true + test: + main: Test.PACKAGE.B + strict: true + dependencies: [] diff --git a/test-fixtures/monorepo/strict-true-uncensored-warnings/package-b/src/Main.purs b/test-fixtures/monorepo/strict-true-uncensored-warnings/package-b/src/Main.purs new file mode 100644 index 000000000..828902c7e --- /dev/null +++ b/test-fixtures/monorepo/strict-true-uncensored-warnings/package-b/src/Main.purs @@ -0,0 +1,7 @@ +module Src.PACKAGE.B where + +import Prelude + +packageName :: String -> String +packageName foo = + "package" <> "package-b" \ No newline at end of file diff --git a/test-fixtures/monorepo/strict-true-uncensored-warnings/package-b/test/Main.purs b/test-fixtures/monorepo/strict-true-uncensored-warnings/package-b/test/Main.purs new file mode 100644 index 000000000..e5199caf6 --- /dev/null +++ b/test-fixtures/monorepo/strict-true-uncensored-warnings/package-b/test/Main.purs @@ -0,0 +1,7 @@ +module Test.PACKAGE.B where + +import Prelude + +packageName :: String -> String +packageName foo = + "package" <> "package-b" \ No newline at end of file diff --git a/test-fixtures/monorepo/strict-true-uncensored-warnings/package-c/spago.yaml b/test-fixtures/monorepo/strict-true-uncensored-warnings/package-c/spago.yaml new file mode 100644 index 000000000..1a452f476 --- /dev/null +++ b/test-fixtures/monorepo/strict-true-uncensored-warnings/package-c/spago.yaml @@ -0,0 +1,10 @@ +package: + name: package-c + dependencies: + - package-a + - package-b + - prelude + build: + censor_project_warnings: + - UnusedName + strict: true diff --git a/test-fixtures/monorepo/strict-true-uncensored-warnings/package-c/src/Main.purs b/test-fixtures/monorepo/strict-true-uncensored-warnings/package-c/src/Main.purs new file mode 100644 index 000000000..634d45743 --- /dev/null +++ b/test-fixtures/monorepo/strict-true-uncensored-warnings/package-c/src/Main.purs @@ -0,0 +1,7 @@ +module Src.PACKAGE.C where + +import Prelude + +packageName :: String -> String +packageName foo = + "package" <> "package-c" \ No newline at end of file diff --git a/test-fixtures/monorepo/strict-true-uncensored-warnings/spago.yaml b/test-fixtures/monorepo/strict-true-uncensored-warnings/spago.yaml new file mode 100644 index 000000000..8b53e2798 --- /dev/null +++ b/test-fixtures/monorepo/strict-true-uncensored-warnings/spago.yaml @@ -0,0 +1,4 @@ +workspace: + package_set: + registry: 0.0.1 + extra_packages: {} diff --git a/test-fixtures/monorepo/unique-module-names/package-a/spago.yaml b/test-fixtures/monorepo/unique-module-names/package-a/spago.yaml new file mode 100644 index 000000000..85257908f --- /dev/null +++ b/test-fixtures/monorepo/unique-module-names/package-a/spago.yaml @@ -0,0 +1,4 @@ +package: + name: package-a + dependencies: + - prelude diff --git a/test-fixtures/monorepo/unique-module-names/package-a/src/Main.purs b/test-fixtures/monorepo/unique-module-names/package-a/src/Main.purs new file mode 100644 index 000000000..f21d4d96a --- /dev/null +++ b/test-fixtures/monorepo/unique-module-names/package-a/src/Main.purs @@ -0,0 +1,6 @@ +module SameModuleName where + +import Prelude + +packageName :: String +packageName = "package-a" \ No newline at end of file diff --git a/test-fixtures/monorepo/unique-module-names/package-b/spago.yaml b/test-fixtures/monorepo/unique-module-names/package-b/spago.yaml new file mode 100644 index 000000000..e80544995 --- /dev/null +++ b/test-fixtures/monorepo/unique-module-names/package-b/spago.yaml @@ -0,0 +1,4 @@ +package: + name: package-b + dependencies: + - prelude diff --git a/test-fixtures/monorepo/unique-module-names/package-b/src/Main.purs b/test-fixtures/monorepo/unique-module-names/package-b/src/Main.purs new file mode 100644 index 000000000..6af840e44 --- /dev/null +++ b/test-fixtures/monorepo/unique-module-names/package-b/src/Main.purs @@ -0,0 +1,6 @@ +module SameModuleName where + +import Prelude + +packageName :: String +packageName = "package-b" \ No newline at end of file diff --git a/test-fixtures/monorepo/unique-module-names/package-c/spago.yaml b/test-fixtures/monorepo/unique-module-names/package-c/spago.yaml new file mode 100644 index 000000000..2c378a269 --- /dev/null +++ b/test-fixtures/monorepo/unique-module-names/package-c/spago.yaml @@ -0,0 +1,4 @@ +package: + name: package-c + dependencies: + - prelude diff --git a/test-fixtures/monorepo/unique-module-names/package-c/src/Main.purs b/test-fixtures/monorepo/unique-module-names/package-c/src/Main.purs new file mode 100644 index 000000000..061917289 --- /dev/null +++ b/test-fixtures/monorepo/unique-module-names/package-c/src/Main.purs @@ -0,0 +1,6 @@ +module Src.PACKAGE.C where + +import Prelude + +packageName :: String +packageName = "package-c" \ No newline at end of file diff --git a/test-fixtures/monorepo/unique-module-names/spago.yaml b/test-fixtures/monorepo/unique-module-names/spago.yaml new file mode 100644 index 000000000..8b53e2798 --- /dev/null +++ b/test-fixtures/monorepo/unique-module-names/spago.yaml @@ -0,0 +1,4 @@ +workspace: + package_set: + registry: 0.0.1 + extra_packages: {} diff --git a/test-fixtures/polyrepo.lock b/test-fixtures/polyrepo.lock index 5fd05e893..2fcd7c3ef 100644 --- a/test-fixtures/polyrepo.lock +++ b/test-fixtures/polyrepo.lock @@ -39,8 +39,6 @@ workspace: - effect - prelude build_plan: - - console - - effect - prelude package_set: address: diff --git a/test/Prelude.purs b/test/Prelude.purs index ff7e8eda7..5ef14b862 100644 --- a/test/Prelude.purs +++ b/test/Prelude.purs @@ -15,6 +15,7 @@ import Effect.Class.Console as Console import Node.Library.Execa (ExecaResult) import Node.Path (dirname) import Node.Path as Path +import Node.Platform as Platform import Node.Process as Process import Registry.PackageName as PackageName import Registry.Version as Version @@ -107,9 +108,16 @@ shouldEqualStr v1 v2 = checkFixture :: String -> String -> Aff Unit checkFixture filepath fixturePath = do - filecontent <- FS.readTextFile filepath - fixturecontent <- FS.readTextFile fixturePath - filecontent `shouldEqualStr` fixturecontent + filecontent <- String.trim <$> FS.readTextFile filepath + overwriteSpecFile <- liftEffect $ map isJust $ Process.lookupEnv "SPAGO_TEST_ACCEPT" + if overwriteSpecFile then do + Console.log $ "Overwriting fixture at path: " <> fixturePath + let parentDir = dirname fixturePath + unlessM (FS.exists parentDir) $ FS.mkdirp parentDir + FS.writeTextFile fixturePath (filecontent <> "\n") + else do + expected <- String.trim <$> FS.readTextFile fixturePath + filecontent `shouldEqualStr` expected plusDependencies :: Array String -> Config -> Config plusDependencies deps config = config @@ -364,3 +372,8 @@ configAddTestDependencies deps (Tuple packageName r) = Tuple packageName $ r , dependencies: Just $ maybe (mkDependencies deps) (append (mkDependencies deps)) $ r.test >>= _.dependencies } } + +escapePathInErrMsg :: Array String -> String +escapePathInErrMsg = case Process.platform of + Just Platform.Win32 -> Array.intercalate "\\" + _ -> Array.intercalate "/" diff --git a/test/Spago/Build.purs b/test/Spago/Build.purs index 1bb3f496d..a4f6d3ec3 100644 --- a/test/Spago/Build.purs +++ b/test/Spago/Build.purs @@ -11,7 +11,7 @@ import Spago.FS as FS import Spago.Paths as Paths import Test.Spago.Build.BuildInfo as BuildInfo import Test.Spago.Build.Pedantic as Pedantic -import Test.Spago.Build.Polyrepo as BuildPolyrepo +import Test.Spago.Build.Monorepo as Monorepo import Test.Spec (Spec) import Test.Spec as Spec import Test.Spec.Assertions as Assert @@ -163,7 +163,7 @@ spec = Spec.around withTempDir do Pedantic.spec - BuildPolyrepo.spec + Monorepo.spec BuildInfo.spec diff --git a/test/Spago/Build/Monorepo.purs b/test/Spago/Build/Monorepo.purs new file mode 100644 index 000000000..1309bcd28 --- /dev/null +++ b/test/Spago/Build/Monorepo.purs @@ -0,0 +1,245 @@ +module Test.Spago.Build.Monorepo (spec) where + +import Test.Prelude + +import Data.Array as Array +import Data.String (Pattern(..)) +import Data.String as String +import Spago.FS as FS +import Test.Spec (SpecT) +import Test.Spec as Spec +import Test.Spec.Assertions as Assert +import Test.Spec.Assertions.String as AssertString + +spec :: SpecT Aff TestDirs Identity Unit +spec = Spec.describe "monorepo" do + + -- | Each test in this block describes the structure for each test via a Mermaid.js diagram. + -- | If the diagram isn't clear enough, paste the diagram code into a GitHub + -- | issue/PR and preview it to visualize it. + -- | For a guide on how to write such a diagram, see https://mermaid.js.org/syntax/flowchart.html + Spec.describe "inter-workspace package dependencies" do + {- + ```mermaid + flowchart TD + subgraph "Case 1" + A ---> Dep0["prelude"] + B ---> Dep0 + end + ``` + -} + Spec.it "Case 1: 'independent packages' builds" \{ spago, fixture } -> do + FS.copyTree { src: fixture "monorepo/case1-independent-packages", dst: "." } + spago [ "build" ] >>= shouldBeSuccess + + {- + ```mermaid + flowchart TD + subgraph "Case 2" + A2 ---> prelude2 + A2 ---> Shared2 + B2 ---> prelude2 + B2 ---> Shared2 + Shared2 ---> prelude2 + end + ``` + -} + Spec.it "Case 2: 'shared dependencies packages' builds" \{ spago, fixture } -> do + FS.copyTree { src: fixture "monorepo/case2-shared-dependencies1", dst: "." } + spago [ "build" ] >>= shouldBeSuccess + + {- + ```mermaid + flowchart TD + subgraph "Case 3" + A3 ---> prelude3 + A3 ---> B3 + A3 ---> C3 + B3 ---> prelude3 + B3 ---> C3 + C3 ---> prelude3 + end + ``` + -} + Spec.it "Case 3: 'dependencies: A&B -> C; A -> B' builds" \{ spago, fixture } -> do + FS.copyTree { src: fixture "monorepo/case3-shared-dependencies2", dst: "." } + spago [ "build" ] >>= shouldBeSuccess + checkFixture "spago.lock" (fixture "polyrepo.lock") + + {- + ```mermaid + flowchart TD + subgraph "Case 4 (duplicate module)" + A4 ---> prelude4 + B4 ---> prelude4 + C4 ---> prelude4 + end + ``` + -} + Spec.it "declaring 2+ modules with the same name across 2+ packages fails to build" \{ spago, fixture } -> do + FS.copyTree { src: fixture "monorepo/unique-module-names", dst: "." } + let + sameModuleName = "SameModuleName" + hasExpectedModules stdErr = do + let exp = "Module " <> sameModuleName <> " has been defined multiple times" + + unless (String.contains (Pattern exp) stdErr) do + Assert.fail $ "STDERR did not contain text:\n" <> exp <> "\n\nStderr was:\n" <> stdErr + spago [ "build" ] >>= check { stdout: mempty, stderr: hasExpectedModules, result: isLeft } + + {- + ```mermaid + flowchart TD + subgraph "Case 1.1" + A ---> Dep0["prelude"] + B ---> Dep1["either-from-git"] + end + ``` + -} + Spec.it "#1161 regression: 'subpackage with disjoint git dependency' builds" \{ spago, fixture } -> do + -- This corner case happens only under very specific conditions: + -- 1. there must be a root package + -- 2. one of the dependencies of the subpackage must be fetched from git. + -- This is a problem only when the git dependency is not a dependency of the root package. + -- 3. the workspace needs to contain a subpackage that is using the git dependency + FS.copyTree { src: fixture "monorepo/1161-regression", dst: "." } + -- Lastly, this broke only when building the root package + spago [ "build", "-p", "root" ] >>= shouldBeSuccess + -- Or getting its graph + spago [ "uninstall", "-p", "root", "console", "effect", "prelude" ] >>= shouldBeSuccess + spago [ "build", "-p", "root", "--pedantic-packages" ] >>= shouldBeSuccess + + Spec.it "ignore nested workspaces" \{ spago, fixture } -> do + FS.copyTree { src: fixture "monorepo/ignore-nested-workspaces", dst: "." } + spago [ "build" ] >>= shouldBeSuccess + spago [ "build" ] >>= shouldBeSuccessErr (fixture "monorepo/ignore-nested-workspaces/expected-stderr.txt") + + Spec.it "it's possible to reference local packages when using the solver" \{ spago, fixture } -> do + FS.copyTree { src: fixture "monorepo/local-packages-work-with-solver", dst: "." } + spago [ "build" ] >>= shouldBeSuccess + spago [ "build" ] >>= shouldBeSuccessErr (fixture "monorepo/local-packages-work-with-solver/expected-stderr.txt") + + Spec.describe "warning censoring and error-promotion" do + + Spec.it "build succeeds when 'strict: true' because warnings were censored" \{ spago, fixture } -> do + FS.copyTree { src: fixture "monorepo/strict-true-censored-warnings", dst: "." } + let + paths = + [ escapePathInErrMsg [ "package-a", "src", "Main.purs:6:13" ] + , escapePathInErrMsg [ "package-b", "src", "Main.purs:6:13" ] + , escapePathInErrMsg [ "package-c", "src", "Main.purs:6:13" ] + ] + shouldNotHaveWarning stdErr = do + when (Array.any (\exp -> String.contains (Pattern exp) stdErr) paths) do + Assert.fail $ "STDERR contained one or more texts:\n" <> show paths <> "\n\nStderr was:\n" <> stdErr + spago [ "build" ] >>= check { stdout: mempty, stderr: shouldNotHaveWarning, result: isRight } + + Spec.it "build fails when 'strict: true' and warnings were not censored" \{ spago, fixture } -> do + FS.copyTree { src: fixture "monorepo/strict-true-uncensored-warnings", dst: "." } + let + errs = + [ "[1/2 UnusedName] " <> escapePathInErrMsg [ "package-b", "src", "Main.purs:6:13" ] + , "[2/2 UnusedName] " <> escapePathInErrMsg [ "package-b", "test", "Main.purs:6:13" ] + ] + hasUnusedWarningError stdErr = do + unless (Array.any (\exp -> String.contains (Pattern exp) stdErr) errs) do + Assert.fail $ "STDERR did not contain texts:\n" <> show errs <> "\n\nStderr was:\n" <> stdErr + spago [ "build" ] >>= check { stdout: mempty, stderr: hasUnusedWarningError, result: isLeft } + + Spec.describe "passing --ensure-ranges flag..." do + + Spec.it "when root package exists adds ranges to the root package" \{ spago, fixture } -> do + FS.copyTree { src: fixture "monorepo/ensure-ranges-root-package", dst: "." } + spago [ "build", "--ensure-ranges" ] >>= shouldBeSuccess + spagoYaml <- FS.readTextFile "spago.yaml" + spagoYaml `AssertString.shouldContain` "- prelude: \">=6.0.1 <7.0.0\"" + + Spec.it "when root package does not exist fails to build" \{ spago, fixture } -> do + -- Note: this needs to contain at least two subpackages, otherwise, spago will + -- automatically select the only package available even if it's a non-root package. + FS.copyTree { src: fixture "monorepo/ensure-ranges-no-root-package", dst: "." } + + let + hasNoRootPackageError stdErr = do + let + msg = Array.intercalate "\n" + [ "No package found in the root configuration." + , "Please use the `-p` flag to select a package in which to add ranges." + ] + unless (String.contains (Pattern msg) stdErr) do + Assert.fail $ "STDERR did not contain text:\n" <> msg <> "\n\nStderr was:\n" <> stdErr + spago [ "build", "--ensure-ranges" ] >>= check { stdout: mempty, stderr: hasNoRootPackageError, result: isLeft } + + Spec.describe "pedantic packages" do + {- + /-- tuples (unused dep by `src`) + newtype (transitive dep) <-- control (direct dep) <--+ + \-- either (unused dep by `test`) + + - src and test both import `Data.Newtype` (from `newtype` package) unnecessarily, + thereby triggering the 'unused transitive dependency' warning + - src imports `tuples` + - test imports `either` because it inherit's `src`'s dependencies implicitly + + -} + + let + toMsgPrefix isSrc + | isSrc = "Sources" + | otherwise = "Tests" + + mkUnusedDepErr isSrc package = + Array.intercalate "\n" + [ toMsgPrefix isSrc <> " for package '" <> package <> "' declares unused dependencies - please remove them from the project config:" + , " - " <> (if isSrc then "tuples" else "either") + ] + mkTransitiveDepErr isSrc package = do + let + { pkg, mkModName, pkgModName } = + if isSrc then { pkg: "newtype", mkModName: mkSrcModuleName, pkgModName: "Data.Newtype" } + else { pkg: "safe-coerce", mkModName: mkTestModuleName, pkgModName: "Safe.Coerce" } + Array.intercalate "\n" + [ Array.fold + [ toMsgPrefix isSrc + , " for package '" + , package + , "' import the following transitive dependencies - please add them to the project dependencies, or remove the imports:" + ] + , " " <> pkg + , " from `" <> mkModName package <> "`, which imports:" + , " " <> pkgModName + ] + Spec.it "when package config has 'pedantic_packages: true', build fails with expected errors" \{ spago, fixture } -> do + FS.copyTree { src: fixture "monorepo/pedantic-config", dst: "." } + + let + errs = + [ mkUnusedDepErr true "package-a" + , mkTransitiveDepErr true "package-a" + , mkUnusedDepErr false "package-b" + , mkTransitiveDepErr false "package-b" + , mkUnusedDepErr true "package-c" + , mkTransitiveDepErr true "package-c" + , mkUnusedDepErr false "package-c" + , mkTransitiveDepErr false "package-c" + ] + hasExpectedErrors stdErr = do + let unfoundTexts = Array.filter (\exp -> not $ String.contains (Pattern exp) stdErr) errs + unless (Array.null unfoundTexts) do + Assert.fail $ "STDERR did not contain expected texts:\n" <> (Array.intercalate "\n\n" unfoundTexts) <> "\n\nStderr was:\n" <> stdErr + spago [ "build" ] >>= check { stdout: mempty, stderr: hasExpectedErrors, result: isLeft } + + Spec.it "passing --pedantic-packages overrides package and test configs" \{ spago, fixture } -> do + FS.copyTree { src: fixture "monorepo/pedantic-flag", dst: "." } + + let + errs = do + pkg <- [ "package-a", "package-b", "package-c" ] + isSrc <- [ true, false ] + fn <- [ mkUnusedDepErr, mkTransitiveDepErr ] + pure $ fn isSrc pkg + hasExpectedErrors stdErr = do + let unfoundTexts = Array.filter (\exp -> not $ String.contains (Pattern exp) stdErr) errs + unless (Array.null unfoundTexts) do + Assert.fail $ "STDERR did not contain expected texts:\n" <> (Array.intercalate "\n\n" unfoundTexts) <> "\n\nStderr was:\n" <> stdErr + spago [ "build", "--pedantic-packages" ] >>= check { stdout: mempty, stderr: hasExpectedErrors, result: isLeft } diff --git a/test/Spago/Build/Polyrepo.purs b/test/Spago/Build/Polyrepo.purs deleted file mode 100644 index b87f5c682..000000000 --- a/test/Spago/Build/Polyrepo.purs +++ /dev/null @@ -1,500 +0,0 @@ --- | Each test in this module describes the structure for each test via a Mermaid.js diagram. --- | If the diagram isn't clear enough, paste the diagram code into a GitHub --- | issue/PR and preview it to visualize it. --- | For a guide on how to write such a diagram, --- | see https://mermaid.js.org/syntax/flowchart.html -module Test.Spago.Build.Polyrepo (spec) where - -import Test.Prelude - -import Data.Array as Array -import Data.Map as Map -import Data.String (Pattern(..)) -import Data.String as String -import Node.Path as Path -import Node.Platform as Platform -import Node.Process as Process -import Registry.Version as Version -import Spago.Command.Init (DefaultConfigOptions(..)) -import Spago.Command.Init as Init -import Spago.Core.Config as Config -import Spago.FS as FS -import Test.Spec (SpecT) -import Test.Spec as Spec -import Test.Spec.Assertions as Assert -import Test.Spec.Assertions.String as AssertString - -spec :: SpecT Aff TestDirs Identity Unit -spec = Spec.describe "polyrepo" do - - let - escapePathInErrMsg :: Array String -> String - escapePathInErrMsg = case Process.platform of - Just Platform.Win32 -> Array.intercalate "\\" - _ -> Array.intercalate "/" - - -- | `spago [ "init" ]` will create files that we will immediately - -- | delete (i.e. `src/Main.purs` and `test/Main.purs`) - -- | or overwrite (i.e. `spago.yaml`). So, we don't call it here. - writeWorkspaceOnlySpagoYamlFile = do - FS.writeYamlFile Config.configCodec "spago.yaml" - $ Init.defaultConfig' - $ WorkspaceOnly { setVersion: Just $ unsafeFromRight $ Version.parse "0.0.1" } - - Spec.describe "inter-workspace package dependencies" do - {- - ```mermaid - flowchart TD - subgraph "Case 1" - A ---> Dep0["prelude"] - B ---> Dep0 - end - ``` - -} - Spec.it "Case 1: 'independent packages' builds" \{ spago } -> do - writeWorkspaceOnlySpagoYamlFile - void $ setupPackageWithDeps { packageName: "package-a", hasTest: true, deps: [] } - void $ setupPackageWithDeps { packageName: "package-b", hasTest: true, deps: [] } - void $ setupPackageWithDeps { packageName: "package-c", hasTest: true, deps: [] } - spago [ "build" ] >>= shouldBeSuccess - - {- - ```mermaid - flowchart TD - subgraph "Case 2" - A2 ---> prelude2 - A2 ---> Shared2 - B2 ---> prelude2 - B2 ---> Shared2 - Shared2 ---> prelude2 - end - ``` - -} - Spec.it "Case 2: 'shared dependencies packages' builds" \{ spago } -> do - writeWorkspaceOnlySpagoYamlFile - shared <- setupPackageWithDeps { packageName: "package-shared", hasTest: false, deps: [] } - void $ setupPackageWithDeps { packageName: "package-a", hasTest: true, deps: [ shared ] } - void $ setupPackageWithDeps { packageName: "package-b", hasTest: true, deps: [ shared ] } - spago [ "build" ] >>= shouldBeSuccess - - {- - ```mermaid - flowchart TD - subgraph "Case 3" - A3 ---> prelude3 - A3 ---> B3 - A3 ---> C3 - B3 ---> prelude3 - B3 ---> C3 - C3 ---> prelude3 - end - ``` - -} - Spec.it "Case 3: 'dependencies: A&B -> C; A -> B' builds" \{ spago, fixture } -> do - writeWorkspaceOnlySpagoYamlFile - pkgC <- setupPackageWithDeps { packageName: "package-c", hasTest: false, deps: [] } - pkgB <- setupPackageWithDeps { packageName: "package-b", hasTest: true, deps: [ pkgC ] } - void $ setupPackageWithDeps { packageName: "package-a", hasTest: true, deps: [ pkgC, pkgB ] } - spago [ "build" ] >>= shouldBeSuccess - checkFixture "spago.lock" (fixture "polyrepo.lock") - - {- - ```mermaid - flowchart TD - subgraph "Case 4 (duplicate module)" - A4 ---> prelude4 - B4 ---> prelude4 - C4 ---> prelude4 - end - ``` - -} - Spec.it "declaring 2+ modules with the same name across 2+ packages fails to build" \{ spago } -> do - writeWorkspaceOnlySpagoYamlFile - let - sameModuleName = "SameModuleName" - setupPackage packageName samePkgName = do - void $ setupDir - { packageName: packageName - , spagoYaml: mkPackageOnlyConfig { packageName, srcDependencies: [ "prelude" ] } [] - , srcMain: mkModuleContent - { modName: if samePkgName then sameModuleName else mkSrcModuleName packageName - , imports: [] - , body: - [ "" - , "packageName :: String" - , "packageName = \"" <> packageName <> "\"" - ] - } - , testMain: Nothing - } - setupPackage "package-a" true - setupPackage "package-b" true - setupPackage "package-c" false - let - hasExpectedModules stdErr = do - let exp = "Module " <> sameModuleName <> " has been defined multiple times" - - unless (String.contains (Pattern exp) stdErr) do - Assert.fail $ "STDERR did not contain text:\n" <> exp <> "\n\nStderr was:\n" <> stdErr - spago [ "build" ] >>= check { stdout: mempty, stderr: hasExpectedModules, result: isLeft } - - {- - ```mermaid - flowchart TD - subgraph "Case 1.1" - A ---> Dep0["prelude"] - B ---> Dep1["either-from-git"] - end - ``` - -} - Spec.it "#1161 regression: 'subpackage with disjoint git dependency' builds" \{ spago } -> do - -- Condition 1: there must be a root package - let - conf = Init.defaultConfig - { name: mkPackageName "root" - , withWorkspace: Just - { setVersion: Just $ unsafeFromRight $ Version.parse "20.0.1" - } - , testModuleName: "Test.Main" - } - -- Condition 2: one of the dependencies of the subpackage must be fetched from git. - -- This is a problem only when the git dependency is not a dependency of the root package. - FS.writeYamlFile Config.configCodec "spago.yaml" - ( conf - { workspace = conf.workspace # map - ( _ - { extra_packages = Just $ Map.fromFoldable - -- This commit is for the `v6.1.0` release - [ Tuple (mkPackageName "either") $ Config.ExtraRemotePackage $ Config.RemoteGitPackage - { git: "https://github.com/purescript/purescript-either.git" - , ref: "af655a04ed2fd694b6688af39ee20d7907ad0763" - , subdir: Nothing - , dependencies: Just $ mkDependencies [ "control", "invariant", "maybe", "prelude" ] - } - ] - } - ) - } - ) - -- Condition 3: the workspace needs to contain a subpackage that is using the git dependency - void $ setupPackageWithDeps { packageName: "package-b", hasTest: true, deps: [ { dep: "either", alias: "EITHER", import: "import Data.Either" } ] } - -- Lastly, this broke only when building the root package - spago [ "build", "-p", "root" ] >>= shouldBeSuccess - -- Or getting its graph - spago [ "uninstall", "-p", "root", "console", "effect", "prelude" ] >>= shouldBeSuccess - spago [ "build", "-p", "root", "--pedantic-packages" ] >>= shouldBeSuccess - - Spec.it "ignore nested workspaces" \{ spago, fixture } -> do - FS.copyTree { src: fixture "monorepo/ignore-nested-workspaces", dst: "." } - spago [ "build" ] >>= shouldBeSuccess - spago [ "build" ] >>= shouldBeSuccessErr (fixture "monorepo/ignore-nested-workspaces/expected-stderr.txt") - - Spec.it "it's possible to reference local packages when using the solver" \{ spago, fixture } -> do - FS.copyTree { src: fixture "monorepo/local-packages-work-with-solver", dst: "." } - spago [ "build" ] >>= shouldBeSuccess - spago [ "build" ] >>= shouldBeSuccessErr (fixture "monorepo/local-packages-work-with-solver/expected-stderr.txt") - - Spec.describe "warning censoring and error-promotion" do - let - setupPackageWithUnusedNameWarning packageName deps strict censorShadowedName includeTestCode = do - let - mkMainFile isSrc = mkModuleContent - { modName: (if isSrc then mkSrcModuleName else mkTestModuleName) packageName - , imports: [] - , body: - [ "" - , "packageName :: String -> String" - , "packageName foo = " - , " \"package\" <> \"" <> packageName <> "\"" - ] - } - void $ setupDir - { packageName: packageName - , spagoYaml: do - let censorValue = Config.CensorSpecificWarnings $ pure $ Config.ByCode "UnusedName" - mkPackageOnlyConfig - { packageName, srcDependencies: [ "prelude" ] <> deps } - $ - [ if strict then configAddSrcStrict else identity - , if censorShadowedName then configAddSrcCensor censorValue else identity - ] - <> - ( if not includeTestCode then [] - else - [ configAddTestMain - , if strict then configAddTestStrict else identity - , if censorShadowedName then configAddTestCensor censorValue else identity - ] - ) - , srcMain: mkMainFile true - , testMain: if includeTestCode then mkMainFile false else Nothing - } - Spec.it "build succeeds when 'strict: true' because warnings were censored" \{ spago } -> do - writeWorkspaceOnlySpagoYamlFile - setupPackageWithUnusedNameWarning "package-a" [] true true false - setupPackageWithUnusedNameWarning "package-b" [ "package-a" ] true true false - setupPackageWithUnusedNameWarning "package-c" [ "package-a", "package-b" ] true true false - let - paths = - [ escapePathInErrMsg [ "package-a", "src", "Main.purs:6:13" ] - , escapePathInErrMsg [ "package-b", "src", "Main.purs:6:13" ] - , escapePathInErrMsg [ "package-c", "src", "Main.purs:6:13" ] - ] - shouldNotHaveWarning stdErr = do - when (Array.any (\exp -> String.contains (Pattern exp) stdErr) paths) do - Assert.fail $ "STDERR contained one or more texts:\n" <> show paths <> "\n\nStderr was:\n" <> stdErr - spago [ "build" ] >>= check { stdout: mempty, stderr: shouldNotHaveWarning, result: isRight } - - Spec.it "build fails when 'strict: true' and warnings were not censored" \{ spago } -> do - writeWorkspaceOnlySpagoYamlFile - setupPackageWithUnusedNameWarning "package-a" [] true true false - -- no censoring, so this will fail to build - -- include tests, so that we get 2 errors rather than 1 - setupPackageWithUnusedNameWarning "package-b" [ "package-a" ] true false true - setupPackageWithUnusedNameWarning "package-c" [ "package-a", "package-b" ] true true false - let - errs = - [ "[1/2 UnusedName] " <> escapePathInErrMsg [ "package-b", "src", "Main.purs:6:13" ] - , "[2/2 UnusedName] " <> escapePathInErrMsg [ "package-b", "test", "Main.purs:6:13" ] - ] - hasUnusedWarningError stdErr = do - unless (Array.any (\exp -> String.contains (Pattern exp) stdErr) errs) do - Assert.fail $ "STDERR did not contain texts:\n" <> show errs <> "\n\nStderr was:\n" <> stdErr - spago [ "build" ] >>= check { stdout: mempty, stderr: hasUnusedWarningError, result: isLeft } - - Spec.describe "passing --ensure-ranges flag..." do - let - setupNonRootPackage packageName = void $ setupDir - { packageName: packageName - , spagoYaml: mkPackageOnlyConfig { packageName, srcDependencies: [ "prelude" ] } [] - , srcMain: mkModuleContent - { modName: "Subpackage." <> packageToModuleName packageName - , imports: [] - , body: - [ "" - , "packageName :: String" - , "packageName = \"package\" <> \"" <> packageName <> "\"" - ] - } - , testMain: Nothing - } - - Spec.it "when root package exists adds ranges to the root package" \{ spago } -> do - spago [ "init", "--package-set", "0.0.1" ] >>= shouldBeSuccess - setupNonRootPackage "non-root-package-a" - setupNonRootPackage "non-root-package-b" - spago [ "build", "--ensure-ranges" ] >>= shouldBeSuccess - spagoYaml <- FS.readTextFile "spago.yaml" - spagoYaml `AssertString.shouldContain` "- prelude: \">=6.0.1 <7.0.0\"" - - Spec.it "when root package does not exist fails to build" \{ spago } -> do - writeWorkspaceOnlySpagoYamlFile - -- Note: we have to create at least two subpackages - -- Otherwise, spago will automatically select the only package available, - -- even if it's a non-root package. - setupNonRootPackage "non-root-package-a" - setupNonRootPackage "non-root-package-b" - let - hasNoRootPackageError stdErr = do - let - msg = Array.intercalate "\n" - [ "No package found in the root configuration." - , "Please use the `-p` flag to select a package in which to add ranges." - ] - unless (String.contains (Pattern msg) stdErr) do - Assert.fail $ "STDERR did not contain text:\n" <> msg <> "\n\nStderr was:\n" <> stdErr - spago [ "build", "--ensure-ranges" ] >>= check { stdout: mempty, stderr: hasNoRootPackageError, result: isLeft } - - Spec.describe "pedantic packages" do - let - {- - /-- tuples (unused dep by `src`) - newtype (transitive dep) <-- control (direct dep) <--+ - \-- either (unused dep by `test`) - - - src and test both import `Data.Newtype` (from `newtype` package) unnecessarily, - thereby triggering the 'unused transitive dependency' warning - - src imports `tuples` - - test imports `either` because it inherit's `src`'s dependencies implicitly -} - setupPackage packageName { src, test } = void $ setupDir - { packageName: packageName - , spagoYaml: mkPackageOnlyConfig - { packageName, srcDependencies: [ "prelude", "control", "tuples" ] } - [ if src then configAddSrcPedantic else identity - , configAddTestMain - , configAddTestDependencies [ "prelude", "control", "either" ] - , if test then configAddTestPedantic else identity - ] - , srcMain: mkModuleContent - { modName: mkSrcModuleName packageName - , imports: - [ "import Control.Alt as Control" - , "import Data.Newtype as Newtype" - ] - , body: - [ "" - , "packageName :: String" - , "packageName = \"package\" <> \"" <> packageName <> "\"" - ] - } - , testMain: mkModuleContent - { modName: mkTestModuleName packageName - , imports: - [ "import Control.Alt as Control" - , "import Safe.Coerce as Coerce" - ] - , body: - [ "" - , "packageName :: String" - , "packageName = \"package\" <> \"" <> packageName <> "\"" - ] - } - } - - toMsgPrefix isSrc - | isSrc = "Sources" - | otherwise = "Tests" - - mkUnusedDepErr isSrc package = - Array.intercalate "\n" - [ toMsgPrefix isSrc <> " for package '" <> package <> "' declares unused dependencies - please remove them from the project config:" - , " - " <> (if isSrc then "tuples" else "either") - ] - mkTransitiveDepErr isSrc package = do - let - { pkg, mkModName, pkgModName } = - if isSrc then { pkg: "newtype", mkModName: mkSrcModuleName, pkgModName: "Data.Newtype" } - else { pkg: "safe-coerce", mkModName: mkTestModuleName, pkgModName: "Safe.Coerce" } - Array.intercalate "\n" - [ Array.fold - [ toMsgPrefix isSrc - , " for package '" - , package - , "' import the following transitive dependencies - please add them to the project dependencies, or remove the imports:" - ] - , " " <> pkg - , " from `" <> mkModName package <> "`, which imports:" - , " " <> pkgModName - ] - Spec.it "when package config has 'pedantic_packages: true', build fails with expected errors" \{ spago } -> do - writeWorkspaceOnlySpagoYamlFile - setupPackage "package-a" { src: true, test: false } - setupPackage "package-b" { src: false, test: true } - setupPackage "package-c" { src: true, test: true } - - let - errs = - [ mkUnusedDepErr true "package-a" - , mkTransitiveDepErr true "package-a" - , mkUnusedDepErr false "package-b" - , mkTransitiveDepErr false "package-b" - , mkUnusedDepErr true "package-c" - , mkTransitiveDepErr true "package-c" - , mkUnusedDepErr false "package-c" - , mkTransitiveDepErr false "package-c" - ] - hasExpectedErrors stdErr = do - let unfoundTexts = Array.filter (\exp -> not $ String.contains (Pattern exp) stdErr) errs - unless (Array.null unfoundTexts) do - Assert.fail $ "STDERR did not contain expected texts:\n" <> (Array.intercalate "\n\n" unfoundTexts) <> "\n\nStderr was:\n" <> stdErr - spago [ "build" ] >>= check { stdout: mempty, stderr: hasExpectedErrors, result: isLeft } - - Spec.it "passing --pedantic-packages overrides package and test configs" \{ spago } -> do - writeWorkspaceOnlySpagoYamlFile - setupPackage "package-a" { src: true, test: false } - setupPackage "package-b" { src: false, test: true } - setupPackage "package-c" { src: true, test: true } - - let - errs = do - pkg <- [ "package-a", "package-b", "package-c" ] - isSrc <- [ true, false ] - fn <- [ mkUnusedDepErr, mkTransitiveDepErr ] - pure $ fn isSrc pkg - hasExpectedErrors stdErr = do - let unfoundTexts = Array.filter (\exp -> not $ String.contains (Pattern exp) stdErr) errs - unless (Array.null unfoundTexts) do - Assert.fail $ "STDERR did not contain expected texts:\n" <> (Array.intercalate "\n\n" unfoundTexts) <> "\n\nStderr was:\n" <> stdErr - spago [ "build", "--pedantic-packages" ] >>= check { stdout: mempty, stderr: hasExpectedErrors, result: isLeft } - -type SetupPackage = { packageName :: String, hasTest :: Boolean, deps :: Array { dep :: String, import :: String, alias :: String } } - -setupPackageWithDeps :: SetupPackage -> Aff { dep :: String, import :: String, alias :: String } -setupPackageWithDeps { packageName, hasTest, deps } = do - let - packageAlias = packageToModuleName packageName - packageNameValues - | Array.null deps = "\"no deps\"" - | otherwise = Array.intercalate " <> " $ map (\r -> r.alias <> ".packageNameValue") deps - setupDir - { packageName: packageName - , spagoYaml: mkPackageOnlyConfig - { packageName, srcDependencies: [ "prelude" ] <> map _.dep deps } - [ configAddTestMain - , configAddTestDependencies [ "prelude", "console", "effect" ] - ] - , srcMain: mkModuleContent - { modName: mkSrcModuleName packageName - , imports: map _.import deps - , body: - [ "" - , "libraryUsage :: String" - , "libraryUsage = packageNameValue <> " <> packageNameValues - , "" - , "packageNameValue :: String" - , "packageNameValue = \"package name \" <> \"" <> packageName <> "\"" - ] - } - , testMain: - if not hasTest then Nothing - else mkModuleContent - { modName: mkTestModuleName packageName - , imports: - [ "" - , "import Effect (Effect)" - , "import Effect.Console (log)" - , "import " <> mkSrcModuleName packageName <> " as " <> packageAlias - ] - <> (map _.import deps) - , body: - [ "" - , "main :: Effect Unit" - , "main = do" - , " log $ \"Test for \" <> " <> packageAlias <> ".packageNameValue <> " <> packageNameValues - ] - } - } - pure - { dep: packageName - , import: "import " <> mkSrcModuleName packageName <> " as " <> packageAlias - , alias: packageAlias - } - -type SetupDir = { packageName :: String, spagoYaml :: Config.Config, srcMain :: Maybe String, testMain :: Maybe String } - -setupDir :: SetupDir -> Aff Unit -setupDir { packageName, spagoYaml, srcMain, testMain } = do - let - src = Path.concat [ packageName, "src" ] - test = Path.concat [ packageName, "test" ] - copyTemplate templateStr path = do - for_ templateStr \fileContent -> - FS.writeTextFile (Path.concat $ Array.cons packageName path) fileContent - - FS.mkdirp src - FS.mkdirp test - FS.writeYamlFile Config.configCodec (Path.concat [ packageName, "spago.yaml" ]) spagoYaml - copyTemplate srcMain [ "src", "Main.purs" ] - copyTemplate testMain [ "test", "Main.purs" ] - -type ModuleContent = { body :: Array String, imports :: Array String, modName :: String } - -mkModuleContent :: ModuleContent -> Maybe String -mkModuleContent { modName, imports, body } = Just $ Array.intercalate "\n" - $ - [ "module " <> modName <> " where" - , "" - , "import Prelude" - ] - <> imports - <> body