Skip to content

Commit 256facd

Browse files
authored
Switch to yargs. (#189)
1 parent fc2961f commit 256facd

4 files changed

Lines changed: 85 additions & 95 deletions

File tree

handwritten/bigquery/samples/README.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ analytics data warehouse.
1313
* [Samples](#samples)
1414
* [Create A Simple Application With the API](#create-a-simple-application-with-the-api)
1515
* [Datasets](#datasets)
16+
* [Queries](#queries)
1617
* [Tables](#tables)
1718

1819
## Setup
@@ -72,6 +73,32 @@ For more information, see https://cloud.google.com/bigquery/docs
7273
[datasets_docs]: https://cloud.google.com/bigquery/docs
7374
[datasets_code]: datasets.js
7475

76+
### Queries
77+
78+
View the [documentation][queries_docs] or the [source code][queries_code].
79+
80+
__Usage:__ `node queries --help`
81+
82+
```
83+
Commands:
84+
sync <query> Run a synchronous query.
85+
async <query> Start an asynchronous query.
86+
poll <jobId> Get the status of a job.
87+
88+
Options:
89+
--help Show help [boolean]
90+
91+
Examples:
92+
node queries sync "SELECT * FROM publicdata:samples.natality LIMIT 5;"
93+
node queries async "SELECT * FROM publicdata:samples.natality LIMIT 5;"
94+
node queries poll 12345
95+
96+
For more information, see https://cloud.google.com/bigquery/docs
97+
```
98+
99+
[queries_docs]: https://cloud.google.com/bigquery/docs
100+
[queries_code]: queries.js
101+
75102
### Tables
76103

77104
View the [documentation][tables_docs] or the [source code][tables_code].
Lines changed: 28 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
// See the License for the specific language governing permissions and
1212
// limitations under the License.
1313

14-
// [START complete]
14+
// [START all]
1515
/**
1616
* Command-line application to perform an synchronous query in BigQuery.
1717
*
@@ -127,51 +127,41 @@ function asyncPoll (jobId, callback) {
127127
});
128128
}
129129
// [END async_query]
130+
// [END all]
130131

131-
// [START usage]
132-
function printUsage () {
133-
console.log('Usage:');
134-
console.log('\nCommands:\n');
135-
console.log('\tnode query sync QUERY');
136-
console.log('\tnode query async QUERY');
137-
console.log('\tnode query poll JOB_ID');
138-
console.log('\nExamples:\n');
139-
console.log('\tnode query sync "SELECT * FROM publicdata:samples.natality LIMIT 5;"');
140-
console.log('\tnode query async "SELECT * FROM publicdata:samples.natality LIMIT 5;"');
141-
console.log('\tnode query poll 12345');
142-
}
143-
// [END usage]
144-
145-
// The command-line program:
146-
var program = {
147-
// Print usage instructions.
148-
printUsage: printUsage,
132+
// The command-line program
133+
var cli = require('yargs');
134+
var makeHandler = require('../utils').makeHandler;
149135

150-
// Exports
136+
var program = module.exports = {
151137
asyncQuery: asyncQuery,
152138
asyncPoll: asyncPoll,
153139
syncQuery: syncQuery,
154140
bigquery: bigquery,
155-
156-
// Run the sample.
157-
main: function (args, cb) {
158-
var command = args.shift();
159-
var arg = args.shift();
160-
if (command === 'sync') {
161-
this.syncQuery(arg, cb);
162-
} else if (command === 'async') {
163-
this.asyncQuery(arg, cb);
164-
} else if (command === 'poll') {
165-
this.asyncPoll(arg, cb);
166-
} else {
167-
this.printUsage();
168-
}
141+
main: function (args) {
142+
// Run the command-line program
143+
cli.help().strict().parse(args).argv;
169144
}
170145
};
171146

147+
cli
148+
.demand(1)
149+
.command('sync <query>', 'Run a synchronous query.', {}, function (options) {
150+
program.syncQuery(options.query, makeHandler());
151+
})
152+
.command('async <query>', 'Start an asynchronous query.', {}, function (options) {
153+
program.asyncQuery(options.query, makeHandler());
154+
})
155+
.command('poll <jobId>', 'Get the status of a job.', {}, function (options) {
156+
program.asyncPoll(options.jobId, makeHandler());
157+
})
158+
.example('node $0 sync "SELECT * FROM publicdata:samples.natality LIMIT 5;"')
159+
.example('node $0 async "SELECT * FROM publicdata:samples.natality LIMIT 5;"')
160+
.example('node $0 poll 12345')
161+
.wrap(80)
162+
.recommendCommands()
163+
.epilogue('For more information, see https://cloud.google.com/bigquery/docs');
164+
172165
if (module === require.main) {
173-
program.main(process.argv.slice(2), console.log);
166+
program.main(process.argv.slice(2));
174167
}
175-
// [END complete]
176-
177-
module.exports = program;

handwritten/bigquery/samples/system-test/query.test.js renamed to handwritten/bigquery/samples/system-test/queries.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
'use strict';
1515

16-
var example = require('../query');
16+
var example = require('../queries');
1717

1818
describe('bigquery:query', function () {
1919
describe('sync_query', function () {

handwritten/bigquery/samples/test/query.test.js renamed to handwritten/bigquery/samples/test/queries.test.js

Lines changed: 29 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ function getSample () {
4343
var BigQueryMock = sinon.stub().returns(bigqueryMock);
4444

4545
return {
46-
program: proxyquire('../query', {
46+
program: proxyquire('../queries', {
4747
'@google-cloud/bigquery': BigQueryMock
4848
}),
4949
mocks: {
@@ -58,49 +58,6 @@ function getSample () {
5858
}
5959

6060
describe('bigquery:query', function () {
61-
describe('main', function () {
62-
it('should show usage based on arguments', function () {
63-
var program = getSample().program;
64-
sinon.stub(program, 'printUsage');
65-
66-
program.main([]);
67-
assert(program.printUsage.calledOnce);
68-
69-
program.main(['-h']);
70-
assert(program.printUsage.calledTwice);
71-
72-
program.main(['--help']);
73-
assert(program.printUsage.calledThrice);
74-
});
75-
76-
it('should run the correct commands', function () {
77-
var program = getSample().program;
78-
sinon.stub(program, 'syncQuery');
79-
sinon.stub(program, 'asyncQuery');
80-
sinon.stub(program, 'asyncPoll');
81-
82-
program.main(['sync']);
83-
assert(program.syncQuery.calledOnce);
84-
85-
program.main(['async']);
86-
assert(program.asyncQuery.calledOnce);
87-
88-
program.main(['poll']);
89-
assert(program.asyncPoll.calledOnce);
90-
});
91-
92-
it('should execute queries', function () {
93-
var example = getSample();
94-
sinon.stub(example.program, 'syncQuery');
95-
96-
example.program.main(['foo'], function (err, data) {
97-
assert.ifError(err);
98-
assert(example.program.syncQuery.calledWith({ query: 'foo' }));
99-
assert.deepEqual(data, example.mocks.natality);
100-
});
101-
});
102-
});
103-
10461
describe('syncQuery', function () {
10562
var query = 'foo';
10663

@@ -246,19 +203,35 @@ describe('bigquery:query', function () {
246203
});
247204
});
248205

249-
describe('printUsage', function () {
250-
it('should print usage', function () {
206+
describe('main', function () {
207+
var query = 'foo';
208+
var jobId = 'foo';
209+
210+
it('should call syncQuery', function () {
251211
var program = getSample().program;
252-
program.printUsage();
253-
assert(console.log.calledWith('Usage:'));
254-
assert(console.log.calledWith('\nCommands:\n'));
255-
assert(console.log.calledWith('\tnode query sync QUERY'));
256-
assert(console.log.calledWith('\tnode query async QUERY'));
257-
assert(console.log.calledWith('\tnode query poll JOB_ID'));
258-
assert(console.log.calledWith('\nExamples:\n'));
259-
assert(console.log.calledWith('\tnode query sync "SELECT * FROM publicdata:samples.natality LIMIT 5;"'));
260-
assert(console.log.calledWith('\tnode query async "SELECT * FROM publicdata:samples.natality LIMIT 5;"'));
261-
assert(console.log.calledWith('\tnode query poll 12345'));
212+
213+
sinon.stub(program, 'syncQuery');
214+
program.main(['sync', query]);
215+
assert.equal(program.syncQuery.calledOnce, true);
216+
assert.deepEqual(program.syncQuery.firstCall.args.slice(0, -1), [query]);
217+
});
218+
219+
it('should call asyncQuery', function () {
220+
var program = getSample().program;
221+
222+
sinon.stub(program, 'asyncQuery');
223+
program.main(['async', query]);
224+
assert.equal(program.asyncQuery.calledOnce, true);
225+
assert.deepEqual(program.asyncQuery.firstCall.args.slice(0, -1), [query]);
226+
});
227+
228+
it('should call asyncPoll', function () {
229+
var program = getSample().program;
230+
231+
sinon.stub(program, 'asyncPoll');
232+
program.main(['poll', jobId]);
233+
assert.equal(program.asyncPoll.calledOnce, true);
234+
assert.deepEqual(program.asyncPoll.firstCall.args.slice(0, -1), [jobId]);
262235
});
263236
});
264237
});

0 commit comments

Comments
 (0)