ruby-lint 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (317) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.asc +17 -0
  3. data.tar.gz.asc +14 -14
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +0 -1
  6. data/.yardopts +1 -0
  7. data/CONTRIBUTING.md +41 -0
  8. data/MANIFEST +99 -66
  9. data/README.md +36 -10
  10. data/Rakefile +6 -0
  11. data/checksum/ruby-lint-0.0.4.gem.sha512 +1 -0
  12. data/doc/changelog.md +94 -0
  13. data/lib/ruby-lint.rb +18 -1
  14. data/lib/ruby-lint/analysis/argument_amount.rb +43 -10
  15. data/lib/ruby-lint/analysis/base.rb +23 -17
  16. data/lib/ruby-lint/analysis/pedantics.rb +3 -1
  17. data/lib/ruby-lint/analysis/undefined_methods.rb +48 -10
  18. data/lib/ruby-lint/analysis/unused_variables.rb +27 -5
  19. data/lib/ruby-lint/ast/node.rb +10 -0
  20. data/lib/ruby-lint/cli/analyze.rb +22 -4
  21. data/lib/ruby-lint/cli/base.rb +8 -2
  22. data/lib/ruby-lint/configuration.rb +43 -4
  23. data/lib/ruby-lint/definition/constant_proxy.rb +10 -1
  24. data/lib/ruby-lint/definition/ruby_method.rb +45 -31
  25. data/lib/ruby-lint/definition/ruby_object.rb +56 -15
  26. data/lib/ruby-lint/definition_builder/base.rb +4 -0
  27. data/lib/ruby-lint/definition_builder/primitive.rb +1 -1
  28. data/lib/ruby-lint/definition_builder/ruby_array.rb +1 -1
  29. data/lib/ruby-lint/definition_builder/ruby_block.rb +1 -0
  30. data/lib/ruby-lint/definition_builder/ruby_class.rb +1 -1
  31. data/lib/ruby-lint/definition_builder/ruby_hash.rb +1 -1
  32. data/lib/ruby-lint/definition_builder/ruby_module.rb +3 -1
  33. data/lib/ruby-lint/definition_generator.rb +15 -7
  34. data/lib/ruby-lint/definitions/core/arg0.rb +1 -1
  35. data/lib/ruby-lint/definitions/core/argf.rb +1 -1
  36. data/lib/ruby-lint/definitions/core/argument_error.rb +2 -2
  37. data/lib/ruby-lint/definitions/core/argv.rb +1 -1
  38. data/lib/ruby-lint/definitions/core/array.rb +6 -6
  39. data/lib/ruby-lint/definitions/core/autoload.rb +2 -2
  40. data/lib/ruby-lint/definitions/core/basic_object.rb +8 -12
  41. data/lib/ruby-lint/definitions/core/bignum.rb +2 -2
  42. data/lib/ruby-lint/definitions/core/binding.rb +2 -2
  43. data/lib/ruby-lint/definitions/core/class.rb +2 -2
  44. data/lib/ruby-lint/definitions/core/comparable.rb +1 -1
  45. data/lib/ruby-lint/definitions/core/complex.rb +4 -4
  46. data/lib/ruby-lint/definitions/core/condition_variable.rb +2 -2
  47. data/lib/ruby-lint/definitions/core/continuation.rb +2 -2
  48. data/lib/ruby-lint/definitions/core/data.rb +2 -2
  49. data/lib/ruby-lint/definitions/core/date.rb +34 -34
  50. data/lib/ruby-lint/definitions/core/date_time.rb +26 -26
  51. data/lib/ruby-lint/definitions/core/default_record_separator.rb +1 -1
  52. data/lib/ruby-lint/definitions/core/digest.rb +14 -14
  53. data/lib/ruby-lint/definitions/core/dir.rb +34 -34
  54. data/lib/ruby-lint/definitions/core/encoding.rb +237 -237
  55. data/lib/ruby-lint/definitions/core/encoding_error.rb +2 -2
  56. data/lib/ruby-lint/definitions/core/enumerable.rb +15 -15
  57. data/lib/ruby-lint/definitions/core/enumerator.rb +2 -2
  58. data/lib/ruby-lint/definitions/core/env.rb +1 -1
  59. data/lib/ruby-lint/definitions/core/eoferror.rb +2 -2
  60. data/lib/ruby-lint/definitions/core/erb.rb +30 -23
  61. data/lib/ruby-lint/definitions/core/errno.rb +525 -525
  62. data/lib/ruby-lint/definitions/core/etc.rb +6 -6
  63. data/lib/ruby-lint/definitions/core/exception.rb +2 -2
  64. data/lib/ruby-lint/definitions/core/false.rb +1 -1
  65. data/lib/ruby-lint/definitions/core/false_class.rb +2 -2
  66. data/lib/ruby-lint/definitions/core/fatal_error.rb +2 -2
  67. data/lib/ruby-lint/definitions/core/fiber.rb +2 -2
  68. data/lib/ruby-lint/definitions/core/fiber_error.rb +2 -2
  69. data/lib/ruby-lint/definitions/core/file.rb +68 -68
  70. data/lib/ruby-lint/definitions/core/file_list.rb +2 -2
  71. data/lib/ruby-lint/definitions/core/file_test.rb +1 -1
  72. data/lib/ruby-lint/definitions/core/file_utils.rb +16 -16
  73. data/lib/ruby-lint/definitions/core/fixnum.rb +4 -4
  74. data/lib/ruby-lint/definitions/core/float.rb +16 -16
  75. data/lib/ruby-lint/definitions/core/float_domain_error.rb +2 -2
  76. data/lib/ruby-lint/definitions/core/gc.rb +2 -2
  77. data/lib/ruby-lint/definitions/core/gem.rb +119 -119
  78. data/lib/ruby-lint/definitions/core/hash.rb +14 -14
  79. data/lib/ruby-lint/definitions/core/immediate_value.rb +1 -1
  80. data/lib/ruby-lint/definitions/core/index_error.rb +2 -2
  81. data/lib/ruby-lint/definitions/core/integer.rb +2 -2
  82. data/lib/ruby-lint/definitions/core/interrupt.rb +2 -2
  83. data/lib/ruby-lint/definitions/core/io.rb +38 -38
  84. data/lib/ruby-lint/definitions/core/ioerror.rb +2 -2
  85. data/lib/ruby-lint/definitions/core/kernel.rb +113 -60
  86. data/lib/ruby-lint/definitions/core/key_error.rb +2 -2
  87. data/lib/ruby-lint/definitions/core/load_error.rb +6 -6
  88. data/lib/ruby-lint/definitions/core/local_jump_error.rb +2 -2
  89. data/lib/ruby-lint/definitions/core/marshal.rb +35 -35
  90. data/lib/ruby-lint/definitions/core/match_data.rb +2 -2
  91. data/lib/ruby-lint/definitions/core/math.rb +7 -7
  92. data/lib/ruby-lint/definitions/core/memory_segmention_error.rb +2 -2
  93. data/lib/ruby-lint/definitions/core/method.rb +2 -2
  94. data/lib/ruby-lint/definitions/core/module.rb +39 -3
  95. data/lib/ruby-lint/definitions/core/monitor.rb +4 -4
  96. data/lib/ruby-lint/definitions/core/monitor_mixin.rb +5 -5
  97. data/lib/ruby-lint/definitions/core/mutex.rb +2 -2
  98. data/lib/ruby-lint/definitions/core/name_error.rb +2 -2
  99. data/lib/ruby-lint/definitions/core/nil.rb +1 -1
  100. data/lib/ruby-lint/definitions/core/nil_class.rb +2 -2
  101. data/lib/ruby-lint/definitions/core/no_memory_error.rb +2 -2
  102. data/lib/ruby-lint/definitions/core/no_method_error.rb +2 -2
  103. data/lib/ruby-lint/definitions/core/not_implemented_error.rb +2 -2
  104. data/lib/ruby-lint/definitions/core/numeric.rb +2 -2
  105. data/lib/ruby-lint/definitions/core/object.rb +2 -2
  106. data/lib/ruby-lint/definitions/core/object_space.rb +1 -1
  107. data/lib/ruby-lint/definitions/core/open_struct.rb +3 -3
  108. data/lib/ruby-lint/definitions/core/option_parser.rb +83 -83
  109. data/lib/ruby-lint/definitions/core/precision.rb +1 -1
  110. data/lib/ruby-lint/definitions/core/primitive_failure.rb +2 -2
  111. data/lib/ruby-lint/definitions/core/proc.rb +2 -2
  112. data/lib/ruby-lint/definitions/core/process.rb +29 -29
  113. data/lib/ruby-lint/definitions/core/queue.rb +2 -2
  114. data/lib/ruby-lint/definitions/core/rake.rb +117 -117
  115. data/lib/ruby-lint/definitions/core/rake_file_utils.rb +1 -1
  116. data/lib/ruby-lint/definitions/core/rakeversion.rb +1 -1
  117. data/lib/ruby-lint/definitions/core/random.rb +2 -2
  118. data/lib/ruby-lint/definitions/core/range.rb +4 -4
  119. data/lib/ruby-lint/definitions/core/range_error.rb +2 -2
  120. data/lib/ruby-lint/definitions/core/rational.rb +2 -2
  121. data/lib/ruby-lint/definitions/core/rb_config.rb +3 -3
  122. data/lib/ruby-lint/definitions/core/regexp.rb +28 -28
  123. data/lib/ruby-lint/definitions/core/regexp_error.rb +2 -2
  124. data/lib/ruby-lint/definitions/core/ruby_copyright.rb +1 -1
  125. data/lib/ruby-lint/definitions/core/ruby_description.rb +1 -1
  126. data/lib/ruby-lint/definitions/core/ruby_engine.rb +1 -1
  127. data/lib/ruby-lint/definitions/core/ruby_patchlevel.rb +1 -1
  128. data/lib/ruby-lint/definitions/core/ruby_platform.rb +1 -1
  129. data/lib/ruby-lint/definitions/core/ruby_release_date.rb +1 -1
  130. data/lib/ruby-lint/definitions/core/ruby_version.rb +1 -1
  131. data/lib/ruby-lint/definitions/core/runtime_error.rb +2 -2
  132. data/lib/ruby-lint/definitions/core/scan_error.rb +2 -2
  133. data/lib/ruby-lint/definitions/core/script_error.rb +2 -2
  134. data/lib/ruby-lint/definitions/core/security_error.rb +2 -2
  135. data/lib/ruby-lint/definitions/core/shellwords.rb +1 -1
  136. data/lib/ruby-lint/definitions/core/signal.rb +3 -3
  137. data/lib/ruby-lint/definitions/core/signal_exception.rb +2 -2
  138. data/lib/ruby-lint/definitions/core/singleton.rb +2 -2
  139. data/lib/ruby-lint/definitions/core/sized_queue.rb +2 -2
  140. data/lib/ruby-lint/definitions/core/standard_error.rb +2 -2
  141. data/lib/ruby-lint/definitions/core/stderr.rb +3 -2
  142. data/lib/ruby-lint/definitions/core/stdin.rb +3 -2
  143. data/lib/ruby-lint/definitions/core/stdout.rb +3 -2
  144. data/lib/ruby-lint/definitions/core/stop_iteration.rb +2 -2
  145. data/lib/ruby-lint/definitions/core/string.rb +21 -21
  146. data/lib/ruby-lint/definitions/core/string_io.rb +7 -7
  147. data/lib/ruby-lint/definitions/core/string_scanner.rb +4 -4
  148. data/lib/ruby-lint/definitions/core/struct.rb +20 -20
  149. data/lib/ruby-lint/definitions/core/syck.rb +4 -4
  150. data/lib/ruby-lint/definitions/core/symbol.rb +2 -2
  151. data/lib/ruby-lint/definitions/core/syntax_error.rb +2 -2
  152. data/lib/ruby-lint/definitions/core/system_call_error.rb +2 -2
  153. data/lib/ruby-lint/definitions/core/system_exit.rb +2 -2
  154. data/lib/ruby-lint/definitions/core/system_stack_error.rb +2 -2
  155. data/lib/ruby-lint/definitions/core/thread.rb +6 -6
  156. data/lib/ruby-lint/definitions/core/thread_error.rb +2 -2
  157. data/lib/ruby-lint/definitions/core/thread_group.rb +2 -2
  158. data/lib/ruby-lint/definitions/core/time.rb +3 -3
  159. data/lib/ruby-lint/definitions/core/toplevel_binding.rb +1 -1
  160. data/lib/ruby-lint/definitions/core/true.rb +1 -1
  161. data/lib/ruby-lint/definitions/core/true_class.rb +2 -2
  162. data/lib/ruby-lint/definitions/core/type_error.rb +2 -2
  163. data/lib/ruby-lint/definitions/core/unbound_method.rb +2 -2
  164. data/lib/ruby-lint/definitions/core/unmarshalable.rb +1 -1
  165. data/lib/ruby-lint/definitions/core/unsupported_library_error.rb +2 -2
  166. data/lib/ruby-lint/definitions/core/weak_ref.rb +4 -4
  167. data/lib/ruby-lint/definitions/core/yaml.rb +2361 -0
  168. data/lib/ruby-lint/definitions/core/zero_division_error.rb +2 -2
  169. data/lib/ruby-lint/definitions/global_variables.rb +9 -0
  170. data/lib/ruby-lint/definitions/rails/abstract_controller.rb +174 -28
  171. data/lib/ruby-lint/definitions/rails/action_controller.rb +4959 -550
  172. data/lib/ruby-lint/definitions/rails/action_dispatch.rb +2489 -292
  173. data/lib/ruby-lint/definitions/rails/action_mailer.rb +1285 -42
  174. data/lib/ruby-lint/definitions/rails/action_pack.rb +14 -6
  175. data/lib/ruby-lint/definitions/rails/action_view.rb +6941 -445
  176. data/lib/ruby-lint/definitions/rails/active_model.rb +1212 -69
  177. data/lib/ruby-lint/definitions/rails/active_record.rb +10344 -1450
  178. data/lib/ruby-lint/definitions/rails/active_support.rb +4631 -573
  179. data/lib/ruby-lint/definitions/rails/arel.rb +3211 -319
  180. data/lib/ruby-lint/definitions/rails/rails.rb +2922 -84
  181. data/lib/ruby-lint/definitions/rails/sprockets.rb +3048 -277
  182. data/lib/ruby-lint/docstring/mapping.rb +55 -0
  183. data/lib/ruby-lint/docstring/param_tag.rb +29 -0
  184. data/lib/ruby-lint/docstring/parser.rb +133 -0
  185. data/lib/ruby-lint/docstring/return_tag.rb +24 -0
  186. data/lib/ruby-lint/file_loader.rb +96 -0
  187. data/lib/ruby-lint/file_scanner.rb +91 -0
  188. data/lib/ruby-lint/global_scope.rb +56 -0
  189. data/lib/ruby-lint/helper/constant_paths.rb +1 -1
  190. data/lib/ruby-lint/inspector.rb +11 -33
  191. data/lib/ruby-lint/iterator.rb +31 -4
  192. data/lib/ruby-lint/method_call/alias.rb +46 -0
  193. data/lib/ruby-lint/method_call/assign_member.rb +55 -0
  194. data/lib/ruby-lint/method_call/attribute.rb +102 -0
  195. data/lib/ruby-lint/method_call/base.rb +37 -0
  196. data/lib/ruby-lint/method_call/define_method.rb +17 -0
  197. data/lib/ruby-lint/method_call/include.rb +39 -0
  198. data/lib/ruby-lint/parser.rb +9 -4
  199. data/lib/ruby-lint/presenter/text.rb +2 -1
  200. data/lib/ruby-lint/report.rb +19 -42
  201. data/lib/ruby-lint/report/entry.rb +20 -17
  202. data/lib/ruby-lint/runner.rb +92 -11
  203. data/lib/ruby-lint/template/definition.erb +2 -2
  204. data/lib/ruby-lint/variable_predicates.rb +7 -10
  205. data/lib/ruby-lint/version.rb +1 -1
  206. data/lib/ruby-lint/virtual_machine.rb +265 -188
  207. data/ruby-lint.gemspec +4 -4
  208. data/ruby-lint.yml +7 -0
  209. data/spec/fixtures/associating.rb +7 -0
  210. data/spec/fixtures/file_scanner/lib/example/recursive/source.rb +6 -0
  211. data/spec/fixtures/file_scanner/lib/example/recursive/target.rb +8 -0
  212. data/spec/fixtures/file_scanner/lib/example/user.rb +6 -0
  213. data/spec/fixtures/file_scanner/lib/test-dashes/foo.rb +4 -0
  214. data/spec/fixtures/file_scanner/rails/app/models/example/user.rb +6 -0
  215. data/spec/fixtures/file_scanner/rails/app/models/user.rb +4 -0
  216. data/spec/fixtures/uses_external.rb +1 -0
  217. data/spec/fixtures/uses_external_invalid.rb +3 -0
  218. data/spec/fixtures/uses_external_namespace.rb +1 -0
  219. data/spec/ruby-lint/analysis/{argument_amount.rb → argument_amount_spec.rb} +33 -7
  220. data/spec/ruby-lint/analysis/base_spec.rb +12 -0
  221. data/spec/ruby-lint/analysis/{pedantics.rb → pedantics_spec.rb} +24 -4
  222. data/spec/ruby-lint/analysis/{shadowing_variables.rb → shadowing_variables_spec.rb} +6 -6
  223. data/spec/ruby-lint/analysis/undefined_methods_spec.rb +320 -0
  224. data/spec/ruby-lint/analysis/{undefined_variables.rb → undefined_variables_spec.rb} +33 -10
  225. data/spec/ruby-lint/analysis/{unused_variables.rb → unused_variables_spec.rb} +36 -9
  226. data/spec/ruby-lint/ast/{node.rb → node_spec.rb} +12 -6
  227. data/spec/ruby-lint/cli/{analyze.rb → analyze_spec.rb} +16 -5
  228. data/spec/ruby-lint/cli/{ast.rb → ast_spec.rb} +3 -3
  229. data/spec/ruby-lint/configuration_spec.rb +106 -0
  230. data/spec/ruby-lint/definition/constant_proxy_spec.rb +54 -0
  231. data/spec/ruby-lint/definition/{dsl.rb → dsl_spec.rb} +15 -15
  232. data/spec/ruby-lint/definition/{ruby_method.rb → ruby_method_spec.rb} +31 -17
  233. data/spec/ruby-lint/definition/{ruby_object.rb → ruby_object_spec.rb} +28 -23
  234. data/spec/ruby-lint/definition_builder/{primitive.rb → primitive_spec.rb} +9 -9
  235. data/spec/ruby-lint/definition_builder/{ruby_class.rb → ruby_class_spec.rb} +13 -13
  236. data/spec/ruby-lint/definition_builder/{ruby_method.rb → ruby_method_spec.rb} +9 -9
  237. data/spec/ruby-lint/definition_builder/{ruby_module.rb → ruby_module_spec.rb} +12 -10
  238. data/spec/ruby-lint/docstring/mapping.rb +27 -0
  239. data/spec/ruby-lint/docstring/parser_spec.rb +88 -0
  240. data/spec/ruby-lint/extensions/{string.rb → string_spec.rb} +3 -3
  241. data/spec/ruby-lint/file_loader_spec.rb +69 -0
  242. data/spec/ruby-lint/file_scanner_spec.rb +51 -0
  243. data/spec/ruby-lint/inspector_spec.rb +44 -0
  244. data/spec/ruby-lint/{iterator.rb → iterator_spec.rb} +39 -4
  245. data/spec/ruby-lint/{nested_stack.rb → nested_stack_spec.rb} +4 -4
  246. data/spec/ruby-lint/parser_spec.rb +31 -0
  247. data/spec/ruby-lint/presenter/json_spec.rb +58 -0
  248. data/spec/ruby-lint/presenter/text_spec.rb +49 -0
  249. data/spec/ruby-lint/report/entry_spec.rb +58 -0
  250. data/spec/ruby-lint/report_spec.rb +39 -0
  251. data/spec/ruby-lint/runner_spec.rb +52 -0
  252. data/spec/ruby-lint/virtual_machine/alias_spec.rb +55 -0
  253. data/spec/ruby-lint/virtual_machine/assignments/{arrays.rb → arrays_spec.rb} +7 -7
  254. data/spec/ruby-lint/virtual_machine/assignments/{hashes.rb → hashes_spec.rb} +6 -6
  255. data/spec/ruby-lint/virtual_machine/assignments/{optional.rb → optional_spec.rb} +6 -6
  256. data/spec/ruby-lint/virtual_machine/assignments/{return_values.rb → return_values_spec.rb} +11 -11
  257. data/spec/ruby-lint/virtual_machine/assignments/{variables.rb → variables_spec.rb} +38 -7
  258. data/spec/ruby-lint/virtual_machine/associate_nodes_spec.rb +59 -0
  259. data/spec/ruby-lint/virtual_machine/{autoloading.rb → autoloading_spec.rb} +6 -6
  260. data/spec/ruby-lint/virtual_machine/{blocks.rb → blocks_spec.rb} +30 -4
  261. data/spec/ruby-lint/virtual_machine/classes/{class_methods.rb → class_methods_spec.rb} +3 -3
  262. data/spec/ruby-lint/virtual_machine/classes/{extending.rb → extending_spec.rb} +20 -15
  263. data/spec/ruby-lint/virtual_machine/classes/{redefining.rb → redefining_spec.rb} +3 -3
  264. data/spec/ruby-lint/virtual_machine/classes/{sclass.rb → sclass_spec.rb} +7 -7
  265. data/spec/ruby-lint/virtual_machine/classes/{scoping.rb → scoping_spec.rb} +5 -5
  266. data/spec/ruby-lint/virtual_machine/complex/{rails.rb → rails_spec.rb} +3 -3
  267. data/spec/ruby-lint/virtual_machine/complex/{rcap.rb → rcap_spec.rb} +3 -3
  268. data/spec/ruby-lint/virtual_machine/complex/{slop.rb → slop_spec.rb} +3 -3
  269. data/spec/ruby-lint/virtual_machine/constants_spec.rb +31 -0
  270. data/spec/ruby-lint/virtual_machine/{for.rb → for_spec.rb} +3 -3
  271. data/spec/ruby-lint/virtual_machine/{freeze.rb → freeze_spec.rb} +3 -3
  272. data/spec/ruby-lint/virtual_machine/global_variables_spec.rb +12 -0
  273. data/spec/ruby-lint/virtual_machine/inherit_kernel_spec.rb +15 -0
  274. data/spec/ruby-lint/virtual_machine/{interpolation.rb → interpolation_spec.rb} +3 -3
  275. data/spec/ruby-lint/virtual_machine/methods/attr_spec.rb +116 -0
  276. data/spec/ruby-lint/virtual_machine/methods/define_method_spec.rb +41 -0
  277. data/spec/ruby-lint/virtual_machine/methods/{defining.rb → defining_spec.rb} +4 -4
  278. data/spec/ruby-lint/virtual_machine/methods/docstrings_spec.rb +69 -0
  279. data/spec/ruby-lint/virtual_machine/methods/{exporting.rb → exporting_spec.rb} +3 -3
  280. data/spec/ruby-lint/virtual_machine/methods/{parameters.rb → parameters_spec.rb} +17 -5
  281. data/spec/ruby-lint/virtual_machine/methods/{patching.rb → patching_spec.rb} +4 -4
  282. data/spec/ruby-lint/virtual_machine/methods/{scoping.rb → scoping_spec.rb} +5 -5
  283. data/spec/ruby-lint/virtual_machine/methods/{visibility.rb → visibility_spec.rb} +6 -6
  284. data/spec/ruby-lint/virtual_machine/{modules.rb → modules_spec.rb} +39 -9
  285. data/spec/ruby-lint/virtual_machine/reference_amount_spec.rb +61 -0
  286. data/spec/ruby-lint/virtual_machine/{unused.rb → unused_spec.rb} +4 -4
  287. data/spec/{helper.rb → spec_helper.rb} +6 -4
  288. data/spec/support/building.rb +10 -6
  289. data/spec/support/coveralls.rb +1 -1
  290. data/spec/support/parsing.rb +10 -1
  291. data/spec/support/simplecov.rb +1 -1
  292. data/spec/support/versions.rb +9 -0
  293. data/task/test.rake +2 -4
  294. data/task/travis.rake +1 -0
  295. metadata +144 -143
  296. metadata.gz.asc +14 -14
  297. data/.rubocop.yml +0 -59
  298. data/doc/contributing.md +0 -16
  299. data/lib/ruby-lint/analysis/confusing_variables.rb +0 -26
  300. data/lib/ruby-lint/definitions/core/main.rb +0 -25
  301. data/lib/ruby-lint/definitions/core/psych.rb +0 -2231
  302. data/lib/ruby-lint/definitions/core/rubinius.rb +0 -16637
  303. data/lib/ruby-lint/definitions/core/ruby_lint.rb +0 -93
  304. data/spec/ruby-lint/analysis/confusing_variables.rb +0 -46
  305. data/spec/ruby-lint/analysis/undefined_methods.rb +0 -174
  306. data/spec/ruby-lint/configuration.rb +0 -54
  307. data/spec/ruby-lint/definition/constant_proxy.rb +0 -31
  308. data/spec/ruby-lint/parser.rb +0 -14
  309. data/spec/ruby-lint/presenter/json.rb +0 -31
  310. data/spec/ruby-lint/presenter/text.rb +0 -22
  311. data/spec/ruby-lint/report.rb +0 -50
  312. data/spec/ruby-lint/report/entry.rb +0 -28
  313. data/spec/ruby-lint/runner.rb +0 -32
  314. data/spec/ruby-lint/virtual_machine/associate_nodes.rb +0 -17
  315. data/spec/ruby-lint/virtual_machine/reference_amount.rb +0 -33
  316. data/spec/support/bacon.rb +0 -33
  317. data/task/cop.rake +0 -11
