Add user store tests
This commit is contained in:
parent
143c3a8b81
commit
5d82d485c8
37 changed files with 3674 additions and 3 deletions
2
go.mod
2
go.mod
|
@ -5,11 +5,13 @@ go 1.17
|
|||
require (
|
||||
github.com/Masterminds/squirrel v1.5.0
|
||||
github.com/google/uuid v1.3.0
|
||||
github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428
|
||||
github.com/mattn/go-sqlite3 v1.14.8
|
||||
github.com/stretchr/testify v1.7.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/corpix/uarand v0.1.1 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect
|
||||
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect
|
||||
|
|
12
go.sum
12
go.sum
|
@ -1,24 +1,36 @@
|
|||
github.com/Masterminds/glide v0.13.2/go.mod h1:STyF5vcenH/rUqTEv+/hBXlSTo7KYwg2oc2f4tzPWic=
|
||||
github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
|
||||
github.com/Masterminds/squirrel v1.5.0 h1:JukIZisrUXadA9pl3rMkjhiamxiB0cXiu+HGp/Y8cY8=
|
||||
github.com/Masterminds/squirrel v1.5.0/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10=
|
||||
github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA=
|
||||
github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA=
|
||||
github.com/corpix/uarand v0.1.1 h1:RMr1TWc9F4n5jiPDzFHtmaUXLKLNUFK0SgCLo4BhX/U=
|
||||
github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ0/FNU=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428 h1:Mo9W14pwbO9VfRe+ygqZ8dFbPpoIK1HFrG/zjTuQ+nc=
|
||||
github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo=
|
||||
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw=
|
||||
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o=
|
||||
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk=
|
||||
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw=
|
||||
github.com/mattn/go-sqlite3 v1.14.8 h1:gDp86IdQsN/xWjIEmr9MF6o9mpksUgh0fu+9ByFxzIU=
|
||||
github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
|
|
@ -29,13 +29,13 @@ func NewStore(path string) (*Store, error) {
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
s.Conn = conn
|
||||
|
||||
if err := s.EnsureSchema(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
s.Conn = conn
|
||||
|
||||
// init stores
|
||||
s.userStore = NewUserStore(s)
|
||||
|
||||
return s, nil
|
||||
|
|
40
services/store/testlib.go
Normal file
40
services/store/testlib.go
Normal file
|
@ -0,0 +1,40 @@
|
|||
package store
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"git.ctrlz.es/mgdelacroix/rmsn/model"
|
||||
|
||||
"github.com/icrowley/fake"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
type TestHelper struct {
|
||||
t *testing.T
|
||||
store *Store
|
||||
}
|
||||
|
||||
func NewTestHelper(t *testing.T) (*TestHelper, func()) {
|
||||
s, err := NewStore(":memory:")
|
||||
require.NoError(t, err)
|
||||
|
||||
teardown := func() {
|
||||
require.NoError(t, s.Close())
|
||||
}
|
||||
|
||||
return &TestHelper{t: t, store: s}, teardown
|
||||
}
|
||||
|
||||
func (th *TestHelper) NewUser() *model.User {
|
||||
user := &model.User{
|
||||
Name: fake.FullName(),
|
||||
Mail: fake.EmailAddress(),
|
||||
Username: fake.UserName(),
|
||||
Password: fake.SimplePassword(),
|
||||
}
|
||||
|
||||
newUser, err := th.store.User().Create(user)
|
||||
require.NoError(th.t, err)
|
||||
|
||||
return newUser
|
||||
}
|
|
@ -70,7 +70,7 @@ func (us *UserStore) GetByID(id int) (*model.User, error) {
|
|||
|
||||
func (us *UserStore) Create(user *model.User) (*model.User, error) {
|
||||
query := us.Q().Insert("users").
|
||||
Columns(userColumns[0:len(userColumns)-1]...).
|
||||
Columns(userColumns[1:]...).
|
||||
Values(user.Name, user.Mail, user.Username, user.Password)
|
||||
|
||||
res, err := query.Exec()
|
||||
|
|
44
services/store/user_test.go
Normal file
44
services/store/user_test.go
Normal file
|
@ -0,0 +1,44 @@
|
|||
package store
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"git.ctrlz.es/mgdelacroix/rmsn/model"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestCreateUser(t *testing.T) {
|
||||
th, teardown := NewTestHelper(t)
|
||||
defer teardown()
|
||||
|
||||
user := &model.User{
|
||||
Name: "John",
|
||||
Mail: "john_doe@example.com",
|
||||
Username: "john_doe",
|
||||
Password: "mysupersecret",
|
||||
}
|
||||
|
||||
newUser, err := th.store.User().Create(user)
|
||||
require.NoError(t, err)
|
||||
require.NotZero(t, newUser.ID)
|
||||
require.Equal(t, user.Name, newUser.Name)
|
||||
require.Equal(t, user.Mail, newUser.Mail)
|
||||
require.Equal(t, user.Username, newUser.Username)
|
||||
require.Equal(t, user.Password, newUser.Password)
|
||||
}
|
||||
|
||||
func TestGetByID(t *testing.T) {
|
||||
th, teardown := NewTestHelper(t)
|
||||
defer teardown()
|
||||
|
||||
user := th.NewUser()
|
||||
|
||||
user2, err := th.store.User().GetByID(user.ID)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, user.ID, user2.ID)
|
||||
require.Equal(t, user.Name, user2.Name)
|
||||
require.Equal(t, user.Mail, user2.Mail)
|
||||
require.Equal(t, user.Username, user2.Username)
|
||||
require.Equal(t, user.Password, user2.Password)
|
||||
}
|
2
vendor/github.com/corpix/uarand/.gitignore
generated
vendored
Normal file
2
vendor/github.com/corpix/uarand/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
/build
|
||||
*~
|
3
vendor/github.com/corpix/uarand/.travis.yml
generated
vendored
Normal file
3
vendor/github.com/corpix/uarand/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
language: nix
|
||||
|
||||
script: nix-shell --pure --command "make lint test"
|
24
vendor/github.com/corpix/uarand/LICENSE
generated
vendored
Normal file
24
vendor/github.com/corpix/uarand/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,24 @@
|
|||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
distribute this software, either in source code form or as a compiled
|
||||
binary, for any purpose, commercial or non-commercial, and by any
|
||||
means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors
|
||||
of this software dedicate any and all copyright interest in the
|
||||
software to the public domain. We make this dedication for the benefit
|
||||
of the public at large and to the detriment of our heirs and
|
||||
successors. We intend this dedication to be an overt act of
|
||||
relinquishment in perpetuity of all present and future rights to this
|
||||
software under copyright law.
|
||||
|
||||
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 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.
|
||||
|
||||
For more information, please refer to <http://unlicense.org/>
|
32
vendor/github.com/corpix/uarand/Makefile
generated
vendored
Normal file
32
vendor/github.com/corpix/uarand/Makefile
generated
vendored
Normal file
|
@ -0,0 +1,32 @@
|
|||
.DEFAULT_GOAL = all
|
||||
|
||||
version := $(shell git rev-list --count HEAD).$(shell git rev-parse --short HEAD)
|
||||
|
||||
name := uarand
|
||||
package := github.com/corpix/$(name)
|
||||
|
||||
.PHONY: all
|
||||
all:: useragents.go
|
||||
|
||||
.PHONY: test
|
||||
test:
|
||||
go test -v ./...
|
||||
|
||||
.PHONY: lint
|
||||
lint:
|
||||
.PHONY: lint
|
||||
lint:
|
||||
golangci-lint --color=always \
|
||||
--exclude='uses unkeyed fields' \
|
||||
--exclude='type .* is unused' \
|
||||
--exclude='should merge variable declaration with assignment on next line' \
|
||||
--deadline=120s \
|
||||
run ./...
|
||||
|
||||
.PHONY: check
|
||||
check: lint test
|
||||
|
||||
.PHONY: useragents.go
|
||||
useragents.go:
|
||||
./scripts/fetch-user-agents | ./scripts/generate-useragents-go $(name) > $@
|
||||
go fmt $@
|
38
vendor/github.com/corpix/uarand/README.md
generated
vendored
Normal file
38
vendor/github.com/corpix/uarand/README.md
generated
vendored
Normal file
|
@ -0,0 +1,38 @@
|
|||
uarand
|
||||
----------------
|
||||
|
||||
[![Build Status](https://travis-ci.org/corpix/uarand.svg?branch=master)](https://travis-ci.org/corpix/uarand)
|
||||
|
||||
Random user-agent producer for go.
|
||||
|
||||
## Example
|
||||
|
||||
``` go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/corpix/uarand"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println(uarand.GetRandom())
|
||||
}
|
||||
```
|
||||
|
||||
Save it to `snippet.go` and run:
|
||||
|
||||
``` shell
|
||||
go run snippet.go
|
||||
```
|
||||
|
||||
Which should produce something similar to:
|
||||
|
||||
``` text
|
||||
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
[Unlicense](https://unlicense.org/)
|
17
vendor/github.com/corpix/uarand/shell.nix
generated
vendored
Normal file
17
vendor/github.com/corpix/uarand/shell.nix
generated
vendored
Normal file
|
@ -0,0 +1,17 @@
|
|||
let
|
||||
nixpkgs = builtins.fetchTarball {
|
||||
url = "https://github.com/nixos/nixpkgs/archive/ddf38a8241089d79c3bcd1777781b6438ab88d84.tar.gz";
|
||||
sha256 = "0fjk69mn58h0gjzgxgnkfkhhf1l707bg2cn4823ma9xbjxbhl0ya";
|
||||
};
|
||||
in with import nixpkgs {};
|
||||
stdenv.mkDerivation {
|
||||
name = "nix-shell";
|
||||
buildInputs = [
|
||||
coreutils bashInteractive jq curl gcc git gnumake
|
||||
go golangci-lint cacert openssl
|
||||
];
|
||||
shellHook = ''
|
||||
unset GOPATH
|
||||
export NIX_PATH=nixpkgs=${nixpkgs}
|
||||
'';
|
||||
}
|
63
vendor/github.com/corpix/uarand/uarand.go
generated
vendored
Normal file
63
vendor/github.com/corpix/uarand/uarand.go
generated
vendored
Normal file
|
@ -0,0 +1,63 @@
|
|||
package uarand
|
||||
|
||||
import (
|
||||
"math/rand"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
// Default is the UARand with default settings.
|
||||
Default = New(
|
||||
rand.New(
|
||||
rand.NewSource(time.Now().UnixNano()),
|
||||
),
|
||||
)
|
||||
)
|
||||
|
||||
// Randomizer represents some entity which could provide us an entropy.
|
||||
type Randomizer interface {
|
||||
Seed(n int64)
|
||||
Intn(n int) int
|
||||
}
|
||||
|
||||
// UARand describes the user agent randomizer settings.
|
||||
type UARand struct {
|
||||
Randomizer
|
||||
UserAgents []string
|
||||
|
||||
mutex sync.Mutex
|
||||
}
|
||||
|
||||
// GetRandom returns a random user agent from UserAgents slice.
|
||||
func (u *UARand) GetRandom() string {
|
||||
u.mutex.Lock()
|
||||
n := u.Intn(len(u.UserAgents))
|
||||
u.mutex.Unlock()
|
||||
|
||||
return u.UserAgents[n]
|
||||
}
|
||||
|
||||
// GetRandom returns a random user agent from UserAgents slice.
|
||||
// This version is driven by Default configuration.
|
||||
func GetRandom() string {
|
||||
return Default.GetRandom()
|
||||
}
|
||||
|
||||
// New return UserAgent randomizer settings with default user-agents list
|
||||
func New(r Randomizer) *UARand {
|
||||
return &UARand{
|
||||
Randomizer: r,
|
||||
UserAgents: UserAgents,
|
||||
mutex: sync.Mutex{},
|
||||
}
|
||||
}
|
||||
|
||||
// NewWithCustomList return UserAgent randomizer settings with custom user-agents list
|
||||
func NewWithCustomList(userAgents []string) *UARand {
|
||||
return &UARand{
|
||||
Randomizer: rand.New(rand.NewSource(time.Now().UnixNano())),
|
||||
UserAgents: userAgents,
|
||||
mutex: sync.Mutex{},
|
||||
}
|
||||
}
|
1735
vendor/github.com/corpix/uarand/useragents.go
generated
vendored
Normal file
1735
vendor/github.com/corpix/uarand/useragents.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load diff
26
vendor/github.com/icrowley/fake/.gitignore
generated
vendored
Normal file
26
vendor/github.com/icrowley/fake/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1,26 @@
|
|||
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
||||
*.o
|
||||
*.a
|
||||
*.so
|
||||
|
||||
# Folders
|
||||
_obj
|
||||
_test
|
||||
/vendor
|
||||
|
||||
# Architecture specific extensions/prefixes
|
||||
*.[568vq]
|
||||
[568vq].out
|
||||
|
||||
*.cgo1.go
|
||||
*.cgo2.c
|
||||
_cgo_defun.c
|
||||
_cgo_gotypes.go
|
||||
_cgo_export.*
|
||||
|
||||
_testmain.go
|
||||
|
||||
*.exe
|
||||
*.test
|
||||
*.prof
|
||||
.DS_Store
|
11
vendor/github.com/icrowley/fake/.go-makefile.json
generated
vendored
Normal file
11
vendor/github.com/icrowley/fake/.go-makefile.json
generated
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"build_id_generator": "0x$(shell echo $(version) | sha1sum | awk '{print $$1}')",
|
||||
"host": "github.com",
|
||||
"include": [],
|
||||
"kind": "package",
|
||||
"name": "fake",
|
||||
"tool": [],
|
||||
"user": "icrowley",
|
||||
"version_generator": "$(shell git rev-list --count HEAD).$(shell git rev-parse --short HEAD)",
|
||||
"version_variable": "cli.version"
|
||||
}
|
11
vendor/github.com/icrowley/fake/.travis.yml
generated
vendored
Normal file
11
vendor/github.com/icrowley/fake/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
sudo: false
|
||||
language: go
|
||||
|
||||
go:
|
||||
- 1.6
|
||||
- 1.7
|
||||
- 1.8
|
||||
- master
|
||||
- tip
|
||||
|
||||
script: make test
|
22
vendor/github.com/icrowley/fake/LICENSE
generated
vendored
Normal file
22
vendor/github.com/icrowley/fake/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,22 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 Dmitry Afanasyev
|
||||
|
||||
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.
|
||||
|
48
vendor/github.com/icrowley/fake/Makefile
generated
vendored
Normal file
48
vendor/github.com/icrowley/fake/Makefile
generated
vendored
Normal file
|
@ -0,0 +1,48 @@
|
|||
.DEFAULT_GOAL = all
|
||||
|
||||
numcpus := $(shell cat /proc/cpuinfo | grep '^processor\s*:' | wc -l)
|
||||
version := $(shell git rev-list --count HEAD).$(shell git rev-parse --short HEAD)
|
||||
|
||||
name := fake
|
||||
package := github.com/icrowley/$(name)
|
||||
|
||||
.PHONY: all
|
||||
all:: dependencies
|
||||
|
||||
.PHONY: tools
|
||||
tools::
|
||||
@if [ ! -e "$(GOPATH)"/bin/glide ]; then go get github.com/Masterminds/glide; fi
|
||||
@if [ ! -e "$(GOPATH)"/bin/godef ]; then go get github.com/rogpeppe/godef; fi
|
||||
@if [ ! -e "$(GOPATH)"/bin/gocode ]; then go get github.com/nsf/gocode; fi
|
||||
@if [ ! -e "$(GOPATH)"/bin/gometalinter ]; then go get github.com/alecthomas/gometalinter && gometalinter --install; fi
|
||||
@if [ ! -e "$(GOPATH)"/src/github.com/stretchr/testify/assert ]; then go get github.com/stretchr/testify/assert; fi
|
||||
|
||||
.PHONY: dependencies
|
||||
dependencies:: tools
|
||||
glide install
|
||||
|
||||
.PHONY: clean
|
||||
clean:: tools
|
||||
glide cache-clear
|
||||
|
||||
.PHONY: test
|
||||
test:: dependencies
|
||||
go test -v \
|
||||
$(shell glide novendor)
|
||||
|
||||
.PHONY: bench
|
||||
bench:: dependencies
|
||||
go test \
|
||||
-bench=. -v \
|
||||
$(shell glide novendor)
|
||||
|
||||
.PHONY: lint
|
||||
lint:: dependencies
|
||||
go vet $(shell glide novendor)
|
||||
gometalinter \
|
||||
--deadline=5m \
|
||||
--concurrency=$(numcpus) \
|
||||
$(shell glide novendor)
|
||||
|
||||
.PHONY: check
|
||||
check:: lint test
|
90
vendor/github.com/icrowley/fake/README.md
generated
vendored
Normal file
90
vendor/github.com/icrowley/fake/README.md
generated
vendored
Normal file
|
@ -0,0 +1,90 @@
|
|||
[![Build Status](https://img.shields.io/travis/icrowley/fake.svg?style=flat)](https://travis-ci.org/icrowley/fake) [![Godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/icrowley/fake) [![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](https://raw.githubusercontent.com/icrowley/fake/master/LICENSE)
|
||||
|
||||
Fake
|
||||
====
|
||||
|
||||
Fake is a fake data generator for Go (Golang), heavily inspired by the forgery and ffaker Ruby gems.
|
||||
|
||||
## About
|
||||
|
||||
Most data and methods are ported from forgery/ffaker Ruby gems.
|
||||
For the list of available methods please look at https://godoc.org/github.com/icrowley/fake.
|
||||
Currently english and russian languages are available.
|
||||
|
||||
Fake embeds samples data files unless you call `UseExternalData(true)` in order to be able to work without external files dependencies when compiled, so, if you add new data files or make changes to existing ones don't forget to regenerate data.go file using `github.com/mjibson/esc` tool and `esc -o data.go -pkg fake data` command (or you can just use `go generate` command if you are using Go 1.4 or later).
|
||||
|
||||
## Install
|
||||
|
||||
```shell
|
||||
go get github.com/icrowley/fake
|
||||
```
|
||||
|
||||
## Import
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/icrowley/fake"
|
||||
)
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
Documentation can be found at godoc:
|
||||
|
||||
https://godoc.org/github.com/icrowley/fake
|
||||
|
||||
## Test
|
||||
To run the project tests:
|
||||
|
||||
```shell
|
||||
cd test
|
||||
go test
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
```go
|
||||
name := fake.FirstName()
|
||||
fullname := fake.FullName()
|
||||
product := fake.Product()
|
||||
```
|
||||
|
||||
Changing language:
|
||||
|
||||
```go
|
||||
err := fake.SetLang("ru")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
password := fake.SimplePassword()
|
||||
```
|
||||
|
||||
Using english fallback:
|
||||
|
||||
```go
|
||||
err := fake.SetLang("ru")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fake.EnFallback(true)
|
||||
password := fake.Paragraph()
|
||||
```
|
||||
|
||||
Using external data:
|
||||
|
||||
```go
|
||||
fake.UseExternalData(true)
|
||||
password := fake.Paragraph()
|
||||
```
|
||||
|
||||
### Author
|
||||
|
||||
Dmitry Afanasyev,
|
||||
http://twitter.com/i_crowley
|
||||
dimarzio1986@gmail.com
|
||||
|
||||
|
||||
### Maintainers
|
||||
|
||||
Dmitry Moskowski
|
||||
https://github.com/corpix
|
69
vendor/github.com/icrowley/fake/addresses.go
generated
vendored
Normal file
69
vendor/github.com/icrowley/fake/addresses.go
generated
vendored
Normal file
|
@ -0,0 +1,69 @@
|
|||
package fake
|
||||
|
||||
import "strconv"
|
||||
|
||||
// Continent generates random continent
|
||||
func Continent() string {
|
||||
return lookup(lang, "continents", true)
|
||||
}
|
||||
|
||||
// Country generates random country
|
||||
func Country() string {
|
||||
return lookup(lang, "countries", true)
|
||||
}
|
||||
|
||||
// City generates random city
|
||||
func City() string {
|
||||
city := lookup(lang, "cities", true)
|
||||
switch r.Intn(5) {
|
||||
case 0:
|
||||
return join(cityPrefix(), city)
|
||||
case 1:
|
||||
return join(city, citySuffix())
|
||||
default:
|
||||
return city
|
||||
}
|
||||
}
|
||||
|
||||
func cityPrefix() string {
|
||||
return lookup(lang, "city_prefixes", false)
|
||||
}
|
||||
|
||||
func citySuffix() string {
|
||||
return lookup(lang, "city_suffixes", false)
|
||||
}
|
||||
|
||||
// State generates random state
|
||||
func State() string {
|
||||
return lookup(lang, "states", false)
|
||||
}
|
||||
|
||||
// StateAbbrev generates random state abbreviation
|
||||
func StateAbbrev() string {
|
||||
return lookup(lang, "state_abbrevs", false)
|
||||
}
|
||||
|
||||
// Street generates random street name
|
||||
func Street() string {
|
||||
street := lookup(lang, "streets", true)
|
||||
return join(street, streetSuffix())
|
||||
}
|
||||
|
||||
// StreetAddress generates random street name along with building number
|
||||
func StreetAddress() string {
|
||||
return join(Street(), strconv.Itoa(r.Intn(100)))
|
||||
}
|
||||
|
||||
func streetSuffix() string {
|
||||
return lookup(lang, "street_suffixes", true)
|
||||
}
|
||||
|
||||
// Zip generates random zip code using one of the formats specifies in zip_format file
|
||||
func Zip() string {
|
||||
return generate(lang, "zips", true)
|
||||
}
|
||||
|
||||
// Phone generates random phone number using one of the formats format specified in phone_format file
|
||||
func Phone() string {
|
||||
return generate(lang, "phones", true)
|
||||
}
|
69
vendor/github.com/icrowley/fake/credit_cards.go
generated
vendored
Normal file
69
vendor/github.com/icrowley/fake/credit_cards.go
generated
vendored
Normal file
|
@ -0,0 +1,69 @@
|
|||
package fake
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type creditCard struct {
|
||||
vendor string
|
||||
length int
|
||||
prefixes []int
|
||||
}
|
||||
|
||||
var creditCards = map[string]creditCard{
|
||||
"visa": {"VISA", 16, []int{4539, 4556, 4916, 4532, 4929, 40240071, 4485, 4716, 4}},
|
||||
"mastercard": {"MasterCard", 16, []int{51, 52, 53, 54, 55}},
|
||||
"amex": {"American Express", 15, []int{34, 37}},
|
||||
"discover": {"Discover", 16, []int{6011}},
|
||||
}
|
||||
|
||||
// CreditCardType returns one of the following credit values:
|
||||
// VISA, MasterCard, American Express and Discover
|
||||
func CreditCardType() string {
|
||||
n := len(creditCards)
|
||||
var vendors []string
|
||||
for _, cc := range creditCards {
|
||||
vendors = append(vendors, cc.vendor)
|
||||
}
|
||||
|
||||
return vendors[r.Intn(n)]
|
||||
}
|
||||
|
||||
// CreditCardNum generated credit card number according to the card number rules
|
||||
func CreditCardNum(vendor string) string {
|
||||
if vendor != "" {
|
||||
vendor = strings.ToLower(vendor)
|
||||
} else {
|
||||
var vendors []string
|
||||
for v := range creditCards {
|
||||
vendors = append(vendors, v)
|
||||
}
|
||||
vendor = vendors[r.Intn(len(vendors))]
|
||||
}
|
||||
card := creditCards[vendor]
|
||||
prefix := strconv.Itoa(card.prefixes[r.Intn(len(card.prefixes))])
|
||||
num := []rune(prefix)
|
||||
for i := 0; i < card.length-len(prefix); i++ {
|
||||
num = append(num, genCCDigit(num))
|
||||
}
|
||||
return string(num)
|
||||
}
|
||||
|
||||
func genCCDigit(num []rune) rune {
|
||||
sum := 0
|
||||
for i := len(num) - 1; i >= 0; i-- {
|
||||
n := int(num[i])
|
||||
if i%2 != 0 {
|
||||
sum += n
|
||||
} else {
|
||||
if n*2 > 9 {
|
||||
sum += n*2 - 9
|
||||
} else {
|
||||
sum += n * 2
|
||||
}
|
||||
}
|
||||
}
|
||||
return rune(((sum/10+1)*10 - sum) % 10)
|
||||
}
|
11
vendor/github.com/icrowley/fake/currencies.go
generated
vendored
Normal file
11
vendor/github.com/icrowley/fake/currencies.go
generated
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
package fake
|
||||
|
||||
// Currency generates currency name
|
||||
func Currency() string {
|
||||
return lookup(lang, "currencies", true)
|
||||
}
|
||||
|
||||
// CurrencyCode generates currency code
|
||||
func CurrencyCode() string {
|
||||
return lookup(lang, "currency_codes", true)
|
||||
}
|
493
vendor/github.com/icrowley/fake/data.go
generated
vendored
Normal file
493
vendor/github.com/icrowley/fake/data.go
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
42
vendor/github.com/icrowley/fake/dates.go
generated
vendored
Normal file
42
vendor/github.com/icrowley/fake/dates.go
generated
vendored
Normal file
|
@ -0,0 +1,42 @@
|
|||
package fake
|
||||
|
||||
// Day generates day of the month
|
||||
func Day() int {
|
||||
return r.Intn(31) + 1
|
||||
}
|
||||
|
||||
// WeekDay generates name ot the week day
|
||||
func WeekDay() string {
|
||||
return lookup(lang, "weekdays", true)
|
||||
}
|
||||
|
||||
// WeekDayShort generates abbreviated name of the week day
|
||||
func WeekDayShort() string {
|
||||
return lookup(lang, "weekdays_short", true)
|
||||
}
|
||||
|
||||
// WeekdayNum generates number of the day of the week
|
||||
func WeekdayNum() int {
|
||||
return r.Intn(7) + 1
|
||||
}
|
||||
|
||||
// Month generates month name
|
||||
func Month() string {
|
||||
return lookup(lang, "months", true)
|
||||
}
|
||||
|
||||
// MonthShort generates abbreviated month name
|
||||
func MonthShort() string {
|
||||
return lookup(lang, "months_short", true)
|
||||
}
|
||||
|
||||
// MonthNum generates month number (from 1 to 12)
|
||||
func MonthNum() int {
|
||||
return r.Intn(12) + 1
|
||||
}
|
||||
|
||||
// Year generates year using the given boundaries
|
||||
func Year(from, to int) int {
|
||||
n := r.Intn(to-from) + 1
|
||||
return from + n
|
||||
}
|
214
vendor/github.com/icrowley/fake/fake.go
generated
vendored
Normal file
214
vendor/github.com/icrowley/fake/fake.go
generated
vendored
Normal file
|
@ -0,0 +1,214 @@
|
|||
/*
|
||||
Package fake is the fake data generatror for go (Golang), heavily inspired by forgery and ffaker Ruby gems
|
||||
|
||||
Most data and methods are ported from forgery/ffaker Ruby gems.
|
||||
|
||||
Currently english and russian languages are available.
|
||||
|
||||
For the list of available methods please look at https://godoc.org/github.com/icrowley/fake.
|
||||
|
||||
Fake embeds samples data files unless you call UseExternalData(true) in order to be able to work without external files dependencies when compiled, so, if you add new data files or make changes to existing ones don't forget to regenerate data.go file using github.com/mjibson/esc tool and esc -o data.go -pkg fake data command (or you can just use go generate command if you are using Go 1.4 or later).
|
||||
|
||||
Examples:
|
||||
name := fake.FirstName()
|
||||
fullname = := fake.FullName()
|
||||
product := fake.Product()
|
||||
|
||||
Changing language:
|
||||
err := fake.SetLang("ru")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
password := fake.SimplePassword()
|
||||
|
||||
Using english fallback:
|
||||
err := fake.SetLang("ru")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fake.EnFallback(true)
|
||||
password := fake.Paragraph()
|
||||
|
||||
Using external data:
|
||||
fake.UseExternalData(true)
|
||||
password := fake.Paragraph()
|
||||
*/
|
||||
package fake
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"math/rand"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
//go:generate go get github.com/mjibson/esc
|
||||
//go:generate esc -o data.go -pkg fake data
|
||||
|
||||
// cat/subcat/lang/samples
|
||||
type samplesTree map[string]map[string][]string
|
||||
|
||||
var samplesLock sync.Mutex
|
||||
var samplesCache = make(samplesTree)
|
||||
var r = rand.New(&rndSrc{src: rand.NewSource(time.Now().UnixNano())})
|
||||
var lang = "en"
|
||||
var useExternalData = false
|
||||
var enFallback = true
|
||||
var availLangs = GetLangs()
|
||||
|
||||
var (
|
||||
// ErrNoLanguageFn is the error that indicates that given language is not available
|
||||
ErrNoLanguageFn = func(lang string) error { return fmt.Errorf("The language passed (%s) is not available", lang) }
|
||||
// ErrNoSamplesFn is the error that indicates that there are no samples for the given language
|
||||
ErrNoSamplesFn = func(lang string) error { return fmt.Errorf("No samples found for language: %s", lang) }
|
||||
)
|
||||
|
||||
// Seed uses the provided seed value to initialize the internal PRNG to a
|
||||
// deterministic state.
|
||||
func Seed(seed int64) {
|
||||
r.Seed(seed)
|
||||
}
|
||||
|
||||
type rndSrc struct {
|
||||
mtx sync.Mutex
|
||||
src rand.Source
|
||||
}
|
||||
|
||||
func (s *rndSrc) Int63() int64 {
|
||||
s.mtx.Lock()
|
||||
n := s.src.Int63()
|
||||
s.mtx.Unlock()
|
||||
return n
|
||||
}
|
||||
|
||||
func (s *rndSrc) Seed(n int64) {
|
||||
s.mtx.Lock()
|
||||
s.src.Seed(n)
|
||||
s.mtx.Unlock()
|
||||
}
|
||||
|
||||
// GetLangs returns a slice of available languages
|
||||
func GetLangs() []string {
|
||||
var langs []string
|
||||
for k, v := range data {
|
||||
if v.isDir && k != "/" && k != "/data" {
|
||||
langs = append(langs, strings.Replace(k, "/data/", "", 1))
|
||||
}
|
||||
}
|
||||
return langs
|
||||
}
|
||||
|
||||
// SetLang sets the language in which the data should be generated
|
||||
// returns error if passed language is not available
|
||||
func SetLang(newLang string) error {
|
||||
found := false
|
||||
for _, l := range availLangs {
|
||||
if newLang == l {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
return ErrNoLanguageFn(newLang)
|
||||
}
|
||||
lang = newLang
|
||||
return nil
|
||||
}
|
||||
|
||||
// UseExternalData sets the flag that allows using of external files as data providers (fake uses embedded ones by default)
|
||||
func UseExternalData(flag bool) {
|
||||
useExternalData = flag
|
||||
}
|
||||
|
||||
// EnFallback sets the flag that allows fake to fallback to englsh samples if the ones for the used languaged are not available
|
||||
func EnFallback(flag bool) {
|
||||
enFallback = flag
|
||||
}
|
||||
|
||||
func (st samplesTree) hasKeyPath(lang, cat string) bool {
|
||||
if _, ok := st[lang]; ok {
|
||||
if _, ok = st[lang][cat]; ok {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func join(parts ...string) string {
|
||||
var filtered []string
|
||||
for _, part := range parts {
|
||||
if part != "" {
|
||||
filtered = append(filtered, part)
|
||||
}
|
||||
}
|
||||
return strings.Join(filtered, " ")
|
||||
}
|
||||
|
||||
func generate(lang, cat string, fallback bool) string {
|
||||
format := lookup(lang, cat+"_format", fallback)
|
||||
var result string
|
||||
for _, ru := range format {
|
||||
if ru != '#' {
|
||||
result += string(ru)
|
||||
} else {
|
||||
result += strconv.Itoa(r.Intn(10))
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func lookup(lang, cat string, fallback bool) string {
|
||||
samplesLock.Lock()
|
||||
s := _lookup(lang, cat, fallback)
|
||||
samplesLock.Unlock()
|
||||
return s
|
||||
}
|
||||
|
||||
func _lookup(lang, cat string, fallback bool) string {
|
||||
var samples []string
|
||||
|
||||
if samplesCache.hasKeyPath(lang, cat) {
|
||||
samples = samplesCache[lang][cat]
|
||||
} else {
|
||||
var err error
|
||||
samples, err = populateSamples(lang, cat)
|
||||
if err != nil {
|
||||
if lang != "en" && fallback && enFallback && err.Error() == ErrNoSamplesFn(lang).Error() {
|
||||
return _lookup("en", cat, false)
|
||||
}
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
return samples[r.Intn(len(samples))]
|
||||
}
|
||||
|
||||
func populateSamples(lang, cat string) ([]string, error) {
|
||||
data, err := readFile(lang, cat)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if _, ok := samplesCache[lang]; !ok {
|
||||
samplesCache[lang] = make(map[string][]string)
|
||||
}
|
||||
|
||||
samples := strings.Split(strings.TrimSpace(string(data)), "\n")
|
||||
|
||||
samplesCache[lang][cat] = samples
|
||||
return samples, nil
|
||||
}
|
||||
|
||||
func readFile(lang, cat string) ([]byte, error) {
|
||||
fullpath := fmt.Sprintf("/data/%s/%s", lang, cat)
|
||||
file, err := FS(useExternalData).Open(fullpath)
|
||||
if err != nil {
|
||||
return nil, ErrNoSamplesFn(lang)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
return ioutil.ReadAll(file)
|
||||
}
|
79
vendor/github.com/icrowley/fake/general.go
generated
vendored
Normal file
79
vendor/github.com/icrowley/fake/general.go
generated
vendored
Normal file
|
@ -0,0 +1,79 @@
|
|||
package fake
|
||||
|
||||
var lowerLetters = []rune("abcdefghijklmnopqrstuvwxyz")
|
||||
var upperLetters = []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
||||
var numeric = []rune("0123456789")
|
||||
var specialChars = []rune(`!'@#$%^&*()_+-=[]{};:",./?`)
|
||||
var hexDigits = []rune("0123456789abcdef")
|
||||
|
||||
func text(atLeast, atMost int, allowLower, allowUpper, allowNumeric, allowSpecial bool) string {
|
||||
allowedChars := []rune{}
|
||||
if allowLower {
|
||||
allowedChars = append(allowedChars, lowerLetters...)
|
||||
}
|
||||
if allowUpper {
|
||||
allowedChars = append(allowedChars, upperLetters...)
|
||||
}
|
||||
if allowNumeric {
|
||||
allowedChars = append(allowedChars, numeric...)
|
||||
}
|
||||
if allowSpecial {
|
||||
allowedChars = append(allowedChars, specialChars...)
|
||||
}
|
||||
|
||||
result := []rune{}
|
||||
nTimes := r.Intn(atMost-atLeast+1) + atLeast
|
||||
for i := 0; i < nTimes; i++ {
|
||||
result = append(result, allowedChars[r.Intn(len(allowedChars))])
|
||||
}
|
||||
return string(result)
|
||||
}
|
||||
|
||||
// Password generates password with the length from atLeast to atMOst charachers,
|
||||
// allow* parameters specify whether corresponding symbols can be used
|
||||
func Password(atLeast, atMost int, allowUpper, allowNumeric, allowSpecial bool) string {
|
||||
return text(atLeast, atMost, true, allowUpper, allowNumeric, allowSpecial)
|
||||
}
|
||||
|
||||
// SimplePassword is a wrapper around Password,
|
||||
// it generates password with the length from 6 to 12 symbols, with upper characters and numeric symbols allowed
|
||||
func SimplePassword() string {
|
||||
return Password(6, 12, true, true, false)
|
||||
}
|
||||
|
||||
// Color generates color name
|
||||
func Color() string {
|
||||
return lookup(lang, "colors", true)
|
||||
}
|
||||
|
||||
// DigitsN returns n digits as a string
|
||||
func DigitsN(n int) string {
|
||||
digits := make([]rune, n)
|
||||
for i := 0; i < n; i++ {
|
||||
digits[i] = numeric[r.Intn(len(numeric))]
|
||||
}
|
||||
return string(digits)
|
||||
}
|
||||
|
||||
// Digits returns from 1 to 5 digits as a string
|
||||
func Digits() string {
|
||||
return DigitsN(r.Intn(5) + 1)
|
||||
}
|
||||
|
||||
func hexDigitsStr(n int) string {
|
||||
var num []rune
|
||||
for i := 0; i < n; i++ {
|
||||
num = append(num, hexDigits[r.Intn(len(hexDigits))])
|
||||
}
|
||||
return string(num)
|
||||
}
|
||||
|
||||
// HexColor generates hex color name
|
||||
func HexColor() string {
|
||||
return hexDigitsStr(6)
|
||||
}
|
||||
|
||||
// HexColorShort generates short hex color name
|
||||
func HexColorShort() string {
|
||||
return hexDigitsStr(3)
|
||||
}
|
57
vendor/github.com/icrowley/fake/geo.go
generated
vendored
Normal file
57
vendor/github.com/icrowley/fake/geo.go
generated
vendored
Normal file
|
@ -0,0 +1,57 @@
|
|||
package fake
|
||||
|
||||
// Latitude generates latitude (from -90.0 to 90.0)
|
||||
func Latitude() float32 {
|
||||
return r.Float32()*180 - 90
|
||||
}
|
||||
|
||||
// LatitudeDegrees generates latitude degrees (from -90 to 90)
|
||||
func LatitudeDegrees() int {
|
||||
return r.Intn(180) - 90
|
||||
}
|
||||
|
||||
// LatitudeMinutes generates latitude minutes (from 0 to 60)
|
||||
func LatitudeMinutes() int {
|
||||
return r.Intn(60)
|
||||
}
|
||||
|
||||
// LatitudeSeconds generates latitude seconds (from 0 to 60)
|
||||
func LatitudeSeconds() int {
|
||||
return r.Intn(60)
|
||||
}
|
||||
|
||||
// LatitudeDirection generates latitude direction (N(orth) o S(outh))
|
||||
func LatitudeDirection() string {
|
||||
if r.Intn(2) == 0 {
|
||||
return "N"
|
||||
}
|
||||
return "S"
|
||||
}
|
||||
|
||||
// Longitude generates longitude (from -180 to 180)
|
||||
func Longitude() float32 {
|
||||
return r.Float32()*360 - 180
|
||||
}
|
||||
|
||||
// LongitudeDegrees generates longitude degrees (from -180 to 180)
|
||||
func LongitudeDegrees() int {
|
||||
return r.Intn(360) - 180
|
||||
}
|
||||
|
||||
// LongitudeMinutes generates (from 0 to 60)
|
||||
func LongitudeMinutes() int {
|
||||
return r.Intn(60)
|
||||
}
|
||||
|
||||
// LongitudeSeconds generates (from 0 to 60)
|
||||
func LongitudeSeconds() int {
|
||||
return r.Intn(60)
|
||||
}
|
||||
|
||||
// LongitudeDirection generates (W(est) or E(ast))
|
||||
func LongitudeDirection() string {
|
||||
if r.Intn(2) == 0 {
|
||||
return "W"
|
||||
}
|
||||
return "E"
|
||||
}
|
6
vendor/github.com/icrowley/fake/glide.lock
generated
vendored
Normal file
6
vendor/github.com/icrowley/fake/glide.lock
generated
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
hash: 9238b15272824ad573d8ef645fb468cb646b72598c63eae8977c3410ebfebe4a
|
||||
updated: 2017-07-23T15:10:00.972860398Z
|
||||
imports:
|
||||
- name: github.com/corpix/uarand
|
||||
version: 031be390f409fb4bac8fb299e3bcd101479f89f8
|
||||
testImports: []
|
3
vendor/github.com/icrowley/fake/glide.yaml
generated
vendored
Normal file
3
vendor/github.com/icrowley/fake/glide.yaml
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
package: github.com/icrowley/fake
|
||||
import:
|
||||
- package: github.com/corpix/uarand
|
77
vendor/github.com/icrowley/fake/internet.go
generated
vendored
Normal file
77
vendor/github.com/icrowley/fake/internet.go
generated
vendored
Normal file
|
@ -0,0 +1,77 @@
|
|||
package fake
|
||||
|
||||
import (
|
||||
"net"
|
||||
"strings"
|
||||
|
||||
"github.com/corpix/uarand"
|
||||
)
|
||||
|
||||
// UserName generates user name in one of the following forms
|
||||
// first name + last name, letter + last names or concatenation of from 1 to 3 lowercased words
|
||||
func UserName() string {
|
||||
gender := randGender()
|
||||
switch r.Intn(3) {
|
||||
case 0:
|
||||
return lookup("en", gender+"_first_names", false) + lookup(lang, gender+"_last_names", false)
|
||||
case 1:
|
||||
return Character() + lookup(lang, gender+"_last_names", false)
|
||||
default:
|
||||
return strings.Replace(WordsN(r.Intn(3)+1), " ", "_", -1)
|
||||
}
|
||||
}
|
||||
|
||||
// TopLevelDomain generates random top level domain
|
||||
func TopLevelDomain() string {
|
||||
return lookup(lang, "top_level_domains", true)
|
||||
}
|
||||
|
||||
// DomainName generates random domain name
|
||||
func DomainName() string {
|
||||
return Company() + "." + TopLevelDomain()
|
||||
}
|
||||
|
||||
// EmailAddress generates email address
|
||||
func EmailAddress() string {
|
||||
return UserName() + "@" + DomainName()
|
||||
}
|
||||
|
||||
// EmailSubject generates random email subject
|
||||
func EmailSubject() string {
|
||||
return Sentence()
|
||||
}
|
||||
|
||||
// EmailBody generates random email body
|
||||
func EmailBody() string {
|
||||
return Paragraphs()
|
||||
}
|
||||
|
||||
// DomainZone generates random domain zone
|
||||
func DomainZone() string {
|
||||
return lookup(lang, "domain_zones", true)
|
||||
}
|
||||
|
||||
// IPv4 generates IPv4 address
|
||||
func IPv4() string {
|
||||
size := 4
|
||||
ip := make([]byte, size)
|
||||
for i := 0; i < size; i++ {
|
||||
ip[i] = byte(r.Intn(256))
|
||||
}
|
||||
return net.IP(ip).To4().String()
|
||||
}
|
||||
|
||||
// IPv6 generates IPv6 address
|
||||
func IPv6() string {
|
||||
size := 16
|
||||
ip := make([]byte, size)
|
||||
for i := 0; i < size; i++ {
|
||||
ip[i] = byte(r.Intn(256))
|
||||
}
|
||||
return net.IP(ip).To16().String()
|
||||
}
|
||||
|
||||
// UserAgent generates a random user agent.
|
||||
func UserAgent() string {
|
||||
return uarand.GetRandom()
|
||||
}
|
25
vendor/github.com/icrowley/fake/jobs.go
generated
vendored
Normal file
25
vendor/github.com/icrowley/fake/jobs.go
generated
vendored
Normal file
|
@ -0,0 +1,25 @@
|
|||
package fake
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Company generates company name
|
||||
func Company() string {
|
||||
return lookup(lang, "companies", true)
|
||||
}
|
||||
|
||||
// JobTitle generates job title
|
||||
func JobTitle() string {
|
||||
job := lookup(lang, "jobs", true)
|
||||
return strings.Replace(job, "#{N}", jobTitleSuffix(), 1)
|
||||
}
|
||||
|
||||
func jobTitleSuffix() string {
|
||||
return lookup(lang, "jobs_suffixes", false)
|
||||
}
|
||||
|
||||
// Industry generates industry name
|
||||
func Industry() string {
|
||||
return lookup(lang, "industries", true)
|
||||
}
|
103
vendor/github.com/icrowley/fake/lorem_ipsum.go
generated
vendored
Normal file
103
vendor/github.com/icrowley/fake/lorem_ipsum.go
generated
vendored
Normal file
|
@ -0,0 +1,103 @@
|
|||
package fake
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Character generates random character in the given language
|
||||
func Character() string {
|
||||
return lookup(lang, "characters", true)
|
||||
}
|
||||
|
||||
// CharactersN generates n random characters in the given language
|
||||
func CharactersN(n int) string {
|
||||
var chars []string
|
||||
for i := 0; i < n; i++ {
|
||||
chars = append(chars, Character())
|
||||
}
|
||||
return strings.Join(chars, "")
|
||||
}
|
||||
|
||||
// Characters generates from 1 to 5 characters in the given language
|
||||
func Characters() string {
|
||||
return CharactersN(r.Intn(5) + 1)
|
||||
}
|
||||
|
||||
// Word generates random word
|
||||
func Word() string {
|
||||
return lookup(lang, "words", true)
|
||||
}
|
||||
|
||||
// WordsN generates n random words
|
||||
func WordsN(n int) string {
|
||||
words := make([]string, n)
|
||||
for i := 0; i < n; i++ {
|
||||
words[i] = Word()
|
||||
}
|
||||
return strings.Join(words, " ")
|
||||
}
|
||||
|
||||
// Words generates from 1 to 5 random words
|
||||
func Words() string {
|
||||
return WordsN(r.Intn(5) + 1)
|
||||
}
|
||||
|
||||
// Title generates from 2 to 5 titleized words
|
||||
func Title() string {
|
||||
return strings.ToTitle(WordsN(2 + r.Intn(4)))
|
||||
}
|
||||
|
||||
// Sentence generates random sentence
|
||||
func Sentence() string {
|
||||
var words []string
|
||||
for i := 0; i < 3+r.Intn(12); i++ {
|
||||
word := Word()
|
||||
if r.Intn(5) == 0 {
|
||||
word += ","
|
||||
}
|
||||
words = append(words, Word())
|
||||
}
|
||||
|
||||
sentence := strings.Join(words, " ")
|
||||
|
||||
if r.Intn(8) == 0 {
|
||||
sentence += "!"
|
||||
} else {
|
||||
sentence += "."
|
||||
}
|
||||
|
||||
return sentence
|
||||
}
|
||||
|
||||
// SentencesN generates n random sentences
|
||||
func SentencesN(n int) string {
|
||||
sentences := make([]string, n)
|
||||
for i := 0; i < n; i++ {
|
||||
sentences[i] = Sentence()
|
||||
}
|
||||
return strings.Join(sentences, " ")
|
||||
}
|
||||
|
||||
// Sentences generates from 1 to 5 random sentences
|
||||
func Sentences() string {
|
||||
return SentencesN(r.Intn(5) + 1)
|
||||
}
|
||||
|
||||
// Paragraph generates paragraph
|
||||
func Paragraph() string {
|
||||
return SentencesN(r.Intn(10) + 1)
|
||||
}
|
||||
|
||||
// ParagraphsN generates n paragraphs
|
||||
func ParagraphsN(n int) string {
|
||||
var paragraphs []string
|
||||
for i := 0; i < n; i++ {
|
||||
paragraphs = append(paragraphs, Paragraph())
|
||||
}
|
||||
return strings.Join(paragraphs, "\t")
|
||||
}
|
||||
|
||||
// Paragraphs generates from 1 to 5 paragraphs
|
||||
func Paragraphs() string {
|
||||
return ParagraphsN(r.Intn(5) + 1)
|
||||
}
|
147
vendor/github.com/icrowley/fake/names.go
generated
vendored
Normal file
147
vendor/github.com/icrowley/fake/names.go
generated
vendored
Normal file
|
@ -0,0 +1,147 @@
|
|||
package fake
|
||||
|
||||
func randGender() string {
|
||||
g := "male"
|
||||
if r.Intn(2) == 0 {
|
||||
g = "female"
|
||||
}
|
||||
return g
|
||||
}
|
||||
|
||||
func firstName(gender string) string {
|
||||
return lookup(lang, gender+"_first_names", true)
|
||||
}
|
||||
|
||||
// MaleFirstName generates male first name
|
||||
func MaleFirstName() string {
|
||||
return firstName("male")
|
||||
}
|
||||
|
||||
// FemaleFirstName generates female first name
|
||||
func FemaleFirstName() string {
|
||||
return firstName("female")
|
||||
}
|
||||
|
||||
// FirstName generates first name
|
||||
func FirstName() string {
|
||||
return firstName(randGender())
|
||||
}
|
||||
|
||||
func lastName(gender string) string {
|
||||
return lookup(lang, gender+"_last_names", true)
|
||||
}
|
||||
|
||||
// MaleLastName generates male last name
|
||||
func MaleLastName() string {
|
||||
return lastName("male")
|
||||
}
|
||||
|
||||
// FemaleLastName generates female last name
|
||||
func FemaleLastName() string {
|
||||
return lastName("female")
|
||||
}
|
||||
|
||||
// LastName generates last name
|
||||
func LastName() string {
|
||||
return lastName(randGender())
|
||||
}
|
||||
|
||||
func patronymic(gender string) string {
|
||||
return lookup(lang, gender+"_patronymics", false)
|
||||
}
|
||||
|
||||
// MalePatronymic generates male patronymic
|
||||
func MalePatronymic() string {
|
||||
return patronymic("male")
|
||||
}
|
||||
|
||||
// FemalePatronymic generates female patronymic
|
||||
func FemalePatronymic() string {
|
||||
return patronymic("female")
|
||||
}
|
||||
|
||||
// Patronymic generates patronymic
|
||||
func Patronymic() string {
|
||||
return patronymic(randGender())
|
||||
}
|
||||
|
||||
func prefix(gender string) string {
|
||||
return lookup(lang, gender+"_name_prefixes", false)
|
||||
}
|
||||
|
||||
func suffix(gender string) string {
|
||||
return lookup(lang, gender+"_name_suffixes", false)
|
||||
}
|
||||
|
||||
func fullNameWithPrefix(gender string) string {
|
||||
return join(prefix(gender), firstName(gender), lastName(gender))
|
||||
}
|
||||
|
||||
// MaleFullNameWithPrefix generates prefixed male full name
|
||||
// if prefixes for the given language are available
|
||||
func MaleFullNameWithPrefix() string {
|
||||
return fullNameWithPrefix("male")
|
||||
}
|
||||
|
||||
// FemaleFullNameWithPrefix generates prefixed female full name
|
||||
// if prefixes for the given language are available
|
||||
func FemaleFullNameWithPrefix() string {
|
||||
return fullNameWithPrefix("female")
|
||||
}
|
||||
|
||||
// FullNameWithPrefix generates prefixed full name
|
||||
// if prefixes for the given language are available
|
||||
func FullNameWithPrefix() string {
|
||||
return fullNameWithPrefix(randGender())
|
||||
}
|
||||
|
||||
func fullNameWithSuffix(gender string) string {
|
||||
return join(firstName(gender), lastName(gender), suffix(gender))
|
||||
}
|
||||
|
||||
// MaleFullNameWithSuffix generates suffixed male full name
|
||||
// if suffixes for the given language are available
|
||||
func MaleFullNameWithSuffix() string {
|
||||
return fullNameWithPrefix("male")
|
||||
}
|
||||
|
||||
// FemaleFullNameWithSuffix generates suffixed female full name
|
||||
// if suffixes for the given language are available
|
||||
func FemaleFullNameWithSuffix() string {
|
||||
return fullNameWithPrefix("female")
|
||||
}
|
||||
|
||||
// FullNameWithSuffix generates suffixed full name
|
||||
// if suffixes for the given language are available
|
||||
func FullNameWithSuffix() string {
|
||||
return fullNameWithPrefix(randGender())
|
||||
}
|
||||
|
||||
func fullName(gender string) string {
|
||||
switch r.Intn(10) {
|
||||
case 0:
|
||||
return fullNameWithPrefix(gender)
|
||||
case 1:
|
||||
return fullNameWithSuffix(gender)
|
||||
default:
|
||||
return join(firstName(gender), lastName(gender))
|
||||
}
|
||||
}
|
||||
|
||||
// MaleFullName generates male full name
|
||||
// it can occasionally include prefix or suffix
|
||||
func MaleFullName() string {
|
||||
return fullName("male")
|
||||
}
|
||||
|
||||
// FemaleFullName generates female full name
|
||||
// it can occasionally include prefix or suffix
|
||||
func FemaleFullName() string {
|
||||
return fullName("female")
|
||||
}
|
||||
|
||||
// FullName generates full name
|
||||
// it can occasionally include prefix or suffix
|
||||
func FullName() string {
|
||||
return fullName(randGender())
|
||||
}
|
24
vendor/github.com/icrowley/fake/personal.go
generated
vendored
Normal file
24
vendor/github.com/icrowley/fake/personal.go
generated
vendored
Normal file
|
@ -0,0 +1,24 @@
|
|||
package fake
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Gender generates random gender
|
||||
func Gender() string {
|
||||
return lookup(lang, "genders", true)
|
||||
}
|
||||
|
||||
// GenderAbbrev returns first downcased letter of the random gender
|
||||
func GenderAbbrev() string {
|
||||
g := Gender()
|
||||
if g != "" {
|
||||
return strings.ToLower(string(g[0]))
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// Language generates random human language
|
||||
func Language() string {
|
||||
return lookup(lang, "languages", true)
|
||||
}
|
26
vendor/github.com/icrowley/fake/products.go
generated
vendored
Normal file
26
vendor/github.com/icrowley/fake/products.go
generated
vendored
Normal file
|
@ -0,0 +1,26 @@
|
|||
package fake
|
||||
|
||||
// Brand generates brand name
|
||||
func Brand() string {
|
||||
return Company()
|
||||
}
|
||||
|
||||
// ProductName generates product name
|
||||
func ProductName() string {
|
||||
productName := lookup(lang, "adjectives", true) + " " + lookup(lang, "nouns", true)
|
||||
if r.Intn(2) == 1 {
|
||||
productName = lookup(lang, "adjectives", true) + " " + productName
|
||||
}
|
||||
return productName
|
||||
}
|
||||
|
||||
// Product generates product title as brand + product name
|
||||
func Product() string {
|
||||
return Brand() + " " + ProductName()
|
||||
}
|
||||
|
||||
// Model generates model name that consists of letters and digits, optionally with a hyphen between them
|
||||
func Model() string {
|
||||
seps := []string{"", " ", "-"}
|
||||
return CharactersN(r.Intn(3)+1) + seps[r.Intn(len(seps))] + Digits()
|
||||
}
|
6
vendor/modules.txt
vendored
6
vendor/modules.txt
vendored
|
@ -1,12 +1,18 @@
|
|||
# github.com/Masterminds/squirrel v1.5.0
|
||||
## explicit; go 1.14
|
||||
github.com/Masterminds/squirrel
|
||||
# github.com/corpix/uarand v0.1.1
|
||||
## explicit; go 1.12
|
||||
github.com/corpix/uarand
|
||||
# github.com/davecgh/go-spew v1.1.1
|
||||
## explicit
|
||||
github.com/davecgh/go-spew/spew
|
||||
# github.com/google/uuid v1.3.0
|
||||
## explicit
|
||||
github.com/google/uuid
|
||||
# github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428
|
||||
## explicit
|
||||
github.com/icrowley/fake
|
||||
# github.com/lann/builder v0.0.0-20180802200727-47ae307949d0
|
||||
## explicit
|
||||
github.com/lann/builder
|
||||
|
|
Loading…
Reference in a new issue