diff --git a/CHANGELOG.md b/CHANGELOG.md index ea7751191..5aafc1fdd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ ### 🔧 Internal changes +- Refactored `parseReqs` into a new module `Models.Requirement` and updated its input type from `String` to `Text` - Added a test case for the getGraphJSON function in `Controllers/Graph` - Migrated JS package manager from yarn to pnpm - Updated `react-leaflet` to v5.0.0 and `@eslint/compat` to v2.1.0 diff --git a/app/DynamicGraphs/CourseFinder.hs b/app/DynamicGraphs/CourseFinder.hs index d1e93f82c..106f1c7bc 100644 --- a/app/DynamicGraphs/CourseFinder.hs +++ b/app/DynamicGraphs/CourseFinder.hs @@ -14,7 +14,7 @@ import qualified Data.Text.Lazy as T import Database.Requirement (Modifier (..), Req (..)) import DynamicGraphs.GraphOptions (GraphOptions (..)) import Models.Course (prereqsForCourse) -import WebParsing.ReqParser (parseReqs) +import Models.Requirement (parseReqs) lookupCourses :: GraphOptions -> [T.Text] -> IO (Map.Map T.Text Req) lookupCourses options courses = @@ -26,7 +26,7 @@ lookupCourse options code = do case prereqResults of Left _ -> return () Right (courseCode, prereqStr) -> do - let prereqs = parseReqs (T.unpack $ T.fromStrict prereqStr) + let prereqs = parseReqs prereqStr modify $ Map.insert (T.fromStrict courseCode) prereqs lookupReqs options prereqs diff --git a/app/Models/Requirement.hs b/app/Models/Requirement.hs new file mode 100644 index 000000000..ad8151781 --- /dev/null +++ b/app/Models/Requirement.hs @@ -0,0 +1,22 @@ +module Models.Requirement ( + parseReqs, +) where + +import Data.Char (isSpace) +import qualified Data.Text as T +import Database.Requirement (Req (J, None)) +import qualified Text.Parsec as Parsec +import WebParsing.ReqParser (reqParser) + +-- | Parses prerequisite strings into the Requirement datatype +parseReqs :: T.Text -> Req +parseReqs reqText = + let reqLower = T.toLower reqText + reqString = T.unpack reqText + in if all isSpace reqString || reqLower == "none" || reqLower == "no" + then None + else do + let req = Parsec.parse reqParser "" reqString + in case req of + Right x -> x + Left e -> J (show e) "" diff --git a/app/WebParsing/ArtSciParser.hs b/app/WebParsing/ArtSciParser.hs index 9c9e47dd2..2a64ddb64 100644 --- a/app/WebParsing/ArtSciParser.hs +++ b/app/WebParsing/ArtSciParser.hs @@ -13,6 +13,7 @@ import Database.Persist.Sqlite (SqlPersistM) import Database.Tables (Course (..), Department (..)) import Models.Building (parseBuildings) import Models.Course (insertCourse) +import Models.Requirement (parseReqs) import Network.HTTP.Simple (getResponseBody, httpLBS, parseRequest) import Text.HTML.TagSoup (Tag) import qualified Text.HTML.TagSoup as TS @@ -22,7 +23,6 @@ import qualified Text.Parsec.Char as P import Text.Parsec.Text (Parser) import WebParsing.ParsecCombinators (text) import WebParsing.PostParser (addPostToDatabase) -import WebParsing.ReqParser (parseReqs) parseCalendar :: IO () parseCalendar = do @@ -141,7 +141,7 @@ parseCourses tags = code (Just title) (Just description) - (fmap (T.pack . show . parseReqs . T.unpack) prereqString) + (fmap (T.pack . show . parseReqs) prereqString) prep exclusion Nothing diff --git a/app/WebParsing/PostParser.hs b/app/WebParsing/PostParser.hs index 2b24f09a1..eb5b0f135 100644 --- a/app/WebParsing/PostParser.hs +++ b/app/WebParsing/PostParser.hs @@ -17,12 +17,12 @@ import Database.DataType (ProgramType (..)) import Database.Persist (insertUnique) import Database.Persist.Sqlite (SqlPersistM, insert_) import Database.Tables +import Models.Requirement (parseReqs) import Text.HTML.TagSoup import Text.HTML.TagSoup.Match import qualified Text.Parsec as P import Text.Parsec.Text (Parser) import WebParsing.ParsecCombinators (parseUntil) -import WebParsing.ReqParser (parseReqs) addPostToDatabase :: [Tag T.Text] -> SqlPersistM () addPostToDatabase programElements = do @@ -165,7 +165,6 @@ parseRequirement requirement = map parseSingleReq $ filter isReq requirement T.pack . show . parseReqs - . T.unpack -- Using parser for new Req type . fromRight "" . P.parse getLineText "Reading a requirement line" . T.strip diff --git a/app/WebParsing/ReqParser.hs b/app/WebParsing/ReqParser.hs index 03c9033ef..f24c8ad4c 100644 --- a/app/WebParsing/ReqParser.hs +++ b/app/WebParsing/ReqParser.hs @@ -729,14 +729,3 @@ many1Till p end = do x <- p xs <- Parsec.manyTill p end return $ x : xs - -parseReqs :: String -> Req -parseReqs reqString = do - let reqStringLower = map toLower reqString - if all isSpace reqString || reqStringLower == "none" || reqStringLower == "no" - then None - else do - let req = Parsec.parse reqParser "" reqString - in case req of - Right x -> x - Left e -> J (show e) "" diff --git a/backend-test/RequirementTests/ReqParserTests.hs b/backend-test/Models/RequirementModelTests.hs similarity index 98% rename from backend-test/RequirementTests/ReqParserTests.hs rename to backend-test/Models/RequirementModelTests.hs index d26f7f294..b5459bd6f 100644 --- a/backend-test/RequirementTests/ReqParserTests.hs +++ b/backend-test/Models/RequirementModelTests.hs @@ -2,9 +2,11 @@ -- Description: Test Course Requirement Parsers using HUnit Testing Framework. -- -- Module containing test cases for Requirement Parsers. -module RequirementTests.ReqParserTests (test_requirements) where +module Models.RequirementModelTests (test_requirements) where +import qualified Data.Text as T import Database.Requirement +import Models.Requirement (parseReqs) import Test.Tasty (TestTree, testGroup) import Test.Tasty.HUnit (assertEqual, testCase) import qualified Text.Parsec as Parsec @@ -26,14 +28,14 @@ createTest parser label input = [0 ..] input -createReqParserTest :: String -> [(String, Req)] -> TestTree +createReqParserTest :: String -> [(T.Text, Req)] -> TestTree createReqParserTest label input = testGroup label $ zipWith ( \(x :: Int) (y, z) -> testCase ("Test " ++ show x) $ assertEqual - ("for (" ++ y ++ "),") + ("for (" ++ T.unpack y ++ "),") z (parseReqs y) ) @@ -415,7 +417,7 @@ cgpaInputs = ) ] -noPrereqInputs :: [(String, Req)] +noPrereqInputs :: [(T.Text, Req)] noPrereqInputs = [ ("", None) , ("None", None) diff --git a/courseography.cabal b/courseography.cabal index 285b9a212..b54e473d7 100644 --- a/courseography.cabal +++ b/courseography.cabal @@ -48,6 +48,7 @@ library Models.Graph, Models.Meeting, Models.Program, + Models.Requirement, Models.Time, Scripts, Svg.Builder, @@ -124,10 +125,10 @@ test-suite Tests Database.BuildingTests, Database.CourseQueriesTests, Database.TablesTests, + Models.RequirementModelTests, RequirementTests.ModifierTests, RequirementTests.PostParserTests, RequirementTests.PreProcessingTests, - RequirementTests.ReqParserTests, RequirementTests.FilterReqTests, SvgTests.IntersectionTests, TestHelpers, @@ -198,6 +199,7 @@ executable courseography Models.Graph, Models.Meeting, Models.Program, + Models.Requirement, Models.Time, Response, Response.About,