ruby-lint 0.0.2 → 0.0.3

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 (321) hide show
  1. data.tar.gz.asc +17 -0
  2. data/.gitignore +1 -0
  3. data/.travis.yml +25 -0
  4. data/.yardopts +4 -0
  5. data/Gemfile +1 -1
  6. data/LICENSE +1 -1
  7. data/MANIFEST +238 -49
  8. data/README.md +84 -131
  9. data/Rakefile +6 -0
  10. data/bin/ruby-lint +2 -2
  11. data/checksum/.gitkeep +0 -0
  12. data/doc/DCO.md +26 -0
  13. data/doc/architecture.md +63 -0
  14. data/doc/code_analysis.md +90 -0
  15. data/doc/configuration.md +86 -0
  16. data/doc/contributing.md +16 -0
  17. data/doc/graphviz/flow.dot +7 -0
  18. data/doc/images/.gitkeep +0 -0
  19. data/doc/images/flow.png +0 -0
  20. data/lib/ruby-lint.rb +35 -35
  21. data/lib/ruby-lint/analyze/argument_amount.rb +73 -0
  22. data/lib/ruby-lint/analyze/shadowing_variables.rb +19 -24
  23. data/lib/ruby-lint/analyze/undefined_methods.rb +68 -0
  24. data/lib/ruby-lint/analyze/undefined_variables.rb +42 -69
  25. data/lib/ruby-lint/analyze/unused_variables.rb +23 -78
  26. data/lib/ruby-lint/base.rb +85 -0
  27. data/lib/ruby-lint/cli.rb +23 -167
  28. data/lib/ruby-lint/cli/analyze.rb +99 -0
  29. data/lib/ruby-lint/cli/ast.rb +35 -0
  30. data/lib/ruby-lint/cli/base.rb +120 -0
  31. data/lib/ruby-lint/configuration.rb +112 -0
  32. data/lib/ruby-lint/constant_loader.rb +92 -0
  33. data/lib/ruby-lint/definition/ruby_method.rb +248 -0
  34. data/lib/ruby-lint/definition/ruby_object.rb +757 -0
  35. data/lib/ruby-lint/definition_generator.rb +155 -0
  36. data/lib/ruby-lint/definitions/core.rb +5 -0
  37. data/lib/ruby-lint/definitions/core/arg0.rb +7 -0
  38. data/lib/ruby-lint/definitions/core/argf.rb +7 -0
  39. data/lib/ruby-lint/definitions/core/argument_error.rb +12 -0
  40. data/lib/ruby-lint/definitions/core/argv.rb +7 -0
  41. data/lib/ruby-lint/definitions/core/array.rb +414 -0
  42. data/lib/ruby-lint/definitions/core/autoload.rb +39 -0
  43. data/lib/ruby-lint/definitions/core/basic_object.rb +46 -0
  44. data/lib/ruby-lint/definitions/core/bignum.rb +128 -0
  45. data/lib/ruby-lint/definitions/core/binding.rb +52 -0
  46. data/lib/ruby-lint/definitions/core/class.rb +23 -0
  47. data/lib/ruby-lint/definitions/core/comparable.rb +38 -0
  48. data/lib/ruby-lint/definitions/core/complex.rb +195 -0
  49. data/lib/ruby-lint/definitions/core/condition_variable.rb +19 -0
  50. data/lib/ruby-lint/definitions/core/continuation.rb +8 -0
  51. data/lib/ruby-lint/definitions/core/data.rb +8 -0
  52. data/lib/ruby-lint/definitions/core/date.rb +706 -0
  53. data/lib/ruby-lint/definitions/core/date_time.rb +381 -0
  54. data/lib/ruby-lint/definitions/core/default_record_separator.rb +7 -0
  55. data/lib/ruby-lint/definitions/core/digest.rb +166 -0
  56. data/lib/ruby-lint/definitions/core/dir.rb +496 -0
  57. data/lib/ruby-lint/definitions/core/encoding.rb +2030 -0
  58. data/lib/ruby-lint/definitions/core/encoding_error.rb +8 -0
  59. data/lib/ruby-lint/definitions/core/enumerable.rb +352 -0
  60. data/lib/ruby-lint/definitions/core/enumerator.rb +37 -0
  61. data/lib/ruby-lint/definitions/core/env.rb +7 -0
  62. data/lib/ruby-lint/definitions/core/eoferror.rb +8 -0
  63. data/lib/ruby-lint/definitions/core/erb.rb +304 -0
  64. data/lib/ruby-lint/definitions/core/errno.rb +3331 -0
  65. data/lib/ruby-lint/definitions/core/etc.rb +138 -0
  66. data/lib/ruby-lint/definitions/core/exception.rb +72 -0
  67. data/lib/ruby-lint/definitions/core/false.rb +7 -0
  68. data/lib/ruby-lint/definitions/core/false_class.rb +30 -0
  69. data/lib/ruby-lint/definitions/core/fatal_error.rb +8 -0
  70. data/lib/ruby-lint/definitions/core/fiber.rb +35 -0
  71. data/lib/ruby-lint/definitions/core/fiber_error.rb +8 -0
  72. data/lib/ruby-lint/definitions/core/file.rb +1277 -0
  73. data/lib/ruby-lint/definitions/core/file_list.rb +727 -0
  74. data/lib/ruby-lint/definitions/core/file_test.rb +106 -0
  75. data/lib/ruby-lint/definitions/core/file_utils.rb +1027 -0
  76. data/lib/ruby-lint/definitions/core/fixnum.rb +156 -0
  77. data/lib/ruby-lint/definitions/core/float.rb +307 -0
  78. data/lib/ruby-lint/definitions/core/float_domain_error.rb +8 -0
  79. data/lib/ruby-lint/definitions/core/gc.rb +57 -0
  80. data/lib/ruby-lint/definitions/core/gem.rb +3161 -0
  81. data/lib/ruby-lint/definitions/core/hash.rb +512 -0
  82. data/lib/ruby-lint/definitions/core/immediate_value.rb +19 -0
  83. data/lib/ruby-lint/definitions/core/index_error.rb +8 -0
  84. data/lib/ruby-lint/definitions/core/integer.rb +100 -0
  85. data/lib/ruby-lint/definitions/core/interrupt.rb +14 -0
  86. data/lib/ruby-lint/definitions/core/io.rb +928 -0
  87. data/lib/ruby-lint/definitions/core/ioerror.rb +8 -0
  88. data/lib/ruby-lint/definitions/core/kernel.rb +504 -0
  89. data/lib/ruby-lint/definitions/core/key_error.rb +8 -0
  90. data/lib/ruby-lint/definitions/core/load_error.rb +28 -0
  91. data/lib/ruby-lint/definitions/core/local_jump_error.rb +8 -0
  92. data/lib/ruby-lint/definitions/core/main.rb +25 -0
  93. data/lib/ruby-lint/definitions/core/marshal.rb +466 -0
  94. data/lib/ruby-lint/definitions/core/match_data.rb +73 -0
  95. data/lib/ruby-lint/definitions/core/math.rb +205 -0
  96. data/lib/ruby-lint/definitions/core/memory_segmention_error.rb +8 -0
  97. data/lib/ruby-lint/definitions/core/method.rb +61 -0
  98. data/lib/ruby-lint/definitions/core/module.rb +262 -0
  99. data/lib/ruby-lint/definitions/core/monitor.rb +39 -0
  100. data/lib/ruby-lint/definitions/core/monitor_mixin.rb +59 -0
  101. data/lib/ruby-lint/definitions/core/mutex.rb +32 -0
  102. data/lib/ruby-lint/definitions/core/name_error.rb +16 -0
  103. data/lib/ruby-lint/definitions/core/nil.rb +7 -0
  104. data/lib/ruby-lint/definitions/core/nil_class.rb +46 -0
  105. data/lib/ruby-lint/definitions/core/no_memory_error.rb +8 -0
  106. data/lib/ruby-lint/definitions/core/no_method_error.rb +18 -0
  107. data/lib/ruby-lint/definitions/core/not_implemented_error.rb +8 -0
  108. data/lib/ruby-lint/definitions/core/numeric.rb +123 -0
  109. data/lib/ruby-lint/definitions/core/object.rb +31 -0
  110. data/lib/ruby-lint/definitions/core/object_space.rb +41 -0
  111. data/lib/ruby-lint/definitions/core/open_struct.rb +49 -0
  112. data/lib/ruby-lint/definitions/core/option_parser.rb +1355 -0
  113. data/lib/ruby-lint/definitions/core/precision.rb +21 -0
  114. data/lib/ruby-lint/definitions/core/primitive_failure.rb +8 -0
  115. data/lib/ruby-lint/definitions/core/proc.rb +109 -0
  116. data/lib/ruby-lint/definitions/core/process.rb +602 -0
  117. data/lib/ruby-lint/definitions/core/psych.rb +2231 -0
  118. data/lib/ruby-lint/definitions/core/queue.rb +44 -0
  119. data/lib/ruby-lint/definitions/core/rake.rb +4784 -0
  120. data/lib/ruby-lint/definitions/core/rake_file_utils.rb +203 -0
  121. data/lib/ruby-lint/definitions/core/rakeversion.rb +7 -0
  122. data/lib/ruby-lint/definitions/core/random.rb +38 -0
  123. data/lib/ruby-lint/definitions/core/range.rb +104 -0
  124. data/lib/ruby-lint/definitions/core/range_error.rb +8 -0
  125. data/lib/ruby-lint/definitions/core/rational.rb +96 -0
  126. data/lib/ruby-lint/definitions/core/rb_config.rb +36 -0
  127. data/lib/ruby-lint/definitions/core/regexp.rb +396 -0
  128. data/lib/ruby-lint/definitions/core/regexp_error.rb +8 -0
  129. data/lib/ruby-lint/definitions/core/rubinius.rb +16637 -0
  130. data/lib/ruby-lint/definitions/core/ruby_copyright.rb +7 -0
  131. data/lib/ruby-lint/definitions/core/ruby_description.rb +7 -0
  132. data/lib/ruby-lint/definitions/core/ruby_engine.rb +7 -0
  133. data/lib/ruby-lint/definitions/core/ruby_lint.rb +93 -0
  134. data/lib/ruby-lint/definitions/core/ruby_patchlevel.rb +7 -0
  135. data/lib/ruby-lint/definitions/core/ruby_platform.rb +7 -0
  136. data/lib/ruby-lint/definitions/core/ruby_release_date.rb +7 -0
  137. data/lib/ruby-lint/definitions/core/ruby_version.rb +7 -0
  138. data/lib/ruby-lint/definitions/core/runtime_error.rb +8 -0
  139. data/lib/ruby-lint/definitions/core/scan_error.rb +8 -0
  140. data/lib/ruby-lint/definitions/core/script_error.rb +8 -0
  141. data/lib/ruby-lint/definitions/core/security_error.rb +8 -0
  142. data/lib/ruby-lint/definitions/core/shellwords.rb +37 -0
  143. data/lib/ruby-lint/definitions/core/signal.rb +37 -0
  144. data/lib/ruby-lint/definitions/core/signal_exception.rb +19 -0
  145. data/lib/ruby-lint/definitions/core/singleton.rb +37 -0
  146. data/lib/ruby-lint/definitions/core/sized_queue.rb +42 -0
  147. data/lib/ruby-lint/definitions/core/standard_error.rb +8 -0
  148. data/lib/ruby-lint/definitions/core/stderr.rb +7 -0
  149. data/lib/ruby-lint/definitions/core/stdin.rb +7 -0
  150. data/lib/ruby-lint/definitions/core/stdout.rb +7 -0
  151. data/lib/ruby-lint/definitions/core/stop_iteration.rb +8 -0
  152. data/lib/ruby-lint/definitions/core/string.rb +713 -0
  153. data/lib/ruby-lint/definitions/core/string_io.rb +287 -0
  154. data/lib/ruby-lint/definitions/core/string_scanner.rb +158 -0
  155. data/lib/ruby-lint/definitions/core/struct.rb +357 -0
  156. data/lib/ruby-lint/definitions/core/syck.rb +30 -0
  157. data/lib/ruby-lint/definitions/core/symbol.rb +90 -0
  158. data/lib/ruby-lint/definitions/core/syntax_error.rb +44 -0
  159. data/lib/ruby-lint/definitions/core/system_call_error.rb +31 -0
  160. data/lib/ruby-lint/definitions/core/system_exit.rb +19 -0
  161. data/lib/ruby-lint/definitions/core/system_stack_error.rb +8 -0
  162. data/lib/ruby-lint/definitions/core/thread.rb +209 -0
  163. data/lib/ruby-lint/definitions/core/thread_error.rb +8 -0
  164. data/lib/ruby-lint/definitions/core/thread_group.rb +22 -0
  165. data/lib/ruby-lint/definitions/core/time.rb +233 -0
  166. data/lib/ruby-lint/definitions/core/toplevel_binding.rb +7 -0
  167. data/lib/ruby-lint/definitions/core/true.rb +7 -0
  168. data/lib/ruby-lint/definitions/core/true_class.rb +30 -0
  169. data/lib/ruby-lint/definitions/core/type_error.rb +8 -0
  170. data/lib/ruby-lint/definitions/core/unbound_method.rb +51 -0
  171. data/lib/ruby-lint/definitions/core/unmarshalable.rb +13 -0
  172. data/lib/ruby-lint/definitions/core/unsupported_library_error.rb +8 -0
  173. data/lib/ruby-lint/definitions/core/weak_ref.rb +42 -0
  174. data/lib/ruby-lint/definitions/core/zero_division_error.rb +8 -0
  175. data/lib/ruby-lint/definitions_builder.rb +692 -0
  176. data/lib/ruby-lint/extensions/string.rb +15 -0
  177. data/lib/ruby-lint/helper/constant_paths.rb +41 -0
  178. data/lib/ruby-lint/helper/conversion.rb +33 -0
  179. data/lib/ruby-lint/helper/current_scope.rb +98 -0
  180. data/lib/ruby-lint/helper/methods.rb +91 -0
  181. data/lib/ruby-lint/inspector.rb +191 -0
  182. data/lib/ruby-lint/iterator.rb +187 -127
  183. data/lib/ruby-lint/node.rb +107 -0
  184. data/lib/ruby-lint/parser.rb +510 -1137
  185. data/lib/ruby-lint/parser_error.rb +15 -27
  186. data/lib/ruby-lint/presenter/json.rb +19 -0
  187. data/lib/ruby-lint/presenter/text.rb +37 -0
  188. data/lib/ruby-lint/report.rb +95 -53
  189. data/lib/ruby-lint/report/entry.rb +71 -0
  190. data/lib/ruby-lint/template/definition.erb +24 -0
  191. data/lib/ruby-lint/template/scope.rb +25 -0
  192. data/lib/ruby-lint/variable_predicates.rb +109 -0
  193. data/lib/ruby-lint/version.rb +1 -1
  194. data/ruby-lint.gemspec +19 -8
  195. data/spec/helper.rb +10 -2
  196. data/spec/ruby-lint/analyze/argument_amount.rb +91 -0
  197. data/spec/ruby-lint/analyze/shadowing_variables.rb +69 -14
  198. data/spec/ruby-lint/analyze/undefined_methods.rb +174 -0
  199. data/spec/ruby-lint/analyze/undefined_variables.rb +70 -179
  200. data/spec/ruby-lint/analyze/unused_variables.rb +63 -183
  201. data/spec/ruby-lint/configuration.rb +15 -0
  202. data/spec/ruby-lint/constant_loader.rb +32 -0
  203. data/spec/ruby-lint/definition/dsl.rb +142 -0
  204. data/spec/ruby-lint/definition/method_calls.rb +26 -0
  205. data/spec/ruby-lint/definition/ruby_method.rb +175 -0
  206. data/spec/ruby-lint/definition/ruby_object.rb +228 -0
  207. data/spec/ruby-lint/definitions_builder/assignments/arrays.rb +71 -0
  208. data/spec/ruby-lint/definitions_builder/assignments/hashes.rb +65 -0
  209. data/spec/ruby-lint/definitions_builder/assignments/objects.rb +23 -0
  210. data/spec/ruby-lint/definitions_builder/assignments/optional.rb +22 -0
  211. data/spec/ruby-lint/definitions_builder/assignments/return_values.rb +78 -0
  212. data/spec/ruby-lint/definitions_builder/assignments/variables.rb +71 -0
  213. data/spec/ruby-lint/definitions_builder/associate_nodes.rb +17 -0
  214. data/spec/ruby-lint/definitions_builder/blocks.rb +40 -0
  215. data/spec/ruby-lint/definitions_builder/classes.rb +230 -0
  216. data/spec/ruby-lint/definitions_builder/for.rb +16 -0
  217. data/spec/ruby-lint/definitions_builder/methods.rb +147 -0
  218. data/spec/ruby-lint/definitions_builder/modules.rb +175 -0
  219. data/spec/ruby-lint/definitions_builder/reference_amount.rb +31 -0
  220. data/spec/ruby-lint/definitions_builder/unused.rb +15 -0
  221. data/spec/ruby-lint/extensions/string.rb +7 -0
  222. data/spec/ruby-lint/iterator.rb +42 -417
  223. data/spec/ruby-lint/node.rb +38 -0
  224. data/spec/ruby-lint/parser/assignments.rb +225 -0
  225. data/spec/ruby-lint/parser/classes.rb +80 -122
  226. data/spec/ruby-lint/parser/errors.rb +7 -14
  227. data/spec/ruby-lint/parser/metadata.rb +17 -0
  228. data/spec/ruby-lint/parser/method_definitions.rb +111 -0
  229. data/spec/ruby-lint/parser/methods.rb +184 -216
  230. data/spec/ruby-lint/parser/modules.rb +54 -33
  231. data/spec/ruby-lint/parser/operators.rb +30 -65
  232. data/spec/ruby-lint/parser/statements/begin.rb +55 -0
  233. data/spec/ruby-lint/parser/statements/case.rb +34 -0
  234. data/spec/ruby-lint/parser/statements/defined.rb +11 -0
  235. data/spec/ruby-lint/parser/statements/for.rb +34 -0
  236. data/spec/ruby-lint/parser/statements/if.rb +46 -0
  237. data/spec/ruby-lint/parser/statements/return.rb +14 -0
  238. data/spec/ruby-lint/parser/statements/super.rb +49 -0
  239. data/spec/ruby-lint/parser/statements/unless.rb +42 -0
  240. data/spec/ruby-lint/parser/statements/until.rb +25 -0
  241. data/spec/ruby-lint/parser/statements/while.rb +25 -0
  242. data/spec/ruby-lint/parser/statements/yield.rb +18 -0
  243. data/spec/ruby-lint/parser/types/arrays.rb +47 -0
  244. data/spec/ruby-lint/parser/types/booleans.rb +11 -0
  245. data/spec/ruby-lint/parser/types/constants.rb +32 -0
  246. data/spec/ruby-lint/parser/types/hashes.rb +55 -0
  247. data/spec/ruby-lint/parser/types/nil.rb +7 -0
  248. data/spec/ruby-lint/parser/types/numbers.rb +11 -0
  249. data/spec/ruby-lint/parser/types/procs.rb +11 -0
  250. data/spec/ruby-lint/parser/types/ranges.rb +11 -0
  251. data/spec/ruby-lint/parser/types/regexp.rb +27 -0
  252. data/spec/ruby-lint/parser/types/strings.rb +44 -0
  253. data/spec/ruby-lint/parser/types/symbols.rb +15 -0
  254. data/spec/ruby-lint/presenter/json.rb +31 -0
  255. data/spec/ruby-lint/presenter/text.rb +22 -0
  256. data/spec/ruby-lint/report.rb +45 -15
  257. data/spec/ruby-lint/report/entry.rb +24 -0
  258. data/spec/support/bacon.rb +33 -0
  259. data/spec/support/building.rb +43 -0
  260. data/spec/support/definitions.rb +23 -0
  261. data/spec/support/parsing.rb +23 -0
  262. data/spec/support/simplecov.rb +16 -0
  263. data/task/build.rake +9 -0
  264. data/task/checksum.rake +13 -0
  265. data/task/coverage.rake +6 -0
  266. data/task/doc.rake +5 -0
  267. data/task/generate.rake +34 -0
  268. data/task/graphviz.rake +12 -0
  269. data/task/stdlib.rake +2 -9
  270. data/task/tag.rake +6 -0
  271. metadata +337 -68
  272. metadata.gz.asc +17 -0
  273. data/.rbenv-version +0 -1
  274. data/lib/ruby-lint/analyze/coding_style.rb +0 -407
  275. data/lib/ruby-lint/analyze/definitions.rb +0 -244
  276. data/lib/ruby-lint/analyze/method_validation.rb +0 -104
  277. data/lib/ruby-lint/callback.rb +0 -67
  278. data/lib/ruby-lint/constant_importer.rb +0 -112
  279. data/lib/ruby-lint/definition.rb +0 -230
  280. data/lib/ruby-lint/formatter/text.rb +0 -54
  281. data/lib/ruby-lint/helper/definition_resolver.rb +0 -143
  282. data/lib/ruby-lint/helper/scoping.rb +0 -138
  283. data/lib/ruby-lint/options.rb +0 -58
  284. data/lib/ruby-lint/token/assignment_token.rb +0 -35
  285. data/lib/ruby-lint/token/begin_rescue_token.rb +0 -57
  286. data/lib/ruby-lint/token/block_token.rb +0 -26
  287. data/lib/ruby-lint/token/case_token.rb +0 -44
  288. data/lib/ruby-lint/token/class_token.rb +0 -24
  289. data/lib/ruby-lint/token/keyword_token.rb +0 -43
  290. data/lib/ruby-lint/token/method_definition_token.rb +0 -64
  291. data/lib/ruby-lint/token/method_token.rb +0 -56
  292. data/lib/ruby-lint/token/parameters_token.rb +0 -99
  293. data/lib/ruby-lint/token/regexp_token.rb +0 -15
  294. data/lib/ruby-lint/token/statement_token.rb +0 -69
  295. data/lib/ruby-lint/token/token.rb +0 -176
  296. data/lib/ruby-lint/token/variable_token.rb +0 -18
  297. data/spec/benchmarks/memory.rb +0 -52
  298. data/spec/benchmarks/parse_parser.rb +0 -16
  299. data/spec/fixtures/stdlib/un.rb +0 -348
  300. data/spec/ruby-lint/analyze/coding_style.rb +0 -224
  301. data/spec/ruby-lint/analyze/complex/un.rb +0 -29
  302. data/spec/ruby-lint/analyze/definitions/classes.rb +0 -114
  303. data/spec/ruby-lint/analyze/definitions/methods.rb +0 -91
  304. data/spec/ruby-lint/analyze/definitions/modules.rb +0 -207
  305. data/spec/ruby-lint/analyze/definitions/variables.rb +0 -103
  306. data/spec/ruby-lint/analyze/method_validation.rb +0 -177
  307. data/spec/ruby-lint/callback.rb +0 -28
  308. data/spec/ruby-lint/constant_importer.rb +0 -27
  309. data/spec/ruby-lint/definition.rb +0 -96
  310. data/spec/ruby-lint/formatter/text.rb +0 -21
  311. data/spec/ruby-lint/parser/arrays.rb +0 -147
  312. data/spec/ruby-lint/parser/expander_assignments.rb +0 -183
  313. data/spec/ruby-lint/parser/hashes.rb +0 -136
  314. data/spec/ruby-lint/parser/keywords.rb +0 -89
  315. data/spec/ruby-lint/parser/objects.rb +0 -39
  316. data/spec/ruby-lint/parser/procs.rb +0 -113
  317. data/spec/ruby-lint/parser/ranges.rb +0 -49
  318. data/spec/ruby-lint/parser/regexp.rb +0 -31
  319. data/spec/ruby-lint/parser/scalars.rb +0 -93
  320. data/spec/ruby-lint/parser/statements.rb +0 -591
  321. data/spec/ruby-lint/parser/variables.rb +0 -230
