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
@@ -1,19 +1,12 @@
1
1
  require File.expand_path('../../../helper', __FILE__)
2
2
 
3
- describe 'RubyLint::Parser' do
4
- it 'Parse a syntax error' do
5
- code = <<-CODE
6
- def example
7
- -
8
- end
9
- CODE
10
-
11
- error = should.raise?(RubyLint::ParserError) do
12
- RubyLint::Parser.new(code).parse
13
- end
3
+ describe 'Parsing syntax errors' do
4
+ should 'parse a syntax error' do
5
+ error = should.raise?(RubyLint::ParserError) { parse('10 <> 20') }
14
6
 
15
- error.file.should == '(ruby-lint)'
16
- error.line.should == 3
17
- error.column.should == 3
7
+ error.message.should == "syntax error, unexpected '>'"
8
+ error.line.should == 1
9
+ error.column.should == 5
10
+ error.file.should == '(ruby-lint)'
18
11
  end
19
12
  end
@@ -0,0 +1,17 @@
1
+ require File.expand_path('../../../helper', __FILE__)
2
+
3
+ describe 'Setting metadata for AST nodes' do
4
+ code = <<-CODE
5
+ # Note that space, it is required to test the column number.
6
+ number
7
+ CODE
8
+
9
+ should 'set the correct line number' do
10
+ node = parse(code)
11
+
12
+ node.type.should == :method
13
+ node.line.should == 2
14
+ node.column.should == 1
15
+ node.file.should == '(ruby-lint)'
16
+ end
17
+ end
@@ -0,0 +1,111 @@
1
+ require File.expand_path('../../../helper', __FILE__)
2
+
3
+ describe 'Parsing method definitions' do
4
+ should 'parse a method without parameters' do
5
+ parse('def example_method; 10; end').should == s(
6
+ :method_definition,
7
+ 'example_method',
8
+ s(:arguments),
9
+ nil,
10
+ s(:body, [s(:integer, '10')])
11
+ )
12
+ end
13
+
14
+ should 'parse a method with one required parameter' do
15
+ parse('def example_method(name); name; end').should == s(
16
+ :method_definition,
17
+ 'example_method',
18
+ s(:arguments, s(:argument, s(:local_variable, 'name'))),
19
+ nil,
20
+ s(:body, [s(:local_variable, 'name')])
21
+ )
22
+ end
23
+
24
+ should 'parse a method with one required and optional parameter' do
25
+ parse('def example_method(name, number = 10); name; end').should == s(
26
+ :method_definition,
27
+ 'example_method',
28
+ s(
29
+ :arguments,
30
+ s(:argument, s(:local_variable, 'name')),
31
+ s(:optional_argument, s(:local_variable, 'number', s(:integer, '10')))
32
+ ),
33
+ nil,
34
+ s(:body, [s(:local_variable, 'name')])
35
+ )
36
+ end
37
+
38
+ should 'parse a method with one required and a rest parameter' do
39
+ code = <<-CODE
40
+ def example_method(name, *rest)
41
+ name
42
+ end
43
+ CODE
44
+
45
+ parse(code).should == s(
46
+ :method_definition,
47
+ 'example_method',
48
+ s(
49
+ :arguments,
50
+ s(:argument, s(:local_variable, 'name')),
51
+ s(:rest_argument, s(:local_variable, 'rest'))
52
+ ),
53
+ nil,
54
+ s(:body, [s(:local_variable, 'name')])
55
+ )
56
+ end
57
+
58
+ should 'parse a method with one required, optional and rest parameter' do
59
+ code = <<-CODE
60
+ def example_method(name, number = 10, *rest)
61
+ name
62
+ end
63
+ CODE
64
+
65
+ parse(code).should == s(
66
+ :method_definition,
67
+ 'example_method',
68
+ s(
69
+ :arguments,
70
+ s(:argument, s(:local_variable, 'name')),
71
+ s(:optional_argument, s(:local_variable, 'number', s(:integer, '10'))),
72
+ s(:rest_argument, s(:local_variable, 'rest'))
73
+ ),
74
+ nil,
75
+ s(:body, [s(:local_variable, 'name')])
76
+ )
77
+ end
78
+
79
+ should 'parse a method with all parameter types' do
80
+ code = <<-CODE
81
+ def example_method(name, number = 10, *rest, more, &block)
82
+ name
83
+ end
84
+ CODE
85
+
86
+ parse(code).should == s(
87
+ :method_definition,
88
+ 'example_method',
89
+ s(
90
+ :arguments,
91
+ s(:argument, s(:local_variable, 'name')),
92
+ s(:optional_argument, s(:local_variable, 'number', s(:integer, '10'))),
93
+ s(:rest_argument, s(:local_variable, 'rest')),
94
+ s(:more_argument, s(:local_variable, 'more')),
95
+ s(:block_argument, s(:local_variable, 'block'))
96
+ ),
97
+ nil,
98
+ s(:body, [s(:local_variable, 'name')])
99
+ )
100
+ end
101
+
102
+ should 'parse defining a class method on a receiver' do
103
+ parse('def String.example_method; end').should == s(
104
+ :method_definition,
105
+ 'example_method',
106
+ s(:arguments),
107
+ s(:constant, 'String'),
108
+ s(:body, [])
109
+ )
110
+ end
111
+ end
@@ -1,249 +1,217 @@
1
1
  require File.expand_path('../../../helper', __FILE__)
