From c864af7aa8a195cf441904479c416202590e9375 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Thu, 6 Nov 2014 20:29:15 -0500 Subject: [PATCH] Complete TSN.XML.AutoRacingDriverList. Remove AutoRacingDriverList.dtd from the TODO. Add a dbschema diagram for AutoRacingDriverList.dtd. Update the cabal/.ghci files with the new module name. Add tests for the new module. --- .ghci | 2 + doc/TODO | 1 - doc/dbschema/AutoRacingDriverList.png | Bin 0 -> 57934 bytes htsn-import.cabal | 1 + src/TSN/XML/AutoRacingDriverList.hs | 228 ++++++++++++++++++++++++-- test/TestSuite.hs | 4 +- test/shell/import-duplicates.test | 4 +- 7 files changed, 225 insertions(+), 15 deletions(-) create mode 100644 doc/dbschema/AutoRacingDriverList.png diff --git a/.ghci b/.ghci index be99942..dfeb6df 100644 --- a/.ghci +++ b/.ghci @@ -17,6 +17,7 @@ src/TSN/Picklers.hs src/TSN/Team.hs src/TSN/XmlImport.hs + src/TSN/XML/AutoRacingDriverList.hs src/TSN/XML/AutoRacingResults.hs src/TSN/XML/AutoRacingSchedule.hs src/TSN/XML/EarlyLine.hs @@ -49,6 +50,7 @@ import TSN.Parse import TSN.Picklers import TSN.Team import TSN.XmlImport +import TSN.XML.AutoRacingDriverList import TSN.XML.AutoRacingResults import TSN.XML.AutoRacingSchedule import TSN.XML.EarlyLine diff --git a/doc/TODO b/doc/TODO index 2f1143d..92290ae 100644 --- a/doc/TODO +++ b/doc/TODO @@ -18,7 +18,6 @@ FeedGrabber. They are not yet handled by htsn-import (some may not be valid): - * AutoRacingDriverList * AutoRacingGridXML * CBASK_Individual_Stats_XML * Cbask_Roster_XML diff --git a/doc/dbschema/AutoRacingDriverList.png b/doc/dbschema/AutoRacingDriverList.png new file mode 100644 index 0000000000000000000000000000000000000000..430e017197dd65d8c6e416e0ec3cf84fe9e02dda GIT binary patch literal 57934 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

+;!2Wn2uwt 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

