opal 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -1
  3. data/lib/opal/cli.rb +9 -1
  4. data/lib/opal/cli_options.rb +12 -3
  5. data/lib/opal/cli_runners/nodejs.rb +3 -2
  6. data/lib/opal/version.rb +1 -1
  7. data/opal/corelib/kernel.rb +7 -0
  8. data/opal/corelib/runtime.js +4 -0
  9. data/spec/lib/cli_spec.rb +16 -0
  10. data/stdlib/nodejs.rb +1 -2
  11. data/stdlib/nodejs/{process.rb → kernel.rb} +7 -4
  12. data/stdlib/nodejs/node_modules/.bin/js-yaml +140 -0
  13. data/stdlib/nodejs/node_modules/glob/LICENSE +15 -0
  14. data/stdlib/nodejs/node_modules/glob/README.md +357 -0
  15. data/stdlib/nodejs/node_modules/glob/common.js +177 -0
  16. data/stdlib/nodejs/node_modules/glob/glob.js +649 -0
  17. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/.eslintrc +17 -0
  18. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/LICENSE +15 -0
  19. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/README.md +37 -0
  20. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/inflight.js +44 -0
  21. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE +15 -0
  22. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md +36 -0
  23. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json +52 -0
  24. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/test/basic.js +51 -0
  25. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js +33 -0
  26. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/package.json +61 -0
  27. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/test.js +97 -0
  28. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/LICENSE +16 -0
  29. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/README.md +42 -0
  30. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/inherits.js +1 -0
  31. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/inherits_browser.js +23 -0
  32. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/package.json +51 -0
  33. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/test.js +25 -0
  34. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/.npmignore +1 -0
  35. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/.travis.yml +4 -0
  36. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/LICENSE +23 -0
  37. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/README.md +216 -0
  38. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/benchmark.js +15 -0
  39. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/browser.js +1181 -0
  40. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/minimatch.js +845 -0
  41. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.npmignore +2 -0
  42. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.travis.yml +3 -0
  43. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md +121 -0
  44. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/example.js +8 -0
  45. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js +191 -0
  46. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore +2 -0
  47. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.travis.yml +4 -0
  48. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/Makefile +6 -0
  49. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md +80 -0
  50. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/example.js +5 -0
  51. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js +38 -0
  52. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json +73 -0
  53. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/test/balanced.js +56 -0
  54. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml +4 -0
  55. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE +18 -0
  56. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown +62 -0
  57. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js +6 -0
  58. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js +13 -0
  59. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json +83 -0
  60. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js +39 -0
  61. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json +75 -0
  62. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-comparison.js +32 -0
  63. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-results.txt +1075 -0
  64. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/cases.txt +182 -0
  65. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/dollar.js +9 -0
  66. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/empty-option.js +10 -0
  67. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/generate.sh +24 -0
  68. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/negative-increment.js +15 -0
  69. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/nested.js +16 -0
  70. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/order.js +10 -0
  71. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/pad.js +13 -0
  72. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/same-type.js +7 -0
  73. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/sequence.js +50 -0
  74. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/package.json +60 -0
  75. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/basic.js +399 -0
  76. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/brace-expand.js +45 -0
  77. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/defaults.js +274 -0
  78. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js +8 -0
  79. data/stdlib/nodejs/node_modules/glob/node_modules/once/LICENSE +27 -0
  80. data/stdlib/nodejs/node_modules/glob/node_modules/once/README.md +51 -0
  81. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE +15 -0
  82. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/README.md +36 -0
  83. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/package.json +52 -0
  84. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/test/basic.js +51 -0
  85. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js +33 -0
  86. data/stdlib/nodejs/node_modules/glob/node_modules/once/once.js +21 -0
  87. data/stdlib/nodejs/node_modules/glob/node_modules/once/package.json +60 -0
  88. data/stdlib/nodejs/node_modules/glob/node_modules/once/test/once.js +23 -0
  89. data/stdlib/nodejs/node_modules/glob/package.json +72 -0
  90. data/stdlib/nodejs/node_modules/glob/sync.js +409 -0
  91. data/stdlib/nodejs/node_modules/js-yaml/HISTORY.md +277 -0
  92. data/stdlib/nodejs/node_modules/js-yaml/LICENSE +21 -0
  93. data/stdlib/nodejs/node_modules/js-yaml/README.md +288 -0
  94. data/stdlib/nodejs/node_modules/js-yaml/bin/js-yaml.js +140 -0
  95. data/stdlib/nodejs/node_modules/js-yaml/bower.json +23 -0
  96. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.js +3666 -0
  97. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.min.js +3 -0
  98. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.js +102 -0
  99. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.yml +18 -0
  100. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.js +31 -0
  101. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.json +22 -0
  102. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.js +18 -0
  103. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.yml +197 -0
  104. data/stdlib/nodejs/node_modules/js-yaml/index.js +7 -0
  105. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml.js +39 -0
  106. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/common.js +62 -0
  107. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/dumper.js +554 -0
  108. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/exception.js +25 -0
  109. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/loader.js +1581 -0
  110. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/mark.js +78 -0
  111. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema.js +103 -0
  112. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/core.js +18 -0
  113. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_full.js +25 -0
  114. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js +28 -0
  115. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js +17 -0
  116. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/json.js +25 -0
  117. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type.js +61 -0
  118. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/binary.js +133 -0
  119. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/bool.js +37 -0
  120. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/float.js +110 -0
  121. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/int.js +183 -0
  122. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/function.js +85 -0
  123. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js +84 -0
  124. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js +27 -0
  125. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/map.js +8 -0
  126. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/merge.js +12 -0
  127. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/null.js +36 -0
  128. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/omap.js +56 -0
  129. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/pairs.js +61 -0
  130. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/seq.js +8 -0
  131. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/set.js +33 -0
  132. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/str.js +8 -0
  133. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/timestamp.js +98 -0
  134. data/stdlib/nodejs/node_modules/js-yaml/node_modules/.bin/esparse +117 -0
  135. data/stdlib/nodejs/node_modules/js-yaml/node_modules/.bin/esvalidate +177 -0
  136. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/HISTORY.md +115 -0
  137. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/LICENSE +21 -0
  138. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/README.md +239 -0
  139. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/arguments.js +36 -0
  140. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/choice.js +22 -0
  141. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/constants.js +59 -0
  142. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/help.js +13 -0
  143. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/nargs.js +33 -0
  144. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/parents.js +28 -0
  145. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/prefix_chars.js +23 -0
  146. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sub_commands.js +49 -0
  147. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sum.js +35 -0
  148. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/testformatters.js +270 -0
  149. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/index.js +1 -0
  150. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action.js +146 -0
  151. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append.js +55 -0
  152. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append/constant.js +47 -0
  153. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/count.js +40 -0
  154. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/help.js +48 -0
  155. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store.js +50 -0
  156. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/constant.js +43 -0
  157. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/false.js +27 -0
  158. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/true.js +26 -0
  159. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/subparsers.js +148 -0
  160. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/version.js +50 -0
  161. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action_container.js +481 -0
  162. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argparse.js +14 -0
  163. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/error.js +50 -0
  164. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/exclusive.js +54 -0
  165. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/group.js +75 -0
  166. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js +1168 -0
  167. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/const.js +18 -0
  168. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/added_formatters.js +88 -0
  169. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js +798 -0
  170. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/namespace.js +77 -0
  171. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.npmignore +2 -0
  172. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml +8 -0
  173. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown +825 -0
  174. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/bower.json +33 -0
  175. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json +11 -0
  176. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/foo.js +10 -0
  177. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/gulpfile.js +26 -0
  178. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js +673 -0
  179. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/libpeerconnection.log +0 -0
  180. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json +107 -0
  181. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/LICENSE +23 -0
  182. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/README.md +22 -0
  183. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json +69 -0
  184. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js +6 -0
  185. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js +1415 -0
  186. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/package.json +62 -0
  187. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/README.md +73 -0
  188. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esparse.js +117 -0
  189. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esvalidate.js +177 -0
  190. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/esprima.js +3908 -0
  191. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/package.json +69 -0
  192. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/compat.js +239 -0
  193. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/reflect.js +422 -0
  194. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/run.js +66 -0
  195. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/runner.js +387 -0
  196. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/test.js +20238 -0
  197. data/stdlib/nodejs/node_modules/js-yaml/package.json +83 -0
  198. data/{package.json → stdlib/nodejs/package.json} +0 -3
  199. data/stdlib/phantomjs.rb +1 -6
  200. data/tasks/testing.rake +1 -4
  201. metadata +191 -6
  202. data/stdlib/nodejs/runtime.rb +0 -26
