bower-json 0.8.1 → 1.0.0
raw patch · 2 files changed
+62/−73 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Web.Bower.PackageMeta: Author :: String -> Maybe String -> Maybe String -> Author
+ Web.Bower.PackageMeta: Author :: Text -> Maybe Text -> Maybe Text -> Author
- Web.Bower.PackageMeta: InvalidChars :: String -> PackageNameError
+ Web.Bower.PackageMeta: InvalidChars :: [Char] -> PackageNameError
- Web.Bower.PackageMeta: InvalidModuleType :: String -> BowerError
+ Web.Bower.PackageMeta: InvalidModuleType :: Text -> BowerError
- Web.Bower.PackageMeta: PackageMeta :: PackageName -> Maybe String -> [FilePath] -> [ModuleType] -> [String] -> [String] -> [String] -> [Author] -> Maybe String -> Maybe Repository -> [(PackageName, VersionRange)] -> [(PackageName, VersionRange)] -> [(PackageName, Version)] -> Bool -> PackageMeta
+ Web.Bower.PackageMeta: PackageMeta :: PackageName -> Maybe Text -> [FilePath] -> [ModuleType] -> [Text] -> [Text] -> [Text] -> [Author] -> Maybe Text -> Maybe Repository -> [(PackageName, VersionRange)] -> [(PackageName, VersionRange)] -> [(PackageName, Version)] -> Bool -> PackageMeta
- Web.Bower.PackageMeta: Repository :: String -> String -> Repository
+ Web.Bower.PackageMeta: Repository :: Text -> Text -> Repository
- Web.Bower.PackageMeta: Version :: String -> Version
+ Web.Bower.PackageMeta: Version :: Text -> Version
- Web.Bower.PackageMeta: VersionRange :: String -> VersionRange
+ Web.Bower.PackageMeta: VersionRange :: Text -> VersionRange
- Web.Bower.PackageMeta: [authorEmail] :: Author -> Maybe String
+ Web.Bower.PackageMeta: [authorEmail] :: Author -> Maybe Text
- Web.Bower.PackageMeta: [authorHomepage] :: Author -> Maybe String
+ Web.Bower.PackageMeta: [authorHomepage] :: Author -> Maybe Text
- Web.Bower.PackageMeta: [authorName] :: Author -> String
+ Web.Bower.PackageMeta: [authorName] :: Author -> Text
- Web.Bower.PackageMeta: [bowerDescription] :: PackageMeta -> Maybe String
+ Web.Bower.PackageMeta: [bowerDescription] :: PackageMeta -> Maybe Text
- Web.Bower.PackageMeta: [bowerHomepage] :: PackageMeta -> Maybe String
+ Web.Bower.PackageMeta: [bowerHomepage] :: PackageMeta -> Maybe Text
- Web.Bower.PackageMeta: [bowerIgnore] :: PackageMeta -> [String]
+ Web.Bower.PackageMeta: [bowerIgnore] :: PackageMeta -> [Text]
- Web.Bower.PackageMeta: [bowerKeywords] :: PackageMeta -> [String]
+ Web.Bower.PackageMeta: [bowerKeywords] :: PackageMeta -> [Text]
- Web.Bower.PackageMeta: [bowerLicense] :: PackageMeta -> [String]
+ Web.Bower.PackageMeta: [bowerLicense] :: PackageMeta -> [Text]
- Web.Bower.PackageMeta: [repositoryType] :: Repository -> String
+ Web.Bower.PackageMeta: [repositoryType] :: Repository -> Text
- Web.Bower.PackageMeta: [repositoryUrl] :: Repository -> String
+ Web.Bower.PackageMeta: [repositoryUrl] :: Repository -> Text
- Web.Bower.PackageMeta: [runVersionRange] :: VersionRange -> String
+ Web.Bower.PackageMeta: [runVersionRange] :: VersionRange -> Text
- Web.Bower.PackageMeta: [runVersion] :: Version -> String
+ Web.Bower.PackageMeta: [runVersion] :: Version -> Text
- Web.Bower.PackageMeta: mkPackageName :: String -> Either PackageNameError PackageName
+ Web.Bower.PackageMeta: mkPackageName :: Text -> Either PackageNameError PackageName
- Web.Bower.PackageMeta: moduleTypes :: [(String, ModuleType)]
+ Web.Bower.PackageMeta: moduleTypes :: [(Text, ModuleType)]
- Web.Bower.PackageMeta: parseModuleType :: String -> Either BowerError ModuleType
+ Web.Bower.PackageMeta: parseModuleType :: Text -> Either BowerError ModuleType
- Web.Bower.PackageMeta: parsePackageName :: String -> Either BowerError PackageName
+ Web.Bower.PackageMeta: parsePackageName :: Text -> Either BowerError PackageName
- Web.Bower.PackageMeta: runPackageName :: PackageName -> String
+ Web.Bower.PackageMeta: runPackageName :: PackageName -> Text
Files
- bower-json.cabal +1/−1
- src/Web/Bower/PackageMeta/Internal.hs +61/−72
bower-json.cabal view
@@ -1,5 +1,5 @@ name: bower-json-version: 0.8.1+version: 1.0.0 synopsis: Read bower.json from Haskell license: MIT license-file: LICENSE
src/Web/Bower/PackageMeta/Internal.hs view
@@ -21,7 +21,6 @@ import Control.DeepSeq import GHC.Generics import Data.Monoid-import Data.List import Data.Char import Data.Text (Text) import qualified Data.Text as T@@ -45,14 +44,14 @@ -- should always get the same value back. data PackageMeta = PackageMeta { bowerName :: PackageName- , bowerDescription :: Maybe String+ , bowerDescription :: Maybe Text , bowerMain :: [FilePath] , bowerModuleType :: [ModuleType]- , bowerLicense :: [String]- , bowerIgnore :: [String]- , bowerKeywords :: [String]+ , bowerLicense :: [Text]+ , bowerIgnore :: [Text]+ , bowerKeywords :: [Text] , bowerAuthors :: [Author]- , bowerHomepage :: Maybe String+ , bowerHomepage :: Maybe Text , bowerRepository :: Maybe Repository , bowerDependencies :: [(PackageName, VersionRange)] , bowerDevDependencies :: [(PackageName, VersionRange)]@@ -65,18 +64,18 @@ -- | A valid package name for a Bower package. newtype PackageName- = PackageName String+ = PackageName Text deriving (Show, Eq, Ord, Generic) instance NFData PackageName -runPackageName :: PackageName -> String+runPackageName :: PackageName -> Text runPackageName (PackageName s) = s -- | A smart constructor for a PackageName. It ensures that the package name -- satisfies the restrictions described at -- <https://github.com/bower/bower.json-spec#name>.-mkPackageName :: String -> Either PackageNameError PackageName+mkPackageName :: Text -> Either PackageNameError PackageName mkPackageName = fmap PackageName . validateAll validators where dashOrDot = ['-', '.']@@ -86,29 +85,21 @@ | otherwise = Left (err x) validChar c = isAscii c && (isLower c || isDigit c || c `elem` dashOrDot) validators =- [ (not . null, const NotEmpty)- , (all validChar, InvalidChars . filter (not . validChar))- , (headMay >>> isJustAnd (`notElem` dashOrDot), const MustNotBeginSeparator)- , (lastMay >>> isJustAnd (`notElem` dashOrDot), const MustNotEndSeparator)- , (not . isInfixOf "--", const RepeatedSeparators)- , (not . isInfixOf "..", const RepeatedSeparators)- , (length >>> (<= 50), TooLong . length)+ [ (not . T.null, const NotEmpty)+ , (T.all validChar, InvalidChars . T.unpack . T.filter (not . validChar))+ , (firstChar (`notElem` dashOrDot), const MustNotBeginSeparator)+ , (lastChar (`notElem` dashOrDot), const MustNotEndSeparator)+ , (not . T.isInfixOf "--", const RepeatedSeparators)+ , (not . T.isInfixOf "..", const RepeatedSeparators)+ , (T.length >>> (<= 50), TooLong . T.length) ]- isJustAnd = maybe False--headMay :: [a] -> Maybe a-headMay [] = Nothing-headMay (x:_) = Just x--lastMay :: [a] -> Maybe a-lastMay [] = Nothing-lastMay [x] = Just x-lastMay (_:xs) = lastMay xs+ firstChar p str = not (T.null str) && p (T.index str 0)+ lastChar p = firstChar p . T.reverse data Author = Author- { authorName :: String- , authorEmail :: Maybe String- , authorHomepage :: Maybe String+ { authorName :: Text+ , authorEmail :: Maybe Text+ , authorHomepage :: Maybe Text } deriving (Show, Eq, Ord, Generic) @@ -125,32 +116,32 @@ instance NFData ModuleType -moduleTypes :: [(String, ModuleType)]-moduleTypes = map (\t -> (map toLower (show t), t)) [minBound .. maxBound]+moduleTypes :: [(Text, ModuleType)]+moduleTypes = map (\t -> (T.toLower (T.pack (show t)), t)) [minBound .. maxBound] data Repository = Repository- { repositoryUrl :: String- , repositoryType :: String+ { repositoryUrl :: Text+ , repositoryType :: Text } deriving (Show, Eq, Ord, Generic) instance NFData Repository newtype Version- = Version { runVersion :: String }+ = Version { runVersion :: Text } deriving (Show, Eq, Ord, Generic) instance NFData Version newtype VersionRange- = VersionRange { runVersionRange :: String }+ = VersionRange { runVersionRange :: Text } deriving (Show, Eq, Ord, Generic) instance NFData VersionRange data BowerError = InvalidPackageName PackageNameError- | InvalidModuleType String+ | InvalidModuleType Text deriving (Show, Eq, Ord, Generic) instance NFData BowerError@@ -159,7 +150,7 @@ showBowerError (InvalidPackageName err) = "Invalid package name: " <> showPackageNameError err showBowerError (InvalidModuleType str) =- "Invalid module type: " <> T.pack str <>+ "Invalid module type: " <> str <> ". Must be one of: " <> renderList moduleTypes where renderList =@@ -169,7 +160,7 @@ data PackageNameError = NotEmpty | TooLong Int- | InvalidChars String+ | InvalidChars [Char] | RepeatedSeparators | MustNotBeginSeparator | MustNotEndSeparator@@ -184,9 +175,9 @@ TooLong x -> "Package names must be no more than 50 characters, yours was " <> T.pack (show x)- InvalidChars str ->+ InvalidChars chars -> "The following characters are not permitted in package names: " <>- T.intercalate " " (map T.singleton str)+ T.intercalate " " (map T.singleton chars) RepeatedSeparators -> "The substrings \"--\" and \"..\" may not appear in "<> "package names"@@ -208,15 +199,15 @@ -- | A parser for bower.json files, using the aeson-better-errors package. asPackageMeta :: Parse BowerError PackageMeta asPackageMeta =- PackageMeta <$> key "name" (withString parsePackageName)- <*> keyMay "description" asString+ PackageMeta <$> key "name" (withText parsePackageName)+ <*> keyMay "description" asText <*> keyOrDefault "main" [] (arrayOrSingle asString)- <*> keyOrDefault "moduleType" [] (arrayOrSingle (withString parseModuleType))- <*> keyOrDefault "license" [] (arrayOrSingle asString)- <*> keyOrDefault "ignore" [] (eachInArray asString)- <*> keyOrDefault "keywords" [] (eachInArray asString)+ <*> keyOrDefault "moduleType" [] (arrayOrSingle (withText parseModuleType))+ <*> keyOrDefault "license" [] (arrayOrSingle asText)+ <*> keyOrDefault "ignore" [] (eachInArray asText)+ <*> keyOrDefault "keywords" [] (eachInArray asText) <*> keyOrDefault "authors" [] (eachInArray asAuthor)- <*> keyMay "homepage" asString+ <*> keyMay "homepage" asText <*> keyMay "repository" asRepository <*> keyOrDefault "dependencies" [] (asAssocListOf VersionRange) <*> keyOrDefault "devDependencies" [] (asAssocListOf VersionRange)@@ -229,17 +220,17 @@ where (<|>) p q = catchError p (const q) - asAssocListOf :: (String -> a) -> Parse BowerError [(PackageName, a)]+ asAssocListOf :: (Text -> a) -> Parse BowerError [(PackageName, a)] asAssocListOf g =- eachInObjectWithKey (parsePackageName . T.unpack) (g <$> asString)+ eachInObjectWithKey parsePackageName (g <$> asText) -parseModuleType :: String -> Either BowerError ModuleType+parseModuleType :: Text -> Either BowerError ModuleType parseModuleType str = case lookup str moduleTypes of Nothing -> Left (InvalidModuleType str) Just mt -> Right mt -parsePackageName :: String -> Either BowerError PackageName+parsePackageName :: Text -> Either BowerError PackageName parsePackageName str = case mkPackageName str of Left err -> Left (InvalidPackageName err)@@ -249,16 +240,16 @@ asAuthor = catchError asAuthorString (const asAuthorObject) asAuthorString :: Parse e Author-asAuthorString = withString $ \s ->- let (email, s1) = takeDelim "<" ">" (words s)+asAuthorString = withText $ \s ->+ let (email, s1) = takeDelim "<" ">" (T.words s) (homepage, s2) = takeDelim "(" ")" s1- in pure (Author (unwords s2) email homepage)+ in pure (Author (T.unwords s2) email homepage) -- | Given a prefix and a suffix, go through the supplied list, attempting -- to extract one string from the list which has the given prefix and suffix, -- All other strings in the list are returned as the second component of the -- tuple.-takeDelim :: String -> String -> [String] -> (Maybe String, [String])+takeDelim :: Text -> Text -> [Text] -> (Maybe Text, [Text]) takeDelim start end = foldr go (Nothing, []) where go str (Just x, strs) =@@ -269,23 +260,23 @@ Nothing -> (Nothing, str : strs) -- | Like stripPrefix, but strips a suffix as well.-stripWrapper :: String -> String -> String -> Maybe String+stripWrapper :: Text -> Text -> Text -> Maybe Text stripWrapper start end =- stripPrefix start- >>> fmap reverse- >=> stripPrefix (reverse end)- >>> fmap reverse+ T.stripPrefix start+ >>> fmap T.reverse+ >=> T.stripPrefix (T.reverse end)+ >>> fmap T.reverse asAuthorObject :: Parse e Author asAuthorObject =- Author <$> key "name" asString- <*> keyMay "email" asString- <*> keyMay "homepage" asString+ Author <$> key "name" asText+ <*> keyMay "email" asText+ <*> keyMay "homepage" asText asRepository :: Parse e Repository asRepository =- Repository <$> key "url" asString- <*> key "type" asString+ Repository <$> key "url" asText+ <*> key "type" asText ------------------------ -- Serializing@@ -310,10 +301,8 @@ ] where- toText = T.pack . runPackageName- assoc :: A.ToJSON a => Text -> [(PackageName, a)] -> [Aeson.Pair]- assoc = maybeArrayAssocPair toText+ assoc = maybeArrayAssocPair runPackageName instance A.ToJSON PackageName where toJSON = A.toJSON . runPackageName@@ -358,10 +347,10 @@ parseJSON = toAesonParser showBowerError asPackageMeta instance A.FromJSON PackageName where- parseJSON = toAesonParser showBowerError (withString parsePackageName)+ parseJSON = toAesonParser showBowerError (withText parsePackageName) instance A.FromJSON ModuleType where- parseJSON = toAesonParser showBowerError (withString parseModuleType)+ parseJSON = toAesonParser showBowerError (withText parseModuleType) instance A.FromJSON Repository where parseJSON = toAesonParser' asRepository@@ -370,7 +359,7 @@ parseJSON = toAesonParser' asAuthor instance A.FromJSON Version where- parseJSON = toAesonParser' (Version <$> asString)+ parseJSON = toAesonParser' (Version <$> asText) instance A.FromJSON VersionRange where- parseJSON = toAesonParser' (VersionRange <$> asString)+ parseJSON = toAesonParser' (VersionRange <$> asText)