8000 Merge remote-tracking branch 'skygragon/master' · yiwei-sun/leetcode-cli@00d8e90 · GitHub
[go: up one dir, main page]

Skip to content

Commit 00d8e90

Browse files
committed
Merge remote-tracking branch 'skygragon/master'
2 parents 4d46f34 + 095aab5 commit 00d8e90

19 files changed

+400
-180
lines changed

bin/install

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#!/bin/bash
2+
3+
ENVFILE=.env.json
4+
5+
check() {
6+
printf "Checking $1 ... "
7+
$1 --version > /dev/null 2>&1
8+
if [ $? != 0 ]; then
9+
echo "No"
10+
echo "[ERROR] Missing $1!"
11+
exit 1;
12+
fi
13+
echo "Yes"
14+
}
15+
16+
create() {
17+
cat << EOF > $1
18+
{
19+
"commit": {
20+
"full": "`git rev-parse HEAD`",
21+
"short": "`git rev-parse --short HEAD`"
22+
},
23+
"node": "`node -v`",
24+
"npm": "`npm -v`"
25+
}
26+
EOF
27+
}
28+
29+
check git
30+
check node
31+
check npm
32+
33+
create $ENVFILE
34+
35+
npm install
36+
echo "You might need root privilege to install globally ... "
37+
sudo npm install -g .
38+
39+
echo "leetcode-cli successfully installed."

colors/blue.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"gray": "#B0C4DE",
3+
"green": "#66D9EF",
4+
"red": "#AE81FF",
5+
"yellow": "#87CEEB"
6+
}

colors/dark.json

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
{
2-
"black": "#000000",
3-
"blue": "#000099",
4-
"cyan": "#009999",
2+
"gray": "#455354",
53
"green": "#009900",
6-
"magenta": "#990099",
74
"red": "#990000",
8-
"white": "#ffffff",
95
"yellow": "#999900"
106
}

colors/default.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"black": "#000000",
33
"blue": "#0000ff",
44
"cyan": "#00ffff",
5+
"gray": "#999999",
56
"green": "#00ff00",
67
"magenta": "#ff00ff",
78
"red": "#ff0000",

colors/orange.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"gray": "#C4BE89",
3+
"green": "#E6DB74",
4+
"red": "#ef5939",
5+
"yellow": "#FD971F"
6+
}

colors/pink.json

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
{
2-
"black": "#000000",
3-
"blue": "#0000ff",
4-
"cyan": "#00ffff",
2+
"gray": "#BCA3A3",
53
"green": "#ff1493",
6-
"magenta": "#ff00ff",
74
"red": "#dc143c",
8-
"white": "#ffffff",
95
"yellow": "#ff4500"
106
}

docs/install.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ Choose one of the following ways to install leetcode-cli:
2626
**From source code**
2727

2828
$ git clone http://github.com/skygragon/leetcode-cli
29-
$ cd leetcode-cli && npm install && sudo npm install -g .
29+
$ cd leetcode-cli && ./bin/install
3030

3131
Then verify the result:
3232

lib/chalk.js

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,21 @@ var chalk = {
1010
var pres = [];
1111
var posts = [];
1212

13+
var DEFAULT = {
14+
black: "#000000",
15+
blue: "#0000ff",
16+
cyan: "#00ffff",
17+
gray: "#999999",
18+
green: "#00ff00",
19+
magenta: "#ff00ff",
20+
red: "#ff0000",
21+
white: "#ffffff",
22+
yellow: "#ffff00"
23+
};
24+
1325
chalk.setTheme = function(name) {
14-
this.theme = this.themes[name] || this.themes.default || {};
26+
var theme = this.themes[name] || this.themes.default || {};
27+
this.theme = _.extendOwn(DEFAULT, theme);
1528
};
1629

1730
chalk.print = function(s) {
@@ -42,7 +55,7 @@ chalk.init = function() {
4255
});
4356
});
4457

