gopro-plus 0.4.1.1 → 0.4.1.2
raw patch · 3 files changed
+61/−12 lines, 3 filesdep +QuickCheckdep +generic-randomPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
Dependencies added: QuickCheck, generic-random
API changes (from Hackage documentation)
+ GoPro.Plus.Media: instance Data.Aeson.Types.ToJSON.ToJSON GoPro.Plus.Media.File
+ GoPro.Plus.Media: instance Data.Aeson.Types.ToJSON.ToJSON GoPro.Plus.Media.FileInfo
+ GoPro.Plus.Media: instance Data.Aeson.Types.ToJSON.ToJSON GoPro.Plus.Media.FileStuff
+ GoPro.Plus.Media: instance Data.Aeson.Types.ToJSON.ToJSON GoPro.Plus.Media.SidecarFile
+ GoPro.Plus.Media: instance Data.Aeson.Types.ToJSON.ToJSON GoPro.Plus.Media.Sprite
+ GoPro.Plus.Media: instance Data.Aeson.Types.ToJSON.ToJSON GoPro.Plus.Media.SpriteFrame
+ GoPro.Plus.Media: instance Data.Aeson.Types.ToJSON.ToJSON GoPro.Plus.Media.Variation
+ GoPro.Plus.Media: instance GHC.Classes.Eq GoPro.Plus.Media.File
+ GoPro.Plus.Media: instance GHC.Classes.Eq GoPro.Plus.Media.FileInfo
+ GoPro.Plus.Media: instance GHC.Classes.Eq GoPro.Plus.Media.FileStuff
+ GoPro.Plus.Media: instance GHC.Classes.Eq GoPro.Plus.Media.SidecarFile
+ GoPro.Plus.Media: instance GHC.Classes.Eq GoPro.Plus.Media.Sprite
+ GoPro.Plus.Media: instance GHC.Classes.Eq GoPro.Plus.Media.SpriteFrame
+ GoPro.Plus.Media: instance GHC.Classes.Eq GoPro.Plus.Media.Variation
Files
- gopro-plus.cabal +4/−2
- src/GoPro/Plus/Media.hs +36/−9
- test/Spec.hs +21/−1
gopro-plus.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 5b7fb7002e78e23ecd379959812b6b7c768dd92c34f4c9209fb38f4fb3b6bf65+-- hash: 28577c1446cea69369980bb3681d24a71ca38ae9c295c29333f0e6671cff1972 name: gopro-plus-version: 0.4.1.1+version: 0.4.1.2 synopsis: GoPro Plus Client API. description: Please see the README on GitHub at <https://github.com/dustin/gopro-plus#readme> category: Web@@ -74,6 +74,7 @@ ghc-options: -threaded -rtsopts -with-rtsopts=-N build-depends: HUnit+ , QuickCheck , aeson , base >=4.7 && <5 , bytestring@@ -81,6 +82,7 @@ , exceptions , filepath , generic-deriving+ , generic-random , gopro-plus , lens , lens-aeson
src/GoPro/Plus/Media.hs view
@@ -43,11 +43,11 @@ updateMedium, putMedium ) where -import Control.Lens+import Control.Lens hiding ((.=)) import Control.Monad.IO.Class (MonadIO (..)) import Data.Aeson (FromJSON (..), Options (..), ToJSON (..), Value (..), defaultOptions, fieldLabelModifier, genericParseJSON, genericToEncoding, genericToJSON,- (.:))+ object, (.:), (.=)) import qualified Data.Aeson as J import Data.Aeson.Types (typeMismatch) import qualified Data.ByteString.Lazy as BL@@ -218,7 +218,7 @@ , _file_head :: String , _file_url :: String }- deriving (Generic, Show)+ deriving (Generic, Eq, Show) makeLenses ''File @@ -230,6 +230,10 @@ fieldLabelModifier = dropPrefix "_file_" } +instance ToJSON File where+ toEncoding = genericToEncoding jsonOpts{ fieldLabelModifier = dropPrefix "_file_" }+ toJSON = genericToJSON jsonOpts{ fieldLabelModifier = dropPrefix "_file_" }+ data Variation = Variation { _var_height :: Int , _var_width :: Int@@ -240,7 +244,7 @@ , _var_head :: String , _var_url :: String }- deriving (Generic, Show)+ deriving (Generic, Eq, Show) makeLenses ''Variation @@ -254,12 +258,16 @@ fieldLabelModifier = dropPrefix "_var_" } +instance ToJSON Variation where+ toEncoding = genericToEncoding jsonOpts{ fieldLabelModifier = dropPrefix "_var_" }+ toJSON = genericToJSON jsonOpts{ fieldLabelModifier = dropPrefix "_var_" }+ data SpriteFrame = SpriteFrame { _frame_count :: Int , _frame_height :: Int , _frame_width :: Int }- deriving (Generic, Show)+ deriving (Generic, Eq, Show) makeLenses ''SpriteFrame @@ -268,6 +276,10 @@ fieldLabelModifier = dropPrefix "_frame_" } +instance ToJSON SpriteFrame where+ toEncoding = genericToEncoding jsonOpts{ fieldLabelModifier = dropPrefix "_frame_" }+ toJSON = genericToJSON jsonOpts{ fieldLabelModifier = dropPrefix "_frame_" }+ data Sprite = Sprite { _sprite_fps :: Double , _sprite_frame :: SpriteFrame@@ -277,7 +289,7 @@ , _sprite_heads :: [String] , _sprite_urls :: [String] }- deriving (Generic, Show)+ deriving (Generic, Eq, Show) makeLenses ''Sprite @@ -286,13 +298,17 @@ fieldLabelModifier = dropPrefix "_sprite_" } +instance ToJSON Sprite where+ toEncoding = genericToEncoding jsonOpts{ fieldLabelModifier = dropPrefix "_sprite_" }+ toJSON = genericToJSON jsonOpts{ fieldLabelModifier = dropPrefix "_sprite_" }+ data SidecarFile = SidecarFile { _sidecar_fps :: Double , _sidecar_label :: String , _sidecar_type :: String , _sidecar_head :: String , _sidecar_url :: String- } deriving (Generic, Show)+ } deriving (Generic, Eq, Show) makeLenses ''SidecarFile @@ -306,24 +322,32 @@ fieldLabelModifier = dropPrefix "_sidecar_" } +instance ToJSON SidecarFile where+ toEncoding = genericToEncoding jsonOpts{ fieldLabelModifier = dropPrefix "_sidecar_" }+ toJSON = genericToJSON jsonOpts{ fieldLabelModifier = dropPrefix "_sidecar_" }+ data FileStuff = FileStuff { _files :: [File] , _variations :: [Variation] , _sprites :: [Sprite] , _sidecar_files :: [SidecarFile] }- deriving (Generic, Show)+ deriving (Generic, Eq, Show) makeLenses ''FileStuff instance FromJSON FileStuff where parseJSON = genericParseJSON jsonOpts +instance ToJSON FileStuff where+ toEncoding = genericToEncoding jsonOpts{ fieldLabelModifier = dropPrefix "_" }+ toJSON = genericToJSON jsonOpts{ fieldLabelModifier = dropPrefix "_" }+ data FileInfo = FileInfo { _fileStuff :: FileStuff , _filename :: String }- deriving (Generic, Show)+ deriving (Generic, Eq, Show) makeLenses ''FileInfo @@ -333,6 +357,9 @@ fs <- parseJSON o FileInfo fs <$> v .: "filename" parseJSON invalid = typeMismatch "Response" invalid++instance ToJSON FileInfo where+ toJSON FileInfo{..} = object ["_embedded" .= _fileStuff, "filename" .= _filename] dlURL :: MediumID -> String dlURL k = "https://api.gopro.com/media/" <> T.unpack k <> "/download"
test/Spec.hs view
@@ -3,8 +3,11 @@ import Control.Lens import qualified Data.Aeson as J import qualified Data.ByteString.Lazy as BL+import Data.Maybe (fromJust) import Text.RawString.QQ (r) +import Generic.Random (genericArbitrary, uniform)+import Test.QuickCheck ((===)) import Test.Tasty import Test.Tasty.HUnit import Test.Tasty.QuickCheck as QC@@ -50,11 +53,28 @@ assertEqual (show fs) "intoalightpost" (fs ^. files . folded . file_transforms . folded . folded) +instance Arbitrary FileInfo where arbitrary = genericArbitrary uniform +instance Arbitrary FileStuff where arbitrary = genericArbitrary uniform++instance Arbitrary Variation where arbitrary = genericArbitrary uniform++instance Arbitrary SpriteFrame where arbitrary = genericArbitrary uniform++instance Arbitrary SidecarFile where arbitrary = genericArbitrary uniform++instance Arbitrary Sprite where arbitrary = genericArbitrary uniform++instance Arbitrary File where arbitrary = genericArbitrary uniform++propRoundtripFileInfo :: FileInfo -> Property+propRoundtripFileInfo = fromJust . J.decode . J.encode >>= (===)+ tests :: [TestTree] tests = [ testCase "Parsing" testSearchParser,- testCase "FileInfo" testFileInfo+ testCase "FileInfo" testFileInfo,+ testProperty "FileInfo round tripping" propRoundtripFileInfo ] main :: IO ()