فهرست منبع

Use CanBeQueried.query' everywhere it can replace Extractible.query

jherve 1 سال پیش
والد
کامیت
9538587c9c

+ 4 - 2
src/LinkedIn.purs

@@ -12,6 +12,7 @@ import Data.Maybe (Maybe(..))
 import Data.Show.Generic (genericShow)
 import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable)
 import Data.Traversable (class Traversable)
 import Effect (Effect)
 import Effect (Effect)
+import LinkedIn.CanBeQueried (class CanBeQueried)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Output (OutputError, run, toOutput)
 import LinkedIn.Output (OutputError, run, toOutput)
 import LinkedIn.Output.Types (Output)
 import LinkedIn.Output.Types (Output)
@@ -62,10 +63,11 @@ encodeToJson = encodeJson
 -- | Force extraction of data from a page, when the context given by the URL is imprecise
 -- | Force extraction of data from a page, when the context given by the URL is imprecise
 -- | or plain wrong (e.g. for local files).
 -- | or plain wrong (e.g. for local files).
 -- | Can be call e.g. `forceExtract (Proxy :: Proxy JobOfferPage) dom`
 -- | Can be call e.g. `forceExtract (Proxy :: Proxy JobOfferPage) dom`
-forceExtract ∷ ∀ t.
+forceExtract ∷ ∀ root t.
   Traversable t
   Traversable t
+  ⇒ CanBeQueried root t
   ⇒ Extractible t
   ⇒ Extractible t
   ⇒ Proxy t
   ⇒ Proxy t
-  → Document
+  → root
   → Effect (Either OutputError Output)
   → Effect (Either OutputError Output)
 forceExtract p = runExceptT <<< run p
 forceExtract p = runExceptT <<< run p

+ 9 - 6
src/LinkedIn/Output.purs

@@ -5,6 +5,8 @@ import Prelude
 import Control.Monad.Except (ExceptT, except, lift, throwError, withExceptT)
 import Control.Monad.Except (ExceptT, except, lift, throwError, withExceptT)
 import Data.Traversable (class Traversable, traverse)
 import Data.Traversable (class Traversable, traverse)
 import Effect (Effect)
 import Effect (Effect)
+import LinkedIn.CanBeQueried (class CanBeQueried)
+import LinkedIn.CanBeQueried as CBQ
 import LinkedIn.DetachedNode (DetachedNode, toDetached)
 import LinkedIn.DetachedNode (DetachedNode, toDetached)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Extractible as LE
 import LinkedIn.Extractible as LE
@@ -20,25 +22,26 @@ import Parsing (parseErrorMessage)
 import Type.Proxy (Proxy(..))
 import Type.Proxy (Proxy(..))
 import Web.DOM (Document)
 import Web.DOM (Document)
 
 
-run :: forall t.
+run :: forall root t.
   Traversable t
   Traversable t
+  => CanBeQueried root t
   => Extractible t
   => Extractible t
   => Proxy t
   => Proxy t
-  -> Document
+  -> root
   -> ExceptT OutputError Effect Output
   -> ExceptT OutputError Effect Output
 run prox dom = do
 run prox dom = do
   detached <- withExceptT (\err -> ErrorOnDetach err) $ runToDetached prox dom
   detached <- withExceptT (\err -> ErrorOnDetach err) $ runToDetached prox dom
   asUI <- withExceptT (\err -> ErrorOnUIConversion $ parseErrorMessage err) $ except $ traverse toUIElement detached
   asUI <- withExceptT (\err -> ErrorOnUIConversion $ parseErrorMessage err) $ except $ traverse toUIElement detached
   withExceptT (\err -> ErrorOnExtract err) $ except $ LE.extract asUI
   withExceptT (\err -> ErrorOnExtract err) $ except $ LE.extract asUI
 
 
-runToDetached :: forall t.
+runToDetached :: forall root t.
   Traversable t
   Traversable t
-  => Extractible t
+  => CanBeQueried root t
   => Proxy t
   => Proxy t
-  -> Document
+  -> root
   -> ExceptT QueryError Effect (t DetachedNode)
   -> ExceptT QueryError Effect (t DetachedNode)
 runToDetached _ dom = do
 runToDetached _ dom = do
-  qRes <- LE.query @t dom
+  qRes <- CBQ.query' dom
   lift $ traverse toDetached qRes
   lift $ traverse toDetached qRes
 
 
 toOutput ∷ PageUrl → (Document → ExceptT OutputError Effect Output)
 toOutput ∷ PageUrl → (Document → ExceptT OutputError Effect Output)

+ 7 - 0
src/LinkedIn/Page/JobOffer.purs

@@ -6,11 +6,13 @@ import Data.Foldable (class Foldable, foldMap, foldlDefault, foldrDefault)
 import Data.Generic.Rep (class Generic)
 import Data.Generic.Rep (class Generic)
 import Data.Show.Generic (genericShow)
 import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable, sequence, traverseDefault)
 import Data.Traversable (class Traversable, sequence, traverseDefault)
+import LinkedIn.CanBeQueried (class CanBeQueried)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Jobs.JobOffer as JJO
 import LinkedIn.Jobs.JobOffer as JJO
 import LinkedIn.Output.Types (Output(..))
 import LinkedIn.Output.Types (Output(..))
 import LinkedIn.QueryRunner (subQueryOne)
 import LinkedIn.QueryRunner (subQueryOne)
 import LinkedIn.UI.Components.JobsUnifiedTopCard (JobsUnifiedTopCardElement, queryJobsUnifiedTopCardElement)
 import LinkedIn.UI.Components.JobsUnifiedTopCard (JobsUnifiedTopCardElement, queryJobsUnifiedTopCardElement)
