Prechádzať zdrojové kódy

Push conversion to callers of fromUI

jherve 1 rok pred
rodič
commit
c60c995a9d

+ 3 - 12
src/LinkedIn/Jobs/JobOffer.purs

@@ -2,14 +2,11 @@ module LinkedIn.Jobs.JobOffer where
 
 import Prelude
 
-import Data.Either (Either(..), note)
+import Data.Either (Either, note)
 import Data.Generic.Rep (class Generic)
 import Data.Maybe (Maybe(..))
 import Data.Show.Generic (genericShow)
-import Data.Traversable (traverse)
-import LinkedIn.DetachedNode (DetachedNode)
 import LinkedIn.JobsUnifiedTopCard (JobsUnifiedTopCardElement, toHeader, toPrimaryDescriptionLink, toPrimaryDescriptionText)
-import LinkedIn.Profile.Utils (toUIElement)
 import LinkedIn.UIElements.Types (UIElement(..), UIString(..))
 
 data JobOffer = JobOffer {
@@ -23,14 +20,8 @@ derive instance Generic JobOffer _
 instance Show JobOffer where
   show = genericShow
 
-
-fromUI ∷ JobsUnifiedTopCardElement DetachedNode → Either String JobOffer
-fromUI card = fromUI' =<< case traverse toUIElement card of
-  Left _ -> Left "error on conversion to UI element"
-  Right ui -> Right ui
-
-fromUI' ∷ JobsUnifiedTopCardElement UIElement → Either String JobOffer
-fromUI' card = ado
+fromUI ∷ JobsUnifiedTopCardElement UIElement → Either String JobOffer
+fromUI card = ado
     title <- note "No title found" $ extractTitle header
     companyName <- note "No company found" $ extractCompany link
     companyLink <- note "No company link found" $ extractCompanyLink link

+ 2 - 1
src/LinkedIn/Page/JobOffer.purs

@@ -12,6 +12,7 @@ import LinkedIn.DetachedNode (toDetached)
 import LinkedIn.Jobs.JobOffer (JobOffer)
 import LinkedIn.Jobs.JobOffer as JJO
 import LinkedIn.JobsUnifiedTopCard (JobsUnifiedTopCardElement, queryJobsUnifiedTopCardElement)
+import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.QueryRunner (QueryRunner', subQueryOne)
 import Web.DOM (Document, Node)
 
@@ -46,4 +47,4 @@ extract p = do
   detached <- traverse toDetached p
   let
     JobOfferPage tabs = detached
-  pure $ JJO.fromUI tabs
+  pure $ (JJO.fromUI <=< fromDetachedToUI) tabs

+ 2 - 1
src/LinkedIn/Page/Projects.purs

@@ -13,6 +13,7 @@ import LinkedIn.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
 import LinkedIn.DetachedNode (toDetached)
 import LinkedIn.Profile.Project (Project)
 import LinkedIn.Profile.Project as PP
+import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
 import Web.DOM (Document, Node)
 
@@ -47,4 +48,4 @@ extract p = do
   detached <- traverse toDetached p
   let
     ProjectsPage cards = detached
-  pure $ traverse PP.fromUI cards
+  pure $ traverse (PP.fromUI <=< fromDetachedToUI) cards

+ 2 - 1
src/LinkedIn/Page/Skills.purs

@@ -13,6 +13,7 @@ import LinkedIn.ArtDecoTab (ArtDecoTabElement, queryArtDecoTab)
 import LinkedIn.DetachedNode (toDetached)
 import LinkedIn.Profile.Skill (Skill)
 import LinkedIn.Profile.Skill as PS
+import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
 import Web.DOM (Document, Node)
 
@@ -47,4 +48,4 @@ extract p = do
   detached <- traverse toDetached p
   let
     SkillsPage tabs = detached
-  pure $ traverse PS.fromUI tabs
+  pure $ traverse (PS.fromUI <=< fromDetachedToUI) tabs

+ 2 - 1
src/LinkedIn/Page/WorkExperiences.purs

@@ -11,6 +11,7 @@ import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
 import Effect (Effect)
 import LinkedIn.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
 import LinkedIn.DetachedNode (toDetached)
+import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.Profile.WorkExperience (WorkExperience)
 import LinkedIn.Profile.WorkExperience as PWE
 import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
@@ -47,4 +48,4 @@ extract p = do
   detached <- traverse toDetached p
   let
     WorkExperiencesPage cards = detached
-  pure $ traverse PWE.fromUI cards
+  pure $ traverse (PWE.fromUI <=< fromDetachedToUI) cards

+ 3 - 11
src/LinkedIn/Profile/Project.purs

@@ -2,15 +2,12 @@ module LinkedIn.Profile.Project where
 
 import Prelude
 
-import Data.Either (Either(..), note)
+import Data.Either (Either, note)
 import Data.Generic.Rep (class Generic)
 import Data.List as L
 import Data.Maybe (Maybe(..))
 import Data.Show.Generic (genericShow)
-import Data.Traversable (traverse)
 import LinkedIn.ArtDecoCard (ArtDecoCardElement, toCenterContent, toHeaderBold, toHeaderNormal)
-import LinkedIn.DetachedNode (DetachedNode)
-import LinkedIn.Profile.Utils (toUIElement)
 import LinkedIn.UIElements.Types (TimeSpan, UIElement(..), UIString(..))
 
 data Project = Project {
@@ -23,13 +20,8 @@ derive instance Generic Project _
 instance Show Project where
   show = genericShow
 
-fromUI ∷ ArtDecoCardElement DetachedNode → Either String Project
-fromUI card = fromUI' =<< case traverse toUIElement card of
-  Left _ -> Left "error on conversion to UI element"
-  Right ui -> Right ui
-
-fromUI' ∷ ArtDecoCardElement UIElement → Either String Project
-fromUI' card = ado
+fromUI ∷ ArtDecoCardElement UIElement → Either String Project
+fromUI card = ado
     name <- note "No position found" $ extractName bold
   in
     Project {

+ 3 - 11
src/LinkedIn/Profile/Skill.purs

@@ -2,14 +2,11 @@ module LinkedIn.Profile.Skill where
 
 import Prelude
 
-import Data.Either (Either(..), note)
+import Data.Either (Either, note)
 import Data.Generic.Rep (class Generic)
 import Data.Maybe (Maybe(..))
 import Data.Show.Generic (genericShow)
-import Data.Traversable (traverse)
 import LinkedIn.ArtDecoTab (ArtDecoTabElement, toHeaderBold)
-import LinkedIn.DetachedNode (DetachedNode)
-import LinkedIn.Profile.Utils (toUIElement)
 import LinkedIn.UIElements.Types (UIElement(..), UIString(..))
 
 data Skill = Skill {
@@ -20,13 +17,8 @@ derive instance Generic Skill _
 instance Show Skill where
   show = genericShow
 
-fromUI ∷ ArtDecoTabElement DetachedNode → Either String Skill
-fromUI tab = fromUI' =<< case traverse toUIElement tab of
-  Left _ -> Left "error on conversion to UI element"
-  Right ui -> Right ui
-
-fromUI' ∷ ArtDecoTabElement UIElement → Either String Skill
-fromUI' tab = ado
+fromUI ∷ ArtDecoTabElement UIElement → Either String Skill
+fromUI tab = ado
     name <- note "No position found" $ extractName bold
   in
     Skill { name }

+ 6 - 0
src/LinkedIn/Profile/Utils.purs

@@ -5,11 +5,17 @@ import Prelude
 import Control.Alt ((<|>))
 import Data.Either (Either(..))
 import Data.Maybe (Maybe(..))
+import Data.Traversable (class Traversable, traverse)
 import LinkedIn.DetachedNode (DetachedNode(..))
 import LinkedIn.UIElements.Parser (uiStringP)
 import LinkedIn.UIElements.Types (UIElement(..))
 import Parsing (ParseError(..), initialPos, runParser)
 
+fromDetachedToUI ∷ ∀ t. Traversable t ⇒ t DetachedNode → Either String (t UIElement)
+fromDetachedToUI el = case traverse toUIElement el of
+  Left _ -> Left "error on conversion to UI element"
+  Right ui -> Right ui
+
 -- TODO : should certainly use another type than ParseError here
 toUIElement ∷ DetachedNode → Either ParseError UIElement
 toUIElement (DetachedElement {content}) = wrapInUiElement content

+ 3 - 11
src/LinkedIn/Profile/WorkExperience.purs

@@ -2,16 +2,13 @@ module LinkedIn.Profile.WorkExperience where
 
 import Prelude
 
-import Data.Either (Either(..), note)
+import Data.Either (Either, note)
 import Data.Foldable (findMap)
 import Data.Generic.Rep (class Generic)
 import Data.List as L
 import Data.Maybe (Maybe(..))
 import Data.Show.Generic (genericShow)
-import Data.Traversable (traverse)
 import LinkedIn.ArtDecoCard (ArtDecoCardElement, toCenterContent, toHeaderBold, toHeaderLight, toHeaderNormal)
-import LinkedIn.DetachedNode (DetachedNode)
-import LinkedIn.Profile.Utils (toUIElement)
 import LinkedIn.UIElements.Types (Duration, TimeSpan, UIElement(..), UIString(..))
 
 data WorkExperience = WorkExperience {
@@ -28,13 +25,8 @@ derive instance Eq WorkExperience
 instance Show WorkExperience where
   show = genericShow
 
-fromUI ∷ ArtDecoCardElement DetachedNode → Either String WorkExperience
-fromUI card = fromUI' =<< case traverse toUIElement card of
-  Left _ -> Left "error on conversion to UI element"
-  Right ui -> Right ui
-
-fromUI' ∷ ArtDecoCardElement UIElement → Either String WorkExperience
-fromUI' card = ado
+fromUI ∷ ArtDecoCardElement UIElement → Either String WorkExperience
+fromUI card = ado
     position <- note "No position found" $ extractPosition bold
   in
     WorkExperience {

+ 2 - 1
test/ArtDecoCard.purs

@@ -16,6 +16,7 @@ import LinkedIn.ArtDecoCard (ArtDecoCardElement(..))
 import LinkedIn.DetachedNode (DetachedNode(..), toDetached)
 import LinkedIn.Page.WorkExperiences (WorkExperiencesPage(..))
 import LinkedIn.Page.WorkExperiences as PageWE
+import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.Profile.WorkExperience (WorkExperience(..))
 import LinkedIn.Profile.WorkExperience as PWE
 import LinkedIn.QueryRunner (runQuery)
@@ -84,7 +85,7 @@ testArtDecoCards = do
   }
 
   assertEqual {
-    actual: PWE.fromUI headCard,
+    actual: (PWE.fromUI <=< fromDetachedToUI) headCard,
     expected:
       Right (WorkExperience {
         company: Just "DeepLearning.AI",