opal-wedge 0.9.0.dev

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 (830) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.gitmodules +7 -0
  4. data/.inch.yml +19 -0
  5. data/.jshintrc +48 -0
  6. data/.rspec +3 -0
  7. data/.spectator +2 -0
  8. data/.spectator-mspec +3 -0
  9. data/.travis.yml +60 -0
  10. data/.yardopts +6 -0
  11. data/CHANGELOG.md +571 -0
  12. data/CODE_OF_CONDUCT.md +15 -0
  13. data/CONTRIBUTING.md +192 -0
  14. data/Gemfile +26 -0
  15. data/Guardfile +77 -0
  16. data/LICENSE +19 -0
  17. data/README.md +167 -0
  18. data/Rakefile +15 -0
  19. data/benchmark/benchmarks +103 -0
  20. data/benchmark/bm_array_intersection_numbers.rb +7 -0
  21. data/benchmark/bm_array_intersection_objects.rb +7 -0
  22. data/benchmark/bm_array_intersection_strings.rb +7 -0
  23. data/benchmark/bm_array_minus_numbers.rb +7 -0
  24. data/benchmark/bm_array_minus_objects.rb +7 -0
  25. data/benchmark/bm_array_minus_strings.rb +7 -0
  26. data/benchmark/bm_array_union_numbers.rb +7 -0
  27. data/benchmark/bm_array_union_objects.rb +7 -0
  28. data/benchmark/bm_array_union_strings.rb +7 -0
  29. data/benchmark/bm_array_uniq_bang_numbers.rb +5 -0
  30. data/benchmark/bm_array_uniq_bang_objects.rb +5 -0
  31. data/benchmark/bm_array_uniq_bang_strings.rb +5 -0
  32. data/benchmark/bm_array_uniq_numbers.rb +5 -0
  33. data/benchmark/bm_array_uniq_objects.rb +5 -0
  34. data/benchmark/bm_array_uniq_strings.rb +5 -0
  35. data/benchmark/bm_dispatch_bind_table.rb +57 -0
  36. data/benchmark/bm_dispatch_code_gen.rb +65 -0
  37. data/benchmark/bm_dispatch_code_gen_if.rb +64 -0
  38. data/benchmark/bm_dispatch_hardcoded.rb +44 -0
  39. data/benchmark/bm_dispatch_send.rb +38 -0
  40. data/benchmark/bm_dispatch_send_table.rb +57 -0
  41. data/benchmark/bm_hash_assoc_object.rb +11 -0
  42. data/benchmark/bm_hash_assoc_string.rb +9 -0
  43. data/benchmark/bm_hash_clone_object.rb +9 -0
  44. data/benchmark/bm_hash_clone_string.rb +9 -0
  45. data/benchmark/bm_hash_delete_object.rb +11 -0
  46. data/benchmark/bm_hash_delete_string.rb +9 -0
  47. data/benchmark/bm_hash_each_key_object.rb +9 -0
  48. data/benchmark/bm_hash_each_key_string.rb +9 -0
  49. data/benchmark/bm_hash_each_object.rb +9 -0
  50. data/benchmark/bm_hash_each_string.rb +9 -0
  51. data/benchmark/bm_hash_each_value_object.rb +9 -0
  52. data/benchmark/bm_hash_each_value_string.rb +9 -0
  53. data/benchmark/bm_hash_element_reference_object.rb +11 -0
  54. data/benchmark/bm_hash_element_reference_string.rb +9 -0
  55. data/benchmark/bm_hash_element_set_object.rb +5 -0
  56. data/benchmark/bm_hash_element_set_string.rb +5 -0
  57. data/benchmark/bm_hash_equal_value_object.rb +14 -0
  58. data/benchmark/bm_hash_equal_value_string.rb +11 -0
  59. data/benchmark/bm_hash_fetch_object.rb +11 -0
  60. data/benchmark/bm_hash_fetch_string.rb +9 -0
  61. data/benchmark/bm_hash_flatten_object.rb +9 -0
  62. data/benchmark/bm_hash_flatten_string.rb +9 -0
  63. data/benchmark/bm_hash_has_key_object.rb +11 -0
  64. data/benchmark/bm_hash_has_key_string.rb +9 -0
  65. data/benchmark/bm_hash_has_value_object.rb +9 -0
  66. data/benchmark/bm_hash_has_value_string.rb +9 -0
  67. data/benchmark/bm_hash_hash_object.rb +9 -0
  68. data/benchmark/bm_hash_hash_string.rb +9 -0
  69. data/benchmark/bm_hash_inspect_object.rb +9 -0
  70. data/benchmark/bm_hash_inspect_string.rb +9 -0
  71. data/benchmark/bm_hash_invert_object.rb +9 -0
  72. data/benchmark/bm_hash_invert_string.rb +9 -0
  73. data/benchmark/bm_hash_keep_if_object.rb +9 -0
  74. data/benchmark/bm_hash_keep_if_string.rb +9 -0
  75. data/benchmark/bm_hash_key_object.rb +9 -0
  76. data/benchmark/bm_hash_key_string.rb +9 -0
  77. data/benchmark/bm_hash_keys_object.rb +9 -0
  78. data/benchmark/bm_hash_keys_string.rb +9 -0
  79. data/benchmark/bm_hash_literal_mixed_large.rb +3 -0
  80. data/benchmark/bm_hash_literal_mixed_small.rb +3 -0
  81. data/benchmark/bm_hash_literal_object_large.rb +4 -0
  82. data/benchmark/bm_hash_literal_object_small.rb +3 -0
  83. data/benchmark/bm_hash_literal_string_large.rb +4 -0
  84. data/benchmark/bm_hash_literal_string_small.rb +3 -0
  85. data/benchmark/bm_hash_merge_object.rb +22 -0
  86. data/benchmark/bm_hash_merge_string.rb +18 -0
  87. data/benchmark/bm_hash_rassoc_object.rb +9 -0
  88. data/benchmark/bm_hash_rassoc_string.rb +9 -0
  89. data/benchmark/bm_hash_rehash_object.rb +9 -0
  90. data/benchmark/bm_hash_rehash_string.rb +9 -0
  91. data/benchmark/bm_hash_reject_bang_object.rb +9 -0
  92. data/benchmark/bm_hash_reject_bang_string.rb +9 -0
  93. data/benchmark/bm_hash_reject_object.rb +9 -0
  94. data/benchmark/bm_hash_reject_string.rb +9 -0
  95. data/benchmark/bm_hash_replace_object.rb +18 -0
  96. data/benchmark/bm_hash_replace_string.rb +14 -0
  97. data/benchmark/bm_hash_select_bang_object.rb +9 -0
  98. data/benchmark/bm_hash_select_bang_string.rb +9 -0
  99. data/benchmark/bm_hash_select_object.rb +9 -0
  100. data/benchmark/bm_hash_select_string.rb +9 -0
  101. data/benchmark/bm_hash_shift_object.rb +10 -0
  102. data/benchmark/bm_hash_shift_string.rb +10 -0
  103. data/benchmark/bm_hash_to_a_object.rb +9 -0
  104. data/benchmark/bm_hash_to_a_string.rb +9 -0
  105. data/benchmark/bm_hash_to_h_object.rb +10 -0
  106. data/benchmark/bm_hash_to_h_string.rb +10 -0
  107. data/benchmark/bm_hash_values_object.rb +9 -0
  108. data/benchmark/bm_hash_values_string.rb +9 -0
  109. data/benchmark/run.rb +37 -0
  110. data/bin/opal +27 -0
  111. data/bin/opal-build +77 -0
  112. data/bin/opal-mspec +10 -0
  113. data/bin/opal-repl +72 -0
  114. data/config.ru +14 -0
  115. data/docs/compiler_directives.md +127 -0
  116. data/examples/rack/.gitignore +1 -0
  117. data/examples/rack/Gemfile +3 -0
  118. data/examples/rack/app/application.rb +13 -0
  119. data/examples/rack/app/user.rb +22 -0
  120. data/examples/rack/config.ru +20 -0
  121. data/examples/rack/index.html.erb +10 -0
  122. data/examples/sinatra/Gemfile +5 -0
  123. data/examples/sinatra/app/application.rb +7 -0
  124. data/examples/sinatra/config.ru +38 -0
  125. data/lib/mspec/opal/main.rb.erb +9 -0
  126. data/lib/mspec/opal/new.html.erb +1 -0
  127. data/lib/mspec/opal/rake_task.rb +248 -0
  128. data/lib/mspec/opal/runner.rb +281 -0
  129. data/lib/mspec/opal/special_calls.rb +44 -0
  130. data/lib/mspec/opal/sprockets.js +57 -0
  131. data/lib/opal-wedge.rb +4 -0
  132. data/lib/opal.rb +11 -0
  133. data/lib/opal/builder.rb +161 -0
  134. data/lib/opal/builder_processors.rb +149 -0
  135. data/lib/opal/cli.rb +162 -0
  136. data/lib/opal/cli_options.rb +158 -0
  137. data/lib/opal/cli_runners.rb +11 -0
  138. data/lib/opal/cli_runners/apple_script.rb +65 -0
  139. data/lib/opal/cli_runners/nodejs.rb +63 -0
  140. data/lib/opal/cli_runners/phantom.js +44 -0
  141. data/lib/opal/cli_runners/phantomjs.rb +28 -0
  142. data/lib/opal/cli_runners/server.rb +56 -0
  143. data/lib/opal/compiler.rb +381 -0
  144. data/lib/opal/config.rb +48 -0
  145. data/lib/opal/erb.rb +84 -0
  146. data/lib/opal/fragment.rb +53 -0
  147. data/lib/opal/hike_path_finder.rb +18 -0
  148. data/lib/opal/nodes.rb +26 -0
  149. data/lib/opal/nodes/arglist.rb +56 -0
  150. data/lib/opal/nodes/array.rb +54 -0
  151. data/lib/opal/nodes/base.rb +151 -0
  152. data/lib/opal/nodes/call.rb +290 -0
  153. data/lib/opal/nodes/call_special.rb +252 -0
  154. data/lib/opal/nodes/case.rb +96 -0
  155. data/lib/opal/nodes/class.rb +42 -0
  156. data/lib/opal/nodes/constants.rb +78 -0
  157. data/lib/opal/nodes/def.rb +281 -0
  158. data/lib/opal/nodes/defined.rb +113 -0
  159. data/lib/opal/nodes/definitions.rb +168 -0
  160. data/lib/opal/nodes/for.rb +48 -0
  161. data/lib/opal/nodes/hash.rb +67 -0
  162. data/lib/opal/nodes/helpers.rb +116 -0
  163. data/lib/opal/nodes/if.rb +81 -0
  164. data/lib/opal/nodes/iter.rb +136 -0
  165. data/lib/opal/nodes/literal.rb +247 -0
  166. data/lib/opal/nodes/logic.rb +217 -0
  167. data/lib/opal/nodes/masgn.rb +62 -0
  168. data/lib/opal/nodes/module.rb +45 -0
  169. data/lib/opal/nodes/rescue.rb +143 -0
  170. data/lib/opal/nodes/runtime_helpers.rb +45 -0
  171. data/lib/opal/nodes/scope.rb +281 -0
  172. data/lib/opal/nodes/singleton_class.rb +26 -0
  173. data/lib/opal/nodes/super.rb +97 -0
  174. data/lib/opal/nodes/top.rb +103 -0
  175. data/lib/opal/nodes/variables.rb +191 -0
  176. data/lib/opal/nodes/while.rb +65 -0
  177. data/lib/opal/nodes/yield.rb +95 -0
  178. data/lib/opal/parser.rb +742 -0
  179. data/lib/opal/parser/grammar.rb +5723 -0
  180. data/lib/opal/parser/grammar.y +1787 -0
  181. data/lib/opal/parser/keywords.rb +66 -0
  182. data/lib/opal/parser/lexer.rb +1260 -0
  183. data/lib/opal/parser/parser_scope.rb +28 -0
  184. data/lib/opal/parser/sexp.rb +81 -0
  185. data/lib/opal/path_reader.rb +35 -0
  186. data/lib/opal/paths.rb +55 -0
  187. data/lib/opal/regexp_anchors.rb +5 -0
  188. data/lib/opal/source_map.rb +70 -0
  189. data/lib/opal/sprockets.rb +3 -0
  190. data/lib/opal/sprockets/cache_key_fix.rb +17 -0
  191. data/lib/opal/sprockets/environment.rb +31 -0
  192. data/lib/opal/sprockets/erb.rb +23 -0
  193. data/lib/opal/sprockets/path_reader.rb +36 -0
  194. data/lib/opal/sprockets/processor.rb +167 -0
  195. data/lib/opal/sprockets/server.rb +160 -0
  196. data/lib/opal/sprockets/source_map_header_patch.rb +41 -0
  197. data/lib/opal/sprockets/source_map_server.rb +115 -0
  198. data/lib/opal/util.rb +69 -0
  199. data/lib/opal/version.rb +5 -0
  200. data/lib/tilt/opal.rb +54 -0
  201. data/opal.gemspec +37 -0
  202. data/opal/README.md +6 -0
  203. data/opal/corelib/array.rb +2073 -0
  204. data/opal/corelib/array/inheritance.rb +127 -0
  205. data/opal/corelib/basic_object.rb +82 -0
  206. data/opal/corelib/boolean.rb +47 -0
  207. data/opal/corelib/class.rb +55 -0
  208. data/opal/corelib/comparable.rb +57 -0
  209. data/opal/corelib/complex.rb +3 -0
  210. data/opal/corelib/dir.rb +20 -0
  211. data/opal/corelib/enumerable.rb +1138 -0
  212. data/opal/corelib/enumerator.rb +426 -0
  213. data/opal/corelib/error.rb +77 -0
  214. data/opal/corelib/file.rb +59 -0
  215. data/opal/corelib/hash.rb +951 -0
  216. data/opal/corelib/helpers.rb +102 -0
  217. data/opal/corelib/io.rb +73 -0
  218. data/opal/corelib/kernel.rb +1124 -0
  219. data/opal/corelib/main.rb +7 -0
  220. data/opal/corelib/match_data.rb +128 -0
  221. data/opal/corelib/method.rb +62 -0
  222. data/opal/corelib/module.rb +553 -0
  223. data/opal/corelib/nil_class.rb +57 -0
  224. data/opal/corelib/numeric.rb +564 -0
  225. data/opal/corelib/proc.rb +105 -0
  226. data/opal/corelib/process.rb +27 -0
  227. data/opal/corelib/range.rb +116 -0
  228. data/opal/corelib/rational.rb +3 -0
  229. data/opal/corelib/regexp.rb +203 -0
  230. data/opal/corelib/runtime.js +1637 -0
  231. data/opal/corelib/string.rb +1762 -0
  232. data/opal/corelib/string/inheritance.rb +117 -0
  233. data/opal/corelib/struct.rb +159 -0
  234. data/opal/corelib/time.rb +746 -0
  235. data/opal/corelib/variables.rb +28 -0
  236. data/opal/opal.rb +33 -0
  237. data/spec/README.md +8 -0
  238. data/spec/filters/bugs/array.rb +77 -0
  239. data/spec/filters/bugs/basicobject.rb +33 -0
  240. data/spec/filters/bugs/class.rb +15 -0
  241. data/spec/filters/bugs/comparable.rb +4 -0
  242. data/spec/filters/bugs/date.rb +173 -0
  243. data/spec/filters/bugs/enumerable.rb +62 -0
  244. data/spec/filters/bugs/enumerator.rb +45 -0
  245. data/spec/filters/bugs/exception.rb +84 -0
  246. data/spec/filters/bugs/fixnum.rb +35 -0
  247. data/spec/filters/bugs/float.rb +100 -0
  248. data/spec/filters/bugs/hash.rb +17 -0
  249. data/spec/filters/bugs/integer.rb +63 -0
  250. data/spec/filters/bugs/kernel.rb +395 -0
  251. data/spec/filters/bugs/language.rb +246 -0
  252. data/spec/filters/bugs/math.rb +89 -0
  253. data/spec/filters/bugs/method.rb +5 -0
  254. data/spec/filters/bugs/module.rb +372 -0
  255. data/spec/filters/bugs/nil.rb +7 -0
  256. data/spec/filters/bugs/numeric.rb +123 -0
  257. data/spec/filters/bugs/proc.rb +65 -0
  258. data/spec/filters/bugs/range.rb +148 -0
  259. data/spec/filters/bugs/regexp.rb +252 -0
  260. data/spec/filters/bugs/set.rb +51 -0
  261. data/spec/filters/bugs/singleton.rb +6 -0
  262. data/spec/filters/bugs/string.rb +99 -0
  263. data/spec/filters/bugs/strscan.rb +106 -0
  264. data/spec/filters/bugs/struct.rb +22 -0
  265. data/spec/filters/bugs/time.rb +28 -0
  266. data/spec/filters/bugs/unboundmethod.rb +22 -0
  267. data/spec/filters/unsupported/array.rb +176 -0
  268. data/spec/filters/unsupported/basicobject.rb +12 -0
  269. data/spec/filters/unsupported/class.rb +4 -0
  270. data/spec/filters/unsupported/delegator.rb +5 -0
  271. data/spec/filters/unsupported/enumerable.rb +8 -0
  272. data/spec/filters/unsupported/enumerator.rb +13 -0
  273. data/spec/filters/unsupported/fixnum.rb +15 -0
  274. data/spec/filters/unsupported/float.rb +6 -0
  275. data/spec/filters/unsupported/hash.rb +55 -0
  276. data/spec/filters/unsupported/integer.rb +3 -0
  277. data/spec/filters/unsupported/kernel.rb +22 -0
  278. data/spec/filters/unsupported/language.rb +31 -0
  279. data/spec/filters/unsupported/matchdata.rb +33 -0
  280. data/spec/filters/unsupported/math.rb +3 -0
  281. data/spec/filters/unsupported/module.rb +36 -0
  282. data/spec/filters/unsupported/pathname.rb +3 -0
  283. data/spec/filters/unsupported/regexp.rb +94 -0
  284. data/spec/filters/unsupported/set.rb +4 -0
  285. data/spec/filters/unsupported/singleton.rb +6 -0
  286. data/spec/filters/unsupported/string.rb +538 -0
  287. data/spec/filters/unsupported/struct.rb +3 -0
  288. data/spec/filters/unsupported/time.rb +208 -0
  289. data/spec/lib/builder_processors_spec.rb +27 -0
  290. data/spec/lib/builder_spec.rb +72 -0
  291. data/spec/lib/cli_spec.rb +150 -0
  292. data/spec/lib/compiler/pre_processed_conditionals_spec.rb +87 -0
  293. data/spec/lib/compiler_spec.rb +131 -0
  294. data/spec/lib/dependency_resolver_spec.rb +40 -0
  295. data/spec/lib/fixtures/complex_sprockets.js.rb.erb +4 -0
  296. data/spec/lib/fixtures/file_with_directives.js +2 -0
  297. data/spec/lib/fixtures/jst_file.js.jst +1 -0
  298. data/spec/lib/fixtures/no_requires.rb +1 -0
  299. data/spec/lib/fixtures/opal_file.rb +2 -0
  300. data/spec/lib/fixtures/require_tree_test.rb +3 -0
  301. data/spec/lib/fixtures/required_file.js +1 -0
  302. data/spec/lib/fixtures/required_tree_test/required_file1.rb +1 -0
  303. data/spec/lib/fixtures/required_tree_test/required_file2.rb +1 -0
  304. data/spec/lib/fixtures/requires.rb +7 -0
  305. data/spec/lib/fixtures/source_map.rb +1 -0
  306. data/spec/lib/fixtures/source_map/subfolder/other_file.rb +1 -0
  307. data/spec/lib/fixtures/sprockets_file.js.rb +3 -0
  308. data/spec/lib/fixtures/sprockets_require_tree_test.rb +3 -0
  309. data/spec/lib/hike_path_finder_spec.rb +23 -0
  310. data/spec/lib/lexer_spec.rb +110 -0
  311. data/spec/lib/parser/alias_spec.rb +26 -0
  312. data/spec/lib/parser/and_spec.rb +13 -0
  313. data/spec/lib/parser/attrasgn_spec.rb +28 -0
  314. data/spec/lib/parser/begin_spec.rb +42 -0
  315. data/spec/lib/parser/block_spec.rb +12 -0
  316. data/spec/lib/parser/break_spec.rb +17 -0
  317. data/spec/lib/parser/call_spec.rb +165 -0
  318. data/spec/lib/parser/class_spec.rb +35 -0
  319. data/spec/lib/parser/comments_spec.rb +11 -0
  320. data/spec/lib/parser/def_spec.rb +80 -0
  321. data/spec/lib/parser/if_spec.rb +26 -0
  322. data/spec/lib/parser/iter_spec.rb +59 -0
  323. data/spec/lib/parser/lambda_spec.rb +64 -0
  324. data/spec/lib/parser/literal_spec.rb +118 -0
  325. data/spec/lib/parser/masgn_spec.rb +37 -0
  326. data/spec/lib/parser/module_spec.rb +27 -0
  327. data/spec/lib/parser/not_spec.rb +21 -0
  328. data/spec/lib/parser/op_asgn1_spec.rb +23 -0
  329. data/spec/lib/parser/op_asgn2_spec.rb +23 -0
  330. data/spec/lib/parser/or_spec.rb +13 -0
  331. data/spec/lib/parser/return_spec.rb +17 -0
  332. data/spec/lib/parser/sclass_spec.rb +21 -0
  333. data/spec/lib/parser/string_spec.rb +276 -0
  334. data/spec/lib/parser/super_spec.rb +20 -0
  335. data/spec/lib/parser/unary_spec.rb +48 -0
  336. data/spec/lib/parser/undef_spec.rb +15 -0
  337. data/spec/lib/parser/unless_spec.rb +13 -0
  338. data/spec/lib/parser/variables_spec.rb +92 -0
  339. data/spec/lib/parser/while_spec.rb +15 -0
  340. data/spec/lib/parser/yield_spec.rb +20 -0
  341. data/spec/lib/path_reader_spec.rb +36 -0
  342. data/spec/lib/shared/path_finder_shared.rb +19 -0
  343. data/spec/lib/shared/path_reader_shared.rb +31 -0
  344. data/spec/lib/spec_helper.rb +9 -0
  345. data/spec/lib/sprockets/erb_spec.rb +38 -0
  346. data/spec/lib/sprockets/path_reader_spec.rb +41 -0
  347. data/spec/lib/sprockets/processor_spec.rb +67 -0
  348. data/spec/lib/sprockets/server_spec.rb +102 -0
  349. data/spec/lib/tilt/opal_spec.rb +37 -0
  350. data/spec/opal/compiler/irb_spec.rb +44 -0
  351. data/spec/opal/core/array/intersection_spec.rb +38 -0
  352. data/spec/opal/core/array/minus_spec.rb +38 -0
  353. data/spec/opal/core/array/select_spec.rb +14 -0
  354. data/spec/opal/core/array/set_range_to_array_spec.rb +7 -0
  355. data/spec/opal/core/array/union_spec.rb +38 -0
  356. data/spec/opal/core/array/uniq_spec.rb +49 -0
  357. data/spec/opal/core/date_spec.rb +177 -0
  358. data/spec/opal/core/enumerable/all_break_spec.rb +5 -0
  359. data/spec/opal/core/enumerable/any_break_spec.rb +5 -0
  360. data/spec/opal/core/enumerable/collect_break_spec.rb +13 -0
  361. data/spec/opal/core/enumerable/count_break_spec.rb +5 -0
  362. data/spec/opal/core/enumerable/detect_break_spec.rb +5 -0
  363. data/spec/opal/core/enumerable/drop_while_break_spec.rb +5 -0
  364. data/spec/opal/core/enumerable/each_slice_break.rb +6 -0
  365. data/spec/opal/core/enumerable/each_with_index_break_spec.rb +5 -0
  366. data/spec/opal/core/enumerable/each_with_object_break_spec.rb +5 -0
  367. data/spec/opal/core/enumerable/find_all_break_spec.rb +5 -0
  368. data/spec/opal/core/enumerable/find_index_break_spec.rb +5 -0
  369. data/spec/opal/core/enumerable/grep_break_spec.rb +5 -0
  370. data/spec/opal/core/enumerable/max_break_spec.rb +5 -0
  371. data/spec/opal/core/enumerable/max_by_break_spec.rb +5 -0
  372. data/spec/opal/core/enumerable/min_break_spec.rb +5 -0
  373. data/spec/opal/core/enumerable/min_by_break_spec.rb +5 -0
  374. data/spec/opal/core/enumerable/none_break_spec.rb +5 -0
  375. data/spec/opal/core/enumerable/one_break_spec.rb +5 -0
  376. data/spec/opal/core/enumerable/reduce_break_spec.rb +5 -0
  377. data/spec/opal/core/enumerable/take_while_break_spec.rb +5 -0
  378. data/spec/opal/core/exception_spec.rb +13 -0
  379. data/spec/opal/core/fixtures/class.rb +124 -0
  380. data/spec/opal/core/fixtures/class_variables.rb +0 -0
  381. data/spec/opal/core/fixtures/constants.rb +33 -0
  382. data/spec/opal/core/fixtures/require_tree_files/file 1.rb +1 -0
  383. data/spec/opal/core/fixtures/require_tree_files/file 2.rb +1 -0
  384. data/spec/opal/core/fixtures/require_tree_files/file 3.rb +1 -0
  385. data/spec/opal/core/fixtures/require_tree_files/file 4.rb +1 -0
  386. data/spec/opal/core/fixtures/require_tree_files/file 5.rb +1 -0
  387. data/spec/opal/core/fixtures/require_tree_files/nested/nested 1.rb +1 -0
  388. data/spec/opal/core/fixtures/require_tree_files/nested/nested 2.rb +1 -0
  389. data/spec/opal/core/fixtures/require_tree_files/other/other 1.rb +1 -0
  390. data/spec/opal/core/fixtures/require_tree_with_dot/file 1.rb +1 -0
  391. data/spec/opal/core/fixtures/require_tree_with_dot/file 2.rb +1 -0
  392. data/spec/opal/core/fixtures/require_tree_with_dot/file 3.rb +1 -0
  393. data/spec/opal/core/fixtures/require_tree_with_dot/index.rb +3 -0
  394. data/spec/opal/core/hash/has_value_spec.rb +13 -0
  395. data/spec/opal/core/hash/internals_spec.rb +332 -0
  396. data/spec/opal/core/kernel/Array_spec.rb +10 -0
  397. data/spec/opal/core/kernel/block_given_spec.rb +30 -0
  398. data/spec/opal/core/kernel/class_spec.rb +6 -0
  399. data/spec/opal/core/kernel/define_singleton_method_spec.rb +21 -0
  400. data/spec/opal/core/kernel/equal_value_spec.rb +12 -0
  401. data/spec/opal/core/kernel/extend_spec.rb +21 -0
  402. data/spec/opal/core/kernel/format_spec.rb +122 -0
  403. data/spec/opal/core/kernel/freeze_spec.rb +15 -0
  404. data/spec/opal/core/kernel/instance_eval_spec.rb +28 -0
  405. data/spec/opal/core/kernel/instance_variable_defined_spec.rb +15 -0
  406. data/spec/opal/core/kernel/instance_variable_get_spec.rb +14 -0
  407. data/spec/opal/core/kernel/instance_variable_set_spec.rb +10 -0
  408. data/spec/opal/core/kernel/loop_spec.rb +23 -0
  409. data/spec/opal/core/kernel/match_spec.rb +5 -0
  410. data/spec/opal/core/kernel/method_spec.rb +31 -0
  411. data/spec/opal/core/kernel/methods_spec.rb +25 -0
  412. data/spec/opal/core/kernel/nil_spec.rb +7 -0
  413. data/spec/opal/core/kernel/p_spec.rb +15 -0
  414. data/spec/opal/core/kernel/printf_spec.rb +11 -0
  415. data/spec/opal/core/kernel/proc_spec.rb +13 -0
  416. data/spec/opal/core/kernel/rand_spec.rb +23 -0
  417. data/spec/opal/core/kernel/require_tree_spec.rb +18 -0
  418. data/spec/opal/core/kernel/respond_to_spec.rb +41 -0
  419. data/spec/opal/core/kernel/send_spec.rb +56 -0
  420. data/spec/opal/core/kernel/sprintf_spec.rb +5 -0
  421. data/spec/opal/core/language/block_spec.rb +538 -0
  422. data/spec/opal/core/language/fixtures/array.rb +11 -0
  423. data/spec/opal/core/language/fixtures/block.rb +57 -0
  424. data/spec/opal/core/language/fixtures/break.rb +240 -0
  425. data/spec/opal/core/language/fixtures/ensure.rb +72 -0
  426. data/spec/opal/core/language/fixtures/literal_lambda.rb +7 -0
  427. data/spec/opal/core/language/fixtures/metaclass.rb +33 -0
  428. data/spec/opal/core/language/fixtures/module.rb +24 -0
  429. data/spec/opal/core/language/fixtures/next.rb +128 -0
  430. data/spec/opal/core/language/fixtures/return.rb +118 -0
  431. data/spec/opal/core/language/fixtures/send.rb +110 -0
  432. data/spec/opal/core/language/fixtures/send_1.9.rb +22 -0
  433. data/spec/opal/core/language/fixtures/super.rb +308 -0
  434. data/spec/opal/core/language/fixtures/variables.rb +58 -0
  435. data/spec/opal/core/language/fixtures/yield.rb +28 -0
  436. data/spec/opal/core/language/predefined_spec.rb +138 -0
  437. data/spec/opal/core/language/proc_spec.rb +263 -0
  438. data/spec/opal/core/language/regexp_spec.rb +20 -0
  439. data/spec/opal/core/language/send_spec.rb +225 -0
  440. data/spec/opal/core/language/string_spec.rb +44 -0
  441. data/spec/opal/core/language/variables_spec.rb +1366 -0
  442. data/spec/opal/core/language/versions/array_1.9.rb +39 -0
  443. data/spec/opal/core/language/versions/block_1.9.rb +0 -0
  444. data/spec/opal/core/language/versions/break_1.9.rb +0 -0
  445. data/spec/opal/core/language/versions/case_1.9.rb +20 -0
  446. data/spec/opal/core/language/versions/def_2_0_spec.rb +62 -0
  447. data/spec/opal/core/language/versions/hash_1.9.rb +18 -0
  448. data/spec/opal/core/language/versions/literal_lambda_1.9.rb +143 -0
  449. data/spec/opal/core/language/versions/not_1.9.rb +22 -0
  450. data/spec/opal/core/language/versions/send_1.9.rb +241 -0
  451. data/spec/opal/core/language/versions/symbol_1.9.rb +15 -0
  452. data/spec/opal/core/language/versions/variables_1.9.rb +8 -0
  453. data/spec/opal/core/language_spec.rb +23 -0
  454. data/spec/opal/core/method/to_proc_spec.rb +28 -0
  455. data/spec/opal/core/module/alias_method_spec.rb +28 -0
  456. data/spec/opal/core/module/ancestors_spec.rb +11 -0
  457. data/spec/opal/core/module/append_features_spec.rb +14 -0
  458. data/spec/opal/core/module/attr_accessor_spec.rb +26 -0
  459. data/spec/opal/core/module/const_defined_spec.rb +85 -0
  460. data/spec/opal/core/module/const_get_spec.rb +85 -0
  461. data/spec/opal/core/module/const_missing_spec.rb +17 -0
  462. data/spec/opal/core/module/const_set_spec.rb +64 -0
  463. data/spec/opal/core/module/constants_spec.rb +49 -0
  464. data/spec/opal/core/module/fixtures/classes.rb +434 -0
  465. data/spec/opal/core/module/method_defined_spec.rb +48 -0
  466. data/spec/opal/core/module/module_function_spec.rb +25 -0
  467. data/spec/opal/core/module/name_spec.rb +52 -0
  468. data/spec/opal/core/module/public_method_defined_spec.rb +18 -0
  469. data/spec/opal/core/module/remove_const_spec.rb +22 -0
  470. data/spec/opal/core/module/undef_method_spec.rb +66 -0
  471. data/spec/opal/core/numeric/bit_and_spec.rb +7 -0
  472. data/spec/opal/core/numeric/bit_or_spec.rb +8 -0
  473. data/spec/opal/core/numeric/bit_xor_spec.rb +6 -0
  474. data/spec/opal/core/numeric/ceil_spec.rb +8 -0
  475. data/spec/opal/core/numeric/chr_spec.rb +8 -0
  476. data/spec/opal/core/numeric/comparison_spec.rb +24 -0
  477. data/spec/opal/core/numeric/complement_spec.rb +8 -0
  478. data/spec/opal/core/numeric/divide_spec.rb +10 -0
  479. data/spec/opal/core/numeric/eql_spec.rb +9 -0
  480. data/spec/opal/core/numeric/exponent_spec.rb +33 -0
  481. data/spec/opal/core/numeric/floor_spec.rb +8 -0
  482. data/spec/opal/core/numeric/gt_spec.rb +11 -0
  483. data/spec/opal/core/numeric/gte_spec.rb +12 -0
  484. data/spec/opal/core/numeric/integer_spec.rb +9 -0
  485. data/spec/opal/core/numeric/left_shift_spec.rb +21 -0
  486. data/spec/opal/core/numeric/lt_spec.rb +11 -0
  487. data/spec/opal/core/numeric/lte_spec.rb +12 -0
  488. data/spec/opal/core/numeric/minus_spec.rb +8 -0
  489. data/spec/opal/core/numeric/modulo_spec.rb +19 -0
  490. data/spec/opal/core/numeric/multiply_spec.rb +9 -0
  491. data/spec/opal/core/numeric/next_spec.rb +9 -0
  492. data/spec/opal/core/numeric/ord_spec.rb +9 -0
  493. data/spec/opal/core/numeric/plus_spec.rb +8 -0
  494. data/spec/opal/core/numeric/pred_spec.rb +7 -0
  495. data/spec/opal/core/numeric/right_shift_spec.rb +25 -0
  496. data/spec/opal/core/numeric/step_spec.rb +11 -0
  497. data/spec/opal/core/numeric/succ_spec.rb +9 -0
  498. data/spec/opal/core/numeric/times_spec.rb +36 -0
  499. data/spec/opal/core/numeric/to_f_spec.rb +7 -0
  500. data/spec/opal/core/numeric/to_i_spec.rb +7 -0
  501. data/spec/opal/core/numeric/to_json_spec.rb +8 -0
  502. data/spec/opal/core/numeric/to_s_spec.rb +26 -0
  503. data/spec/opal/core/numeric/uminus_spec.rb +9 -0
  504. data/spec/opal/core/numeric/upto_spec.rb +19 -0
  505. data/spec/opal/core/numeric/zero_spec.rb +7 -0
  506. data/spec/opal/core/object_id_spec.rb +56 -0
  507. data/spec/opal/core/proc/call_spec.rb +21 -0
  508. data/spec/opal/core/proc/element_reference_spec.rb +21 -0
  509. data/spec/opal/core/proc/proc_tricks_spec.rb +7 -0
  510. data/spec/opal/core/runtime/begin_spec.rb +39 -0
  511. data/spec/opal/core/runtime/block_send_spec.rb +28 -0
  512. data/spec/opal/core/runtime/block_spec.rb +23 -0
  513. data/spec/opal/core/runtime/bridged_classes_spec.rb +111 -0
  514. data/spec/opal/core/runtime/constants_spec.rb +13 -0
  515. data/spec/opal/core/runtime/donate_spec.rb +53 -0
  516. data/spec/opal/core/runtime/eval_spec.rb +5 -0
  517. data/spec/opal/core/runtime/main_methods_spec.rb +27 -0
  518. data/spec/opal/core/runtime/method_missing_spec.rb +62 -0
  519. data/spec/opal/core/runtime/method_spec.rb +31 -0
  520. data/spec/opal/core/runtime/operator_call_spec.rb +13 -0
  521. data/spec/opal/core/runtime/paren_spec.rb +14 -0
  522. data/spec/opal/core/runtime/rescue_spec.rb +38 -0
  523. data/spec/opal/core/runtime/return_spec.rb +38 -0
  524. data/spec/opal/core/runtime/send_spec.rb +34 -0
  525. data/spec/opal/core/runtime/singleton_class_spec.rb +13 -0
  526. data/spec/opal/core/runtime/super_spec.rb +212 -0
  527. data/spec/opal/core/runtime/truthy_spec.rb +23 -0
  528. data/spec/opal/core/runtime/variables_spec.rb +20 -0
  529. data/spec/opal/core/runtime_spec.rb +58 -0
  530. data/spec/opal/core/source_map_spec.rb +15 -0
  531. data/spec/opal/core/string_spec.rb +11 -0
  532. data/spec/opal/stdlib/erb/erb_spec.rb +30 -0
  533. data/spec/opal/stdlib/erb/inline_block.opalerb +3 -0
  534. data/spec/opal/stdlib/erb/quoted.opalerb +1 -0
  535. data/spec/opal/stdlib/erb/simple.opalerb +1 -0
  536. data/spec/opal/stdlib/js_spec.rb +66 -0
  537. data/spec/opal/stdlib/json/ext_spec.rb +48 -0
  538. data/spec/opal/stdlib/json/parse_spec.rb +33 -0
  539. data/spec/opal/stdlib/native/alias_native_spec.rb +27 -0
  540. data/spec/opal/stdlib/native/each_spec.rb +13 -0
  541. data/spec/opal/stdlib/native/element_reference_spec.rb +16 -0
  542. data/spec/opal/stdlib/native/exposure_spec.rb +33 -0
  543. data/spec/opal/stdlib/native/ext_spec.rb +19 -0
  544. data/spec/opal/stdlib/native/initialize_spec.rb +17 -0
  545. data/spec/opal/stdlib/native/method_missing_spec.rb +51 -0
  546. data/spec/opal/stdlib/native/native_alias_spec.rb +19 -0
  547. data/spec/opal/stdlib/native/native_class_spec.rb +18 -0
  548. data/spec/opal/stdlib/native/native_module_spec.rb +13 -0
  549. data/spec/opal/stdlib/native/native_reader_spec.rb +22 -0
  550. data/spec/opal/stdlib/native/native_writer_spec.rb +30 -0
  551. data/spec/opal/stdlib/native/new_spec.rb +8 -0
  552. data/spec/opal/stdlib/promise/always_spec.rb +30 -0
  553. data/spec/opal/stdlib/promise/error_spec.rb +15 -0
  554. data/spec/opal/stdlib/promise/rescue_spec.rb +44 -0
  555. data/spec/opal/stdlib/promise/then_spec.rb +71 -0
  556. data/spec/opal/stdlib/promise/trace_spec.rb +52 -0
  557. data/spec/opal/stdlib/promise/value_spec.rb +15 -0
  558. data/spec/opal/stdlib/promise/when_spec.rb +34 -0
  559. data/spec/opal/stdlib/template/paths_spec.rb +10 -0
  560. data/spec/opal/stdlib/thread/mutex_spec.rb +40 -0
  561. data/spec/opal/stdlib/thread/thread_queue_spec.rb +32 -0
  562. data/spec/opal/stdlib/thread/thread_spec.rb +60 -0
  563. data/spec/rubyspecs +144 -0
  564. data/spec/spec_helper.rb +53 -0
  565. data/spec/support/mspec_rspec_adapter.rb +33 -0
  566. data/spec/support/parser_helpers.rb +37 -0
  567. data/stdlib/README.md +3 -0
  568. data/stdlib/base64.rb +152 -0
  569. data/stdlib/benchmark.rb +557 -0
  570. data/stdlib/buffer.rb +41 -0
  571. data/stdlib/buffer/array.rb +66 -0
  572. data/stdlib/buffer/view.rb +70 -0
  573. data/stdlib/date.rb +248 -0
  574. data/stdlib/delegate.rb +29 -0
  575. data/stdlib/dir.rb +1 -0
  576. data/stdlib/encoding.rb +170 -0
  577. data/stdlib/enumerator.rb +1 -0
  578. data/stdlib/erb.rb +16 -0
  579. data/stdlib/file.rb +1 -0
  580. data/stdlib/fileutils.rb +0 -0
  581. data/stdlib/forwardable.rb +71 -0
  582. data/stdlib/iconv.rb +0 -0
  583. data/stdlib/js.rb +56 -0
  584. data/stdlib/json.rb +190 -0
  585. data/stdlib/math.rb +370 -0
  586. data/stdlib/native.rb +530 -0
  587. data/stdlib/nodejs.rb +7 -0
  588. data/stdlib/nodejs/dir.rb +13 -0
  589. data/stdlib/nodejs/file.rb +98 -0
  590. data/stdlib/nodejs/fileutils.rb +26 -0
  591. data/stdlib/nodejs/io.rb +2 -0
  592. data/stdlib/nodejs/irb.rb +45 -0
  593. data/stdlib/nodejs/kernel.rb +33 -0
  594. data/stdlib/nodejs/node_modules/.bin/js-yaml +140 -0
  595. data/stdlib/nodejs/node_modules/glob/LICENSE +15 -0
  596. data/stdlib/nodejs/node_modules/glob/README.md +357 -0
  597. data/stdlib/nodejs/node_modules/glob/common.js +177 -0
  598. data/stdlib/nodejs/node_modules/glob/glob.js +649 -0
  599. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/.eslintrc +17 -0
  600. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/LICENSE +15 -0
  601. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/README.md +37 -0
  602. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/inflight.js +44 -0
  603. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE +15 -0
  604. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md +36 -0
  605. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json +52 -0
  606. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/test/basic.js +51 -0
  607. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js +33 -0
  608. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/package.json +61 -0
  609. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/test.js +97 -0
  610. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/LICENSE +16 -0
  611. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/README.md +42 -0
  612. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/inherits.js +1 -0
  613. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/inherits_browser.js +23 -0
  614. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/package.json +51 -0
  615. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/test.js +25 -0
  616. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/.npmignore +1 -0
  617. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/.travis.yml +4 -0
  618. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/LICENSE +23 -0
  619. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/README.md +216 -0
  620. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/benchmark.js +15 -0
  621. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/browser.js +1181 -0
  622. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/minimatch.js +845 -0
  623. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.npmignore +2 -0
  624. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.travis.yml +3 -0
  625. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md +121 -0
  626. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/example.js +8 -0
  627. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js +191 -0
  628. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore +2 -0
  629. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.travis.yml +4 -0
  630. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/Makefile +6 -0
  631. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md +80 -0
  632. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/example.js +5 -0
  633. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js +38 -0
  634. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json +73 -0
  635. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/test/balanced.js +56 -0
  636. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml +4 -0
  637. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE +18 -0
  638. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown +62 -0
  639. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js +6 -0
  640. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js +13 -0
  641. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json +83 -0
  642. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js +39 -0
  643. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json +75 -0
  644. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-comparison.js +32 -0
  645. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-results.txt +1075 -0
  646. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/cases.txt +182 -0
  647. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/dollar.js +9 -0
  648. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/empty-option.js +10 -0
  649. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/generate.sh +24 -0
  650. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/negative-increment.js +15 -0
  651. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/nested.js +16 -0
  652. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/order.js +10 -0
  653. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/pad.js +13 -0
  654. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/same-type.js +7 -0
  655. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/sequence.js +50 -0
  656. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/package.json +60 -0
  657. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/basic.js +399 -0
  658. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/brace-expand.js +45 -0
  659. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/defaults.js +274 -0
  660. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js +8 -0
  661. data/stdlib/nodejs/node_modules/glob/node_modules/once/LICENSE +27 -0
  662. data/stdlib/nodejs/node_modules/glob/node_modules/once/README.md +51 -0
  663. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE +15 -0
  664. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/README.md +36 -0
  665. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/package.json +52 -0
  666. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/test/basic.js +51 -0
  667. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js +33 -0
  668. data/stdlib/nodejs/node_modules/glob/node_modules/once/once.js +21 -0
  669. data/stdlib/nodejs/node_modules/glob/node_modules/once/package.json +60 -0
  670. data/stdlib/nodejs/node_modules/glob/node_modules/once/test/once.js +23 -0
  671. data/stdlib/nodejs/node_modules/glob/package.json +72 -0
  672. data/stdlib/nodejs/node_modules/glob/sync.js +409 -0
  673. data/stdlib/nodejs/node_modules/js-yaml/HISTORY.md +277 -0
  674. data/stdlib/nodejs/node_modules/js-yaml/LICENSE +21 -0
  675. data/stdlib/nodejs/node_modules/js-yaml/README.md +288 -0
  676. data/stdlib/nodejs/node_modules/js-yaml/bin/js-yaml.js +140 -0
  677. data/stdlib/nodejs/node_modules/js-yaml/bower.json +23 -0
  678. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.js +3666 -0
  679. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.min.js +3 -0
  680. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.js +102 -0
  681. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.yml +18 -0
  682. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.js +31 -0
  683. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.json +22 -0
  684. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.js +18 -0
  685. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.yml +197 -0
  686. data/stdlib/nodejs/node_modules/js-yaml/index.js +7 -0
  687. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml.js +39 -0
  688. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/common.js +62 -0
  689. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/dumper.js +554 -0
  690. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/exception.js +25 -0
  691. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/loader.js +1581 -0
  692. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/mark.js +78 -0
  693. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema.js +103 -0
  694. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/core.js +18 -0
  695. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_full.js +25 -0
  696. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js +28 -0
  697. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js +17 -0
  698. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/json.js +25 -0
  699. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type.js +61 -0
  700. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/binary.js +133 -0
  701. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/bool.js +37 -0
  702. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/float.js +110 -0
  703. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/int.js +183 -0
  704. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/function.js +85 -0
  705. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js +84 -0
  706. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js +27 -0
  707. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/map.js +8 -0
  708. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/merge.js +12 -0
  709. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/null.js +36 -0
  710. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/omap.js +56 -0
  711. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/pairs.js +61 -0
  712. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/seq.js +8 -0
  713. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/set.js +33 -0
  714. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/str.js +8 -0
  715. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/timestamp.js +98 -0
  716. data/stdlib/nodejs/node_modules/js-yaml/node_modules/.bin/esparse +117 -0
  717. data/stdlib/nodejs/node_modules/js-yaml/node_modules/.bin/esvalidate +177 -0
  718. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/HISTORY.md +115 -0
  719. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/LICENSE +21 -0
  720. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/README.md +239 -0
  721. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/arguments.js +36 -0
  722. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/choice.js +22 -0
  723. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/constants.js +59 -0
  724. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/help.js +13 -0
  725. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/nargs.js +33 -0
  726. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/parents.js +28 -0
  727. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/prefix_chars.js +23 -0
  728. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sub_commands.js +49 -0
  729. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sum.js +35 -0
  730. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/testformatters.js +270 -0
  731. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/index.js +1 -0
  732. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action.js +146 -0
  733. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append.js +55 -0
  734. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append/constant.js +47 -0
  735. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/count.js +40 -0
  736. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/help.js +48 -0
  737. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store.js +50 -0
  738. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/constant.js +43 -0
  739. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/false.js +27 -0
  740. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/true.js +26 -0
  741. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/subparsers.js +148 -0
  742. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/version.js +50 -0
  743. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action_container.js +481 -0
  744. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argparse.js +14 -0
  745. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/error.js +50 -0
  746. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/exclusive.js +54 -0
  747. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/group.js +75 -0
  748. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js +1168 -0
  749. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/const.js +18 -0
  750. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/added_formatters.js +88 -0
  751. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js +798 -0
  752. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/namespace.js +77 -0
  753. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.npmignore +2 -0
  754. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml +8 -0
  755. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown +825 -0
  756. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/bower.json +33 -0
  757. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json +11 -0
  758. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/foo.js +10 -0
  759. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/gulpfile.js +26 -0
  760. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js +673 -0
  761. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/libpeerconnection.log +0 -0
  762. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json +107 -0
  763. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/LICENSE +23 -0
  764. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/README.md +22 -0
  765. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json +69 -0
  766. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js +6 -0
  767. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js +1415 -0
  768. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/package.json +62 -0
  769. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/README.md +73 -0
  770. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esparse.js +117 -0
  771. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esvalidate.js +177 -0
  772. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/esprima.js +3908 -0
  773. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/package.json +69 -0
  774. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/compat.js +239 -0
  775. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/reflect.js +422 -0
  776. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/run.js +66 -0
  777. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/runner.js +387 -0
  778. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/test.js +20238 -0
  779. data/stdlib/nodejs/node_modules/js-yaml/package.json +83 -0
  780. data/stdlib/nodejs/package.json +6 -0
  781. data/stdlib/nodejs/require.rb +30 -0
  782. data/stdlib/nodejs/rubygems.rb +68 -0
  783. data/stdlib/nodejs/yaml.rb +11 -0
  784. data/stdlib/observer.rb +202 -0
  785. data/stdlib/opal-parser.rb +54 -0
  786. data/stdlib/opal-source-maps.rb +2 -0
  787. data/stdlib/ostruct.rb +69 -0
  788. data/stdlib/pathname.rb +55 -0
  789. data/stdlib/phantomjs.rb +3 -0
  790. data/stdlib/pp.rb +35 -0
  791. data/stdlib/promise.rb +427 -0
  792. data/stdlib/racc/parser.rb +215 -0
  793. data/stdlib/rbconfig.rb +18 -0
  794. data/stdlib/securerandom.rb +12 -0
  795. data/stdlib/set.rb +170 -0
  796. data/stdlib/singleton.rb +40 -0
  797. data/stdlib/source_map.rb +5 -0
  798. data/stdlib/source_map/map.rb +220 -0
  799. data/stdlib/source_map/mapping.rb +26 -0
  800. data/stdlib/source_map/offset.rb +88 -0
  801. data/stdlib/source_map/version.rb +3 -0
  802. data/stdlib/source_map/vlq.rb +98 -0
  803. data/stdlib/sourcemap.rb +1 -0
  804. data/stdlib/stringio.rb +181 -0
  805. data/stdlib/strscan.rb +166 -0
  806. data/stdlib/template.rb +46 -0
  807. data/stdlib/thread.rb +164 -0
  808. data/stdlib/time.rb +9 -0
  809. data/stdlib/yaml.rb +1 -0
  810. data/tasks/benchmarking.rake +88 -0
  811. data/tasks/building.rake +58 -0
  812. data/tasks/documenting.rake +37 -0
  813. data/tasks/github.rake +19 -0
  814. data/tasks/linting.rake +18 -0
  815. data/tasks/testing.rake +125 -0
  816. data/vendored-minitest/minitest.rb +780 -0
  817. data/vendored-minitest/minitest/assertions.rb +662 -0
  818. data/vendored-minitest/minitest/autorun.rb +12 -0
  819. data/vendored-minitest/minitest/benchmark.rb +426 -0
  820. data/vendored-minitest/minitest/expectations.rb +281 -0
  821. data/vendored-minitest/minitest/hell.rb +11 -0
  822. data/vendored-minitest/minitest/mock.rb +220 -0
  823. data/vendored-minitest/minitest/parallel.rb +65 -0
  824. data/vendored-minitest/minitest/pride.rb +4 -0
  825. data/vendored-minitest/minitest/pride_plugin.rb +142 -0
  826. data/vendored-minitest/minitest/spec.rb +310 -0
  827. data/vendored-minitest/minitest/test.rb +293 -0
  828. data/vendored-minitest/minitest/unit.rb +45 -0
  829. data/vendored-minitest/test/unit.rb +28 -0
  830. metadata +1058 -0
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ module.exports.ArgumentParser = require('./argument_parser.js');
4
+ module.exports.Namespace = require('./namespace');
5
+ module.exports.Action = require('./action');
6
+ module.exports.HelpFormatter = require('./help/formatter.js');
7
+ module.exports.Const = require('./const.js');
8
+
9
+ module.exports.ArgumentDefaultsHelpFormatter =
10
+ require('./help/added_formatters.js').ArgumentDefaultsHelpFormatter;
11
+ module.exports.RawDescriptionHelpFormatter =
12
+ require('./help/added_formatters.js').RawDescriptionHelpFormatter;
13
+ module.exports.RawTextHelpFormatter =
14
+ require('./help/added_formatters.js').RawTextHelpFormatter;
@@ -0,0 +1,50 @@
1
+ 'use strict';
2
+
3
+
4
+ var format = require('util').format;
5
+
6
+
7
+ var ERR_CODE = 'ARGError';
8
+
9
+ /*:nodoc:*
10
+ * argumentError(argument, message) -> TypeError
11
+ * - argument (Object): action with broken argument
12
+ * - message (String): error message
13
+ *
14
+ * Error format helper. An error from creating or using an argument
15
+ * (optional or positional). The string value of this exception
16
+ * is the message, augmented with information
17
+ * about the argument that caused it.
18
+ *
19
+ * #####Example
20
+ *
21
+ * var argumentErrorHelper = require('./argument/error');
22
+ * if (conflictOptionals.length > 0) {
23
+ * throw argumentErrorHelper(
24
+ * action,
25
+ * format('Conflicting option string(s): %s', conflictOptionals.join(', '))
26
+ * );
27
+ * }
28
+ *
29
+ **/
30
+ module.exports = function (argument, message) {
31
+ var argumentName = null;
32
+ var errMessage;
33
+ var err;
34
+
35
+ if (argument.getName) {
36
+ argumentName = argument.getName();
37
+ } else {
38
+ argumentName = '' + argument;
39
+ }
40
+
41
+ if (!argumentName) {
42
+ errMessage = message;
43
+ } else {
44
+ errMessage = format('argument "%s": %s', argumentName, message);
45
+ }
46
+
47
+ err = new TypeError(errMessage);
48
+ err.code = ERR_CODE;
49
+ return err;
50
+ };
@@ -0,0 +1,54 @@
1
+ /** internal
2
+ * class MutuallyExclusiveGroup
3
+ *
4
+ * Group arguments.
5
+ * By default, ArgumentParser groups command-line arguments
6
+ * into “positional arguments” and “optional arguments”
7
+ * when displaying help messages. When there is a better
8
+ * conceptual grouping of arguments than this default one,
9
+ * appropriate groups can be created using the addArgumentGroup() method
10
+ *
11
+ * This class inherited from [[ArgumentContainer]]
12
+ **/
13
+ 'use strict';
14
+
15
+ var util = require('util');
16
+
17
+ var ArgumentGroup = require('./group');
18
+
19
+ /**
20
+ * new MutuallyExclusiveGroup(container, options)
21
+ * - container (object): main container
22
+ * - options (object): options.required -> true/false
23
+ *
24
+ * `required` could be an argument itself, but making it a property of
25
+ * the options argument is more consistent with the JS adaptation of the Python)
26
+ **/
27
+ var MutuallyExclusiveGroup = module.exports = function MutuallyExclusiveGroup(container, options) {
28
+ var required;
29
+ options = options || {};
30
+ required = options.required || false;
31
+ ArgumentGroup.call(this, container);
32
+ this.required = required;
33
+
34
+ };
35
+ util.inherits(MutuallyExclusiveGroup, ArgumentGroup);
36
+
37
+
38
+ MutuallyExclusiveGroup.prototype._addAction = function (action) {
39
+ var msg;
40
+ if (action.required) {
41
+ msg = 'mutually exclusive arguments must be optional';
42
+ throw new Error(msg);
43
+ }
44
+ action = this._container._addAction(action);
45
+ this._groupActions.push(action);
46
+ return action;
47
+ };
48
+
49
+
50
+ MutuallyExclusiveGroup.prototype._removeAction = function (action) {
51
+ this._container._removeAction(action);
52
+ this._groupActions.remove(action);
53
+ };
54
+
@@ -0,0 +1,75 @@
1
+ /** internal
2
+ * class ArgumentGroup
3
+ *
4
+ * Group arguments.
5
+ * By default, ArgumentParser groups command-line arguments
6
+ * into “positional arguments” and “optional arguments”
7
+ * when displaying help messages. When there is a better
8
+ * conceptual grouping of arguments than this default one,
9
+ * appropriate groups can be created using the addArgumentGroup() method
10
+ *
11
+ * This class inherited from [[ArgumentContainer]]
12
+ **/
13
+ 'use strict';
14
+
15
+ var util = require('util');
16
+
17
+ var ActionContainer = require('../action_container');
18
+
19
+
20
+ /**
21
+ * new ArgumentGroup(container, options)
22
+ * - container (object): main container
23
+ * - options (object): hash of group options
24
+ *
25
+ * #### options
26
+ * - **prefixChars** group name prefix
27
+ * - **argumentDefault** default argument value
28
+ * - **title** group title
29
+ * - **description** group description
30
+ *
31
+ **/
32
+ var ArgumentGroup = module.exports = function ArgumentGroup(container, options) {
33
+
34
+ options = options || {};
35
+
36
+ // add any missing keyword arguments by checking the container
37
+ options.conflictHandler = (options.conflictHandler || container.conflictHandler);
38
+ options.prefixChars = (options.prefixChars || container.prefixChars);
39
+ options.argumentDefault = (options.argumentDefault || container.argumentDefault);
40
+
41
+ ActionContainer.call(this, options);
42
+
43
+ // group attributes
44
+ this.title = options.title;
45
+ this._groupActions = [];
46
+
47
+ // share most attributes with the container
48
+ this._container = container;
49
+ this._registries = container._registries;
50
+ this._actions = container._actions;
51
+ this._optionStringActions = container._optionStringActions;
52
+ this._defaults = container._defaults;
53
+ this._hasNegativeNumberOptionals = container._hasNegativeNumberOptionals;
54
+ this._mutuallyExclusiveGroups = container._mutuallyExclusiveGroups;
55
+ };
56
+ util.inherits(ArgumentGroup, ActionContainer);
57
+
58
+
59
+ ArgumentGroup.prototype._addAction = function (action) {
60
+ // Parent add action
61
+ action = ActionContainer.prototype._addAction.call(this, action);
62
+ this._groupActions.push(action);
63
+ return action;
64
+ };
65
+
66
+
67
+ ArgumentGroup.prototype._removeAction = function (action) {
68
+ // Parent remove action
69
+ ActionContainer.prototype._removeAction.call(this, action);
70
+ var actionIndex = this._groupActions.indexOf(action);
71
+ if (actionIndex >= 0) {
72
+ this._groupActions.splice(actionIndex, 1);
73
+ }
74
+ };
75
+
@@ -0,0 +1,1168 @@
1
+ /**
2
+ * class ArgumentParser
3
+ *
4
+ * Object for parsing command line strings into js objects.
5
+ *
6
+ * Inherited from [[ActionContainer]]
7
+ **/
8
+ 'use strict';
9
+
10
+ var util = require('util');
11
+ var format = require('util').format;
12
+ var Path = require('path');
13
+
14
+ var _ = require('underscore');
15
+ _.str = require('underscore.string');
16
+
17
+ // Constants
18
+ var $$ = require('./const');
19
+
20
+ var ActionContainer = require('./action_container');
21
+
22
+ // Errors
23
+ var argumentErrorHelper = require('./argument/error');
24
+
25
+ var HelpFormatter = require('./help/formatter');
26
+
27
+ var Namespace = require('./namespace');
28
+
29
+
30
+ /**
31
+ * new ArgumentParser(options)
32
+ *
33
+ * Create a new ArgumentParser object.
34
+ *
35
+ * ##### Options:
36
+ * - `prog` The name of the program (default: Path.basename(process.argv[1]))
37
+ * - `usage` A usage message (default: auto-generated from arguments)
38
+ * - `description` A description of what the program does
39
+ * - `epilog` Text following the argument descriptions
40
+ * - `parents` Parsers whose arguments should be copied into this one
41
+ * - `formatterClass` HelpFormatter class for printing help messages
42
+ * - `prefixChars` Characters that prefix optional arguments
43
+ * - `fromfilePrefixChars` Characters that prefix files containing additional arguments
44
+ * - `argumentDefault` The default value for all arguments
45
+ * - `addHelp` Add a -h/-help option
46
+ * - `conflictHandler` Specifies how to handle conflicting argument names
47
+ * - `debug` Enable debug mode. Argument errors throw exception in
48
+ * debug mode and process.exit in normal. Used for development and
49
+ * testing (default: false)
50
+ *
51
+ * See also [original guide][1]
52
+ *
53
+ * [1]:http://docs.python.org/dev/library/argparse.html#argumentparser-objects
54
+ **/
55
+ var ArgumentParser = module.exports = function ArgumentParser(options) {
56
+ var self = this;
57
+ options = options || {};
58
+
59
+ options.description = (options.description || null);
60
+ options.argumentDefault = (options.argumentDefault || null);
61
+ options.prefixChars = (options.prefixChars || '-');
62
+ options.conflictHandler = (options.conflictHandler || 'error');
63
+ ActionContainer.call(this, options);
64
+
65
+ options.addHelp = (options.addHelp === undefined || !!options.addHelp);
66
+ options.parents = (options.parents || []);
67
+ // default program name
68
+ options.prog = (options.prog || Path.basename(process.argv[1]));
69
+ this.prog = options.prog;
70
+ this.usage = options.usage;
71
+ this.epilog = options.epilog;
72
+ this.version = options.version;
73
+
74
+ this.debug = (options.debug === true);
75
+
76
+ this.formatterClass = (options.formatterClass || HelpFormatter);
77
+ this.fromfilePrefixChars = options.fromfilePrefixChars || null;
78
+ this._positionals = this.addArgumentGroup({title: 'Positional arguments'});
79
+ this._optionals = this.addArgumentGroup({title: 'Optional arguments'});
80
+ this._subparsers = null;
81
+
82
+ // register types
83
+ var FUNCTION_IDENTITY = function (o) {
84
+ return o;
85
+ };
86
+ this.register('type', 'auto', FUNCTION_IDENTITY);
87
+ this.register('type', null, FUNCTION_IDENTITY);
88
+ this.register('type', 'int', function (x) {
89
+ var result = parseInt(x, 10);
90
+ if (isNaN(result)) {
91
+ throw new Error(x + ' is not a valid integer.');
92
+ }
93
+ return result;
94
+ });
95
+ this.register('type', 'float', function (x) {
96
+ var result = parseFloat(x);
97
+ if (isNaN(result)) {
98
+ throw new Error(x + ' is not a valid float.');
99
+ }
100
+ return result;
101
+ });
102
+ this.register('type', 'string', function (x) {
103
+ return '' + x;
104
+ });
105
+
106
+ // add help and version arguments if necessary
107
+ var defaultPrefix = (this.prefixChars.indexOf('-') > -1) ? '-' : this.prefixChars[0];
108
+ if (options.addHelp) {
109
+ this.addArgument(
110
+ [defaultPrefix + 'h', defaultPrefix + defaultPrefix + 'help'],
111
+ {
112
+ action: 'help',
113
+ defaultValue: $$.SUPPRESS,
114
+ help: 'Show this help message and exit.'
115
+ }
116
+ );
117
+ }
118
+ if (this.version !== undefined) {
119
+ this.addArgument(
120
+ [defaultPrefix + 'v', defaultPrefix + defaultPrefix + 'version'],
121
+ {
122
+ action: 'version',
123
+ version: this.version,
124
+ defaultValue: $$.SUPPRESS,
125
+ help: "Show program's version number and exit."
126
+ }
127
+ );
128
+ }
129
+
130
+ // add parent arguments and defaults
131
+ options.parents.forEach(function (parent) {
132
+ self._addContainerActions(parent);
133
+ if (parent._defaults !== undefined) {
134
+ for (var defaultKey in parent._defaults) {
135
+ if (parent._defaults.hasOwnProperty(defaultKey)) {
136
+ self._defaults[defaultKey] = parent._defaults[defaultKey];
137
+ }
138
+ }
139
+ }
140
+ });
141
+
142
+ };
143
+ util.inherits(ArgumentParser, ActionContainer);
144
+
145
+ /**
146
+ * ArgumentParser#addSubparsers(options) -> [[ActionSubparsers]]
147
+ * - options (object): hash of options see [[ActionSubparsers.new]]
148
+ *
149
+ * See also [subcommands][1]
150
+ *
151
+ * [1]:http://docs.python.org/dev/library/argparse.html#sub-commands
152
+ **/
153
+ ArgumentParser.prototype.addSubparsers = function (options) {
154
+ if (!!this._subparsers) {
155
+ this.error('Cannot have multiple subparser arguments.');
156
+ }
157
+
158
+ options = options || {};
159
+ options.debug = (this.debug === true);
160
+ options.optionStrings = [];
161
+ options.parserClass = (options.parserClass || ArgumentParser);
162
+
163
+
164
+ if (!!options.title || !!options.description) {
165
+
166
+ this._subparsers = this.addArgumentGroup({
167
+ title: (options.title || 'subcommands'),
168
+ description: options.description
169
+ });
170
+ delete options.title;
171
+ delete options.description;
172
+
173
+ } else {
174
+ this._subparsers = this._positionals;
175
+ }
176
+
177
+ // prog defaults to the usage message of this parser, skipping
178
+ // optional arguments and with no "usage:" prefix
179
+ if (!options.prog) {
180
+ var formatter = this._getFormatter();
181
+ var positionals = this._getPositionalActions();
182
+ var groups = this._mutuallyExclusiveGroups;
183
+ formatter.addUsage(this.usage, positionals, groups, '');
184
+ options.prog = _.str.strip(formatter.formatHelp());
185
+ }
186
+
187
+ // create the parsers action and add it to the positionals list
188
+ var ParsersClass = this._popActionClass(options, 'parsers');
189
+ var action = new ParsersClass(options);
190
+ this._subparsers._addAction(action);
191
+
192
+ // return the created parsers action
193
+ return action;
194
+ };
195
+
196
+ ArgumentParser.prototype._addAction = function (action) {
197
+ if (action.isOptional()) {
198
+ this._optionals._addAction(action);
199
+ } else {
200
+ this._positionals._addAction(action);
201
+ }
202
+ return action;
203
+ };
204
+
205
+ ArgumentParser.prototype._getOptionalActions = function () {
206
+ return this._actions.filter(function (action) {
207
+ return action.isOptional();
208
+ });
209
+ };
210
+
211
+ ArgumentParser.prototype._getPositionalActions = function () {
212
+ return this._actions.filter(function (action) {
213
+ return action.isPositional();
214
+ });
215
+ };
216
+
217
+
218
+ /**
219
+ * ArgumentParser#parseArgs(args, namespace) -> Namespace|Object
220
+ * - args (array): input elements
221
+ * - namespace (Namespace|Object): result object
222
+ *
223
+ * Parsed args and throws error if some arguments are not recognized
224
+ *
225
+ * See also [original guide][1]
226
+ *
227
+ * [1]:http://docs.python.org/dev/library/argparse.html#the-parse-args-method
228
+ **/
229
+ ArgumentParser.prototype.parseArgs = function (args, namespace) {
230
+ var argv;
231
+ var result = this.parseKnownArgs(args, namespace);
232
+
233
+ args = result[0];
234
+ argv = result[1];
235
+ if (argv && argv.length > 0) {
236
+ this.error(
237
+ format('Unrecognized arguments: %s.', argv.join(' '))
238
+ );
239
+ }
240
+ return args;
241
+ };
242
+
243
+ /**
244
+ * ArgumentParser#parseKnownArgs(args, namespace) -> array
245
+ * - args (array): input options
246
+ * - namespace (Namespace|Object): result object
247
+ *
248
+ * Parse known arguments and return tuple of result object
249
+ * and unknown args
250
+ *
251
+ * See also [original guide][1]
252
+ *
253
+ * [1]:http://docs.python.org/dev/library/argparse.html#partial-parsing
254
+ **/
255
+ ArgumentParser.prototype.parseKnownArgs = function (args, namespace) {
256
+ var self = this;
257
+
258
+ // args default to the system args
259
+ args = args || process.argv.slice(2);
260
+
261
+ // default Namespace built from parser defaults
262
+ namespace = namespace || new Namespace();
263
+
264
+ self._actions.forEach(function (action) {
265
+ if (action.dest !== $$.SUPPRESS) {
266
+ if (!_.has(namespace, action.dest)) {
267
+ if (action.defaultValue !== $$.SUPPRESS) {
268
+ var defaultValue = action.defaultValue;
269
+ if (_.isString(action.defaultValue)) {
270
+ defaultValue = self._getValue(action, defaultValue);
271
+ }
272
+ namespace[action.dest] = defaultValue;
273
+ }
274
+ }
275
+ }
276
+ });
277
+
278
+ _.keys(self._defaults).forEach(function (dest) {
279
+ namespace[dest] = self._defaults[dest];
280
+ });
281
+
282
+ // parse the arguments and exit if there are any errors
283
+ try {
284
+ var res = this._parseKnownArgs(args, namespace);
285
+
286
+ namespace = res[0];
287
+ args = res[1];
288
+ if (_.has(namespace, $$._UNRECOGNIZED_ARGS_ATTR)) {
289
+ args = _.union(args, namespace[$$._UNRECOGNIZED_ARGS_ATTR]);
290
+ delete namespace[$$._UNRECOGNIZED_ARGS_ATTR];
291
+ }
292
+ return [namespace, args];
293
+ } catch (e) {
294
+ this.error(e);
295
+ }
296
+ };
297
+
298
+ ArgumentParser.prototype._parseKnownArgs = function (argStrings, namespace) {
299
+ var self = this;
300
+
301
+ var extras = [];
302
+
303
+ // replace arg strings that are file references
304
+ if (this.fromfilePrefixChars !== null) {
305
+ argStrings = this._readArgsFromFiles(argStrings);
306
+ }
307
+ // map all mutually exclusive arguments to the other arguments
308
+ // they can't occur with
309
+ // Python has 'conflicts = action_conflicts.setdefault(mutex_action, [])'
310
+ // though I can't conceive of a way in which an action could be a member
311
+ // of two different mutually exclusive groups.
312
+
313
+ function actionHash(action) {
314
+ // some sort of hashable key for this action
315
+ // action itself cannot be a key in actionConflicts
316
+ // I think getName() (join of optionStrings) is unique enough
317
+ return action.getName();
318
+ }
319
+
320
+ var conflicts, key;
321
+ var actionConflicts = {};
322
+
323
+ this._mutuallyExclusiveGroups.forEach(function (mutexGroup) {
324
+ mutexGroup._groupActions.forEach(function (mutexAction, i, groupActions) {
325
+ key = actionHash(mutexAction);
326
+ if (!_.has(actionConflicts, key)) {
327
+ actionConflicts[key] = [];
328
+ }
329
+ conflicts = actionConflicts[key];
330
+ conflicts.push.apply(conflicts, groupActions.slice(0, i));
331
+ conflicts.push.apply(conflicts, groupActions.slice(i + 1));
332
+ });
333
+ });
334
+
335
+ // find all option indices, and determine the arg_string_pattern
336
+ // which has an 'O' if there is an option at an index,
337
+ // an 'A' if there is an argument, or a '-' if there is a '--'
338
+ var optionStringIndices = {};
339
+
340
+ var argStringPatternParts = [];
341
+
342
+ argStrings.forEach(function (argString, argStringIndex) {
343
+ if (argString === '--') {
344
+ argStringPatternParts.push('-');
345
+ while (argStringIndex < argStrings.length) {
346
+ argStringPatternParts.push('A');
347
+ argStringIndex++;
348
+ }
349
+ }
350
+ // otherwise, add the arg to the arg strings
351
+ // and note the index if it was an option
352
+ else {
353
+ var pattern;
354
+ var optionTuple = self._parseOptional(argString);
355
+ if (!optionTuple) {
356
+ pattern = 'A';
357
+ }
358
+ else {
359
+ optionStringIndices[argStringIndex] = optionTuple;
360
+ pattern = 'O';
361
+ }
362
+ argStringPatternParts.push(pattern);
363
+ }
364
+ });
365
+ var argStringsPattern = argStringPatternParts.join('');
366
+
367
+ var seenActions = [];
368
+ var seenNonDefaultActions = [];
369
+
370
+
371
+ function takeAction(action, argumentStrings, optionString) {
372
+ seenActions.push(action);
373
+ var argumentValues = self._getValues(action, argumentStrings);
374
+
375
+ // error if this argument is not allowed with other previously
376
+ // seen arguments, assuming that actions that use the default
377
+ // value don't really count as "present"
378
+ if (argumentValues !== action.defaultValue) {
379
+ seenNonDefaultActions.push(action);
380
+ if (!!actionConflicts[actionHash(action)]) {
381
+ actionConflicts[actionHash(action)].forEach(function (actionConflict) {
382
+ if (seenNonDefaultActions.indexOf(actionConflict) >= 0) {
383
+ throw argumentErrorHelper(
384
+ action,
385
+ format('Not allowed with argument "%s".', actionConflict.getName())
386
+ );
387
+ }
388
+ });
389
+ }
390
+ }
391
+
392
+ if (argumentValues !== $$.SUPPRESS) {
393
+ action.call(self, namespace, argumentValues, optionString);
394
+ }
395
+ }
396
+
397
+ function consumeOptional(startIndex) {
398
+ // get the optional identified at this index
399
+ var optionTuple = optionStringIndices[startIndex];
400
+ var action = optionTuple[0];
401
+ var optionString = optionTuple[1];
402
+ var explicitArg = optionTuple[2];
403
+
404
+ // identify additional optionals in the same arg string
405
+ // (e.g. -xyz is the same as -x -y -z if no args are required)
406
+ var actionTuples = [];
407
+
408
+ var args, argCount, start, stop;
409
+
410
+ while (true) {
411
+ if (!action) {
412
+ extras.push(argStrings[startIndex]);
413
+ return startIndex + 1;
414
+ }
415
+ if (!!explicitArg) {
416
+ argCount = self._matchArgument(action, 'A');
417
+
418
+ // if the action is a single-dash option and takes no
419
+ // arguments, try to parse more single-dash options out
420
+ // of the tail of the option string
421
+ var chars = self.prefixChars;
422
+ if (argCount === 0 && chars.indexOf(optionString[1]) < 0) {
423
+ actionTuples.push([action, [], optionString]);
424
+ optionString = optionString[0] + explicitArg[0];
425
+ var newExplicitArg = explicitArg.slice(1) || null;
426
+ var optionalsMap = self._optionStringActions;
427
+
428
+ if (_.keys(optionalsMap).indexOf(optionString) >= 0) {
429
+ action = optionalsMap[optionString];
430
+ explicitArg = newExplicitArg;
431
+ }
432
+ else {
433
+ var msg = 'ignored explicit argument %r';
434
+ throw argumentErrorHelper(action, msg);
435
+ }
436
+ }
437
+ // if the action expect exactly one argument, we've
438
+ // successfully matched the option; exit the loop
439
+ else if (argCount === 1) {
440
+ stop = startIndex + 1;
441
+ args = [explicitArg];
442
+ actionTuples.push([action, args, optionString]);
443
+ break;
444
+ }
445
+ // error if a double-dash option did not use the
446
+ // explicit argument
447
+ else {
448
+ var message = 'ignored explicit argument %r';
449
+ throw argumentErrorHelper(action, _.str.sprintf(message, explicitArg));
450
+ }
451
+ }
452
+ // if there is no explicit argument, try to match the
453
+ // optional's string arguments with the following strings
454
+ // if successful, exit the loop
455
+ else {
456
+
457
+ start = startIndex + 1;
458
+ var selectedPatterns = argStringsPattern.substr(start);
459
+
460
+ argCount = self._matchArgument(action, selectedPatterns);
461
+ stop = start + argCount;
462
+
463
+
464
+ args = argStrings.slice(start, stop);
465
+
466
+ actionTuples.push([action, args, optionString]);
467
+ break;
468
+ }
469
+
470
+ }
471
+
472
+ // add the Optional to the list and return the index at which
473
+ // the Optional's string args stopped
474
+ if (actionTuples.length < 1) {
475
+ throw new Error('length should be > 0');
476
+ }
477
+ for (var i = 0; i < actionTuples.length; i++) {
478
+ takeAction.apply(self, actionTuples[i]);
479
+ }
480
+ return stop;
481
+ }
482
+
483
+ // the list of Positionals left to be parsed; this is modified
484
+ // by consume_positionals()
485
+ var positionals = self._getPositionalActions();
486
+
487
+ function consumePositionals(startIndex) {
488
+ // match as many Positionals as possible
489
+ var selectedPattern = argStringsPattern.substr(startIndex);
490
+ var argCounts = self._matchArgumentsPartial(positionals, selectedPattern);
491
+
492
+ // slice off the appropriate arg strings for each Positional
493
+ // and add the Positional and its args to the list
494
+ _.zip(positionals, argCounts).forEach(function (item) {
495
+ var action = item[0];
496
+ var argCount = item[1];
497
+ if (argCount === undefined) {
498
+ return;
499
+ }
500
+ var args = argStrings.slice(startIndex, startIndex + argCount);
501
+
502
+ startIndex += argCount;
503
+ takeAction(action, args);
504
+ });
505
+
506
+ // slice off the Positionals that we just parsed and return the
507
+ // index at which the Positionals' string args stopped
508
+ positionals = positionals.slice(argCounts.length);
509
+ return startIndex;
510
+ }
511
+
512
+ // consume Positionals and Optionals alternately, until we have
513
+ // passed the last option string
514
+ var startIndex = 0;
515
+ var position;
516
+
517
+ var maxOptionStringIndex = -1;
518
+
519
+ Object.keys(optionStringIndices).forEach(function (position) {
520
+ maxOptionStringIndex = Math.max(maxOptionStringIndex, parseInt(position, 10));
521
+ });
522
+
523
+ var positionalsEndIndex, nextOptionStringIndex;
524
+
525
+ while (startIndex <= maxOptionStringIndex) {
526
+ // consume any Positionals preceding the next option
527
+ nextOptionStringIndex = null;
528
+ for (position in optionStringIndices) {
529
+ if (!optionStringIndices.hasOwnProperty(position)) { continue; }
530
+
531
+ position = parseInt(position, 10);
532
+ if (position >= startIndex) {
533
+ if (nextOptionStringIndex !== null) {
534
+ nextOptionStringIndex = Math.min(nextOptionStringIndex, position);
535
+ }
536
+ else {
537
+ nextOptionStringIndex = position;
538
+ }
539
+ }
540
+ }
541
+
542
+ if (startIndex !== nextOptionStringIndex) {
543
+ positionalsEndIndex = consumePositionals(startIndex);
544
+ // only try to parse the next optional if we didn't consume
545
+ // the option string during the positionals parsing
546
+ if (positionalsEndIndex > startIndex) {
547
+ startIndex = positionalsEndIndex;
548
+ continue;
549
+ }
550
+ else {
551
+ startIndex = positionalsEndIndex;
552
+ }
553
+ }
554
+
555
+ // if we consumed all the positionals we could and we're not
556
+ // at the index of an option string, there were extra arguments
557
+ if (!optionStringIndices[startIndex]) {
558
+ var strings = argStrings.slice(startIndex, nextOptionStringIndex);
559
+ extras = extras.concat(strings);
560
+ startIndex = nextOptionStringIndex;
561
+ }
562
+ // consume the next optional and any arguments for it
563
+ startIndex = consumeOptional(startIndex);
564
+ }
565
+
566
+ // consume any positionals following the last Optional
567
+ var stopIndex = consumePositionals(startIndex);
568
+
569
+ // if we didn't consume all the argument strings, there were extras
570
+ extras = extras.concat(_.rest(argStrings, stopIndex));
571
+
572
+ // if we didn't use all the Positional objects, there were too few
573
+ // arg strings supplied.
574
+ if (positionals.length > 0) {
575
+ self.error('too few arguments');
576
+ }
577
+
578
+ // make sure all required actions were present
579
+ self._actions.forEach(function (action) {
580
+ if (action.required) {
581
+ if (_.indexOf(seenActions, action) < 0) {
582
+ self.error(format('Argument "%s" is required', action.getName()));
583
+ }
584
+ }
585
+ });
586
+
587
+ // make sure all required groups have one option present
588
+ var actionUsed = false;
589
+ self._mutuallyExclusiveGroups.forEach(function (group) {
590
+ if (group.required) {
591
+ actionUsed = _.any(group._groupActions, function (action) {
592
+ return _.contains(seenNonDefaultActions, action);
593
+ });
594
+
595
+ // if no actions were used, report the error
596
+ if (!actionUsed) {
597
+ var names = [];
598
+ group._groupActions.forEach(function (action) {
599
+ if (action.help !== $$.SUPPRESS) {
600
+ names.push(action.getName());
601
+ }
602
+ });
603
+ names = names.join(' ');
604
+ var msg = 'one of the arguments ' + names + ' is required';
605
+ self.error(msg);
606
+ }
607
+ }
608
+ });
609
+
610
+ // return the updated namespace and the extra arguments
611
+ return [namespace, extras];
612
+ };
613
+
614
+ ArgumentParser.prototype._readArgsFromFiles = function (argStrings) {
615
+ // expand arguments referencing files
616
+ var _this = this;
617
+ var fs = require('fs');
618
+ var newArgStrings = [];
619
+ argStrings.forEach(function (argString) {
620
+ if (_this.fromfilePrefixChars.indexOf(argString[0]) < 0) {
621
+ // for regular arguments, just add them back into the list
622
+ newArgStrings.push(argString);
623
+ } else {
624
+ // replace arguments referencing files with the file content
625
+ try {
626
+ var argstrs = [];
627
+ var filename = argString.slice(1);
628
+ var content = fs.readFileSync(filename, 'utf8');
629
+ content = content.trim().split('\n');
630
+ content.forEach(function (argLine) {
631
+ _this.convertArgLineToArgs(argLine).forEach(function (arg) {
632
+ argstrs.push(arg);
633
+ });
634
+ argstrs = _this._readArgsFromFiles(argstrs);
635
+ });
636
+ newArgStrings.push.apply(newArgStrings, argstrs);
637
+ } catch (error) {
638
+ return _this.error(error.message);
639
+ }
640
+ }
641
+ });
642
+ return newArgStrings;
643
+ };
644
+
645
+ ArgumentParser.prototype.convertArgLineToArgs = function (argLine) {
646
+ return [argLine];
647
+ };
648
+
649
+ ArgumentParser.prototype._matchArgument = function (action, regexpArgStrings) {
650
+
651
+ // match the pattern for this action to the arg strings
652
+ var regexpNargs = new RegExp('^' + this._getNargsPattern(action));
653
+ var matches = regexpArgStrings.match(regexpNargs);
654
+ var message;
655
+
656
+ // throw an exception if we weren't able to find a match
657
+ if (!matches) {
658
+ switch (action.nargs) {
659
+ case undefined:
660
+ case null:
661
+ message = 'Expected one argument.';
662
+ break;
663
+ case $$.OPTIONAL:
664
+ message = 'Expected at most one argument.';
665
+ break;
666
+ case $$.ONE_OR_MORE:
667
+ message = 'Expected at least one argument.';
668
+ break;
669
+ default:
670
+ message = 'Expected %s argument(s)';
671
+ }
672
+
673
+ throw argumentErrorHelper(
674
+ action,
675
+ format(message, action.nargs)
676
+ );
677
+ }
678
+ // return the number of arguments matched
679
+ return matches[1].length;
680
+ };
681
+
682
+ ArgumentParser.prototype._matchArgumentsPartial = function (actions, regexpArgStrings) {
683
+ // progressively shorten the actions list by slicing off the
684
+ // final actions until we find a match
685
+ var self = this;
686
+ var result = [];
687
+ var actionSlice, pattern, matches;
688
+ var i, j;
689
+
690
+ var getLength = function (string) {
691
+ return string.length;
692
+ };
693
+
694
+ for (i = actions.length; i > 0; i--) {
695
+ pattern = '';
696
+ actionSlice = actions.slice(0, i);
697
+ for (j = 0; j < actionSlice.length; j++) {
698
+ pattern += self._getNargsPattern(actionSlice[j]);
699
+ }
700
+
701
+ pattern = new RegExp('^' + pattern);
702
+ matches = regexpArgStrings.match(pattern);
703
+
704
+ if (matches && matches.length > 0) {
705
+ // need only groups
706
+ matches = matches.splice(1);
707
+ result = result.concat(matches.map(getLength));
708
+ break;
709
+ }
710
+ }
711
+
712
+ // return the list of arg string counts
713
+ return result;
714
+ };
715
+
716
+ ArgumentParser.prototype._parseOptional = function (argString) {
717
+ var action, optionString, argExplicit, optionTuples;
718
+
719
+ // if it's an empty string, it was meant to be a positional
720
+ if (!argString) {
721
+ return null;
722
+ }
723
+
724
+ // if it doesn't start with a prefix, it was meant to be positional
725
+ if (this.prefixChars.indexOf(argString[0]) < 0) {
726
+ return null;
727
+ }
728
+
729
+ // if the option string is present in the parser, return the action
730
+ if (!!this._optionStringActions[argString]) {
731
+ return [this._optionStringActions[argString], argString, null];
732
+ }
733
+
734
+ // if it's just a single character, it was meant to be positional
735
+ if (argString.length === 1) {
736
+ return null;
737
+ }
738
+
739
+ // if the option string before the "=" is present, return the action
740
+ if (argString.indexOf('=') >= 0) {
741
+ var argStringSplit = argString.split('=');
742
+ optionString = argStringSplit[0];
743
+ argExplicit = argStringSplit[1];
744
+
745
+ if (!!this._optionStringActions[optionString]) {
746
+ action = this._optionStringActions[optionString];
747
+ return [action, optionString, argExplicit];
748
+ }
749
+ }
750
+
751
+ // search through all possible prefixes of the option string
752
+ // and all actions in the parser for possible interpretations
753
+ optionTuples = this._getOptionTuples(argString);
754
+
755
+ // if multiple actions match, the option string was ambiguous
756
+ if (optionTuples.length > 1) {
757
+ var optionStrings = optionTuples.map(function (optionTuple) {
758
+ return optionTuple[1];
759
+ });
760
+ this.error(format(
761
+ 'Ambiguous option: "%s" could match %s.',
762
+ argString, optionStrings.join(', ')
763
+ ));
764
+ // if exactly one action matched, this segmentation is good,
765
+ // so return the parsed action
766
+ } else if (optionTuples.length === 1) {
767
+ return optionTuples[0];
768
+ }
769
+
770
+ // if it was not found as an option, but it looks like a negative
771
+ // number, it was meant to be positional
772
+ // unless there are negative-number-like options
773
+ if (argString.match(this._regexpNegativeNumber)) {
774
+ if (!_.any(this._hasNegativeNumberOptionals)) {
775
+ return null;
776
+ }
777
+ }
778
+ // if it contains a space, it was meant to be a positional
779
+ if (argString.search(' ') >= 0) {
780
+ return null;
781
+ }
782
+
783
+ // it was meant to be an optional but there is no such option
784
+ // in this parser (though it might be a valid option in a subparser)
785
+ return [null, argString, null];
786
+ };
787
+
788
+ ArgumentParser.prototype._getOptionTuples = function (optionString) {
789
+ var result = [];
790
+ var chars = this.prefixChars;
791
+ var optionPrefix;
792
+ var argExplicit;
793
+ var action;
794
+ var actionOptionString;
795
+
796
+ // option strings starting with two prefix characters are only split at
797
+ // the '='
798
+ if (chars.indexOf(optionString[0]) >= 0 && chars.indexOf(optionString[1]) >= 0) {
799
+ if (optionString.indexOf('=') >= 0) {
800
+ var optionStringSplit = optionString.split('=', 1);
801
+
802
+ optionPrefix = optionStringSplit[0];
803
+ argExplicit = optionStringSplit[1];
804
+ } else {
805
+ optionPrefix = optionString;
806
+ argExplicit = null;
807
+ }
808
+
809
+ for (actionOptionString in this._optionStringActions) {
810
+ if (actionOptionString.substr(0, optionPrefix.length) === optionPrefix) {
811
+ action = this._optionStringActions[actionOptionString];
812
+ result.push([action, actionOptionString, argExplicit]);
813
+ }
814
+ }
815
+
816
+ // single character options can be concatenated with their arguments
817
+ // but multiple character options always have to have their argument
818
+ // separate
819
+ } else if (chars.indexOf(optionString[0]) >= 0 && chars.indexOf(optionString[1]) < 0) {
820
+ optionPrefix = optionString;
821
+ argExplicit = null;
822
+ var optionPrefixShort = optionString.substr(0, 2);
823
+ var argExplicitShort = optionString.substr(2);
824
+
825
+ for (actionOptionString in this._optionStringActions) {
826
+ action = this._optionStringActions[actionOptionString];
827
+ if (actionOptionString === optionPrefixShort) {
828
+ result.push([action, actionOptionString, argExplicitShort]);
829
+ } else if (actionOptionString.substr(0, optionPrefix.length) === optionPrefix) {
830
+ result.push([action, actionOptionString, argExplicit]);
831
+ }
832
+ }
833
+
834
+ // shouldn't ever get here
835
+ } else {
836
+ throw new Error(format('Unexpected option string: %s.', optionString));
837
+ }
838
+ // return the collected option tuples
839
+ return result;
840
+ };
841
+
842
+ ArgumentParser.prototype._getNargsPattern = function (action) {
843
+ // in all examples below, we have to allow for '--' args
844
+ // which are represented as '-' in the pattern
845
+ var regexpNargs;
846
+
847
+ switch (action.nargs) {
848
+ // the default (null) is assumed to be a single argument
849
+ case undefined:
850
+ case null:
851
+ regexpNargs = '(-*A-*)';
852
+ break;
853
+ // allow zero or more arguments
854
+ case $$.OPTIONAL:
855
+ regexpNargs = '(-*A?-*)';
856
+ break;
857
+ // allow zero or more arguments
858
+ case $$.ZERO_OR_MORE:
859
+ regexpNargs = '(-*[A-]*)';
860
+ break;
861
+ // allow one or more arguments
862
+ case $$.ONE_OR_MORE:
863
+ regexpNargs = '(-*A[A-]*)';
864
+ break;
865
+ // allow any number of options or arguments
866
+ case $$.REMAINDER:
867
+ regexpNargs = '([-AO]*)';
868
+ break;
869
+ // allow one argument followed by any number of options or arguments
870
+ case $$.PARSER:
871
+ regexpNargs = '(-*A[-AO]*)';
872
+ break;
873
+ // all others should be integers
874
+ default:
875
+ regexpNargs = '(-*' + _.str.repeat('-*A', action.nargs) + '-*)';
876
+ }
877
+
878
+ // if this is an optional action, -- is not allowed
879
+ if (action.isOptional()) {
880
+ regexpNargs = regexpNargs.replace(/-\*/g, '');
881
+ regexpNargs = regexpNargs.replace(/-/g, '');
882
+ }
883
+
884
+ // return the pattern
885
+ return regexpNargs;
886
+ };
887
+
888
+ //
889
+ // Value conversion methods
890
+ //
891
+
892
+ ArgumentParser.prototype._getValues = function (action, argStrings) {
893
+ var self = this;
894
+
895
+ // for everything but PARSER args, strip out '--'
896
+ if (action.nargs !== $$.PARSER && action.nargs !== $$.REMAINDER) {
897
+ argStrings = argStrings.filter(function (arrayElement) {
898
+ return arrayElement !== '--';
899
+ });
900
+ }
901
+
902
+ var value, argString;
903
+
904
+ // optional argument produces a default when not present
905
+ if (argStrings.length === 0 && action.nargs === $$.OPTIONAL) {
906
+
907
+ value = (action.isOptional()) ? action.constant: action.defaultValue;
908
+
909
+ if (typeof(value) === 'string') {
910
+ value = this._getValue(action, value);
911
+ this._checkValue(action, value);
912
+ }
913
+
914
+ // when nargs='*' on a positional, if there were no command-line
915
+ // args, use the default if it is anything other than None
916
+ } else if (argStrings.length === 0 && action.nargs === $$.ZERO_OR_MORE &&
917
+ action.optionStrings.length === 0) {
918
+
919
+ value = (action.defaultValue || argStrings);
920
+ this._checkValue(action, value);
921
+
922
+ // single argument or optional argument produces a single value
923
+ } else if (argStrings.length === 1 &&
924
+ (!action.nargs || action.nargs === $$.OPTIONAL)) {
925
+
926
+ argString = argStrings[0];
927
+ value = this._getValue(action, argString);
928
+ this._checkValue(action, value);
929
+
930
+ // REMAINDER arguments convert all values, checking none
931
+ } else if (action.nargs === $$.REMAINDER) {
932
+ value = argStrings.map(function (v) {
933
+ return self._getValue(action, v);
934
+ });
935
+
936
+ // PARSER arguments convert all values, but check only the first
937
+ } else if (action.nargs === $$.PARSER) {
938
+ value = argStrings.map(function (v) {
939
+ return self._getValue(action, v);
940
+ });
941
+ this._checkValue(action, value[0]);
942
+
943
+ // all other types of nargs produce a list
944
+ } else {
945
+ value = argStrings.map(function (v) {
946
+ return self._getValue(action, v);
947
+ });
948
+ value.forEach(function (v) {
949
+ self._checkValue(action, v);
950
+ });
951
+ }
952
+
953
+ // return the converted value
954
+ return value;
955
+ };
956
+
957
+ ArgumentParser.prototype._getValue = function (action, argString) {
958
+ var result;
959
+
960
+ var typeFunction = this._registryGet('type', action.type, action.type);
961
+ if (!_.isFunction(typeFunction)) {
962
+ var message = format('%s is not callable', typeFunction);
963
+ throw argumentErrorHelper(action, message);
964
+ }
965
+
966
+ // convert the value to the appropriate type
967
+ try {
968
+ result = typeFunction(argString);
969
+
970
+ // ArgumentTypeErrors indicate errors
971
+ // If action.type is not a registered string, it is a function
972
+ // Try to deduce its name for inclusion in the error message
973
+ // Failing that, include the error message it raised.
974
+ } catch (e) {
975
+ var name = null;
976
+ if (_.isString(action.type)) {
977
+ name = action.type;
978
+ } else {
979
+ name = action.type.name || action.type.displayName || '<function>';
980
+ }
981
+ var msg = format('Invalid %s value: %s', name, argString);
982
+ if (name === '<function>') {msg += '\n' + e.message; }
983
+ throw argumentErrorHelper(action, msg);
984
+ }
985
+ // return the converted value
986
+ return result;
987
+ };
988
+
989
+ ArgumentParser.prototype._checkValue = function (action, value) {
990
+ // converted value must be one of the choices (if specified)
991
+ var choices = action.choices;
992
+ if (!!choices) {
993
+ // choise for argument can by array or string
994
+ if ((_.isString(choices) || _.isArray(choices)) &&
995
+ choices.indexOf(value) !== -1) {
996
+ return;
997
+ }
998
+ // choise for subparsers can by only hash
999
+ if (_.isObject(choices) && !_.isArray(choices) && choices[value]) {
1000
+ return;
1001
+ }
1002
+
1003
+ if (_.isString(choices)) {
1004
+ choices = choices.split('').join(', ');
1005
+ }
1006
+ else if (_.isArray(choices)) {
1007
+ choices = choices.join(', ');
1008
+ }
1009
+ else {
1010
+ choices = _.keys(choices).join(', ');
1011
+ }
1012
+ var message = format('Invalid choice: %s (choose from [%s])', value, choices);
1013
+ throw argumentErrorHelper(action, message);
1014
+ }
1015
+ };
1016
+
1017
+ //
1018
+ // Help formatting methods
1019
+ //
1020
+
1021
+ /**
1022
+ * ArgumentParser#formatUsage -> string
1023
+ *
1024
+ * Return usage string
1025
+ *
1026
+ * See also [original guide][1]
1027
+ *
1028
+ * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
1029
+ **/
1030
+ ArgumentParser.prototype.formatUsage = function () {
1031
+ var formatter = this._getFormatter();
1032
+ formatter.addUsage(this.usage, this._actions, this._mutuallyExclusiveGroups);
1033
+ return formatter.formatHelp();
1034
+ };
1035
+
1036
+ /**
1037
+ * ArgumentParser#formatHelp -> string
1038
+ *
1039
+ * Return help
1040
+ *
1041
+ * See also [original guide][1]
1042
+ *
1043
+ * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
1044
+ **/
1045
+ ArgumentParser.prototype.formatHelp = function () {
1046
+ var formatter = this._getFormatter();
1047
+
1048
+ // usage
1049
+ formatter.addUsage(this.usage, this._actions, this._mutuallyExclusiveGroups);
1050
+
1051
+ // description
1052
+ formatter.addText(this.description);
1053
+
1054
+ // positionals, optionals and user-defined groups
1055
+ this._actionGroups.forEach(function (actionGroup) {
1056
+ formatter.startSection(actionGroup.title);
1057
+ formatter.addText(actionGroup.description);
1058
+ formatter.addArguments(actionGroup._groupActions);
1059
+ formatter.endSection();
1060
+ });
1061
+
1062
+ // epilog
1063
+ formatter.addText(this.epilog);
1064
+
1065
+ // determine help from format above
1066
+ return formatter.formatHelp();
1067
+ };
1068
+
1069
+ ArgumentParser.prototype._getFormatter = function () {
1070
+ var FormatterClass = this.formatterClass;
1071
+ var formatter = new FormatterClass({prog: this.prog});
1072
+ return formatter;
1073
+ };
1074
+
1075
+ //
1076
+ // Print functions
1077
+ //
1078
+
1079
+ /**
1080
+ * ArgumentParser#printUsage() -> Void
1081
+ *
1082
+ * Print usage
1083
+ *
1084
+ * See also [original guide][1]
1085
+ *
1086
+ * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
1087
+ **/
1088
+ ArgumentParser.prototype.printUsage = function () {
1089
+ this._printMessage(this.formatUsage());
1090
+ };
1091
+
1092
+ /**
1093
+ * ArgumentParser#printHelp() -> Void
1094
+ *
1095
+ * Print help
1096
+ *
1097
+ * See also [original guide][1]
1098
+ *
1099
+ * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
1100
+ **/
1101
+ ArgumentParser.prototype.printHelp = function () {
1102
+ this._printMessage(this.formatHelp());
1103
+ };
1104
+
1105
+ ArgumentParser.prototype._printMessage = function (message, stream) {
1106
+ if (!stream) {
1107
+ stream = process.stdout;
1108
+ }
1109
+ if (message) {
1110
+ stream.write('' + message);
1111
+ }
1112
+ };
1113
+
1114
+ //
1115
+ // Exit functions
1116
+ //
1117
+
1118
+ /**
1119
+ * ArgumentParser#exit(status=0, message) -> Void
1120
+ * - status (int): exit status
1121
+ * - message (string): message
1122
+ *
1123
+ * Print message in stderr/stdout and exit program
1124
+ **/
1125
+ ArgumentParser.prototype.exit = function (status, message) {
1126
+ if (!!message) {
1127
+ if (status === 0) {
1128
+ this._printMessage(message);
1129
+ }
1130
+ else {
1131
+ this._printMessage(message, process.stderr);
1132
+ }
1133
+ }
1134
+
1135
+ process.exit(status);
1136
+ };
1137
+
1138
+ /**
1139
+ * ArgumentParser#error(message) -> Void
1140
+ * - err (Error|string): message
1141
+ *
1142
+ * Error method Prints a usage message incorporating the message to stderr and
1143
+ * exits. If you override this in a subclass,
1144
+ * it should not return -- it should
1145
+ * either exit or throw an exception.
1146
+ *
1147
+ **/
1148
+ ArgumentParser.prototype.error = function (err) {
1149
+ var message;
1150
+ if (err instanceof Error) {
1151
+ if (this.debug === true) {
1152
+ throw err;
1153
+ }
1154
+ message = err.message;
1155
+ }
1156
+ else {
1157
+ message = err;
1158
+ }
1159
+ var msg = format('%s: error: %s', this.prog, message) + $$.EOL;
1160
+
1161
+ if (this.debug === true) {
1162
+ throw new Error(msg);
1163
+ }
1164
+
1165
+ this.printUsage(process.stderr);
1166
+
1167
+ return this.exit(2, msg);
1168
+ };