summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/rickb777/plural
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/rickb777/plural')
-rw-r--r--vendor/github.com/rickb777/plural/.gitignore26
-rw-r--r--vendor/github.com/rickb777/plural/.travis.yml11
-rw-r--r--vendor/github.com/rickb777/plural/LICENSE27
-rw-r--r--vendor/github.com/rickb777/plural/README.md28
-rw-r--r--vendor/github.com/rickb777/plural/build+test.sh13
-rw-r--r--vendor/github.com/rickb777/plural/doc.go20
-rw-r--r--vendor/github.com/rickb777/plural/plural.go203
7 files changed, 328 insertions, 0 deletions
diff --git a/vendor/github.com/rickb777/plural/.gitignore b/vendor/github.com/rickb777/plural/.gitignore
new file mode 100644
index 00000000..49ef8df4
--- /dev/null
+++ b/vendor/github.com/rickb777/plural/.gitignore
@@ -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
+*.out
diff --git a/vendor/github.com/rickb777/plural/.travis.yml b/vendor/github.com/rickb777/plural/.travis.yml
new file mode 100644
index 00000000..70996d4b
--- /dev/null
+++ b/vendor/github.com/rickb777/plural/.travis.yml
@@ -0,0 +1,11 @@
+language: go
+
+go:
+ - tip
+
+install:
+ - go get -t -v .
+ - go get github.com/mattn/goveralls
+
+script:
+ - ./build+test.sh
diff --git a/vendor/github.com/rickb777/plural/LICENSE b/vendor/github.com/rickb777/plural/LICENSE
new file mode 100644
index 00000000..4faeca51
--- /dev/null
+++ b/vendor/github.com/rickb777/plural/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2016, Rick Beton
+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 plural 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 HOLDER 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.
diff --git a/vendor/github.com/rickb777/plural/README.md b/vendor/github.com/rickb777/plural/README.md
new file mode 100644
index 00000000..b73bc256
--- /dev/null
+++ b/vendor/github.com/rickb777/plural/README.md
@@ -0,0 +1,28 @@
+# plural - Simple Go API for Pluralisation.
+
+[![GoDoc](https://img.shields.io/badge/api-Godoc-blue.svg?style=flat-square)](https://godoc.org/github.com/rickb777/plural)
+[![Build Status](https://travis-ci.org/rickb777/plural.svg?branch=master)](https://travis-ci.org/rickb777/plural)
+[![Coverage Status](https://coveralls.io/repos/github/rickb777/plural/badge.svg?branch=master&service=github)](https://coveralls.io/github/rickb777/plural?branch=master)
+[![Go Report Card](https://goreportcard.com/badge/github.com/rickb777/plural)](https://goreportcard.com/report/github.com/rickb777/plural)
+[![Issues](https://img.shields.io/github/issues/rickb777/plural.svg)](https://github.com/rickb777/plural/issues)
+
+Package plural provides simple support for localising plurals in a flexible range of different styles.
+
+There are considerable differences around the world in the way plurals are handled. This is a simple
+but competent API for catering with these differences when presenting to people formatted text with numbers.
+
+This package is able to format **countable things** and **continuous values**. It can handle integers
+and floating point numbers equally and this allows you to decide to what extent each is appropriate.
+
+For example, `2 cars` might weigh `1.6 tonnes`; both categories are covered.
+
+This API is deliberately simple; it doesn't address the full gamut of internationalisation. If that's
+what you need, you should consider products such as https://github.com/nicksnyder/go-i18n instead.
+
+## Installation
+
+ go get -u github.com/rickb777/plural
+
+## Status
+
+This library has been in reliable production use for some time. Versioning follows the well-known semantic version pattern.
diff --git a/vendor/github.com/rickb777/plural/build+test.sh b/vendor/github.com/rickb777/plural/build+test.sh
new file mode 100644
index 00000000..d4a38342
--- /dev/null
+++ b/vendor/github.com/rickb777/plural/build+test.sh
@@ -0,0 +1,13 @@
+#!/bin/bash -e
+cd $(dirname $0)
+PATH=$HOME/gopath/bin:$GOPATH/bin:$PATH
+
+if ! type -p goveralls; then
+ echo go get github.com/mattn/goveralls
+ go get github.com/mattn/goveralls
+fi
+
+echo date...
+go test -v -covermode=count -coverprofile=date.out .
+go tool cover -func=date.out
+[ -z "$COVERALLS_TOKEN" ] || goveralls -coverprofile=date.out -service=travis-ci -repotoken $COVERALLS_TOKEN
diff --git a/vendor/github.com/rickb777/plural/doc.go b/vendor/github.com/rickb777/plural/doc.go
new file mode 100644
index 00000000..90adf6b5
--- /dev/null
+++ b/vendor/github.com/rickb777/plural/doc.go
@@ -0,0 +1,20 @@
+// Copyright 2016 Rick Beton. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package plural provides simple support for localising plurals in a flexible range of different styles.
+//
+// There are considerable differences around the world in the way plurals are handled. This is
+// a simple but competent API for catering with these differences when presenting to people formatted text with numbers.
+//
+// This package is able to format countable things and continuous values. It can handle integers
+// and floating point numbers equally and this allows you to decide to what extent each is appropriate.
+//
+// For example, "2 cars" might weigh "1.6 tonnes"; both categories are covered.
+//
+// This API is deliberately simple; it doesn't address the full gamut of internationalisation. If that's
+// what you need, you should consider products such as https://github.com/nicksnyder/go-i18n instead.
+//
+// Please see the examples and associated api documentation.
+//
+package plural
diff --git a/vendor/github.com/rickb777/plural/plural.go b/vendor/github.com/rickb777/plural/plural.go
new file mode 100644
index 00000000..794a433f
--- /dev/null
+++ b/vendor/github.com/rickb777/plural/plural.go
@@ -0,0 +1,203 @@
+package plural
+
+import (
+ "fmt"
+ "strings"
+)
+
+// Case is the inner element of this API and describes one case. When the number to be described
+// matches the number here, the corresponding format string will be used. If the format string
+// includes '%', then fmt.Sprintf will be used. Otherwise the format string will be returned verbatim.
+type Case struct {
+ Number int
+ Format string
+}
+
+// Plurals provides a list of plural cases in the order they will be searched.
+// For plurals of continuous ranges (e.g. weight), the cases must be in ascending number order.
+// For plurals of discrete ranges (i.e. integers), the cases can be in any order you require,
+// but will conventionally be in ascending number order.
+// If no match is found, the last case will be used.
+type Plurals []Case
+
+// Format searches through the plural cases for the first match. If none is found, the last
+// case is used. The value passed in can be any number type, or pointer to a number type, except
+// complex numbers are not supported. The value will be converted to an int in order to
+// find the first case that matches.
+// The only possible error arises if value has a type that is not numeric.
+// It panics if 'plurals' is empty.
+func (plurals Plurals) Format(value interface{}) (string, error) {
+ switch x := value.(type) {
+ case int:
+ return plurals.FormatInt(x), nil
+ case int8:
+ return plurals.FormatInt(int(x)), nil
+ case int16:
+ return plurals.FormatInt(int(x)), nil
+ case int32:
+ return plurals.FormatInt(int(x)), nil
+ case int64:
+ return plurals.FormatInt(int(x)), nil
+ case uint8:
+ return plurals.FormatInt(int(x)), nil
+ case uint16:
+ return plurals.FormatInt(int(x)), nil
+ case uint32:
+ return plurals.FormatInt(int(x)), nil
+ case uint64:
+ return plurals.FormatInt(int(x)), nil
+ case float32:
+ return plurals.FormatFloat(x), nil
+ case float64:
+ return plurals.FormatFloat(float32(x)), nil
+
+ case *int:
+ return plurals.FormatInt(*x), nil
+ case *int8:
+ return plurals.FormatInt(int(*x)), nil
+ case *int16:
+ return plurals.FormatInt(int(*x)), nil
+ case *int32:
+ return plurals.FormatInt(int(*x)), nil
+ case *int64:
+ return plurals.FormatInt(int(*x)), nil
+ case *uint:
+ return plurals.FormatInt(int(*x)), nil
+ case *uint8:
+ return plurals.FormatInt(int(*x)), nil
+ case *uint16:
+ return plurals.FormatInt(int(*x)), nil
+ case *uint32:
+ return plurals.FormatInt(int(*x)), nil
+ case *uint64:
+ return plurals.FormatInt(int(*x)), nil
+ case *float32:
+ return plurals.FormatFloat(*x), nil
+ case *float64:
+ return plurals.FormatFloat(float32(*x)), nil
+
+ case nil:
+ return "", fmt.Errorf("Unexpected nil value for %s", plurals)
+ default:
+ return "", fmt.Errorf("Unexpected type %T for %v", x, value)
+ }
+}
+
+// FormatInt expresses an int in plural form. It panics if 'plurals' is empty.
+func (plurals Plurals) FormatInt(value int) string {
+ for _, c := range plurals {
+ if value == c.Number {
+ return c.FormatInt(value)
+ }
+ }
+ c := plurals[len(plurals)-1]
+ return c.FormatInt(value)
+}
+
+// FormatFloat expresses a float32 in plural form. It panics if 'plurals' is empty.
+func (plurals Plurals) FormatFloat(value float32) string {
+ for _, c := range plurals {
+ if value <= float32(c.Number) {
+ return c.FormatFloat(value)
+ }
+ }
+ c := plurals[len(plurals)-1]
+ return c.FormatFloat(value)
+}
+
+// FormatInt renders a specific case with a given value.
+func (c Case) FormatInt(value int) string {
+ if strings.IndexByte(c.Format, '%') < 0 {
+ return c.Format
+ }
+ return fmt.Sprintf(c.Format, value)
+}
+
+// FormatFloat renders a specific case with a given value.
+func (c Case) FormatFloat(value float32) string {
+ if strings.IndexByte(c.Format, '%') < 0 {
+ return c.Format
+ }
+ return fmt.Sprintf(c.Format, value)
+}
+
+//-------------------------------------------------------------------------------------------------
+
+// String implements io.Stringer.
+func (plurals Plurals) String() string {
+ ss := make([]string, 0, len(plurals))
+ for _, c := range plurals {
+ ss = append(ss, c.String())
+ }
+ return fmt.Sprintf("Plurals(%s)", strings.Join(ss, ", "))
+}
+
+// String implements io.Stringer.
+func (c Case) String() string {
+ return fmt.Sprintf("{%v -> %q}", c.Number, c.Format)
+}
+
+//-------------------------------------------------------------------------------------------------
+
+// ByOrdinal constructs a simple set of cases using small ordinals (0, 1, 2, 3 etc), which is a
+// common requirement. It is an alias for FromZero.
+func ByOrdinal(zeroth string, rest ...string) Plurals {
+ return FromZero(zeroth, rest...)
+}
+
+// FromZero constructs a simple set of cases using small ordinals (0, 1, 2, 3 etc), which is a
+// common requirement. It prevents creation of a Plurals list that is empty, which would be invalid.
+//
+// The 'zeroth' string becomes Case{0, first}. The rest are appended similarly. Notice that the
+// counting starts from zero.
+//
+// So
+//
+// FromZero("nothing", "%v thing", "%v things")
+//
+// is simply a shorthand for
+//
+// Plurals{Case{0, "nothing"}, Case{1, "%v thing"}, Case{2, "%v things"}}
+//
+// which would also be valid but a little more verbose.
+//
+// This helper function is less flexible than constructing Plurals directly, but covers many common
+// situations.
+func FromZero(zeroth string, rest ...string) Plurals {
+ p := make(Plurals, 0, len(rest)+1)
+ p = append(p, Case{0, zeroth})
+ for i, c := range rest {
+ p = append(p, Case{i+1, c})
+ }
+ return p
+}
+
+// FromOne constructs a simple set of cases using small positive numbers (1, 2, 3 etc), which is a
+// common requirement. It prevents creation of a Plurals list that is empty, which would be invalid.
+//
+// The 'first' string becomes Case{1, first}. The rest are appended similarly. Notice that the
+// counting starts from one.
+//
+// So
+//
+// FromOne("%v thing", "%v things")
+//
+// is simply a shorthand for
+//
+// Plurals{Case{1, "%v thing"}, Case{2, "%v things"}}
+//
+// which would also be valid but a little more verbose.
+//
+// Note the behaviour of formatting when the count is zero. As a consequence of Format evaluating
+// the cases in order, FromOne(...).FormatInt(0) will pick the last case you provide, not the first.
+//
+// This helper function is less flexible than constructing Plurals directly, but covers many common
+// situations.
+func FromOne(first string, rest ...string) Plurals {
+ p := make(Plurals, 0, len(rest)+1)
+ p = append(p, Case{1, first})
+ for i, c := range rest {
+ p = append(p, Case{i+2, c})
+ }
+ return p
+}