2
2
 
3
- describe 'RubyLint::Parser' do
4
- it 'Parse a method definition' do
5
- token = RubyLint::Parser.new('def number; return 10; end').parse[0]
6
-
7
- token.class.should == RubyLint::Token::MethodDefinitionToken
8
- token.line.should == 1
9
- token.column.should == 4
10
- token.name.should == 'number'
11
- token.visibility.should == :public
12
- token.type.should == :method_definition
13
-
14
- token.parameters.class.should == RubyLint::Token::ParametersToken
15
-
16
- token.value.class.should == Array
17
- token.value.length.should == 1
18
-
19
- token.value[0].class.should == RubyLint::Token::StatementToken
20
- token.value[0].type.should == :return
21
-
22
- token.value[0].value.class.should == Array
23
- token.value[0].value.length.should == 1
24
-
25
- value = token.value[0].value[0]
26
-
27
- value.class.should == RubyLint::Token::Token
28
- value.type.should == :integer
29
- value.value.should == '10'
3
+ describe 'Parsing method calls' do
4
+ should 'parse a method without parameters' do
5
+ parse('example').should == s(
6
+ :method,
7
+ 'example',
8
+ s(:arguments),
9
+ nil,
10
+ nil
11
+ )
30
12
  end
31
13
 
32
- it 'Parse a method definition with parameters' do
33
- code = <<-CODE
34
- def number(a, b = 10, *args, more, &block)
35
- return num
36
- end
37
- CODE
38
-
39
- token = RubyLint::Parser.new(code).parse[0]
40
-
41
- token.class.should == RubyLint::Token::MethodDefinitionToken
42
- token.name.should == 'number'
43
- token.line.should == 1
44
- token.column.should == 4
45
-
46
- params = token.parameters
47
-
48
- params.class.should == RubyLint::Token::ParametersToken
49
- params.value.class.should == Array
50
-
51
- # Required parameters
52
- params.value.length.should == 1
53
- params.value[0].class.should == RubyLint::Token::VariableToken
54
- params.value[0].name.should == 'a'
55
-
56
- # Optional parameters
57
- params.optional.class.should == Array
58
- params.optional.length.should == 1
59
-
60
- optional = params.optional[0]
61
-
62
- optional.class.should == RubyLint::Token::VariableToken
63
- optional.name.should == 'b'
64
-
65
- optional.value.class.should == RubyLint::Token::Token
66
- optional.value.type.should == :integer
67
- optional.value.value.should == '10'
68
-
69
- # Rest parameters
70
- params.rest.name.should == 'args'
71
- params.rest.class.should == RubyLint::Token::VariableToken
72
-
73
- # More parameters
74
- params.more.class.should == Array
75
- params.more.length.should == 1
76
- params.more[0].name.should == 'more'
77
-
78
- # Block parameters
79
- params.block.class.should == RubyLint::Token::VariableToken
80
- params.block.name.should == 'block'
14
+ should 'parse a method with two parameters' do
15
+ parse('example "foo", 10').should == s(
16
+ :method,
17
+ 'example',
18
+ s(
19
+ :arguments,
20
+ s(:argument, s(:string, 'foo')),
21
+ s(:argument, s(:integer, '10'))
22
+ ),
23
+ nil,
24
+ nil
25
+ )
81
26
  end