data/Rakefile CHANGED
@@ -5,9 +5,15 @@ require File.expand_path('../lib/ruby-lint/definition_generator', __FILE__)
5
5
  require 'yaml'
6
6
  require 'bundler/gem_tasks'
7
7
  require 'digest/sha2'
8
+ require 'coveralls/rake/task'
9
+ require 'rake/clean'
10
+
11
+ Coveralls::RakeTask.new
8
12
 
9
13
  GEMSPEC = Gem::Specification.load('ruby-lint.gemspec')
10
14
 
15
+ CLEAN.include(['coverage', 'yardoc'])
16
+
11
17
  Dir['./task/*.rake'].each do |task|
12
18
  import(task)
13
19
  end
@@ -0,0 +1 @@
1
+ 40ff98f739ee8dfb2356010f56b2110fcfa022b5df2bffd978a8585c958beae913016535d3d9721144dda39bc719334e0a61a9159f206f8ce82476ea17882540
data/doc/changelog.md CHANGED
@@ -5,6 +5,98 @@ This document contains a short summary of the various releases of ruby-lint.
5
5
  For a full list of commits included in each release see the corresponding Git
6
6
  tags (named after the versions).
7
7
 
8
+ ## 0.0.5 - 2013-09-01
9
+
10
+ Originally slated for August 1st I decided to push this release back one month
11
+ to buy myself some extra time to polish features, resolve more bugs and
12
+ procrastinate more. Besides numerous bug fixes and extra polish this release
13
+ contains two big new features that I'd like to highlight:
14
+
15
+ * support for parsing basic YARD tags
16
+ * loading of externally defined constants/files from the local file system
17
+
18
+ ### YARD Support
19
+
20
+ [YARD][yard] provides a set of tags that can aid in documenting your code. For
21
+ example, `@param` is a tag used to document the type, name and description of a
22
+ method parameter. Since Ruby has no form of type hinting you're often left to
23
+ wonder what kind of objects a method can work with.
24
+
25
+ In version 0.0.5 support for two tags was added:
26
+
27
+ * `@param`
28
+ * `@return`
29
+
30
+ When ruby-lint finds methods documented using these tags it will use them to
31
+ pull in information about the parameter types and return values. This greatly
32
+ increases the accuracy of ruby-lint, given your code is documented. Consider
33
+ the following example:
34
+
35
+ def multiply(value, multiplier)
36
+ return value * value
37
+ end
38
+
39
+ If ruby-lint were to process the above code it would have no idea what kind of
40
+ object `value` and `multiplier` are and thus wouldn't be able to much with the
41
+ above code. When documenting the above method with the mentioned YARD tags
42
+ ruby-lint *is* capable of doing this:
43
+
44
+ ##
45
+ # @param [Fixnum] value
46
+ # @param [Fixnum] multiplier
47
+ # @return [Fixnum]
48
+ #
49
+ def multiply(value, multiplier)
50
+ return value * value
51
+ end
52
+
53
+ By parsing the YARD tags ruby-lint can now know what the parameter types are
54
+ and what type of data the method returns. This in turn allows ruby-lint to
55
+ perform full analysis on the arguments instead of being forced to ignore them
56
+ completely.
57
+
58
+ ### Loading External Files
59
+
60
+ In previous versions ruby-lint had no way of loading external code that was not
61
+ pre-defined using the built-in definitions (found in
62
+ `lib/ruby-lint/definitions`). As a result a lot of false positives would be
63
+ triggered when analysing complex projects (e.g. the typical Rails project).
64
+
65
+ This has been addressed by introducing so called "file scanners" and "file
66
+ loaders". In short, these scan for a set of constants used in a file and try to
67
+ find the corresponding Ruby file that defines it (recursively). This greatly
68
+ enhances the accuracy of analysis.
69
+
70
+ Currently the algorithm for this is rather basic and can, especially in big
71
+ projects, slow analysis down by quite a bit. This will be resolved in upcoming
72
+ releases. Keep an eye on the following issues for more information:
73
+
74
+ * <https://github.com/YorickPeterse/ruby-lint/issues/50>
75
+ * <https://github.com/YorickPeterse/ruby-lint/issues/49>
76
+
77
+ ### Other Changes
78
+
79
+ Besides the two features mentioned above various other changes have also been
80
+ made, these are listed below.
81
+
82
+ * Lots of bug fixes and cleanups, as you'd expect.
83
+ * Constants (classes and modules) can now be referred by their name inside
84
+ themselves (e.g. "Foo" inside the class "Foo" refers to that class).
85
+ * The text presenter now only shows filenames instead of the full file path,
86
+ reducing clutter.
87
+ * Support for default global variables such as `$LOADED_FEATURES`
88
+ * Support for methods such as `alias` and `alias_method`
89
+ * Support for the `attr_*` family of methods
90
+ * The test suite has been migrated from Bacon to RSpec
91
+ * Support for keyword arguments.
92
+ * Updated built-in Rails definitions to include more methods.
93
+ * Debugging/benchmarking output for the analyze command.
94
+ * The analysis class ConfusingVariables has been removed due to not being very
95
+ useful.
96
+ * Various issues with method lookups inside blocks have been resolved.
97
+ * Various internals have been cleaned up.
98
+ * Improved error messages for calls to undefined methods.
99
+
8
100
  ## 0.0.4 - 2013-07-14
