uri-templater 0.2.1.0 → 0.2.2.0
raw patch · 5 files changed
+46/−26 lines, 5 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Network.URI.Template: Alias :: Modifier
- Network.URI.Template.Types: Alias :: Modifier
Files
- src/Network/URI/Template/Internal.hs +15/−11
- src/Network/URI/Template/Parser.hs +14/−8
- src/Network/URI/Template/Types.hs +7/−4
- test/Test.hs +7/−0
- uri-templater.cabal +3/−3
src/Network/URI/Template/Internal.hs view
@@ -69,8 +69,7 @@ Explode -> exploded (MaxLength l) -> do when (modifierSupportsNamed settings) (namePrefix settings varName val)- -- TODO: this is wrong. we need to truncate prior to encoding.- censor (fromList . take l . Data.DList.toList) unexploded+ unexploded where settings = options m @@ -79,27 +78,32 @@ sepByCommas = sequence_ . intersperse (addChar ',') - associativeCommas :: (TemplateValue Single, TemplateValue Single) -> StringBuilder ()- associativeCommas (Single n, Single v) = addEncodeString n >> addChar ',' >> addEncodeString v+ associativeCommas :: (String -> String) -> (TemplateValue Single, TemplateValue Single) -> StringBuilder ()+ associativeCommas f (Single n, Single v) = addEncodeString n >> addChar ',' >> addEncodeString (f v) + preprocess :: String -> String+ preprocess = case varMod of+ MaxLength l -> take l+ _ -> id+ unexploded = case val of- (Associative l) -> sepByCommas $ map associativeCommas l- (List l) -> sepByCommas $ map (\(Single s) -> addEncodeString s) l- (Single s) -> addEncodeString s+ (Associative l) -> sepByCommas $ map (associativeCommas preprocess) l+ (List l) -> sepByCommas $ map (\(Single s) -> addEncodeString $ preprocess s) l+ (Single s) -> addEncodeString $ preprocess s explodedAssociative :: (TemplateValue Single, TemplateValue Single) -> StringBuilder () explodedAssociative (Single k, Single v) = do addEncodeString k addChar '='- addEncodeString v- + addEncodeString $ preprocess v+ exploded :: StringBuilder () exploded = case val of (Single s) -> do when (modifierSupportsNamed settings) (namePrefix settings varName val)- addEncodeString s+ addEncodeString $ preprocess s (Associative l) -> sequence_ $ intersperse (addChar $ modifierSeparator settings) $ map explodedAssociative l- (List l) -> sequence_ $ intersperse (addChar $ modifierSeparator settings) $ map (\(Single s) -> addEncodeString s) l+ (List l) -> sequence_ $ intersperse (addChar $ modifierSeparator settings) $ map (\(Single s) -> addEncodeString $ preprocess s) l processVariables :: [(String, WrappedValue)] -> Modifier -> [Variable] -> StringBuilder () processVariables env m vs = sequence_ $ processedVariables
src/Network/URI/Template/Parser.hs view
@@ -50,10 +50,12 @@ return [h, d1, d2] literalChar :: Parser Char-literalChar = (choice $ map char ['\x21', '\x23', '\x24', '\x26', '\x3D', '\x5D', '\x5F', '\x7E'])- <|> ranges [('\x28', '\x3B'), ('\x3F', '\x5B'), ('\x61', '\x7A')]- <|> ucschar- <|> iprivate+literalChar =+ (choice $ map char+ ['\x21', '\x23', '\x24', '\x26', '\x3D', '\x5D', '\x5F', '\x7E']) <|>+ ranges [('\x28', '\x3B'), ('\x3F', '\x5B'), ('\x61', '\x7A')] <|>+ ucschar <|>+ iprivate literal :: Parser TemplateSegment literal = (Literal . concat) <$> some ((pure <$> literalChar) <|> pctEncoded)@@ -77,7 +79,10 @@ , (';', PathParameter) , ('?', Query) , ('&', QueryContinuation)- , ('@', Alias)+ , ('=', Reserved)+ , ('@', Reserved)+ , ('!', Reserved)+ , ('|', Reserved) ] variable :: Parser Variable@@ -94,7 +99,8 @@ uriTemplate = spaces *> many (literal <|> embed) parseTemplate :: String -> Either Doc UriTemplate-parseTemplate t = case parseString uriTemplate mempty t of- Failure err -> Left (_errDoc err)- Success r -> Right r+parseTemplate t =+ case parseString uriTemplate mempty t of+ Failure err -> Left (_errDoc err)+ Success r -> Right r
src/Network/URI/Template/Types.hs view
@@ -32,7 +32,9 @@ newtype TemplateString = String { fromString :: String } deriving (Read, Show, Eq, S.IsString) -newtype AList k v = AList { fromAList :: [(k, v)] }+newtype AList k v = AList+ { fromAList :: [(k, v)]+ } class ToTemplateValue a where type TemplateRep a@@ -80,8 +82,10 @@ | MaxLength Int deriving (Read, Show, Eq) -data Variable = Variable { variableName :: String, variableValueModifier :: ValueModifier }- deriving (Read, Show, Eq)+data Variable = Variable+ { variableName :: String+ , variableValueModifier :: ValueModifier+ } deriving (Read, Show, Eq) data TemplateSegment = Literal String@@ -99,7 +103,6 @@ | PathParameter | Query | QueryContinuation- | Alias deriving (Read, Show, Eq)
test/Test.hs view
@@ -79,6 +79,9 @@ var :: TemplateString var = "value" +semi :: TemplateString+semi = ";"+ hello :: TemplateString hello = "Hello World!" @@ -93,6 +96,10 @@ quasiQuoterTests = label "QuasiQuoter Tests" $ suite $ do label "Simple" $ test ([uri|{var}|] @?= "value")+ label "Simple with sufficient length" $ test ([uri|{var:20}|] @?= "value")+ label "Simple with insufficient length" $ test ([uri|{var:3}|] @?= "val")+ label "Escape" $ test ([uri|{semi}|] @?= "%3B")+ label "Escape" $ test ([uri|{semi:2}|] @?= "%3B") label "Multiple" $ test ([uri|{var,hello}|] @?= "value,Hello%20World%21") label "Length Constraint" $ test ([uri|{var:3}|] @?= "val") label "Sufficiently large length constraint" $ test ([uri|{var:10}|] @?= "value")
uri-templater.cabal view
@@ -2,10 +2,10 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: uri-templater-version: 0.2.1.0+version: 0.2.2.0 synopsis: Parsing & Quasiquoting for RFC 6570 URI Templates description: Parsing & Quasiquoting for RFC 6570 URI Templates-homepage: http://github.com/iand675/uri-templater+homepage: https://github.com/iand675/uri-templater license: MIT license-file: LICENSE author: Ian Duncan@@ -16,7 +16,7 @@ cabal-version: >=1.8 source-repository head type: git- location: http://github.com/iand675/uri-templater+ location: https://github.com/iand675/uri-templater library exposed-modules: Network.URI.Template,