diff --git a/src/Network/Minio/Data.hs b/src/Network/Minio/Data.hs index b4d12b2..1584e3d 100644 --- a/src/Network/Minio/Data.hs +++ b/src/Network/Minio/Data.hs @@ -155,11 +155,13 @@ fromAWSConfigFile = do bool (throwE "FileNotFound") (return ()) fileExists ini <- ExceptT $ Ini.readIniFile awsCredsFile akey <- - ExceptT $ return $ - Ini.lookupValue "default" "aws_access_key_id" ini + ExceptT $ + return $ + Ini.lookupValue "default" "aws_access_key_id" ini skey <- - ExceptT $ return $ - Ini.lookupValue "default" "aws_secret_access_key" ini + ExceptT $ + return $ + Ini.lookupValue "default" "aws_secret_access_key" ini return $ Credentials akey skey return $ hush credsE @@ -856,6 +858,9 @@ instance Monoid CSVProp where mappend (CSVProp a) (CSVProp b) = CSVProp (b <> a) #endif +csvPropsList :: CSVProp -> [(Text, Text)] +csvPropsList (CSVProp h) = sort $ H.toList h + defaultCSVProp :: CSVProp defaultCSVProp = mempty @@ -929,10 +934,11 @@ type CSVOutputProp = CSVProp -- | quoteFields is an output serialization parameter quoteFields :: QuoteFields -> CSVProp -quoteFields q = CSVProp $ H.singleton "QuoteFields" $ - case q of - QuoteFieldsAsNeeded -> "ASNEEDED" - QuoteFieldsAlways -> "ALWAYS" +quoteFields q = CSVProp $ + H.singleton "QuoteFields" $ + case q of + QuoteFieldsAsNeeded -> "ASNEEDED" + QuoteFieldsAlways -> "ALWAYS" -- | Represent the QuoteField setting. data QuoteFields = QuoteFieldsAsNeeded | QuoteFieldsAlways diff --git a/src/Network/Minio/XmlGenerator.hs b/src/Network/Minio/XmlGenerator.hs index 8c30426..3efe1b7 100644 --- a/src/Network/Minio/XmlGenerator.hs +++ b/src/Network/Minio/XmlGenerator.hs @@ -23,7 +23,6 @@ module Network.Minio.XmlGenerator where import qualified Data.ByteString.Lazy as LBS -import qualified Data.HashMap.Strict as H import qualified Data.Text as T import Lib.Prelude import Network.Minio.Data @@ -77,8 +76,9 @@ data XNode toXML :: Text -> XNode -> ByteString toXML ns node = - LBS.toStrict $ renderLBS def $ - Document (Prologue [] Nothing []) (xmlNode node) [] + LBS.toStrict $ + renderLBS def $ + Document (Prologue [] Nothing []) (xmlNode node) [] where xmlNode :: XNode -> Element xmlNode (XNode name nodes) = @@ -143,14 +143,14 @@ mkSelectRequest r = LBS.toStrict $ renderLBS def sr [NodeContent $ show $ srExpressionType r] ), NodeElement - ( Element "InputSerialization" mempty - $ inputSerializationNodes - $ srInputSerialization r + ( Element "InputSerialization" mempty $ + inputSerializationNodes $ + srInputSerialization r ), NodeElement - ( Element "OutputSerialization" mempty - $ outputSerializationNodes - $ srOutputSerialization r + ( Element "OutputSerialization" mempty $ + outputSerializationNodes $ + srOutputSerialization r ) ] ++ maybe [] reqProgElem (srRequestProgressEnabled r) @@ -186,11 +186,11 @@ mkSelectRequest r = LBS.toStrict $ renderLBS def sr ] comprTypeNode Nothing = [] kvElement (k, v) = Element (Name k Nothing Nothing) mempty [NodeContent v] - formatNode (InputFormatCSV (CSVProp h)) = + formatNode (InputFormatCSV c) = Element "CSV" mempty - (map NodeElement $ map kvElement $ H.toList h) + (map NodeElement $ map kvElement $ csvPropsList c) formatNode (InputFormatJSON p) = Element "JSON" @@ -208,17 +208,17 @@ mkSelectRequest r = LBS.toStrict $ renderLBS def sr formatNode InputFormatParquet = Element "Parquet" mempty [] outputSerializationNodes (OutputSerializationJSON j) = [ NodeElement - ( Element "JSON" mempty - $ rdElem - $ jsonopRecordDelimiter j + ( Element "JSON" mempty $ + rdElem $ + jsonopRecordDelimiter j ) ] - outputSerializationNodes (OutputSerializationCSV (CSVProp h)) = + outputSerializationNodes (OutputSerializationCSV c) = [ NodeElement $ Element "CSV" mempty - (map NodeElement $ map kvElement $ H.toList h) + (map NodeElement $ map kvElement $ csvPropsList c) ] rdElem Nothing = [] rdElem (Just t) = diff --git a/test/Network/Minio/XmlGenerator/Test.hs b/test/Network/Minio/XmlGenerator/Test.hs index d34bcf2..c32852e 100644 --- a/test/Network/Minio/XmlGenerator/Test.hs +++ b/test/Network/Minio/XmlGenerator/Test.hs @@ -90,11 +90,12 @@ testMkPutNotificationRequest = "1" "arn:aws:sqs:us-west-2:444455556666:s3notificationqueue" [ObjectCreatedPut] - ( Filter $ FilterKey $ - FilterRules - [ FilterRule "prefix" "images/", - FilterRule "suffix" ".jpg" - ] + ( Filter $ + FilterKey $ + FilterRules + [ FilterRule "prefix" "images/", + FilterRule "suffix" ".jpg" + ] ), NotificationConfig "" @@ -142,32 +143,32 @@ testMkSelectRequest = mapM_ assertFn cases <> quoteEscapeCharacter "\"" ) (Just False), - [r|Select * from S3ObjectSQLGZIP" -IGNORE","ASNEEDED -",FALSE|] + [r|Select * from S3ObjectSQLGZIP,IGNORE"" +,""ASNEEDED +FALSE|] ), - ( setRequestProgressEnabled False - $ setInputCompressionType CompressionTypeGzip - $ selectRequest - "Select * from S3Object" - documentJsonInput - (outputJSONFromRecordDelimiter "\n"), + ( setRequestProgressEnabled False $ + setInputCompressionType CompressionTypeGzip $ + selectRequest + "Select * from S3Object" + documentJsonInput + (outputJSONFromRecordDelimiter "\n"), [r|Select * from S3ObjectSQLGZIPDOCUMENT FALSE|] ), - ( setRequestProgressEnabled False - $ setInputCompressionType CompressionTypeNone - $ selectRequest - "Select * from S3Object" - defaultParquetInput - ( outputCSVFromProps $ - quoteFields QuoteFieldsAsNeeded - <> recordDelimiter "\n" - <> fieldDelimiter "," - <> quoteCharacter "\"" - <> quoteEscapeCharacter "\"" - ), - [r|Select * from S3ObjectSQLNONE"ASNEEDED -",FALSE|] + ( setRequestProgressEnabled False $ + setInputCompressionType CompressionTypeNone $ + selectRequest + "Select * from S3Object" + defaultParquetInput + ( outputCSVFromProps $ + quoteFields QuoteFieldsAsNeeded + <> recordDelimiter "\n" + <> fieldDelimiter "," + <> quoteCharacter "\"" + <> quoteEscapeCharacter "\"" + ), + [r|Select * from S3ObjectSQLNONE,""ASNEEDED +FALSE|] ) ]