9
101
 
10
102
  Near total refactor of the entire project. New parser setup based on the
@@ -27,3 +119,5 @@ Various changes to the old parser.
27
119
  ## 0.0.1 - 2012-11-13
28
120
 
29
121
  First public release of ruby-lint.
122
+
123
+ [yard]: http://yardoc.org/
data/lib/ruby-lint.rb CHANGED
@@ -1,6 +1,9 @@
1
+ gem 'parser', '>= 2.0.0.pre6'
2
+
1
3
  require 'parser'
2
4
  require 'parser/current'
3
5
  require 'yaml'
6
+ require 'set'
4
7
 
5
8
  require_relative 'ruby-lint/extensions/string'
6
9
 
@@ -8,7 +11,12 @@ require_relative 'ruby-lint/variable_predicates'
8
11
  require_relative 'ruby-lint/ast/node'
9
12
  require_relative 'ruby-lint/ast/builder'
10
13
  require_relative 'ruby-lint/parser'
14
+ require_relative 'ruby-lint/file_scanner'
11
15
  require_relative 'ruby-lint/nested_stack'
16
+ require_relative 'ruby-lint/docstring/parser'
17
+ require_relative 'ruby-lint/docstring/param_tag'
18
+ require_relative 'ruby-lint/docstring/return_tag'
19
+ require_relative 'ruby-lint/docstring/mapping'
12
20
 