+import Web.DOM (Document)
 
 
 data JobOfferPage a = JobOfferPage (JobsUnifiedTopCardElement a)
 data JobOfferPage a = JobOfferPage (JobsUnifiedTopCardElement a)
 
 
@@ -33,6 +35,11 @@ instance Traversable JobOfferPage where
 
 
   traverse = \x -> traverseDefault x
   traverse = \x -> traverseDefault x
 
 
+instance CanBeQueried Document JobOfferPage where
+  query' n = do
+    card <- subQueryOne queryJobsUnifiedTopCardElement "div.jobs-unified-top-card" n
+    pure $ JobOfferPage card
+
 instance Extractible JobOfferPage where
 instance Extractible JobOfferPage where
   query n = do
   query n = do
     card <- subQueryOne queryJobsUnifiedTopCardElement "div.jobs-unified-top-card" n
     card <- subQueryOne queryJobsUnifiedTopCardElement "div.jobs-unified-top-card" n

+ 6 - 0
src/LinkedIn/Page/Projects.purs

@@ -8,6 +8,7 @@ import Data.Generic.Rep (class Generic)
 import Data.List.Types (NonEmptyList)
 import Data.List.Types (NonEmptyList)
 import Data.Show.Generic (genericShow)
 import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
 import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
+import LinkedIn.CanBeQueried (class CanBeQueried)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Output.Types (Output(..))
 import LinkedIn.Output.Types (Output(..))
 import LinkedIn.Profile.Project (Project)
 import LinkedIn.Profile.Project (Project)
@@ -39,6 +40,11 @@ instance Traversable ProjectsPage where
   traverse = \x -> traverseDefault x
   traverse = \x -> traverseDefault x
 
 
 
 
+instance CanBeQueried Document ProjectsPage where
+  query' n = do
+    cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n
+    pure $ ProjectsPage cards
+
 instance Extractible ProjectsPage where
 instance Extractible ProjectsPage where
   query n = do
   query n = do
     cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n
     cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n

+ 7 - 0
src/LinkedIn/Page/Skills.purs

@@ -7,11 +7,13 @@ import Data.Generic.Rep (class Generic)
 import Data.List.Types (NonEmptyList)
 import Data.List.Types (NonEmptyList)
 import Data.Show.Generic (genericShow)
 import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
 import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
+import LinkedIn.CanBeQueried (class CanBeQueried)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Output.Types (Output(..))
 import LinkedIn.Output.Types (Output(..))
 import LinkedIn.Profile.Skill as PS
 import LinkedIn.Profile.Skill as PS
 import LinkedIn.QueryRunner (subQueryMany)
 import LinkedIn.QueryRunner (subQueryMany)
 import LinkedIn.UI.Components.ArtDecoTab (ArtDecoTabElement, queryArtDecoTab)
 import LinkedIn.UI.Components.ArtDecoTab (ArtDecoTabElement, queryArtDecoTab)
+import Web.DOM (Document)
 
 
 data SkillsPage a = SkillsPage (NonEmptyList (ArtDecoTabElement a))
 data SkillsPage a = SkillsPage (NonEmptyList (ArtDecoTabElement a))
 
 
@@ -34,6 +36,11 @@ instance Traversable SkillsPage where
 
 
   traverse = \x -> traverseDefault x
   traverse = \x -> traverseDefault x
 
 
+instance CanBeQueried Document SkillsPage where
+  query' n = do
+    tabs <- subQueryMany queryArtDecoTab "div.artdeco-tabs > div > div > div > div > ul > li" n
+    pure $ SkillsPage tabs
+
 instance Extractible SkillsPage where
 instance Extractible SkillsPage where
   query n = do
   query n = do
     tabs <- subQueryMany queryArtDecoTab "div.artdeco-tabs > div > div > div > div > ul > li" n
     tabs <- subQueryMany queryArtDecoTab "div.artdeco-tabs > div > div > div > div > ul > li" n

+ 7 - 0
src/LinkedIn/Page/WorkExperiences.purs

@@ -7,11 +7,13 @@ import Data.Generic.Rep (class Generic)
 import Data.List.Types (NonEmptyList)
 import Data.List.Types (NonEmptyList)
 import Data.Show.Generic (genericShow)
 import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
 import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
+import LinkedIn.CanBeQueried (class CanBeQueried)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Output.Types (Output(..))
 import LinkedIn.Output.Types (Output(..))
 import LinkedIn.Profile.WorkExperience as PWE
 import LinkedIn.Profile.WorkExperience as PWE
 import LinkedIn.QueryRunner (subQueryMany)
 import LinkedIn.QueryRunner (subQueryMany)
 import LinkedIn.UI.Components.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
 import LinkedIn.UI.Components.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
+import Web.DOM (Document)
 
 
 data WorkExperiencesPage a = WorkExperiencesPage (NonEmptyList (ArtDecoCardElement a))
 data WorkExperiencesPage a = WorkExperiencesPage (NonEmptyList (ArtDecoCardElement a))
 
 
@@ -34,6 +36,11 @@ instance Traversable WorkExperiencesPage where
 
 
   traverse = \x -> traverseDefault x
   traverse = \x -> traverseDefault x
 
 
+instance CanBeQueried Document WorkExperiencesPage where
+  query' n = do
+    cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n
+    pure $ WorkExperiencesPage cards
+
 instance Extractible WorkExperiencesPage where
 instance Extractible WorkExperiencesPage where
   query n = do
   query n = do
     cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n
     cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n