]> gitweb.michael.orlitzky.com - dead/htsn-import.git/blobdiff - src/TSN/XML/Weather.hs
Update all silent migrations for groundhog-0.7.
[dead/htsn-import.git] / src / TSN / XML / Weather.hs
index e7c0e3c7004ecd456e6d4a4caa92d8e4aba9a7d6..2f3a3ca2b2d32a8759083b13ffa675338393978d 100644 (file)
@@ -1,3 +1,4 @@
+{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE QuasiQuotes #-}
@@ -27,19 +28,19 @@ where
 import Control.Monad ( forM_ )
 import Data.Time ( UTCTime )
 import Data.Tuple.Curry ( uncurryN )
+import qualified Data.Vector.HFixed as H ( HVector, cons, convert )
 import Database.Groundhog (
   countAll,
   deleteAll,
   insert_,
-  migrate,
-  runMigration,
-  silentMigrationLogger )
+  migrate )
 import Database.Groundhog.Core ( DefaultKey )
-import Database.Groundhog.Generic ( runDbConn )
+import Database.Groundhog.Generic ( runDbConn, runMigrationSilent )
 import Database.Groundhog.Sqlite ( withSqliteConn )
 import Database.Groundhog.TH (
   groundhog,
   mkPersist )
+import qualified GHC.Generics as GHC ( Generic )
 import Test.Tasty ( TestTree, testGroup )
 import Test.Tasty.HUnit ( (@?=), testCase )
 import Text.XML.HXT.Core (
@@ -102,7 +103,12 @@ data WeatherForecastListingXml =
   WeatherForecastListingXml {
     xml_teams :: String,
     xml_weather :: Maybe String }
-  deriving (Eq, Show)
+  deriving (Eq, GHC.Generic, Show)
+
+
+-- | For 'H.convert'.
+--
+instance H.HVector WeatherForecastListingXml
 
 
 -- | Database representation of a weather forecast listing. The
@@ -167,7 +173,12 @@ data WeatherForecastXml =
   WeatherForecastXml {
     xml_game_date :: UTCTime,
     xml_leagues :: [WeatherLeague] }
-  deriving (Eq, Show)
+  deriving (Eq, GHC.Generic, Show)
+
+
+-- | For 'H.convert'.
+--
+instance H.HVector WeatherForecastXml
 
 
 instance ToDb WeatherForecastXml where
@@ -189,6 +200,8 @@ instance FromXmlFk WeatherForecastXml where
   --   add the foreign key to the containing 'Weather', and copy the
   --   game date.
   --
+  --   This is so short it's pointless to do it generically.
+  --
   from_xml_fk fk WeatherForecastXml{..} =
     WeatherForecast {
       db_weather_id  = fk,
@@ -222,11 +235,26 @@ data WeatherDetailedWeatherXml =
 --   present in each \<Item\>s.
 --
 data WeatherDetailedWeatherListingXml =
-  WeatherDetailedWeatherListingXml {
-    xml_dtl_listing_sport :: String,
-    xml_dtl_listing_sport_code :: String,
-    xml_items :: [WeatherDetailedWeatherListingItemXml] }
-  deriving (Eq, Show)
+  WeatherDetailedWeatherListingXml
+    String -- xml_dtl_listing_sport, unused
+    String -- xml_dtl_listing_sport_code, unused
+    [WeatherDetailedWeatherListingItemXml] -- xml_items
+  deriving (Eq, GHC.Generic, Show)
+
+
+-- | Accessor for the third field of WeatherDetailedWeatherListingXml.
+--   We don't use field names to avoid the unused field warnings that
+--   we'd otherwise get for the first two fields.
+--
+xml_items :: WeatherDetailedWeatherListingXml
+          -> [WeatherDetailedWeatherListingItemXml]
+xml_items (WeatherDetailedWeatherListingXml _ _ items) = items
+
+
+-- | For 'H.convert'.
+--
+instance H.HVector WeatherDetailedWeatherListingXml
+
 
 -- * WeatherDetailedWeatherListingItem / WeatherDetailedWeatherListingItemXml
 
@@ -237,38 +265,52 @@ data WeatherDetailedWeatherListingXml =
 --   We also drop the sport name, because it's given in the parent
 --   'Weather'.
 --
+--   The leading underscores prevent unused field warnings.
+--
 data WeatherDetailedWeatherListingItem =
   WeatherDetailedWeatherListingItem {
-    db_dtl_weather_id :: DefaultKey Weather, -- ^ Avoid name collision by
+    _db_dtl_weather_id :: DefaultKey Weather, -- ^ Avoid name collision by
                                              --   using \"dtl\" prefix.
-    db_sport_code :: String,
-    db_game_id :: Int,
-    db_dtl_game_date :: UTCTime, -- ^ Avoid name clash with \"dtl\" prefix
-    db_away_team :: String,
-    db_home_team :: String,
-    db_weather_type :: Int,
-    db_description :: Maybe String,
-    db_temp_adjust :: Maybe String,
-    db_temperature :: Int }
+    _db_sport_code :: String,
+    _db_game_id :: Int,
+    _db_dtl_game_date :: UTCTime, -- ^ Avoid name clash with \"dtl\" prefix
+    _db_away_team :: String,
+    _db_home_team :: String,
+    _db_weather_type :: Int,
+    _db_description :: Maybe String,
+    _db_temp_adjust :: Maybe String,
+    _db_temperature :: Int }
+  deriving ( GHC.Generic )
+
+-- | For 'H.cons' and 'H.convert'.
+--
+instance H.HVector WeatherDetailedWeatherListingItem
 
 
 -- | XML representation of a detailed weather item. Same as the
 --   database representation, only without the foreign key and the
 --   sport name that comes from the containing listing.
+--
+--   The leading underscores prevent unused field warnings.
+--
 data WeatherDetailedWeatherListingItemXml =
   WeatherDetailedWeatherListingItemXml {
-    xml_sport_code :: String,
-    xml_game_id :: Int,
-    xml_dtl_game_date :: UTCTime,
-    xml_away_team :: String,
-    xml_home_team :: String,
-    xml_weather_type :: Int,
-    xml_description :: Maybe String,
-    xml_temp_adjust :: Maybe String,
-    xml_temperature :: Int }
-  deriving (Eq, Show)
+    _xml_sport_code :: String,
+    _xml_game_id :: Int,
+    _xml_dtl_game_date :: UTCTime,
+    _xml_away_team :: String,
+    _xml_home_team :: String,
+    _xml_weather_type :: Int,
+    _xml_description :: Maybe String,
+    _xml_temp_adjust :: Maybe String,
+    _xml_temperature :: Int }
+  deriving (Eq, GHC.Generic, Show)
 
 
+-- | For 'H.convert'.
+--
+instance H.HVector WeatherDetailedWeatherListingItemXml
+
 instance ToDb WeatherDetailedWeatherListingItemXml where
   -- | Our database analogue is a 'WeatherDetailedWeatherListingItem'.
   type Db WeatherDetailedWeatherListingItemXml =
