From dc5edb901c77dcf4ead14af5c744eed6f9eb4e35 Mon Sep 17 00:00:00 2001 From: Pawan Date: Wed, 26 Feb 2020 11:32:22 +0530 Subject: [PATCH] feat(analytics): vendor code for google analytics Signed-off-by: Pawan --- Gopkg.lock | 30 + .../docker/go-units/CONTRIBUTING.md | 67 + vendor/github.com/docker/go-units/LICENSE | 191 +++ vendor/github.com/docker/go-units/MAINTAINERS | 46 + vendor/github.com/docker/go-units/README.md | 16 + vendor/github.com/docker/go-units/circle.yml | 11 + vendor/github.com/docker/go-units/duration.go | 35 + vendor/github.com/docker/go-units/size.go | 108 ++ vendor/github.com/docker/go-units/ulimit.go | 123 ++ .../jpillora/go-ogle-analytics/.gitignore | 1 + .../jpillora/go-ogle-analytics/LICENSE | 22 + .../jpillora/go-ogle-analytics/README.md | 81 ++ .../jpillora/go-ogle-analytics/client.go | 76 + .../jpillora/go-ogle-analytics/conv.go | 19 + .../jpillora/go-ogle-analytics/type-client.go | 1228 +++++++++++++++++ .../jpillora/go-ogle-analytics/type-event.go | 58 + .../go-ogle-analytics/type-exception.go | 49 + .../jpillora/go-ogle-analytics/type-item.go | 98 ++ .../go-ogle-analytics/type-pageview.go | 24 + .../go-ogle-analytics/type-screenview.go | 24 + .../jpillora/go-ogle-analytics/type-social.go | 41 + .../jpillora/go-ogle-analytics/type-timing.go | 177 +++ .../go-ogle-analytics/type-transaction.go | 95 ++ 23 files changed, 2620 insertions(+) create mode 100644 vendor/github.com/docker/go-units/CONTRIBUTING.md create mode 100644 vendor/github.com/docker/go-units/LICENSE create mode 100644 vendor/github.com/docker/go-units/MAINTAINERS create mode 100644 vendor/github.com/docker/go-units/README.md create mode 100644 vendor/github.com/docker/go-units/circle.yml create mode 100644 vendor/github.com/docker/go-units/duration.go create mode 100644 vendor/github.com/docker/go-units/size.go create mode 100644 vendor/github.com/docker/go-units/ulimit.go create mode 100644 vendor/github.com/jpillora/go-ogle-analytics/.gitignore create mode 100644 vendor/github.com/jpillora/go-ogle-analytics/LICENSE create mode 100644 vendor/github.com/jpillora/go-ogle-analytics/README.md create mode 100644 vendor/github.com/jpillora/go-ogle-analytics/client.go create mode 100644 vendor/github.com/jpillora/go-ogle-analytics/conv.go create mode 100644 vendor/github.com/jpillora/go-ogle-analytics/type-client.go create mode 100644 vendor/github.com/jpillora/go-ogle-analytics/type-event.go create mode 100644 vendor/github.com/jpillora/go-ogle-analytics/type-exception.go create mode 100644 vendor/github.com/jpillora/go-ogle-analytics/type-item.go create mode 100644 vendor/github.com/jpillora/go-ogle-analytics/type-pageview.go create mode 100644 vendor/github.com/jpillora/go-ogle-analytics/type-screenview.go create mode 100644 vendor/github.com/jpillora/go-ogle-analytics/type-social.go create mode 100644 vendor/github.com/jpillora/go-ogle-analytics/type-timing.go create mode 100644 vendor/github.com/jpillora/go-ogle-analytics/type-transaction.go diff --git a/Gopkg.lock b/Gopkg.lock index 774cddd..db3e3dc 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -33,6 +33,14 @@ revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" version = "v1.1.1" +[[projects]] + digest = "1:e95ef557dc3120984bb66b385ae01b4bb8ff56bcde28e7b0d1beed0cccc4d69f" + name = "github.com/docker/go-units" + packages = ["."] + pruneopts = "UT" + revision = "519db1ee28dcc9fd2474ae59fca29a810482bfb1" + version = "v0.4.0" + [[projects]] branch = "master" digest = "1:ecdc8e0fe3bc7d549af1c9c36acf3820523b707d6c071b6d0c3860882c6f7b42" @@ -157,6 +165,14 @@ revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" version = "v1.0" +[[projects]] + branch = "master" + digest = "1:289a0aeeff2a467506d6faacb71c783a8610e53639e8f065e1997a569e622d6b" + name = "github.com/jpillora/go-ogle-analytics" + packages = ["."] + pruneopts = "UT" + revision = "14b04e0594ef6a9fd943363b135656f0ec8c9d0e" + [[projects]] digest = "1:709cd2a2c29cc9b89732f6c24846bbb9d6270f28ef5ef2128cc73bd0d6d7bff9" name = "github.com/json-iterator/go" @@ -867,22 +883,30 @@ input-imports = [ "github.com/Sirupsen/logrus", "github.com/container-storage-interface/spec/lib/go/csi", + "github.com/docker/go-units", "github.com/ghodss/yaml", + "github.com/golang/protobuf/ptypes/timestamp", + "github.com/jpillora/go-ogle-analytics", "github.com/kubernetes-csi/csi-lib-utils/protosanitizer", "github.com/onsi/ginkgo", "github.com/onsi/gomega", "github.com/pkg/errors", "github.com/spf13/cobra", "golang.org/x/net/context", + "golang.org/x/sys/unix", "google.golang.org/grpc", "google.golang.org/grpc/codes", "google.golang.org/grpc/status", "k8s.io/api/apps/v1", + "k8s.io/api/apps/v1beta1", + "k8s.io/api/batch/v1", "k8s.io/api/core/v1", + "k8s.io/api/extensions/v1beta1", "k8s.io/api/storage/v1", "k8s.io/apimachinery/pkg/api/errors", "k8s.io/apimachinery/pkg/api/resource", "k8s.io/apimachinery/pkg/apis/meta/v1", + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", "k8s.io/apimachinery/pkg/labels", "k8s.io/apimachinery/pkg/runtime", "k8s.io/apimachinery/pkg/runtime/schema", @@ -890,6 +914,7 @@ "k8s.io/apimachinery/pkg/types", "k8s.io/apimachinery/pkg/util/runtime", "k8s.io/apimachinery/pkg/util/wait", + "k8s.io/apimachinery/pkg/version", "k8s.io/apimachinery/pkg/watch", "k8s.io/client-go/discovery", "k8s.io/client-go/discovery/fake", @@ -897,7 +922,11 @@ "k8s.io/client-go/informers", "k8s.io/client-go/kubernetes", "k8s.io/client-go/kubernetes/scheme", + "k8s.io/client-go/kubernetes/typed/apps/v1", + "k8s.io/client-go/kubernetes/typed/apps/v1beta1", "k8s.io/client-go/kubernetes/typed/core/v1", + "k8s.io/client-go/kubernetes/typed/extensions/v1beta1", + "k8s.io/client-go/kubernetes/typed/storage/v1", "k8s.io/client-go/plugin/pkg/client/auth/gcp", "k8s.io/client-go/rest", "k8s.io/client-go/testing", @@ -912,6 +941,7 @@ "k8s.io/code-generator/cmd/defaulter-gen", "k8s.io/code-generator/cmd/informer-gen", "k8s.io/code-generator/cmd/lister-gen", + "k8s.io/klog", "k8s.io/kubernetes/pkg/util/mount", "sigs.k8s.io/controller-runtime/pkg/runtime/signals", ] diff --git a/vendor/github.com/docker/go-units/CONTRIBUTING.md b/vendor/github.com/docker/go-units/CONTRIBUTING.md new file mode 100644 index 0000000..9ea86d7 --- /dev/null +++ b/vendor/github.com/docker/go-units/CONTRIBUTING.md @@ -0,0 +1,67 @@ +# Contributing to go-units + +Want to hack on go-units? Awesome! Here are instructions to get you started. + +go-units is a part of the [Docker](https://www.docker.com) project, and follows +the same rules and principles. If you're already familiar with the way +Docker does things, you'll feel right at home. + +Otherwise, go read Docker's +[contributions guidelines](https://github.com/docker/docker/blob/master/CONTRIBUTING.md), +[issue triaging](https://github.com/docker/docker/blob/master/project/ISSUE-TRIAGE.md), +[review process](https://github.com/docker/docker/blob/master/project/REVIEWING.md) and +[branches and tags](https://github.com/docker/docker/blob/master/project/BRANCHES-AND-TAGS.md). + +### Sign your work + +The sign-off is a simple line at the end of the explanation for the patch. Your +signature certifies that you wrote the patch or otherwise have the right to pass +it on as an open-source patch. The rules are pretty simple: if you can certify +the below (from [developercertificate.org](http://developercertificate.org/)): + +``` +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +660 York Street, Suite 102, +San Francisco, CA 94110 USA + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. +``` + +Then you just add a line to every git commit message: + + Signed-off-by: Joe Smith + +Use your real name (sorry, no pseudonyms or anonymous contributions.) + +If you set your `user.name` and `user.email` git configs, you can sign your +commit automatically with `git commit -s`. diff --git a/vendor/github.com/docker/go-units/LICENSE b/vendor/github.com/docker/go-units/LICENSE new file mode 100644 index 0000000..b55b37b --- /dev/null +++ b/vendor/github.com/docker/go-units/LICENSE @@ -0,0 +1,191 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2015 Docker, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/docker/go-units/MAINTAINERS b/vendor/github.com/docker/go-units/MAINTAINERS new file mode 100644 index 0000000..4aac7c7 --- /dev/null +++ b/vendor/github.com/docker/go-units/MAINTAINERS @@ -0,0 +1,46 @@ +# go-units maintainers file +# +# This file describes who runs the docker/go-units project and how. +# This is a living document - if you see something out of date or missing, speak up! +# +# It is structured to be consumable by both humans and programs. +# To extract its contents programmatically, use any TOML-compliant parser. +# +# This file is compiled into the MAINTAINERS file in docker/opensource. +# +[Org] + [Org."Core maintainers"] + people = [ + "akihirosuda", + "dnephin", + "thajeztah", + "vdemeester", + ] + +[people] + +# A reference list of all people associated with the project. +# All other sections should refer to people by their canonical key +# in the people section. + + # ADD YOURSELF HERE IN ALPHABETICAL ORDER + + [people.akihirosuda] + Name = "Akihiro Suda" + Email = "akihiro.suda.cz@hco.ntt.co.jp" + GitHub = "AkihiroSuda" + + [people.dnephin] + Name = "Daniel Nephin" + Email = "dnephin@gmail.com" + GitHub = "dnephin" + + [people.thajeztah] + Name = "Sebastiaan van Stijn" + Email = "github@gone.nl" + GitHub = "thaJeztah" + + [people.vdemeester] + Name = "Vincent Demeester" + Email = "vincent@sbr.pm" + GitHub = "vdemeester" \ No newline at end of file diff --git a/vendor/github.com/docker/go-units/README.md b/vendor/github.com/docker/go-units/README.md new file mode 100644 index 0000000..4f70a4e --- /dev/null +++ b/vendor/github.com/docker/go-units/README.md @@ -0,0 +1,16 @@ +[![GoDoc](https://godoc.org/github.com/docker/go-units?status.svg)](https://godoc.org/github.com/docker/go-units) + +# Introduction + +go-units is a library to transform human friendly measurements into machine friendly values. + +## Usage + +See the [docs in godoc](https://godoc.org/github.com/docker/go-units) for examples and documentation. + +## Copyright and license + +Copyright © 2015 Docker, Inc. + +go-units is licensed under the Apache License, Version 2.0. +See [LICENSE](LICENSE) for the full text of the license. diff --git a/vendor/github.com/docker/go-units/circle.yml b/vendor/github.com/docker/go-units/circle.yml new file mode 100644 index 0000000..af9d605 --- /dev/null +++ b/vendor/github.com/docker/go-units/circle.yml @@ -0,0 +1,11 @@ +dependencies: + post: + # install golint + - go get golang.org/x/lint/golint + +test: + pre: + # run analysis before tests + - go vet ./... + - test -z "$(golint ./... | tee /dev/stderr)" + - test -z "$(gofmt -s -l . | tee /dev/stderr)" diff --git a/vendor/github.com/docker/go-units/duration.go b/vendor/github.com/docker/go-units/duration.go new file mode 100644 index 0000000..48dd874 --- /dev/null +++ b/vendor/github.com/docker/go-units/duration.go @@ -0,0 +1,35 @@ +// Package units provides helper function to parse and print size and time units +// in human-readable format. +package units + +import ( + "fmt" + "time" +) + +// HumanDuration returns a human-readable approximation of a duration +// (eg. "About a minute", "4 hours ago", etc.). +func HumanDuration(d time.Duration) string { + if seconds := int(d.Seconds()); seconds < 1 { + return "Less than a second" + } else if seconds == 1 { + return "1 second" + } else if seconds < 60 { + return fmt.Sprintf("%d seconds", seconds) + } else if minutes := int(d.Minutes()); minutes == 1 { + return "About a minute" + } else if minutes < 60 { + return fmt.Sprintf("%d minutes", minutes) + } else if hours := int(d.Hours() + 0.5); hours == 1 { + return "About an hour" + } else if hours < 48 { + return fmt.Sprintf("%d hours", hours) + } else if hours < 24*7*2 { + return fmt.Sprintf("%d days", hours/24) + } else if hours < 24*30*2 { + return fmt.Sprintf("%d weeks", hours/24/7) + } else if hours < 24*365*2 { + return fmt.Sprintf("%d months", hours/24/30) + } + return fmt.Sprintf("%d years", int(d.Hours())/24/365) +} diff --git a/vendor/github.com/docker/go-units/size.go b/vendor/github.com/docker/go-units/size.go new file mode 100644 index 0000000..85f6ab0 --- /dev/null +++ b/vendor/github.com/docker/go-units/size.go @@ -0,0 +1,108 @@ +package units + +import ( + "fmt" + "regexp" + "strconv" + "strings" +) + +// See: http://en.wikipedia.org/wiki/Binary_prefix +const ( + // Decimal + + KB = 1000 + MB = 1000 * KB + GB = 1000 * MB + TB = 1000 * GB + PB = 1000 * TB + + // Binary + + KiB = 1024 + MiB = 1024 * KiB + GiB = 1024 * MiB + TiB = 1024 * GiB + PiB = 1024 * TiB +) + +type unitMap map[string]int64 + +var ( + decimalMap = unitMap{"k": KB, "m": MB, "g": GB, "t": TB, "p": PB} + binaryMap = unitMap{"k": KiB, "m": MiB, "g": GiB, "t": TiB, "p": PiB} + sizeRegex = regexp.MustCompile(`^(\d+(\.\d+)*) ?([kKmMgGtTpP])?[iI]?[bB]?$`) +) + +var decimapAbbrs = []string{"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"} +var binaryAbbrs = []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"} + +func getSizeAndUnit(size float64, base float64, _map []string) (float64, string) { + i := 0 + unitsLimit := len(_map) - 1 + for size >= base && i < unitsLimit { + size = size / base + i++ + } + return size, _map[i] +} + +// CustomSize returns a human-readable approximation of a size +// using custom format. +func CustomSize(format string, size float64, base float64, _map []string) string { + size, unit := getSizeAndUnit(size, base, _map) + return fmt.Sprintf(format, size, unit) +} + +// HumanSizeWithPrecision allows the size to be in any precision, +// instead of 4 digit precision used in units.HumanSize. +func HumanSizeWithPrecision(size float64, precision int) string { + size, unit := getSizeAndUnit(size, 1000.0, decimapAbbrs) + return fmt.Sprintf("%.*g%s", precision, size, unit) +} + +// HumanSize returns a human-readable approximation of a size +// capped at 4 valid numbers (eg. "2.746 MB", "796 KB"). +func HumanSize(size float64) string { + return HumanSizeWithPrecision(size, 4) +} + +// BytesSize returns a human-readable size in bytes, kibibytes, +// mebibytes, gibibytes, or tebibytes (eg. "44kiB", "17MiB"). +func BytesSize(size float64) string { + return CustomSize("%.4g%s", size, 1024.0, binaryAbbrs) +} + +// FromHumanSize returns an integer from a human-readable specification of a +// size using SI standard (eg. "44kB", "17MB"). +func FromHumanSize(size string) (int64, error) { + return parseSize(size, decimalMap) +} + +// RAMInBytes parses a human-readable string representing an amount of RAM +// in bytes, kibibytes, mebibytes, gibibytes, or tebibytes and +// returns the number of bytes, or -1 if the string is unparseable. +// Units are case-insensitive, and the 'b' suffix is optional. +func RAMInBytes(size string) (int64, error) { + return parseSize(size, binaryMap) +} + +// Parses the human-readable size string into the amount it represents. +func parseSize(sizeStr string, uMap unitMap) (int64, error) { + matches := sizeRegex.FindStringSubmatch(sizeStr) + if len(matches) != 4 { + return -1, fmt.Errorf("invalid size: '%s'", sizeStr) + } + + size, err := strconv.ParseFloat(matches[1], 64) + if err != nil { + return -1, err + } + + unitPrefix := strings.ToLower(matches[3]) + if mul, ok := uMap[unitPrefix]; ok { + size *= float64(mul) + } + + return int64(size), nil +} diff --git a/vendor/github.com/docker/go-units/ulimit.go b/vendor/github.com/docker/go-units/ulimit.go new file mode 100644 index 0000000..fca0400 --- /dev/null +++ b/vendor/github.com/docker/go-units/ulimit.go @@ -0,0 +1,123 @@ +package units + +import ( + "fmt" + "strconv" + "strings" +) + +// Ulimit is a human friendly version of Rlimit. +type Ulimit struct { + Name string + Hard int64 + Soft int64 +} + +// Rlimit specifies the resource limits, such as max open files. +type Rlimit struct { + Type int `json:"type,omitempty"` + Hard uint64 `json:"hard,omitempty"` + Soft uint64 `json:"soft,omitempty"` +} + +const ( + // magic numbers for making the syscall + // some of these are defined in the syscall package, but not all. + // Also since Windows client doesn't get access to the syscall package, need to + // define these here + rlimitAs = 9 + rlimitCore = 4 + rlimitCPU = 0 + rlimitData = 2 + rlimitFsize = 1 + rlimitLocks = 10 + rlimitMemlock = 8 + rlimitMsgqueue = 12 + rlimitNice = 13 + rlimitNofile = 7 + rlimitNproc = 6 + rlimitRss = 5 + rlimitRtprio = 14 + rlimitRttime = 15 + rlimitSigpending = 11 + rlimitStack = 3 +) + +var ulimitNameMapping = map[string]int{ + //"as": rlimitAs, // Disabled since this doesn't seem usable with the way Docker inits a container. + "core": rlimitCore, + "cpu": rlimitCPU, + "data": rlimitData, + "fsize": rlimitFsize, + "locks": rlimitLocks, + "memlock": rlimitMemlock, + "msgqueue": rlimitMsgqueue, + "nice": rlimitNice, + "nofile": rlimitNofile, + "nproc": rlimitNproc, + "rss": rlimitRss, + "rtprio": rlimitRtprio, + "rttime": rlimitRttime, + "sigpending": rlimitSigpending, + "stack": rlimitStack, +} + +// ParseUlimit parses and returns a Ulimit from the specified string. +func ParseUlimit(val string) (*Ulimit, error) { + parts := strings.SplitN(val, "=", 2) + if len(parts) != 2 { + return nil, fmt.Errorf("invalid ulimit argument: %s", val) + } + + if _, exists := ulimitNameMapping[parts[0]]; !exists { + return nil, fmt.Errorf("invalid ulimit type: %s", parts[0]) + } + + var ( + soft int64 + hard = &soft // default to soft in case no hard was set + temp int64 + err error + ) + switch limitVals := strings.Split(parts[1], ":"); len(limitVals) { + case 2: + temp, err = strconv.ParseInt(limitVals[1], 10, 64) + if err != nil { + return nil, err + } + hard = &temp + fallthrough + case 1: + soft, err = strconv.ParseInt(limitVals[0], 10, 64) + if err != nil { + return nil, err + } + default: + return nil, fmt.Errorf("too many limit value arguments - %s, can only have up to two, `soft[:hard]`", parts[1]) + } + + if *hard != -1 { + if soft == -1 { + return nil, fmt.Errorf("ulimit soft limit must be less than or equal to hard limit: soft: -1 (unlimited), hard: %d", *hard) + } + if soft > *hard { + return nil, fmt.Errorf("ulimit soft limit must be less than or equal to hard limit: %d > %d", soft, *hard) + } + } + + return &Ulimit{Name: parts[0], Soft: soft, Hard: *hard}, nil +} + +// GetRlimit returns the RLimit corresponding to Ulimit. +func (u *Ulimit) GetRlimit() (*Rlimit, error) { + t, exists := ulimitNameMapping[u.Name] + if !exists { + return nil, fmt.Errorf("invalid ulimit name %s", u.Name) + } + + return &Rlimit{Type: t, Soft: uint64(u.Soft), Hard: uint64(u.Hard)}, nil +} + +func (u *Ulimit) String() string { + return fmt.Sprintf("%s=%d:%d", u.Name, u.Soft, u.Hard) +} diff --git a/vendor/github.com/jpillora/go-ogle-analytics/.gitignore b/vendor/github.com/jpillora/go-ogle-analytics/.gitignore new file mode 100644 index 0000000..3010792 --- /dev/null +++ b/vendor/github.com/jpillora/go-ogle-analytics/.gitignore @@ -0,0 +1 @@ +example/tracker-id.txt \ No newline at end of file diff --git a/vendor/github.com/jpillora/go-ogle-analytics/LICENSE b/vendor/github.com/jpillora/go-ogle-analytics/LICENSE new file mode 100644 index 0000000..ec9f753 --- /dev/null +++ b/vendor/github.com/jpillora/go-ogle-analytics/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright © 2015 dev@jpillora.com, Google Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/jpillora/go-ogle-analytics/README.md b/vendor/github.com/jpillora/go-ogle-analytics/README.md new file mode 100644 index 0000000..9a85f3a --- /dev/null +++ b/vendor/github.com/jpillora/go-ogle-analytics/README.md @@ -0,0 +1,81 @@ +## Go-ogle Analytics + +Track and monitor your Go programs for free with Google Analytics + +The `ga` package is essentially a Go wrapper around the [Google Analytics - Measurement Protocol](https://developers.google.com/analytics/devguides/collection/protocol/v1/reference) + +**Warning** This package is 95% generated from the [Parameter Reference](https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters) so it may contain bugs - please report them. GA allows "10 million hits per month per property" and will reject requests after that. + +### Install + +``` +go get -v github.com/jpillora/go-ogle-analytics +``` + +### API + +Create a new `client` and `Send()` a 'pageview', 'screenview', 'event', 'transaction', 'item', 'social', 'exception' or 'timing' event. + +#### http://godoc.org/github.com/jpillora/go-ogle-analytics + +### Quick Usage + +1. Log into GA and create a new property and note its Tracker ID + +1. Create a `ga-test.go` file + + ``` go + package main + + import "github.com/jpillora/go-ogle-analytics" + + func main() { + client, err := ga.NewClient("UA-XXXXXXXX-Y") + if err != nil { + panic(err) + } + + err = client.Send(ga.NewEvent("Foo", "Bar").Label("Bazz")) + if err != nil { + panic(err) + } + + println("Event fired!") + } + ``` + +1. In GA, go to Real-time > Events + +1. Run `ga-test.go` + + ``` + $ go run ga-test.go + Event fired! + ``` + +1. Watch as your event appears + + ![foo-ga](https://cloud.githubusercontent.com/assets/633843/5979585/023fc580-a8fd-11e4-803a-956610bcc2e2.png) + +#### MIT License + +Copyright © 2015 <dev@jpillora.com> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/jpillora/go-ogle-analytics/client.go b/vendor/github.com/jpillora/go-ogle-analytics/client.go new file mode 100644 index 0000000..85f9169 --- /dev/null +++ b/vendor/github.com/jpillora/go-ogle-analytics/client.go @@ -0,0 +1,76 @@ +//go:generate go run generate/protocol.go + +package ga + +import ( + "bytes" + "fmt" + "net/http" + "net/url" + "regexp" +) + +var trackingIDMatcher = regexp.MustCompile(`^UA-\d+-\d+$`) + +func NewClient(trackingID string) (*Client, error) { + if !trackingIDMatcher.MatchString(trackingID) { + return nil, fmt.Errorf("Invalid Tracking ID: %s", trackingID) + } + return &Client{ + UseTLS: true, + HttpClient: http.DefaultClient, + protocolVersion: "1", + protocolVersionSet: true, + trackingID: trackingID, + clientID: "go-ga", + clientIDSet: true, + }, nil +} + +type hitType interface { + addFields(url.Values) error +} + +func (c *Client) Send(h hitType) error { + + cpy := c.Copy() + + v := url.Values{} + + cpy.setType(h) + + err := cpy.addFields(v) + if err != nil { + return err + } + + err = h.addFields(v) + if err != nil { + return err + } + + url := "" + if cpy.UseTLS { + url = "https://www.google-analytics.com/collect" + } else { + url = "http://ssl.google-analytics.com/collect" + } + + str := v.Encode() + buf := bytes.NewBufferString(str) + + resp, err := c.HttpClient.Post(url, "application/x-www-form-urlencoded", buf) + if err != nil { + return err + } + + defer resp.Body.Close() + + if resp.StatusCode/100 != 2 { + return fmt.Errorf("Rejected by Google with code %d", resp.StatusCode) + } + + // fmt.Printf("POST %s => %d\n", str, resp.StatusCode) + + return nil +} diff --git a/vendor/github.com/jpillora/go-ogle-analytics/conv.go b/vendor/github.com/jpillora/go-ogle-analytics/conv.go new file mode 100644 index 0000000..4deeb4a --- /dev/null +++ b/vendor/github.com/jpillora/go-ogle-analytics/conv.go @@ -0,0 +1,19 @@ +package ga + +import "fmt" + +func bool2str(val bool) string { + if val { + return "1" + } else { + return "0" + } +} + +func int2str(val int64) string { + return fmt.Sprintf("%d", val) +} + +func float2str(val float64) string { + return fmt.Sprintf("%.6f", val) +} diff --git a/vendor/github.com/jpillora/go-ogle-analytics/type-client.go b/vendor/github.com/jpillora/go-ogle-analytics/type-client.go new file mode 100644 index 0000000..b914c67 --- /dev/null +++ b/vendor/github.com/jpillora/go-ogle-analytics/type-client.go @@ -0,0 +1,1228 @@ +package ga + +import ( + "net/http" + "net/url" +) + +//WARNING: This file was generated. Do not edit. + +//Client Hit Type +type Client struct { + //Use TLS when Send()ing + UseTLS bool + HttpClient *http.Client + protocolVersion string + protocolVersionSet bool + trackingID string + anonymizeIP bool + anonymizeIPSet bool + dataSource string + dataSourceSet bool + queueTime int64 + queueTimeSet bool + cacheBuster string + cacheBusterSet bool + clientID string + clientIDSet bool + userID string + userIDSet bool + sessionControl string + sessionControlSet bool + iPOverride string + iPOverrideSet bool + userAgentOverride string + userAgentOverrideSet bool + geographicalOverride string + geographicalOverrideSet bool + documentReferrer string + documentReferrerSet bool + campaignName string + campaignNameSet bool + campaignSource string + campaignSourceSet bool + campaignMedium string + campaignMediumSet bool + campaignKeyword string + campaignKeywordSet bool + campaignContent string + campaignContentSet bool + campaignID string + campaignIDSet bool + googleAdWordsID string + googleAdWordsIDSet bool + googleDisplayAdsID string + googleDisplayAdsIDSet bool + screenResolution string + screenResolutionSet bool + viewportSize string + viewportSizeSet bool + documentEncoding string + documentEncodingSet bool + screenColors string + screenColorsSet bool + userLanguage string + userLanguageSet bool + javaEnabled bool + javaEnabledSet bool + flashVersion string + flashVersionSet bool + hitType string + nonInteractionHit bool + nonInteractionHitSet bool + documentLocationURL string + documentLocationURLSet bool + documentHostName string + documentHostNameSet bool + documentPath string + documentPathSet bool + documentTitle string + documentTitleSet bool + screenName string + screenNameSet bool + linkID string + linkIDSet bool + applicationName string + applicationNameSet bool + applicationID string + applicationIDSet bool + applicationVersion string + applicationVersionSet bool + applicationInstallerID string + applicationInstallerIDSet bool + productSKU string + productSKUSet bool + productName string + productNameSet bool + productBrand string + productBrandSet bool + productCategory string + productCategorySet bool + productVariant string + productVariantSet bool + productPrice float64 + productPriceSet bool + productQuantity int64 + productQuantitySet bool + productCouponCode string + productCouponCodeSet bool + productPosition int64 + productPositionSet bool + productCustomDimension string + productCustomDimensionSet bool + productCustomMetric int64 + productCustomMetricSet bool + productAction string + productActionSet bool + transactionID string + transactionIDSet bool + affiliation string + affiliationSet bool + revenue float64 + revenueSet bool + tax float64 + taxSet bool + shipping float64 + shippingSet bool + couponCode string + couponCodeSet bool + productActionList string + productActionListSet bool + checkoutStep int64 + checkoutStepSet bool + checkoutStepOption string + checkoutStepOptionSet bool + productImpressionListName string + productImpressionListNameSet bool + productImpressionSKU string + productImpressionSKUSet bool + productImpressionName string + productImpressionNameSet bool + productImpressionBrand string + productImpressionBrandSet bool + productImpressionCategory string + productImpressionCategorySet bool + productImpressionVariant string + productImpressionVariantSet bool + productImpressionPosition int64 + productImpressionPositionSet bool + productImpressionPrice float64 + productImpressionPriceSet bool + productImpressionCustomDimension string + productImpressionCustomDimensionSet bool + productImpressionCustomMetric int64 + productImpressionCustomMetricSet bool + promotionID string + promotionIDSet bool + promotionName string + promotionNameSet bool + promotionCreative string + promotionCreativeSet bool + promotionPosition string + promotionPositionSet bool + promotionAction string + promotionActionSet bool + customDimension string + customDimensionSet bool + customMetric int64 + customMetricSet bool + experimentID string + experimentIDSet bool + experimentVariant string + experimentVariantSet bool + dimensionIndex string + dimensionIndexSet bool + listIndex string + listIndexSet bool + metricIndex string + metricIndexSet bool + productIndex string + productIndexSet bool + promoIndex string + promoIndexSet bool +} + +func (c *Client) setType(h hitType) { + switch h.(type) { + case *Event: + c.hitType = "event" + case *Exception: + c.hitType = "exception" + case *Item: + c.hitType = "item" + case *Pageview: + c.hitType = "pageview" + case *Screenview: + c.hitType = "screenview" + case *Social: + c.hitType = "social" + case *Timing: + c.hitType = "timing" + case *Transaction: + c.hitType = "transaction" + } +} + +func (h *Client) addFields(v url.Values) error { + if h.protocolVersionSet { + v.Add("v", h.protocolVersion) + } + v.Add("tid", h.trackingID) + if h.anonymizeIPSet { + v.Add("aip", bool2str(h.anonymizeIP)) + } + if h.dataSourceSet { + v.Add("ds", h.dataSource) + } + if h.queueTimeSet { + v.Add("qt", int2str(h.queueTime)) + } + if h.cacheBusterSet { + v.Add("z", h.cacheBuster) + } + if h.clientIDSet { + v.Add("cid", h.clientID) + } + if h.userIDSet { + v.Add("uid", h.userID) + } + if h.sessionControlSet { + v.Add("sc", h.sessionControl) + } + if h.iPOverrideSet { + v.Add("uip", h.iPOverride) + } + if h.userAgentOverrideSet { + v.Add("ua", h.userAgentOverride) + } + if h.geographicalOverrideSet { + v.Add("geoid", h.geographicalOverride) + } + if h.documentReferrerSet { + v.Add("dr", h.documentReferrer) + } + if h.campaignNameSet { + v.Add("cn", h.campaignName) + } + if h.campaignSourceSet { + v.Add("cs", h.campaignSource) + } + if h.campaignMediumSet { + v.Add("cm", h.campaignMedium) + } + if h.campaignKeywordSet { + v.Add("ck", h.campaignKeyword) + } + if h.campaignContentSet { + v.Add("cc", h.campaignContent) + } + if h.campaignIDSet { + v.Add("ci", h.campaignID) + } + if h.googleAdWordsIDSet { + v.Add("gclid", h.googleAdWordsID) + } + if h.googleDisplayAdsIDSet { + v.Add("dclid", h.googleDisplayAdsID) + } + if h.screenResolutionSet { + v.Add("sr", h.screenResolution) + } + if h.viewportSizeSet { + v.Add("vp", h.viewportSize) + } + if h.documentEncodingSet { + v.Add("de", h.documentEncoding) + } + if h.screenColorsSet { + v.Add("sd", h.screenColors) + } + if h.userLanguageSet { + v.Add("ul", h.userLanguage) + } + if h.javaEnabledSet { + v.Add("je", bool2str(h.javaEnabled)) + } + if h.flashVersionSet { + v.Add("fl", h.flashVersion) + } + v.Add("t", h.hitType) + if h.nonInteractionHitSet { + v.Add("ni", bool2str(h.nonInteractionHit)) + } + if h.documentLocationURLSet { + v.Add("dl", h.documentLocationURL) + } + if h.documentHostNameSet { + v.Add("dh", h.documentHostName) + } + if h.documentPathSet { + v.Add("dp", h.documentPath) + } + if h.documentTitleSet { + v.Add("dt", h.documentTitle) + } + if h.screenNameSet { + v.Add("cd", h.screenName) + } + if h.linkIDSet { + v.Add("linkid", h.linkID) + } + if h.applicationNameSet { + v.Add("an", h.applicationName) + } + if h.applicationIDSet { + v.Add("aid", h.applicationID) + } + if h.applicationVersionSet { + v.Add("av", h.applicationVersion) + } + if h.applicationInstallerIDSet { + v.Add("aiid", h.applicationInstallerID) + } + if h.productSKUSet { + v.Add("pr"+h.productIndex+"id", h.productSKU) + } + if h.productNameSet { + v.Add("pr"+h.productIndex+"nm", h.productName) + } + if h.productBrandSet { + v.Add("pr"+h.productIndex+"br", h.productBrand) + } + if h.productCategorySet { + v.Add("pr"+h.productIndex+"ca", h.productCategory) + } + if h.productVariantSet { + v.Add("pr"+h.productIndex+"va", h.productVariant) + } + if h.productPriceSet { + v.Add("pr"+h.productIndex+"pr", float2str(h.productPrice)) + } + if h.productQuantitySet { + v.Add("pr"+h.productIndex+"qt", int2str(h.productQuantity)) + } + if h.productCouponCodeSet { + v.Add("pr"+h.productIndex+"cc", h.productCouponCode) + } + if h.productPositionSet { + v.Add("pr"+h.productIndex+"ps", int2str(h.productPosition)) + } + if h.productCustomDimensionSet { + v.Add("pr"+h.productIndex+"cd"+h.dimensionIndex+"", h.productCustomDimension) + } + if h.productCustomMetricSet { + v.Add("pr"+h.productIndex+"cm"+h.metricIndex+"", int2str(h.productCustomMetric)) + } + if h.productActionSet { + v.Add("pa", h.productAction) + } + if h.transactionIDSet { + v.Add("ti", h.transactionID) + } + if h.affiliationSet { + v.Add("ta", h.affiliation) + } + if h.revenueSet { + v.Add("tr", float2str(h.revenue)) + } + if h.taxSet { + v.Add("tt", float2str(h.tax)) + } + if h.shippingSet { + v.Add("ts", float2str(h.shipping)) + } + if h.couponCodeSet { + v.Add("tcc", h.couponCode) + } + if h.productActionListSet { + v.Add("pal", h.productActionList) + } + if h.checkoutStepSet { + v.Add("cos", int2str(h.checkoutStep)) + } + if h.checkoutStepOptionSet { + v.Add("col", h.checkoutStepOption) + } + if h.productImpressionListNameSet { + v.Add("il"+h.listIndex+"nm", h.productImpressionListName) + } + if h.productImpressionSKUSet { + v.Add("il"+h.listIndex+"pi"+h.productIndex+"id", h.productImpressionSKU) + } + if h.productImpressionNameSet { + v.Add("il"+h.listIndex+"pi"+h.productIndex+"nm", h.productImpressionName) + } + if h.productImpressionBrandSet { + v.Add("il"+h.listIndex+"pi"+h.productIndex+"br", h.productImpressionBrand) + } + if h.productImpressionCategorySet { + v.Add("il"+h.listIndex+"pi"+h.productIndex+"ca", h.productImpressionCategory) + } + if h.productImpressionVariantSet { + v.Add("il"+h.listIndex+"pi"+h.productIndex+"va", h.productImpressionVariant) + } + if h.productImpressionPositionSet { + v.Add("il"+h.listIndex+"pi"+h.productIndex+"ps", int2str(h.productImpressionPosition)) + } + if h.productImpressionPriceSet { + v.Add("il"+h.listIndex+"pi"+h.productIndex+"pr", float2str(h.productImpressionPrice)) + } + if h.productImpressionCustomDimensionSet { + v.Add("il"+h.listIndex+"pi"+h.productIndex+"cd"+h.dimensionIndex+"", h.productImpressionCustomDimension) + } + if h.productImpressionCustomMetricSet { + v.Add("il"+h.listIndex+"pi"+h.productIndex+"cm"+h.metricIndex+"", int2str(h.productImpressionCustomMetric)) + } + if h.promotionIDSet { + v.Add("promo"+h.promoIndex+"id", h.promotionID) + } + if h.promotionNameSet { + v.Add("promo"+h.promoIndex+"nm", h.promotionName) + } + if h.promotionCreativeSet { + v.Add("promo"+h.promoIndex+"cr", h.promotionCreative) + } + if h.promotionPositionSet { + v.Add("promo"+h.promoIndex+"ps", h.promotionPosition) + } + if h.promotionActionSet { + v.Add("promoa", h.promotionAction) + } + if h.customDimensionSet { + v.Add("cd"+h.dimensionIndex+"", h.customDimension) + } + if h.customMetricSet { + v.Add("cm"+h.metricIndex+"", int2str(h.customMetric)) + } + if h.experimentIDSet { + v.Add("xid", h.experimentID) + } + if h.experimentVariantSet { + v.Add("xvar", h.experimentVariant) + } + return nil +} + +// The Protocol version. The current value is '1'. This will +// only change when there are changes made that are not backwards +// compatible. +func (h *Client) ProtocolVersion(protocolVersion string) *Client { + h.protocolVersion = protocolVersion + h.protocolVersionSet = true + return h +} + +// When present, the IP address of the sender will be anonymized. +// For example, the IP will be anonymized if any of the following +// parameters are present in the payload: &aip=, &aip=0, or +// &aip=1 +func (h *Client) AnonymizeIP(anonymizeIP bool) *Client { + h.anonymizeIP = anonymizeIP + h.anonymizeIPSet = true + return h +} + +// Indicates the data source of the hit. Hits sent from analytics.js +// will have data source set to 'web'; hits sent from one of +// the mobile SDKs will have data source set to 'app'. +func (h *Client) DataSource(dataSource string) *Client { + h.dataSource = dataSource + h.dataSourceSet = true + return h +} + +// Used to collect offline / latent hits. The value represents +// the time delta (in milliseconds) between when the hit being +// reported occurred and the time the hit was sent. The value +// must be greater than or equal to 0. Values greater than +// four hours may lead to hits not being processed. +func (h *Client) QueueTime(queueTime int64) *Client { + h.queueTime = queueTime + h.queueTimeSet = true + return h +} + +// Used to send a random number in GET requests to ensure browsers +// and proxies don't cache hits. It should be sent as the final +// parameter of the request since we've seen some 3rd party +// internet filtering software add additional parameters to +// HTTP requests incorrectly. This value is not used in reporting. +func (h *Client) CacheBuster(cacheBuster string) *Client { + h.cacheBuster = cacheBuster + h.cacheBusterSet = true + return h +} + +// This anonymously identifies a particular user, device, or +// browser instance. For the web, this is generally stored +// as a first-party cookie with a two-year expiration. For +// mobile apps, this is randomly generated for each particular +// instance of an application install. The value of this field +// should be a random UUID (version 4) as described in http://www.ietf.org/rfc/rfc4122.txt +func (h *Client) ClientID(clientID string) *Client { + h.clientID = clientID + h.clientIDSet = true + return h +} + +// This is intended to be a known identifier for a user provided +// by the site owner/tracking library user. It may not itself +// be PII (personally identifiable information). The value +// should never be persisted in GA cookies or other Analytics +// provided storage. +func (h *Client) UserID(userID string) *Client { + h.userID = userID + h.userIDSet = true + return h +} + +// Used to control the session duration. A value of 'start' +// forces a new session to start with this hit and 'end' forces +// the current session to end with this hit. All other values +// are ignored. +func (h *Client) SessionControl(sessionControl string) *Client { + h.sessionControl = sessionControl + h.sessionControlSet = true + return h +} + +// The IP address of the user. This should be a valid IP address +// in IPv4 or IPv6 format. It will always be anonymized just +// as though &aip (anonymize IP) had been used. +func (h *Client) IPOverride(iPOverride string) *Client { + h.iPOverride = iPOverride + h.iPOverrideSet = true + return h +} + +// The User Agent of the browser. Note that Google has libraries +// to identify real user agents. Hand crafting your own agent +// could break at any time. +func (h *Client) UserAgentOverride(userAgentOverride string) *Client { + h.userAgentOverride = userAgentOverride + h.userAgentOverrideSet = true + return h +} + +// The geographical location of the user. The geographical +// ID should be a two letter country code or a criteria ID +// representing a city or region (see http://developers.google.com/analytics/devguides/collection/protocol/v1/geoid). +// This parameter takes precedent over any location derived +// from IP address, including the IP Override parameter. An +// invalid code will result in geographical dimensions to be +// set to '(not set)'. +func (h *Client) GeographicalOverride(geographicalOverride string) *Client { + h.geographicalOverride = geographicalOverride + h.geographicalOverrideSet = true + return h +} + +// Specifies which referral source brought traffic to a website. +// This value is also used to compute the traffic source. The +// format of this value is a URL. +func (h *Client) DocumentReferrer(documentReferrer string) *Client { + h.documentReferrer = documentReferrer + h.documentReferrerSet = true + return h +} + +// Specifies the campaign name. +func (h *Client) CampaignName(campaignName string) *Client { + h.campaignName = campaignName + h.campaignNameSet = true + return h +} + +// Specifies the campaign source. +func (h *Client) CampaignSource(campaignSource string) *Client { + h.campaignSource = campaignSource + h.campaignSourceSet = true + return h +} + +// Specifies the campaign medium. +func (h *Client) CampaignMedium(campaignMedium string) *Client { + h.campaignMedium = campaignMedium + h.campaignMediumSet = true + return h +} + +// Specifies the campaign keyword. +func (h *Client) CampaignKeyword(campaignKeyword string) *Client { + h.campaignKeyword = campaignKeyword + h.campaignKeywordSet = true + return h +} + +// Specifies the campaign content. +func (h *Client) CampaignContent(campaignContent string) *Client { + h.campaignContent = campaignContent + h.campaignContentSet = true + return h +} + +// Specifies the campaign ID. +func (h *Client) CampaignID(campaignID string) *Client { + h.campaignID = campaignID + h.campaignIDSet = true + return h +} + +// Specifies the Google AdWords Id. +func (h *Client) GoogleAdWordsID(googleAdWordsID string) *Client { + h.googleAdWordsID = googleAdWordsID + h.googleAdWordsIDSet = true + return h +} + +// Specifies the Google Display Ads Id. +func (h *Client) GoogleDisplayAdsID(googleDisplayAdsID string) *Client { + h.googleDisplayAdsID = googleDisplayAdsID + h.googleDisplayAdsIDSet = true + return h +} + +// Specifies the screen resolution. +func (h *Client) ScreenResolution(screenResolution string) *Client { + h.screenResolution = screenResolution + h.screenResolutionSet = true + return h +} + +// Specifies the viewable area of the browser / device. +func (h *Client) ViewportSize(viewportSize string) *Client { + h.viewportSize = viewportSize + h.viewportSizeSet = true + return h +} + +// Specifies the character set used to encode the page / document. +func (h *Client) DocumentEncoding(documentEncoding string) *Client { + h.documentEncoding = documentEncoding + h.documentEncodingSet = true + return h +} + +// Specifies the screen color depth. +func (h *Client) ScreenColors(screenColors string) *Client { + h.screenColors = screenColors + h.screenColorsSet = true + return h +} + +// Specifies the language. +func (h *Client) UserLanguage(userLanguage string) *Client { + h.userLanguage = userLanguage + h.userLanguageSet = true + return h +} + +// Specifies whether Java was enabled. +func (h *Client) JavaEnabled(javaEnabled bool) *Client { + h.javaEnabled = javaEnabled + h.javaEnabledSet = true + return h +} + +// Specifies the flash version. +func (h *Client) FlashVersion(flashVersion string) *Client { + h.flashVersion = flashVersion + h.flashVersionSet = true + return h +} + +// Specifies that a hit be considered non-interactive. +func (h *Client) NonInteractionHit(nonInteractionHit bool) *Client { + h.nonInteractionHit = nonInteractionHit + h.nonInteractionHitSet = true + return h +} + +// Use this parameter to send the full URL (document location) +// of the page on which content resides. You can use the &dh +// and &dp parameters to override the hostname and path + query +// portions of the document location, accordingly. The JavaScript +// clients determine this parameter using the concatenation +// of the document.location.origin + document.location.pathname +// + document.location.search browser parameters. Be sure to +// remove any user authentication or other private information +// from the URL if present. For 'pageview' hits, either &dl +// or both &dh and &dp have to be specified for the hit to +// be valid. +func (h *Client) DocumentLocationURL(documentLocationURL string) *Client { + h.documentLocationURL = documentLocationURL + h.documentLocationURLSet = true + return h +} + +// Specifies the hostname from which content was hosted. +func (h *Client) DocumentHostName(documentHostName string) *Client { + h.documentHostName = documentHostName + h.documentHostNameSet = true + return h +} + +// The path portion of the page URL. Should begin with '/'. +// For 'pageview' hits, either &dl or both &dh and &dp have +// to be specified for the hit to be valid. +func (h *Client) DocumentPath(documentPath string) *Client { + h.documentPath = documentPath + h.documentPathSet = true + return h +} + +// The title of the page / document. +func (h *Client) DocumentTitle(documentTitle string) *Client { + h.documentTitle = documentTitle + h.documentTitleSet = true + return h +} + +// If not specified, this will default to the unique URL of +// the page by either using the &dl parameter as-is or assembling +// it from &dh and &dp. App tracking makes use of this for +// the 'Screen Name' of the screenview hit. +func (h *Client) ScreenName(screenName string) *Client { + h.screenName = screenName + h.screenNameSet = true + return h +} + +// The ID of a clicked DOM element, used to disambiguate multiple +// links to the same URL in In-Page Analytics reports when +// Enhanced Link Attribution is enabled for the property. +func (h *Client) LinkID(linkID string) *Client { + h.linkID = linkID + h.linkIDSet = true + return h +} + +// Specifies the application name. +func (h *Client) ApplicationName(applicationName string) *Client { + h.applicationName = applicationName + h.applicationNameSet = true + return h +} + +// Application identifier. +func (h *Client) ApplicationID(applicationID string) *Client { + h.applicationID = applicationID + h.applicationIDSet = true + return h +} + +// Specifies the application version. +func (h *Client) ApplicationVersion(applicationVersion string) *Client { + h.applicationVersion = applicationVersion + h.applicationVersionSet = true + return h +} + +// Application installer identifier. +func (h *Client) ApplicationInstallerID(applicationInstallerID string) *Client { + h.applicationInstallerID = applicationInstallerID + h.applicationInstallerIDSet = true + return h +} + +// The SKU of the product. Product index must be a positive +// integer between 1 and 200, inclusive. For analytics.js the +// Enhanced Ecommerce plugin must be installed before using +// this field. +func (h *Client) ProductSKU(productSKU string) *Client { + h.productSKU = productSKU + h.productSKUSet = true + return h +} + +// The name of the product. Product index must be a positive +// integer between 1 and 200, inclusive. For analytics.js the +// Enhanced Ecommerce plugin must be installed before using +// this field. +func (h *Client) ProductName(productName string) *Client { + h.productName = productName + h.productNameSet = true + return h +} + +// The brand associated with the product. Product index must +// be a positive integer between 1 and 200, inclusive. For +// analytics.js the Enhanced Ecommerce plugin must be installed +// before using this field. +func (h *Client) ProductBrand(productBrand string) *Client { + h.productBrand = productBrand + h.productBrandSet = true + return h +} + +// The category to which the product belongs. Product index +// must be a positive integer between 1 and 200, inclusive. +// The product category parameter can be hierarchical. Use +// / as a delimiter to specify up to 5-levels of hierarchy. +// For analytics.js the Enhanced Ecommerce plugin must be installed +// before using this field. +func (h *Client) ProductCategory(productCategory string) *Client { + h.productCategory = productCategory + h.productCategorySet = true + return h +} + +// The variant of the product. Product index must be a positive +// integer between 1 and 200, inclusive. For analytics.js the +// Enhanced Ecommerce plugin must be installed before using +// this field. +func (h *Client) ProductVariant(productVariant string) *Client { + h.productVariant = productVariant + h.productVariantSet = true + return h +} + +// The price of a product. Product index must be a positive +// integer between 1 and 200, inclusive. For analytics.js the +// Enhanced Ecommerce plugin must be installed before using +// this field. +func (h *Client) ProductPrice(productPrice float64) *Client { + h.productPrice = productPrice + h.productPriceSet = true + return h +} + +// The quantity of a product. Product index must be a positive +// integer between 1 and 200, inclusive. For analytics.js the +// Enhanced Ecommerce plugin must be installed before using +// this field. +func (h *Client) ProductQuantity(productQuantity int64) *Client { + h.productQuantity = productQuantity + h.productQuantitySet = true + return h +} + +// The coupon code associated with a product. Product index +// must be a positive integer between 1 and 200, inclusive. +// For analytics.js the Enhanced Ecommerce plugin must be installed +// before using this field. +func (h *Client) ProductCouponCode(productCouponCode string) *Client { + h.productCouponCode = productCouponCode + h.productCouponCodeSet = true + return h +} + +// The product's position in a list or collection. Product +// index must be a positive integer between 1 and 200, inclusive. +// For analytics.js the Enhanced Ecommerce plugin must be installed +// before using this field. +func (h *Client) ProductPosition(productPosition int64) *Client { + h.productPosition = productPosition + h.productPositionSet = true + return h +} + +// A product-level custom dimension where dimension index is +// a positive integer between 1 and 200, inclusive. Product +// index must be a positive integer between 1 and 200, inclusive. +// For analytics.js the Enhanced Ecommerce plugin must be installed +// before using this field. +func (h *Client) ProductCustomDimension(productCustomDimension string) *Client { + h.productCustomDimension = productCustomDimension + h.productCustomDimensionSet = true + return h +} + +// A product-level custom metric where metric index is a positive +// integer between 1 and 200, inclusive. Product index must +// be a positive integer between 1 and 200, inclusive. For +// analytics.js the Enhanced Ecommerce plugin must be installed +// before using this field. +func (h *Client) ProductCustomMetric(productCustomMetric int64) *Client { + h.productCustomMetric = productCustomMetric + h.productCustomMetricSet = true + return h +} + +// The role of the products included in a hit. If a product +// action is not specified, all product definitions included +// with the hit will be ignored. Must be one of: detail, click, +// add, remove, checkout, checkout_option, purchase, refund. +// For analytics.js the Enhanced Ecommerce plugin must be installed +// before using this field. +func (h *Client) ProductAction(productAction string) *Client { + h.productAction = productAction + h.productActionSet = true + return h +} + +// The transaction ID. This is an additional parameter that +// can be sent when Product Action is set to 'purchase' or +// 'refund'. For analytics.js the Enhanced Ecommerce plugin +// must be installed before using this field. +func (h *Client) TransactionID(transactionID string) *Client { + h.transactionID = transactionID + h.transactionIDSet = true + return h +} + +// The store or affiliation from which this transaction occurred. +// This is an additional parameter that can be sent when Product +// Action is set to 'purchase' or 'refund'. For analytics.js +// the Enhanced Ecommerce plugin must be installed before using +// this field. +func (h *Client) Affiliation(affiliation string) *Client { + h.affiliation = affiliation + h.affiliationSet = true + return h +} + +// The total value of the transaction, including tax and shipping. +// If not sent, this value will be automatically calculated +// using the product quantity and price fields of all products +// in the same hit. This is an additional parameter that can +// be sent when Product Action is set to 'purchase' or 'refund'. +// For analytics.js the Enhanced Ecommerce plugin must be installed +// before using this field. +func (h *Client) Revenue(revenue float64) *Client { + h.revenue = revenue + h.revenueSet = true + return h +} + +// The total tax associated with the transaction. This is an +// additional parameter that can be sent when Product Action +// is set to 'purchase' or 'refund'. For analytics.js the Enhanced +// Ecommerce plugin must be installed before using this field. +func (h *Client) Tax(tax float64) *Client { + h.tax = tax + h.taxSet = true + return h +} + +// The shipping cost associated with the transaction. This +// is an additional parameter that can be sent when Product +// Action is set to 'purchase' or 'refund'. For analytics.js +// the Enhanced Ecommerce plugin must be installed before using +// this field. +func (h *Client) Shipping(shipping float64) *Client { + h.shipping = shipping + h.shippingSet = true + return h +} + +// The transaction coupon redeemed with the transaction. This +// is an additional parameter that can be sent when Product +// Action is set to 'purchase' or 'refund'. For analytics.js +// the Enhanced Ecommerce plugin must be installed before using +// this field. +func (h *Client) CouponCode(couponCode string) *Client { + h.couponCode = couponCode + h.couponCodeSet = true + return h +} + +// The list or collection from which a product action occurred. +// This is an additional parameter that can be sent when Product +// Action is set to 'detail' or 'click'. For analytics.js the +// Enhanced Ecommerce plugin must be installed before using +// this field. +func (h *Client) ProductActionList(productActionList string) *Client { + h.productActionList = productActionList + h.productActionListSet = true + return h +} + +// The step number in a checkout funnel. This is an additional +// parameter that can be sent when Product Action is set to +// 'checkout'. For analytics.js the Enhanced Ecommerce plugin +// must be installed before using this field. +func (h *Client) CheckoutStep(checkoutStep int64) *Client { + h.checkoutStep = checkoutStep + h.checkoutStepSet = true + return h +} + +// Additional information about a checkout step. This is an +// additional parameter that can be sent when Product Action +// is set to 'checkout'. For analytics.js the Enhanced Ecommerce +// plugin must be installed before using this field. +func (h *Client) CheckoutStepOption(checkoutStepOption string) *Client { + h.checkoutStepOption = checkoutStepOption + h.checkoutStepOptionSet = true + return h +} + +// The list or collection to which a product belongs. Impression +// List index must be a positive integer between 1 and 200, +// inclusive. For analytics.js the Enhanced Ecommerce plugin +// must be installed before using this field. +func (h *Client) ProductImpressionListName(productImpressionListName string) *Client { + h.productImpressionListName = productImpressionListName + h.productImpressionListNameSet = true + return h +} + +// The product ID or SKU. Impression List index must be a positive +// integer between 1 and 200, inclusive. Product index must +// be a positive integer between 1 and 200, inclusive. For +// analytics.js the Enhanced Ecommerce plugin must be installed +// before using this field. +func (h *Client) ProductImpressionSKU(productImpressionSKU string) *Client { + h.productImpressionSKU = productImpressionSKU + h.productImpressionSKUSet = true + return h +} + +// The name of the product. Impression List index must be a +// positive integer between 1 and 200, inclusive. Product index +// must be a positive integer between 1 and 200, inclusive. +// For analytics.js the Enhanced Ecommerce plugin must be installed +// before using this field. +func (h *Client) ProductImpressionName(productImpressionName string) *Client { + h.productImpressionName = productImpressionName + h.productImpressionNameSet = true + return h +} + +// The brand associated with the product. Impression List index +// must be a positive integer between 1 and 200, inclusive. +// Product index must be a positive integer between 1 and 200, +// inclusive. For analytics.js the Enhanced Ecommerce plugin +// must be installed before using this field. +func (h *Client) ProductImpressionBrand(productImpressionBrand string) *Client { + h.productImpressionBrand = productImpressionBrand + h.productImpressionBrandSet = true + return h +} + +// The category to which the product belongs. Impression List +// index must be a positive integer between 1 and 200, inclusive. +// Product index must be a positive integer between 1 and 200, +// inclusive. For analytics.js the Enhanced Ecommerce plugin +// must be installed before using this field. +func (h *Client) ProductImpressionCategory(productImpressionCategory string) *Client { + h.productImpressionCategory = productImpressionCategory + h.productImpressionCategorySet = true + return h +} + +// The variant of the product. Impression List index must be +// a positive integer between 1 and 200, inclusive. Product +// index must be a positive integer between 1 and 200, inclusive. +// For analytics.js the Enhanced Ecommerce plugin must be installed +// before using this field. +func (h *Client) ProductImpressionVariant(productImpressionVariant string) *Client { + h.productImpressionVariant = productImpressionVariant + h.productImpressionVariantSet = true + return h +} + +// The product's position in a list or collection. Impression +// List index must be a positive integer between 1 and 200, +// inclusive. Product index must be a positive integer between +// 1 and 200, inclusive. For analytics.js the Enhanced Ecommerce +// plugin must be installed before using this field. +func (h *Client) ProductImpressionPosition(productImpressionPosition int64) *Client { + h.productImpressionPosition = productImpressionPosition + h.productImpressionPositionSet = true + return h +} + +// The price of a product. Impression List index must be a +// positive integer between 1 and 200, inclusive. Product index +// must be a positive integer between 1 and 200, inclusive. +// For analytics.js the Enhanced Ecommerce plugin must be installed +// before using this field. +func (h *Client) ProductImpressionPrice(productImpressionPrice float64) *Client { + h.productImpressionPrice = productImpressionPrice + h.productImpressionPriceSet = true + return h +} + +// A product-level custom dimension where dimension index is +// a positive integer between 1 and 200, inclusive. Impression +// List index must be a positive integer between 1 and 200, +// inclusive. Product index must be a positive integer between +// 1 and 200, inclusive. For analytics.js the Enhanced Ecommerce +// plugin must be installed before using this field. +func (h *Client) ProductImpressionCustomDimension(productImpressionCustomDimension string) *Client { + h.productImpressionCustomDimension = productImpressionCustomDimension + h.productImpressionCustomDimensionSet = true + return h +} + +// A product-level custom metric where metric index is a positive +// integer between 1 and 200, inclusive. Impression List index +// must be a positive integer between 1 and 200, inclusive. +// Product index must be a positive integer between 1 and 200, +// inclusive. For analytics.js the Enhanced Ecommerce plugin +// must be installed before using this field. +func (h *Client) ProductImpressionCustomMetric(productImpressionCustomMetric int64) *Client { + h.productImpressionCustomMetric = productImpressionCustomMetric + h.productImpressionCustomMetricSet = true + return h +} + +// The promotion ID. Promotion index must be a positive integer +// between 1 and 200, inclusive. For analytics.js the Enhanced +// Ecommerce plugin must be installed before using this field. +func (h *Client) PromotionID(promotionID string) *Client { + h.promotionID = promotionID + h.promotionIDSet = true + return h +} + +// The name of the promotion. Promotion index must be a positive +// integer between 1 and 200, inclusive. For analytics.js the +// Enhanced Ecommerce plugin must be installed before using +// this field. +func (h *Client) PromotionName(promotionName string) *Client { + h.promotionName = promotionName + h.promotionNameSet = true + return h +} + +// The creative associated with the promotion. Promotion index +// must be a positive integer between 1 and 200, inclusive. +// For analytics.js the Enhanced Ecommerce plugin must be installed +// before using this field. +func (h *Client) PromotionCreative(promotionCreative string) *Client { + h.promotionCreative = promotionCreative + h.promotionCreativeSet = true + return h +} + +// The position of the creative. Promotion index must be a +// positive integer between 1 and 200, inclusive. For analytics.js +// the Enhanced Ecommerce plugin must be installed before using +// this field. +func (h *Client) PromotionPosition(promotionPosition string) *Client { + h.promotionPosition = promotionPosition + h.promotionPositionSet = true + return h +} + +// Specifies the role of the promotions included in a hit. +// If a promotion action is not specified, the default promotion +// action, 'view', is assumed. To measure a user click on a +// promotion set this to 'promo_click'. For analytics.js the +// Enhanced Ecommerce plugin must be installed before using +// this field. +func (h *Client) PromotionAction(promotionAction string) *Client { + h.promotionAction = promotionAction + h.promotionActionSet = true + return h +} + +// Each custom dimension has an associated index. There is +// a maximum of 20 custom dimensions (200 for Premium accounts). +// The dimension index must be a positive integer between 1 +// and 200, inclusive. +func (h *Client) CustomDimension(customDimension string) *Client { + h.customDimension = customDimension + h.customDimensionSet = true + return h +} + +// Each custom metric has an associated index. There is a maximum +// of 20 custom metrics (200 for Premium accounts). The metric +// index must be a positive integer between 1 and 200, inclusive. +func (h *Client) CustomMetric(customMetric int64) *Client { + h.customMetric = customMetric + h.customMetricSet = true + return h +} + +// This parameter specifies that this user has been exposed +// to an experiment with the given ID. It should be sent in +// conjunction with the Experiment Variant parameter. +func (h *Client) ExperimentID(experimentID string) *Client { + h.experimentID = experimentID + h.experimentIDSet = true + return h +} + +// This parameter specifies that this user has been exposed +// to a particular variation of an experiment. It should be +// sent in conjunction with the Experiment ID parameter. +func (h *Client) ExperimentVariant(experimentVariant string) *Client { + h.experimentVariant = experimentVariant + h.experimentVariantSet = true + return h +} + +// DimensionIndex is required by other properties +func (h *Client) DimensionIndex(dimensionIndex string) *Client { + h.dimensionIndex = dimensionIndex + h.dimensionIndexSet = true + return h +} + +// ListIndex is required by other properties +func (h *Client) ListIndex(listIndex string) *Client { + h.listIndex = listIndex + h.listIndexSet = true + return h +} + +// MetricIndex is required by other properties +func (h *Client) MetricIndex(metricIndex string) *Client { + h.metricIndex = metricIndex + h.metricIndexSet = true + return h +} + +// ProductIndex is required by other properties +func (h *Client) ProductIndex(productIndex string) *Client { + h.productIndex = productIndex + h.productIndexSet = true + return h +} + +// PromoIndex is required by other properties +func (h *Client) PromoIndex(promoIndex string) *Client { + h.promoIndex = promoIndex + h.promoIndexSet = true + return h +} + +func (h *Client) Copy() *Client { + c := *h + return &c +} diff --git a/vendor/github.com/jpillora/go-ogle-analytics/type-event.go b/vendor/github.com/jpillora/go-ogle-analytics/type-event.go new file mode 100644 index 0000000..b27c368 --- /dev/null +++ b/vendor/github.com/jpillora/go-ogle-analytics/type-event.go @@ -0,0 +1,58 @@ +package ga + +import "net/url" + +//WARNING: This file was generated. Do not edit. + +//Event Hit Type +type Event struct { + category string + action string + label string + labelSet bool + value int64 + valueSet bool +} + +// NewEvent creates a new Event Hit Type. +// Specifies the event category. +// Specifies the event action. + +func NewEvent(category string, action string) *Event { + h := &Event{ + category: category, + action: action, + } + return h +} + +func (h *Event) addFields(v url.Values) error { + v.Add("ec", h.category) + v.Add("ea", h.action) + if h.labelSet { + v.Add("el", h.label) + } + if h.valueSet { + v.Add("ev", int2str(h.value)) + } + return nil +} + +// Specifies the event label. +func (h *Event) Label(label string) *Event { + h.label = label + h.labelSet = true + return h +} + +// Specifies the event value. Values must be non-negative. +func (h *Event) Value(value int64) *Event { + h.value = value + h.valueSet = true + return h +} + +func (h *Event) Copy() *Event { + c := *h + return &c +} diff --git a/vendor/github.com/jpillora/go-ogle-analytics/type-exception.go b/vendor/github.com/jpillora/go-ogle-analytics/type-exception.go new file mode 100644 index 0000000..f5dd258 --- /dev/null +++ b/vendor/github.com/jpillora/go-ogle-analytics/type-exception.go @@ -0,0 +1,49 @@ +package ga + +import "net/url" + +//WARNING: This file was generated. Do not edit. + +//Exception Hit Type +type Exception struct { + description string + descriptionSet bool + isExceptionFatal bool + isExceptionFatalSet bool +} + +// NewException creates a new Exception Hit Type. + +func NewException() *Exception { + h := &Exception{} + return h +} + +func (h *Exception) addFields(v url.Values) error { + if h.descriptionSet { + v.Add("exd", h.description) + } + if h.isExceptionFatalSet { + v.Add("exf", bool2str(h.isExceptionFatal)) + } + return nil +} + +// Specifies the description of an exception. +func (h *Exception) Description(description string) *Exception { + h.description = description + h.descriptionSet = true + return h +} + +// Specifies whether the exception was fatal. +func (h *Exception) IsExceptionFatal(isExceptionFatal bool) *Exception { + h.isExceptionFatal = isExceptionFatal + h.isExceptionFatalSet = true + return h +} + +func (h *Exception) Copy() *Exception { + c := *h + return &c +} diff --git a/vendor/github.com/jpillora/go-ogle-analytics/type-item.go b/vendor/github.com/jpillora/go-ogle-analytics/type-item.go new file mode 100644 index 0000000..9675c71 --- /dev/null +++ b/vendor/github.com/jpillora/go-ogle-analytics/type-item.go @@ -0,0 +1,98 @@ +package ga + +import "net/url" + +//WARNING: This file was generated. Do not edit. + +//Item Hit Type +type Item struct { + iD string + name string + price float64 + priceSet bool + quantity int64 + quantitySet bool + code string + codeSet bool + category string + categorySet bool + currencyCode string + currencyCodeSet bool +} + +// NewItem creates a new Item Hit Type. +// A unique identifier for the transaction. This value should +// be the same for both the Transaction hit and Items hits +// associated to the particular transaction. +// Specifies the item name. + +func NewItem(iD string, name string) *Item { + h := &Item{ + iD: iD, + name: name, + } + return h +} + +func (h *Item) addFields(v url.Values) error { + v.Add("ti", h.iD) + v.Add("in", h.name) + if h.priceSet { + v.Add("ip", float2str(h.price)) + } + if h.quantitySet { + v.Add("iq", int2str(h.quantity)) + } + if h.codeSet { + v.Add("ic", h.code) + } + if h.categorySet { + v.Add("iv", h.category) + } + if h.currencyCodeSet { + v.Add("cu", h.currencyCode) + } + return nil +} + +// Specifies the price for a single item / unit. +func (h *Item) Price(price float64) *Item { + h.price = price + h.priceSet = true + return h +} + +// Specifies the number of items purchased. +func (h *Item) Quantity(quantity int64) *Item { + h.quantity = quantity + h.quantitySet = true + return h +} + +// Specifies the SKU or item code. +func (h *Item) Code(code string) *Item { + h.code = code + h.codeSet = true + return h +} + +// Specifies the category that the item belongs to. +func (h *Item) Category(category string) *Item { + h.category = category + h.categorySet = true + return h +} + +// When present indicates the local currency for all transaction +// currency values. Value should be a valid ISO 4217 currency +// code. +func (h *Item) CurrencyCode(currencyCode string) *Item { + h.currencyCode = currencyCode + h.currencyCodeSet = true + return h +} + +func (h *Item) Copy() *Item { + c := *h + return &c +} diff --git a/vendor/github.com/jpillora/go-ogle-analytics/type-pageview.go b/vendor/github.com/jpillora/go-ogle-analytics/type-pageview.go new file mode 100644 index 0000000..bc8bc54 --- /dev/null +++ b/vendor/github.com/jpillora/go-ogle-analytics/type-pageview.go @@ -0,0 +1,24 @@ +package ga + +import "net/url" + +//WARNING: This file was generated. Do not edit. + +//Pageview Hit Type +type Pageview struct { +} + +// NewPageview creates a new Pageview Hit Type. +func NewPageview() *Pageview { + h := &Pageview{} + return h +} + +func (h *Pageview) addFields(v url.Values) error { + return nil +} + +func (h *Pageview) Copy() *Pageview { + c := *h + return &c +} diff --git a/vendor/github.com/jpillora/go-ogle-analytics/type-screenview.go b/vendor/github.com/jpillora/go-ogle-analytics/type-screenview.go new file mode 100644 index 0000000..859a16e --- /dev/null +++ b/vendor/github.com/jpillora/go-ogle-analytics/type-screenview.go @@ -0,0 +1,24 @@ +package ga + +import "net/url" + +//WARNING: This file was generated. Do not edit. + +//Screenview Hit Type +type Screenview struct { +} + +// NewScreenview creates a new Screenview Hit Type. +func NewScreenview() *Screenview { + h := &Screenview{} + return h +} + +func (h *Screenview) addFields(v url.Values) error { + return nil +} + +func (h *Screenview) Copy() *Screenview { + c := *h + return &c +} diff --git a/vendor/github.com/jpillora/go-ogle-analytics/type-social.go b/vendor/github.com/jpillora/go-ogle-analytics/type-social.go new file mode 100644 index 0000000..3f8cb34 --- /dev/null +++ b/vendor/github.com/jpillora/go-ogle-analytics/type-social.go @@ -0,0 +1,41 @@ +package ga + +import "net/url" + +//WARNING: This file was generated. Do not edit. + +//Social Hit Type +type Social struct { + network string + action string + actionTarget string +} + +// NewSocial creates a new Social Hit Type. +// Specifies the social network, for example Facebook or Google +// Plus. +// Specifies the social interaction action. For example on +// Google Plus when a user clicks the +1 button, the social +// action is 'plus'. +// Specifies the target of a social interaction. This value +// is typically a URL but can be any text. +func NewSocial(network string, action string, actionTarget string) *Social { + h := &Social{ + network: network, + action: action, + actionTarget: actionTarget, + } + return h +} + +func (h *Social) addFields(v url.Values) error { + v.Add("sn", h.network) + v.Add("sa", h.action) + v.Add("st", h.actionTarget) + return nil +} + +func (h *Social) Copy() *Social { + c := *h + return &c +} diff --git a/vendor/github.com/jpillora/go-ogle-analytics/type-timing.go b/vendor/github.com/jpillora/go-ogle-analytics/type-timing.go new file mode 100644 index 0000000..a980520 --- /dev/null +++ b/vendor/github.com/jpillora/go-ogle-analytics/type-timing.go @@ -0,0 +1,177 @@ +package ga + +import "net/url" + +//WARNING: This file was generated. Do not edit. + +//Timing Hit Type +type Timing struct { + userTimingCategory string + userTimingCategorySet bool + userTimingVariableName string + userTimingVariableNameSet bool + userTimingTime int64 + userTimingTimeSet bool + userTimingLabel string + userTimingLabelSet bool + pageLoadTime int64 + pageLoadTimeSet bool + dNSTime int64 + dNSTimeSet bool + pageDownloadTime int64 + pageDownloadTimeSet bool + redirectResponseTime int64 + redirectResponseTimeSet bool + tCPConnectTime int64 + tCPConnectTimeSet bool + serverResponseTime int64 + serverResponseTimeSet bool + dOMInteractiveTime int64 + dOMInteractiveTimeSet bool + contentLoadTime int64 + contentLoadTimeSet bool +} + +// NewTiming creates a new Timing Hit Type. + +func NewTiming() *Timing { + h := &Timing{} + return h +} + +func (h *Timing) addFields(v url.Values) error { + if h.userTimingCategorySet { + v.Add("utc", h.userTimingCategory) + } + if h.userTimingVariableNameSet { + v.Add("utv", h.userTimingVariableName) + } + if h.userTimingTimeSet { + v.Add("utt", int2str(h.userTimingTime)) + } + if h.userTimingLabelSet { + v.Add("utl", h.userTimingLabel) + } + if h.pageLoadTimeSet { + v.Add("plt", int2str(h.pageLoadTime)) + } + if h.dNSTimeSet { + v.Add("dns", int2str(h.dNSTime)) + } + if h.pageDownloadTimeSet { + v.Add("pdt", int2str(h.pageDownloadTime)) + } + if h.redirectResponseTimeSet { + v.Add("rrt", int2str(h.redirectResponseTime)) + } + if h.tCPConnectTimeSet { + v.Add("tcp", int2str(h.tCPConnectTime)) + } + if h.serverResponseTimeSet { + v.Add("srt", int2str(h.serverResponseTime)) + } + if h.dOMInteractiveTimeSet { + v.Add("dit", int2str(h.dOMInteractiveTime)) + } + if h.contentLoadTimeSet { + v.Add("clt", int2str(h.contentLoadTime)) + } + return nil +} + +// Specifies the user timing category. +func (h *Timing) UserTimingCategory(userTimingCategory string) *Timing { + h.userTimingCategory = userTimingCategory + h.userTimingCategorySet = true + return h +} + +// Specifies the user timing variable. +func (h *Timing) UserTimingVariableName(userTimingVariableName string) *Timing { + h.userTimingVariableName = userTimingVariableName + h.userTimingVariableNameSet = true + return h +} + +// Specifies the user timing value. The value is in milliseconds. +func (h *Timing) UserTimingTime(userTimingTime int64) *Timing { + h.userTimingTime = userTimingTime + h.userTimingTimeSet = true + return h +} + +// Specifies the user timing label. +func (h *Timing) UserTimingLabel(userTimingLabel string) *Timing { + h.userTimingLabel = userTimingLabel + h.userTimingLabelSet = true + return h +} + +// Specifies the time it took for a page to load. The value +// is in milliseconds. +func (h *Timing) PageLoadTime(pageLoadTime int64) *Timing { + h.pageLoadTime = pageLoadTime + h.pageLoadTimeSet = true + return h +} + +// Specifies the time it took to do a DNS lookup.The value +// is in milliseconds. +func (h *Timing) DNSTime(dNSTime int64) *Timing { + h.dNSTime = dNSTime + h.dNSTimeSet = true + return h +} + +// Specifies the time it took for the page to be downloaded. +// The value is in milliseconds. +func (h *Timing) PageDownloadTime(pageDownloadTime int64) *Timing { + h.pageDownloadTime = pageDownloadTime + h.pageDownloadTimeSet = true + return h +} + +// Specifies the time it took for any redirects to happen. +// The value is in milliseconds. +func (h *Timing) RedirectResponseTime(redirectResponseTime int64) *Timing { + h.redirectResponseTime = redirectResponseTime + h.redirectResponseTimeSet = true + return h +} + +// Specifies the time it took for a TCP connection to be made. +// The value is in milliseconds. +func (h *Timing) TCPConnectTime(tCPConnectTime int64) *Timing { + h.tCPConnectTime = tCPConnectTime + h.tCPConnectTimeSet = true + return h +} + +// Specifies the time it took for the server to respond after +// the connect time. The value is in milliseconds. +func (h *Timing) ServerResponseTime(serverResponseTime int64) *Timing { + h.serverResponseTime = serverResponseTime + h.serverResponseTimeSet = true + return h +} + +// Specifies the time it took for Document.readyState to be +// 'interactive'. The value is in milliseconds. +func (h *Timing) DOMInteractiveTime(dOMInteractiveTime int64) *Timing { + h.dOMInteractiveTime = dOMInteractiveTime + h.dOMInteractiveTimeSet = true + return h +} + +// Specifies the time it took for the DOMContentLoaded Event +// to fire. The value is in milliseconds. +func (h *Timing) ContentLoadTime(contentLoadTime int64) *Timing { + h.contentLoadTime = contentLoadTime + h.contentLoadTimeSet = true + return h +} + +func (h *Timing) Copy() *Timing { + c := *h + return &c +} diff --git a/vendor/github.com/jpillora/go-ogle-analytics/type-transaction.go b/vendor/github.com/jpillora/go-ogle-analytics/type-transaction.go new file mode 100644 index 0000000..55c781e --- /dev/null +++ b/vendor/github.com/jpillora/go-ogle-analytics/type-transaction.go @@ -0,0 +1,95 @@ +package ga + +import "net/url" + +//WARNING: This file was generated. Do not edit. + +//Transaction Hit Type +type Transaction struct { + iD string + affiliation string + affiliationSet bool + revenue float64 + revenueSet bool + shipping float64 + shippingSet bool + tax float64 + taxSet bool + currencyCode string + currencyCodeSet bool +} + +// NewTransaction creates a new Transaction Hit Type. +// A unique identifier for the transaction. This value should +// be the same for both the Transaction hit and Items hits +// associated to the particular transaction. + +func NewTransaction(iD string) *Transaction { + h := &Transaction{ + iD: iD, + } + return h +} + +func (h *Transaction) addFields(v url.Values) error { + v.Add("ti", h.iD) + if h.affiliationSet { + v.Add("ta", h.affiliation) + } + if h.revenueSet { + v.Add("tr", float2str(h.revenue)) + } + if h.shippingSet { + v.Add("ts", float2str(h.shipping)) + } + if h.taxSet { + v.Add("tt", float2str(h.tax)) + } + if h.currencyCodeSet { + v.Add("cu", h.currencyCode) + } + return nil +} + +// Specifies the affiliation or store name. +func (h *Transaction) Affiliation(affiliation string) *Transaction { + h.affiliation = affiliation + h.affiliationSet = true + return h +} + +// Specifies the total revenue associated with the transaction. +// This value should include any shipping or tax costs. +func (h *Transaction) Revenue(revenue float64) *Transaction { + h.revenue = revenue + h.revenueSet = true + return h +} + +// Specifies the total shipping cost of the transaction. +func (h *Transaction) Shipping(shipping float64) *Transaction { + h.shipping = shipping + h.shippingSet = true + return h +} + +// Specifies the total tax of the transaction. +func (h *Transaction) Tax(tax float64) *Transaction { + h.tax = tax + h.taxSet = true + return h +} + +// When present indicates the local currency for all transaction +// currency values. Value should be a valid ISO 4217 currency +// code. +func (h *Transaction) CurrencyCode(currencyCode string) *Transaction { + h.currencyCode = currencyCode + h.currencyCodeSet = true + return h +} + +func (h *Transaction) Copy() *Transaction { + c := *h + return &c +}