13
21
  require_relative 'ruby-lint/helper/constant_paths'
14
22
 
@@ -21,14 +29,24 @@ require_relative 'ruby-lint/definition_builder/ruby_hash'
21
29
  require_relative 'ruby-lint/definition_builder/ruby_block'
22
30
  require_relative 'ruby-lint/definition_builder/primitive'
23
31
 
32
+ require_relative 'ruby-lint/method_call/base'
33
+ require_relative 'ruby-lint/method_call/assign_member'
34
+ require_relative 'ruby-lint/method_call/include'
35
+ require_relative 'ruby-lint/method_call/alias'
36
+ require_relative 'ruby-lint/method_call/attribute'
37
+ require_relative 'ruby-lint/method_call/define_method'
38
+
24
39
  require_relative 'ruby-lint/iterator'
40
+ require_relative 'ruby-lint/global_scope'
25
41
  require_relative 'ruby-lint/virtual_machine'
26
42
  require_relative 'ruby-lint/constant_loader'
43
+ require_relative 'ruby-lint/file_loader'
27
44
 
28
45
  require_relative 'ruby-lint/definition/ruby_object'
29
46
  require_relative 'ruby-lint/definition/ruby_method'
30
47
  require_relative 'ruby-lint/definition/constant_proxy'
31
48
  require_relative 'ruby-lint/definitions/core'