@@ -0,0 +1,38 @@
1
+ require File.expand_path('../../helper', __FILE__)
2
+
3
+ describe RubyLint::Node do
4
+ should 'return the value for a scalar' do
5
+ s(:string, 'hello').value.should == 'hello'
6
+ end
7
+
8
+ should 'return the value for an Array' do
9
+ numbers = s(:array, s(:integer, '10'), s(:integer, '20')).value
10
+
11
+ numbers.is_a?(Array).should == true
12
+ numbers.length.should == 2
13
+
14
+ numbers[0].value.should == '10'
15
+ numbers[1].value.should == '20'
16
+ end
17
+
18
+ should 'return the value for a Hash' do
19
+ pairs = s(:hash, s(:key_value, 'number', s(:integer, '10'))).value
20
+
21
+ pairs.is_a?(Array).should == true
22
+
23
+ pairs[0].children[1].value.should == '10'
24
+ end
25
+
26
+ should 'return the arguments of a method' do
27
+ method = s(:method, 'puts', s(:arguments, s(:argument, s(:string, 'foo'))))
28
+
29
+ method.gather_arguments(:argument).length.should == 1
30
+
31
+ method.gather_arguments(:argument)[0].type.should == :string
32
+ method.gather_arguments(:argument)[0].value.should == 'foo'
33
+ end
34
+
35
+ should 'should try to guess the Ruby class of a node' do
36
+ s(:string, 'foo').ruby_class.should == 'String'
37
+ end
38
+ end
@@ -0,0 +1,225 @@
1
+ require File.expand_path('../../../helper', __FILE__)
2
+
3
+ describe 'Parsing variable assignments' do
4
+ should 'parse a local variable' do
5
+ parse('number = 10').should == s(
6
+ :assign,
7
+ s(:local_variable, 'number'),
8
+ s(:integer, '10')
9
+ )
10
+ end
11
+
12
+ should 'parse an instance variable' do
13
+ parse('@number = 10').should == s(
14
+ :assign,
15
+ s(:instance_variable, '@number'),
16
+ s(:integer, '10')
17
+ )
18
+ end
19
+
20
+ should 'parse a class variable' do
21
+ parse('@@number = 10').should == s(
22
+ :assign,
23
+ s(:class_variable, '@@number'),
24
+ s(:integer, '10')
25
+ )
26
+ end
27
+
28
+ should 'parse a global variable' do
29
+ parse('$number = 10').should == s(
30
+ :assign,
31
+ s(:global_variable, '$number'),
32
+ s(:integer, '10')
33
+ )
34
+ end
35
+
36
+ should 'parse a constant' do
37
+ parse('NUMBER = 10').should == s(
38
+ :assign,
39
+ s(:constant, 'NUMBER'),
40
+ s(:integer, '10')
41
+ )
42
+ end
43
+
44
+ should 'parse a variable if it does not already have a value' do
45
+ parse('number ||= 10').should == s(
46
+ :op_assign,
47
+ s(:local_variable, 'number'),
48
+ s(:integer, '10')
49
+ )
50
+ end
51
+
52
+ should 'parse assigning two values to two variables' do
53
+ parse('first, second = 10, 20').should == s(
54
+ :mass_assign,
55
+ s(:assign, s(:local_variable, 'first'), s(:integer, '10')),
56
+ s(:assign, s(:local_variable, 'second'), s(:integer, '20'))
57
+ )
58
+ end
59
+
60
+ should 'parse assigning one value to two variables' do
61
+ parse('first, second = 10').should == s(
62
+ :mass_assign,
63
+ s(:assign, s(:local_variable, 'first'), s(:integer, '10')),
64
+ s(:assign, s(:local_variable, 'second'), s(:keyword, 'nil'))
65
+ )
66
+ end
67
+
68
+ should 'parse assigning an array with two values to two variables' do
69
+ parse('first, second = [10, 20]').should == s(
70
+ :mass_assign,
71
+ s(:assign, s(:local_variable, 'first'), s(:integer, '10')),
72
+ s(:assign, s(:local_variable, 'second'), s(:integer, '20'))
73
+ )
74
+ end
75
+
76
+ should 'parse assigning an array with one value to two variables' do
77
+ parse('first, second = [10]').should == s(
78
+ :mass_assign,
79
+ s(:assign, s(:local_variable, 'first'), s(:integer, '10')),
80
+ s(:assign, s(:local_variable, 'second'), s(:keyword, 'nil'))
81
+ )
82
+ end
83
+
84
+ should 'parse assigning a value to a variable and expander token' do
85
+ parse('first, * = 10').should == s(
86
+ :mass_assign,
87
+ s(:assign, s(:local_variable, 'first'), s(:integer, '10'))
88
+ )
89
+ end
90
+
91
+ should 'parse assigning two values to a variable and expander token' do
92
+ parse('first, * = 10, 20').should == s(
93
+ :mass_assign,
94
+ s(:assign, s(:local_variable, 'first'), s(:integer, '10'))
95
+ )
96
+ end
97
+
98
+ should 'parse assigning three values to two variables and an expander token' do
99
+ parse('first, *, second = 10, 20, 30').should == s(
100
+ :mass_assign,
101
+ s(:assign, s(:local_variable, 'first'), s(:integer, '10')),
102
+ s(:assign, s(:local_variable, 'second'), s(:integer, '30'))
103
+ )
104
+ end
105
+
106
+ should 'parse assigning a single value to an expander variable' do
107
+ parse('*numbers = 10').should == s(
108
+ :mass_assign,
109
+ s(:assign, s(:local_variable, 'numbers'), s(:array, s(:integer, '10')))
110
+ )
111
+ end
112
+
113
+ should 'parse assigning two values to an expander variable' do
114
+ parse('*numbers = 10, 20').should == s(
115
+ :mass_assign,
116
+ s(
117
+ :assign,
118
+ s(:local_variable, 'numbers'),
119
+ s(:array, s(:integer, '10'), s(:integer, '20'))
120
+ )
121
+ )
122
+ end
123
+
124
+ should 'parse assigning a value to a local and expander variable' do
125
+ parse('number, *numbers = 10').should == s(
126
+ :mass_assign,
127
+ s(:assign, s(:local_variable, 'number'), s(:integer, '10')),
128
+ s(:assign, s(:local_variable, 'numbers'), s(:array))
129
+ )
130
+ end
131
+
132
+ should 'parse assigning one value to an expander and two local variables' do
133
+ parse('*numbers, number, numberx = 10').should == s(
134
+ :mass_assign,
135
+ s(:assign, s(:local_variable, 'numbers'), s(:array)),
136
+ s(:assign, s(:local_variable, 'number'), s(:integer, '10')),
137
+ s(:assign, s(:local_variable, 'numberx'), s(:keyword, 'nil'))
138
+ )
139
+
140
+ parse('number, *numbers, numberx = 10').should == s(
141
+ :mass_assign,
142
+ s(:assign, s(:local_variable, 'number'), s(:integer, '10')),
143
+ s(:assign, s(:local_variable, 'numbers'), s(:array)),
144
+ s(:assign, s(:local_variable, 'numberx'), s(:keyword, 'nil'))
145
+ )
146
+
147
+ parse('number, numberx, *numbers = 10').should == s(
148
+ :mass_assign,
149
+ s(:assign, s(:local_variable, 'number'), s(:integer, '10')),
150
+ s(:assign, s(:local_variable, 'numberx'), s(:keyword, 'nil')),
151
+ s(:assign, s(:local_variable, 'numbers'), s(:array))
152
+ )
153
+ end
154
+
155
+ should 'parse assigning two values to an expander and local variable' do
156
+ parse('*numbers, number = 10, 20').should == s(
157
+ :mass_assign,
158
+ s(:assign, s(:local_variable, 'numbers'), s(:array, s(:integer, '10'))),
159
+ s(:assign, s(:local_variable, 'number'), s(:integer, '20'))
160
+ )
161
+ end
162
+
163
+ should 'parse an uneven number of (expander) variables and values' do
164
+ parse('*numbers, number = 10, 20, 30').should == s(
165
+ :mass_assign,
166
+ s(
167
+ :assign,
168
+ s(:local_variable, 'numbers'),
169
+ s(:array, s(:integer, '10'), s(:integer, '20'))
170
+ ),
171
+ s(:assign, s(:local_variable, 'number'), s(:integer, '30'))
172
+ )
173
+
174
+ parse('*numbers, number = 10, 20, 30, 40').should == s(
175
+ :mass_assign,
176
+ s(
177
+ :assign,
178
+ s(:local_variable, 'numbers'),
179
+ s(:array, s(:integer, '10'), s(:integer, '20'), s(:integer, '30'))
180
+ ),
181
+ s(:assign, s(:local_variable, 'number'), s(:integer, '40'))
182
+ )
183
+
184
+ parse('number, *numbers = 10, 20, 30, 40').should == s(
185
+ :mass_assign,
186
+ s(:assign, s(:local_variable, 'number'), s(:integer, '10')),
187
+ s(
188
+ :assign,
189
+ s(:local_variable, 'numbers'),
190
+ s(:array, s(:integer, '20'), s(:integer, '30'), s(:integer, '40'))
191
+ )
192
+ )
193
+
194
+ parse('number, *numbers, numberx = 10, 20, 30, 40').should == s(
195
+ :mass_assign,
196
+ s(:assign, s(:local_variable, 'number'), s(:integer, '10')),
197
+ s(
198
+ :assign,
199
+ s(:local_variable, 'numbers'),
200
+ s(:array, s(:integer, '20'), s(:integer, '30'))
201
+ ),
202
+ s(:assign, s(:local_variable, 'numberx'), s(:integer, '40'))
203
+ )
204
+ end
205
+
206
+ should 'parse the assignment of a attribute in a constant path' do
207
+ parse('Foo::Bar.example = 10').should == s(
208
+ :assign,
209
+ s(
210
+ :field,
211
+ s(:constant_path, s(:constant, 'Foo'), s(:constant, 'Bar')),
212
+ s(:identifier, 'example')
213
+ ),
214
+ s(:integer, '10')
215
+ )
216
+ end
217
+
218
+ should 'parse the assignment of a constant path' do
219
+ parse('Foo::Bar = 10').should == s(
220
+ :assign,
221
+ s(:constant_path, s(:constant, 'Foo'), s(:constant, 'Bar')),
222
+ s(:integer, '10')
223
+ )
224
+ end
225
+ end
@@ -1,152 +1,110 @@
1
1
  require File.expand_path('../../../helper', __FILE__)