@@ -0,0 +1,18 @@
1
+ //
2
+ // Constants
3
+ //
4
+ module.exports.EOL = '\n';
5
+
6
+ module.exports.SUPPRESS = '==SUPPRESS==';
7
+
8
+ module.exports.OPTIONAL = '?';
9
+
10
+ module.exports.ZERO_OR_MORE = '*';
11
+
12
+ module.exports.ONE_OR_MORE = '+';
13
+
14
+ module.exports.PARSER = 'A...';
15
+
16
+ module.exports.REMAINDER = '...';
17
+
18
+ module.exports._UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args';
@@ -0,0 +1,88 @@
1
+ 'use strict';
2
+
3
+ var util = require('util');
4
+ var _ = require('underscore');
5
+ _.str = require('underscore.string');
6
+
7
+ // Constants
8
+ var $$ = require('../const');
9
+
10
+ var HelpFormatter = require('./formatter.js');
11
+
12
+ /**
13
+ * new RawDescriptionHelpFormatter(options)
14
+ * new ArgumentParser({formatterClass: argparse.RawDescriptionHelpFormatter, ...})
15
+ *
16
+ * Help message formatter which adds default values to argument help.
17
+ *
18
+ * Only the name of this class is considered a public API. All the methods
19
+ * provided by the class are considered an implementation detail.
20
+ **/
21
+
22
+ var ArgumentDefaultsHelpFormatter = function ArgumentDefaultsHelpFormatter(options) {
23
+ HelpFormatter.call(this, options);
24
+ };
25
+
26
+ util.inherits(ArgumentDefaultsHelpFormatter, HelpFormatter);
27
+
28
+ ArgumentDefaultsHelpFormatter.prototype._getHelpString = function (action) {
29
+ var help = action.help;
30
+ if (action.help.indexOf('%(defaultValue)s') === -1) {
31
+ if (action.defaultValue !== $$.SUPPRESS) {
32
+ var defaulting_nargs = [$$.OPTIONAL, $$.ZERO_OR_MORE];
33
+ if (action.isOptional() || (defaulting_nargs.indexOf(action.nargs) >= 0)) {
34
+ help += ' (default: %(defaultValue)s)';
35
+ }
36
+ }
37
+ }
38
+ return help;
39
+ };
40
+
41
+ module.exports.ArgumentDefaultsHelpFormatter = ArgumentDefaultsHelpFormatter;
42
+
43
+ /**
44
+ * new RawDescriptionHelpFormatter(options)
45
+ * new ArgumentParser({formatterClass: argparse.RawDescriptionHelpFormatter, ...})
46
+ *
47
+ * Help message formatter which retains any formatting in descriptions.
48
+ *
49
+ * Only the name of this class is considered a public API. All the methods
50
+ * provided by the class are considered an implementation detail.
51
+ **/
52
+
53
+ var RawDescriptionHelpFormatter = function RawDescriptionHelpFormatter(options) {
54
+ HelpFormatter.call(this, options);
55
+ };
56
+
57
+ util.inherits(RawDescriptionHelpFormatter, HelpFormatter);
58
+
59
+ RawDescriptionHelpFormatter.prototype._fillText = function (text, width, indent) {
60
+ var lines = text.split('\n');
61
+ lines = lines.map(function (line) {
62
+ return _.str.rtrim(indent + line);
63
+ });
64
+ return lines.join('\n');
65
+ };
66
+ module.exports.RawDescriptionHelpFormatter = RawDescriptionHelpFormatter;
67
+
68
+ /**
69
+ * new RawTextHelpFormatter(options)
70
+ * new ArgumentParser({formatterClass: argparse.RawTextHelpFormatter, ...})
71
+ *
72
+ * Help message formatter which retains formatting of all help text.
73
+ *
74
+ * Only the name of this class is considered a public API. All the methods
75
+ * provided by the class are considered an implementation detail.
76
+ **/
77
+
78
+ var RawTextHelpFormatter = function RawTextHelpFormatter(options) {
79
+ RawDescriptionHelpFormatter.call(this, options);
80
+ };
81
+
82
+ util.inherits(RawTextHelpFormatter, RawDescriptionHelpFormatter);
83
+
84
+ RawTextHelpFormatter.prototype._splitLines = function (text) {
85
+ return text.split('\n');
86
+ };
87
+
88
+ module.exports.RawTextHelpFormatter = RawTextHelpFormatter;
@@ -0,0 +1,798 @@
1
+ /**
2
+ * class HelpFormatter
3
+ *
4
+ * Formatter for generating usage messages and argument help strings. Only the
5
+ * name of this class is considered a public API. All the methods provided by
6
+ * the class are considered an implementation detail.
7
+ *
8
+ * Do not call in your code, use this class only for inherits your own forvatter
9
+ *
10
+ * ToDo add [additonal formatters][1]
11
+ *
12
+ * [1]:http://docs.python.org/dev/library/argparse.html#formatter-class
13
+ **/
14
+ 'use strict';
15
+
16
+ var _ = require('underscore');
17
+ _.str = require('underscore.string');
18
+
19
+ // Constants
20
+ var $$ = require('../const');
21
+
22
+
23
+ /*:nodoc:* internal
24
+ * new Support(parent, heding)
25
+ * - parent (object): parent section
26
+ * - heading (string): header string
27
+ *
28
+ **/
29
+ function Section(parent, heading) {
30
+ this._parent = parent;
31
+ this._heading = heading;
32
+ this._items = [];
33
+ }
34
+
35
+ /*:nodoc:* internal
36
+ * Section#addItem(callback) -> Void
37
+ * - callback (array): tuple with function and args
38
+ *
39
+ * Add function for single element
40
+ **/
41
+ Section.prototype.addItem = function (callback) {
42
+ this._items.push(callback);
43
+ };
44
+
45
+ /*:nodoc:* internal
46
+ * Section#formatHelp(formatter) -> string
47
+ * - formatter (HelpFormatter): current formatter
48
+ *
49
+ * Form help section string
50
+ *
51
+ **/
52
+ Section.prototype.formatHelp = function (formatter) {
53
+ var itemHelp, heading;
54
+
55
+ // format the indented section
56
+ if (!!this._parent) {
57
+ formatter._indent();
58
+ }
59
+
60
+ itemHelp = this._items.map(function (item) {
61
+ var obj, func, args;
62
+
63
+ obj = formatter;
64
+ func = item[0];
65
+ args = item[1];
66
+ return func.apply(obj, args);
67
+ });
68
+ itemHelp = formatter._joinParts(itemHelp);
69
+
70
+ if (!!this._parent) {
71
+ formatter._dedent();
72
+ }
73
+
74
+ // return nothing if the section was empty
75
+ if (!itemHelp) {
76
+ return '';
77
+ }
78
+
79
+ // add the heading if the section was non-empty
80
+ heading = '';
81
+ if (!!this._heading && this._heading !== $$.SUPPRESS) {
82
+ var currentIndent = formatter.currentIndent;
83
+ heading = _.str.repeat(' ', currentIndent) + this._heading + ':' + $$.EOL;
84
+ }
85
+
86
+ // join the section-initialize newline, the heading and the help
87
+ return formatter._joinParts([$$.EOL, heading, itemHelp, $$.EOL]);
88
+ };
89
+
90
+ /**
91
+ * new HelpFormatter(options)
92
+ *
93
+ * #### Options:
94
+ * - `prog`: program name
95
+ * - `indentIncriment`: indent step, default value 2
96
+ * - `maxHelpPosition`: max help position, default value = 24
97
+ * - `width`: line width
98
+ *
99
+ **/
100
+ var HelpFormatter = module.exports = function HelpFormatter(options) {
101
+ options = options || {};
102
+
103
+ this._prog = options.prog;
104
+
105
+ this._maxHelpPosition = options.maxHelpPosition || 24;
106
+ this._width = (options.width || ((process.env.COLUMNS || 80) - 2));
107
+
108
+ this._currentIndent = 0;
109
+ this._indentIncriment = options.indentIncriment || 2;
110
+ this._level = 0;
111
+ this._actionMaxLength = 0;
112
+
113
+ this._rootSection = new Section(null);
114
+ this._currentSection = this._rootSection;
115
+
116
+ this._whitespaceMatcher = new RegExp('\\s+', 'g');
117
+ this._longBreakMatcher = new RegExp($$.EOL + $$.EOL + $$.EOL + '+', 'g');
118
+ };
119
+
120
+ HelpFormatter.prototype._indent = function () {
121
+ this._currentIndent += this._indentIncriment;
122
+ this._level += 1;
123
+ };
124
+
125
+ HelpFormatter.prototype._dedent = function () {
126
+ this._currentIndent -= this._indentIncriment;
127
+ this._level -= 1;
128
+ if (this._currentIndent < 0) {
129
+ throw new Error('Indent decreased below 0.');
130
+ }
131
+ };
132
+
133
+ HelpFormatter.prototype._addItem = function (func, args) {
134
+ this._currentSection.addItem([func, args]);
135
+ };
136
+
137
+ //
138
+ // Message building methods
139
+ //
140
+
141
+ /**
142
+ * HelpFormatter#startSection(heading) -> Void
143
+ * - heading (string): header string
144
+ *
145
+ * Start new help section
146
+ *
147
+ * See alse [code example][1]
148
+ *
149
+ * ##### Example
150
+ *
151
+ * formatter.startSection(actionGroup.title);
152
+ * formatter.addText(actionGroup.description);
153
+ * formatter.addArguments(actionGroup._groupActions);
154
+ * formatter.endSection();
155
+ *
156
+ **/
157
+ HelpFormatter.prototype.startSection = function (heading) {
158
+ this._indent();
159
+ var section = new Section(this._currentSection, heading);
160
+ var func = section.formatHelp.bind(section);
161
+ this._addItem(func, [this]);
162
+ this._currentSection = section;
163
+ };
164
+
165
+ /**
166
+ * HelpFormatter#endSection -> Void
167
+ *
168
+ * End help section
169
+ *
170
+ * ##### Example
171
+ *
172
+ * formatter.startSection(actionGroup.title);
173
+ * formatter.addText(actionGroup.description);
174
+ * formatter.addArguments(actionGroup._groupActions);
175
+ * formatter.endSection();
176
+ **/
177
+ HelpFormatter.prototype.endSection = function () {
178
+ this._currentSection = this._currentSection._parent;
179
+ this._dedent();
180
+ };
181
+
182
+ /**
183
+ * HelpFormatter#addText(text) -> Void
184
+ * - text (string): plain text
185
+ *
186
+ * Add plain text into current section
187
+ *
188
+ * ##### Example
189
+ *
190
+ * formatter.startSection(actionGroup.title);
191
+ * formatter.addText(actionGroup.description);
192
+ * formatter.addArguments(actionGroup._groupActions);
193
+ * formatter.endSection();
194
+ *
195
+ **/
196
+ HelpFormatter.prototype.addText = function (text) {
197
+ if (!!text && text !== $$.SUPPRESS) {
198
+ this._addItem(this._formatText, [text]);
199
+ }
200
+ };
201
+
202
+ /**
203
+ * HelpFormatter#addUsage(usage, actions, groups, prefix) -> Void
204
+ * - usage (string): usage text
205
+ * - actions (array): actions list
206
+ * - groups (array): groups list
207
+ * - prefix (string): usage prefix
208
+ *
209
+ * Add usage data into current section
210
+ *
211
+ * ##### Example
212
+ *
213
+ * formatter.addUsage(this.usage, this._actions, []);
214
+ * return formatter.formatHelp();
215
+ *
216
+ **/
217
+ HelpFormatter.prototype.addUsage = function (usage, actions, groups, prefix) {
218
+ if (usage !== $$.SUPPRESS) {
219
+ this._addItem(this._formatUsage, [usage, actions, groups, prefix]);
220
+ }
221
+ };
222
+
223
+ /**
224
+ * HelpFormatter#addArgument(action) -> Void
225
+ * - action (object): action
226
+ *
227
+ * Add argument into current section
228
+ *
229
+ * Single variant of [[HelpFormatter#addArguments]]
230
+ **/
231
+ HelpFormatter.prototype.addArgument = function (action) {
232
+ if (action.help !== $$.SUPPRESS) {
233
+ var self = this;
234
+
235
+ // find all invocations
236
+ var invocations = [this._formatActionInvocation(action)];
237
+ var invocationLength = invocations[0].length;
238
+
239
+ var actionLength;
240
+
241
+ if (!!action._getSubactions) {
242
+ this._indent();
243
+ action._getSubactions().forEach(function (subaction) {
244
+
245
+ var invocationNew = self._formatActionInvocation(subaction);
246
+ invocations.push(invocationNew);
247
+ invocationLength = Math.max(invocationLength, invocationNew.length);
248
+
249
+ });
250
+ this._dedent();
251
+ }
252
+
253
+ // update the maximum item length
254
+ actionLength = invocationLength + this._currentIndent;
255
+ this._actionMaxLength = Math.max(this._actionMaxLength, actionLength);
256
+
257
+ // add the item to the list
258
+ this._addItem(this._formatAction, [action]);
259
+ }
260
+ };
261
+
262
+ /**
263
+ * HelpFormatter#addArguments(actions) -> Void
264
+ * - actions (array): actions list
265
+ *
266
+ * Mass add arguments into current section
267
+ *
268
+ * ##### Example
269
+ *
270
+ * formatter.startSection(actionGroup.title);
271
+ * formatter.addText(actionGroup.description);
272
+ * formatter.addArguments(actionGroup._groupActions);
273
+ * formatter.endSection();
274
+ *
275
+ **/
276
+ HelpFormatter.prototype.addArguments = function (actions) {
277
+ var self = this;
278
+ actions.forEach(function (action) {
279
+ self.addArgument(action);
280
+ });
281
+ };
282
+
283
+ //
284
+ // Help-formatting methods
285
+ //
286
+
287
+ /**
288
+ * HelpFormatter#formatHelp -> string
289
+ *
290
+ * Format help
291
+ *
292
+ * ##### Example
293
+ *
294
+ * formatter.addText(this.epilog);
295
+ * return formatter.formatHelp();
296
+ *
297
+ **/
298
+ HelpFormatter.prototype.formatHelp = function () {
299
+ var help = this._rootSection.formatHelp(this);
300
+ if (help) {
301
+ help = help.replace(this._longBreakMatcher, $$.EOL + $$.EOL);
302
+ help = _.str.strip(help, $$.EOL) + $$.EOL;
303
+ }
304
+ return help;
305
+ };
306
+
307
+ HelpFormatter.prototype._joinParts = function (partStrings) {
308
+ return partStrings.filter(function (part) {
309
+ return (!!part && part !== $$.SUPPRESS);
310
+ }).join('');
311
+ };
312
+
313
+ HelpFormatter.prototype._formatUsage = function (usage, actions, groups, prefix) {
314
+ if (!prefix && !_.isString(prefix)) {
315
+ prefix = 'usage: ';
316
+ }
317
+
318
+ actions = actions || [];
319
+ groups = groups || [];
320
+
321
+
322
+ // if usage is specified, use that
323
+ if (usage) {
324
+ usage = _.str.sprintf(usage, {prog: this._prog});
325
+
326
+ // if no optionals or positionals are available, usage is just prog
327
+ } else if (!usage && actions.length === 0) {
328
+ usage = this._prog;
329
+
330
+ // if optionals and positionals are available, calculate usage
331
+ } else if (!usage) {
332
+ var prog = this._prog;
333
+ var optionals = [];
334
+ var positionals = [];
335
+ var actionUsage;
336
+ var textWidth;
337
+
338
+ // split optionals from positionals
339
+ actions.forEach(function (action) {
340
+ if (action.isOptional()) {
341
+ optionals.push(action);
342
+ } else {
343
+ positionals.push(action);
344
+ }
345
+ });
346
+
347
+ // build full usage string
348
+ actionUsage = this._formatActionsUsage([].concat(optionals, positionals), groups);
349
+ usage = [prog, actionUsage].join(' ');
350
+
351
+ // wrap the usage parts if it's too long
352
+ textWidth = this._width - this._currentIndent;
353
+ if ((prefix.length + usage.length) > textWidth) {
354
+
355
+ // break usage into wrappable parts
356
+ var regexpPart = new RegExp('\\(.*?\\)+|\\[.*?\\]+|\\S+', 'g');
357
+ var optionalUsage = this._formatActionsUsage(optionals, groups);
358
+ var positionalUsage = this._formatActionsUsage(positionals, groups);
359
+
360
+
361
+ var optionalParts = optionalUsage.match(regexpPart);
362
+ var positionalParts = positionalUsage.match(regexpPart) || [];
363
+
364
+ if (optionalParts.join(' ') !== optionalUsage) {
365
+ throw new Error('assert "optionalParts.join(\' \') === optionalUsage"');
366
+ }
367
+ if (positionalParts.join(' ') !== positionalUsage) {
368
+ throw new Error('assert "positionalParts.join(\' \') === positionalUsage"');
369
+ }
370
+
371
+ // helper for wrapping lines
372
+ var _getLines = function (parts, indent, prefix) {
373
+ var lines = [];
374
+ var line = [];
375
+
376
+ var lineLength = !!prefix ? prefix.length - 1: indent.length - 1;
377
+
378
+ parts.forEach(function (part) {
379
+ if (lineLength + 1 + part.length > textWidth) {
380
+ lines.push(indent + line.join(' '));
381
+ line = [];
382
+ lineLength = indent.length - 1;
383
+ }
384
+ line.push(part);
385
+ lineLength += part.length + 1;
386
+ });
387
+
388
+ if (line) {
389
+ lines.push(indent + line.join(' '));
390
+ }
391
+ if (prefix) {
392
+ lines[0] = lines[0].substr(indent.length);
393
+ }
394
+ return lines;
395
+ };
396
+
397
+ var lines, indent, parts;
398
+ // if prog is short, follow it with optionals or positionals
399
+ if (prefix.length + prog.length <= 0.75 * textWidth) {
400
+ indent = _.str.repeat(' ', (prefix.length + prog.length + 1));
401
+ if (optionalParts) {
402
+ lines = [].concat(
403
+ _getLines([prog].concat(optionalParts), indent, prefix),
404
+ _getLines(positionalParts, indent)
405
+ );
406
+ } else if (positionalParts) {
407
+ lines = _getLines([prog].concat(positionalParts), indent, prefix);
408
+ } else {
409
+ lines = [prog];
410
+ }
411
+
412
+ // if prog is long, put it on its own line
413
+ } else {
414
+ indent = _.str.repeat(' ', prefix.length);
415
+ parts = optionalParts + positionalParts;
416
+ lines = _getLines(parts, indent);
417
+ if (lines.length > 1) {
418
+ lines = [].concat(
419
+ _getLines(optionalParts, indent),
420
+ _getLines(positionalParts, indent)
421
+ );
422
+ }
423
+ lines = [prog] + lines;
424
+ }
425
+ // join lines into usage
426
+ usage = lines.join($$.EOL);
427
+ }
428
+ }
429
+
430
+ // prefix with 'usage:'
431
+ return prefix + usage + $$.EOL + $$.EOL;
432
+ };
433
+
434
+ HelpFormatter.prototype._formatActionsUsage = function (actions, groups) {
435
+ // find group indices and identify actions in groups
436
+ var groupActions = [];
437
+ var inserts = [];
438
+ var self = this;
439
+
440
+ groups.forEach(function (group) {
441
+ var end;
442
+ var i;
443
+
444
+ var start = actions.indexOf(group._groupActions[0]);
445
+ if (start >= 0) {
446
+ end = start + group._groupActions.length;
447
+
448
+ //if (actions.slice(start, end) === group._groupActions) {
449
+ if (_.isEqual(actions.slice(start, end), group._groupActions)) {
450
+ group._groupActions.forEach(function (action) {
451
+ groupActions.push(action);
452
+ });
453
+
454
+ if (!group.required) {
455
+ if (!!inserts[start]) {
456
+ inserts[start] += ' [';
457
+ }
458
+ else {
459
+ inserts[start] = '[';
460
+ }
461
+ inserts[end] = ']';
462
+ } else {
463
+ if (!!inserts[start]) {
464
+ inserts[start] += ' (';
465
+ }
466
+ else {
467
+ inserts[start] = '(';
468
+ }
469
+ inserts[end] = ')';
470
+ }
471
+ for (i = start + 1; i < end; i += 1) {
472
+ inserts[i] = '|';
473
+ }
474
+ }
475
+ }
476
+ });
477
+
478
+ // collect all actions format strings
479
+ var parts = [];
480
+
481
+ actions.forEach(function (action, actionIndex) {
482
+ var part;
483
+ var optionString;
484
+ var argsDefault;
485
+ var argsString;
486
+
487
+ // suppressed arguments are marked with None
488
+ // remove | separators for suppressed arguments
489
+ if (action.help === $$.SUPPRESS) {
490
+ parts.push(null);
491
+ if (inserts[actionIndex] === '|') {
492
+ inserts.splice(actionIndex, actionIndex);
493
+ } else if (inserts[actionIndex + 1] === '|') {
494
+ inserts.splice(actionIndex + 1, actionIndex + 1);
495
+ }
496
+
497
+ // produce all arg strings
498
+ } else if (!action.isOptional()) {
499
+ part = self._formatArgs(action, action.dest);
500
+
501
+ // if it's in a group, strip the outer []
502
+ if (groupActions.indexOf(action) >= 0) {
503
+ if (part[0] === '[' && part[part.length - 1] === ']') {
504
+ part = part.slice(1, -1);
505
+ }
506
+ }
507
+ // add the action string to the list
508
+ parts.push(part);
509
+
510
+ // produce the first way to invoke the option in brackets
511
+ } else {
512
+ optionString = action.optionStrings[0];
513
+
514
+ // if the Optional doesn't take a value, format is: -s or --long
515
+ if (action.nargs === 0) {
516
+ part = '' + optionString;
517
+
518
+ // if the Optional takes a value, format is: -s ARGS or --long ARGS
519
+ } else {
520
+ argsDefault = action.dest.toUpperCase();
521
+ argsString = self._formatArgs(action, argsDefault);
522
+ part = optionString + ' ' + argsString;
523
+ }
524
+ // make it look optional if it's not required or in a group
525
+ if (!action.required && groupActions.indexOf(action) < 0) {
526
+ part = '[' + part + ']';
527
+ }
528
+ // add the action string to the list
529
+ parts.push(part);
530
+ }
531
+ });
532
+
533
+ // insert things at the necessary indices
534
+ for (var i = inserts.length - 1; i >= 0; --i) {
535
+ if (inserts[i] !== null) {
536
+ parts.splice(i, 0, inserts[i]);
537
+ }
538
+ }
539
+
540
+ // join all the action items with spaces
541
+ var text = parts.filter(function (part) {
542
+ return !!part;
543
+ }).join(' ');
544
+
545
+ // clean up separators for mutually exclusive groups
546
+ text = text.replace(/([\[(]) /g, '$1'); // remove spaces
547
+ text = text.replace(/ ([\])])/g, '$1');
548
+ text = text.replace(/\[ *\]/g, ''); // remove empty groups
549
+ text = text.replace(/\( *\)/g, '');
550
+ text = text.replace(/\(([^|]*)\)/g, '$1'); // remove () from single action groups
551
+
552
+ text = _.str.strip(text);
553
+
554
+ // return the text
555
+ return text;
556
+ };
557
+
558
+ HelpFormatter.prototype._formatText = function (text) {
559
+ text = _.str.sprintf(text, {prog: this._prog});
560
+ var textWidth = this._width - this._currentIndent;
561
+ var indentIncriment = _.str.repeat(' ', this._currentIndent);
562
+ return this._fillText(text, textWidth, indentIncriment) + $$.EOL + $$.EOL;
563
+ };
564
+
565
+ HelpFormatter.prototype._formatAction = function (action) {
566
+ var self = this;
567
+
568
+ var helpText;
569
+ var helpLines;
570
+ var parts;
571
+ var indentFirst;
572
+
573
+ // determine the required width and the entry label
574
+ var helpPosition = Math.min(this._actionMaxLength + 2, this._maxHelpPosition);
575
+ var helpWidth = this._width - helpPosition;
576
+ var actionWidth = helpPosition - this._currentIndent - 2;
577
+ var actionHeader = this._formatActionInvocation(action);
578
+
579
+ // no help; start on same line and add a final newline
580
+ if (!action.help) {
581
+ actionHeader = _.str.repeat(' ', this._currentIndent) + actionHeader + $$.EOL;
582
+
583
+ // short action name; start on the same line and pad two spaces
584
+ } else if (actionHeader.length <= actionWidth) {
585
+ actionHeader = _.str.repeat(' ', this._currentIndent) +
586
+ actionHeader +
587
+ ' ' +
588
+ _.str.repeat(' ', actionWidth - actionHeader.length);
589
+ indentFirst = 0;
590
+
591
+ // long action name; start on the next line
592
+ } else {
593
+ actionHeader = _.str.repeat(' ', this._currentIndent) + actionHeader + $$.EOL;
594
+ indentFirst = helpPosition;
595
+ }
596
+
597
+ // collect the pieces of the action help
598
+ parts = [actionHeader];
599
+
600
+ // if there was help for the action, add lines of help text
601
+ if (!!action.help) {
602
+ helpText = this._expandHelp(action);
603
+ helpLines = this._splitLines(helpText, helpWidth);
604
+ parts.push(_.str.repeat(' ', indentFirst) + helpLines[0] + $$.EOL);
605
+ helpLines.slice(1).forEach(function (line) {
606
+ parts.push(_.str.repeat(' ', helpPosition) + line + $$.EOL);
607
+ });
608
+
609
+ // or add a newline if the description doesn't end with one
610
+ } else if (actionHeader.charAt(actionHeader.length - 1) !== $$.EOL) {
611
+ parts.push($$.EOL);
612
+ }
613
+ // if there are any sub-actions, add their help as well
614
+ if (!!action._getSubactions) {
615
+ this._indent();
616
+ action._getSubactions().forEach(function (subaction) {
617
+ parts.push(self._formatAction(subaction));
618
+ });
619
+ this._dedent();
620
+ }
621
+ // return a single string
622
+ return this._joinParts(parts);
623
+ };
624
+
625
+ HelpFormatter.prototype._formatActionInvocation = function (action) {
626
+ if (!action.isOptional()) {
627
+ var format_func = this._metavarFormatter(action, action.dest);
628
+ var metavars = format_func(1);
629
+ return metavars[0];
630
+ } else {
631
+ var parts = [];
632
+ var argsDefault;
633
+ var argsString;
634
+
635
+ // if the Optional doesn't take a value, format is: -s, --long
636
+ if (action.nargs === 0) {
637
+ parts = parts.concat(action.optionStrings);
638
+
639
+ // if the Optional takes a value, format is: -s ARGS, --long ARGS
640
+ } else {
641
+ argsDefault = action.dest.toUpperCase();
642
+ argsString = this._formatArgs(action, argsDefault);
643
+ action.optionStrings.forEach(function (optionString) {
644
+ parts.push(optionString + ' ' + argsString);
645
+ });
646
+ }
647
+ return parts.join(', ');
648
+ }
649
+ };
650
+
651
+ HelpFormatter.prototype._metavarFormatter = function (action, metavarDefault) {
652
+ var result;
653
+
654
+ if (!!action.metavar || action.metavar === '') {
655
+ result = action.metavar;
656
+ } else if (!!action.choices) {
657
+ var choices = action.choices;
658
+
659
+ if (_.isString(choices)) {
660
+ choices = choices.split('').join(', ');
661
+ } else if (_.isArray(choices)) {
662
+ choices = choices.join(',');
663
+ }
664
+ else
665
+ {
666
+ choices = _.keys(choices).join(',');
667
+ }
668
+ result = '{' + choices + '}';
669
+ } else {
670
+ result = metavarDefault;
671
+ }
672
+
673
+ return function (size) {
674
+ if (Array.isArray(result)) {
675
+ return result;
676
+ } else {
677
+ var metavars = [];
678
+ for (var i = 0; i < size; i += 1) {
679
+ metavars.push(result);
680
+ }
681
+ return metavars;
682
+ }
683
+ };
684
+ };
685
+
686
+ HelpFormatter.prototype._formatArgs = function (action, metavarDefault) {
687
+ var result;
688
+ var metavars;
689
+
690
+ var buildMetavar = this._metavarFormatter(action, metavarDefault);
691
+
692
+ switch (action.nargs) {
693
+ case undefined:
694
+ case null:
695
+ metavars = buildMetavar(1);
696
+ result = '' + metavars[0];
697
+ break;
698
+ case $$.OPTIONAL:
699
+ metavars = buildMetavar(1);
700
+ result = '[' + metavars[0] + ']';
701
+ break;
702
+ case $$.ZERO_OR_MORE:
703
+ metavars = buildMetavar(2);
704
+ result = '[' + metavars[0] + ' [' + metavars[1] + ' ...]]';
705
+ break;
706
+ case $$.ONE_OR_MORE:
707
+ metavars = buildMetavar(2);
708
+ result = '' + metavars[0] + ' [' + metavars[1] + ' ...]';
709
+ break;
710
+ case $$.REMAINDER:
711
+ result = '...';
712
+ break;
713
+ case $$.PARSER:
714
+ metavars = buildMetavar(1);
715
+ result = metavars[0] + ' ...';
716
+ break;
717
+ default:
718
+ metavars = buildMetavar(action.nargs);
719
+ result = metavars.join(' ');
720
+ }
721
+ return result;
722
+ };
723
+
724
+ HelpFormatter.prototype._expandHelp = function (action) {
725
+ var params = { prog: this._prog };
726
+
727
+ Object.keys(action).forEach(function (actionProperty) {
728
+ var actionValue = action[actionProperty];
729
+
730
+ if (actionValue !== $$.SUPPRESS) {
731
+ params[actionProperty] = actionValue;
732
+ }
733
+ });
734
+
735
+ if (!!params.choices) {
736
+ if (_.isString(params.choices)) {
737
+ params.choices = params.choices.split('').join(', ');
738
+ }
739
+ else if (_.isArray(params.choices)) {
740
+ params.choices = params.choices.join(', ');
741
+ }
742
+ else {
743
+ params.choices = _.keys(params.choices).join(', ');
744
+ }
745
+ }
746
+
747
+ return _.str.sprintf(this._getHelpString(action), params);
748
+ };
749
+
750
+ HelpFormatter.prototype._splitLines = function (text, width) {
751
+ var lines = [];
752
+ var delimiters = [" ", ".", ",", "!", "?"];
753
+ var re = new RegExp('[' + delimiters.join('') + '][^' + delimiters.join('') + ']*$');
754
+
755
+ text = text.replace(/[\n\|\t]/g, ' ');
756
+
757
+ text = _.str.strip(text);
758
+ text = text.replace(this._whitespaceMatcher, ' ');
759
+
760
+ // Wraps the single paragraph in text (a string) so every line
761
+ // is at most width characters long.
762
+ text.split($$.EOL).forEach(function (line) {
763
+ if (width >= line.length) {
764
+ lines.push(line);
765
+ return;
766
+ }
767
+
768
+ var wrapStart = 0;
769
+ var wrapEnd = width;
770
+ var delimiterIndex = 0;
771
+ while (wrapEnd <= line.length) {
772
+ if (wrapEnd !== line.length && delimiters.indexOf(line[wrapEnd] < -1)) {
773
+ delimiterIndex = (re.exec(line.substring(wrapStart, wrapEnd)) || {}).index;
774
+ wrapEnd = wrapStart + delimiterIndex + 1;
775
+ }
776
+ lines.push(line.substring(wrapStart, wrapEnd));
777
+ wrapStart = wrapEnd;
778
+ wrapEnd += width;
779
+ }
780
+ if (wrapStart < line.length) {
781
+ lines.push(line.substring(wrapStart, wrapEnd));
782
+ }
783
+ });
784
+
785
+ return lines;
786
+ };
787
+
788
+ HelpFormatter.prototype._fillText = function (text, width, indent) {
789
+ var lines = this._splitLines(text, width);
790
+ lines = lines.map(function (line) {
791
+ return indent + line;
792
+ });
793
+ return lines.join($$.EOL);
794
+ };
795
+
796
+ HelpFormatter.prototype._getHelpString = function (action) {
797
+ return action.help;
798
+ };