82
27
 
83
- it 'Parse a class method definition' do
84
- code = <<-CODE
85
- def self.example(number = 10)
86
- return number
87
- end
88
- CODE
89
-
90
- token = RubyLint::Parser.new(code).parse[0]
91
-
92
- token.class.should == RubyLint::Token::MethodDefinitionToken
93
- token.name.should == 'example'
94
-
95
- token.receiver.class.should == RubyLint::Token::VariableToken
96
- token.receiver.name.should == 'self'
97
- token.receiver.type.should == :keyword
98
-
99
- token.operator.class.should == RubyLint::Token::Token
100
- token.operator.value.should == '.'
101
- token.operator.type.should == :period
102
-
103
- token.parameters.class.should == RubyLint::Token::ParametersToken
104
- token.parameters.optional.class.should == Array
105
- token.parameters.optional.length.should == 1
28
+ should 'parse a method with parenthesis and two parameters' do
29
+ parse('example("foo", 10)').should == s(
30
+ :method,
31
+ 'example',
32
+ s(
33
+ :arguments,
34
+ s(:argument, s(:string, 'foo')),
35
+ s(:argument, s(:integer, '10'))
36
+ ),
37
+ nil,
38
+ nil
39
+ )
106
40
  end
107
41
 
108
- it 'Parse a private method definition' do
109
- code = <<-CODE
110
- private
111
-
112
- def example
113
- return 10
114
- end
115
- CODE
116
-
117
- token = RubyLint::Parser.new(code).parse[1]
118
-
119
- token.class.should == RubyLint::Token::MethodDefinitionToken
120
- token.name.should == 'example'
121
- token.visibility.should == :private
122
-
123
- token.value.class.should == Array
124
- token.value.length.should == 1
42
+ should 'parse a proc with a block without parameters' do
43
+ parse('proc { }').should == s(
44
+ :method,
45
+ 'proc',
46
+ s(:arguments),
47
+ s(:block, s(:arguments), s(:body, [])),
48
+ nil
49
+ )
125
50
  end
126
51
 
127
- it 'Parse a method call' do
128
- token = RubyLint::Parser.new('puts').parse[0]
129
-
130
- token.class.should == RubyLint::Token::MethodToken
131
- token.name.should == 'puts'
52
+ should 'parse a proc with a block using curly braces' do
53
+ parse('proc { |example| example }').should == s(
54
+ :method,
55
+ 'proc',
56
+ s(:arguments),
57
+ s(
58
+ :block,
59
+ s(:arguments, s(:argument, s(:local_variable, 'example'))),
60
+ s(:body, [s(:local_variable, 'example')])
61
+ ),
62
+ nil
63
+ )
132
64
  end
133
65
 
134
- it 'Parse a method call with parenthesis' do
135
- token = RubyLint::Parser.new('puts()').parse[0]
136
-
137
- token.class.should == RubyLint::Token::MethodToken
138
- token.name.should == 'puts'
66
+ should 'parse a proc with a block using do/end' do
67
+ parse('proc do |example|; example; end').should == s(
68
+ :method,
69
+ 'proc',
70
+ s(:arguments),
71
+ s(
72
+ :block,
73
+ s(:arguments, s(:argument, s(:local_variable, 'example'))),
74
+ s(:body, [s(:local_variable, 'example')])
75
+ ),
76
+ nil
77
+ )
139
78
  end
140
79
 