2
2
 
3
- describe 'RubyLint::Parser' do
4
- it 'Parse a class declaration' do
5
- token = RubyLint::Parser.new('class Foo; end').parse[0]
6
-
7
- token.class.should == RubyLint::Token::ClassToken
8
- token.name.should == ['Foo']
9
- token.type.should == :class
10
- token.line.should == 1
11
- token.column.should == 6
12
- token.code.should == 'class Foo; end'
13
-
14
- token.value.class.should == Array
15
- token.value.length.should == 0
3
+ describe 'Parsing class definitions' do
4
+ should 'parse an empty class' do
5
+ parse('class Example; end').should == s(
6
+ :class,
7
+ s(:constant, 'Example'),
8
+ nil,
9
+ s(:body, [])
10
+ )
16
11
  end
17
12
 
18
- it 'Parse a top level class declaration' do
19
- token = RubyLint::Parser.new('class ::Foo; end').parse[0]
20
-
21
- token.class.should == RubyLint::Token::ClassToken
22
- token.name.should == ['Foo']
23
- token.type.should == :class
13
+ should 'parse a class with a parent class' do
14
+ parse('class Example < Foo; end').should == s(
15
+ :class,
16
+ s(:constant, 'Example'),
17
+ s(:constant, 'Foo'),
18
+ s(:body, [])
19
+ )
24
20
  end
