git.iko.soy/typeable/file-embed
on master help sign in
ChangeLog.md+8
since splitsnapshots
unifiedsplit
@@ -1,5 +1,13 @@
1# ChangeLog for file-embed
1# ChangeLog for file-embed
2
2
3+## 0.0.15.0
4+
5+* Add `makeRelativeToLocationPredicate`
6+
7+## 0.0.14.0
8+
9+* Add `embedFileIfExists`
10+
3## 0.0.13.0
11## 0.0.13.0
4
12
5* Ensure that directory listings are returned in sorted order for reproducibility [yesodweb/yesod#1684](https://github.com/yesodweb/yesod/issues/1684)
13* Ensure that directory listings are returned in sorted order for reproducibility [yesodweb/yesod#1684](https://github.com/yesodweb/yesod/issues/1684)
Data/FileEmbed.hs+17−4
@@ -39,6 +39,7 @@ module Data.FileEmbed
39 , injectFileWith
39 , injectFileWith
40 -- * Relative path manipulation
40 -- * Relative path manipulation
41 , makeRelativeToProject
41 , makeRelativeToProject
42+ , makeRelativeToLocationPredicate
42 -- * Internal
43 -- * Internal
43 , stringToBs
44 , stringToBs
44 , bsToExp
45 , bsToExp
@@ -98,6 +99,8 @@ embedFile fp =
98-- >
99-- >
99-- > maybeMyFile :: Maybe Data.ByteString.ByteString
100-- > maybeMyFile :: Maybe Data.ByteString.ByteString
100-- > maybeMyFile = $(embedFileIfExists "dirName/fileName")
101-- > maybeMyFile = $(embedFileIfExists "dirName/fileName")
102+--
103+-- @since 0.0.14.0
101embedFileIfExists :: FilePath -> Q Exp
104embedFileIfExists :: FilePath -> Q Exp
102embedFileIfExists fp = do
105embedFileIfExists fp = do
103 mbs <- runIO maybeFile
106 mbs <- runIO maybeFile
@@ -406,7 +409,19 @@ available, you can use the non-@With@ variants.
406--
409--
407-- @since 0.0.10
410-- @since 0.0.10
408makeRelativeToProject :: FilePath -> Q FilePath
411makeRelativeToProject :: FilePath -> Q FilePath
409−makeRelativeToProject rel = do
412+makeRelativeToProject = makeRelativeToLocationPredicate $ (==) ".cabal" . takeExtension
413+
414+-- | Take a predicate to infer the project root and a relative file path, the given file path is then attached to the inferred project root
415+--
416+-- This function looks at the source location of the Haskell file calling it,
417+-- finds the first parent directory with a file matching the given predicate, and uses that as the
418+-- root directory for fixing the relative path.
419+--
420+-- @$(makeRelativeToLocationPredicate ((==) ".cabal" . takeExtension) "data/foo.txt" >>= embedFile)@
421+--
422+-- @since 0.0.15.0
423+makeRelativeToLocationPredicate :: (FilePath -> Bool) -> FilePath -> Q FilePath
424+makeRelativeToLocationPredicate isTargetFile rel = do
410 loc <- qLocation
425 loc <- qLocation
411 runIO $ do
426 runIO $ do
412 srcFP <- canonicalizePath $ loc_filename loc
427 srcFP <- canonicalizePath $ loc_filename loc
@@ -421,8 +436,6 @@ makeRelativeToProject rel = do
421 then return Nothing
436 then return Nothing
422 else do
437 else do
423 contents <- getDirectoryContents dir
438 contents <- getDirectoryContents dir
424− if any isCabalFile contents
439+ if any isTargetFile contents
425 then return (Just dir)
440 then return (Just dir)
426 else findProjectDir dir
441 else findProjectDir dir
427−
428− isCabalFile fp = takeExtension fp == ".cabal"
file-embed.cabal+2−2
@@ -1,6 +1,6 @@
1name: file-embed
1name: file-embed
2−version: 0.0.13.0
2+version: 0.0.15.0
3−license: BSD3
3+license: BSD2
4license-file: LICENSE
4license-file: LICENSE
5author: Michael Snoyman <michael@snoyman.com>
5author: Michael Snoyman <michael@snoyman.com>
6maintainer: Michael Snoyman <michael@snoyman.com>
6maintainer: Michael Snoyman <michael@snoyman.com>