Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions app/DynamicGraphs/CourseFinder.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand All @@ -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

Expand Down
22 changes: 22 additions & 0 deletions app/Models/Requirement.hs
Original file line number Diff line number Diff line change
@@ -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) ""
4 changes: 2 additions & 2 deletions app/WebParsing/ArtSciParser.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
3 changes: 1 addition & 2 deletions app/WebParsing/PostParser.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
11 changes: 0 additions & 11 deletions app/WebParsing/ReqParser.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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) ""
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With this PR's change, let's also move this entire test module file to backend-test/Models/RequirementModelTests.hs, renaming it as necessary. This will help keep the test file organization aligned with the application code organization.

import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit (assertEqual, testCase)
import qualified Text.Parsec as Parsec
Expand All @@ -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)
)
Expand Down Expand Up @@ -415,7 +417,7 @@ cgpaInputs =
)
]

noPrereqInputs :: [(String, Req)]
noPrereqInputs :: [(T.Text, Req)]
noPrereqInputs =
[ ("", None)
, ("None", None)
Expand Down
4 changes: 3 additions & 1 deletion courseography.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ library
Models.Graph,
Models.Meeting,
Models.Program,
Models.Requirement,
Models.Time,
Scripts,
Svg.Builder,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -198,6 +199,7 @@ executable courseography
Models.Graph,
Models.Meeting,
Models.Program,
Models.Requirement,
Models.Time,
Response,
Response.About,
Expand Down
Loading