25
21
 
26
- it 'Parse a class declaration with a parent class' do
27
- token = RubyLint::Parser.new('class Foo < Bar; end').parse[0]
28
-
29
- token.class.should == RubyLint::Token::ClassToken
30
- token.name.should == ['Foo']
31
- token.parent.should == ['Bar']
32
- token.type.should == :class
33
- token.line.should == 1
34
- token.column.should == 6
35
- token.code.should == 'class Foo < Bar; end'
36
-
37
- token.value.class.should == Array
38
- token.value.length.should == 0
39
- end
40
-
41
- it 'Parse a class declaration with multiple name segments' do
42
- token = RubyLint::Parser.new('class Foo::Bar < A::B; end').parse[0]
43
-
44
- token.class.should == RubyLint::Token::ClassToken
45
- token.type.should == :class
46
- token.name.should == ['Foo', 'Bar']
22
+ should 'parse a class with a method' do
23
+ code = <<-CODE
24
+ class Example < Foo
25
+ def example_method
47
26
 
48
- token.parent.should == ['A', 'B']
49
- token.line.should == 1
50
- token.column.should == 6
51
- token.code.should == 'class Foo::Bar < A::B; end'
52
27
  end
28
+ end
29
+ CODE
53
30
 
54
- it 'Parse a top level class declaration with multiple name segments' do
55
- token = RubyLint::Parser.new('class ::Foo::Bar; end').parse[0]
56
-
57
- token.class.should == RubyLint::Token::ClassToken
58
- token.type.should == :class
59
- token.name.should == ['Foo', 'Bar']
60
- token.line.should == 1
61
- token.column.should == 8
62
- token.code.should == 'class ::Foo::Bar; end'
31
+ parse(code).should == s(
32
+ :class,
33
+ s(:constant, 'Example'),
34
+ s(:constant, 'Foo'),
35
+ s(
36
+ :body,
37
+ [
38
+ s(
39
+ :method_definition,
40
+ 'example_method',
41
+ s(:arguments),
42
+ nil,
43
+ s(:body, [])
44
+ )
45
+ ]
46
+ )
47
+ )
63
48
  end