45-
_.chain(['black', 'blue', 'cyan', 'green', 'magenta', 'red', 'white', 'yellow'])
58+
_.chain(['black', 'blue', 'cyan', 'gray', 'green', 'magenta', 'red', 'white', 'yellow'])
4659
.each(function(color) {
4760
Object.defineProperty(chalk, color, {
4861
get: function() {

lib/cli.js

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
var fs = require('fs');
22

33
var log = require('loglevel');
4+
var sprintf = require('sprintf-js').sprintf;
5+
var _ = require('underscore');
46

57
var chalk = require('./chalk');
68
var config = require('./config');
@@ -25,8 +27,34 @@ function setLogLevel() {
2527
log.setLevel(level);
2628

2729
log.fail = function(e) {
28-
log.error(chalk.red('ERROR: ' + (e.msg || e)));
30+
log.error(chalk.red(sprintf('[ERROR] %s [%d]', (e.msg || e), (e.statusCode || 0))));
2931
};
32+
33+
_.each(['debug', 'trace'], function(level) {
34+
log[level] = _.wrap(log[level], function(func) {
35+
var args = Array.prototype.slice.call(arguments);
36+
args[0] = '[' + level.toUpperCase() + ']';
37+
func.apply(null, _.map(args, function(arg) {
38+
return chalk.gray(arg);
39+
}));
40+
});
41+
});
42+
43+
if (level === log.levels.TRACE) {
44+
var request = require('request');
45+
request.debug = true;
46+
// FIXME: hack request log, hope no one else use it...
47+
console.error = _.wrap(console.error, function(func) {
48+
var args = Array.prototype.slice.call(arguments);
49+
args.shift();
50+
if (args.length > 0 && args[0].indexOf('REQUEST ') === 0) {
51+
args.unshift('[TRACE]');
52+
}
53+
console.log.apply(null, _.map(args, function(arg) {
54+
return chalk.gray(arg);
55+
}));
56+
});
57+
}
3058
}
3159

3260
function checkCache() {

lib/commands/show.js

Lines changed: 46 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,18 @@ var cmd = {
3131
type: 'boolean',
3232
default: false,
3333
describe: 'Provide extra problem details in generated file'
34+
},
35+
desc: {
36+
alias: 'd',
37+
type: 'boolean',
38+
default: true,
39+
describe: 'Show problem description'
40+
},
41+
template: {
42+
alias: 't',
43+
type: 'boolean',
44+
default: false,
45+
describe: 'Show code template'
3446
}
3547
}
3648
};
@@ -39,14 +51,14 @@ cmd.handler = function(argv) {
3951
core.getProblem(argv.keyword, function(e, problem) {
4052
if (e) return log.fail(e);
4153

42-
var msg = '';
54+
var template = _.find(problem.templates, function(x) {
55+
return x.value === argv.lang;
56+
});
57+
if (!template && (argv.template || argv.gen))
58+
return log.fail('Unknown language "' + argv.lang + '"');
59+
60+
var fileinfo = '';
4361
if (argv.gen) {
44-
var template = _.find(problem.templates, function(x) {
45-
return x.value === argv.lang;
46-
});
47-
if (!template)
48-
return log.fail('Failed to generate source file, ' +
49-
'unknown language "' + argv.lang + '"');
5062
problem.code = template.defaultCode;
5163

5264
// try to use a new filename to avoid overwrite by mistake
@@ -60,24 +72,36 @@ cmd.handler = function(argv) {
6072
}
6173

6274
core.exportProblem(problem, filename, !argv.extra);
63-
msg = sprintf('(File: %s)', chalk.yellow.underline(filename));
75+
fileinfo = sprintf('(File: %s)', chalk.yellow.underline(filename));
76+
}
77+
78+
if (argv.desc) {
79+
log.info(sprintf('[%d] %s %s\t%s\n',
80+
problem.id,
81+
problem.name,
82+
(problem.starred ? chalk.yellow('★') : ' '),
83+
fileinfo));
84+
log.info(sprintf('%s\n', chalk.underline(problem.link)));
85+
log.info(sprintf('* %s (%.2f%%)', problem.level, problem.percent));
86+
log.info(sprintf('* Total Accepted: %d', problem.totalAC));
87+
log.info(sprintf('* Total Submissions: %d', problem.totalSubmit));
88+
if (problem.testable && problem.testcase) {
89+
log.info(sprintf('* Testcase Example: %s',
90+
chalk.yellow(util.inspect(problem.testcase))));
91+
}
92+
log.info();
93+
log.info(problem.desc);
94+
95+
if (argv.template) {
96+
log.info();
97+
log.info('Template:');
98+
log.info();
99+
}
64100
}
65101

66-
log.info(sprintf('[%d] %s %s\t%s\n',
67-
problem.id,
68-
problem.name,
69-
(problem.starred ? chalk.yellow('★') : ' '),
70-
msg));
71-
log.info(sprintf('%s\n', chalk.underline(problem.link)));
72-
log.info(sprintf('* %s (%.2f%%)', problem.level, problem.percent));
73-
log.info(sprintf('* Total Accepted: %d', problem.totalAC));
74-
log.info(sprintf('* Total Submissions: %d', problem.totalSubmit));
75-
if (problem.testable && problem.testcase) {
76-
log.info(sprintf('* Testcase Example: %s',
77-
chalk.yellow(util.inspect(problem.testcase))));
102+
if (argv.template) {
103+
log.info(chalk.yellow(template.defaultCode));
78104
}
79-
log.info();
80-
log.info(problem.desc);
81105
});
82106
};
83107

lib/commands/stat.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ function showSummary(problems) {
6666
function showGraph(problems) {
6767
var ac = chalk.green('█');
6868
var notac = chalk.enabled ? chalk.red('█') : 'X';
69-
var none = '░';
69+
var none = chalk.gray('░');
7070

7171
var graph = [];
7272
_.each(problems, function(problem) {

lib/commands/submission.js

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ var cmd = {
3030
type: 'boolean',
3131
default: false,
3232
describe: 'Provide extra problem details in submission file'
33+
},
34+
lang: {
35+
alias: 'l',
36+
type: 'string',
37+
default: 'all',
38+
describe: 'Programming language used for previous submission'
3339
}
3440
}
3541
};
@@ -43,7 +49,7 @@ function onTaskDone(e, msg, problem, cb) {
4349
log.info(sprintf('[%3d] %-60s %s',
4450
problem.id,
4551
problem.name,
46-
(e ? chalk.red('ERROR: ' + e) : msg)
52+
(e ? chalk.red('ERROR: ' + (e.msg || e)) : msg)
4753
));
4854
if (cb) cb(e);
4955
}
@@ -68,21 +74,28 @@ function exportSubmission(argv, problem, cb) {
6874
if (e) return cb(e);
6975
if (submissions.length === 0) return cb('no submissions?');
7076

71-
// find the latest accepted one
72-
var submission = _.find(submissions, function(x) {
73-
// TODO: select by lang?
77+
// get obj list contain required filetype
78+
var submissionInTargetType = _.filter(submissions, function(x) {
79+
return argv.lang === 'all' || argv.lang === x.lang;
80+
});
81+
if (submissionInTargetType.length === 0) {
82+
return cb("No previous submission in required language.");
83+
}
84+
var submission = _.find(submissionInTargetType, function(x) {
7485
return x.status_display === 'Accepted';
7586
});
7687

88+
var submissionState = submission === undefined ? 'notac' : 'ac';
89+
7790
// if no accepted, use the latest non-accepted one
78-
submission = submission || submissions[0];
91+
submission = submission || submissionInTargetType[0];
7992

8093
var filename = sprintf('%s/%d.%s.%s.%s%s',
8194
argv.outdir,
8295
problem.id,
8396
problem.key,
8497
submission.id,
85-
problem.state,
98+
submissionState,
8699
h.langToExt(submission.lang));
87100

88101
// skip the existing cached submissions

lib/commands/user.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ cmd.handler = function(argv) {
4444
});
4545
} else if (argv.logout) {
4646
// logout
47-
user = core.logout(null);
47+
user = core.logout(true);
4848
if (user)
4949
log.info('Successfully logout as', chalk.yellow(user.name));
5050
else

0 commit comments

Comments
 (0)
0