141
- it 'Parse a method call with parenthesis and parameters' do
142
- token = RubyLint::Parser.new('puts(10)').parse[0]
143
-
144
- token.class.should == RubyLint::Token::MethodToken
145
- token.name.should == 'puts'
146
-
147
- token.parameters.class.should == Array
148
- token.parameters.length.should == 1
149
-
150
- param = token.parameters[0]
151
-
152
- param.class.should == RubyLint::Token::Token
153
- param.type.should == :integer
154
- param.value.should == '10'
80
+ should 'parse a lambda with a block using curly braces' do
81
+ parse('lambda { |example| example }').should == s(
82
+ :method,
83
+ 'lambda',
84
+ s(:arguments),
85
+ s(
86
+ :block,
87
+ s(:arguments, s(:argument, s(:local_variable, 'example'))),
88
+ s(:body, [s(:local_variable, 'example')])
89
+ ),
90
+ nil
91
+ )
155
92
  end
156
93
 
157
- it 'Parse a method call with parameters but without parenthesis' do
158
- token = RubyLint::Parser.new('puts 10').parse[0]
159
-
160
- token.class.should == RubyLint::Token::MethodToken
161
- token.name.should == 'puts'
162
-
163
- token.parameters.class.should == Array
164
- token.parameters.length.should == 1
165
-
166
- param = token.parameters[0]
167
-
168
- param.class.should == RubyLint::Token::Token
169
- param.type.should == :integer
170
- param.value.should == '10'
94
+ should 'parse a method with a parameter and a block' do
95
+ parse('foo(10) { |name| name }').should == s(
96
+ :method,
97
+ 'foo',
98
+ s(:arguments, s(:argument, s(:integer, '10'))),
99
+ s(
100
+ :block,
101
+ s(:arguments, s(:argument, s(:local_variable, 'name'))),
102
+ s(:body, [s(:local_variable, 'name')])
103
+ ),
104
+ nil
105
+ )
171
106
  end
172
107
 
173
- it 'Parse a method called on an object with parenthesis' do
174
- token = RubyLint::Parser.new('Struct.new(:name)').parse[0]
175
-
176
- token.class.should == RubyLint::Token::MethodToken
177
- token.name.should == 'new'
178
-
179
- token.receiver.class.should == RubyLint::Token::VariableToken
180
- token.receiver.type.should == :constant
181
- token.receiver.name.should == 'Struct'
182
-
183
- token.parameters.class.should == Array
184
- token.parameters.length.should == 1
185
-
186
- token.parameters[0].class.should == RubyLint::Token::Token
187
- token.parameters[0].type.should == :symbol
188
- token.parameters[0].value.should == 'name'
108
+ should 'parse a bang! method' do
109
+ parse('foo!').should == s(:method, 'foo!', s(:arguments), nil, nil)
189
110
  end
190
111
 
191
- it 'Parse a method called on an object without parenthesis' do
192
- token = RubyLint::Parser.new('Struct.new :name').parse[0]
193
-
194
- token.class.should == RubyLint::Token::MethodToken
195
- token.name.should == 'new'
196
-
197
- token.receiver.class.should == RubyLint::Token::VariableToken
198
- token.receiver.type.should == :constant
199
- token.receiver.name.should == 'Struct'
200
-
201
- token.parameters.class.should == Array
202
- token.parameters.length.should == 1
203
-
204
- token.parameters[0].class.should == RubyLint::Token::Token
205
- token.parameters[0].type.should == :symbol
206
- token.parameters[0].value.should == 'name'
112
+ should 'parse a predicate method' do
113
+ parse('foo?').should == s(:method, 'foo?', s(:arguments), nil, nil)
207
114
  end
208
115
 
209
- it 'Parse a method called on an object with a block passed' do
210
- token = RubyLint::Parser.new('Foo.bar { |example| example }').parse[0]
211
-
212
- token.class.should == RubyLint::Token::MethodToken
213
- token.name.should == 'bar'
214
-
215
- token.receiver.class.should == RubyLint::Token::VariableToken
216
- token.receiver.type.should == :constant
217
- token.receiver.name.should == 'Foo'
218
-
219
- token.block.class.should == RubyLint::Token::BlockToken
220
- token.block.parameters.class.should == RubyLint::Token::ParametersToken
221
-
222
- token.block.parameters.value.class.should == Array
223
- token.block.parameters.value.length.should == 1
116
+ should 'parse a method call on an object' do
117
+ parse('String.new').should == s(
118
+ :method,
119
+ 'new',
120
+ s(:arguments),
121
+ nil,
122
+ s(:constant, 'String')
123
+ )
224
124
  end