49
+ require_relative 'ruby-lint/definitions/global_variables'
32
50
 
33
51
  require_relative 'ruby-lint/analysis/base'
34
52
  require_relative 'ruby-lint/analysis/unused_variables'
@@ -36,7 +54,6 @@ require_relative 'ruby-lint/analysis/shadowing_variables'
36
54
  require_relative 'ruby-lint/analysis/undefined_variables'
37
55
  require_relative 'ruby-lint/analysis/undefined_methods'
38
56
  require_relative 'ruby-lint/analysis/argument_amount'
39
- require_relative 'ruby-lint/analysis/confusing_variables'
40
57
  require_relative 'ruby-lint/analysis/pedantics'
41
58
 
42
59
  require_relative 'ruby-lint/report'
@@ -6,24 +6,28 @@ module RubyLint
6
6
  # amount was given.
7
7
  #
8
8
  class ArgumentAmount < Base
9
+ ##
10
+ # Hash that contains method names that should be used for analysis
11
+ # instead of the ones specified in the keys.
12
+ #
13
+ # @return [Hash]
14
+ #
15
+ MAP_METHODS = {
16
+ 'new' => [:instance_method, 'initialize']
17
+ }
18
+
9
19
  ##
10
20
  # @param [RubyLint::Node] node
11
21
  #
