diff options
author | Alexander Kiryukhin <a.kiryukhin@mail.ru> | 2020-02-24 23:32:19 +0300 |
---|---|---|
committer | Alexander Kiryukhin <a.kiryukhin@mail.ru> | 2020-02-24 23:32:19 +0300 |
commit | 9b2032538ad45982fcf4acb5e35ec3f970c18deb (patch) | |
tree | 2bfd5f8cd4f1594df200a27c1362338e04832569 | |
parent | 6e716c0eb8958c5d7700e0712a175e8e98d0ba0a (diff) |
Added CI files
-rw-r--r-- | .codecov.yml | 14 | ||||
-rw-r--r-- | .travis.yml | 23 | ||||
-rw-r--r-- | Makefile | 52 | ||||
-rw-r--r-- | README.md | 78 | ||||
-rwxr-xr-x | checklicense.sh | 17 | ||||
-rw-r--r-- | example/main.go | 20 |
6 files changed, 201 insertions, 3 deletions
diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 0000000..e84d80d --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,14 @@ +coverage: + range: 80..100 + round: down + precision: 2 + + status: + project: # measuring the overall project coverage + default: # context, you can create multiple ones with custom titles + enabled: yes # must be yes|true to enable this status + target: 95% # specify the target coverage for each commit status + # option: "auto" (must increase from parent commit or pull request base) + # option: "X%" a static target percentage to hit + if_not_found: success # if parent is not found report status as success, error, or failure + if_ci_failed: error # if ci fails report status as success, error, or failure
\ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..a957cc1 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,23 @@ +language: go +sudo: false + +go_import_path: github.com/neonxp/marusia +env: + global: + - TEST_TIMEOUT_SCALE=10 + - GO111MODULE=on + +matrix: + include: + - go: 1.12.x + - go: 1.13.x + env: LINT=1 + +script: + - test -z "$LINT" || make lint + - make test + - make bench + +after_success: + - make cover + - bash <(curl -s https://codecov.io/bash)
\ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..79348a0 --- /dev/null +++ b/Makefile @@ -0,0 +1,52 @@ +export GOBIN ?= $(shell pwd)/bin + +GOLINT = $(GOBIN)/golint +BENCH_FLAGS ?= -cpuprofile=cpu.pprof -memprofile=mem.pprof -benchmem + +# Directories containing independent Go modules. +# +# We track coverage only for the main module. +MODULE_DIRS = . + +# Many Go tools take file globs or directories as arguments instead of packages. +GO_FILES := $(shell \ + find . '(' -path '*/.*' -o -path './vendor' ')' -prune \ + -o -name '*.go' -print | cut -b3-) + +.PHONY: all +all: lint test + +.PHONY: lint +lint: $(GOLINT) + @rm -rf lint.log + @echo "Checking formatting..." + @gofmt -d -s $(GO_FILES) 2>&1 | tee lint.log + @echo "Checking vet..." + @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && go vet ./... 2>&1) &&) true | tee -a lint.log + @echo "Checking lint..." + @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && $(GOLINT) ./... 2>&1) &&) true | tee -a lint.log + @echo "Checking for unresolved FIXMEs..." + @git grep -i fixme | grep -v -e Makefile | tee -a lint.log + @echo "Checking for license headers..." + @./checklicense.sh | tee -a lint.log + @[ ! -s lint.log ] + +$(GOLINT): + go install golang.org/x/lint/golint + +.PHONY: test +test: + @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && go test -race ./...) &&) true + +.PHONY: cover +cover: + go test -race -coverprofile=cover.out -coverpkg=./... ./... + go tool cover -html=cover.out -o cover.html + +.PHONY: bench +BENCH ?= . +bench: + @$(foreach dir,$(MODULE_DIRS), ( \ + cd $(dir) && \ + go list ./... | xargs -n1 go test -bench=$(BENCH) -run="^$$" $(BENCH_FLAGS) \ + ) &&) true
\ No newline at end of file @@ -1,7 +1,79 @@ # Marusia API [![GoDoc](https://godoc.org/github.com/neonxp/marusia?status.svg)](https://godoc.org/github.com/neonxp/marusia) -Skills SDK for [Marusia](http://marusia.mail.ru/) voice assistant. +Неофициальное SDK навыков для голосового ассистента [Маруси](http://marusia.mail.ru/). -Documentation: [http://godoc.org/github.com/neonxp/marusia](http://godoc.org/github.com/neonxp/marusia) +Документация: [https://pkg.go.dev/github.com/neonxp/marusia](https://pkg.go.dev/github.com/neonxp/marusia) -Example: [/example/main.go](/example/main.go)
\ No newline at end of file +Пример: [/example/main.go](/example/main.go) + +## Использование + +Импорт библиотеки: + +```go +import "github.com/neonxp/marusia" +``` + +Создание функции обработчика (имплементирующий интерфейс [marusia.MessageHandler](https://pkg.go.dev/github.com/neonxp/marusia?tab=doc#MessageHandler) ): + +```go +func messageHandler(ctx context.Context, req *marusia.Request) (*marusia.Response, error) { + ... +} +``` + +Создание экземпляра API и http сервера, обрабатывающего колбеки: + +```go +m := marusia.New(messageHandler) +server := http.Server{ + Addr: ":8080", + Handler: m.Handler(), +} +if err := server.ListenAndServe(); err != http.ErrServerClosed { + log.Fatal(err) +} +``` + +Суть работы с API заключается в том, что при получении колбека с запросом типа [*marusia.Request](https://pkg.go.dev/github.com/neonxp/marusia?tab=doc#Request) в течении максимум 10 секунд следует ответить вернув сформированный объект типа [*marusia.Response](https://pkg.go.dev/github.com/neonxp/marusia?tab=doc#Response). + +## Содержимое запроса + +```go +type Request struct { + Command string + OriginalUtterance string + Type string + Payload Payload + Nlu struct { + Tokens []string + Entities []interface{} + } +} +``` + +* Command — служебное поле: запрос пользователя, преобразованный для внутренней обработки Марусей. В ходе преобразования текст, в частности, очищается от знаков препинания, а числительные преобразуются в числа. При завершении скилла по команде "стоп", "выход" и т.д. в скилл будет передано "on_interrupt", чтобы у скилла была возможность попрощаться с пользователем. +* OriginalUtterance — полный текст пользовательского запроса, максимум 1024 символа. +* Type — тип ввода, обязательное свойство. Возможные значения: "SimpleUtterance" — голосовой ввод, "ButtonPressed" — нажатие кнопки. +* Payload — JSON, полученный с нажатой кнопкой от обработчика скилла (в ответе на предыдущий запрос), максимум 4096 байт. +* Nlu.Tokens — слова и именованные сущности, которые Маруся извлекла из запроса пользователя. +* Nlu.Entities — здесь пока будет пустой массив или какие-то экспериментальные вещи, на которые не стоит смотреть. + +## Содержимое ответа + +```go +type Response struct { + Text string + TTS string + Buttons []*button + EndSession bool +} +``` + +Методы: + +* NewResponse(text string) *Response - конструктор объекта, где text - текст ответа пользователю +* Response.SetText(text string) *Response - задание текста ответа +* Response.SetTTS(tts string) *Response - текст с раставленными ударениями (знак "+") +* Response.SetEndSession(endSession bool) *Response - задает признак конца диалога +* Response.AddButton(title string, payload Payload, URL string) *Response - добавляет кнопку в диалог
\ No newline at end of file diff --git a/checklicense.sh b/checklicense.sh new file mode 100755 index 0000000..587c36c --- /dev/null +++ b/checklicense.sh @@ -0,0 +1,17 @@ +#!/bin/bash -e + +ERROR_COUNT=0 +while read -r file +do + case "$(head -1 "${file}")" in + *"Copyright (c) "*" Alexander Kiryukhin <a.kiryukhin@mail.ru>") + # everything's cool + ;; + *) + echo "$file is missing license header." + (( ERROR_COUNT++ )) + ;; + esac +done < <(git ls-files "*\.go") + +exit $ERROR_COUNT
\ No newline at end of file diff --git a/example/main.go b/example/main.go index 25e3720..1848cd4 100644 --- a/example/main.go +++ b/example/main.go @@ -1,3 +1,23 @@ +// Copyright (c) 2020 Alexander Kiryukhin <a.kiryukhin@mail.ru> + +// 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. + // +build example package main |