g?!+6w>CL#|iUQf8mnLYYweurGOY#LZFQviu< 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 Vw0hYZh+9D5W1w?QyHL|1;(tHsPOty~ literal 0 HcmV?d00001 diff --git a/htsn-import.cabal b/htsn-import.cabal index afa02df..203f1cd 100644 --- a/htsn-import.cabal +++ b/htsn-import.cabal @@ -284,6 +284,7 @@ executable htsn-import TSN.Picklers TSN.Team TSN.XmlImport + TSN.XML.AutoRacingDriverList TSN.XML.AutoRacingResults TSN.XML.AutoRacingSchedule TSN.XML.EarlyLine diff --git a/src/TSN/XML/AutoRacingDriverList.hs b/src/TSN/XML/AutoRacingDriverList.hs index d2c8358..327c358 100644 --- a/src/TSN/XML/AutoRacingDriverList.hs +++ b/src/TSN/XML/AutoRacingDriverList.hs @@ -1,4 +1,8 @@ +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} @@ -8,22 +12,56 @@ -- module TSN.XML.AutoRacingDriverList ( dtd, - pickle_message ) + pickle_message, + -- * Tests + auto_racing_driver_list_tests, + -- * WARNING: these are private but exported to silence warnings + AutoRacingDriverListConstructor(..), + AutoRacingDriverListListingConstructor(..) ) where -- System imports. +import Control.Monad ( forM_ ) import Data.Time ( UTCTime(..) ) +import Data.Tuple.Curry ( uncurryN ) +import Database.Groundhog ( + countAll, + deleteAll, + migrate, + runMigration, + silentMigrationLogger ) import Database.Groundhog.Core ( DefaultKey ) -import Text.XML.HXT.Core ( PU ) +import Database.Groundhog.Generic ( runDbConn ) +import Database.Groundhog.Sqlite ( withSqliteConn ) +import Database.Groundhog.TH ( + groundhog, + mkPersist ) +import Test.Tasty ( TestTree, testGroup ) +import Test.Tasty.HUnit ( (@?=), testCase ) +import Text.XML.HXT.Core ( + PU, + xp7Tuple, + xp9Tuple, + xpElem, + xpInt, + xpList, + xpOption, + xpText, + xpWrap ) -- Local imports. -import TSN.DbImport ( DbImport(..) ) +import TSN.Codegen ( tsn_codegen_config ) +import TSN.DbImport ( DbImport(..), ImportResult(..), run_dbmigrate ) +import TSN.Picklers ( xp_date, xp_time_stamp ) import TSN.XmlImport ( XmlImport(..), XmlImportFk(..) ) import Xml ( Child(..), FromXml(..), FromXmlFk(..), - ToDb(..) ) + ToDb(..), + pickle_unpickle, + unpickleable, + unsafe_unpickle ) -- | The DTD to which this module corresponds. Used to invoke dbimport. -- @@ -31,10 +69,10 @@ dtd :: String dtd = "AutoRacingDriverList.dtd" -- --- DB/XML data types +-- * DB/XML data types -- --- * AutoRacingDriverList/Message +-- AutoRacingDriverList/Message -- | Database representation of a 'Message'. Comparatively, it lacks -- only the listings. @@ -95,21 +133,21 @@ instance FromXml Message where instance XmlImport Message --- * AutoRacingDriverListListing / AutoRacingDriverListListingXml +-- AutoRacingDriverListListing / AutoRacingDriverListListingXml -- | Database representation of a \ contained within a -- \. -- data AutoRacingDriverListListing = AutoRacingDriverListListing { - db_auto_racing_driver_list_id :: DefaultKey AutoRacingDriverList, + db_auto_racing_driver_lists_id :: DefaultKey AutoRacingDriverList, db_driver_id :: Int, db_driver :: String, db_height :: Maybe String, db_weight :: Int, db_date_of_birth :: UTCTime, db_hometown :: String, - db_nationality :: String, + db_nationality :: Maybe String, db_car_number :: Int, db_car :: String } @@ -124,7 +162,7 @@ data AutoRacingDriverListListingXml = xml_weight :: Int, xml_date_of_birth :: UTCTime, xml_hometown :: String, - xml_nationality :: String, + xml_nationality :: Maybe String, xml_car_number :: Int, xml_car :: String } deriving (Eq, Show) @@ -151,7 +189,7 @@ instance FromXmlFk AutoRacingDriverListListingXml where -- from_xml_fk fk AutoRacingDriverListListingXml{..} = AutoRacingDriverListListing { - db_auto_racing_driver_list_id = fk, + db_auto_racing_driver_lists_id = fk, db_driver_id = xml_driver_id, db_driver = xml_driver, db_height = xml_height, @@ -167,3 +205,171 @@ instance FromXmlFk AutoRacingDriverListListingXml where -- 'AutoRacingDriverListListingXml' directly. -- instance XmlImportFk AutoRacingDriverListListingXml + + + +-- +-- * Database +-- + +instance DbImport Message where + dbmigrate _ = + run_dbmigrate $ do + migrate (undefined :: AutoRacingDriverList) + migrate (undefined :: AutoRacingDriverListListing) + + -- | We insert the message, then use its ID to insert the listings. + dbimport m = do + msg_id <- insert_xml m + forM_ (xml_listings m) $ insert_xml_fk_ msg_id + + return ImportSucceeded + + + +mkPersist tsn_codegen_config [groundhog| +- entity: AutoRacingDriverList + dbName: auto_racing_driver_lists + constructors: + - name: AutoRacingDriverList + uniques: + - name: unique_auto_racing_driver_lists + type: constraint + # Prevent multiple imports of the same message. + fields: [db_xml_file_id] + + +- entity: AutoRacingDriverListListing + dbName: auto_racing_driver_lists_listings + constructors: + - name: AutoRacingDriverListListing + fields: + - name: db_auto_racing_driver_lists_id + reference: + onDelete: cascade + +|] + + +-- +-- * Pickling +-- + +-- | Pickler for the \s contained within \s. +-- +pickle_listing :: PU AutoRacingDriverListListingXml +pickle_listing = + xpElem "Listing" $ + xpWrap (from_tuple, to_tuple) $ + xp9Tuple (xpElem "DriverID" xpInt) + (xpElem "Driver" xpText) + (xpElem "Height" $ xpOption xpText) + (xpElem "Weight" xpInt) + (xpElem "DOB" xp_date) + (xpElem "Hometown" xpText) + (xpElem "Nationality" $ xpOption xpText) + (xpElem "Car_Number" xpInt) + (xpElem "Car" xpText) + where + from_tuple = uncurryN AutoRacingDriverListListingXml + to_tuple m = (xml_driver_id m, + xml_driver m, + xml_height m, + xml_weight m, + xml_date_of_birth m, + xml_hometown m, + xml_nationality m, + xml_car_number m, + xml_car m) + +-- | Pickler for the top-level 'Message'. +-- +pickle_message :: PU Message +pickle_message = + xpElem "message" $ + xpWrap (from_tuple, to_tuple) $ + xp7Tuple (xpElem "XML_File_ID" xpInt) + (xpElem "heading" xpText) + (xpElem "category" xpText) + (xpElem "sport" xpText) + (xpElem "Title" xpText) + (xpList pickle_listing) + (xpElem "time_stamp" xp_time_stamp) + where + from_tuple = uncurryN Message + to_tuple m = (xml_xml_file_id m, + xml_heading m, + xml_category m, + xml_sport m, + xml_title m, + xml_listings m, + xml_time_stamp m) + + + +-- +-- * Tasty Tests +-- + +-- | A list of all tests for this module. +-- +auto_racing_driver_list_tests :: TestTree +auto_racing_driver_list_tests = + testGroup + "AutoRacingDriverList tests" + [ test_on_delete_cascade, + test_pickle_of_unpickle_is_identity, + test_unpickle_succeeds ] + + +-- | If we unpickle something and then pickle it, we should wind up +-- with the same thing we started with. WARNING: success of this +-- test does not mean that unpickling succeeded. +-- +test_pickle_of_unpickle_is_identity :: TestTree +test_pickle_of_unpickle_is_identity = testGroup "pickle-unpickle tests" + [ check "pickle composed with unpickle is the identity" + "test/xml/AutoRacingDriverList.xml" ] + where + check desc path = testCase desc $ do + (expected, actual) <- pickle_unpickle pickle_message path + actual @?= expected + + +-- | Make sure we can actually unpickle these things. +-- +test_unpickle_succeeds :: TestTree +test_unpickle_succeeds = testGroup "unpickle tests" + [ check "unpickling succeeds" + "test/xml/AutoRacingDriverList.xml" ] + where + check desc path = testCase desc $ do + actual <- unpickleable path pickle_message + let expected = True + actual @?= expected + + +-- | Make sure everything gets deleted when we delete the top-level +-- record. +-- +test_on_delete_cascade :: TestTree +test_on_delete_cascade = testGroup "cascading delete tests" + [ check "deleting auto_racing_driver_lists deletes its children" + "test/xml/AutoRacingDriverList.xml" ] + where + check desc path = testCase desc $ do + results <- unsafe_unpickle path pickle_message + let a = undefined :: AutoRacingDriverList + let b = undefined :: AutoRacingDriverListListing + + actual <- withSqliteConn ":memory:" $ runDbConn $ do + runMigration silentMigrationLogger $ do + migrate a + migrate b + _ <- dbimport results + deleteAll a + count_a <- countAll a + count_b <- countAll b + return $ sum [count_a, count_b] + let expected = 0 + actual @?= expected diff --git a/test/TestSuite.hs b/test/TestSuite.hs index b64d2d6..56cc7dd 100644 --- a/test/TestSuite.hs +++ b/test/TestSuite.hs @@ -2,6 +2,7 @@ import Test.Tasty ( TestTree, defaultMain, testGroup ) import TSN.Parse ( parse_tests ) import TSN.Picklers ( pickler_tests ) +import TSN.XML.AutoRacingDriverList ( auto_racing_driver_list_tests ) import TSN.XML.AutoRacingResults ( auto_racing_results_tests ) import TSN.XML.AutoRacingSchedule ( auto_racing_schedule_tests ) import TSN.XML.EarlyLine ( early_line_tests ) @@ -21,7 +22,8 @@ import TSN.XML.Weather ( weather_tests ) tests :: TestTree tests = testGroup "All tests" - [ auto_racing_results_tests, + [ auto_racing_driver_list_tests, + auto_racing_results_tests, auto_racing_schedule_tests, early_line_tests, game_info_tests, diff --git a/test/shell/import-duplicates.test b/test/shell/import-duplicates.test index 1cc7bd6..a8b3561 100644 --- a/test/shell/import-duplicates.test +++ b/test/shell/import-duplicates.test @@ -16,7 +16,7 @@ rm -f shelltest.sqlite3 # and a newsxml that aren't really supposed to import. find ./test/xml -maxdepth 1 -name '*.xml' | wc -l >>> -39 +40 >>>= 0 # Run the imports again; we should get complaints about the duplicate @@ -26,7 +26,7 @@ find ./test/xml -maxdepth 1 -name '*.xml' | wc -l # know, sorry. ./dist/build/htsn-import/htsn-import -c 'shelltest.sqlite3' test/xml/*.xml 2>&1 | grep ERROR | wc -l >>> -70 +72 >>>= 0 # Finally, clean up after ourselves. -- 2.43.2