12
22
  def on_send(node)
13
- receiver, name, args = *node
23
+ receiver, name, *args = *node
14
24
 
15
- name = name.to_s
16
- scope = current_scope
17
-
18
- if receiver and vm.associations.key?(receiver)
19
- scope = vm.associations[receiver]
20
- end
21
-
22
- method = scope.lookup(scope.method_call_type, name)
25
+ scope = scope_for_receiver(receiver)
26
+ method = determine_method(scope, name.to_s)
23
27
 
24
28
  return unless method
25
29
 
26
- given = args ? args.children.length : 0
30
+ given = args ? args.length : 0
27
31
  min, max = argument_range(method)
28
32
 
29
33
  unless correct_argument_amount(min, max, given)
@@ -38,6 +42,35 @@ module RubyLint
38
42
 
39
43
  private
40
44
 
45
+ ##
46
+ # @param [RubyLint::AST::Node] receiver
47
+ # @return [RubyLint::Definition::RubyObject]
48
+ #
49
+ def scope_for_receiver(receiver)
50
+ scope = current_scope
51
+
52
+ if receiver and vm.associations.key?(receiver)
53
+ scope = vm.associations[receiver]
54
+ end
55
+
56
+ return scope
57
+ end
58
+
59
+ ##
60
+ # @param [RubyLint::Definition::RubyObject] scope
61
+ # @param [String] name
62
+ # @return [RubyLint::Definition::RubyMethod]
63
+ #
64
+ def determine_method(scope, name)
65
+ method = scope.lookup(scope.method_call_type, name)
66
+
67
+ if method and MAP_METHODS[method.name]
68
+ method = scope.lookup(*MAP_METHODS[method.name])
69
+ end
70
+
71
+ return method
72
+ end
73
+
41
74
  ##
