From a9a3623128363883d248635541ff7aef3216e0de Mon Sep 17 00:00:00 2001 From: Fabrizio Ferrai Date: Tue, 25 Jun 2024 02:12:44 +0300 Subject: [PATCH] Use type applications for Proxy (#1235) --- bin/src/Optparse.purs | 8 +- core/src/Config.purs | 96 ++++++++-------- .../common/src/Docs/Search/JsonCodec.purs | 2 +- src/Spago/Command/Ls.purs | 2 +- src/Spago/Lock.purs | 60 +++++----- test/Spago/Glob.purs | 107 +++++++++--------- 6 files changed, 136 insertions(+), 139 deletions(-) diff --git a/bin/src/Optparse.purs b/bin/src/Optparse.purs index cfadb8b0c..4904c615e 100644 --- a/bin/src/Optparse.purs +++ b/bin/src/Optparse.purs @@ -23,7 +23,7 @@ fromRecord -> Parser { | rout } fromRecord = map Builder.buildFromScratch - <<< buildRecordArgs (Proxy :: _ rl) + <<< buildRecordArgs (Proxy @rl) class BuildRecordArgs (rl :: RowList Type) rs rin rout | rl -> rout where buildRecordArgs :: Proxy rl -> rs -> Parser (Builder rin rout) @@ -40,6 +40,6 @@ instance buildArgsCons :: ) => BuildRecordArgs (RowList.Cons sym (Parser a) next) { | rs } { | rin } { | rout } where buildRecordArgs _ rs = - (\a b -> Builder.insert (Proxy :: _ sym) a >>> b) - <$> Record.get (Proxy :: _ sym) rs - <*> buildRecordArgs (Proxy :: _ next) rs + (\a b -> Builder.insert (Proxy @sym) a >>> b) + <$> Record.get (Proxy @sym) rs + <*> buildRecordArgs (Proxy @next) rs diff --git a/core/src/Config.purs b/core/src/Config.purs index 81b389e96..6eff2e149 100644 --- a/core/src/Config.purs +++ b/core/src/Config.purs @@ -65,8 +65,8 @@ type Config = configCodec :: CJ.Codec Config configCodec = CJ.object - $ CJ.recordPropOptional (Proxy :: _ "package") packageConfigCodec - $ CJ.recordPropOptional (Proxy :: _ "workspace") workspaceConfigCodec + $ CJ.recordPropOptional (Proxy @"package") packageConfigCodec + $ CJ.recordPropOptional (Proxy @"workspace") workspaceConfigCodec $ CJ.record type PackageConfig = @@ -82,14 +82,14 @@ type PackageConfig = packageConfigCodec :: CJ.Codec PackageConfig packageConfigCodec = CJ.named "PackageConfig" $ CJ.object - $ CJ.recordProp (Proxy :: _ "name") PackageName.codec - $ CJ.recordPropOptional (Proxy :: _ "description") CJ.string - $ CJ.recordProp (Proxy :: _ "dependencies") dependenciesCodec - $ CJ.recordPropOptional (Proxy :: _ "build") packageBuildOptionsCodec - $ CJ.recordPropOptional (Proxy :: _ "bundle") bundleConfigCodec - $ CJ.recordPropOptional (Proxy :: _ "run") runConfigCodec - $ CJ.recordPropOptional (Proxy :: _ "test") testConfigCodec - $ CJ.recordPropOptional (Proxy :: _ "publish") publishConfigCodec + $ CJ.recordProp (Proxy @"name") PackageName.codec + $ CJ.recordPropOptional (Proxy @"description") CJ.string + $ CJ.recordProp (Proxy @"dependencies") dependenciesCodec + $ CJ.recordPropOptional (Proxy @"build") packageBuildOptionsCodec + $ CJ.recordPropOptional (Proxy @"bundle") bundleConfigCodec + $ CJ.recordPropOptional (Proxy @"run") runConfigCodec + $ CJ.recordPropOptional (Proxy @"test") testConfigCodec + $ CJ.recordPropOptional (Proxy @"publish") publishConfigCodec $ CJ.record type PublishConfig = @@ -102,11 +102,11 @@ type PublishConfig = publishConfigCodec :: CJ.Codec PublishConfig publishConfigCodec = CJ.named "PublishConfig" $ CJ.object - $ CJ.recordProp (Proxy :: _ "version") Version.codec - $ CJ.recordProp (Proxy :: _ "license") License.codec - $ CJ.recordPropOptional (Proxy :: _ "location") Location.codec - $ CJ.recordPropOptional (Proxy :: _ "include") (CJ.array CJ.string) - $ CJ.recordPropOptional (Proxy :: _ "exclude") (CJ.array CJ.string) + $ CJ.recordProp (Proxy @"version") Version.codec + $ CJ.recordProp (Proxy @"license") License.codec + $ CJ.recordPropOptional (Proxy @"location") Location.codec + $ CJ.recordPropOptional (Proxy @"include") (CJ.array CJ.string) + $ CJ.recordPropOptional (Proxy @"exclude") (CJ.array CJ.string) $ CJ.record type RunConfig = @@ -116,8 +116,8 @@ type RunConfig = runConfigCodec :: CJ.Codec RunConfig runConfigCodec = CJ.named "RunConfig" $ CJ.object - $ CJ.recordPropOptional (Proxy :: _ "main") CJ.string - $ CJ.recordPropOptional (Proxy :: _ "execArgs") (CJ.array CJ.string) + $ CJ.recordPropOptional (Proxy @"main") CJ.string + $ CJ.recordPropOptional (Proxy @"execArgs") (CJ.array CJ.string) $ CJ.record type TestConfig = @@ -131,12 +131,12 @@ type TestConfig = testConfigCodec :: CJ.Codec TestConfig testConfigCodec = CJ.named "TestConfig" $ CJ.object - $ CJ.recordProp (Proxy :: _ "main") CJ.string - $ CJ.recordPropOptional (Proxy :: _ "execArgs") (CJ.array CJ.string) - $ CJ.recordPropOptional (Proxy :: _ "censorTestWarnings") censorBuildWarningsCodec - $ CJ.recordPropOptional (Proxy :: _ "strict") CJ.boolean - $ CJ.recordPropOptional (Proxy :: _ "pedanticPackages") CJ.boolean - $ CJ.recordProp (Proxy :: _ "dependencies") dependenciesCodec + $ CJ.recordProp (Proxy @"main") CJ.string + $ CJ.recordPropOptional (Proxy @"execArgs") (CJ.array CJ.string) + $ CJ.recordPropOptional (Proxy @"censorTestWarnings") censorBuildWarningsCodec + $ CJ.recordPropOptional (Proxy @"strict") CJ.boolean + $ CJ.recordPropOptional (Proxy @"pedanticPackages") CJ.boolean + $ CJ.recordProp (Proxy @"dependencies") dependenciesCodec $ CJ.record type BackendConfig = @@ -146,8 +146,8 @@ type BackendConfig = backendConfigCodec :: CJ.Codec BackendConfig backendConfigCodec = CJ.named "BackendConfig" $ CJ.object - $ CJ.recordProp (Proxy :: _ "cmd") CJ.string - $ CJ.recordPropOptional (Proxy :: _ "args") (CJ.array CJ.string) + $ CJ.recordProp (Proxy @"cmd") CJ.string + $ CJ.recordPropOptional (Proxy @"args") (CJ.array CJ.string) $ CJ.record type PackageBuildOptionsInput = @@ -158,9 +158,9 @@ type PackageBuildOptionsInput = packageBuildOptionsCodec :: CJ.Codec PackageBuildOptionsInput packageBuildOptionsCodec = CJ.named "PackageBuildOptionsInput" $ CJ.object - $ CJ.recordPropOptional (Proxy :: _ "censorProjectWarnings") censorBuildWarningsCodec - $ CJ.recordPropOptional (Proxy :: _ "strict") CJ.boolean - $ CJ.recordPropOptional (Proxy :: _ "pedanticPackages") CJ.boolean + $ CJ.recordPropOptional (Proxy @"censorProjectWarnings") censorBuildWarningsCodec + $ CJ.recordPropOptional (Proxy @"strict") CJ.boolean + $ CJ.recordPropOptional (Proxy @"pedanticPackages") CJ.boolean $ CJ.record type BundleConfig = @@ -174,12 +174,12 @@ type BundleConfig = bundleConfigCodec :: CJ.Codec BundleConfig bundleConfigCodec = CJ.named "BundleConfig" $ CJ.object - $ CJ.recordPropOptional (Proxy :: _ "minify") CJ.boolean - $ CJ.recordPropOptional (Proxy :: _ "module") CJ.string - $ CJ.recordPropOptional (Proxy :: _ "outfile") CJ.string - $ CJ.recordPropOptional (Proxy :: _ "platform") bundlePlatformCodec - $ CJ.recordPropOptional (Proxy :: _ "type") bundleTypeCodec - $ CJ.recordPropOptional (Proxy :: _ "extraArgs") (CJ.array CJ.string) + $ CJ.recordPropOptional (Proxy @"minify") CJ.boolean + $ CJ.recordPropOptional (Proxy @"module") CJ.string + $ CJ.recordPropOptional (Proxy @"outfile") CJ.string + $ CJ.recordPropOptional (Proxy @"platform") bundlePlatformCodec + $ CJ.recordPropOptional (Proxy @"type") bundleTypeCodec + $ CJ.recordPropOptional (Proxy @"extraArgs") (CJ.array CJ.string) $ CJ.record data BundlePlatform = BundleNode | BundleBrowser @@ -292,10 +292,10 @@ type WorkspaceConfig = workspaceConfigCodec :: CJ.Codec WorkspaceConfig workspaceConfigCodec = CJ.named "WorkspaceConfig" $ CJ.object - $ CJ.recordPropOptional (Proxy :: _ "packageSet") setAddressCodec - $ CJ.recordPropOptional (Proxy :: _ "backend") backendConfigCodec - $ CJ.recordPropOptional (Proxy :: _ "buildOpts") buildOptionsCodec - $ CJ.recordPropOptional (Proxy :: _ "extraPackages") (Internal.Codec.packageMap extraPackageCodec) + $ CJ.recordPropOptional (Proxy @"packageSet") setAddressCodec + $ CJ.recordPropOptional (Proxy @"backend") backendConfigCodec + $ CJ.recordPropOptional (Proxy @"buildOpts") buildOptionsCodec + $ CJ.recordPropOptional (Proxy @"extraPackages") (Internal.Codec.packageMap extraPackageCodec) $ CJ.record type WorkspaceBuildOptionsInput = @@ -306,9 +306,9 @@ type WorkspaceBuildOptionsInput = buildOptionsCodec :: CJ.Codec WorkspaceBuildOptionsInput buildOptionsCodec = CJ.named "WorkspaceBuildOptionsInput" $ CJ.object - $ CJ.recordPropOptional (Proxy :: _ "output") CJ.string - $ CJ.recordPropOptional (Proxy :: _ "censorLibraryWarnings") censorBuildWarningsCodec - $ CJ.recordPropOptional (Proxy :: _ "statVerbosity") statVerbosityCodec + $ CJ.recordPropOptional (Proxy @"output") CJ.string + $ CJ.recordPropOptional (Proxy @"censorLibraryWarnings") censorBuildWarningsCodec + $ CJ.recordPropOptional (Proxy @"statVerbosity") statVerbosityCodec $ CJ.record data CensorBuildWarnings @@ -456,10 +456,10 @@ type GitPackage = gitPackageCodec :: CJ.Codec GitPackage gitPackageCodec = CJ.named "GitPackage" $ CJ.object - $ CJ.recordProp (Proxy :: _ "git") CJ.string - $ CJ.recordProp (Proxy :: _ "ref") CJ.string - $ CJ.recordPropOptional (Proxy :: _ "subdir") CJ.string - $ CJ.recordPropOptional (Proxy :: _ "dependencies") dependenciesCodec + $ CJ.recordProp (Proxy @"git") CJ.string + $ CJ.recordProp (Proxy @"ref") CJ.string + $ CJ.recordPropOptional (Proxy @"subdir") CJ.string + $ CJ.recordPropOptional (Proxy @"dependencies") dependenciesCodec $ CJ.record -- | The format of a legacy packages.json package set entry for an individual @@ -472,7 +472,7 @@ type LegacyPackageSetEntry = legacyPackageSetEntryCodec :: CJ.Codec LegacyPackageSetEntry legacyPackageSetEntryCodec = CJ.named "LegacyPackageSetEntry" $ CJ.object - $ CJ.recordProp (Proxy :: _ "repo") CJ.string - $ CJ.recordProp (Proxy :: _ "version") CJ.string - $ CJ.recordProp (Proxy :: _ "dependencies") (CJ.array PackageName.codec) + $ CJ.recordProp (Proxy @"repo") CJ.string + $ CJ.recordProp (Proxy @"version") CJ.string + $ CJ.recordProp (Proxy @"dependencies") (CJ.array PackageName.codec) $ CJ.record diff --git a/docs-search/common/src/Docs/Search/JsonCodec.purs b/docs-search/common/src/Docs/Search/JsonCodec.purs index 8ff097581..14556e727 100644 --- a/docs-search/common/src/Docs/Search/JsonCodec.purs +++ b/docs-search/common/src/Docs/Search/JsonCodec.purs @@ -23,7 +23,7 @@ import Unsafe.Coerce (unsafeCoerce) -- | Equivalent to `Data.Variant.inj`, just uses a Visible Type Application instead of Proxy -- | Useful for deriving codecs for sum types inject :: forall @sym a r1 r2. Cons sym a r1 r2 => IsSymbol sym => a -> Variant r2 -inject = inj (Proxy :: _ sym) +inject = inj (Proxy @sym) fromUni :: forall a diff --git a/src/Spago/Command/Ls.purs b/src/Spago/Command/Ls.purs index 6bec852b0..f3a1bdda8 100644 --- a/src/Spago/Command/Ls.purs +++ b/src/Spago/Command/Ls.purs @@ -156,7 +156,7 @@ formatPackagesJson packages = output $ OutputJson (packageMap packageCodec) (map , package: Config.packageConfigCodec , hasTests: CJ.boolean } - ) <<< Record.delete (Proxy :: _ "doc") + ) <<< Record.delete (Proxy @"doc") formatPackagesTable :: forall m. MonadEffect m => Array (Tuple PackageName Package) -> m Unit formatPackagesTable pkgs = output $ OutputTable diff --git a/src/Spago/Lock.purs b/src/Spago/Lock.purs index 72a4b2a4a..7049c31a6 100644 --- a/src/Spago/Lock.purs +++ b/src/Spago/Lock.purs @@ -61,29 +61,29 @@ type WorkspaceLockPackage = lockfileCodec :: CJ.Codec Lockfile lockfileCodec = CJ.named "Lockfile" $ CJ.object - $ CJ.recordProp (Proxy :: _ "workspace") workspaceLockCodec - $ CJ.recordProp (Proxy :: _ "packages") (Registry.Codec.packageMap lockEntryCodec) + $ CJ.recordProp (Proxy @"workspace") workspaceLockCodec + $ CJ.recordProp (Proxy @"packages") (Registry.Codec.packageMap lockEntryCodec) $ CJ.record workspaceLockCodec :: CJ.Codec WorkspaceLock workspaceLockCodec = CJ.named "WorkspaceLock" $ CJ.object - $ CJ.recordProp (Proxy :: _ "packages") (Registry.Codec.packageMap dependenciesCodec) - $ CJ.recordPropOptional (Proxy :: _ "package_set") packageSetCodec - $ CJ.recordProp (Proxy :: _ "extra_packages") (Registry.Codec.packageMap Config.extraPackageCodec) + $ CJ.recordProp (Proxy @"packages") (Registry.Codec.packageMap dependenciesCodec) + $ CJ.recordPropOptional (Proxy @"package_set") packageSetCodec + $ CJ.recordProp (Proxy @"extra_packages") (Registry.Codec.packageMap Config.extraPackageCodec) $ CJ.record where dependenciesCodec = CJ.named "Dependencies" $ CJ.object - $ CJ.recordProp (Proxy :: _ "path") CJ.string - $ CJ.recordProp (Proxy :: _ "dependencies") Config.dependenciesCodec - $ CJ.recordProp (Proxy :: _ "test_dependencies") Config.dependenciesCodec - $ CJ.recordProp (Proxy :: _ "build_plan") (CJ.Common.set PackageName.codec) + $ CJ.recordProp (Proxy @"path") CJ.string + $ CJ.recordProp (Proxy @"dependencies") Config.dependenciesCodec + $ CJ.recordProp (Proxy @"test_dependencies") Config.dependenciesCodec + $ CJ.recordProp (Proxy @"build_plan") (CJ.Common.set PackageName.codec) $ CJ.record packageSetCodec :: CJ.Codec PackageSetInfo packageSetCodec = CJ.named "PackageSetInfo" $ CJ.object - $ CJ.recordProp (Proxy :: _ "address") Config.setAddressCodec - $ CJ.recordProp (Proxy :: _ "compiler") Range.codec - $ CJ.recordProp (Proxy :: _ "content") (Registry.Codec.packageMap Core.remotePackageCodec) + $ CJ.recordProp (Proxy @"address") Config.setAddressCodec + $ CJ.recordProp (Proxy @"compiler") Range.codec + $ CJ.recordProp (Proxy @"content") (Registry.Codec.packageMap Core.remotePackageCodec) $ CJ.record lockEntryCodec :: CJ.Codec LockEntry @@ -115,13 +115,13 @@ type PathLock = pathLockCodec :: CJ.Codec PathLock pathLockCodec = Profunctor.dimap toRep fromRep $ CJ.named "PathLock" $ CJ.object - $ CJ.recordProp (Proxy :: _ "type") (constant pathLockType) - $ CJ.recordProp (Proxy :: _ "path") CJ.string - $ CJ.recordProp (Proxy :: _ "dependencies") (CJ.array PackageName.codec) + $ CJ.recordProp (Proxy @"type") (constant pathLockType) + $ CJ.recordProp (Proxy @"path") CJ.string + $ CJ.recordProp (Proxy @"dependencies") (CJ.array PackageName.codec) $ CJ.record where - toRep = Record.insert (Proxy :: _ "type") pathLockType - fromRep = Record.delete (Proxy :: _ "type") + toRep = Record.insert (Proxy @"type") pathLockType + fromRep = Record.delete (Proxy @"type") type GitLock = { url :: String @@ -132,15 +132,15 @@ type GitLock = gitLockCodec :: CJ.Codec GitLock gitLockCodec = Profunctor.dimap toRep fromRep $ CJ.named "GitLock" $ CJ.object - $ CJ.recordProp (Proxy :: _ "type") (constant gitLockType) - $ CJ.recordProp (Proxy :: _ "url") CJ.string - $ CJ.recordProp (Proxy :: _ "rev") CJ.string - $ CJ.recordPropOptional (Proxy :: _ "subdir") CJ.string - $ CJ.recordProp (Proxy :: _ "dependencies") (CJ.array PackageName.codec) + $ CJ.recordProp (Proxy @"type") (constant gitLockType) + $ CJ.recordProp (Proxy @"url") CJ.string + $ CJ.recordProp (Proxy @"rev") CJ.string + $ CJ.recordPropOptional (Proxy @"subdir") CJ.string + $ CJ.recordProp (Proxy @"dependencies") (CJ.array PackageName.codec) $ CJ.record where - toRep = Record.insert (Proxy :: _ "type") gitLockType - fromRep = Record.delete (Proxy :: _ "type") + toRep = Record.insert (Proxy @"type") gitLockType + fromRep = Record.delete (Proxy @"type") type RegistryLock = { version :: Version @@ -150,14 +150,14 @@ type RegistryLock = registryLockCodec :: CJ.Codec RegistryLock registryLockCodec = Profunctor.dimap toRep fromRep $ CJ.named "RegistryLock" $ CJ.object - $ CJ.recordProp (Proxy :: _ "type") (constant registryLockType) - $ CJ.recordProp (Proxy :: _ "version") Version.codec - $ CJ.recordProp (Proxy :: _ "integrity") Sha256.codec - $ CJ.recordProp (Proxy :: _ "dependencies") (CJ.array PackageName.codec) + $ CJ.recordProp (Proxy @"type") (constant registryLockType) + $ CJ.recordProp (Proxy @"version") Version.codec + $ CJ.recordProp (Proxy @"integrity") Sha256.codec + $ CJ.recordProp (Proxy @"dependencies") (CJ.array PackageName.codec) $ CJ.record where - toRep = Record.insert (Proxy :: _ "type") registryLockType - fromRep = Record.delete (Proxy :: _ "type") + toRep = Record.insert (Proxy @"type") registryLockType + fromRep = Record.delete (Proxy @"type") constant :: String → CJ.Codec String constant val = Codec.codec' decode encode diff --git a/test/Spago/Glob.purs b/test/Spago/Glob.purs index c325f4efb..9a8223230 100644 --- a/test/Spago/Glob.purs +++ b/test/Spago/Glob.purs @@ -4,13 +4,10 @@ import Test.Prelude import Data.Array as Array import Data.Foldable (intercalate) -import Data.String.Gen (genAlphaLowercaseString) import Effect.Aff as Aff import Node.Path as Path -import Node.Process as Process import Spago.FS as FS import Spago.Glob as Glob -import Test.QuickCheck.Gen (randomSample', resize) import Test.Spec (Spec) import Test.Spec as Spec import Test.Spec.Assertions as Assert @@ -18,87 +15,87 @@ import Test.Spec.Assertions as Assert globTmpDir :: (String -> Aff Unit) -> Aff Unit globTmpDir m = Aff.bracket make cleanup m where - touch name base = FS.writeTextFile (Path.concat [base, name]) "" - dir name contents base = do - FS.mkdirp $ Path.concat [base, name] - for_ contents \f -> f $ Path.concat [base, name] - cleanup _ = pure unit - make = do - base <- mkTemp' $ Just "spago-test-" - dir - ".git" - [ dir "fruits" [touch "apple"] ] - base - dir - "fruits" - [ dir "left" + touch name base = FS.writeTextFile (Path.concat [ base, name ]) "" + dir name contents base = do + FS.mkdirp $ Path.concat [ base, name ] + for_ contents \f -> f $ Path.concat [ base, name ] + cleanup _ = pure unit + make = do + base <- mkTemp' $ Just "spago-test-" + dir + ".git" + [ dir "fruits" [ touch "apple" ] ] + base + dir + "fruits" + [ dir "left" [ touch "apple" ] - , dir "right" + , dir "right" [ touch "apple" ] - ] - base - dir - "src" - [ dir "fruits" [touch "apple"] - , dir "sports" [touch "baseball"] - ] - base - pure base + ] + base + dir + "src" + [ dir "fruits" [ touch "apple" ] + , dir "sports" [ touch "baseball" ] + ] + base + pure base spec :: Spec Unit spec = Spec.around globTmpDir do Spec.describe "glob" do Spec.describe "glob behavior" do Spec.it "'**/..' matches 0 or more directories" \p -> do - a <- Glob.gitignoringGlob (Path.concat [p, "fruits/left"]) ["**/apple"] - b <- Glob.gitignoringGlob (Path.concat [p, "fruits"]) ["**/apple"] - Array.sort a `Assert.shouldEqual` ["apple"] - Array.sort b `Assert.shouldEqual` ["left/apple", "right/apple"] + a <- Glob.gitignoringGlob (Path.concat [ p, "fruits/left" ]) [ "**/apple" ] + b <- Glob.gitignoringGlob (Path.concat [ p, "fruits" ]) [ "**/apple" ] + Array.sort a `Assert.shouldEqual` [ "apple" ] + Array.sort b `Assert.shouldEqual` [ "left/apple", "right/apple" ] Spec.it "'../**/..' matches 0 or more directories" \p -> do - a <- Glob.gitignoringGlob p ["fruits/**/apple"] - Array.sort a `Assert.shouldEqual` ["fruits/left/apple", "fruits/right/apple"] + a <- Glob.gitignoringGlob p [ "fruits/**/apple" ] + Array.sort a `Assert.shouldEqual` [ "fruits/left/apple", "fruits/right/apple" ] Spec.it "'../**' matches 0 or more directories" \p -> do - a <- Glob.gitignoringGlob p ["fruits/left/**"] - Array.sort a `Assert.shouldEqual` ["fruits/left", "fruits/left/apple"] + a <- Glob.gitignoringGlob p [ "fruits/left/**" ] + Array.sort a `Assert.shouldEqual` [ "fruits/left", "fruits/left/apple" ] Spec.describe "gitignoringGlob" do Spec.it "when no .gitignore, yields all matches" \p -> do - a <- Glob.gitignoringGlob p ["**/apple"] - Array.sort a `Assert.shouldEqual` ["fruits/left/apple", "fruits/right/apple", "src/fruits/apple"] + a <- Glob.gitignoringGlob p [ "**/apple" ] + Array.sort a `Assert.shouldEqual` [ "fruits/left/apple", "fruits/right/apple", "src/fruits/apple" ] Spec.it "respects a .gitignore pattern that doesn't conflict with search" \p -> do - FS.writeTextFile (Path.concat [p, ".gitignore"]) "fruits/right" - a <- Glob.gitignoringGlob p ["fruits/**/apple"] - Array.sort a `Assert.shouldEqual` ["fruits/left/apple"] + FS.writeTextFile (Path.concat [ p, ".gitignore" ]) "fruits/right" + a <- Glob.gitignoringGlob p [ "fruits/**/apple" ] + Array.sort a `Assert.shouldEqual` [ "fruits/left/apple" ] Spec.it "respects some .gitignore patterns" \p -> do - FS.writeTextFile (Path.concat [p, ".gitignore"]) "fruits\nfruits/right" - a <- Glob.gitignoringGlob p ["fruits/**/apple"] - Array.sort a `Assert.shouldEqual` ["fruits/left/apple"] + FS.writeTextFile (Path.concat [ p, ".gitignore" ]) "fruits\nfruits/right" + a <- Glob.gitignoringGlob p [ "fruits/**/apple" ] + Array.sort a `Assert.shouldEqual` [ "fruits/left/apple" ] Spec.it "respects a negated .gitignore pattern" \p -> do - FS.writeTextFile (Path.concat [p, ".gitignore"]) "!/fruits/left/apple\n/fruits/**/apple" - a <- Glob.gitignoringGlob p ["**/apple"] - Array.sort a `Assert.shouldEqual` ["fruits/left/apple", "src/fruits/apple"] + FS.writeTextFile (Path.concat [ p, ".gitignore" ]) "!/fruits/left/apple\n/fruits/**/apple" + a <- Glob.gitignoringGlob p [ "**/apple" ] + Array.sort a `Assert.shouldEqual` [ "fruits/left/apple", "src/fruits/apple" ] - for_ ["/fruits", "fruits", "fruits/", "**/fruits", "fruits/**", "**/fruits/**"] \gitignore -> do + for_ [ "/fruits", "fruits", "fruits/", "**/fruits", "fruits/**", "**/fruits/**" ] \gitignore -> do Spec.it ("does not respect a .gitignore pattern that conflicts with search: " <> gitignore) \p -> do - FS.writeTextFile (Path.concat [p, ".gitignore"]) gitignore - a <- Glob.gitignoringGlob p ["fruits/**/apple"] - Array.sort a `Assert.shouldEqual` ["fruits/left/apple", "fruits/right/apple"] + FS.writeTextFile (Path.concat [ p, ".gitignore" ]) gitignore + a <- Glob.gitignoringGlob p [ "fruits/**/apple" ] + Array.sort a `Assert.shouldEqual` [ "fruits/left/apple", "fruits/right/apple" ] Spec.it "is stacksafe" \p -> do let - chars = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"] + chars = [ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k" ] -- 10,000-line gitignore - words = [\a b c d -> a <> b <> c <> d] <*> chars <*> chars <*> chars <*> chars + words = [ \a b c d -> a <> b <> c <> d ] <*> chars <*> chars <*> chars <*> chars hugeGitignore = intercalate "\n" words - FS.writeTextFile (Path.concat [p, ".gitignore"]) hugeGitignore - a <- Glob.gitignoringGlob p ["fruits/**/apple"] - Array.sort a `Assert.shouldEqual` ["fruits/left/apple", "fruits/right/apple"] + FS.writeTextFile (Path.concat [ p, ".gitignore" ]) hugeGitignore + a <- Glob.gitignoringGlob p [ "fruits/**/apple" ] + Array.sort a `Assert.shouldEqual` [ "fruits/left/apple", "fruits/right/apple" ]