impl fast exact parse

master
Bel LaPointe 2022-01-27 15:01:38 -07:00
parent 12fd38ad2c
commit 1359be1db4
2 changed files with 76 additions and 2 deletions

View File

@ -9,7 +9,11 @@ import (
"local/storage" "local/storage"
"local/truckstop/config" "local/truckstop/config"
"net/http" "net/http"
"strconv"
"strings" "strings"
"time"
"github.com/PuerkitoBio/goquery"
) )
type FastExact struct { type FastExact struct {
@ -128,7 +132,51 @@ func (fe FastExact) doRequest(req *http.Request) (*http.Response, error) {
} }
func (fe FastExact) parse(resp *http.Response) ([]Job, error) { func (fe FastExact) parse(resp *http.Response) ([]Job, error) {
return nil, errors.New("not impl: fe.parse") doc, err := goquery.NewDocumentFromReader(resp.Body)
if err != nil {
return nil, err
}
result := make([]Job, 0)
doc.Find("#list table tr").Each(func(i int, s *goquery.Selection) {
columns := []string{}
s.Find("td").Each(func(i int, s *goquery.Selection) {
if s.Nodes[0].LastChild != nil && len(s.Nodes[0].LastChild.Attr) > 0 {
attrs := s.Nodes[0].LastChild.Attr
columns = append(columns, attrs[len(attrs)-1].Val)
} else {
columns = append(columns, s.Text())
}
})
if len(columns) < 9 {
return
}
job := Job{
ID: columns[0],
URI: columns[8],
}
job.Pickup.Date, _ = time.ParseInLocation("02-Jan-2006 15:04:05", columns[7], time.Local)
job.Pickup.City = strings.Title(strings.ToLower(strings.Split(columns[1], ",")[0]))
if strings.Contains(columns[1], ",") {
job.Pickup.State = strings.Title(strings.Split(strings.Split(columns[1], ",")[1], " ")[1])
}
job.Dropoff.Date = job.Pickup.Date
job.Dropoff.City = strings.Title(strings.ToLower(strings.Split(columns[2], ",")[0]))
if strings.Contains(columns[2], ",") {
job.Dropoff.State = strings.Title(strings.Split(strings.Split(columns[2], ",")[1], " ")[1])
}
job.Miles, _ = strconv.Atoi(columns[3])
if strings.Contains(columns[4], "/") {
weight, _ := strconv.ParseFloat(strings.TrimSpace(strings.Split(columns[4], "/")[1]), 32)
job.Weight = int(weight)
}
job.Meta = fmt.Sprintf(`dimensions:%s`, strings.ToLower(strings.ReplaceAll(strings.ReplaceAll(columns[5], " ", ""), "\n", "")))
result = append(result, job)
})
return result, nil
} }
type mockFastExactDoer struct{} type mockFastExactDoer struct{}

View File

@ -26,7 +26,33 @@ func TestFastExactSearch(t *testing.T) {
_ = db _ = db
if jobs, err := fe.search([]config.State{config.State("NC"), config.State("SC")}); err != nil { if jobs, err := fe.search([]config.State{config.State("NC"), config.State("SC")}); err != nil {
t.Fatal(err) t.Fatal(err)
} else { } else if len(jobs) != 20 {
t.Fatal(jobs) t.Fatal(jobs)
} else {
for _, job := range jobs {
if job.ID == "" {
t.Error(job)
} else if job.Miles == 0 {
t.Error(job)
} else if job.URI == "" {
t.Error(job)
} else if job.Meta == "" {
t.Error(job)
} else if job.Weight == 0 {
t.Error(job)
} else if job.Pickup.Date.IsZero() {
t.Error(job)
} else if job.Pickup.Date != job.Dropoff.Date {
t.Error(job)
} else if job.Dropoff.State == "" {
t.Error(job)
} else if job.Dropoff.City == "" {
t.Error(job)
} else if job.Pickup.State == "" {
t.Error(job)
} else if job.Pickup.City == "" {
t.Error(job)
}
}
} }
} }