mirror of
				https://github.com/MontFerret/ferret.git
				synced 2025-10-30 23:37:40 +02:00 
			
		
		
		
	| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user