42
75
  # @param [Numeric] min
43
76
  # @param [Numeric] max
@@ -51,19 +51,19 @@ module RubyLint
51
51
  protected
52
52
 
53
53
  ##
54
+ # Returns the current scope.
55
+ #
54
56
  # @return [RubyLint::Definition::RubyObject]
55
57
  #
56
- def definitions
57
- return vm.definitions
58
+ def current_scope
59
+ return @scopes[-1]
58
60
  end
59
61
 
60
62
  ##
61
- # Returns the current scope.
62
- #
63
63
  # @return [RubyLint::Definition::RubyObject]
64
64
  #
65
- def current_scope
66
- return @scopes[-1]
65
+ def previous_scope
66
+ return @scopes[-2]
67
67
  end
68
68
 
69
69
  ##
@@ -90,29 +90,28 @@ module RubyLint
90
90
  ##
91
91
  # Adds an error message to the report.
92
92
  #
93
- # @param [String] message The message to add.
94
- # @param [RubyLint::Node] node The node for which to add the message.
93
+ # @see #add_message
95
94
  #
96
- def error(message, node)
97
- add_message(:error, message, node)
95
+ def error(*args)
96
+ add_message(:error, *args)
98
97
  end
99
98
 
100
99
  ##
101
100
  # Adds a warning message to the report.
102
101
  #
103
- # @see RubyLint::Callback#error
102
+ # @see #add_message
104
103
  #
105
- def warning(message, node)
106
- add_message(:warning, message, node)
104
+ def warning(*args)
105
+ add_message(:warning, *args)
107
106
  end
108
107
 
109
108
  ##
110
109
  # Adds a regular informational message to the report.
111
110
  #
112
- # @see RubyLint::Callback#error
111
+ # @see #add_message
113
112
  #
114
- def info(message, node)
115
- add_message(:info, message, node)
113
+ def info(*args)
114
+ add_message(:info, *args)
116
115
  end
117
116
 
118
117
  ##
@@ -125,7 +124,14 @@ module RubyLint
125
124
  def add_message(level, message, node)
126
125
  return unless report
127
126
 
128
- report.add(level, message, node.line, node.column, node.file)
127
+ report.add(
128
+ :level => level,
129
+ :message => message,
130
+ :line => node.line,
131
+ :column => node.column,
132
+ :file => node.file,
133
+ :node => node
134
+ )
129
135
  end
