Просмотр исходного кода

Add a specific type for JobFlexibility

jherve 1 год назад
Родитель
Сommit
fd9e18474b

+ 5 - 5
src/LinkedIn/Jobs/JobOffer.purs

@@ -8,14 +8,14 @@ import Data.Lens (findOf)
 import Data.Maybe (Maybe(..), isJust)
 import Data.Maybe (Maybe(..), isJust)
 import Data.Show.Generic (genericShow)
 import Data.Show.Generic (genericShow)
 import LinkedIn.JobsUnifiedTopCard (JobsUnifiedTopCardElement, TopCardInsight(..), TopCardInsightContent(..), _top_to_action_buttons, _top_to_insights, toHeader, toPrimaryDescriptionLink, toPrimaryDescriptionText)
 import LinkedIn.JobsUnifiedTopCard (JobsUnifiedTopCardElement, TopCardInsight(..), TopCardInsightContent(..), _top_to_action_buttons, _top_to_insights, toHeader, toPrimaryDescriptionLink, toPrimaryDescriptionText)
-import LinkedIn.UIElements.Types (UIElement(..), UIString(..))
+import LinkedIn.UIElements.Types (JobFlexibility, UIElement(..), UIString(..))
 
 
 data JobOffer = JobOffer {
 data JobOffer = JobOffer {
   title :: String,
   title :: String,
   companyName :: String,
   companyName :: String,
   companyLink :: String,
   companyLink :: String,
   location :: Maybe String,
   location :: Maybe String,
-  remote :: Maybe String,
+  flexibility :: Maybe JobFlexibility,
   companyDomain :: Maybe String,
   companyDomain :: Maybe String,
   companySize :: Maybe String,
   companySize :: Maybe String,
   hasSimplifiedApplicationProcess :: Boolean
   hasSimplifiedApplicationProcess :: Boolean
@@ -37,7 +37,7 @@ fromUI card = ado
       companyName,
       companyName,
       companyLink,
       companyLink,
       location: extractLocation primaryDescText,
       location: extractLocation primaryDescText,
-      remote: extractJobRemote =<< jobInsight,
+      flexibility: extractJobRemote =<< jobInsight,
       companyDomain: extractCompanyDomain =<< companyInsight,
       companyDomain: extractCompanyDomain =<< companyInsight,
       companySize: extractCompanySize =<< companyInsight,
       companySize: extractCompanySize =<< companyInsight,
       hasSimplifiedApplicationProcess: isJust $ extractSimplifiedApplicationProcess =<< applyButton
       hasSimplifiedApplicationProcess: isJust $ extractSimplifiedApplicationProcess =<< applyButton
@@ -91,9 +91,9 @@ extractLocation = case _ of
   UIElement (UIStringDotSeparated _ (UIStringPlain str)) -> Just str
   UIElement (UIStringDotSeparated _ (UIStringPlain str)) -> Just str
   _ -> Nothing
   _ -> Nothing
 
 
-extractJobRemote :: TopCardInsight UIElement -> Maybe String
+extractJobRemote :: TopCardInsight UIElement -> Maybe JobFlexibility
 extractJobRemote = case _ of
 extractJobRemote = case _ of
-  TopCardInsight {content: TopCardInsightContentSecondary {primary: (UIElement (UIStringPlain str))}} -> Just str
+  TopCardInsight {content: TopCardInsightContentSecondary {primary: (UIElement (UIStringJobFlex flex))}} -> Just flex
   _ -> Nothing
   _ -> Nothing
 
 
 extractSimplifiedApplicationProcess ∷ UIElement → Maybe Boolean
 extractSimplifiedApplicationProcess ∷ UIElement → Maybe Boolean

+ 17 - 2
src/LinkedIn/UIElements/Parser.purs

@@ -18,7 +18,7 @@ import Data.Maybe (Maybe(..))
 import Data.String as S
 import Data.String as S
 import Data.String.CodePoints (codePointFromChar)
 import Data.String.CodePoints (codePointFromChar)
 import Data.Tuple (Tuple(..))
 import Data.Tuple (Tuple(..))
-import LinkedIn.UIElements.Types (Duration(..), MonthYear(..), MonthYearOrToday(..), TimeSpan(..), UIString(..))
+import LinkedIn.UIElements.Types (Duration(..), JobFlexibility(..), MonthYear(..), MonthYearOrToday(..), TimeSpan(..), UIString(..))
 import Parsing (Parser, ParserT, fail, liftMaybe, runParser)
 import Parsing (Parser, ParserT, fail, liftMaybe, runParser)
 import Parsing.Combinators (choice, try)
 import Parsing.Combinators (choice, try)
 import Parsing.String (char, rest, string)
 import Parsing.String (char, rest, string)
@@ -120,6 +120,18 @@ durationP = (try yearsMonthP) <|> (try monthsP) <|> yearsP where
 
 
     pure $ YearsMonth y m
     pure $ YearsMonth y m
 
 
+jobFlexP :: Parser String JobFlexibility
+jobFlexP = (try hybrid) <|> (try onSite) <|> (try fullRemote) where
+  hybrid = do
+    _ <- string("Hybride")
+    pure JobFlexHybrid
+  onSite = do
+    _ <- string("Sur site")
+    pure JobFlexOnSite
+  fullRemote = do
+    _ <- string("À distance")
+    pure JobFlexFullRemote
+
 medianDotP ∷ Parser String Char
 medianDotP ∷ Parser String Char
 medianDotP = char('·') <|> char('•')
 medianDotP = char('·') <|> char('•')
 
 
@@ -170,7 +182,7 @@ medianDotSeparated = do
   pure $ Tuple (S.trim a0) (S.trim a1)
   pure $ Tuple (S.trim a0) (S.trim a1)
 
 
 uiStringSingleP ∷ Parser String UIString
 uiStringSingleP ∷ Parser String UIString
-uiStringSingleP = (try uiStringDurationP) <|> (try uiStringTimeSpanP) <|> uiStringPlainP
+uiStringSingleP = (try uiStringDurationP) <|> (try uiStringTimeSpanP) <|> (try uiStringJobFlexP) <|> uiStringPlainP
 
 
 uiStringDurationP ∷ Parser String UIString
 uiStringDurationP ∷ Parser String UIString
 uiStringDurationP = UIStringDuration <$> durationP
 uiStringDurationP = UIStringDuration <$> durationP
@@ -178,5 +190,8 @@ uiStringDurationP = UIStringDuration <$> durationP
 uiStringTimeSpanP ∷ Parser String UIString
 uiStringTimeSpanP ∷ Parser String UIString
 uiStringTimeSpanP = UIStringTimeSpan <$> timeSpanP
 uiStringTimeSpanP = UIStringTimeSpan <$> timeSpanP
 
 
+uiStringJobFlexP ∷ Parser String UIString
+uiStringJobFlexP = UIStringJobFlex <$> jobFlexP
+
 uiStringPlainP ∷ Parser String UIString
 uiStringPlainP ∷ Parser String UIString
 uiStringPlainP = UIStringPlain <$> rest
 uiStringPlainP = UIStringPlain <$> rest

+ 8 - 0
src/LinkedIn/UIElements/Types.purs

@@ -35,9 +35,17 @@ derive instance Generic Duration _
 instance Show Duration where
 instance Show Duration where
   show = genericShow
   show = genericShow
 
 
+data JobFlexibility = JobFlexHybrid | JobFlexOnSite | JobFlexFullRemote
+
+derive instance Eq JobFlexibility
+derive instance Generic JobFlexibility _
+instance Show JobFlexibility where
+  show = genericShow
+
 data UIString =
 data UIString =
   UIStringDuration Duration
   UIStringDuration Duration
   | UIStringTimeSpan TimeSpan
   | UIStringTimeSpan TimeSpan
+  | UIStringJobFlex JobFlexibility
   | UIStringPlain String
   | UIStringPlain String
   | UIStringDotSeparated UIString UIString
   | UIStringDotSeparated UIString UIString
 
 

+ 2 - 1
test/JobsUnifiedTopCard.purs

@@ -17,6 +17,7 @@ import LinkedIn.Page.JobOffer (JobOfferPage(..))
 import LinkedIn.Page.JobOffer as PageJO
 import LinkedIn.Page.JobOffer as PageJO
 import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.QueryRunner (runQuery)
 import LinkedIn.QueryRunner (runQuery)
+import LinkedIn.UIElements.Types (JobFlexibility(..))
 import Node.JsDom (jsDomFromFile)
 import Node.JsDom (jsDomFromFile)
 import Partial.Unsafe (unsafePartial)
 import Partial.Unsafe (unsafePartial)
 import Test.Assert (assert, assertEqual)
 import Test.Assert (assert, assertEqual)
@@ -142,7 +143,7 @@ main = do
         companySize: (Just "201-500 employés"),
         companySize: (Just "201-500 employés"),
         hasSimplifiedApplicationProcess: true,
         hasSimplifiedApplicationProcess: true,
         location: (Just "Boulogne-Billancourt, Île-de-France, France"),
         location: (Just "Boulogne-Billancourt, Île-de-France, France"),
-        remote: (Just "Sur site"),
+        flexibility: (Just JobFlexOnSite),
         title: "Data Engineer H/F - Secteur Energie"
         title: "Data Engineer H/F - Secteur Energie"
       })
       })
   }
   }