mirror of
https://github.com/MontFerret/ferret.git
synced 2025-02-07 13:31:56 +02:00
parent
752ee02cd1
commit
de703513e4
@ -40,12 +40,16 @@ func (b *Browser) DebuggingPort() int {
|
||||
func (b *Browser) Close() error {
|
||||
var err error
|
||||
|
||||
if runtime.GOOS != "windows" {
|
||||
if runtime.GOOS != goosWindows {
|
||||
err = b.cmd.Process.Signal(os.Interrupt)
|
||||
} else {
|
||||
err = b.cmd.Process.Kill()
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = b.cmd.Process.Wait()
|
||||
|
||||
if err != nil {
|
||||
|
@ -2,9 +2,10 @@ package browser
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/pkg/errors"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
type Flags map[string]interface{}
|
||||
@ -61,8 +62,6 @@ func (flags Flags) Has(arg string) bool {
|
||||
}
|
||||
|
||||
func (flags Flags) List() []string {
|
||||
var list []string
|
||||
|
||||
orderedFlags := make([]string, 0, 10)
|
||||
|
||||
for arg := range flags {
|
||||
@ -71,7 +70,9 @@ func (flags Flags) List() []string {
|
||||
|
||||
sort.Strings(orderedFlags)
|
||||
|
||||
for _, arg := range orderedFlags {
|
||||
list := make([]string, len(orderedFlags))
|
||||
|
||||
for i, arg := range orderedFlags {
|
||||
val, err := flags.Get(arg)
|
||||
|
||||
if err != nil {
|
||||
@ -87,7 +88,7 @@ func (flags Flags) List() []string {
|
||||
arg = fmt.Sprintf("--%s", arg)
|
||||
}
|
||||
|
||||
list = append(list, arg)
|
||||
list[i] = arg
|
||||
}
|
||||
|
||||
return list
|
||||
|
@ -9,7 +9,7 @@ import (
|
||||
func resolveExecutablePath() (path string) {
|
||||
|
||||
switch runtime.GOOS {
|
||||
case "darwin":
|
||||
case goosDarwin:
|
||||
for _, c := range []string{
|
||||
"/Applications/Google Chrome Canary.app",
|
||||
"/Applications/Google Chrome.app",
|
||||
@ -22,7 +22,7 @@ func resolveExecutablePath() (path string) {
|
||||
}
|
||||
}
|
||||
|
||||
case "linux":
|
||||
case goosLinux:
|
||||
for _, c := range []string{
|
||||
"headless_shell",
|
||||
"chromium",
|
||||
@ -35,7 +35,7 @@ func resolveExecutablePath() (path string) {
|
||||
}
|
||||
}
|
||||
|
||||
case "windows":
|
||||
case goosWindows:
|
||||
}
|
||||
|
||||
return
|
||||
|
@ -41,7 +41,7 @@ func Launch(setters ...Option) (*Browser, error) {
|
||||
flags.SetN("mute-audio")
|
||||
}
|
||||
|
||||
if runtime.GOOS == "windows" {
|
||||
if runtime.GOOS == goosWindows {
|
||||
flags.SetN("disable-gpu")
|
||||
}
|
||||
|
||||
|
@ -18,6 +18,12 @@ type (
|
||||
}
|
||||
)
|
||||
|
||||
const (
|
||||
goosWindows = "windows"
|
||||
goosLinux = "linux"
|
||||
goosDarwin = "darwin"
|
||||
)
|
||||
|
||||
func WithoutDefaultArgs() Option {
|
||||
return func(opts *Options) {
|
||||
opts.ignoreDefaultArgs = true
|
||||
|
@ -3,11 +3,12 @@ package cli
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/MontFerret/ferret/pkg/parser/fql"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/parser/fql"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/compiler"
|
||||
"github.com/MontFerret/ferret/pkg/runtime"
|
||||
"github.com/MontFerret/ferret/pkg/runtime/logging"
|
||||
@ -74,7 +75,7 @@ func Repl(version string, opts Options) {
|
||||
|
||||
line = strings.TrimSpace(line)
|
||||
|
||||
if len(line) == 0 {
|
||||
if line == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
|
51
go.mod
51
go.mod
@ -3,25 +3,74 @@ module github.com/MontFerret/ferret
|
||||
go 1.12
|
||||
|
||||
require (
|
||||
github.com/OpenPeeDeeP/depguard v0.0.0-20181229194401-1f388ab2d810 // indirect
|
||||
github.com/PuerkitoBio/goquery v1.5.0
|
||||
github.com/StackExchange/wmi v0.0.0-20181212234831-e0a55b97c705 // indirect
|
||||
github.com/antlr/antlr4 v0.0.0-20190325153624-837aa60e2c47
|
||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e
|
||||
github.com/coreos/etcd v3.3.12+incompatible // indirect
|
||||
github.com/corpix/uarand v0.0.0
|
||||
github.com/derekparker/trie v0.0.0-20190322172448-1ce4922c7ad9
|
||||
github.com/fatih/color v1.7.0 // indirect
|
||||
github.com/go-critic/go-critic v0.3.4 // indirect
|
||||
github.com/go-ole/go-ole v1.2.4 // indirect
|
||||
github.com/go-toolsmith/astcast v1.0.0 // indirect
|
||||
github.com/go-toolsmith/astcopy v1.0.0 // indirect
|
||||
github.com/go-toolsmith/astfmt v1.0.0 // indirect
|
||||
github.com/go-toolsmith/astp v1.0.0 // indirect
|
||||
github.com/go-toolsmith/pkgload v1.0.0 // indirect
|
||||
github.com/go-toolsmith/typep v1.0.0 // indirect
|
||||
github.com/gofrs/uuid v3.2.0+incompatible
|
||||
github.com/gogo/protobuf v1.2.1 // indirect
|
||||
github.com/golang/mock v1.2.0 // indirect
|
||||
github.com/golang/protobuf v1.3.1 // indirect
|
||||
github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 // indirect
|
||||
github.com/golangci/go-tools v0.0.0-20190124090046-35a9f45a5db0 // indirect
|
||||
github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d // indirect
|
||||
github.com/golangci/gofmt v0.0.0-20181222123516-0b8337e80d98 // indirect
|
||||
github.com/golangci/golangci-lint v1.15.0 // indirect
|
||||
github.com/golangci/gosec v0.0.0-20180901114220-8afd9cbb6cfb // indirect
|
||||
github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219 // indirect
|
||||
github.com/golangci/revgrep v0.0.0-20180812185044-276a5c0a1039 // indirect
|
||||
github.com/gopherjs/gopherjs v0.0.0-20190328170749-bb2674552d8f // indirect
|
||||
github.com/gorilla/css v1.0.0
|
||||
github.com/gorilla/websocket v1.4.0 // indirect
|
||||
github.com/kisielk/errcheck v1.2.0 // indirect
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
|
||||
github.com/kr/pty v1.1.4 // indirect
|
||||
github.com/labstack/echo v3.3.10+incompatible
|
||||
github.com/labstack/gommon v0.2.8 // indirect
|
||||
github.com/mafredri/cdp v0.22.0
|
||||
github.com/mattn/go-colorable v0.1.1 // indirect
|
||||
github.com/mattn/go-isatty v0.0.7 // indirect
|
||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||
github.com/mozilla/tls-observatory v0.0.0-20190313211306-43961c0c7a1f // indirect
|
||||
github.com/natefinch/lumberjack v2.0.0+incompatible
|
||||
github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d // indirect
|
||||
github.com/onsi/ginkgo v1.8.0 // indirect
|
||||
github.com/onsi/gomega v1.5.0 // indirect
|
||||
github.com/pkg/errors v0.8.1
|
||||
github.com/rogpeppe/go-internal v1.2.2 // indirect
|
||||
github.com/rs/zerolog v1.13.0
|
||||
github.com/ryanuber/go-glob v1.0.0 // indirect
|
||||
github.com/sethgrid/pester v0.0.0-20190127155807-68a33a018ad0
|
||||
github.com/shirou/gopsutil v2.18.12+incompatible // indirect
|
||||
github.com/shurcooL/go v0.0.0-20190121191506-3fef8c783dec // indirect
|
||||
github.com/sirupsen/logrus v1.4.0 // indirect
|
||||
github.com/smartystreets/assertions v0.0.0-20190215210624-980c5ac6f3ac // indirect
|
||||
github.com/smartystreets/goconvey v0.0.0-20190306220146-200a235640ff
|
||||
github.com/spf13/afero v1.2.2 // indirect
|
||||
github.com/spf13/cobra v0.0.3 // indirect
|
||||
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
||||
github.com/spf13/viper v1.3.2 // indirect
|
||||
github.com/stretchr/testify v1.3.0 // indirect
|
||||
github.com/ugorji/go/codec v0.0.0-20190320090025-2dc34c0b8780 // indirect
|
||||
github.com/valyala/fasttemplate v1.0.1 // indirect
|
||||
golang.org/x/net v0.0.0-20190327091125-710a502c58a2
|
||||
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c // indirect
|
||||
golang.org/x/net v0.0.0-20190328230028-74de082e2cca
|
||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6
|
||||
golang.org/x/sys v0.0.0-20190322080309-f49334f85ddc // indirect
|
||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384 // indirect
|
||||
mvdan.cc/unparam v0.0.0-20190310220240-1b9ccfa71afe // indirect
|
||||
sourcegraph.com/sqs/pbtypes v1.0.0 // indirect
|
||||
)
|
||||
|
193
go.sum
193
go.sum
@ -1,59 +1,252 @@
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/OpenPeeDeeP/depguard v0.0.0-20180806142446-a69c782687b2/go.mod h1:7/4sitnI9YlQgTLLk734QlzXT8DuHVnAyztLplQjk+o=
|
||||
github.com/OpenPeeDeeP/depguard v0.0.0-20181229194401-1f388ab2d810/go.mod h1:7/4sitnI9YlQgTLLk734QlzXT8DuHVnAyztLplQjk+o=
|
||||
github.com/PuerkitoBio/goquery v1.5.0 h1:uGvmFXOA73IKluu/F84Xd1tt/z07GYm8X49XKHP7EJk=
|
||||
github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg=
|
||||
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
|
||||
github.com/StackExchange/wmi v0.0.0-20181212234831-e0a55b97c705/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
|
||||
github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o=
|
||||
github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
|
||||
github.com/antlr/antlr4 v0.0.0-20190325153624-837aa60e2c47 h1:Lp5nUoQzppfVmfZadpzAytNyb5IMtxyOJLzoQS5dExg=
|
||||
github.com/antlr/antlr4 v0.0.0-20190325153624-837aa60e2c47/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y=
|
||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8=
|
||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||
github.com/coreos/etcd v3.3.12+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
|
||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/corpix/uarand v0.0.0 h1:mNbzro1GwUcZ1hmO2rWXytkR3JBxNxxctzjyuhO+Aig=
|
||||
github.com/corpix/uarand v0.0.0/go.mod h1:JSm890tOkDN+M1jqN8pUGDKnzJrsVbJwSMHBY4zwz7M=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/derekparker/trie v0.0.0-20190322172448-1ce4922c7ad9 h1:aSaTVlEXc2QKl4fzXU1tMYCjlrSc2mA4DZtiVfckQHo=
|
||||
github.com/derekparker/trie v0.0.0-20190322172448-1ce4922c7ad9/go.mod h1:D6ICZm05D9VN1n/8iOtBxLpXtoGp6HDFUJ1RNVieOSE=
|
||||
github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/go-critic/go-critic v0.0.0-20181204210945-ee9bf5809ead/go.mod h1:3MzXZKJdeXqdU9cj+rvZdNiN7SZ8V9OjybF8loZDmHU=
|
||||
github.com/go-critic/go-critic v0.3.4/go.mod h1:AHR42Lk/E/aOznsrYdMYeIQS5RH10HZHSqP+rD6AJrc=
|
||||
github.com/go-lintpack/lintpack v0.5.1/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM=
|
||||
github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM=
|
||||
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
|
||||
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
|
||||
github.com/go-toolsmith/astcast v0.0.0-20181028201508-b7a89ed70af1/go.mod h1:TEo3Ghaj7PsZawQHxT/oBvo4HK/sl1RcuUHDKTTju+o=
|
||||
github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4=
|
||||
github.com/go-toolsmith/astcopy v0.0.0-20180903214859-79b422d080c4/go.mod h1:c9CPdq2AzM8oPomdlPniEfPAC6g1s7NqZzODt8y6ib8=
|
||||
github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ=
|
||||
github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
|
||||
github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
|
||||
github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg=
|
||||
github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw=
|
||||
github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk=
|
||||
github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI=
|
||||
github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks=
|
||||
github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc=
|
||||
github.com/go-toolsmith/strparse v0.0.0-20180903215201-830b6daa1241/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=
|
||||
github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=
|
||||
github.com/go-toolsmith/typep v0.0.0-20181030061450-d63dc7650676/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
|
||||
github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
|
||||
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
|
||||
github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE=
|
||||
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4=
|
||||
github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk=
|
||||
github.com/golangci/errcheck v0.0.0-20181003203344-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0=
|
||||
github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0=
|
||||
github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8=
|
||||
github.com/golangci/go-tools v0.0.0-20180109140146-35a9f45a5db0/go.mod h1:unzUULGw35sjyOYjUt0jMTXqHlZPpPc6e+xfO4cd6mM=
|
||||
github.com/golangci/go-tools v0.0.0-20190124090046-35a9f45a5db0/go.mod h1:unzUULGw35sjyOYjUt0jMTXqHlZPpPc6e+xfO4cd6mM=
|
||||
github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o=
|
||||
github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU=
|
||||
github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU=
|
||||
github.com/golangci/gofmt v0.0.0-20181105071733-0b8337e80d98/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU=
|
||||
github.com/golangci/gofmt v0.0.0-20181222123516-0b8337e80d98/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU=
|
||||
github.com/golangci/golangci-lint v1.15.0 h1:Cvf5J2U5C5kAHSXxyLRJ38/OqdJbiU7SAJRYvWgO/b0=
|
||||
github.com/golangci/golangci-lint v1.15.0/go.mod h1:iEsyA2h6yMxPzFAlb/Q9UuXBrXIDtXkbUoukuqUAX/8=
|
||||
github.com/golangci/gosec v0.0.0-20180901114220-66fb7fc33547/go.mod h1:0qUabqiIQgfmlAmulqxyiGkkyF6/tOGSnY2cnPVwrzU=
|
||||
github.com/golangci/gosec v0.0.0-20180901114220-8afd9cbb6cfb/go.mod h1:ON/c2UR0VAAv6ZEAFKhjCLplESSmRFfZcDLASbI1GWo=
|
||||
github.com/golangci/govet v0.0.0-20180818181408-44ddbe260190/go.mod h1:pPwb+AK755h3/r73avHz5bEN6sa51/2HEZlLaV53hCo=
|
||||
github.com/golangci/ineffassign v0.0.0-20180808204949-2ee8f2867dde/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU=
|
||||
github.com/golangci/lint-1 v0.0.0-20180610141402-4bf9709227d1/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y=
|
||||
github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y=
|
||||
github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o=
|
||||
github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA=
|
||||
github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI=
|
||||
github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4=
|
||||
github.com/golangci/revgrep v0.0.0-20180812185044-276a5c0a1039/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4=
|
||||
github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20190328170749-bb2674552d8f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=
|
||||
github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c=
|
||||
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
|
||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
|
||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
||||
github.com/kisielk/gotool v0.0.0-20161130080628-0de1eaf82fa3/go.mod h1:jxZFDH7ILpTPQTk+E2s+z4CUas9lVNjIuKR4c5/zKgM=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg=
|
||||
github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s=
|
||||
github.com/labstack/gommon v0.2.8 h1:JvRqmeZcfrHC5u6uVleB4NxxNbzx6gpbJiQknDbKQu0=
|
||||
github.com/labstack/gommon v0.2.8/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4=
|
||||
github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
|
||||
github.com/mafredri/cdp v0.22.0 h1:BV17j8hXLDWczo2SZIAFuOjMpQMIOq5DOcd9sgB2hv0=
|
||||
github.com/mafredri/cdp v0.22.0/go.mod h1:hgdiA0yp1uqhSaDOHJWPgXpMbh+LAfUdD9vbN2AM8gE=
|
||||
github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||
github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=
|
||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc=
|
||||
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
|
||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk=
|
||||
github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk=
|
||||
github.com/mozilla/tls-observatory v0.0.0-20190313211306-43961c0c7a1f/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk=
|
||||
github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM=
|
||||
github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk=
|
||||
github.com/nbutton23/zxcvbn-go v0.0.0-20160627004424-a22cb81b2ecd/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
|
||||
github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
|
||||
github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
|
||||
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
||||
github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/pelletier/go-toml v1.1.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.2.1/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rs/zerolog v1.13.0 h1:hSNcYHyxDWycfePW7pUI8swuFkcSMPKh3E63Pokg1Hk=
|
||||
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
|
||||
github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
|
||||
github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
|
||||
github.com/sethgrid/pester v0.0.0-20190127155807-68a33a018ad0 h1:X9XMOYjxEfAYSy3xK1DzO5dMkkWhs9E9UCcS1IERx2k=
|
||||
github.com/sethgrid/pester v0.0.0-20190127155807-68a33a018ad0/go.mod h1:Ad7IjTpvzZO8Fl0vh9AzQ+j/jYZfyp2diGwI8m5q+ns=
|
||||
github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
|
||||
github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
|
||||
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
|
||||
github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
|
||||
github.com/shurcooL/go v0.0.0-20190121191506-3fef8c783dec/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
|
||||
github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
|
||||
github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
|
||||
github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
github.com/smartystreets/assertions v0.0.0-20190215210624-980c5ac6f3ac h1:wbW+Bybf9pXxnCFAOWZTqkRjAc7rAIwo2e1ArUhiHxg=
|
||||
github.com/smartystreets/assertions v0.0.0-20190215210624-980c5ac6f3ac/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
github.com/smartystreets/goconvey v0.0.0-20190306220146-200a235640ff h1:86HlEv0yBCry9syNuylzqznKXDK11p6D0DT596yNMys=
|
||||
github.com/smartystreets/goconvey v0.0.0-20190306220146-200a235640ff/go.mod h1:KSQcGKpxUMHk3nbYzs/tIBAM2iDooCn0BmttHOJEbLs=
|
||||
github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
||||
github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=
|
||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
|
||||
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/viper v1.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
|
||||
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/ugorji/go v1.1.2/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
|
||||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
||||
github.com/ugorji/go/codec v0.0.0-20190320090025-2dc34c0b8780/go.mod h1:iT03XoTwV7xq/+UGwKO3UbC1nNNlopQiY61beSdrtOA=
|
||||
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||
github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8=
|
||||
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
|
||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||
golang.org/x/crypto v0.0.0-20180505025534-4ec37c66abab/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c h1:Vj5n4GlwjmQteupaxJ9+0FNOmBrHfq7vN4btdGoDZgI=
|
||||
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/net v0.0.0-20170915142106-8351a756f30f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190327091125-710a502c58a2 h1:17UhVDrPb40BH5k6cyeb2V/7QlBNdo/a0+r0dtK+Utw=
|
||||
golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190328230028-74de082e2cca h1:hyA6yiAgbUwuWqtscNvWAI7U1CtlaD1KilQ6iudt1aI=
|
||||
golang.org/x/net v0.0.0-20190328230028-74de082e2cca/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI=
|
||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20171026204733-164713f0dfce/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190322080309-f49334f85ddc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.0.0-20170915090833-1cbadb444a80/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/tools v0.0.0-20170915040203-e531a2a1c15f/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20181205014116-22934f0fdb62/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190121143147-24cd39ecf745/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190125232054-379209517ffe/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190213192042-740235f6c0d8/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
|
||||
mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
|
||||
mvdan.cc/unparam v0.0.0-20190124213536-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY=
|
||||
mvdan.cc/unparam v0.0.0-20190310220240-1b9ccfa71afe/go.mod h1:BnhuWBAqxH3+J5bDybdxgw5ZfS+DsVd4iylsKQePN8o=
|
||||
sourcegraph.com/sourcegraph/go-diff v0.5.1-0.20190210232911-dee78e514455/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck=
|
||||
sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0=
|
||||
sourcegraph.com/sqs/pbtypes v1.0.0/go.mod h1:3AciMUv4qUuRHRHhOG4TZOB+72GdPVz5k+c648qsFS4=
|
||||
|
@ -7,10 +7,6 @@ type result struct {
|
||||
err error
|
||||
}
|
||||
|
||||
func newResult(data interface{}, err error) *result {
|
||||
return &result{data, err}
|
||||
}
|
||||
|
||||
func newResultFrom(fn visitorFn) *result {
|
||||
out, err := fn()
|
||||
|
||||
|
@ -2,6 +2,9 @@ package compiler
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/parser/fql"
|
||||
"github.com/MontFerret/ferret/pkg/runtime"
|
||||
"github.com/MontFerret/ferret/pkg/runtime/collections"
|
||||
@ -12,8 +15,6 @@ import (
|
||||
"github.com/MontFerret/ferret/pkg/runtime/expressions/operators"
|
||||
"github.com/antlr/antlr4/runtime/Go/antlr"
|
||||
"github.com/pkg/errors"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type (
|
||||
@ -193,6 +194,10 @@ func (v *visitor) doVisitForExpression(ctx *fql.ForExpressionContext, scope *sco
|
||||
srcExp,
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Clauses.
|
||||
// We put clauses parsing before parsing the query body because COLLECT clause overrides scope variables
|
||||
for _, e := range ctx.AllForExpressionBody() {
|
||||
@ -810,11 +815,12 @@ func (v *visitor) doVisitObjectLiteral(ctx *fql.ObjectLiteralContext, scope *sco
|
||||
computedProp := assignment.ComputedPropertyName()
|
||||
shortHand := assignment.ShorthandPropertyName()
|
||||
|
||||
if prop != nil {
|
||||
switch {
|
||||
case prop != nil:
|
||||
name, err = v.doVisitPropertyNameContext(prop.(*fql.PropertyNameContext), scope)
|
||||
} else if computedProp != nil {
|
||||
case computedProp != nil:
|
||||
name, err = v.doVisitComputedPropertyNameContext(computedProp.(*fql.ComputedPropertyNameContext), scope)
|
||||
} else {
|
||||
default:
|
||||
name, err = v.doVisitShorthandPropertyNameContext(shortHand.(*fql.ShorthandPropertyNameContext), scope)
|
||||
}
|
||||
|
||||
@ -943,7 +949,7 @@ func (v *visitor) doVisitStringLiteral(ctx *fql.StringLiteralContext) (core.Expr
|
||||
}
|
||||
|
||||
func (v *visitor) doVisitBooleanLiteral(ctx *fql.BooleanLiteralContext) (core.Expression, error) {
|
||||
return literals.NewBooleanLiteral(strings.ToUpper(ctx.GetText()) == "TRUE"), nil
|
||||
return literals.NewBooleanLiteral(strings.EqualFold(ctx.GetText(), "TRUE")), nil
|
||||
}
|
||||
|
||||
func (v *visitor) doVisitNoneLiteral(_ *fql.NoneLiteralContext) (core.Expression, error) {
|
||||
@ -1205,14 +1211,19 @@ func (v *visitor) doVisitArrayOperator(ctx *fql.ExpressionContext, scope *scope)
|
||||
var comparator core.OperatorExpression
|
||||
var err error
|
||||
|
||||
if ctx.InOperator() != nil {
|
||||
switch {
|
||||
case ctx.InOperator() != nil:
|
||||
comparator, err = v.doVisitInOperator(ctx, scope)
|
||||
} else if ctx.EqualityOperator() != nil {
|
||||
case ctx.EqualityOperator() != nil:
|
||||
comparator, err = v.doVisitEqualityOperator(ctx, scope)
|
||||
} else {
|
||||
default:
|
||||
return nil, v.unexpectedToken(ctx)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
exps, err := v.doVisitAllExpressions(ctx.AllExpression(), scope)
|
||||
|
||||
if err != nil {
|
||||
|
@ -963,6 +963,10 @@ func (doc *HTMLDocument) PrintToPDF(ctx context.Context, params drivers.PDFParam
|
||||
func (doc *HTMLDocument) CaptureScreenshot(ctx context.Context, params drivers.ScreenshotParams) (values.Binary, error) {
|
||||
metrics, err := doc.client.Page.GetLayoutMetrics(ctx)
|
||||
|
||||
if err != nil {
|
||||
return values.NewBinary(nil), err
|
||||
}
|
||||
|
||||
if params.Format == drivers.ScreenshotFormatJPEG && params.Quality < 0 && params.Quality > 100 {
|
||||
params.Quality = 100
|
||||
}
|
||||
|
@ -973,7 +973,11 @@ func (el *HTMLElement) Select(ctx context.Context, value *values.Array) (*values
|
||||
false,
|
||||
)
|
||||
|
||||
el.client.DOM.RemoveAttribute(ctx, dom.NewRemoveAttributeArgs(el.id.nodeID, attrID))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = el.client.DOM.RemoveAttribute(ctx, dom.NewRemoveAttributeArgs(el.id.nodeID, attrID))
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -1022,7 +1026,11 @@ func (el *HTMLElement) ScrollIntoView(ctx context.Context) error {
|
||||
id.String(),
|
||||
), false, false)
|
||||
|
||||
el.client.DOM.RemoveAttribute(ctx, dom.NewRemoveAttributeArgs(el.id.nodeID, attrID))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = el.client.DOM.RemoveAttribute(ctx, dom.NewRemoveAttributeArgs(el.id.nodeID, attrID))
|
||||
|
||||
return err
|
||||
}
|
||||
|
@ -2,10 +2,11 @@ package events
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/MontFerret/ferret/pkg/drivers"
|
||||
"reflect"
|
||||
"sync"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/drivers"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/runtime/core"
|
||||
"github.com/mafredri/cdp/protocol/dom"
|
||||
"github.com/mafredri/cdp/protocol/page"
|
||||
@ -30,16 +31,16 @@ type (
|
||||
}
|
||||
)
|
||||
|
||||
var (
|
||||
const (
|
||||
//revive:disable-next-line:var-declaration
|
||||
EventError Event = 0
|
||||
EventLoad Event = 1
|
||||
EventReload Event = 2
|
||||
EventAttrModified Event = 3
|
||||
EventAttrRemoved Event = 4
|
||||
EventChildNodeCountUpdated Event = 5
|
||||
EventChildNodeInserted Event = 6
|
||||
EventChildNodeRemoved Event = 7
|
||||
EventError = Event(iota)
|
||||
EventLoad
|
||||
EventReload
|
||||
EventAttrModified
|
||||
EventAttrRemoved
|
||||
EventChildNodeCountUpdated
|
||||
EventChildNodeInserted
|
||||
EventChildNodeRemoved
|
||||
)
|
||||
|
||||
func NewEventBroker(
|
||||
|
@ -89,11 +89,12 @@ func computeQuadArea(quads []Quad) float64 {
|
||||
func getClickablePoint(ctx context.Context, client *cdp.Client, id *HTMLElementIdentity) (Quad, error) {
|
||||
qargs := dom.NewGetContentQuadsArgs()
|
||||
|
||||
if id.objectID != "" {
|
||||
switch {
|
||||
case id.objectID != "":
|
||||
qargs.SetObjectID(id.objectID)
|
||||
} else if id.backendID != 0 {
|
||||
case id.backendID != 0:
|
||||
qargs.SetBackendNodeID(id.backendID)
|
||||
} else {
|
||||
default:
|
||||
qargs.SetNodeID(id.nodeID)
|
||||
}
|
||||
|
||||
@ -168,9 +169,10 @@ func parseAttrs(attrs []string) *values.Object {
|
||||
func loadInnerHTML(ctx context.Context, client *cdp.Client, id *HTMLElementIdentity) (values.String, error) {
|
||||
var objID runtime.RemoteObjectID
|
||||
|
||||
if id.objectID != "" {
|
||||
switch {
|
||||
case id.objectID != "":
|
||||
objID = id.objectID
|
||||
} else if id.backendID > 0 {
|
||||
case id.backendID > 0:
|
||||
repl, err := client.DOM.ResolveNode(ctx, dom.NewResolveNodeArgs().SetBackendNodeID(id.backendID))
|
||||
|
||||
if err != nil {
|
||||
@ -182,7 +184,7 @@ func loadInnerHTML(ctx context.Context, client *cdp.Client, id *HTMLElementIdent
|
||||
}
|
||||
|
||||
objID = *repl.Object.ObjectID
|
||||
} else {
|
||||
default:
|
||||
repl, err := client.DOM.ResolveNode(ctx, dom.NewResolveNodeArgs().SetNodeID(id.nodeID))
|
||||
|
||||
if err != nil {
|
||||
@ -219,9 +221,10 @@ func loadInnerHTML(ctx context.Context, client *cdp.Client, id *HTMLElementIdent
|
||||
func loadInnerText(ctx context.Context, client *cdp.Client, id *HTMLElementIdentity) (values.String, error) {
|
||||
var objID runtime.RemoteObjectID
|
||||
|
||||
if id.objectID != "" {
|
||||
switch {
|
||||
case id.objectID != "":
|
||||
objID = id.objectID
|
||||
} else if id.backendID > 0 {
|
||||
case id.backendID > 0:
|
||||
repl, err := client.DOM.ResolveNode(ctx, dom.NewResolveNodeArgs().SetBackendNodeID(id.backendID))
|
||||
|
||||
if err != nil {
|
||||
@ -233,7 +236,7 @@ func loadInnerText(ctx context.Context, client *cdp.Client, id *HTMLElementIdent
|
||||
}
|
||||
|
||||
objID = *repl.Object.ObjectID
|
||||
} else {
|
||||
default:
|
||||
repl, err := client.DOM.ResolveNode(ctx, dom.NewResolveNodeArgs().SetNodeID(id.nodeID))
|
||||
|
||||
if err != nil {
|
||||
@ -416,8 +419,6 @@ func fromDriverCookie(url string, cookie drivers.HTTPCookie) network.CookieParam
|
||||
sameSite = network.CookieSameSiteLax
|
||||
case drivers.SameSiteStrictMode:
|
||||
sameSite = network.CookieSameSiteStrict
|
||||
default:
|
||||
sameSite = network.CookieSameSiteNotSet
|
||||
}
|
||||
|
||||
if cookie.Expires == emptyExpires {
|
||||
@ -456,13 +457,8 @@ func toDriverCookie(c network.Cookie) drivers.HTTPCookie {
|
||||
switch c.SameSite {
|
||||
case network.CookieSameSiteLax:
|
||||
sameSite = drivers.SameSiteLaxMode
|
||||
break
|
||||
case network.CookieSameSiteStrict:
|
||||
sameSite = drivers.SameSiteStrictMode
|
||||
break
|
||||
default:
|
||||
sameSite = drivers.SameSiteDefaultMode
|
||||
break
|
||||
}
|
||||
|
||||
return drivers.HTTPCookie{
|
||||
|
@ -2,6 +2,7 @@ package collections
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/runtime/core"
|
||||
"github.com/MontFerret/ferret/pkg/runtime/values"
|
||||
)
|
||||
@ -34,11 +35,7 @@ type (
|
||||
}
|
||||
)
|
||||
|
||||
func NewCoreIterator(
|
||||
valVar,
|
||||
keyVar string,
|
||||
values core.Iterator,
|
||||
) (Iterator, error) {
|
||||
func NewCoreIterator(valVar, keyVar string, values core.Iterator) (Iterator, error) {
|
||||
return &coreIterator{valVar, keyVar, values}, nil
|
||||
}
|
||||
|
||||
|
@ -2,6 +2,7 @@ package collections
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/runtime/core"
|
||||
)
|
||||
|
||||
@ -38,8 +39,13 @@ func (iterator *FilterIterator) Next(ctx context.Context, scope *core.Scope) (*c
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// TODO: test case when predicate return not nil
|
||||
take, err := iterator.predicate(ctx, nextScope)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if take == true {
|
||||
return nextScope, nil
|
||||
}
|
||||
|
@ -3,12 +3,13 @@ package collections_test
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"math"
|
||||
"testing"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/runtime/collections"
|
||||
"github.com/MontFerret/ferret/pkg/runtime/core"
|
||||
"github.com/MontFerret/ferret/pkg/runtime/values"
|
||||
. "github.com/smartystreets/goconvey/convey"
|
||||
"math"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestFilter(t *testing.T) {
|
||||
@ -23,7 +24,7 @@ func TestFilter(t *testing.T) {
|
||||
|
||||
predicate := func(_ context.Context, scope *core.Scope) (bool, error) {
|
||||
i := float64(scope.MustGetVariable(collections.DefaultValueVar).Unwrap().(int))
|
||||
calc := float64(i / 2)
|
||||
calc := i / 2
|
||||
|
||||
return calc == math.Floor(calc), nil
|
||||
}
|
||||
@ -58,7 +59,7 @@ func TestFilter(t *testing.T) {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
calc := float64(i / 2)
|
||||
calc := i / 2
|
||||
|
||||
return calc == math.Floor(calc), nil
|
||||
}
|
||||
|
@ -2,9 +2,10 @@ package collections
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/MontFerret/ferret/pkg/runtime/core"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/runtime/core"
|
||||
)
|
||||
|
||||
type (
|
||||
@ -32,7 +33,7 @@ const (
|
||||
)
|
||||
|
||||
func SortDirectionFromString(str string) SortDirection {
|
||||
if strings.ToUpper(str) == "DESC" {
|
||||
if strings.EqualFold(str, "DESC") {
|
||||
return SortDirectionDesc
|
||||
}
|
||||
|
||||
@ -136,7 +137,7 @@ func (iterator *SortIterator) sort(ctx context.Context, scope *core.Scope) ([]*c
|
||||
break
|
||||
}
|
||||
|
||||
eq = eq * int64(comp.direction)
|
||||
eq *= int64(comp.direction)
|
||||
|
||||
if eq == -1 {
|
||||
out = true
|
||||
|
@ -2,8 +2,9 @@ package core
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/pkg/errors"
|
||||
"strings"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -25,9 +25,7 @@ func NewRootScope() (*Scope, CloseFunc) {
|
||||
disposables: make([]io.Closer, 0, 10),
|
||||
}
|
||||
|
||||
return newScope(root, nil), func() error {
|
||||
return root.Close()
|
||||
}
|
||||
return newScope(root, nil), root.Close
|
||||
}
|
||||
|
||||
func (s *RootScope) AddDisposable(disposable io.Closer) {
|
||||
|
@ -2,6 +2,7 @@ package clauses
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/runtime/collections"
|
||||
"github.com/MontFerret/ferret/pkg/runtime/core"
|
||||
)
|
||||
@ -56,24 +57,26 @@ func NewCollect(
|
||||
return collect, nil
|
||||
}
|
||||
|
||||
if projection != nil && count == nil && aggregate == nil {
|
||||
switch {
|
||||
case projection != nil && count == nil && aggregate == nil:
|
||||
collect.group.projection = projection
|
||||
} else if projection == nil && count != nil && aggregate == nil {
|
||||
case projection == nil && count != nil && aggregate == nil:
|
||||
collect.group.count = count
|
||||
} else if projection == nil && count == nil && aggregate != nil {
|
||||
case projection == nil && count == nil && aggregate != nil:
|
||||
collect.group.aggregate = aggregate
|
||||
} else {
|
||||
default:
|
||||
return nil, core.Error(core.ErrInvalidOperation, "projection, count and aggregate cannot be used together")
|
||||
}
|
||||
|
||||
return collect, nil
|
||||
}
|
||||
|
||||
if count == nil && aggregate != nil {
|
||||
switch {
|
||||
case count == nil && aggregate != nil:
|
||||
collect.aggregate = aggregate
|
||||
} else if count != nil && aggregate == nil {
|
||||
case count != nil && aggregate == nil:
|
||||
collect.count = count
|
||||
} else {
|
||||
default:
|
||||
return nil, core.Error(core.ErrInvalidOperation, "count and aggregate cannot be used together")
|
||||
}
|
||||
|
||||
|
@ -59,11 +59,7 @@ func (clause *LimitClause) Iterate(ctx context.Context, scope *core.Scope) (coll
|
||||
return nil, err
|
||||
}
|
||||
|
||||
iterator, err := collections.NewLimitIterator(
|
||||
src,
|
||||
int(countInt),
|
||||
int(offsetInt),
|
||||
)
|
||||
iterator, err := collections.NewLimitIterator(src, countInt, offsetInt)
|
||||
|
||||
if err != nil {
|
||||
return nil, core.SourceError(clause.src, err)
|
||||
|
@ -2,9 +2,10 @@ package expressions_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/MontFerret/ferret/pkg/runtime/values/types"
|
||||
"testing"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/runtime/values/types"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/runtime/core"
|
||||
"github.com/MontFerret/ferret/pkg/runtime/expressions"
|
||||
"github.com/MontFerret/ferret/pkg/runtime/values"
|
||||
@ -49,6 +50,7 @@ func TestParameterExpressionExec(t *testing.T) {
|
||||
Convey("Should not exec a missing parameter expression", t, func() {
|
||||
sourceMap := core.NewSourceMap("test", 1, 10)
|
||||
notExistExp, err := expressions.NewParameterExpression(sourceMap, "param2")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
params := make(map[string]core.Value)
|
||||
params["param1"] = values.NewInt(1)
|
||||
|
@ -23,19 +23,19 @@ func ParseInt(input interface{}) (Int, error) {
|
||||
return ZeroInt, nil
|
||||
}
|
||||
|
||||
switch input.(type) {
|
||||
switch val := input.(type) {
|
||||
case int:
|
||||
return Int(input.(int)), nil
|
||||
return Int(val), nil
|
||||
case int64:
|
||||
return Int(input.(int64)), nil
|
||||
return Int(val), nil
|
||||
case int32:
|
||||
return Int(input.(int32)), nil
|
||||
return Int(val), nil
|
||||
case int16:
|
||||
return Int(input.(int16)), nil
|
||||
return Int(val), nil
|
||||
case int8:
|
||||
return Int(input.(int8)), nil
|
||||
return Int(val), nil
|
||||
case string:
|
||||
i, err := strconv.Atoi(input.(string))
|
||||
i, err := strconv.Atoi(val)
|
||||
|
||||
if err == nil {
|
||||
if i == 0 {
|
||||
|
@ -45,7 +45,7 @@ func Push(_ context.Context, args ...core.Value) (core.Value, error) {
|
||||
|
||||
arr.ForEach(func(item core.Value, idx int) bool {
|
||||
if uniq && push {
|
||||
push = !(item.Compare(value) == 0)
|
||||
push = item.Compare(value) != 0
|
||||
}
|
||||
|
||||
result.Push(item)
|
||||
|
@ -36,9 +36,12 @@ func DateCompare(_ context.Context, args ...core.Value) (core.Value, error) {
|
||||
rangeEnd := values.NewString("millisecond")
|
||||
|
||||
if len(args) == 4 {
|
||||
if err = core.ValidateType(args[3], types.String); err != nil {
|
||||
err = core.ValidateType(args[3], types.String)
|
||||
|
||||
if err != nil {
|
||||
return values.None, err
|
||||
}
|
||||
|
||||
rangeEnd = args[3].(values.String)
|
||||
}
|
||||
|
||||
|
@ -151,12 +151,7 @@ func newDocLoadParams(url values.String, arg core.Value) (DocumentLoadParams, er
|
||||
return res, err
|
||||
}
|
||||
|
||||
header, err := parseHeader(header.(*values.Object))
|
||||
|
||||
if err != nil {
|
||||
return res, err
|
||||
}
|
||||
|
||||
header := parseHeader(header.(*values.Object))
|
||||
res.Header = header
|
||||
}
|
||||
|
||||
@ -203,7 +198,9 @@ func parseCookies(arr *values.Array) ([]drivers.HTTPCookie, error) {
|
||||
func parseCookie(value core.Value) (drivers.HTTPCookie, error) {
|
||||
var err error
|
||||
|
||||
if err = core.ValidateType(value, types.Object, drivers.HTTPCookieType); err != nil {
|
||||
err = core.ValidateType(value, types.Object, drivers.HTTPCookieType)
|
||||
|
||||
if err != nil {
|
||||
return drivers.HTTPCookie{}, err
|
||||
}
|
||||
|
||||
@ -291,7 +288,7 @@ func parseCookie(value core.Value) (drivers.HTTPCookie, error) {
|
||||
return cookie, err
|
||||
}
|
||||
|
||||
func parseHeader(header *values.Object) (drivers.HTTPHeader, error) {
|
||||
func parseHeader(header *values.Object) drivers.HTTPHeader {
|
||||
res := make(drivers.HTTPHeader)
|
||||
|
||||
header.ForEach(func(value core.Value, key string) bool {
|
||||
@ -300,5 +297,5 @@ func parseHeader(header *values.Object) (drivers.HTTPHeader, error) {
|
||||
return true
|
||||
})
|
||||
|
||||
return res, nil
|
||||
return res
|
||||
}
|
||||
|
@ -33,21 +33,18 @@ func Median(_ context.Context, args ...core.Value) (core.Value, error) {
|
||||
|
||||
var median core.Value
|
||||
|
||||
if l == 0 {
|
||||
switch {
|
||||
case l == 0:
|
||||
return values.NewFloat(math.NaN()), nil
|
||||
} else if l%2 == 0 {
|
||||
case l%2 == 0:
|
||||
median, err = mean(sorted.Slice(l/2-1, l/2+1))
|
||||
|
||||
if err != nil {
|
||||
return values.None, nil
|
||||
}
|
||||
} else {
|
||||
default:
|
||||
median = sorted.Get(l / 2)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return values.None, nil
|
||||
}
|
||||
|
||||
return median, nil
|
||||
}
|
||||
|
@ -70,21 +70,16 @@ func Percentile(_ context.Context, args ...core.Value) (core.Value, error) {
|
||||
var percentile core.Value
|
||||
|
||||
// Check if the index is a whole number
|
||||
if index == even {
|
||||
|
||||
// Convert float to int
|
||||
switch {
|
||||
case index == even:
|
||||
i := values.Int(index)
|
||||
|
||||
// Find the value at the index
|
||||
percentile = sorted.Get(i - 1)
|
||||
} else if index > 1 {
|
||||
|
||||
case index > 1:
|
||||
// Convert float to int via truncation
|
||||
i := values.Int(index)
|
||||
|
||||
// Find the average of the index and following values
|
||||
percentile, _ = mean(values.NewArrayWith(sorted.Get(i-1), sorted.Get(i)))
|
||||
} else {
|
||||
default:
|
||||
return values.NewFloat(math.NaN()), errors.New("input is outside of range")
|
||||
}
|
||||
|
||||
|
@ -32,11 +32,7 @@ func StandardDeviationPopulation(_ context.Context, args ...core.Value) (core.Va
|
||||
return values.NewFloat(math.NaN()), nil
|
||||
}
|
||||
|
||||
vp, err := variance(arr, values.NewInt(0))
|
||||
|
||||
if err != nil {
|
||||
return values.NewFloat(math.NaN()), err
|
||||
}
|
||||
vp := variance(arr, values.NewInt(0))
|
||||
|
||||
return values.NewFloat(math.Pow(float64(vp), 0.5)), nil
|
||||
}
|
||||
|
@ -32,11 +32,7 @@ func StandardDeviationSample(_ context.Context, args ...core.Value) (core.Value,
|
||||
return values.NewFloat(math.NaN()), nil
|
||||
}
|
||||
|
||||
vp, err := variance(arr, values.NewInt(1))
|
||||
|
||||
if err != nil {
|
||||
return values.NewFloat(math.NaN()), err
|
||||
}
|
||||
vp := variance(arr, values.NewInt(1))
|
||||
|
||||
return values.NewFloat(math.Pow(float64(vp), 0.5)), nil
|
||||
}
|
||||
|
@ -8,9 +8,9 @@ import (
|
||||
"github.com/MontFerret/ferret/pkg/runtime/values/types"
|
||||
)
|
||||
|
||||
func variance(input *values.Array, sample values.Int) (values.Float, error) {
|
||||
func variance(input *values.Array, sample values.Int) values.Float {
|
||||
if input.Length() == 0 {
|
||||
return values.NewFloat(math.NaN()), nil
|
||||
return values.NewFloat(math.NaN())
|
||||
}
|
||||
|
||||
m, _ := mean(input)
|
||||
@ -37,5 +37,5 @@ func variance(input *values.Array, sample values.Int) (values.Float, error) {
|
||||
// or population and wether to subtract by one or not
|
||||
l := values.Float(input.Length() - (1 * sample))
|
||||
|
||||
return variance / l, nil
|
||||
return variance / l
|
||||
}
|
||||
|
@ -32,5 +32,5 @@ func PopulationVariance(_ context.Context, args ...core.Value) (core.Value, erro
|
||||
return values.NewFloat(math.NaN()), nil
|
||||
}
|
||||
|
||||
return variance(arr, values.NewInt(0))
|
||||
return variance(arr, values.NewInt(0)), nil
|
||||
}
|
||||
|
@ -32,5 +32,5 @@ func SampleVariance(_ context.Context, args ...core.Value) (core.Value, error) {
|
||||
return values.NewFloat(math.NaN()), nil
|
||||
}
|
||||
|
||||
return variance(arr, values.NewInt(1))
|
||||
return variance(arr, values.NewInt(1)), nil
|
||||
}
|
||||
|
@ -22,7 +22,9 @@ func Zip(_ context.Context, args ...core.Value) (core.Value, error) {
|
||||
}
|
||||
|
||||
for _, arg := range args {
|
||||
if err = core.ValidateType(arg, types.Array); err != nil {
|
||||
err = core.ValidateType(arg, types.Array)
|
||||
|
||||
if err != nil {
|
||||
return values.None, err
|
||||
}
|
||||
}
|
||||
|
@ -88,5 +88,5 @@ func ToBase64(_ context.Context, args ...core.Value) (core.Value, error) {
|
||||
value := args[0].String()
|
||||
out := base64.StdEncoding.EncodeToString([]byte(value))
|
||||
|
||||
return values.NewString(string(out)), nil
|
||||
return values.NewString(out), nil
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ func FindFirst(_ context.Context, args ...core.Value) (core.Value, error) {
|
||||
runes := []rune(text)
|
||||
search := args[1].String()
|
||||
start := values.NewInt(0)
|
||||
end := values.NewInt(int(len(text)))
|
||||
end := values.NewInt(len(text))
|
||||
|
||||
if argsCount == 3 {
|
||||
arg3 := args[2]
|
||||
@ -76,7 +76,7 @@ func FindLast(_ context.Context, args ...core.Value) (core.Value, error) {
|
||||
runes := []rune(text)
|
||||
search := args[1].String()
|
||||
start := values.NewInt(0)
|
||||
end := values.NewInt(int(len(text)))
|
||||
end := values.NewInt(len(text))
|
||||
|
||||
if argsCount == 3 {
|
||||
arg3 := args[2]
|
||||
|
@ -36,10 +36,7 @@ func Fmt(_ context.Context, args ...core.Value) (core.Value, error) {
|
||||
}
|
||||
|
||||
func format(template string, args []core.Value) (string, error) {
|
||||
rgx, err := regexp.Compile("{[0-9]*}")
|
||||
if err != nil {
|
||||
return "", errors.Errorf("failed to build regexp: %v", err)
|
||||
}
|
||||
rgx := regexp.MustCompile("{[0-9]*}")
|
||||
|
||||
argsCount := len(args)
|
||||
emptyBracketsCount := strings.Count(template, "{}")
|
||||
@ -53,6 +50,7 @@ func format(template string, args []core.Value) (string, error) {
|
||||
// index of the last value
|
||||
// inserted into the template
|
||||
var lastArgIdx int
|
||||
var err error
|
||||
|
||||
template = rgx.ReplaceAllStringFunc(template, func(s string) string {
|
||||
if err != nil {
|
||||
|
@ -43,15 +43,17 @@ func Like(_ context.Context, args ...core.Value) (core.Value, error) {
|
||||
|
||||
for i := 1; i < len(str)+1; i++ {
|
||||
for j := 1; j < len(pattern)+1; j++ {
|
||||
if pattern[j-1] == '%' {
|
||||
switch {
|
||||
case pattern[j-1] == '%':
|
||||
lookup[i][j] = lookup[i][j-1] || lookup[i-1][j]
|
||||
} else if pattern[j-1] == '_' || str[i-1] == pattern[j-1] {
|
||||
case pattern[j-1] == '_' || str[i-1] == pattern[j-1]:
|
||||
lookup[i][j] = lookup[i-1][j-1]
|
||||
} else if len(args) > 2 {
|
||||
if args[2] == values.True && unicode.ToLower(str[i-1]) == unicode.ToLower(pattern[j-1]) {
|
||||
case len(args) > 2:
|
||||
isEq := unicode.ToLower(str[i-1]) == unicode.ToLower(pattern[j-1])
|
||||
if args[2] == values.True && isEq {
|
||||
lookup[i][j] = lookup[i-1][j-1]
|
||||
}
|
||||
} else {
|
||||
default:
|
||||
lookup[i][j] = false
|
||||
}
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ func RegexMatch(_ context.Context, args ...core.Value) (core.Value, error) {
|
||||
// @param regex (String) - A regular expression to use for splitting the text.
|
||||
// @param caseInsensitive (Boolean) - If set to true, the matching will be case-insensitive. The default is false.
|
||||
// @param limit (Int) - Limit the number of split values in the result. If no limit is given, the number of splits returned is not bounded.
|
||||
// @return (Array) - An array of strings splited by teh expression.
|
||||
// @return (Array) - An array of strings splited by the expression.
|
||||
func RegexSplit(_ context.Context, args ...core.Value) (core.Value, error) {
|
||||
err := core.ValidateArgs(args, 2, 4)
|
||||
|
||||
|
@ -103,7 +103,7 @@ func Right(_ context.Context, args ...core.Value) (core.Value, error) {
|
||||
}
|
||||
|
||||
if len(text) < pos {
|
||||
return values.NewString(string(text)), nil
|
||||
return values.NewString(text), nil
|
||||
}
|
||||
|
||||
return values.NewStringFromRunes(runes[size-pos : size]), nil
|
||||
|
Loading…
x
Reference in New Issue
Block a user