64
49
 
65
- it 'Parse the assignments of method visibilities' do
50
+ should 'parse a class nested in another class' do
66
51
  code = <<-CODE
67
52
  class First
68
- private
53
+ class Second
69
54
 
70
- def private_method
71
- return 'private method'
72
- end
73
- end
74
-
75
- def public_method
76
- return 'public method'
77
- end
78
-
79
- class Second
80
- protected
81
-
82
- def protected_method
83
- return 'protected method'
84
55
  end
85
56
  end
86
57
  CODE
87
58
 
88
- first, pub_method, second = RubyLint::Parser.new(code).parse
89
-
90
- first.class.should == RubyLint::Token::ClassToken
91
- first.name.should == ['First']
92
- first.line.should == 1
93
- first.column.should == 6
94
- first.code.should == 'class First'
95
-
96
- first.value[1].class.should == RubyLint::Token::MethodDefinitionToken
97
- first.value[1].name.should == 'private_method'
98
- first.value[1].visibility.should == :private
99
- first.value[1].line.should == 4
100
- first.value[1].column.should == 6
101
- first.value[1].code.should == ' def private_method'
102
-
103
- pub_method.class.should == RubyLint::Token::MethodDefinitionToken
104
- pub_method.name.should == 'public_method'
105
- pub_method.visibility.should == :public
59
+ parse(code).should == s(
60
+ :class,
61
+ s(:constant, 'First'),
62
+ nil,
63
+ s(:body, [s(:class, s(:constant, 'Second'), nil, s(:body, []))])
64
+ )
65
+ end
106
66
 