@@ -282,18 +324,7 @@ instance Child WeatherDetailedWeatherListingItemXml where
 instance FromXmlFk WeatherDetailedWeatherListingItemXml where
   -- | To convert from the XML to database representation, we simply
   --   add the foreign key (to Weather) and copy the rest of the fields.
-  from_xml_fk fk WeatherDetailedWeatherListingItemXml{..} =
-    WeatherDetailedWeatherListingItem {
-      db_dtl_weather_id = fk,
-      db_sport_code = xml_sport_code,
-      db_game_id = xml_game_id,
-      db_dtl_game_date = xml_dtl_game_date,
-      db_away_team = xml_away_team,
-      db_home_team = xml_home_team,
-      db_weather_type = xml_weather_type,
-      db_description = xml_description,
-      db_temp_adjust = xml_temp_adjust,
-      db_temperature = xml_temperature }
+  from_xml_fk = H.cons
 
 -- | This allows us to insert the XML representation directly without
 --   having to do the manual XML -\> DB conversion.
@@ -326,7 +357,13 @@ data Message =
     xml_forecasts :: [WeatherForecastXml],
     xml_detailed_weather :: Maybe WeatherDetailedWeatherXml,
     xml_time_stamp :: UTCTime }
-  deriving (Eq, Show)
+  deriving (Eq, GHC.Generic, Show)
+
+
+-- | For 'H.convert'.
+--
+instance H.HVector Message
+
 
 instance ToDb Message where
   -- | The database representation of 'Message' is 'Weather'.