130
136
  end # Base
131
137
  end # Analysis
@@ -8,7 +8,9 @@ module RubyLint
8
8
  class Pedantics < Base
9
9
  [:if, :unless, :until, :while].each do |type|
10
10
  define_method("on_#{type}") do |node|
11
- check_begin_token(node)
11
+ if node.location.respond_to?(:begin) and node.location.begin
12
+ check_begin_token(node)
13
+ end
12
14
  end
13
15
  end
14
16
 
@@ -21,12 +21,6 @@ module RubyLint
21
21
  name = name.to_s
22
22
  scope = current_scope
23
23
 
24
- # Abort if the receiver doesn't exist since it will be handled by other
25
- # analysis classes.
26
- if receiver and !vm.associations.key?(receiver)
27
- return
28
- end
29
-
30
24
  if receiver and vm.associations.key?(receiver)
31
25
  scope = vm.associations[receiver]
32
26
 
@@ -35,9 +29,7 @@ module RubyLint
35
29
  return if scope.parents.empty?
36
30
  end
37
31
 
38
- exists = scope.has_definition?(scope.method_call_type, name)
39
-
40
- unless exists
32
+ unless has_definition?(scope, name)
41
33
  message = error_for(name, receiver, scope)
42
34
 
43
35
  error(message, node)
@@ -46,6 +38,24 @@ module RubyLint
46
38
 
47
39
  private
48
40
 
41
+ ##
42
+ # @param [RubyLint::Definition::RubyObject] scope
43
+ # @param [String] name
44
+ #
45
+ def has_definition?(scope, name)
46
+ exists = scope.has_definition?(scope.method_call_type, name)
47
+
48
+ # Due to the way `parser` wraps block nodes (`(block (send) ...)`
49
+ # opposed to `(send ... (block))`) we'll try to find the method in the
50
+ # previous scope if we can't find it in the current block scope.
51
+ if !exists and scope.block?
52
+ prev = previous_scope
53
+ exists = prev.has_definition?(prev.method_call_type, name)
54
+ end
55
+
56
+ return exists
57
+ end
58
+
49
59
  ##
50
60
  # Determines what error message to use for a method call.
51
61
  #
@@ -76,7 +86,7 @@ module RubyLint
76
86
  # @return [String]
77
87
  #
78
88
  def receiver_error(name, scope)
79
- klass = scope.ruby_class ? scope.ruby_class : scope.name
89
+ klass = class_names_for_object(scope)
80
90
 
81
91
  if scope.instance?
82
92
  error = "undefined method #{name} on an instance of #{klass}"
@@ -86,6 +96,34 @@ module RubyLint
86
96
 
87
97
  return error
88
98
  end
99
+
100
+ private
101
+
102
+ ##
103
+ # @param [RubyLint::Definition::RubyObject] object
104
+ # @return [String]
105
+ #
106
+ def class_names_for_object(object)
107
+ if object.parents.empty?
108
+ klass = object.ruby_class ? object.ruby_class : object.name
109
+ else
110
+ klass = name_for_parents(object.parents)
111
+ end
112
+
113
+ return klass
114
+ end
115
+
116
+ ##
117
+ # @param [Array] parents
118
+ # @return [String]
119
+ #
120
+ def name_for_parents(parents)
121
+ return parents[0].name if parents.length == 1
122
+
123
+ segments = parents[0..-2].map(&:name)
124
+
125
+ return segments.join(', ') + " or #{parents[-1].name}"
126
+ end
89
127
  end # UndefinedMethods
90
128
  end # Analysis
91
129
  end # RubyLint
@@ -15,22 +15,34 @@ module RubyLint
15
15
  VARIABLE_TYPES = {
16
16
  :lvasgn => 'local variable',
17
17
  :gvasgn => 'global variable',
18
- :ivasgn => 'instance variable',
19
18
  :cvasgn => 'class variable'
20
19
  }
21
20
 
22
21
  VARIABLE_TYPES.each do |type, label|
23
22
  define_method("on_#{type}") do |node|
24
23
  type = VirtualMachine::ASSIGNMENT_TYPES[node.type]
25
- name = node.name
26
- variable = current_scope.lookup(type, name)
24
+ variable = current_scope.lookup(type, node.name)
27
25
 
28
- if variable and !variable.used?
29
- warning("unused #{label} #{name}", node)
26
+ if add_warning?(variable)
27
+ warning("unused #{label} #{variable.name}", node)
30
28
  end
31
29
  end
32
30
  end
33
31
 
32
+ ##
33
+ # @param [RubyLint::AST::Node] node
34
+ #
35
+ def on_ivasgn(node)
36
+ name = node.name
37
+ variable = current_scope.lookup(:ivar, name)
38
+ method_type = current_scope.method_call_type
39
+ getter = current_scope.lookup(method_type, name[1..-1])
40
+
41
+ if variable and !variable.used? and !getter
42
+ warning("unused instance variable #{name}", node)
43
+ end
44
+ end
45
+
34
46
  ##
35
47
  # Handles regular constants as well as constant paths.
36
48
  #
@@ -44,6 +56,16 @@ module RubyLint
44
56
  warning("unused constant #{name}", node)
45
57
  end
46
58
  end
59
+
60
+ private
61
+
62
+ ##
63
+ # @param [RubyLint::Definition::RubyObject] variable
64
+ # @return [TrueClass|FalseClass]
65
+ #
66
+ def add_warning?(variable)
67
+ return variable && !variable.used? && variable.name[0] != '_'
68
+ end
47
69
  end # UnusedVariables
48
70
  end # Analysis
49
71
  end # RubyLint