Using this server in production is discouraged, but to implement a
proper asynchronous server with tornado/gevent every blocking call would
have to be converted to a non-blocking call.
Failing to do so causes deadlocks like senpy/senpy#35
For now, it is easier to just use the default server.
I've used euclidean metric instead of taxicab as I feel it makes more sense (taxicab has bizzare unintuitive effects for points far from the centroids).
Closes#28
Added:
* Async test (still missing one that includes the IOLoop)
* Async plugin under tests. To manually try async functionalities:
```
senpy -f tests/
```
It turns out setting "plugins" as a @list in the context causes the
"plugins" property to expand to its full name.
Removing the type causes a regression of #17, which I initially missed
because the test in #17 was wrong.
Closes#26
Does a weighted average of centroids.
If intensity sums to zero for a category, a 'neutral' category is used or 0 if it's not present. I'm not 100% sure this is the best approach, and the name of the "neutral" category perhaps should use some convention?
Note that if there are no categories present, then no VAD (or other dimensional) estimate is returned. It may be better to use the neutral centroid if it's present in this case also.
In index.html, there is a suggestion to try out the api with a link to "/api". Clicking that link results in a json error report - not ideal.
Instead, I added text suggesting that a use can find example api url's after clickgin "Analyse!".
* Improved debugging (back to using Flask's built-in mechanisms)
* Recursive model loading from json
* Added DEVPORT to Makefile
* Accept json-ld input. Closes#16
* Improved Exception handling in client
* Modified default plugin selection to only include analysis plugins
* More tests