@@ -389,11 +426,11 @@ mkPersist tsn_codegen_config [groundhog|
   constructors:
     - name: WeatherDetailedWeatherListingItem
       fields:
-        - name: db_dtl_weather_id
+        - name: _db_dtl_weather_id
           dbName: weather_id
           reference:
             onDelete: cascade
-        - name: db_dtl_game_date
+        - name: _db_dtl_game_date
           dbName: game_date
 
 |]
@@ -503,14 +540,13 @@ instance DbImport Message where
 pickle_listing :: PU WeatherForecastListingXml
 pickle_listing =
   xpElem "listing" $
-    xpWrap (from_pair, to_pair) $
+    xpWrap (from_pair, H.convert) $
       xpPair
         (xpElem "teams" xpText)
         (xpElem "weather" (xpOption xpText))
   where
---    from_pair (ts, Nothing) = WeatherForecastListingXml ts (Just "")
     from_pair = uncurry WeatherForecastListingXml
-    to_pair WeatherForecastListingXml{..} = (xml_teams, xml_weather)
+
 
 
 -- | Pickler to convert a 'WeatherLeague' to/from XML.
@@ -548,7 +584,7 @@ pickle_forecast =
 pickle_item :: PU WeatherDetailedWeatherListingItemXml
 pickle_item =
   xpElem "Item" $
-    xpWrap (from_tuple, to_tuple) $
+    xpWrap (from_tuple, H.convert) $
     xp9Tuple (xpElem "Sportcode" xpText)
              (xpElem "GameID" xpInt)
              (xpElem "Gamedate" xp_datetime)
@@ -560,15 +596,7 @@ pickle_item =
              (xpElem "Temperature" xpInt)
   where
     from_tuple = uncurryN WeatherDetailedWeatherListingItemXml
-    to_tuple w = (xml_sport_code w,
-                  xml_game_id w,
-                  xml_dtl_game_date w,
-                  xml_away_team w,
-                  xml_home_team w,
-                  xml_weather_type w,
-                  xml_description w,
-                  xml_temp_adjust w,
-                  xml_temperature w)
+
 
 
 -- | (Un)pickle a 'WeatherDetailedWeatherListingXml'.
@@ -576,15 +604,12 @@ pickle_item =
 pickle_dw_listing :: PU WeatherDetailedWeatherListingXml
 pickle_dw_listing =
   xpElem "DW_Listing" $
-    xpWrap (from_tuple, to_tuple) $
+    xpWrap (from_tuple, H.convert) $
     xpTriple (xpAttr "SportCode" xpText)
              (xpAttr "Sport" xpText)
              (xpList pickle_item)
   where
     from_tuple = uncurryN WeatherDetailedWeatherListingXml
-    to_tuple w = (xml_dtl_listing_sport w,
-                  xml_dtl_listing_sport_code w,
-                  xml_items w)
 
 
 -- | (Un)pickle a 'WeatherDetailedWeatherXml'
@@ -601,7 +626,7 @@ pickle_detailed_weather =
 pickle_message :: PU Message
 pickle_message =
   xpElem "message" $
-    xpWrap (from_tuple, to_tuple) $
+    xpWrap (from_tuple, H.convert) $
       xp8Tuple
         (xpElem "XML_File_ID" xpInt)
         (xpElem "heading" xpText)
@@ -613,14 +638,6 @@ pickle_message =
         (xpElem "time_stamp" xp_time_stamp)
   where
     from_tuple = uncurryN Message
-    to_tuple Message{..} = (xml_xml_file_id,
-                            xml_heading,
-                            xml_category,
-                            xml_sport,
-                            xml_title,
-                            xml_forecasts,
-                            xml_detailed_weather,
-                            xml_time_stamp)
 
 
 --
@@ -690,7 +707,7 @@ test_on_delete_cascade = testGroup "cascading delete tests"
       let c = undefined :: WeatherForecastListing
       let d = undefined :: WeatherDetailedWeatherListingItem
       actual <- withSqliteConn ":memory:" $ runDbConn $ do
-                  runMigration silentMigrationLogger $ do
+                  runMigrationSilent $ do
                     migrate a
                     migrate b
                     migrate c