Merged in feature/devbox (pull request #11)

Add Devbox

* adddevbox

* cleanupdockerfile

* testscripts
This commit is contained in:
Michael McGuinness
2025-01-10 12:58:14 +00:00
parent 0ebb8a21a1
commit 6e5c7aedc8
127 changed files with 1371 additions and 811 deletions
+11 -1
View File
@@ -1,3 +1,13 @@
#!/bin/bash
# Automatically sets up your devbox environment whenever you cd into this
# directory via our direnv integration:
eval "$(devbox generate direnv --print-envrc)"
# check out https://www.jetpack.io/devbox/docs/ide_configuration/direnv/
# for more details
export APP_ENV="${APP_ENV:-development}"
export DB_USER="${DB_USER:-postgres}"
export DB_PASS="${DB_PASS:-pass}"
@@ -17,4 +27,4 @@ ALLOWED_ENVS=("development","production")
if [[ ! $ALLOWED_ENVS[@] =~ $APP_ENV ]]; then
echo APP_ENV invalid
exit 1
fi
fi
+14 -37
View File
@@ -1,46 +1,23 @@
# Go Template
# Query Orchestration
This repository is a template for golang projects with the assumption that is being run in a linux-based environment.
This repository contains the DoczyAI code.
Using the following project as a baseline: https://github.com/golang-standards/project-layout.
## Set Up
## Installation and Usage
### gRPC API
Remove queue folders, and bring grpc into super directory.
### AWS SQS Listener
Remove grpc folders, and bring queue into super directory.
### gRPC Gateway
Set up gRPC Gateway: https://github.com/grpc-ecosystem/grpc-gateway
## Installation
- Install golang: `https://go.dev/doc/install`
- Add to ~/.profile or equivalent:
```
PATH=$PATH:/usr/local/go/bin
PATH=$PATH:$(go env GOPATH)/bin
```
- Restart terminal
- Install protoc: `https://grpc.io/docs/protoc-installation/`
- Ubuntu: `apt install -y protobuf-compiler`
- MacOS: `brew install protobuf`
- Install shellcheck
- Ubuntu: `apt install -y shellcheck`
- Ensure user in docker group and docker group is in sudo group
- Install devbox: `https://www.jetify.com/docs/devbox/installing_devbox`
- Ubuntu/MacOS: `curl -fsSL https://get.jetify.com/devbox | bash`
- Run `devbox shell` to enter the environment
- Create `.env` file to add environment variables
- Run `direnv allow` to ensure environment variables are populated
- Run `task deps:download` to download code dependencies
- (IF NECESSARY) Ensure user in docker group and docker group is in sudo group
```
sudo groupadd docker
sudo usermod -aG docker $USER
```
- Run: `./scripts/install-deps.sh`
- Add to ~/.profile or equivalent:
```
eval "$(direnv hook bash)"
```
- Restart terminal
- Create `.env` file to add environment variables
To find new packages: `https://search.nixos.org/packages`
For regular usage, please use `task` scripts in order run the most appropriate configuration.
+6 -2
View File
@@ -1,8 +1,10 @@
# syntax=docker/dockerfile:1
ARG GO_VERSION=1.23
FROM golang:${GO_VERSION} AS build
WORKDIR /src
WORKDIR /app
RUN --mount=type=cache,target=/go/pkg/mod/ \
--mount=type=bind,source=go.sum,target=go.sum \
@@ -17,6 +19,8 @@ RUN --mount=type=cache,target=/go/pkg/mod/ \
FROM scratch AS final
WORKDIR /app
COPY database/migrations/ database/migrations/
COPY --from=build /bin/ /bin/
COPY --from=build /bin/ .
+30
View File
@@ -0,0 +1,30 @@
{
"$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.13.7/.schema/devbox.schema.json",
"packages": [
"golangci-lint@1.62.2",
"protolint@0.50.5",
"yamllint@1.35.1",
"sqlc@1.27.0",
"direnv@2.35.0",
"go-mockery@2.46.3",
"protoc-gen-go@1.35.1",
"protoc-gen-go-grpc@1.3.0",
"go-migrate@4.18.1",
"go@1.23.3",
"protobuf@28.3",
"go-task@3.39.2",
"hadolint@2.12.0",
"gotools@0.25.0",
"nodePackages.jsonlint@1.6.3"
],
"shell": {
"init_hook": [
"echo 'Welcome to the DoczyAI devbox!'"
],
"scripts": {
"deps:download": [
"task deps:download"
]
}
}
}
+745
View File
@@ -0,0 +1,745 @@
{
"lockfile_version": "1",
"packages": {
"direnv@2.35.0": {
"last_modified": "2024-12-23T21:10:33Z",
"resolved": "github:NixOS/nixpkgs/de1864217bfa9b5845f465e771e0ecb48b30e02d#direnv",
"source": "devbox-search",
"version": "2.35.0",
"systems": {
"aarch64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/xp28bzq6qi11db7pqgfx3rc139q45489-direnv-2.35.0",
"default": true
}
],
"store_path": "/nix/store/xp28bzq6qi11db7pqgfx3rc139q45489-direnv-2.35.0"
},
"aarch64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/55vva1q4lhw2m62vvzzm2z26wfkpb430-direnv-2.35.0",
"default": true
}
],
"store_path": "/nix/store/55vva1q4lhw2m62vvzzm2z26wfkpb430-direnv-2.35.0"
},
"x86_64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/gza242ir81wafi79cfxk619n36rxqqmk-direnv-2.35.0",
"default": true
}
],
"store_path": "/nix/store/gza242ir81wafi79cfxk619n36rxqqmk-direnv-2.35.0"
},
"x86_64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/jw2ax71m8dzgs8xybginlsyw79ndyww1-direnv-2.35.0",
"default": true
}
],
"store_path": "/nix/store/jw2ax71m8dzgs8xybginlsyw79ndyww1-direnv-2.35.0"
}
}
},
"go-migrate@4.18.1": {
"last_modified": "2024-12-23T21:10:33Z",
"resolved": "github:NixOS/nixpkgs/de1864217bfa9b5845f465e771e0ecb48b30e02d#go-migrate",
"source": "devbox-search",
"version": "4.18.1",
"systems": {
"aarch64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/rdw2ry3cf5x31lhn44r4bzqz05mizgml-go-migrate-4.18.1",
"default": true
}
],
"store_path": "/nix/store/rdw2ry3cf5x31lhn44r4bzqz05mizgml-go-migrate-4.18.1"
},
"aarch64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/4ngpwnrfypar87qw0naqvqchmg0frs7c-go-migrate-4.18.1",
"default": true
}
],
"store_path": "/nix/store/4ngpwnrfypar87qw0naqvqchmg0frs7c-go-migrate-4.18.1"
},
"x86_64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/xzxmns8izzdrflniwfmxlcsd104kxr0k-go-migrate-4.18.1",
"default": true
}
],
"store_path": "/nix/store/xzxmns8izzdrflniwfmxlcsd104kxr0k-go-migrate-4.18.1"
},
"x86_64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/1261ar46229h0m665r3a151nr340hr30-go-migrate-4.18.1",
"default": true
}
],
"store_path": "/nix/store/1261ar46229h0m665r3a151nr340hr30-go-migrate-4.18.1"
}
}
},
"go-mockery@2.46.3": {
"last_modified": "2024-12-03T12:40:06Z",
"resolved": "github:NixOS/nixpkgs/566e53c2ad750c84f6d31f9ccb9d00f823165550#go-mockery",
"source": "devbox-search",
"version": "2.46.3",
"systems": {
"aarch64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/x12sb45y2cf87cprxj883sh9zyymi9q3-go-mockery-2.46.3",
"default": true
}
],
"store_path": "/nix/store/x12sb45y2cf87cprxj883sh9zyymi9q3-go-mockery-2.46.3"
},
"aarch64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/zd832ldc76czd9dia85c38r9va2jqsbs-go-mockery-2.46.3",
"default": true
}
],
"store_path": "/nix/store/zd832ldc76czd9dia85c38r9va2jqsbs-go-mockery-2.46.3"
},
"x86_64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/q0p7ncqhcvcydvp3crdziyv1z6raip61-go-mockery-2.46.3",
"default": true
}
],
"store_path": "/nix/store/q0p7ncqhcvcydvp3crdziyv1z6raip61-go-mockery-2.46.3"
},
"x86_64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/ch5r2lvzcrgassv50hilb4fpmgip97hd-go-mockery-2.46.3",
"default": true
}
],
"store_path": "/nix/store/ch5r2lvzcrgassv50hilb4fpmgip97hd-go-mockery-2.46.3"
}
}
},
"go-task@3.39.2": {
"last_modified": "2024-11-16T04:25:12Z",
"resolved": "github:NixOS/nixpkgs/34a626458d686f1b58139620a8b2793e9e123bba#go-task",
"source": "devbox-search",
"version": "3.39.2",
"systems": {
"aarch64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/n10k2bgg3kzp5r261m8lyyh1bmzwnxbm-go-task-3.39.2",
"default": true
}
],
"store_path": "/nix/store/n10k2bgg3kzp5r261m8lyyh1bmzwnxbm-go-task-3.39.2"
},
"aarch64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/bi9d428x6r8hcngb7x7ijihp3ln6qjai-go-task-3.39.2",
"default": true
}
],
"store_path": "/nix/store/bi9d428x6r8hcngb7x7ijihp3ln6qjai-go-task-3.39.2"
},
"x86_64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/69byf24r00663kdim1yi4p04w53rvsix-go-task-3.39.2",
"default": true
}
],
"store_path": "/nix/store/69byf24r00663kdim1yi4p04w53rvsix-go-task-3.39.2"
},
"x86_64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/055l0sbqwyhrq8zmzf51lbpgm3asdfz2-go-task-3.39.2",
"default": true
}
],
"store_path": "/nix/store/055l0sbqwyhrq8zmzf51lbpgm3asdfz2-go-task-3.39.2"
}
}
},
"go@1.23.3": {
"last_modified": "2024-12-03T12:40:06Z",
"resolved": "github:NixOS/nixpkgs/566e53c2ad750c84f6d31f9ccb9d00f823165550#go",
"source": "devbox-search",
"version": "1.23.3",
"systems": {
"aarch64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/w5cxqj1wmbl3wp6arpyl90g66hjs0823-go-1.23.3",
"default": true
}
],
"store_path": "/nix/store/w5cxqj1wmbl3wp6arpyl90g66hjs0823-go-1.23.3"
},
"aarch64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/09zl6c5i31x18w55qskc0kbp32arvvlr-go-1.23.3",
"default": true
}
],
"store_path": "/nix/store/09zl6c5i31x18w55qskc0kbp32arvvlr-go-1.23.3"
},
"x86_64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/alkrwr7w62qp3160q0azcvnyn0184hw3-go-1.23.3",
"default": true
}
],
"store_path": "/nix/store/alkrwr7w62qp3160q0azcvnyn0184hw3-go-1.23.3"
},
"x86_64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/zhq8dnjbhwspzdglyq28j74axvqyk86q-go-1.23.3",
"default": true
}
],
"store_path": "/nix/store/zhq8dnjbhwspzdglyq28j74axvqyk86q-go-1.23.3"
}
}
},
"golangci-lint@1.62.2": {
"last_modified": "2024-12-23T21:10:33Z",
"resolved": "github:NixOS/nixpkgs/de1864217bfa9b5845f465e771e0ecb48b30e02d#golangci-lint",
"source": "devbox-search",
"version": "1.62.2",
"systems": {
"aarch64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/5liapbkl2xs5kww2wvs2yv8grhcaswwl-golangci-lint-1.62.2",
"default": true
}
],
"store_path": "/nix/store/5liapbkl2xs5kww2wvs2yv8grhcaswwl-golangci-lint-1.62.2"
},
"aarch64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/87ihwdp39vxi97q0bfv8isw2p1pyz257-golangci-lint-1.62.2",
"default": true
}
],
"store_path": "/nix/store/87ihwdp39vxi97q0bfv8isw2p1pyz257-golangci-lint-1.62.2"
},
"x86_64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/73jfn21by312v2jawvmb9rkjhls28ry7-golangci-lint-1.62.2",
"default": true
}
],
"store_path": "/nix/store/73jfn21by312v2jawvmb9rkjhls28ry7-golangci-lint-1.62.2"
},
"x86_64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/rzvlg3gzv8cgr4qpvsxx1q8pmgdl9j95-golangci-lint-1.62.2",
"default": true
}
],
"store_path": "/nix/store/rzvlg3gzv8cgr4qpvsxx1q8pmgdl9j95-golangci-lint-1.62.2"
}
}
},
"gotools@0.25.0": {
"last_modified": "2024-12-23T21:10:33Z",
"resolved": "github:NixOS/nixpkgs/de1864217bfa9b5845f465e771e0ecb48b30e02d#gotools",
"source": "devbox-search",
"version": "0.25.0",
"systems": {
"aarch64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/v6xjdcrlrr1897i4siink7y3pxjcmkzm-gotools-0.25.0",
"default": true
}
],
"store_path": "/nix/store/v6xjdcrlrr1897i4siink7y3pxjcmkzm-gotools-0.25.0"
},
"aarch64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/mpgyif6gfs68szd10awin09jc40dg59j-gotools-0.25.0",
"default": true
}
],
"store_path": "/nix/store/mpgyif6gfs68szd10awin09jc40dg59j-gotools-0.25.0"
},
"x86_64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/bvbzi5qg6fcr9vadisqlvidrf3r7037a-gotools-0.25.0",
"default": true
}
],
"store_path": "/nix/store/bvbzi5qg6fcr9vadisqlvidrf3r7037a-gotools-0.25.0"
},
"x86_64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/mnnv5iqsa1hcc9v1snyxai3yqzmav9kf-gotools-0.25.0",
"default": true
}
],
"store_path": "/nix/store/mnnv5iqsa1hcc9v1snyxai3yqzmav9kf-gotools-0.25.0"
}
}
},
"hadolint@2.12.0": {
"last_modified": "2024-12-23T21:10:33Z",
"resolved": "github:NixOS/nixpkgs/de1864217bfa9b5845f465e771e0ecb48b30e02d#hadolint",
"source": "devbox-search",
"version": "2.12.0",
"systems": {
"aarch64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/0v36s261w87125xzjd2brmnrcccpa8vg-hadolint-2.12.0",
"default": true
},
{
"name": "doc",
"path": "/nix/store/41rlnh9ir4wdmiabjrjg54z7b3lfm4vf-hadolint-2.12.0-doc"
}
],
"store_path": "/nix/store/0v36s261w87125xzjd2brmnrcccpa8vg-hadolint-2.12.0"
},
"aarch64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/yrnar1ar1kyjpn9idxa446b7rlnksmcz-hadolint-2.12.0",
"default": true
}
],
"store_path": "/nix/store/yrnar1ar1kyjpn9idxa446b7rlnksmcz-hadolint-2.12.0"
},
"x86_64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/wcnjdyzj2l0bq29s0z2h82jwhczmw7wj-hadolint-2.12.0",
"default": true
}
],
"store_path": "/nix/store/wcnjdyzj2l0bq29s0z2h82jwhczmw7wj-hadolint-2.12.0"
},
"x86_64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/3q3vv1lkxiz1bj56nj5h4qp5xn8ns9ij-hadolint-2.12.0",
"default": true
}
],
"store_path": "/nix/store/3q3vv1lkxiz1bj56nj5h4qp5xn8ns9ij-hadolint-2.12.0"
}
}
},
"nodePackages.jsonlint@1.6.3": {
"last_modified": "2024-12-23T21:10:33Z",
"resolved": "github:NixOS/nixpkgs/de1864217bfa9b5845f465e771e0ecb48b30e02d#nodePackages.jsonlint",
"source": "devbox-search",
"version": "1.6.3",
"systems": {
"aarch64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/yvmhz1jldcykk4xlxqjlvh16xgzr2vd9-jsonlint-1.6.3",
"default": true
}
],
"store_path": "/nix/store/yvmhz1jldcykk4xlxqjlvh16xgzr2vd9-jsonlint-1.6.3"
},
"aarch64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/f5k7x5kmfd91a0kvx4q8n2a6z6x0vnps-jsonlint-1.6.3",
"default": true
}
],
"store_path": "/nix/store/f5k7x5kmfd91a0kvx4q8n2a6z6x0vnps-jsonlint-1.6.3"
},
"x86_64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/qmv049vhjb9wjb403592h1f0l007bny9-jsonlint-1.6.3",
"default": true
}
],
"store_path": "/nix/store/qmv049vhjb9wjb403592h1f0l007bny9-jsonlint-1.6.3"
},
"x86_64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/j08p8m0ibi5rpsbhhrr7fqqjc7gwcifd-jsonlint-1.6.3",
"default": true
}
],
"store_path": "/nix/store/j08p8m0ibi5rpsbhhrr7fqqjc7gwcifd-jsonlint-1.6.3"
}
}
},
"protobuf@28.3": {
"last_modified": "2024-12-03T12:40:06Z",
"resolved": "github:NixOS/nixpkgs/566e53c2ad750c84f6d31f9ccb9d00f823165550#protobuf",
"source": "devbox-search",
"version": "28.3",
"systems": {
"aarch64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/q04cfyxpr3ijb038bjwg6h10djlzrvzq-protobuf-28.3",
"default": true
}
],
"store_path": "/nix/store/q04cfyxpr3ijb038bjwg6h10djlzrvzq-protobuf-28.3"
},
"aarch64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/ar3x733vglzmgwlwqm712chc4lsvmg6l-protobuf-28.3",
"default": true
}
],
"store_path": "/nix/store/ar3x733vglzmgwlwqm712chc4lsvmg6l-protobuf-28.3"
},
"x86_64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/4xfgsh5dis62pr1776qnk6x6j5jn8zn0-protobuf-28.3",
"default": true
}
],
"store_path": "/nix/store/4xfgsh5dis62pr1776qnk6x6j5jn8zn0-protobuf-28.3"
},
"x86_64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/q9masc42g6rwzkpi8ma4qwbnmkzj7vz2-protobuf-28.3",
"default": true
}
],
"store_path": "/nix/store/q9masc42g6rwzkpi8ma4qwbnmkzj7vz2-protobuf-28.3"
}
}
},
"protoc-gen-go-grpc@1.3.0": {
"last_modified": "2024-12-03T12:40:06Z",
"resolved": "github:NixOS/nixpkgs/566e53c2ad750c84f6d31f9ccb9d00f823165550#protoc-gen-go-grpc",
"source": "devbox-search",
"version": "1.3.0",
"systems": {
"aarch64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/lak8kwpnagiwham2byzg3qilr78bvqfv-protoc-gen-go-grpc-1.3.0",
"default": true
}
],
"store_path": "/nix/store/lak8kwpnagiwham2byzg3qilr78bvqfv-protoc-gen-go-grpc-1.3.0"
},
"aarch64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/8chmakb7pix8kj4jv9gyyvdav2l22idk-protoc-gen-go-grpc-1.3.0",
"default": true
}
],
"store_path": "/nix/store/8chmakb7pix8kj4jv9gyyvdav2l22idk-protoc-gen-go-grpc-1.3.0"
},
"x86_64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/7v7jj7d21im7saqy41vbrlwqjzzagnqp-protoc-gen-go-grpc-1.3.0",
"default": true
}
],
"store_path": "/nix/store/7v7jj7d21im7saqy41vbrlwqjzzagnqp-protoc-gen-go-grpc-1.3.0"
},
"x86_64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/d79cxdsbdqs1l4aph985lflcix67bkb8-protoc-gen-go-grpc-1.3.0",
"default": true
}
],
"store_path": "/nix/store/d79cxdsbdqs1l4aph985lflcix67bkb8-protoc-gen-go-grpc-1.3.0"
}
}
},
"protoc-gen-go@1.35.1": {
"last_modified": "2024-11-16T04:25:12Z",
"resolved": "github:NixOS/nixpkgs/34a626458d686f1b58139620a8b2793e9e123bba#protoc-gen-go",
"source": "devbox-search",
"version": "1.35.1",
"systems": {
"aarch64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/5i406gv649fg1g7s8rcajbknm0kvsm85-protoc-gen-go-1.35.1",
"default": true
}
],
"store_path": "/nix/store/5i406gv649fg1g7s8rcajbknm0kvsm85-protoc-gen-go-1.35.1"
},
"aarch64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/i42sm8xdgh3v1434q0haxqv0akxw2k60-protoc-gen-go-1.35.1",
"default": true
}
],
"store_path": "/nix/store/i42sm8xdgh3v1434q0haxqv0akxw2k60-protoc-gen-go-1.35.1"
},
"x86_64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/34b5ry7cvnvckvgaf2xd4a46p78z1w2i-protoc-gen-go-1.35.1",
"default": true
}
],
"store_path": "/nix/store/34b5ry7cvnvckvgaf2xd4a46p78z1w2i-protoc-gen-go-1.35.1"
},
"x86_64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/0l0x36ajfyr7gav993hw2i4g39zl9x08-protoc-gen-go-1.35.1",
"default": true
}
],
"store_path": "/nix/store/0l0x36ajfyr7gav993hw2i4g39zl9x08-protoc-gen-go-1.35.1"
}
}
},
"protolint@0.50.5": {
"last_modified": "2024-11-28T07:51:56Z",
"resolved": "github:NixOS/nixpkgs/226216574ada4c3ecefcbbec41f39ce4655f78ef#protolint",
"source": "devbox-search",
"version": "0.50.5",
"systems": {
"aarch64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/039zwhkiv8klph9nk2yicyrddh3d0xxh-protolint-0.50.5",
"default": true
}
],
"store_path": "/nix/store/039zwhkiv8klph9nk2yicyrddh3d0xxh-protolint-0.50.5"
},
"aarch64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/rhmmdymbshdw6f8s9v00x1xh4kl4dv94-protolint-0.50.5",
"default": true
}
],
"store_path": "/nix/store/rhmmdymbshdw6f8s9v00x1xh4kl4dv94-protolint-0.50.5"
},
"x86_64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/kinv97rh0zsa45mnhnll9qnd4i0r13a0-protolint-0.50.5",
"default": true
}
],
"store_path": "/nix/store/kinv97rh0zsa45mnhnll9qnd4i0r13a0-protolint-0.50.5"
},
"x86_64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/1qz26rz830l9zf2dlg27mvgk9g53jdxm-protolint-0.50.5",
"default": true
}
],
"store_path": "/nix/store/1qz26rz830l9zf2dlg27mvgk9g53jdxm-protolint-0.50.5"
}
}
},
"sqlc@1.27.0": {
"last_modified": "2024-12-23T21:10:33Z",
"resolved": "github:NixOS/nixpkgs/de1864217bfa9b5845f465e771e0ecb48b30e02d#sqlc",
"source": "devbox-search",
"version": "1.27.0",
"systems": {
"aarch64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/n17zwlr8mc6b3sz7zl1wc8b8b9i1w119-sqlc-1.27.0",
"default": true
}
],
"store_path": "/nix/store/n17zwlr8mc6b3sz7zl1wc8b8b9i1w119-sqlc-1.27.0"
},
"aarch64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/4d4d2fz8cylhsypxg827hap44myrf3kx-sqlc-1.27.0",
"default": true
}
],
"store_path": "/nix/store/4d4d2fz8cylhsypxg827hap44myrf3kx-sqlc-1.27.0"
},
"x86_64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/1qcz74l1g13zzjkzpcbc2pr99myjlrcs-sqlc-1.27.0",
"default": true
}
],
"store_path": "/nix/store/1qcz74l1g13zzjkzpcbc2pr99myjlrcs-sqlc-1.27.0"
},
"x86_64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/80gxhvj6mjh0k79i88x4ks0kr705xpj3-sqlc-1.27.0",
"default": true
}
],
"store_path": "/nix/store/80gxhvj6mjh0k79i88x4ks0kr705xpj3-sqlc-1.27.0"
}
}
},
"yamllint@1.35.1": {
"last_modified": "2024-12-23T21:10:33Z",
"resolved": "github:NixOS/nixpkgs/de1864217bfa9b5845f465e771e0ecb48b30e02d#yamllint",
"source": "devbox-search",
"version": "1.35.1",
"systems": {
"aarch64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/f119sg47lh576bj7s83rmfdphwjxykkq-python3.12-yamllint-1.35.1",
"default": true
},
{
"name": "dist",
"path": "/nix/store/0h54cmwyz2d6axldh6894dj8hwavyarc-python3.12-yamllint-1.35.1-dist"
}
],
"store_path": "/nix/store/f119sg47lh576bj7s83rmfdphwjxykkq-python3.12-yamllint-1.35.1"
},
"aarch64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/3zgl49ap4wlg6h9g5r9m8lhwys8v566q-python3.12-yamllint-1.35.1",
"default": true
},
{
"name": "dist",
"path": "/nix/store/3kiidcnnizy76d8hly4nmwjwig597wwk-python3.12-yamllint-1.35.1-dist"
}
],
"store_path": "/nix/store/3zgl49ap4wlg6h9g5r9m8lhwys8v566q-python3.12-yamllint-1.35.1"
},
"x86_64-darwin": {
"outputs": [
{
"name": "out",
"path": "/nix/store/jx6wrsl5scdggdq9j79vdr4pygirp7c3-python3.12-yamllint-1.35.1",
"default": true
},
{
"name": "dist",
"path": "/nix/store/xf8h6cs767i3yw417sivr8sy27jpszrl-python3.12-yamllint-1.35.1-dist"
}
],
"store_path": "/nix/store/jx6wrsl5scdggdq9j79vdr4pygirp7c3-python3.12-yamllint-1.35.1"
},
"x86_64-linux": {
"outputs": [
{
"name": "out",
"path": "/nix/store/67dhdiaxkryhr9bwyg7lfpmljcghvjwb-python3.12-yamllint-1.35.1",
"default": true
},
{
"name": "dist",
"path": "/nix/store/jrcv8wi52hb9rv84c01hayvjz2kfiwpf-python3.12-yamllint-1.35.1-dist"
}
],
"store_path": "/nix/store/67dhdiaxkryhr9bwyg7lfpmljcghvjwb-python3.12-yamllint-1.35.1"
}
}
}
}
}
-1
View File
@@ -8,7 +8,6 @@ require (
github.com/aws/aws-sdk-go-v2/service/sqs v1.37.1
github.com/go-playground/validator/v10 v10.23.0
github.com/golang-migrate/migrate/v4 v4.18.1
github.com/golang/protobuf v1.5.4
github.com/jackc/pgx/v5 v5.7.1
github.com/lib/pq v1.10.9
github.com/stretchr/testify v1.10.0
+11 -9
View File
@@ -3,6 +3,10 @@
version: '3'
vars:
CONTEXT: ..
OUT_DIR: out
includes:
deps:
dir: "{{.CONTEXT}}"
@@ -23,11 +27,6 @@ includes:
dir: "{{.CONTEXT}}"
taskfile: database.yml
vars:
CONTEXT: ..
OUT_DIR: out
OUT_FILE: "{{.OUT_DIR}}/main_grpc"
tasks:
generate:
deps:
@@ -38,9 +37,9 @@ tasks:
- task code:lint
- task db:lint
- task yaml:lint
- task json:lint
- task docker:lint
- task compose:lint
- task shell:lint
- task proto:lint
lint:fix:
cmds:
@@ -48,9 +47,9 @@ tasks:
- task proto:lint:fix
- task db:lint
- task yaml:lint
- task json:lint:fix
- task docker:lint
- task compose:lint
- task shell:lint
code:lint:
cmds:
- golangci-lint run
@@ -61,9 +60,12 @@ tasks:
yaml:lint:
cmds:
- yamllint . -s
shell:lint:
json:lint:
cmds:
- shellcheck --shell=sh scripts/install-deps.sh
- jsonlint devbox.json -q -s
json:lint:fix:
cmds:
- jsonlint devbox.json -q -s -i
docs:
cmds:
- godoc -http=:6060
+1 -1
View File
@@ -21,4 +21,4 @@ tasks:
- docker compose -f {{.COMPOSE_FILE}} down
lint:
cmds:
- docker compose -f {{.COMPOSE_FILE}} config
- docker compose -f {{.COMPOSE_FILE}} config -q --resolve-image-digests
+2 -2
View File
@@ -12,10 +12,10 @@ tasks:
- |
task compose:up:bg
task db:mig:run
sqlc generate --file ../sqlc.yml
sqlc generate --file sqlc.yml
lint:
cmds:
- sqlc vet --file ../sqlc.yml
- sqlc vet --file sqlc.yml
mig:create:
cmds:
- |
+1 -15
View File
@@ -4,22 +4,8 @@
version: '3'
tasks:
install:
download:
cmds:
- go install golang.org/x/tools/cmd/godoc@v0.29.0
- go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.62.2
- go install github.com/yoheimuta/protolint/cmd/protolint@v0.52.0
- go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.36.0
- go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.5.1
- go install github.com/zabio3/godolint@v1.0.3
- go install github.com/wasilibs/go-yamllint/cmd/yamllint@v1.35.1
- go install github.com/sqlc-dev/sqlc/cmd/sqlc@v1.27.0
- |
go install -tags 'postgres' \
github.com/golang-migrate/migrate/v4/cmd/migrate@v4.18.1
- go install github.com/vektra/mockery/v2@v2.50.0
- curl -sfL https://direnv.net/install.sh | bash
- direnv allow
- go mod download
tidy:
cmds:
+1 -1
View File
@@ -9,7 +9,7 @@ vars:
tasks:
lint:
cmds:
- godolint {{.DOCKERFILE}}
- hadolint {{.DOCKERFILE}} -t none
build:
cmds:
- docker build -t {{.IMAGE_NAME}} -f {{.DOCKERFILE}} .
-7
View File
@@ -1,7 +0,0 @@
#!/bin/sh
# Install Taskfile
sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b ~/.local/binintegration
# Install dependencies
task deps:install
+4 -11
View File
@@ -3,11 +3,6 @@
version: '3'
includes:
docker:
taskfile: docker.yml
internal: true
vars:
COVERAGE_FILE: "{{.OUT_DIR}}/coverage.out"
@@ -43,15 +38,13 @@ tasks:
fi
silent: true
integration:
deps:
- docker:build
cmds:
- task docker:build
- task test:integration:nobuild
integration:nocache:
deps:
- docker:build
cmds:
- go test -count=1 -v test/...
- task docker:build
- go test -count=1 -v ./test/...
integration:nobuild:
cmds:
- go test -v test/...
- go test -v ./test/...
+1 -1
View File
@@ -38,7 +38,7 @@ func createAPIContainer(t *testing.T, ctx context.Context, config *apiContainerC
ExposedPorts: []string{port.Port()},
WaitingFor: wait.ForLog("Listening on port 8080"),
Networks: []string{config.Network.Name},
Entrypoint: []string{fmt.Sprintf("./bin/%s", config.ServiceName)},
Entrypoint: []string{fmt.Sprintf("./%s", config.ServiceName)},
}
container, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
+1 -1
View File
@@ -50,7 +50,7 @@ func createQueueContainer(t *testing.T, ctx context.Context, config *queueContai
},
Networks: []string{config.Network.Name},
WaitingFor: wait.ForLog("Listening to queue"),
Entrypoint: []string{fmt.Sprintf("./bin/%s", config.ServiceName)},
Entrypoint: []string{fmt.Sprintf("./%s", config.ServiceName)},
}
container, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package winterm
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package winterm
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package winterm
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package winterm
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package winterm
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package winterm
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package winterm
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package winterm
+19 -20
View File
@@ -15,26 +15,26 @@ import (
// When defining struct types. the `document` struct tag can be used to control how the value will be
// marshaled into the resulting protocol document.
//
// // Field is ignored
// Field int `document:"-"`
// // Field is ignored
// Field int `document:"-"`
//
// // Field object of key "myName"
// Field int `document:"myName"`
// // Field object of key "myName"
// Field int `document:"myName"`
//
// // Field object key of key "myName", and
// // Field is omitted if the field is a zero value for the type.
// Field int `document:"myName,omitempty"`
// // Field object key of key "myName", and
// // Field is omitted if the field is a zero value for the type.
// Field int `document:"myName,omitempty"`
//
// // Field object key of "Field", and
// // Field is omitted if the field is a zero value for the type.
// Field int `document:",omitempty"`
// // Field object key of "Field", and
// // Field is omitted if the field is a zero value for the type.
// Field int `document:",omitempty"`
//
// All struct fields, including anonymous fields, are marshaled unless the
// any of the following conditions are meet.
//
// - the field is not exported
// - document field tag is "-"
// - document field tag specifies "omitempty", and is a zero value.
// - the field is not exported
// - document field tag is "-"
// - document field tag specifies "omitempty", and is a zero value.
//
// Pointer and interface values are encoded as the value pointed to or
// contained in the interface. A nil value encodes as a null
@@ -63,13 +63,12 @@ type Marshaler interface {
//
// Both generic interface{} and concrete types are valid unmarshal destination types. When unmarshaling a document
// into an empty interface the Unmarshaler will store one of these values:
//
// bool, for boolean values
// document.Number, for arbitrary-precision numbers (int64, float64, big.Int, big.Float)
// string, for string values
// []interface{}, for array values
// map[string]interface{}, for objects
// nil, for null values
// bool, for boolean values
// document.Number, for arbitrary-precision numbers (int64, float64, big.Int, big.Float)
// string, for string values
// []interface{}, for array values
// map[string]interface{}, for objects
// nil, for null values
//
// When unmarshaling, any error that occurs will halt the unmarshal and return the error.
type Unmarshaler interface {
+5 -5
View File
@@ -4,21 +4,21 @@ shape serializer function in which a xml.Value will be passed around.
Resources followed: https://smithy.io/2.0/spec/protocol-traits.html#xml-bindings
# Member Element
Member Element
Member element should be used to encode xml shapes into xml elements except for flattened xml shapes. Member element
write their own element start tag. These elements should always be closed.
# Flattened Element
Flattened Element
Flattened element should be used to encode shapes marked with flattened trait into xml elements. Flattened element
do not write a start tag, and thus should not be closed.
# Simple types encoding
Simple types encoding
All simple type methods on value such as String(), Long() etc; auto close the associated member element.
# Array
Array
Array returns the collection encoder. It has two modes, wrapped and flattened encoding.
@@ -32,7 +32,7 @@ If a shape is marked as flattened, Array() will use the shape element name as wr
<flattenedAarray>apple</flattenedArray><flattenedArray>tree</flattenedArray>
# Map
Map
Map is the map encoder. It has two modes, wrapped and flattened encoding.
+10 -10
View File
@@ -14,7 +14,7 @@
// handler. A handler could be something like an HTTP Client that round trips an
// API operation over HTTP.
//
// # Smithy Middleware Stack
// Smithy Middleware Stack
//
// A Stack is a collection of middleware that wrap a handler. The stack can be
// broken down into discreet steps. Each step may contain zero or more middleware
@@ -48,20 +48,20 @@
// the request message. Deserializes the response into a structured type or
// error above stacks can react to.
//
// # Adding Middleware to a Stack Step
// Adding Middleware to a Stack Step
//
// Middleware can be added to a step front or back, or relative, by name, to an
// existing middleware in that stack. If a middleware does not have a name, a
// unique name will be generated at the middleware and be added to the step.
//
// // Create middleware stack
// stack := middleware.NewStack()
// // Create middleware stack
// stack := middleware.NewStack()
//
// // Add middleware to stack steps
// stack.Initialize.Add(paramValidationMiddleware, middleware.After)
// stack.Serialize.Add(marshalOperationFoo, middleware.After)
// stack.Deserialize.Add(unmarshalOperationFoo, middleware.After)
// // Add middleware to stack steps
// stack.Initialize.Add(paramValidationMiddleware, middleware.After)
// stack.Serialize.Add(marshalOperationFoo, middleware.After)
// stack.Deserialize.Add(unmarshalOperationFoo, middleware.After)
//
// // Invoke middleware on handler.
// resp, err := stack.HandleMiddleware(ctx, req.Input, clientHandler)
// // Invoke middleware on handler.
// resp, err := stack.HandleMiddleware(ctx, req.Input, clientHandler)
package middleware
+2 -2
View File
@@ -13,7 +13,7 @@ import (
// Steps are composed as middleware around the underlying handler in the
// following order:
//
// Initialize -> Serialize -> Build -> Finalize -> Deserialize -> Handler
// Initialize -> Serialize -> Build -> Finalize -> Deserialize -> Handler
//
// Any middleware within the chain may choose to stop and return an error or
// response. Since the middleware decorate the handler like a call stack, each
@@ -21,7 +21,7 @@ import (
// Middleware that does not need to react to an input, or result must forward
// along the input down the chain, or return the result back up the chain.
//
// Initialize <- Serialize -> Build -> Finalize <- Deserialize <- Handler
// Initialize <- Serialize -> Build -> Finalize <- Deserialize <- Handler
type Stack struct {
// Initialize prepares the input, and sets any default parameters as
// needed, (e.g. idempotency token, and presigned URLs).
+18 -20
View File
@@ -11,17 +11,17 @@ period for each retry attempt using a randomization function that grows exponent
NextBackOff() is calculated using the following formula:
randomized interval =
RetryInterval * (random value in range [1 - RandomizationFactor, 1 + RandomizationFactor])
randomized interval =
RetryInterval * (random value in range [1 - RandomizationFactor, 1 + RandomizationFactor])
In other words NextBackOff() will range between the randomization factor
percentage below and above the retry interval.
For example, given the following parameters:
RetryInterval = 2
RandomizationFactor = 0.5
Multiplier = 2
RetryInterval = 2
RandomizationFactor = 0.5
Multiplier = 2
the actual backoff period used in the next retry attempt will range between 1 and 3 seconds,
multiplied by the exponential, that is, between 2 and 6 seconds.
@@ -36,18 +36,18 @@ The elapsed time can be reset by calling Reset().
Example: Given the following default arguments, for 10 tries the sequence will be,
and assuming we go over the MaxElapsedTime on the 10th try:
Request # RetryInterval (seconds) Randomized Interval (seconds)
Request # RetryInterval (seconds) Randomized Interval (seconds)
1 0.5 [0.25, 0.75]
2 0.75 [0.375, 1.125]
3 1.125 [0.562, 1.687]
4 1.687 [0.8435, 2.53]
5 2.53 [1.265, 3.795]
6 3.795 [1.897, 5.692]
7 5.692 [2.846, 8.538]
8 8.538 [4.269, 12.807]
9 12.807 [6.403, 19.210]
10 19.210 backoff.Stop
1 0.5 [0.25, 0.75]
2 0.75 [0.375, 1.125]
3 1.125 [0.562, 1.687]
4 1.687 [0.8435, 2.53]
5 2.53 [1.265, 3.795]
6 3.795 [1.897, 5.692]
7 5.692 [2.846, 8.538]
8 8.538 [4.269, 12.807]
9 12.807 [6.403, 19.210]
10 19.210 backoff.Stop
Note: Implementation is not thread-safe.
*/
@@ -167,8 +167,7 @@ func (b *ExponentialBackOff) Reset() {
}
// NextBackOff calculates the next backoff interval using the formula:
//
// Randomized interval = RetryInterval * (1 ± RandomizationFactor)
// Randomized interval = RetryInterval * (1 ± RandomizationFactor)
func (b *ExponentialBackOff) NextBackOff() time.Duration {
// Make sure we have not gone over the maximum elapsed time.
elapsed := b.GetElapsedTime()
@@ -201,8 +200,7 @@ func (b *ExponentialBackOff) incrementCurrentInterval() {
}
// Returns a random value from the following interval:
//
// [currentInterval - randomizationFactor * currentInterval, currentInterval + randomizationFactor * currentInterval].
// [currentInterval - randomizationFactor * currentInterval, currentInterval + randomizationFactor * currentInterval].
func getRandomValueFromInterval(randomizationFactor, random float64, currentInterval time.Duration) time.Duration {
if randomizationFactor == 0 {
return currentInterval // make sure no randomness is used when randomizationFactor is 0.
-1
View File
@@ -18,7 +18,6 @@
// tag is deprecated and thus should not be used.
// Go versions prior to 1.4 are disabled because they use a different layout
// for interfaces which make the implementation of unsafeReflectValue more complex.
//go:build !js && !appengine && !safe && !disableunsafe && go1.4
// +build !js,!appengine,!safe,!disableunsafe,go1.4
package spew
-1
View File
@@ -16,7 +16,6 @@
// when the code is running on Google App Engine, compiled by GopherJS, or
// "-tags safe" is added to the go build command line. The "disableunsafe"
// tag is deprecated and thus should not be used.
//go:build js || appengine || safe || disableunsafe || !go1.4
// +build js appengine safe disableunsafe !go1.4
package spew
+15 -15
View File
@@ -254,15 +254,15 @@ pointer addresses used to indirect to the final value. It provides the
following features over the built-in printing facilities provided by the fmt
package:
- Pointers are dereferenced and followed
- Circular data structures are detected and handled properly
- Custom Stringer/error interfaces are optionally invoked, including
on unexported types
- Custom types which only implement the Stringer/error interfaces via
a pointer receiver are optionally invoked when passing non-pointer
variables
- Byte arrays and slices are dumped like the hexdump -C command which
includes offsets, byte values in hex, and ASCII output
* Pointers are dereferenced and followed
* Circular data structures are detected and handled properly
* Custom Stringer/error interfaces are optionally invoked, including
on unexported types
* Custom types which only implement the Stringer/error interfaces via
a pointer receiver are optionally invoked when passing non-pointer
variables
* Byte arrays and slices are dumped like the hexdump -C command which
includes offsets, byte values in hex, and ASCII output
The configuration options are controlled by modifying the public members
of c. See ConfigState for options documentation.
@@ -295,12 +295,12 @@ func (c *ConfigState) convertArgs(args []interface{}) (formatters []interface{})
// NewDefaultConfig returns a ConfigState with the following default settings.
//
// Indent: " "
// MaxDepth: 0
// DisableMethods: false
// DisablePointerMethods: false
// ContinueOnMethod: false
// SortKeys: false
// Indent: " "
// MaxDepth: 0
// DisableMethods: false
// DisablePointerMethods: false
// ContinueOnMethod: false
// SortKeys: false
func NewDefaultConfig() *ConfigState {
return &ConfigState{Indent: " "}
}
+61 -67
View File
@@ -21,36 +21,35 @@ debugging.
A quick overview of the additional features spew provides over the built-in
printing facilities for Go data types are as follows:
- Pointers are dereferenced and followed
- Circular data structures are detected and handled properly
- Custom Stringer/error interfaces are optionally invoked, including
on unexported types
- Custom types which only implement the Stringer/error interfaces via
a pointer receiver are optionally invoked when passing non-pointer
variables
- Byte arrays and slices are dumped like the hexdump -C command which
includes offsets, byte values in hex, and ASCII output (only when using
Dump style)
* Pointers are dereferenced and followed
* Circular data structures are detected and handled properly
* Custom Stringer/error interfaces are optionally invoked, including
on unexported types
* Custom types which only implement the Stringer/error interfaces via
a pointer receiver are optionally invoked when passing non-pointer
variables
* Byte arrays and slices are dumped like the hexdump -C command which
includes offsets, byte values in hex, and ASCII output (only when using
Dump style)
There are two different approaches spew allows for dumping Go data structures:
- Dump style which prints with newlines, customizable indentation,
and additional debug information such as types and all pointer addresses
used to indirect to the final value
- A custom Formatter interface that integrates cleanly with the standard fmt
package and replaces %v, %+v, %#v, and %#+v to provide inline printing
similar to the default %v while providing the additional functionality
outlined above and passing unsupported format verbs such as %x and %q
along to fmt
* Dump style which prints with newlines, customizable indentation,
and additional debug information such as types and all pointer addresses
used to indirect to the final value
* A custom Formatter interface that integrates cleanly with the standard fmt
package and replaces %v, %+v, %#v, and %#+v to provide inline printing
similar to the default %v while providing the additional functionality
outlined above and passing unsupported format verbs such as %x and %q
along to fmt
# Quick Start
Quick Start
This section demonstrates how to quickly get started with spew. See the
sections below for further details on formatting and configuration options.
To dump a variable with full newlines, indentation, type, and pointer
information use Dump, Fdump, or Sdump:
spew.Dump(myVar1, myVar2, ...)
spew.Fdump(someWriter, myVar1, myVar2, ...)
str := spew.Sdump(myVar1, myVar2, ...)
@@ -59,13 +58,12 @@ Alternatively, if you would prefer to use format strings with a compacted inline
printing style, use the convenience wrappers Printf, Fprintf, etc with
%v (most compact), %+v (adds pointer addresses), %#v (adds types), or
%#+v (adds types and pointer addresses):
spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2)
spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4)
spew.Fprintf(someWriter, "myVar1: %v -- myVar2: %+v", myVar1, myVar2)
spew.Fprintf(someWriter, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4)
# Configuration Options
Configuration Options
Configuration of spew is handled by fields in the ConfigState type. For
convenience, all of the top-level functions use a global state available
@@ -76,52 +74,51 @@ equivalent to the top-level functions. This allows concurrent configuration
options. See the ConfigState documentation for more details.
The following configuration options are available:
* Indent
String to use for each indentation level for Dump functions.
It is a single space by default. A popular alternative is "\t".
- Indent
String to use for each indentation level for Dump functions.
It is a single space by default. A popular alternative is "\t".
* MaxDepth
Maximum number of levels to descend into nested data structures.
There is no limit by default.
- MaxDepth
Maximum number of levels to descend into nested data structures.
There is no limit by default.
* DisableMethods
Disables invocation of error and Stringer interface methods.
Method invocation is enabled by default.
- DisableMethods
Disables invocation of error and Stringer interface methods.
Method invocation is enabled by default.
* DisablePointerMethods
Disables invocation of error and Stringer interface methods on types
which only accept pointer receivers from non-pointer variables.
Pointer method invocation is enabled by default.
- DisablePointerMethods
Disables invocation of error and Stringer interface methods on types
which only accept pointer receivers from non-pointer variables.
Pointer method invocation is enabled by default.
* DisablePointerAddresses
DisablePointerAddresses specifies whether to disable the printing of
pointer addresses. This is useful when diffing data structures in tests.
- DisablePointerAddresses
DisablePointerAddresses specifies whether to disable the printing of
pointer addresses. This is useful when diffing data structures in tests.
* DisableCapacities
DisableCapacities specifies whether to disable the printing of
capacities for arrays, slices, maps and channels. This is useful when
diffing data structures in tests.
- DisableCapacities
DisableCapacities specifies whether to disable the printing of
capacities for arrays, slices, maps and channels. This is useful when
diffing data structures in tests.
* ContinueOnMethod
Enables recursion into types after invoking error and Stringer interface
methods. Recursion after method invocation is disabled by default.
- ContinueOnMethod
Enables recursion into types after invoking error and Stringer interface
methods. Recursion after method invocation is disabled by default.
* SortKeys
Specifies map keys should be sorted before being printed. Use
this to have a more deterministic, diffable output. Note that
only native types (bool, int, uint, floats, uintptr and string)
and types which implement error or Stringer interfaces are
supported with other types sorted according to the
reflect.Value.String() output which guarantees display
stability. Natural map order is used by default.
- SortKeys
Specifies map keys should be sorted before being printed. Use
this to have a more deterministic, diffable output. Note that
only native types (bool, int, uint, floats, uintptr and string)
and types which implement error or Stringer interfaces are
supported with other types sorted according to the
reflect.Value.String() output which guarantees display
stability. Natural map order is used by default.
* SpewKeys
Specifies that, as a last resort attempt, map keys should be
spewed to strings and sorted by those strings. This is only
considered if SortKeys is true.
- SpewKeys
Specifies that, as a last resort attempt, map keys should be
spewed to strings and sorted by those strings. This is only
considered if SortKeys is true.
# Dump Usage
Dump Usage
Simply call spew.Dump with a list of variables you want to dump:
@@ -136,7 +133,7 @@ A third option is to call spew.Sdump to get the formatted output as a string:
str := spew.Sdump(myVar1, myVar2, ...)
# Sample Dump Output
Sample Dump Output
See the Dump example for details on the setup of the types and variables being
shown here.
@@ -153,14 +150,13 @@ shown here.
Byte (and uint8) arrays and slices are displayed uniquely like the hexdump -C
command as shown.
([]uint8) (len=32 cap=32) {
00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |............... |
00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 |!"#$%&'()*+,-./0|
00000020 31 32 |12|
}
# Custom Formatter
Custom Formatter
Spew provides a custom formatter that implements the fmt.Formatter interface
so that it integrates cleanly with standard fmt package printing functions. The
@@ -174,7 +170,7 @@ standard fmt package for formatting. In addition, the custom formatter ignores
the width and precision arguments (however they will still work on the format
specifiers not handled by the custom formatter).
# Custom Formatter Usage
Custom Formatter Usage
The simplest way to make use of the spew custom formatter is to call one of the
convenience functions such as spew.Printf, spew.Println, or spew.Printf. The
@@ -188,17 +184,15 @@ functions have syntax you are most likely already familiar with:
See the Index for the full list convenience functions.
# Sample Formatter Output
Sample Formatter Output
Double pointer to a uint8:
%v: <**>5
%+v: <**>(0xf8400420d0->0xf8400420c8)5
%#v: (**uint8)5
%#+v: (**uint8)(0xf8400420d0->0xf8400420c8)5
Pointer to circular struct with a uint8 field and a pointer to itself:
%v: <*>{1 <*><shown>}
%+v: <*>(0xf84003e260){ui8:1 c:<*>(0xf84003e260)<shown>}
%#v: (*main.circular){ui8:(uint8)1 c:(*main.circular)<shown>}
@@ -207,7 +201,7 @@ Pointer to circular struct with a uint8 field and a pointer to itself:
See the Printf example for details on the setup of variables being shown
here.
# Errors
Errors
Since it is possible for custom Stringer/error interfaces to panic, spew
detects them and handles them internally by printing the panic information
+9 -9
View File
@@ -488,15 +488,15 @@ pointer addresses used to indirect to the final value. It provides the
following features over the built-in printing facilities provided by the fmt
package:
- Pointers are dereferenced and followed
- Circular data structures are detected and handled properly
- Custom Stringer/error interfaces are optionally invoked, including
on unexported types
- Custom types which only implement the Stringer/error interfaces via
a pointer receiver are optionally invoked when passing non-pointer
variables
- Byte arrays and slices are dumped like the hexdump -C command which
includes offsets, byte values in hex, and ASCII output
* Pointers are dereferenced and followed
* Circular data structures are detected and handled properly
* Custom Stringer/error interfaces are optionally invoked, including
on unexported types
* Custom types which only implement the Stringer/error interfaces via
a pointer receiver are optionally invoked when passing non-pointer
variables
* Byte arrays and slices are dumped like the hexdump -C command which
includes offsets, byte values in hex, and ASCII output
The configuration options are controlled by an exported package global,
spew.Config. See ConfigState for options documentation.
-2
View File
@@ -1,6 +1,4 @@
//go:build go1.8
// +build go1.8
// Code generated by "httpsnoop/codegen"; DO NOT EDIT.
package httpsnoop
-2
View File
@@ -1,6 +1,4 @@
//go:build !go1.8
// +build !go1.8
// Code generated by "httpsnoop/codegen"; DO NOT EDIT.
package httpsnoop
+13 -14
View File
@@ -154,11 +154,11 @@ func Marc(raw []byte, limit uint32) bool {
// the GL transmission Format (glTF).
// GLB uses little endian and its header structure is as follows:
//
// <-- 12-byte header -->
// | magic | version | length |
// | (uint32) | (uint32) | (uint32) |
// | \x67\x6C\x54\x46 | \x01\x00\x00\x00 | ... |
// | g l T F | 1 | ... |
// <-- 12-byte header -->
// | magic | version | length |
// | (uint32) | (uint32) | (uint32) |
// | \x67\x6C\x54\x46 | \x01\x00\x00\x00 | ... |
// | g l T F | 1 | ... |
//
// Visit [glTF specification] and [IANA glTF entry] for more details.
//
@@ -170,15 +170,14 @@ var Glb = prefix([]byte("\x67\x6C\x54\x46\x02\x00\x00\x00"),
// TzIf matches a Time Zone Information Format (TZif) file.
// See more: https://tools.ietf.org/id/draft-murchison-tzdist-tzif-00.html#rfc.section.3
// Its header structure is shown below:
//
// +---------------+---+
// | magic (4) | <-+-- version (1)
// +---------------+---+---------------------------------------+
// | [unused - reserved for future use] (15) |
// +---------------+---------------+---------------+-----------+
// | isutccnt (4) | isstdcnt (4) | leapcnt (4) |
// +---------------+---------------+---------------+
// | timecnt (4) | typecnt (4) | charcnt (4) |
// +---------------+---+
// | magic (4) | <-+-- version (1)
// +---------------+---+---------------------------------------+
// | [unused - reserved for future use] (15) |
// +---------------+---------------+---------------+-----------+
// | isutccnt (4) | isstdcnt (4) | leapcnt (4) |
// +---------------+---------------+---------------+
// | timecnt (4) | typecnt (4) | charcnt (4) |
func TzIf(raw []byte, limit uint32) bool {
// File is at least 44 bytes (header size).
if len(raw) < 44 {
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build !windows
// +build !windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build !windows
// +build !windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package ole
+5 -5
View File
@@ -108,9 +108,9 @@ type GUID struct {
//
// The supplied string may be in any of these formats:
//
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
//
// The conversion of the supplied string is not case-sensitive.
func NewGUID(guid string) *GUID {
@@ -216,11 +216,11 @@ func decodeHexChar(c byte) (byte, bool) {
// String converts the GUID to string form. It will adhere to this pattern:
//
// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
//
// If the GUID is nil, the string representation of an empty GUID is returned:
//
// {00000000-0000-0000-0000-000000000000}
// {00000000-0000-0000-0000-000000000000}
func (guid *GUID) String() string {
if guid == nil {
return emptyGUID
-1
View File
@@ -1,4 +1,3 @@
//go:build !windows
// +build !windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build !windows
// +build !windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build !windows
// +build !windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build !windows
// +build !windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build !windows
// +build !windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build !windows
// +build !windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build !windows
// +build !windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build !windows
// +build !windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package oleutil
-1
View File
@@ -1,4 +1,3 @@
//go:build !windows
// +build !windows
package oleutil
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package oleutil
-1
View File
@@ -1,7 +1,6 @@
// This file is here so go get succeeds as without it errors with:
// no buildable Go source files in ...
//
//go:build !windows
// +build !windows
package oleutil
-1
View File
@@ -1,4 +1,3 @@
//go:build !windows
// +build !windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package ole
+1 -1
View File
@@ -84,7 +84,7 @@ func (sac *SafeArrayConversion) ToValueArray() (values []interface{}) {
safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v))
values[i] = v
case VT_BSTR:
v, _ := safeArrayGetElementString(sac.Array, i)
v , _ := safeArrayGetElementString(sac.Array, i)
values[i] = v
case VT_VARIANT:
var v VARIANT
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build 386
// +build 386
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build amd64
// +build amd64
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build arm
// +build arm
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build windows && 386
// +build windows,386
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build windows && amd64
// +build windows,amd64
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build windows && arm
// +build windows,arm
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build ppc64le
// +build ppc64le
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build s390x
// +build s390x
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build windows
// +build windows
package ole
-1
View File
@@ -1,4 +1,3 @@
//go:build !windows
// +build !windows
package ole
+18 -18
View File
@@ -39,35 +39,35 @@ for a protocol buffer variable v:
- Names are turned from camel_case to CamelCase for export.
- There are no methods on v to set fields; just treat
them as structure fields.
them as structure fields.
- There are getters that return a field's value if set,
and return the field's default value if unset.
The getters work even if the receiver is a nil message.
and return the field's default value if unset.
The getters work even if the receiver is a nil message.
- The zero value for a struct is its correct initialization state.
All desired fields must be set before marshaling.
All desired fields must be set before marshaling.
- A Reset() method will restore a protobuf struct to its zero state.
- Non-repeated fields are pointers to the values; nil means unset.
That is, optional or required field int32 f becomes F *int32.
That is, optional or required field int32 f becomes F *int32.
- Repeated fields are slices.
- Helper functions are available to aid the setting of fields.
msg.Foo = proto.String("hello") // set field
msg.Foo = proto.String("hello") // set field
- Constants are defined to hold the default values of all fields that
have them. They have the form Default_StructName_FieldName.
Because the getter methods handle defaulted values,
direct use of these constants should be rare.
have them. They have the form Default_StructName_FieldName.
Because the getter methods handle defaulted values,
direct use of these constants should be rare.
- Enums are given type names and maps from names to values.
Enum values are prefixed by the enclosing message's name, or by the
enum's type name if it is a top-level enum. Enum types have a String
method, and a Enum method to assist in message construction.
Enum values are prefixed by the enclosing message's name, or by the
enum's type name if it is a top-level enum. Enum types have a String
method, and a Enum method to assist in message construction.
- Nested messages, groups and enums have type names prefixed with the name of
the surrounding message type.
the surrounding message type.
- Extensions are given descriptor names that start with E_,
followed by an underscore-delimited list of the nested messages
that contain it (if any) followed by the CamelCased name of the
extension field itself. HasExtension, ClearExtension, GetExtension
and SetExtension are functions for manipulating extensions.
followed by an underscore-delimited list of the nested messages
that contain it (if any) followed by the CamelCased name of the
extension field itself. HasExtension, ClearExtension, GetExtension
and SetExtension are functions for manipulating extensions.
- Oneof field sets are given a single field in their message,
with distinguished wrapper types for each possible field value.
with distinguished wrapper types for each possible field value.
- Marshal and Unmarshal are functions to encode and decode the wire format.
When the .proto file specifies `syntax="proto3"`, there are some differences:
-1
View File
@@ -29,7 +29,6 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//go:build purego || appengine || js
// +build purego appengine js
// This file contains an implementation of proto field accesses using package reflect.
-1
View File
@@ -26,7 +26,6 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//go:build purego || appengine || js
// +build purego appengine js
// This file contains an implementation of proto field accesses using package reflect.
-1
View File
@@ -29,7 +29,6 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//go:build !purego && !appengine && !js
// +build !purego,!appengine,!js
// This file contains the implementation of the proto field accesses using package unsafe.
-1
View File
@@ -26,7 +26,6 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//go:build !purego && !appengine && !js
// +build !purego,!appengine,!js
// This file contains the implementation of the proto field accesses using package unsafe.
+6 -8
View File
@@ -2004,14 +2004,12 @@ func makeUnmarshalMap(f *reflect.StructField) unmarshaler {
// makeUnmarshalOneof makes an unmarshaler for oneof fields.
// for:
//
// message Msg {
// oneof F {
// int64 X = 1;
// float64 Y = 2;
// }
// }
//
// message Msg {
// oneof F {
// int64 X = 1;
// float64 Y = 2;
// }
// }
// typ is the type of the concrete entry for a oneof case (e.g. Msg_X).
// ityp is the interface type of the oneof field (e.g. isMsg_F).
// unmarshal is the unmarshaler for the base type of the oneof case (e.g. int64).
-3
View File
@@ -1,3 +0,0 @@
# This source code refers to The Go Authors for copyright purposes.
# The master list of authors is in the main Go distribution,
# visible at http://tip.golang.org/AUTHORS.
-3
View File
@@ -1,3 +0,0 @@
# This source code was written by the Go contributors.
# The master list of contributors is in the main Go distribution,
# visible at http://tip.golang.org/CONTRIBUTORS.
-28
View File
@@ -1,28 +0,0 @@
Copyright 2010 The Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-62
View File
@@ -1,62 +0,0 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: github.com/golang/protobuf/ptypes/empty/empty.proto
package empty
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
emptypb "google.golang.org/protobuf/types/known/emptypb"
reflect "reflect"
)
// Symbols defined in public import of google/protobuf/empty.proto.
type Empty = emptypb.Empty
var File_github_com_golang_protobuf_ptypes_empty_empty_proto protoreflect.FileDescriptor
var file_github_com_golang_protobuf_ptypes_empty_empty_proto_rawDesc = []byte{
0x0a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c,
0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79,
0x70, 0x65, 0x73, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
0x2f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3b, 0x65, 0x6d,
0x70, 0x74, 0x79, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var file_github_com_golang_protobuf_ptypes_empty_empty_proto_goTypes = []interface{}{}
var file_github_com_golang_protobuf_ptypes_empty_empty_proto_depIdxs = []int32{
0, // [0:0] is the sub-list for method output_type
0, // [0:0] is the sub-list for method input_type
0, // [0:0] is the sub-list for extension type_name
0, // [0:0] is the sub-list for extension extendee
0, // [0:0] is the sub-list for field type_name
}
func init() { file_github_com_golang_protobuf_ptypes_empty_empty_proto_init() }
func file_github_com_golang_protobuf_ptypes_empty_empty_proto_init() {
if File_github_com_golang_protobuf_ptypes_empty_empty_proto != nil {
return
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_github_com_golang_protobuf_ptypes_empty_empty_proto_rawDesc,
NumEnums: 0,
NumMessages: 0,
NumExtensions: 0,
NumServices: 0,
},
GoTypes: file_github_com_golang_protobuf_ptypes_empty_empty_proto_goTypes,
DependencyIndexes: file_github_com_golang_protobuf_ptypes_empty_empty_proto_depIdxs,
}.Build()
File_github_com_golang_protobuf_ptypes_empty_empty_proto = out.File
file_github_com_golang_protobuf_ptypes_empty_empty_proto_rawDesc = nil
file_github_com_golang_protobuf_ptypes_empty_empty_proto_goTypes = nil
file_github_com_golang_protobuf_ptypes_empty_empty_proto_depIdxs = nil
}
+2 -2
View File
@@ -42,7 +42,7 @@ func NewDCESecurity(domain Domain, id uint32) (UUID, error) {
// NewDCEPerson returns a DCE Security (Version 2) UUID in the person
// domain with the id returned by os.Getuid.
//
// NewDCESecurity(Person, uint32(os.Getuid()))
// NewDCESecurity(Person, uint32(os.Getuid()))
func NewDCEPerson() (UUID, error) {
return NewDCESecurity(Person, uint32(os.Getuid()))
}
@@ -50,7 +50,7 @@ func NewDCEPerson() (UUID, error) {
// NewDCEGroup returns a DCE Security (Version 2) UUID in the group
// domain with the id returned by os.Getgid.
//
// NewDCESecurity(Group, uint32(os.Getgid()))
// NewDCESecurity(Group, uint32(os.Getgid()))
func NewDCEGroup() (UUID, error) {
return NewDCESecurity(Group, uint32(os.Getgid()))
}
+2 -2
View File
@@ -45,7 +45,7 @@ func NewHash(h hash.Hash, space UUID, data []byte, version int) UUID {
// NewMD5 returns a new MD5 (Version 3) UUID based on the
// supplied name space and data. It is the same as calling:
//
// NewHash(md5.New(), space, data, 3)
// NewHash(md5.New(), space, data, 3)
func NewMD5(space UUID, data []byte) UUID {
return NewHash(md5.New(), space, data, 3)
}
@@ -53,7 +53,7 @@ func NewMD5(space UUID, data []byte) UUID {
// NewSHA1 returns a new SHA1 (Version 5) UUID based on the
// supplied name space and data. It is the same as calling:
//
// NewHash(sha1.New(), space, data, 5)
// NewHash(sha1.New(), space, data, 5)
func NewSHA1(space UUID, data []byte) UUID {
return NewHash(sha1.New(), space, data, 5)
}
-1
View File
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build js
// +build js
package uuid
-1
View File
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build !js
// +build !js
package uuid
+9 -8
View File
@@ -17,14 +17,15 @@ var jsonNull = []byte("null")
// NullUUID implements the SQL driver.Scanner interface so
// it can be used as a scan destination:
//
// var u uuid.NullUUID
// err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&u)
// ...
// if u.Valid {
// // use u.UUID
// } else {
// // NULL value
// }
// var u uuid.NullUUID
// err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&u)
// ...
// if u.Valid {
// // use u.UUID
// } else {
// // NULL value
// }
//
type NullUUID struct {
UUID UUID
Valid bool // Valid is true if UUID is not NULL
+4 -6
View File
@@ -187,12 +187,10 @@ func Must(uuid UUID, err error) UUID {
}
// Validate returns an error if s is not a properly formatted UUID in one of the following formats:
//
// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
//
// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
// It returns an error if the format is invalid, otherwise nil.
func Validate(s string) error {
switch len(s) {
+7 -7
View File
@@ -9,7 +9,7 @@ import "io"
// New creates a new random UUID or panics. New is equivalent to
// the expression
//
// uuid.Must(uuid.NewRandom())
// uuid.Must(uuid.NewRandom())
func New() UUID {
return Must(NewRandom())
}
@@ -17,7 +17,7 @@ func New() UUID {
// NewString creates a new random UUID and returns it as a string or panics.
// NewString is equivalent to the expression
//
// uuid.New().String()
// uuid.New().String()
func NewString() string {
return Must(NewRandom()).String()
}
@@ -31,11 +31,11 @@ func NewString() string {
//
// A note about uniqueness derived from the UUID Wikipedia entry:
//
// Randomly generated UUIDs have 122 random bits. One's annual risk of being
// hit by a meteorite is estimated to be one chance in 17 billion, that
// means the probability is about 0.00000000006 (6 × 1011),
// equivalent to the odds of creating a few tens of trillions of UUIDs in a
// year and having one duplicate.
// Randomly generated UUIDs have 122 random bits. One's annual risk of being
// hit by a meteorite is estimated to be one chance in 17 billion, that
// means the probability is about 0.00000000006 (6 × 1011),
// equivalent to the odds of creating a few tens of trillions of UUIDs in a
// year and having one duplicate.
func NewRandom() (UUID, error) {
if !poolEnabled {
return NewRandomFromReader(rander)
+3 -4
View File
@@ -19,11 +19,10 @@ var typeSQLScanner = reflect.TypeOf((*sql.Scanner)(nil)).Elem()
// slice of any dimension.
//
// For example:
// db.Query(`SELECT * FROM t WHERE id = ANY($1)`, pq.Array([]int{235, 401}))
//
// db.Query(`SELECT * FROM t WHERE id = ANY($1)`, pq.Array([]int{235, 401}))
//
// var x []sql.NullInt64
// db.QueryRow(`SELECT ARRAY[235, 401]`).Scan(pq.Array(&x))
// var x []sql.NullInt64
// db.QueryRow(`SELECT ARRAY[235, 401]`).Scan(pq.Array(&x))
//
// Scanning multi-dimensional arrays is not supported. Arrays where the lower
// bound is not one (such as `[0:0]={1}') are not supported.
+59 -46
View File
@@ -27,7 +27,9 @@ You can also connect to a database using a URL. For example:
connStr := "postgres://pqgotest:password@localhost/pqgotest?sslmode=verify-full"
db, err := sql.Open("postgres", connStr)
# Connection String Parameters
Connection String Parameters
Similarly to libpq, when establishing a connection using pq you are expected to
supply a connection string containing zero or more parameters.
@@ -40,42 +42,42 @@ them in the options parameter.
For compatibility with libpq, the following special connection parameters are
supported:
- dbname - The name of the database to connect to
- user - The user to sign in as
- password - The user's password
- host - The host to connect to. Values that start with / are for unix
domain sockets. (default is localhost)
- port - The port to bind to. (default is 5432)
- sslmode - Whether or not to use SSL (default is require, this is not
the default for libpq)
- fallback_application_name - An application_name to fall back to if one isn't provided.
- connect_timeout - Maximum wait for connection, in seconds. Zero or
not specified means wait indefinitely.
- sslcert - Cert file location. The file must contain PEM encoded data.
- sslkey - Key file location. The file must contain PEM encoded data.
- sslrootcert - The location of the root certificate file. The file
must contain PEM encoded data.
* dbname - The name of the database to connect to
* user - The user to sign in as
* password - The user's password
* host - The host to connect to. Values that start with / are for unix
domain sockets. (default is localhost)
* port - The port to bind to. (default is 5432)
* sslmode - Whether or not to use SSL (default is require, this is not
the default for libpq)
* fallback_application_name - An application_name to fall back to if one isn't provided.
* connect_timeout - Maximum wait for connection, in seconds. Zero or
not specified means wait indefinitely.
* sslcert - Cert file location. The file must contain PEM encoded data.
* sslkey - Key file location. The file must contain PEM encoded data.
* sslrootcert - The location of the root certificate file. The file
must contain PEM encoded data.
Valid values for sslmode are:
- disable - No SSL
- require - Always SSL (skip verification)
- verify-ca - Always SSL (verify that the certificate presented by the
server was signed by a trusted CA)
- verify-full - Always SSL (verify that the certification presented by
the server was signed by a trusted CA and the server host name
matches the one in the certificate)
* disable - No SSL
* require - Always SSL (skip verification)
* verify-ca - Always SSL (verify that the certificate presented by the
server was signed by a trusted CA)
* verify-full - Always SSL (verify that the certification presented by
the server was signed by a trusted CA and the server host name
matches the one in the certificate)
See http://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING
for more information about connection string parameters.
Use single quotes for values that contain whitespace:
"user=pqgotest password='with spaces'"
"user=pqgotest password='with spaces'"
A backslash will escape the next character in values:
"user=space\ man password='it\'s valid'"
"user=space\ man password='it\'s valid'"
Note that the connection parameter client_encoding (which sets the
text encoding for the connection) may be set but must be "UTF8",
@@ -96,7 +98,9 @@ provided connection parameters.
The pgpass mechanism as described in http://www.postgresql.org/docs/current/static/libpq-pgpass.html
is supported, but on Windows PGPASSFILE must be specified explicitly.
# Queries
Queries
database/sql does not dictate any specific format for parameter
markers in query strings, and pq uses the Postgres-native ordinal markers,
@@ -121,7 +125,9 @@ For more details on RETURNING, see the Postgres documentation:
For additional instructions on querying see the documentation for the database/sql package.
# Data Types
Data Types
Parameters pass through driver.DefaultParameterConverter before they are handled
by this package. When the binary_parameters connection option is enabled,
@@ -129,27 +135,30 @@ by this package. When the binary_parameters connection option is enabled,
This package returns the following types for values from the PostgreSQL backend:
- integer types smallint, integer, and bigint are returned as int64
- floating-point types real and double precision are returned as float64
- character types char, varchar, and text are returned as string
- temporal types date, time, timetz, timestamp, and timestamptz are
returned as time.Time
- the boolean type is returned as bool
- the bytea type is returned as []byte
- integer types smallint, integer, and bigint are returned as int64
- floating-point types real and double precision are returned as float64
- character types char, varchar, and text are returned as string
- temporal types date, time, timetz, timestamp, and timestamptz are
returned as time.Time
- the boolean type is returned as bool
- the bytea type is returned as []byte
All other types are returned directly from the backend as []byte values in text format.
# Errors
Errors
pq may return errors of type *pq.Error which can be interrogated for error details:
if err, ok := err.(*pq.Error); ok {
fmt.Println("pq error:", err.Code.Name())
}
if err, ok := err.(*pq.Error); ok {
fmt.Println("pq error:", err.Code.Name())
}
See the pq.Error type for details.
# Bulk imports
Bulk imports
You can perform bulk imports by preparing a statement returned by pq.CopyIn (or
pq.CopyInSchema) in an explicit transaction (sql.Tx). The returned statement
@@ -197,7 +206,9 @@ Usage example:
log.Fatal(err)
}
# Notifications
Notifications
PostgreSQL supports a simple publish/subscribe model over database
connections. See http://www.postgresql.org/docs/current/static/sql-notify.html
@@ -230,7 +241,9 @@ bytes by the PostgreSQL server.
You can find a complete, working example of Listener usage at
https://godoc.org/github.com/lib/pq/example/listen.
# Kerberos Support
Kerberos Support
If you need support for Kerberos authentication, add the following to your main
package:
@@ -246,10 +259,10 @@ don't have to download unnecessary dependencies.
When imported, additional connection string parameters are supported:
- krbsrvname - GSS (Kerberos) service name when constructing the
SPN (default is `postgres`). This will be combined with the host
to form the full SPN: `krbsrvname/host`.
- krbspn - GSS (Kerberos) SPN. This takes priority over
`krbsrvname` if present.
* krbsrvname - GSS (Kerberos) service name when constructing the
SPN (default is `postgres`). This will be combined with the host
to form the full SPN: `krbsrvname/host`.
* krbspn - GSS (Kerberos) SPN. This takes priority over
`krbsrvname` if present.
*/
package pq
+11 -11
View File
@@ -330,11 +330,11 @@ func (l *ListenerConn) sendSimpleQuery(q string) (err error) {
// ExecSimpleQuery executes a "simple query" (i.e. one with no bindable
// parameters) on the connection. The possible return values are:
// 1. "executed" is true; the query was executed to completion on the
// database server. If the query failed, err will be set to the error
// returned by the database, otherwise err will be nil.
// 2. If "executed" is false, the query could not be executed on the remote
// server. err will be non-nil.
// 1) "executed" is true; the query was executed to completion on the
// database server. If the query failed, err will be set to the error
// returned by the database, otherwise err will be nil.
// 2) If "executed" is false, the query could not be executed on the remote
// server. err will be non-nil.
//
// After a call to ExecSimpleQuery has returned an executed=false value, the
// connection has either been closed or will be closed shortly thereafter, and
@@ -541,12 +541,12 @@ func (l *Listener) NotificationChannel() <-chan *Notification {
// connection can not be re-established.
//
// Listen will only fail in three conditions:
// 1. The channel is already open. The returned error will be
// ErrChannelAlreadyOpen.
// 2. The query was executed on the remote server, but PostgreSQL returned an
// error message in response to the query. The returned error will be a
// pq.Error containing the information the server supplied.
// 3. Close is called on the Listener before the request could be completed.
// 1) The channel is already open. The returned error will be
// ErrChannelAlreadyOpen.
// 2) The query was executed on the remote server, but PostgreSQL returned an
// error message in response to the query. The returned error will be a
// pq.Error containing the information the server supplied.
// 3) Close is called on the Listener before the request could be completed.
//
// The channel name is case-sensitive.
func (l *Listener) Listen(channel string) error {
+14 -11
View File
@@ -25,6 +25,7 @@
// Package scram implements a SCRAM-{SHA-1,etc} client per RFC5802.
//
// http://tools.ietf.org/html/rfc5802
//
package scram
import (
@@ -42,16 +43,17 @@ import (
//
// A Client may be used within a SASL conversation with logic resembling:
//
// var in []byte
// var client = scram.NewClient(sha1.New, user, pass)
// for client.Step(in) {
// out := client.Out()
// // send out to server
// in := serverOut
// }
// if client.Err() != nil {
// // auth failed
// }
// var in []byte
// var client = scram.NewClient(sha1.New, user, pass)
// for client.Step(in) {
// out := client.Out()
// // send out to server
// in := serverOut
// }
// if client.Err() != nil {
// // auth failed
// }
//
type Client struct {
newHash func() hash.Hash
@@ -71,7 +73,8 @@ type Client struct {
//
// For SCRAM-SHA-256, for example, use:
//
// client := scram.NewClient(sha256.New, user, pass)
// client := scram.NewClient(sha256.New, user, pass)
//
func NewClient(newHash func() hash.Hash, user, pass string) *Client {
c := &Client{
newHash: newHash,
+1 -1
View File
@@ -30,7 +30,7 @@ import (
//
// The following is an example of the contents of Digest types:
//
// sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc
// sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc
//
// This allows to abstract the digest behind this type and work only in those
// terms.
+6 -5
View File
@@ -19,16 +19,16 @@
// More importantly, it provides tools and wrappers to work with
// hash.Hash-based digests with little effort.
//
// # Basics
// Basics
//
// The format of a digest is simply a string with two parts, dubbed the
// "algorithm" and the "digest", separated by a colon:
//
// <algorithm>:<digest>
// <algorithm>:<digest>
//
// An example of a sha256 digest representation follows:
//
// sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc
// sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc
//
// The "algorithm" portion defines both the hashing algorithm used to calculate
// the digest and the encoding of the resulting digest, which defaults to "hex"
@@ -42,7 +42,7 @@
// obtained, comparisons are cheap, quick and simple to express with the
// standard equality operator.
//
// # Verification
// Verification
//
// The main benefit of using the Digest type is simple verification against a
// given digest. The Verifier interface, modeled after the stdlib hash.Hash
@@ -50,7 +50,7 @@
// writing is complete, calling the Verifier.Verified method will indicate
// whether or not the stream of bytes matches the target digest.
//
// # Missing Features
// Missing Features
//
// In addition to the above, we intend to add the following features to this
// package:
@@ -58,4 +58,5 @@
// 1. A Digester type that supports write sink digest calculation.
//
// 2. Suspend and resume of ongoing digest calculations to support efficient digest verification in the registry.
//
package digest
+1
View File
@@ -20,3 +20,4 @@ type anyArgument struct{}
func (a anyArgument) Match(_ interface{}) bool {
return true
}
+37 -37
View File
@@ -2,89 +2,89 @@
//
// The traditional error handling idiom in Go is roughly akin to
//
// if err != nil {
// return err
// }
// if err != nil {
// return err
// }
//
// which when applied recursively up the call stack results in error reports
// without context or debugging information. The errors package allows
// programmers to add context to the failure path in their code in a way
// that does not destroy the original value of the error.
//
// # Adding context to an error
// Adding context to an error
//
// The errors.Wrap function returns a new error that adds context to the
// original error by recording a stack trace at the point Wrap is called,
// together with the supplied message. For example
//
// _, err := ioutil.ReadAll(r)
// if err != nil {
// return errors.Wrap(err, "read failed")
// }
// _, err := ioutil.ReadAll(r)
// if err != nil {
// return errors.Wrap(err, "read failed")
// }
//
// If additional control is required, the errors.WithStack and
// errors.WithMessage functions destructure errors.Wrap into its component
// operations: annotating an error with a stack trace and with a message,
// respectively.
//
// # Retrieving the cause of an error
// Retrieving the cause of an error
//
// Using errors.Wrap constructs a stack of errors, adding context to the
// preceding error. Depending on the nature of the error it may be necessary
// to reverse the operation of errors.Wrap to retrieve the original error
// for inspection. Any error value which implements this interface
//
// type causer interface {
// Cause() error
// }
// type causer interface {
// Cause() error
// }
//
// can be inspected by errors.Cause. errors.Cause will recursively retrieve
// the topmost error that does not implement causer, which is assumed to be
// the original cause. For example:
//
// switch err := errors.Cause(err).(type) {
// case *MyError:
// // handle specifically
// default:
// // unknown error
// }
// switch err := errors.Cause(err).(type) {
// case *MyError:
// // handle specifically
// default:
// // unknown error
// }
//
// Although the causer interface is not exported by this package, it is
// considered a part of its stable public interface.
//
// # Formatted printing of errors
// Formatted printing of errors
//
// All error values returned from this package implement fmt.Formatter and can
// be formatted by the fmt package. The following verbs are supported:
//
// %s print the error. If the error has a Cause it will be
// printed recursively.
// %v see %s
// %+v extended format. Each Frame of the error's StackTrace will
// be printed in detail.
// %s print the error. If the error has a Cause it will be
// printed recursively.
// %v see %s
// %+v extended format. Each Frame of the error's StackTrace will
// be printed in detail.
//
// # Retrieving the stack trace of an error or wrapper
// Retrieving the stack trace of an error or wrapper
//
// New, Errorf, Wrap, and Wrapf record a stack trace at the point they are
// invoked. This information can be retrieved with the following interface:
//
// type stackTracer interface {
// StackTrace() errors.StackTrace
// }
// type stackTracer interface {
// StackTrace() errors.StackTrace
// }
//
// The returned errors.StackTrace type is defined as
//
// type StackTrace []Frame
// type StackTrace []Frame
//
// The Frame type represents a call site in the stack trace. Frame supports
// the fmt.Formatter interface that can be used for printing information about
// the stack trace of this error. For example:
//
// if err, ok := err.(stackTracer); ok {
// for _, f := range err.StackTrace() {
// fmt.Printf("%+s:%d\n", f, f)
// }
// }
// if err, ok := err.(stackTracer); ok {
// for _, f := range err.StackTrace() {
// fmt.Printf("%+s:%d\n", f, f)
// }
// }
//
// Although the stackTracer interface is not exported by this package, it is
// considered a part of its stable public interface.
@@ -265,9 +265,9 @@ func (w *withMessage) Format(s fmt.State, verb rune) {
// An error value has a cause if it implements the following
// interface:
//
// type causer interface {
// Cause() error
// }
// type causer interface {
// Cause() error
// }
//
// If the error does not implement Cause, the original error will
// be returned. If the error is nil, nil will be returned without further

Some files were not shown because too many files have changed in this diff Show More