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,26 @@
1
+ /*:nodoc:*
2
+ * class ActionStoreTrue
3
+ *
4
+ * This action store the values True respectively.
5
+ * This isspecial cases of 'storeConst'
6
+ *
7
+ * This class inherited from [[Action]]
8
+ **/
9
+ 'use strict';
10
+
11
+ var util = require('util');
12
+
13
+ var ActionStoreConstant = require('./constant');
14
+
15
+ /*:nodoc:*
16
+ * new ActionStoreTrue(options)
17
+ * - options (object): options hash see [[Action.new]]
18
+ *
19
+ **/
20
+ var ActionStoreTrue = module.exports = function ActionStoreTrue(options) {
21
+ options = options || {};
22
+ options.constant = true;
23
+ options.defaultValue = options.defaultValue !== null ? options.defaultValue: false;
24
+ ActionStoreConstant.call(this, options);
25
+ };
26
+ util.inherits(ActionStoreTrue, ActionStoreConstant);
@@ -0,0 +1,148 @@
1
+ /** internal
2
+ * class ActionSubparsers
3
+ *
4
+ * Support the creation of such sub-commands with the addSubparsers()
5
+ *
6
+ * This class inherited from [[Action]]
7
+ **/
8
+ 'use strict';
9
+
10
+ var util = require('util');
11
+ var format = require('util').format;
12
+ var _ = require('underscore');
13
+
14
+
15
+ var Action = require('../action');
16
+
17
+ // Constants
18
+ var $$ = require('../const');
19
+
20
+ // Errors
21
+ var argumentErrorHelper = require('../argument/error');
22
+
23
+
24
+ /*:nodoc:*
25
+ * new ChoicesPseudoAction(name, help)
26
+ *
27
+ * Create pseudo action for correct help text
28
+ *
29
+ **/
30
+ var ChoicesPseudoAction = function (name, help) {
31
+ var options = {
32
+ optionStrings: [],
33
+ dest: name,
34
+ help: help
35
+ };
36
+
37
+ Action.call(this, options);
38
+ };
39
+ util.inherits(ChoicesPseudoAction, Action);
40
+
41
+ /**
42
+ * new ActionSubparsers(options)
43
+ * - options (object): options hash see [[Action.new]]
44
+ *
45
+ **/
46
+ var ActionSubparsers = module.exports = function ActionSubparsers(options) {
47
+ options = options || {};
48
+ options.dest = options.dest || $$.SUPPRESS;
49
+ options.nargs = $$.PARSER;
50
+
51
+ this.debug = (options.debug === true);
52
+
53
+ this._progPrefix = options.prog;
54
+ this._parserClass = options.parserClass;
55
+ this._nameParserMap = {};
56
+ this._choicesActions = [];
57
+
58
+ options.choices = this._nameParserMap;
59
+ Action.call(this, options);
60
+ };
61
+ util.inherits(ActionSubparsers, Action);
62
+
63
+ /*:nodoc:*
64
+ * ActionSubparsers#addParser(name, options) -> ArgumentParser
65
+ * - name (string): sub-command name
66
+ * - options (object): see [[ArgumentParser.new]]
67
+ *
68
+ * Note:
69
+ * addParser supports an additional aliases option,
70
+ * which allows multiple strings to refer to the same subparser.
71
+ * This example, like svn, aliases co as a shorthand for checkout
72
+ *
73
+ **/
74
+ ActionSubparsers.prototype.addParser = function (name, options) {
75
+ var parser;
76
+
77
+ var self = this;
78
+
79
+ options = options || {};
80
+
81
+ options.debug = (this.debug === true);
82
+
83
+ // set program from the existing prefix
84
+ if (!options.prog) {
85
+ options.prog = this._progPrefix + ' ' + name;
86
+ }
87
+
88
+ var aliases = options.aliases || [];
89
+
90
+ // create a pseudo-action to hold the choice help
91
+ if (!!options.help || _.isString(options.help)) {
92
+ var help = options.help;
93
+ delete options.help;
94
+
95
+ var choiceAction = new ChoicesPseudoAction(name, help);
96
+ this._choicesActions.push(choiceAction);
97
+ }
98
+
99
+ // create the parser and add it to the map
100
+ parser = new this._parserClass(options);
101
+ this._nameParserMap[name] = parser;
102
+
103
+ // make parser available under aliases also
104
+ aliases.forEach(function (alias) {
105
+ self._nameParserMap[alias] = parser;
106
+ });
107
+
108
+ return parser;
109
+ };
110
+
111
+ ActionSubparsers.prototype._getSubactions = function () {
112
+ return this._choicesActions;
113
+ };
114
+
115
+ /*:nodoc:*
116
+ * ActionSubparsers#call(parser, namespace, values, optionString) -> Void
117
+ * - parser (ArgumentParser): current parser
118
+ * - namespace (Namespace): namespace for output data
119
+ * - values (Array): parsed values
120
+ * - optionString (Array): input option string(not parsed)
121
+ *
122
+ * Call the action. Parse input aguments
123
+ **/
124
+ ActionSubparsers.prototype.call = function (parser, namespace, values) {
125
+ var parserName = values[0];
126
+ var argStrings = values.slice(1);
127
+
128
+ // set the parser name if requested
129
+ if (this.dest !== $$.SUPPRESS) {
130
+ namespace[this.dest] = parserName;
131
+ }
132
+
133
+ // select the parser
134
+ if (!!this._nameParserMap[parserName]) {
135
+ parser = this._nameParserMap[parserName];
136
+ } else {
137
+ throw argumentErrorHelper(format(
138
+ 'Unknown parser "%s" (choices: [%s]).',
139
+ parserName,
140
+ _.keys(this._nameParserMap).join(', ')
141
+ ));
142
+ }
143
+
144
+ // parse all the remaining options into the namespace
145
+ parser.parseArgs(argStrings, namespace);
146
+ };
147
+
148
+
@@ -0,0 +1,50 @@
1
+ /*:nodoc:*
2
+ * class ActionVersion
3
+ *
4
+ * Support action for printing program version
5
+ * This class inherited from [[Action]]
6
+ **/
7
+ 'use strict';
8
+
9
+ var util = require('util');
10
+
11
+ var Action = require('../action');
12
+
13
+ //
14
+ // Constants
15
+ //
16
+ var $$ = require('../const');
17
+
18
+ /*:nodoc:*
19
+ * new ActionVersion(options)
20
+ * - options (object): options hash see [[Action.new]]
21
+ *
22
+ **/
23
+ var ActionVersion = module.exports = function ActionVersion(options) {
24
+ options = options || {};
25
+ options.defaultValue = (!!options.defaultValue ? options.defaultValue: $$.SUPPRESS);
26
+ options.dest = (options.dest || $$.SUPPRESS);
27
+ options.nargs = 0;
28
+ this.version = options.version;
29
+ Action.call(this, options);
30
+ };
31
+ util.inherits(ActionVersion, Action);
32
+
33
+ /*:nodoc:*
34
+ * ActionVersion#call(parser, namespace, values, optionString) -> Void
35
+ * - parser (ArgumentParser): current parser
36
+ * - namespace (Namespace): namespace for output data
37
+ * - values (Array): parsed values
38
+ * - optionString (Array): input option string(not parsed)
39
+ *
40
+ * Print version and exit
41
+ **/
42
+ ActionVersion.prototype.call = function (parser) {
43
+ var version = this.version || parser.version;
44
+ var formatter = parser._getFormatter();
45
+ formatter.addText(version);
46
+ parser.exit(0, formatter.formatHelp());
47
+ };
48
+
49
+
50
+
@@ -0,0 +1,481 @@
1
+ /** internal
2
+ * class ActionContainer
3
+ *
4
+ * Action container. Parent for [[ArgumentParser]] and [[ArgumentGroup]]
5
+ **/
6
+
7
+ 'use strict';
8
+
9
+ var format = require('util').format;
10
+ var _ = require('underscore');
11
+
12
+ _.str = require('underscore.string');
13
+
14
+ // Constants
15
+ var $$ = require('./const');
16
+
17
+ //Actions
18
+ var ActionHelp = require('./action/help');
19
+ var ActionAppend = require('./action/append');
20
+ var ActionAppendConstant = require('./action/append/constant');
21
+ var ActionCount = require('./action/count');
22
+ var ActionStore = require('./action/store');
23
+ var ActionStoreConstant = require('./action/store/constant');
24
+ var ActionStoreTrue = require('./action/store/true');
25
+ var ActionStoreFalse = require('./action/store/false');
26
+ var ActionVersion = require('./action/version');
27
+ var ActionSubparsers = require('./action/subparsers');
28
+
29
+ // Errors
30
+ var argumentErrorHelper = require('./argument/error');
31
+
32
+
33
+
34
+ /**
35
+ * new ActionContainer(options)
36
+ *
37
+ * Action container. Parent for [[ArgumentParser]] and [[ArgumentGroup]]
38
+ *
39
+ * ##### Options:
40
+ *
41
+ * - `description` -- A description of what the program does
42
+ * - `prefixChars` -- Characters that prefix optional arguments
43
+ * - `argumentDefault` -- The default value for all arguments
44
+ * - `conflictHandler` -- The conflict handler to use for duplicate arguments
45
+ **/
46
+ var ActionContainer = module.exports = function ActionContainer(options) {
47
+ options = options || {};
48
+
49
+ this.description = options.description;
50
+ this.argumentDefault = options.argumentDefault;
51
+ this.prefixChars = options.prefixChars || '';
52
+ this.conflictHandler = options.conflictHandler;
53
+
54
+ // set up registries
55
+ this._registries = {};
56
+
57
+ // register actions
58
+ this.register('action', null, ActionStore);
59
+ this.register('action', 'store', ActionStore);
60
+ this.register('action', 'storeConst', ActionStoreConstant);
61
+ this.register('action', 'storeTrue', ActionStoreTrue);
62
+ this.register('action', 'storeFalse', ActionStoreFalse);
63
+ this.register('action', 'append', ActionAppend);
64
+ this.register('action', 'appendConst', ActionAppendConstant);
65
+ this.register('action', 'count', ActionCount);
66
+ this.register('action', 'help', ActionHelp);
67
+ this.register('action', 'version', ActionVersion);
68
+ this.register('action', 'parsers', ActionSubparsers);
69
+
70
+ // raise an exception if the conflict handler is invalid
71
+ this._getHandler();
72
+
73
+ // action storage
74
+ this._actions = [];
75
+ this._optionStringActions = {};
76
+
77
+ // groups
78
+ this._actionGroups = [];
79
+ this._mutuallyExclusiveGroups = [];
80
+
81
+ // defaults storage
82
+ this._defaults = {};
83
+
84
+ // determines whether an "option" looks like a negative number
85
+ // -1, -1.5 -5e+4
86
+ this._regexpNegativeNumber = new RegExp('^[-]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$');
87
+
88
+ // whether or not there are any optionals that look like negative
89
+ // numbers -- uses a list so it can be shared and edited
90
+ this._hasNegativeNumberOptionals = [];
91
+ };
92
+
93
+ // Groups must be required, then ActionContainer already defined
94
+ var ArgumentGroup = require('./argument/group');
95
+ var MutuallyExclusiveGroup = require('./argument/exclusive');
96
+
97
+ //
98
+ // Registration methods
99
+ //
100
+
101
+ /**
102
+ * ActionContainer#register(registryName, value, object) -> Void
103
+ * - registryName (String) : object type action|type
104
+ * - value (string) : keyword
105
+ * - object (Object|Function) : handler
106
+ *
107
+ * Register handlers
108
+ **/
109
+ ActionContainer.prototype.register = function (registryName, value, object) {
110
+ this._registries[registryName] = this._registries[registryName] || {};
111
+ this._registries[registryName][value] = object;
112
+ };
113
+
114
+ ActionContainer.prototype._registryGet = function (registryName, value, defaultValue) {
115
+ if (3 > arguments.length) {
116
+ defaultValue = null;
117
+ }
118
+ return this._registries[registryName][value] || defaultValue;
119
+ };
120
+
121
+ //
122
+ // Namespace default accessor methods
123
+ //
124
+
125
+ /**
126
+ * ActionContainer#setDefaults(options) -> Void
127
+ * - options (object):hash of options see [[Action.new]]
128
+ *
129
+ * Set defaults
130
+ **/
131
+ ActionContainer.prototype.setDefaults = function (options) {
132
+ options = options || {};
133
+ for (var property in options) {
134
+ this._defaults[property] = options[property];
135
+ }
136
+
137
+ // if these defaults match any existing arguments, replace the previous
138
+ // default on the object with the new one
139
+ this._actions.forEach(function (action) {
140
+ if (action.dest in options) {
141
+ action.defaultValue = options[action.dest];
142
+ }
143
+ });
144
+ };
145
+
146
+ /**
147
+ * ActionContainer#getDefault(dest) -> Mixed
148
+ * - dest (string): action destination
149
+ *
150
+ * Return action default value
151
+ **/
152
+ ActionContainer.prototype.getDefault = function (dest) {
153
+ var result = (_.has(this._defaults, dest)) ? this._defaults[dest] : null;
154
+
155
+ this._actions.forEach(function (action) {
156
+ if (action.dest === dest && _.has(action, 'defaultValue')) {
157
+ result = action.defaultValue;
158
+ }
159
+ });
160
+
161
+ return result;
162
+ };
163
+ //
164
+ // Adding argument actions
165
+ //
166
+
167
+ /**
168
+ * ActionContainer#addArgument(args, options) -> Object
169
+ * - args (Array): array of argument keys
170
+ * - options (Object): action objects see [[Action.new]]
171
+ *
172
+ * #### Examples
173
+ * - addArgument([-f, --foo], {action:'store', defaultValue=1, ...})
174
+ * - addArgument(['bar'], action: 'store', nargs:1, ...})
175
+ **/
176
+ ActionContainer.prototype.addArgument = function (args, options) {
177
+ args = args;
178
+ options = options || {};
179
+
180
+ if (!_.isArray(args)) {
181
+ throw new TypeError('addArgument first argument should be an array');
182
+ }
183
+ if (!_.isObject(options) || _.isArray(options)) {
184
+ throw new TypeError('addArgument second argument should be a hash');
185
+ }
186
+
187
+ // if no positional args are supplied or only one is supplied and
188
+ // it doesn't look like an option string, parse a positional argument
189
+ if (!args || args.length === 1 && this.prefixChars.indexOf(args[0][0]) < 0) {
190
+ if (args && !!options.dest) {
191
+ throw new Error('dest supplied twice for positional argument');
192
+ }
193
+ options = this._getPositional(args, options);
194
+
195
+ // otherwise, we're adding an optional argument
196
+ } else {
197
+ options = this._getOptional(args, options);
198
+ }
199
+
200
+ // if no default was supplied, use the parser-level default
201
+ if (_.isUndefined(options.defaultValue)) {
202
+ var dest = options.dest;
203
+ if (_.has(this._defaults, dest)) {
204
+ options.defaultValue = this._defaults[dest];
205
+ } else if (!_.isUndefined(this.argumentDefault)) {
206
+ options.defaultValue = this.argumentDefault;
207
+ }
208
+ }
209
+
210
+ // create the action object, and add it to the parser
211
+ var ActionClass = this._popActionClass(options);
212
+ if (! _.isFunction(ActionClass)) {
213
+ throw new Error(format('Unknown action "%s".', ActionClass));
214
+ }
215
+ var action = new ActionClass(options);
216
+
217
+ // throw an error if the action type is not callable
218
+ var typeFunction = this._registryGet('type', action.type, action.type);
219
+ if (!_.isFunction(typeFunction)) {
220
+ throw new Error(format('"%s" is not callable', typeFunction));
221
+ }
222
+
223
+ return this._addAction(action);
224
+ };
225
+
226
+ /**
227
+ * ActionContainer#addArgumentGroup(options) -> ArgumentGroup
228
+ * - options (Object): hash of options see [[ArgumentGroup.new]]
229
+ *
230
+ * Create new arguments groups
231
+ **/
232
+ ActionContainer.prototype.addArgumentGroup = function (options) {
233
+ var group = new ArgumentGroup(this, options);
234
+ this._actionGroups.push(group);
235
+ return group;
236
+ };
237
+
238
+ /**
239
+ * ActionContainer#addMutuallyExclusiveGroup(options) -> ArgumentGroup
240
+ * - options (Object): {required: false}
241
+ *
242
+ * Create new mutual exclusive groups
243
+ **/
244
+ ActionContainer.prototype.addMutuallyExclusiveGroup = function (options) {
245
+ var group = new MutuallyExclusiveGroup(this, options);
246
+ this._mutuallyExclusiveGroups.push(group);
247
+ return group;
248
+ };
249
+
250
+ ActionContainer.prototype._addAction = function (action) {
251
+ var self = this;
252
+
253
+ // resolve any conflicts
254
+ this._checkConflict(action);
255
+
256
+ // add to actions list
257
+ this._actions.push(action);
258
+ action.container = this;
259
+
260
+ // index the action by any option strings it has
261
+ action.optionStrings.forEach(function (optionString) {
262
+ self._optionStringActions[optionString] = action;
263
+ });
264
+
265
+ // set the flag if any option strings look like negative numbers
266
+ action.optionStrings.forEach(function (optionString) {
267
+ if (optionString.match(self._regexpNegativeNumber)) {
268
+ if (!_.any(self._hasNegativeNumberOptionals)) {
269
+ self._hasNegativeNumberOptionals.push(true);
270
+ }
271
+ }
272
+ });
273
+
274
+ // return the created action
275
+ return action;
276
+ };
277
+
278
+ ActionContainer.prototype._removeAction = function (action) {
279
+ var actionIndex = this._actions.indexOf(action);
280
+ if (actionIndex >= 0) {
281
+ this._actions.splice(actionIndex, 1);
282
+ }
283
+ };
284
+
285
+ ActionContainer.prototype._addContainerActions = function (container) {
286
+ // collect groups by titles
287
+ var titleGroupMap = {};
288
+ this._actionGroups.forEach(function (group) {
289
+ if (titleGroupMap[group.title]) {
290
+ throw new Error(format('Cannot merge actions - two groups are named "%s".', group.title));
291
+ }
292
+ titleGroupMap[group.title] = group;
293
+ });
294
+
295
+ // map each action to its group
296
+ var groupMap = {};
297
+ function actionHash(action) {
298
+ // unique (hopefully?) string suitable as dictionary key
299
+ return action.getName();
300
+ }
301
+ container._actionGroups.forEach(function (group) {
302
+ // if a group with the title exists, use that, otherwise
303
+ // create a new group matching the container's group
304
+ if (!titleGroupMap[group.title]) {
305
+ titleGroupMap[group.title] = this.addArgumentGroup({
306
+ title: group.title,
307
+ description: group.description
308
+ });
309
+ }
310
+
311
+ // map the actions to their new group
312
+ group._groupActions.forEach(function (action) {
313
+ groupMap[actionHash(action)] = titleGroupMap[group.title];
314
+ });
315
+ }, this);
316
+
317
+ // add container's mutually exclusive groups
318
+ // NOTE: if add_mutually_exclusive_group ever gains title= and
319
+ // description= then this code will need to be expanded as above
320
+ var mutexGroup;
321
+ container._mutuallyExclusiveGroups.forEach(function (group) {
322
+ mutexGroup = this.addMutuallyExclusiveGroup({
323
+ required: group.required
324
+ });
325
+ // map the actions to their new mutex group
326
+ group._groupActions.forEach(function (action) {
327
+ groupMap[actionHash(action)] = mutexGroup;
328
+ });
329
+ }, this); // forEach takes a 'this' argument
330
+
331
+ // add all actions to this container or their group
332
+ container._actions.forEach(function (action) {
333
+ var key = actionHash(action);
334
+ if (!!groupMap[key]) {
335
+ groupMap[key]._addAction(action);
336
+ }
337
+ else
338
+ {
339
+ this._addAction(action);
340
+ }
341
+ });
342
+ };
343
+
344
+ ActionContainer.prototype._getPositional = function (dest, options) {
345
+ if (_.isArray(dest)) {
346
+ dest = _.first(dest);
347
+ }
348
+ // make sure required is not specified
349
+ if (options.required) {
350
+ throw new Error('"required" is an invalid argument for positionals.');
351
+ }
352
+
353
+ // mark positional arguments as required if at least one is
354
+ // always required
355
+ if (options.nargs !== $$.OPTIONAL && options.nargs !== $$.ZERO_OR_MORE) {
356
+ options.required = true;
357
+ }
358
+ if (options.nargs === $$.ZERO_OR_MORE && options.defaultValue === undefined) {
359
+ options.required = true;
360
+ }
361
+
362
+ // return the keyword arguments with no option strings
363
+ options.dest = dest;
364
+ options.optionStrings = [];
365
+ return options;
366
+ };
367
+
368
+ ActionContainer.prototype._getOptional = function (args, options) {
369
+ var prefixChars = this.prefixChars;
370
+ var optionStrings = [];
371
+ var optionStringsLong = [];
372
+
373
+ // determine short and long option strings
374
+ args.forEach(function (optionString) {
375
+ // error on strings that don't start with an appropriate prefix
376
+ if (prefixChars.indexOf(optionString[0]) < 0) {
377
+ throw new Error(format('Invalid option string "%s": must start with a "%s".',
378
+ optionString,
379
+ prefixChars
380
+ ));
381
+ }
382
+
383
+ // strings starting with two prefix characters are long options
384
+ optionStrings.push(optionString);
385
+ if (optionString.length > 1 && prefixChars.indexOf(optionString[1]) >= 0) {
386
+ optionStringsLong.push(optionString);
387
+ }
388
+ });
389
+
390
+ // infer dest, '--foo-bar' -> 'foo_bar' and '-x' -> 'x'
391
+ var dest = options.dest || null;
392
+ delete options.dest;
393
+
394
+ if (!dest) {
395
+ var optionStringDest = optionStringsLong.length ? optionStringsLong[0] :optionStrings[0];
396
+ dest = _.str.strip(optionStringDest, this.prefixChars);
397
+
398
+ if (dest.length === 0) {
399
+ throw new Error(
400
+ format('dest= is required for options like "%s"', optionStrings.join(', '))
401
+ );
402
+ }
403
+ dest = dest.replace(/-/g, '_');
404
+ }
405
+
406
+ // return the updated keyword arguments
407
+ options.dest = dest;
408
+ options.optionStrings = optionStrings;
409
+
410
+ return options;
411
+ };
412
+
413
+ ActionContainer.prototype._popActionClass = function (options, defaultValue) {
414
+ defaultValue = defaultValue || null;
415
+
416
+ var action = (options.action || defaultValue);
417
+ delete options.action;
418
+
419
+ var actionClass = this._registryGet('action', action, action);
420
+ return actionClass;
421
+ };
422
+
423
+ ActionContainer.prototype._getHandler = function () {
424
+ var handlerString = this.conflictHandler;
425
+ var handlerFuncName = "_handleConflict" + _.str.capitalize(handlerString);
426
+ var func = this[handlerFuncName];
427
+ if (typeof func === 'undefined') {
428
+ var msg = "invalid conflict resolution value: " + handlerString;
429
+ throw new Error(msg);
430
+ } else {
431
+ return func;
432
+ }
433
+ };
434
+
435
+ ActionContainer.prototype._checkConflict = function (action) {
436
+ var optionStringActions = this._optionStringActions;
437
+ var conflictOptionals = [];
438
+
439
+ // find all options that conflict with this option
440
+ // collect pairs, the string, and an existing action that it conflicts with
441
+ action.optionStrings.forEach(function (optionString) {
442
+ var conflOptional = optionStringActions[optionString];
443
+ if (typeof conflOptional !== 'undefined') {
444
+ conflictOptionals.push([optionString, conflOptional]);
445
+ }
446
+ });
447
+
448
+ if (conflictOptionals.length > 0) {
449
+ var conflictHandler = this._getHandler();
450
+ conflictHandler.call(this, action, conflictOptionals);
451
+ }
452
+ };
453
+
454
+ ActionContainer.prototype._handleConflictError = function (action, conflOptionals) {
455
+ var conflicts = _.map(conflOptionals, function (pair) {return pair[0]; });
456
+ conflicts = conflicts.join(', ');
457
+ throw argumentErrorHelper(
458
+ action,
459
+ format('Conflicting option string(s): %s', conflicts)
460
+ );
461
+ };
462
+
463
+ ActionContainer.prototype._handleConflictResolve = function (action, conflOptionals) {
464
+ // remove all conflicting options
465
+ var self = this;
466
+ conflOptionals.forEach(function (pair) {
467
+ var optionString = pair[0];
468
+ var conflictingAction = pair[1];
469
+ // remove the conflicting option string
470
+ var i = conflictingAction.optionStrings.indexOf(optionString);
471
+ if (i >= 0) {
472
+ conflictingAction.optionStrings.splice(i, 1);
473
+ }
474
+ delete self._optionStringActions[optionString];
475
+ // if the option now has no option string, remove it from the
476
+ // container holding it
477
+ if (conflictingAction.optionStrings.length === 0) {
478
+ conflictingAction.container._removeAction(conflictingAction);
479
+ }
480
+ });
481
+ };