107
- second.class.should == RubyLint::Token::ClassToken
108
- second.name.should == ['Second']
67
+ should 'parse a class with the name as a constant path' do
68
+ parse('class A::B < D::E; end').should == s(
69
+ :class,
70
+ s(:constant_path, s(:constant, 'A'), s(:constant, 'B')),
71
+ s(:constant_path, s(:constant, 'D'), s(:constant, 'E')),
72
+ s(:body, [])
73
+ )
74
+ end
109
75
 
110
- second.value[1].class.should == RubyLint::Token::MethodDefinitionToken
111
- second.value[1].name.should == 'protected_method'
112
- second.value[1].visibility.should == :protected
76
+ should 'parse a class with a top level name' do
77
+ parse('class ::A; end').should == s(
78
+ :class,
79
+ s(:constant, 'A'),
80
+ nil,
81
+ s(:body, [])
82
+ )
113
83
  end
114
84
 
115
- it 'Parse the creation of methods using class << self' do
85
+ should 'parse `class << self` blocks' do
116
86
  code = <<-CODE
117
- class Person
87
+ class A
118
88
  class << self
119
- def class_method_1
120
-
121
- end
122
-
123
- def class_method_2
124
-
125
- end
89
+ puts
126
90
  end
127
91
  end
128
92
  CODE
