jubaclient
Advanced tools
Comparing version 0.1.3 to 0.2.0
11
app.js
@@ -7,6 +7,11 @@ const assert = require('assert'); | ||
function toCamelCase(value) { | ||
return value.toLowerCase().replace(/_([a-z])/g, (match, group1) => group1.toUpperCase()); | ||
return value.replace(/_([a-z])/g, (match, group1) => group1.toUpperCase()); | ||
} | ||
exports.toCamelCase = toCamelCase; | ||
function toSnakeCase(value) { | ||
return value.replace(/[A-Z]/g, (match) => '_' + match.toLowerCase()); | ||
} | ||
exports.toSnakeCase = toSnakeCase; | ||
function request(service, method, params, rpcClient, name) { | ||
@@ -23,4 +28,4 @@ const serviseName = toCamelCase('_' + service); | ||
function assertServiceMethod(service, method) { | ||
assert.ok(typeof service === 'string', 'service is required.'); | ||
assert.ok(typeof method === 'string', 'method is required.'); | ||
assert.ok(service && typeof service === 'string', 'service is required.'); | ||
assert.ok(method && typeof method === 'string', 'method is required.'); | ||
@@ -27,0 +32,0 @@ const serviseName = toCamelCase('_' + service); |
60
index.js
@@ -7,2 +7,3 @@ #!/usr/bin/env node | ||
const minimist = require('minimist'); | ||
const jubatus = require('jubatus'); | ||
const rpc = require('jubatus/lib/msgpack-rpc'); | ||
@@ -15,12 +16,51 @@ const app = require('./app'); | ||
let count = 0; | ||
const argv = minimist(process.argv.slice(2), { p: 9190, h: 'localhost', n: '', t: 0 }); | ||
const { '_': [ service, method ], p: port, h: host, n: name, t: timeout } = argv; | ||
const argsOption = { | ||
boolean: [ 'i' ], | ||
string: [ 'h', 'n', ], | ||
alias : { 'p': 'port', 'h': 'host', 'n': 'name', 't': 'timeout', 'i': 'interactive' }, | ||
default: { p: 9199, h: 'localhost', n: '', t: 0, i: false }, | ||
unknown: false | ||
}; | ||
const args = minimist(process.argv.slice(2), argsOption); | ||
const { p: port, h: host, n: name, t: timeout, i: interactive } = args; | ||
let { '_': [ service, method ] } = args; | ||
app.assertServiceMethod(service, method); | ||
if (typeof port !== 'number') throw new Error('Illegal option: -p'); | ||
if (typeof timeout !== 'number') throw new Error('Illegal option: -t'); | ||
const client = rpc.createClient(port, host, timeout); | ||
const rl = readline.createInterface({ input: process.stdin }) | ||
.on('line', line => { | ||
let completions = Object.keys(jubatus); | ||
const completer = (line) => { | ||
const hits = completions.filter((c) => c.startsWith(line)); | ||
return [ hits.length ? hits : completions, line ]; | ||
}; | ||
const rl = readline.createInterface({ input: process.stdin, output: process.stderr, completer: completer }); | ||
function question(rl, message) { | ||
return new Promise(resolve => rl.question(message, resolve)); | ||
} | ||
(service || !interactive ? Promise.resolve(service) : question(rl, `service : `)).then(serviceName => { | ||
app.assertServiceMethod(serviceName, 'get_client'); | ||
service = serviceName; | ||
rl.setPrompt(`${ service } >`); | ||
const clientClass = jubatus[app.toCamelCase('_' + service).toLowerCase()].client[app.toCamelCase('_' + service)]; | ||
const notRPCMethodNames = [ 'getClient', 'getName', 'setName' ]; | ||
const methods = Object.keys(clientClass.prototype) | ||
.filter(method => !(notRPCMethodNames.some(notRPCMethod => method === notRPCMethod))) | ||
.map(app.toSnakeCase); | ||
completions = methods; | ||
return (method || !interactive ? Promise.resolve(method) : question(rl, `${ service } method : `)); | ||
}).then(methodName => { | ||
method = methodName; | ||
app.assertServiceMethod(service, method); | ||
rl.setPrompt(`${ service }#${ method } > `); | ||
completions = [ '[]' ]; | ||
let count = 0; | ||
if (interactive) rl.prompt(); | ||
rl.on('line', line => { | ||
debug(`${ ++count }: ${ line }`); | ||
new Promise((resolve, reject) => { | ||
@@ -35,2 +75,4 @@ resolve(JSON.parse(line)); | ||
console.log(JSON.stringify(result)); | ||
if (interactive) rl.prompt(); | ||
}).catch(error => { | ||
@@ -43,2 +85,6 @@ console.error(error); | ||
client.close(); | ||
}); | ||
}); | ||
}).catch(error => { | ||
console.error(error.toString()); | ||
process.exit(1); | ||
}); |
{ | ||
"name": "jubaclient", | ||
"version": "0.1.3", | ||
"version": "0.2.0", | ||
"description": "Jubatus CLI client (unofficial)", | ||
"main": "index.js", | ||
"bin": "index.js", | ||
"man" : "./man/jubaclient.1", | ||
"man": "./man/jubaclient.1", | ||
"scripts": { | ||
@@ -9,0 +9,0 @@ "test": "istanbul cover ./node_modules/mocha/bin/_mocha" |
@@ -21,3 +21,3 @@ # jubaclient | ||
echo '[ [ [ "baz", [ [ [ "foo", "bar" ] ] ] ] ] ]' \ | ||
| jubaclient classifier train -p 9199 -h localhost | ||
| jubaclient classifier train | ||
``` | ||
@@ -37,4 +37,6 @@ | ||
<code>jubaclient _service_ _method_ [**-p** _port_] [**-h** _host_] [**-n** _name_] [**-t** _timeoutSeconds_]</code> | ||
<code>jubaclient _service_ _method_ [**-p** _port_] [**-h** _hostname_] [**-n** _name_] [**-t** _timeoutSeconds_]</code> | ||
<code>jubaclient -i [_service_] [_method_] [**-p** _port_] [**-h** _hostname_] [**-n** _name_] [**-t** _timeoutSeconds_]</code> | ||
The `jubaclient` command requests JSON received from standard input with the specified method to the Jubatus server, and returns the response to the standard output. | ||
@@ -46,6 +48,7 @@ | ||
- <code>_method_</code>: service method (`get_status`, `train`, `get_k_center`, etc.) | ||
- <code>**-p** _port_</code> : port number (default `9190`) | ||
- <code>**-h** _host_</code> : hostname (default `localhost`) | ||
- <code>**-p** _port_</code> : port number (default `9199`) | ||
- <code>**-h** _hostname_</code> : hostname (default `localhost`) | ||
- <code>**-n** _name_</code> : name of target cluster (default `''`) | ||
- <code>**-t** _timeoutSeconds_</code> : timeout (default `0`) | ||
- <code>**-i**</code> : interactive mode | ||
@@ -82,2 +85,6 @@ ## Examples ## | ||
``` | ||
## Interactive mode ## | ||
[![asciicast](https://asciinema.org/a/161095.png)](https://asciinema.org/a/161095) | ||
## Tutorial ## | ||
@@ -93,3 +100,3 @@ | ||
```bash | ||
jubaclassifier -p 9190 -D --configpath gender.json | ||
jubaclassifier -D --configpath gender.json | ||
``` | ||
@@ -131,3 +138,2 @@ | ||
training data: `train.csv` | ||
@@ -148,3 +154,2 @@ ```csv | ||
long,shirt,skirt,1.50 | ||
``` | ||
``` |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
19019
244
148