225
125
 
226
- it 'Parse a method call with a bare Hash as a parameter' do
227
- token = RubyLint::Parser.new('language(:name => "Ruby")').parse[0]
228
-
229
- token.class.should == RubyLint::Token::MethodToken
126
+ should 'parse a method call on an object with a parameter' do
127
+ parse('String.new(10)').should == s(
128
+ :method,
129
+ 'new',
130
+ s(:arguments, s(:argument, s(:integer, '10'))),
131
+ nil,
132
+ s(:constant, 'String')
133
+ )
134
+ end
230
135
 
231
- token.parameters.class.should == Array
232
- token.parameters.length.should == 1
136
+ should 'parse a method call on an object without parenthesis' do
137
+ parse('String.new 10').should == s(
138
+ :method,
139
+ 'new',
140
+ s(:arguments, s(:argument, s(:integer, '10'))),
141
+ nil,
142
+ s(:constant, 'String')
143
+ )
144
+ end
233
145
 
234
- token.parameters[0].class.should == RubyLint::Token::Token
235
- token.parameters[0].type.should == :hash
146
+ should 'parse a method call on an object with a parameter and a block' do
147
+ parse('String.new(10) { |name| name }').should == s(
148
+ :method,
149
+ 'new',
150
+ s(:arguments, s(:argument, s(:integer, '10'))),
151
+ s(
152
+ :block,
153
+ s(:arguments, s(:argument, s(:local_variable, 'name'))),
154
+ s(:body, [s(:local_variable, 'name')])
155
+ ),
156
+ s(:constant, 'String')
157
+ )
236
158
  end
237
159
 
238
- it 'Parse a method call with a bare JSON style Hash as a parameter' do
239
- token = RubyLint::Parser.new('language(name: "Ruby")').parse[0]
160
+ should 'parse a method call with a Hash as the parameter' do
161
+ parse('foo(:name => "Ruby")').should == s(
162
+ :method,
163
+ 'foo',
164
+ s(
165
+ :arguments,
166
+ s(
167
+ :argument,
168
+ s(:hash, s(:key_value, s(:symbol, 'name'), s(:string, 'Ruby')))
169
+ )
170
+ ),
171
+ nil,
172
+ nil
173
+ )
174
+ end
240
175
 
241
- token.class.should == RubyLint::Token::MethodToken
176
+ should 'parse a method call with a block parameter' do
177
+ parse('foo(&bar)').should == s(
178
+ :method,
179
+ 'foo',
180
+ s(
181
+ :arguments,
182
+ s(:block_argument, s(:method, 'bar', s(:arguments), nil, nil))
183
+ ),
184
+ nil,
185
+ nil
186
+ )
187
+ end
242
188
 
243
- token.parameters.class.should == Array
244
- token.parameters.length.should == 1
189
+ should 'parse a method call with a splat argument' do
190
+ parse('foo(example, *numbers)').should == s(
191
+ :method,
192
+ 'foo',
193
+ s(
194
+ :arguments,
195
+ s(:argument, s(:method, 'example', s(:arguments), nil, nil)),
196
+ s(:splat_argument, s(:method, 'numbers', s(:arguments), nil, nil))
197
+ ),
198
+ nil,
199
+ nil
200
+ )
201
+ end
245
202
 
246
- token.parameters[0].class.should == RubyLint::Token::Token
247
- token.parameters[0].type.should == :hash
203
+ should 'parse a method call with multiple splat arguments' do
204
+ parse('foo(*a, b, *c)').should == s(
205
+ :method,
206
+ 'foo',
207
+ s(
208
+ :arguments,
209
+ s(:splat_argument, s(:method, 'a', s(:arguments), nil, nil)),
210
+ s(:argument, s(:method, 'b', s(:arguments), nil, nil)),
211
+ s(:splat_argument, s(:method, 'c', s(:arguments), nil, nil)),
212
+ ),
213
+ nil,
214
+ nil
215
+ )
248
216
  end
249
217
  end