129
93
 
130
- token = RubyLint::Parser.new(code).parse[0]
131
-
132
- token.class.should == RubyLint::Token::ClassToken
133
- token.name.should == ['Person']
134
-
135
- token.value.class.should == Array
136
- token.value.length.should == 2
137
-
138
- method_1, method_2 = token.value
139
-
140
- method_1.class.should == RubyLint::Token::MethodDefinitionToken
141
- method_1.name.should == 'class_method_1'
142
-
143
- method_1.receiver.class.should == RubyLint::Token::VariableToken
144
- method_1.receiver.name.should == 'self'
145
-
146
- method_2.class.should == RubyLint::Token::MethodDefinitionToken
147
- method_2.name.should == 'class_method_2'
148
-
149
- method_2.receiver.class.should == RubyLint::Token::VariableToken
150
- method_2.receiver.name.should == 'self'
94
+ parse(code).should == s(
95
+ :class,
96
+ s(:constant, 'A'),
97
+ nil,
98
+ s(
99
+ :body,
100
+ [
101
+ s(
102
+ :sclass,
103
+ s(:keyword, 'self'),
104
+ s(:body, [s(:method, 'puts', s(:arguments), nil, nil)])
105
+ )
106
+ ]
107
+ )
108
+ )
151
109
  end
152
110
  end