aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Kiryukhin <a.kiryukhin@mail.ru>2020-02-24 23:32:19 +0300
committerAlexander Kiryukhin <a.kiryukhin@mail.ru>2020-02-24 23:32:19 +0300
commit9b2032538ad45982fcf4acb5e35ec3f970c18deb (patch)
tree2bfd5f8cd4f1594df200a27c1362338e04832569
parent6e716c0eb8958c5d7700e0712a175e8e98d0ba0a (diff)
Added readmeHEADmaster
Added CI files
-rw-r--r--.codecov.yml14
-rw-r--r--.travis.yml23
-rw-r--r--Makefile52
-rw-r--r--README.md78
-rwxr-xr-xchecklicense.sh17
-rw-r--r--example/main.go20
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
diff --git a/README.md b/README.md
index 80a5d4e..cdfd7a3 100644
--- a/README.md
+++ b/README.md
@@ -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