ruby-lint 0.0.3 → 0.0.4

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 (347) hide show
  1. data.tar.gz.asc +14 -14
  2. data/.gitignore +1 -2
  3. data/.rubocop.yml +59 -0
  4. data/.travis.yml +3 -7
  5. data/.yardopts +2 -2
  6. data/Gemfile +4 -0
  7. data/MANIFEST +103 -67
  8. data/README.md +13 -31
  9. data/Rakefile +1 -6
  10. data/checksum/ruby-lint-0.0.3.gem.sha512 +1 -0
  11. data/debug/memory_usage.rb +14 -0
  12. data/debug/profile.rb +18 -0
  13. data/doc/architecture.md +14 -18
  14. data/doc/changelog.md +29 -0
  15. data/doc/code_analysis.md +12 -12
  16. data/doc/configuration.md +21 -50
  17. data/doc/graphviz/flow.dot +1 -1
  18. data/doc/images/flow.png +0 -0
  19. data/lib/ruby-lint.rb +33 -19
  20. data/lib/ruby-lint/analysis/argument_amount.rb +84 -0
  21. data/lib/ruby-lint/analysis/base.rb +132 -0
  22. data/lib/ruby-lint/analysis/confusing_variables.rb +26 -0
  23. data/lib/ruby-lint/analysis/pedantics.rb +36 -0
  24. data/lib/ruby-lint/analysis/shadowing_variables.rb +47 -0
  25. data/lib/ruby-lint/analysis/undefined_methods.rb +91 -0
  26. data/lib/ruby-lint/analysis/undefined_variables.rb +46 -0
  27. data/lib/ruby-lint/analysis/unused_variables.rb +49 -0
  28. data/lib/ruby-lint/ast/builder.rb +17 -0
  29. data/lib/ruby-lint/ast/node.rb +39 -0
  30. data/lib/ruby-lint/cli.rb +0 -19
  31. data/lib/ruby-lint/cli/analyze.rb +54 -28
  32. data/lib/ruby-lint/cli/ast.rb +21 -6
  33. data/lib/ruby-lint/cli/base.rb +0 -23
  34. data/lib/ruby-lint/configuration.rb +112 -42
  35. data/lib/ruby-lint/constant_loader.rb +10 -28
  36. data/lib/ruby-lint/default_names.rb +19 -0
  37. data/lib/ruby-lint/definition/constant_proxy.rb +56 -0
  38. data/lib/ruby-lint/definition/ruby_method.rb +21 -143
  39. data/lib/ruby-lint/definition/ruby_object.rb +142 -246
  40. data/lib/ruby-lint/definition_builder/base.rb +43 -0
  41. data/lib/ruby-lint/definition_builder/primitive.rb +39 -0
  42. data/lib/ruby-lint/definition_builder/ruby_array.rb +77 -0
  43. data/lib/ruby-lint/definition_builder/ruby_block.rb +34 -0
  44. data/lib/ruby-lint/definition_builder/ruby_class.rb +24 -0
  45. data/lib/ruby-lint/definition_builder/ruby_hash.rb +37 -0
  46. data/lib/ruby-lint/definition_builder/ruby_method.rb +84 -0
  47. data/lib/ruby-lint/definition_builder/ruby_module.rb +68 -0
  48. data/lib/ruby-lint/definition_generator.rb +41 -15
  49. data/lib/ruby-lint/definitions/core/arg0.rb +1 -1
  50. data/lib/ruby-lint/definitions/core/argf.rb +1 -1
  51. data/lib/ruby-lint/definitions/core/argument_error.rb +2 -2
  52. data/lib/ruby-lint/definitions/core/argv.rb +1 -1
  53. data/lib/ruby-lint/definitions/core/array.rb +6 -6
  54. data/lib/ruby-lint/definitions/core/autoload.rb +2 -2
  55. data/lib/ruby-lint/definitions/core/basic_object.rb +3 -3
  56. data/lib/ruby-lint/definitions/core/bignum.rb +2 -2
  57. data/lib/ruby-lint/definitions/core/binding.rb +2 -2
  58. data/lib/ruby-lint/definitions/core/class.rb +2 -2
  59. data/lib/ruby-lint/definitions/core/comparable.rb +1 -1
  60. data/lib/ruby-lint/definitions/core/complex.rb +4 -4
  61. data/lib/ruby-lint/definitions/core/condition_variable.rb +2 -2
  62. data/lib/ruby-lint/definitions/core/continuation.rb +2 -2
  63. data/lib/ruby-lint/definitions/core/data.rb +2 -2
  64. data/lib/ruby-lint/definitions/core/date.rb +34 -34
  65. data/lib/ruby-lint/definitions/core/date_time.rb +26 -26
  66. data/lib/ruby-lint/definitions/core/default_record_separator.rb +1 -1
  67. data/lib/ruby-lint/definitions/core/digest.rb +14 -14
  68. data/lib/ruby-lint/definitions/core/dir.rb +34 -34
  69. data/lib/ruby-lint/definitions/core/encoding.rb +237 -237
  70. data/lib/ruby-lint/definitions/core/encoding_error.rb +2 -2
  71. data/lib/ruby-lint/definitions/core/enumerable.rb +15 -15
  72. data/lib/ruby-lint/definitions/core/enumerator.rb +2 -2
  73. data/lib/ruby-lint/definitions/core/env.rb +1 -1
  74. data/lib/ruby-lint/definitions/core/eoferror.rb +2 -2
  75. data/lib/ruby-lint/definitions/core/erb.rb +22 -22
  76. data/lib/ruby-lint/definitions/core/errno.rb +525 -525
  77. data/lib/ruby-lint/definitions/core/etc.rb +6 -6
  78. data/lib/ruby-lint/definitions/core/exception.rb +2 -2
  79. data/lib/ruby-lint/definitions/core/false.rb +1 -1
  80. data/lib/ruby-lint/definitions/core/false_class.rb +2 -2
  81. data/lib/ruby-lint/definitions/core/fatal_error.rb +2 -2
  82. data/lib/ruby-lint/definitions/core/fiber.rb +2 -2
  83. data/lib/ruby-lint/definitions/core/fiber_error.rb +2 -2
  84. data/lib/ruby-lint/definitions/core/file.rb +68 -68
  85. data/lib/ruby-lint/definitions/core/file_list.rb +2 -2
  86. data/lib/ruby-lint/definitions/core/file_test.rb +1 -1
  87. data/lib/ruby-lint/definitions/core/file_utils.rb +16 -16
  88. data/lib/ruby-lint/definitions/core/fixnum.rb +4 -4
  89. data/lib/ruby-lint/definitions/core/float.rb +16 -16
  90. data/lib/ruby-lint/definitions/core/float_domain_error.rb +2 -2
  91. data/lib/ruby-lint/definitions/core/gc.rb +2 -2
  92. data/lib/ruby-lint/definitions/core/gem.rb +119 -119
  93. data/lib/ruby-lint/definitions/core/hash.rb +14 -14
  94. data/lib/ruby-lint/definitions/core/immediate_value.rb +1 -1
  95. data/lib/ruby-lint/definitions/core/index_error.rb +2 -2
  96. data/lib/ruby-lint/definitions/core/integer.rb +2 -2
  97. data/lib/ruby-lint/definitions/core/interrupt.rb +2 -2
  98. data/lib/ruby-lint/definitions/core/io.rb +38 -38
  99. data/lib/ruby-lint/definitions/core/ioerror.rb +2 -2
  100. data/lib/ruby-lint/definitions/core/kernel.rb +3 -3
  101. data/lib/ruby-lint/definitions/core/key_error.rb +2 -2
  102. data/lib/ruby-lint/definitions/core/load_error.rb +6 -6
  103. data/lib/ruby-lint/definitions/core/local_jump_error.rb +2 -2
  104. data/lib/ruby-lint/definitions/core/main.rb +1 -1
  105. data/lib/ruby-lint/definitions/core/marshal.rb +35 -35
  106. data/lib/ruby-lint/definitions/core/match_data.rb +2 -2
  107. data/lib/ruby-lint/definitions/core/math.rb +7 -7
  108. data/lib/ruby-lint/definitions/core/memory_segmention_error.rb +2 -2
  109. data/lib/ruby-lint/definitions/core/method.rb +2 -2
  110. data/lib/ruby-lint/definitions/core/module.rb +1 -1
  111. data/lib/ruby-lint/definitions/core/monitor.rb +4 -4
  112. data/lib/ruby-lint/definitions/core/monitor_mixin.rb +5 -5
  113. data/lib/ruby-lint/definitions/core/mutex.rb +2 -2
  114. data/lib/ruby-lint/definitions/core/name_error.rb +2 -2
  115. data/lib/ruby-lint/definitions/core/nil.rb +1 -1
  116. data/lib/ruby-lint/definitions/core/nil_class.rb +2 -2
  117. data/lib/ruby-lint/definitions/core/no_memory_error.rb +2 -2
  118. data/lib/ruby-lint/definitions/core/no_method_error.rb +2 -2
  119. data/lib/ruby-lint/definitions/core/not_implemented_error.rb +2 -2
  120. data/lib/ruby-lint/definitions/core/numeric.rb +2 -2
  121. data/lib/ruby-lint/definitions/core/object.rb +2 -2
  122. data/lib/ruby-lint/definitions/core/object_space.rb +1 -1
  123. data/lib/ruby-lint/definitions/core/open_struct.rb +3 -3
  124. data/lib/ruby-lint/definitions/core/option_parser.rb +83 -83
  125. data/lib/ruby-lint/definitions/core/precision.rb +1 -1
  126. data/lib/ruby-lint/definitions/core/primitive_failure.rb +2 -2
  127. data/lib/ruby-lint/definitions/core/proc.rb +2 -2
  128. data/lib/ruby-lint/definitions/core/process.rb +29 -29
  129. data/lib/ruby-lint/definitions/core/psych.rb +149 -149
  130. data/lib/ruby-lint/definitions/core/queue.rb +2 -2
  131. data/lib/ruby-lint/definitions/core/rake.rb +117 -117
  132. data/lib/ruby-lint/definitions/core/rake_file_utils.rb +1 -1
  133. data/lib/ruby-lint/definitions/core/rakeversion.rb +1 -1
  134. data/lib/ruby-lint/definitions/core/random.rb +2 -2
  135. data/lib/ruby-lint/definitions/core/range.rb +4 -4
  136. data/lib/ruby-lint/definitions/core/range_error.rb +2 -2
  137. data/lib/ruby-lint/definitions/core/rational.rb +2 -2
  138. data/lib/ruby-lint/definitions/core/rb_config.rb +3 -3
  139. data/lib/ruby-lint/definitions/core/regexp.rb +28 -28
  140. data/lib/ruby-lint/definitions/core/regexp_error.rb +2 -2
  141. data/lib/ruby-lint/definitions/core/rubinius.rb +1057 -1057
  142. data/lib/ruby-lint/definitions/core/ruby_copyright.rb +1 -1
  143. data/lib/ruby-lint/definitions/core/ruby_description.rb +1 -1
  144. data/lib/ruby-lint/definitions/core/ruby_engine.rb +1 -1
  145. data/lib/ruby-lint/definitions/core/ruby_lint.rb +9 -9
  146. data/lib/ruby-lint/definitions/core/ruby_patchlevel.rb +1 -1
  147. data/lib/ruby-lint/definitions/core/ruby_platform.rb +1 -1
  148. data/lib/ruby-lint/definitions/core/ruby_release_date.rb +1 -1
  149. data/lib/ruby-lint/definitions/core/ruby_version.rb +1 -1
  150. data/lib/ruby-lint/definitions/core/runtime_error.rb +2 -2
  151. data/lib/ruby-lint/definitions/core/scan_error.rb +2 -2
  152. data/lib/ruby-lint/definitions/core/script_error.rb +2 -2
  153. data/lib/ruby-lint/definitions/core/security_error.rb +2 -2
  154. data/lib/ruby-lint/definitions/core/shellwords.rb +1 -1
  155. data/lib/ruby-lint/definitions/core/signal.rb +3 -3
  156. data/lib/ruby-lint/definitions/core/signal_exception.rb +2 -2
  157. data/lib/ruby-lint/definitions/core/singleton.rb +2 -2
  158. data/lib/ruby-lint/definitions/core/sized_queue.rb +2 -2
  159. data/lib/ruby-lint/definitions/core/standard_error.rb +2 -2
  160. data/lib/ruby-lint/definitions/core/stderr.rb +1 -1
  161. data/lib/ruby-lint/definitions/core/stdin.rb +1 -1
  162. data/lib/ruby-lint/definitions/core/stdout.rb +1 -1
  163. data/lib/ruby-lint/definitions/core/stop_iteration.rb +2 -2
  164. data/lib/ruby-lint/definitions/core/string.rb +21 -21
  165. data/lib/ruby-lint/definitions/core/string_io.rb +7 -7
  166. data/lib/ruby-lint/definitions/core/string_scanner.rb +4 -4
  167. data/lib/ruby-lint/definitions/core/struct.rb +20 -20
  168. data/lib/ruby-lint/definitions/core/syck.rb +4 -4
  169. data/lib/ruby-lint/definitions/core/symbol.rb +2 -2
  170. data/lib/ruby-lint/definitions/core/syntax_error.rb +2 -2
  171. data/lib/ruby-lint/definitions/core/system_call_error.rb +2 -2
  172. data/lib/ruby-lint/definitions/core/system_exit.rb +2 -2
  173. data/lib/ruby-lint/definitions/core/system_stack_error.rb +2 -2
  174. data/lib/ruby-lint/definitions/core/thread.rb +6 -6
  175. data/lib/ruby-lint/definitions/core/thread_error.rb +2 -2
  176. data/lib/ruby-lint/definitions/core/thread_group.rb +2 -2
  177. data/lib/ruby-lint/definitions/core/time.rb +3 -3
  178. data/lib/ruby-lint/definitions/core/toplevel_binding.rb +1 -1
  179. data/lib/ruby-lint/definitions/core/true.rb +1 -1
  180. data/lib/ruby-lint/definitions/core/true_class.rb +2 -2
  181. data/lib/ruby-lint/definitions/core/type_error.rb +2 -2
  182. data/lib/ruby-lint/definitions/core/unbound_method.rb +2 -2
  183. data/lib/ruby-lint/definitions/core/unmarshalable.rb +1 -1
  184. data/lib/ruby-lint/definitions/core/unsupported_library_error.rb +2 -2
  185. data/lib/ruby-lint/definitions/core/weak_ref.rb +4 -4
  186. data/lib/ruby-lint/definitions/core/zero_division_error.rb +2 -2
  187. data/lib/ruby-lint/definitions/rails.rb +12 -0
  188. data/lib/ruby-lint/definitions/rails/abstract_controller.rb +335 -0
  189. data/lib/ruby-lint/definitions/rails/action_controller.rb +1244 -0
  190. data/lib/ruby-lint/definitions/rails/action_dispatch.rb +741 -0
  191. data/lib/ruby-lint/definitions/rails/action_mailer.rb +502 -0
  192. data/lib/ruby-lint/definitions/rails/action_pack.rb +16 -0
  193. data/lib/ruby-lint/definitions/rails/action_view.rb +898 -0
  194. data/lib/ruby-lint/definitions/rails/active_model.rb +437 -0
  195. data/lib/ruby-lint/definitions/rails/active_record.rb +2901 -0
  196. data/lib/ruby-lint/definitions/rails/active_support.rb +1963 -0
  197. data/lib/ruby-lint/definitions/rails/arel.rb +665 -0
  198. data/lib/ruby-lint/definitions/rails/rails.rb +452 -0
  199. data/lib/ruby-lint/definitions/rails/sprockets.rb +968 -0
  200. data/lib/ruby-lint/generated_constant.rb +33 -0
  201. data/lib/ruby-lint/helper/constant_paths.rb +30 -21
  202. data/lib/ruby-lint/inspector.rb +20 -2
  203. data/lib/ruby-lint/iterator.rb +11 -171
  204. data/lib/ruby-lint/nested_stack.rb +46 -0
  205. data/lib/ruby-lint/parser.rb +24 -806
  206. data/lib/ruby-lint/report.rb +2 -30
  207. data/lib/ruby-lint/report/entry.rb +2 -2
  208. data/lib/ruby-lint/runner.rb +81 -0
  209. data/lib/ruby-lint/template/definition.erb +12 -8
  210. data/lib/ruby-lint/variable_predicates.rb +16 -58
  211. data/lib/ruby-lint/version.rb +1 -1
  212. data/lib/ruby-lint/virtual_machine.rb +1044 -0
  213. data/ruby-lint.gemspec +17 -7
  214. data/spec/fixtures/complex/rails/basic_controller.rb +9 -0
  215. data/spec/fixtures/complex/rcap.rb +38 -0
  216. data/spec/fixtures/complex/slop.rb +680 -0
  217. data/spec/fixtures/config.yml +8 -0
  218. data/spec/fixtures/invalid.rb +3 -0
  219. data/spec/fixtures/invalid_2.rb +3 -0
  220. data/spec/fixtures/syntax_error.rb +1 -0
  221. data/spec/fixtures/valid.rb +3 -0
  222. data/spec/helper.rb +6 -0
  223. data/spec/ruby-lint/{analyze → analysis}/argument_amount.rb +7 -7
  224. data/spec/ruby-lint/analysis/confusing_variables.rb +46 -0
  225. data/spec/ruby-lint/analysis/pedantics.rb +43 -0
  226. data/spec/ruby-lint/{analyze → analysis}/shadowing_variables.rb +5 -5
  227. data/spec/ruby-lint/{analyze → analysis}/undefined_methods.rb +18 -18
  228. data/spec/ruby-lint/{analyze → analysis}/undefined_variables.rb +19 -25
  229. data/spec/ruby-lint/{analyze → analysis}/unused_variables.rb +29 -16
  230. data/spec/ruby-lint/ast/node.rb +33 -0
  231. data/spec/ruby-lint/cli/analyze.rb +31 -0
  232. data/spec/ruby-lint/cli/ast.rb +23 -0
  233. data/spec/ruby-lint/configuration.rb +45 -6
  234. data/spec/ruby-lint/definition/constant_proxy.rb +31 -0
  235. data/spec/ruby-lint/definition/dsl.rb +13 -20
  236. data/spec/ruby-lint/definition/ruby_method.rb +65 -148
  237. data/spec/ruby-lint/definition/ruby_object.rb +60 -96
  238. data/spec/ruby-lint/definition_builder/primitive.rb +62 -0
  239. data/spec/ruby-lint/definition_builder/ruby_class.rb +108 -0
  240. data/spec/ruby-lint/definition_builder/ruby_method.rb +53 -0
  241. data/spec/ruby-lint/definition_builder/ruby_module.rb +50 -0
  242. data/spec/ruby-lint/iterator.rb +40 -16
  243. data/spec/ruby-lint/nested_stack.rb +23 -0
  244. data/spec/ruby-lint/parser.rb +14 -0
  245. data/spec/ruby-lint/report.rb +0 -10
  246. data/spec/ruby-lint/report/entry.rb +8 -4
  247. data/spec/ruby-lint/runner.rb +32 -0
  248. data/spec/ruby-lint/virtual_machine/assignments/arrays.rb +87 -0
  249. data/spec/ruby-lint/virtual_machine/assignments/hashes.rb +52 -0
  250. data/spec/ruby-lint/virtual_machine/assignments/optional.rb +41 -0
  251. data/spec/ruby-lint/{definitions_builder → virtual_machine}/assignments/return_values.rb +11 -11
  252. data/spec/ruby-lint/virtual_machine/assignments/variables.rb +85 -0
  253. data/spec/ruby-lint/virtual_machine/associate_nodes.rb +17 -0
  254. data/spec/ruby-lint/virtual_machine/autoloading.rb +31 -0
  255. data/spec/ruby-lint/virtual_machine/blocks.rb +64 -0
  256. data/spec/ruby-lint/virtual_machine/classes/class_methods.rb +21 -0
  257. data/spec/ruby-lint/virtual_machine/classes/extending.rb +104 -0
  258. data/spec/ruby-lint/virtual_machine/classes/redefining.rb +24 -0
  259. data/spec/ruby-lint/virtual_machine/classes/sclass.rb +94 -0
  260. data/spec/ruby-lint/virtual_machine/classes/scoping.rb +60 -0
  261. data/spec/ruby-lint/virtual_machine/complex/rails.rb +18 -0
  262. data/spec/ruby-lint/virtual_machine/complex/rcap.rb +15 -0
  263. data/spec/ruby-lint/virtual_machine/complex/slop.rb +16 -0
  264. data/spec/ruby-lint/{definitions_builder → virtual_machine}/for.rb +2 -2
  265. data/spec/ruby-lint/virtual_machine/freeze.rb +13 -0
  266. data/spec/ruby-lint/virtual_machine/interpolation.rb +12 -0
  267. data/spec/ruby-lint/virtual_machine/methods/defining.rb +40 -0
  268. data/spec/ruby-lint/virtual_machine/methods/exporting.rb +19 -0
  269. data/spec/ruby-lint/virtual_machine/methods/parameters.rb +77 -0
  270. data/spec/ruby-lint/virtual_machine/methods/patching.rb +26 -0
  271. data/spec/ruby-lint/virtual_machine/methods/scoping.rb +63 -0
  272. data/spec/ruby-lint/virtual_machine/methods/visibility.rb +64 -0
  273. data/spec/ruby-lint/{definitions_builder → virtual_machine}/modules.rb +16 -16
  274. data/spec/ruby-lint/virtual_machine/reference_amount.rb +33 -0
  275. data/spec/ruby-lint/virtual_machine/unused.rb +17 -0
  276. data/spec/support/bacon.rb +13 -13
  277. data/spec/support/building.rb +23 -16
  278. data/spec/support/coveralls.rb +5 -0
  279. data/spec/support/fixtures.rb +20 -0
  280. data/spec/support/parsing.rb +3 -5
  281. data/spec/support/simplecov.rb +5 -3
  282. data/task/build.rake +1 -1
  283. data/task/cop.rake +11 -0
  284. data/task/generate.rake +40 -2
  285. data/task/profile.rake +27 -0
  286. data/task/todo.rake +6 -0
  287. data/task/travis.rake +7 -0
  288. metadata +160 -75
  289. metadata.gz.asc +14 -14
  290. data/doc/build/.gitkeep +0 -0
  291. data/lib/ruby-lint/analyze/argument_amount.rb +0 -73
  292. data/lib/ruby-lint/analyze/shadowing_variables.rb +0 -32
  293. data/lib/ruby-lint/analyze/undefined_methods.rb +0 -68
  294. data/lib/ruby-lint/analyze/undefined_variables.rb +0 -72
  295. data/lib/ruby-lint/analyze/unused_variables.rb +0 -48
  296. data/lib/ruby-lint/base.rb +0 -85
  297. data/lib/ruby-lint/definitions_builder.rb +0 -692
  298. data/lib/ruby-lint/helper/conversion.rb +0 -33
  299. data/lib/ruby-lint/helper/current_scope.rb +0 -98
  300. data/lib/ruby-lint/helper/methods.rb +0 -91
  301. data/lib/ruby-lint/node.rb +0 -107
  302. data/lib/ruby-lint/parser_error.rb +0 -30
  303. data/spec/ruby-lint/constant_loader.rb +0 -32
  304. data/spec/ruby-lint/definition/method_calls.rb +0 -26
  305. data/spec/ruby-lint/definitions_builder/assignments/arrays.rb +0 -71
  306. data/spec/ruby-lint/definitions_builder/assignments/hashes.rb +0 -65
  307. data/spec/ruby-lint/definitions_builder/assignments/objects.rb +0 -23
  308. data/spec/ruby-lint/definitions_builder/assignments/optional.rb +0 -22
  309. data/spec/ruby-lint/definitions_builder/assignments/variables.rb +0 -71
  310. data/spec/ruby-lint/definitions_builder/associate_nodes.rb +0 -17
  311. data/spec/ruby-lint/definitions_builder/blocks.rb +0 -40
  312. data/spec/ruby-lint/definitions_builder/classes.rb +0 -230
  313. data/spec/ruby-lint/definitions_builder/methods.rb +0 -147
  314. data/spec/ruby-lint/definitions_builder/reference_amount.rb +0 -31
  315. data/spec/ruby-lint/definitions_builder/unused.rb +0 -15
  316. data/spec/ruby-lint/node.rb +0 -38
  317. data/spec/ruby-lint/parser/assignments.rb +0 -225
  318. data/spec/ruby-lint/parser/classes.rb +0 -110
  319. data/spec/ruby-lint/parser/errors.rb +0 -12
  320. data/spec/ruby-lint/parser/metadata.rb +0 -17
  321. data/spec/ruby-lint/parser/method_definitions.rb +0 -111
  322. data/spec/ruby-lint/parser/methods.rb +0 -217
  323. data/spec/ruby-lint/parser/modules.rb +0 -70
  324. data/spec/ruby-lint/parser/operators.rb +0 -40
  325. data/spec/ruby-lint/parser/statements/begin.rb +0 -55
  326. data/spec/ruby-lint/parser/statements/case.rb +0 -34
  327. data/spec/ruby-lint/parser/statements/defined.rb +0 -11
  328. data/spec/ruby-lint/parser/statements/for.rb +0 -34
  329. data/spec/ruby-lint/parser/statements/if.rb +0 -46
  330. data/spec/ruby-lint/parser/statements/return.rb +0 -14
  331. data/spec/ruby-lint/parser/statements/super.rb +0 -49
  332. data/spec/ruby-lint/parser/statements/unless.rb +0 -42
  333. data/spec/ruby-lint/parser/statements/until.rb +0 -25
  334. data/spec/ruby-lint/parser/statements/while.rb +0 -25
  335. data/spec/ruby-lint/parser/statements/yield.rb +0 -18
  336. data/spec/ruby-lint/parser/types/arrays.rb +0 -47
  337. data/spec/ruby-lint/parser/types/booleans.rb +0 -11
  338. data/spec/ruby-lint/parser/types/constants.rb +0 -32
  339. data/spec/ruby-lint/parser/types/hashes.rb +0 -55
  340. data/spec/ruby-lint/parser/types/nil.rb +0 -7
  341. data/spec/ruby-lint/parser/types/numbers.rb +0 -11
  342. data/spec/ruby-lint/parser/types/procs.rb +0 -11
  343. data/spec/ruby-lint/parser/types/ranges.rb +0 -11
  344. data/spec/ruby-lint/parser/types/regexp.rb +0 -27
  345. data/spec/ruby-lint/parser/types/strings.rb +0 -44
  346. data/spec/ruby-lint/parser/types/symbols.rb +0 -15
  347. data/task/stdlib.rake +0 -23
@@ -0,0 +1,39 @@
1
+ module RubyLint
2
+ module AST
3
+ ##
4
+ # Extends the Node class provided by the `parser` Gem with various extra
5
+ # methods.
6
+ #
7
+ class Node < ::Parser::AST::Node
8
+ include ::RubyLint::VariablePredicates
9
+
10
+ ##
11
+ # @return [Numeric]
12
+ #
13
+ def line
14
+ return location.expression.line
15
+ end
16
+
17
+ ##
18
+ # @return [Numeric]
19
+ #
20
+ def column
21
+ return location.expression.column
22
+ end
23
+
24
+ ##
25
+ # @return [String]
26
+ #
27
+ def file
28
+ return location.expression.source_buffer.name
29
+ end
30
+
31
+ ##
32
+ # @return [String]
33
+ #
34
+ def name
35
+ return const? ? children[-1].to_s : children[0].to_s
36
+ end
37
+ end # Node
38
+ end # AST
39
+ end # RubyLint
data/lib/ruby-lint/cli.rb CHANGED
@@ -1,22 +1,3 @@
1
- RubyLint::Configuration.register_names 'analysis' do |names|
2
- names['argument_amount'] = RubyLint::Analyze::ArgumentAmount
3
- names['shadowing_variables'] = RubyLint::Analyze::ShadowingVariables
4
- names['undefined_methods'] = RubyLint::Analyze::UndefinedMethods
5
- names['undefined_variables'] = RubyLint::Analyze::UndefinedVariables
6
- names['unused_variables'] = RubyLint::Analyze::UnusedVariables
7
- end
8
-
9
- RubyLint::Configuration.register_names 'presenters' do |names|
10
- names['text'] = RubyLint::Presenter::Text
11
- names['json'] = RubyLint::Presenter::JSON
12
- end
13
-
14
- RubyLint::Configuration.register_names 'levels' do |names|
15
- RubyLint::Report.levels.each do |level|
16
- names[level.to_s] = level
17
- end
18
- end
19
-
20
1
  require 'slop'
21
2
  require_relative 'cli/base'
22
3
  require_relative 'cli/analyze'
@@ -1,6 +1,6 @@
1
1
  RubyLint::CLI.options.command :analyze do
2
2
  banner 'Usage: ruby-lint analyze [FILES] [OPTIONS]'
3
- description 'Analyzes the source code of Ruby files'
3
+ description 'Analysiss the source code of Ruby files'
4
4
 
5
5
  separator <<-EOF.chomp
6
6
 
@@ -59,41 +59,67 @@ Examples:
59
59
  on :p=, :presenter=, 'The presenter to use', :as => String
60
60
  on :a=, :analysis=, 'The analysis classes to use', :as => Array
61
61
 
62
- run do |opts, args|
63
- abort 'You must specify at least one file to analyze' if args.empty?
64
-
65
- files = RubyLint::CLI.existing_files(args)
66
-
67
- RubyLint.load_configuration
68
-
69
- RubyLint.configuration.set_reporting_levels(opts[:l]) if opts[:l]
70
- RubyLint.configuration.set_presenter(opts[:p]) if opts[:p]
71
- RubyLint.configuration.set_analysis(opts[:a]) if opts[:a]
62
+ ##
63
+ # Returns an Array containing the file paths that exist. If a non existing
64
+ # file is encountered `abort` is called.
65
+ #
66
+ # @param [Array] files
67
+ # @return [Array]
68
+ #
69
+ def extract_files(files)
70
+ existing = []
72
71
 
73
72
  files.each do |file|
74
- ast = RubyLint::Parser.new(File.read(file), file).parse
73
+ file = File.expand_path(file)
75
74
 
76
- RubyLint::ConstantLoader.new.iterate(ast)
75
+ if File.file?(file)
76
+ existing << file
77
+ else
78
+ abort "The file #{file} does not exist"
79
+ end
80
+ end
77
81
 
78
- report = RubyLint.configuration.report
79
- presenter = RubyLint.configuration.presenter.new
80
- defs_builder = RubyLint::DefinitionsBuilder.new
82
+ return existing
83
+ end
84
+
85
+ ##
86
+ # @return [Hash]
87
+ #
88
+ def option_mapping
89
+ return {
90
+ :levels => :report_levels=,
91
+ :presenter => :presenter=,
92
+ :analysis => :analysis_classes=
93
+ }
94
+ end
95
+
96
+ ##
97
+ # @return [IO]
98
+ #
99
+ def output_destination
100
+ return @output_destination ||= STDOUT
101
+ end
102
+
103
+ ##
104
+ # @param [IO] destination
105
+ #
106
+ def output_destination=(destination)
107
+ @output_destination = destination
108
+ end
81
109
 
82
- defs_builder.iterate(ast)
110
+ run do |opts, args|
111
+ abort 'You must specify at least one file to analyze' if args.empty?
83
112
 
84
- RubyLint.configuration.analysis.each do |constant|
85
- instance = constant.new(
86
- :report => report,
87
- :definitions => defs_builder.options[:definitions],
88
- :node_definitions => defs_builder.options[:node_definitions]
89
- )
113
+ files = extract_files(args)
114
+ configuration = RubyLint::Configuration.load_from_file
90
115
 
91
- instance.iterate(ast)
92
- end
116
+ option_mapping.each do |key, setter|
117
+ configuration.send(setter, opts[key]) if opts[key]
118
+ end
93
119
 
94
- output = presenter.present(report)
120
+ runner = RubyLint::Runner.new(configuration)
121
+ output = runner.analyze(files)
95
122
 
96
- puts output unless output.empty?
97
- end
123
+ output_destination.puts output unless output.empty?
98
124
  end # run do |opts, args|
99
125
  end # RubyLint::CLI.options.command
@@ -19,17 +19,32 @@ Examples:
19
19
  $ ruby-lint ast ./test_file.rb
20
20
  EOF
21
21
 
22
- separator RubyLint::CLI::OPTIONS_HEADER
22
+ separator RubyLint::CLI::OPTIONS_HEADER
23
23
 
24
24
  RubyLint::CLI.help_option(self)
25
25
 
26
+ ##
27
+ # @return [IO]
28
+ #
29
+ def output_destination
30
+ return @output_destination ||= STDOUT
31
+ end
32
+
33
+ ##
34
+ # @param [IO] destination
35
+ #
36
+ def output_destination=(destination)
37
+ @output_destination = destination
38
+ end
39
+
26
40
  run do |opts, args|
27
- file = args[0]
41
+ file = File.expand_path(args[0])
42
+
43
+ abort 'You must specify an existing file' unless File.file?(file)
28
44
 
29
- if !file or !File.file?(file)
30
- abort 'You must specify an existing file'
31
- end
45
+ code = File.read(file)
46
+ parser = RubyLint::Parser.new
32
47
 
33
- puts RubyLint::Parser.new(File.read(file), file).parse.inspect
48
+ output_destination.puts parser.parse(code, file).inspect
34
49
  end
35
50
  end
@@ -18,29 +18,6 @@ module RubyLint
18
18
  #
19
19
  OPTIONS_HEADER = "\nOptions:\n"
20
20
 
21
- ##
22
- # Returns an Array containing the file paths that exist. If a non existing
23
- # file is encountered `abort` is called.
24
- #
25
- # @param [Array] files
26
- # @return [Array]
27
- #
28
- def self.existing_files(files)
29
- existing = []
30
-
31
- files.each do |file|
32
- file = File.expand_path(file)
33
-
34
- if File.file?(file)
35
- existing << file
36
- else
37
- abort "The file #{file} does not exist"
38
- end
39
- end
40
-
41
- return existing
42
- end
43
-
44
21
  ##
45
22
  # Returns a String containing a list of names as registered in
46
23
  # {RubyLint::Configuration.names}.
@@ -2,17 +2,49 @@ module RubyLint
2
2
  ##
3
3
  # The Configuration class is used for storing configuration information used
4
4
  # when running the CLI of ruby-lint. It contains information such as the
5
- # reporting levels, the formatter to use and so on.
5
+ # available analysis classes and report levels.
6
6
  #
7
- # @!attribute [rw] presenter
8
- # @return [RubyLint::Presenter] The presenter to use for displaying reports.
9
- # @!attribute [rw] report_levels
10
- # @return [Array] The reporting levels to use.
11
- # @!attribute [rw] analysis
12
- # @return [Array] The analysis classes to enable.
7
+ # @!attribute [r] analysis_classes
8
+ # @return [Array]
9
+ # @!attribute [r] report_levels
10
+ # @return [Array]
11
+ # @!attribute [r] presenter
12
+ # @return [Class]
13
13
  #
14
14
  class Configuration
15
- attr_accessor :presenter, :report_levels, :analysis
15
+ attr_reader :analysis_classes, :report_levels, :presenter
16
+
17
+ ##
18
+ # Returns an Array of locations from which to load configuration files.
19
+ #
20
+ # @return [Array]
21
+ #
22
+ def self.configuration_files
23
+ return [
24
+ File.join(Dir.pwd, 'ruby-lint.yml'),
25
+ File.expand_path('~/.ruby-lint.yml', __FILE__)
26
+ ]
27
+ end
28
+
29
+ ##
30
+ # Creates a new configuration instance by loading a configuration file.
31
+ #
32
+ # @param [Array] paths The Array of configuration files to process. Only
33
+ # the first existing file will be loaded.
34
+ # @return [RubyLint::Configuration]
35
+ #
36
+ def self.load_from_file(paths = configuration_files)
37
+ paths.each do |path|
38
+ if File.file?(path)
39
+ options = YAML.load_file(path)
40
+ configuration = new(options)
41
+
42
+ return configuration
43
+ end
44
+ end
45
+
46
+ return new
47
+ end
16
48
 
17
49
  ##
18
50
  # Provides a small block based DSL for registering multiple names.
@@ -43,70 +75,108 @@ module RubyLint
43
75
  #
44
76
  def initialize(options = {})
45
77
  options.each do |key, value|
46
- instance_variable_set("@#{key}", value)
78
+ setter = "#{key}="
79
+
80
+ if respond_to?(setter)
81
+ send(setter, value)
82
+ end
47
83
  end
48
84
 
49
- @presenter ||= RubyLint::Presenter::Text
50
- @report_levels ||= Report::DEFAULT_LEVELS
51
- @analysis ||= default_analysis_classes
85
+ @analysis_classes ||= default_analysis_classes
86
+ @report_levels ||= default_report_levels
87
+ @presenter ||= default_presenter
52
88
  end
53
89
 
54
90
  ##
55
- # @return [Array]
91
+ # Requires a list of files.
56
92
  #
57
- def default_analysis_classes
58
- return Analyze.constants.map do |const|
59
- Analyze.const_get(const)
60
- end
93
+ # @param [Array] files
94
+ #
95
+ def requires=(files)
96
+ files.each { |file| require(file) }
61
97
  end
62
98
 
63
99
  ##
64
- # Returns a report with the report levels set based on this configuration
65
- # instance.
100
+ # Returns a list of the enabled report levels.
66
101
  #
67
- # @return [RubyLint::Report]
102
+ # @param [Array] given The report levels specified by the user.
103
+ # @return [Array]
68
104
  #
69
- def report
70
- return Report.new(report_levels)
105
+ def report_levels=(given)
106
+ available = self.class.names['levels']
107
+ levels = []
108
+
109
+ given.each do |level|
110
+ levels << available[level] if available[level]
111
+ end
112
+
113
+ if levels.empty?
114
+ levels = default_report_levels
115
+ end
116
+
117
+ @report_levels = levels
71
118
  end
72
119
 
73
120
  ##
74
- # Set the reporting levels based on a set of CLI options.
121
+ # Returns the presenter to use.
75
122
  #
76
- # @param [Array] levels
123
+ # @param [String] name The friendly name of the presenter as set by the
124
+ # user.
125
+ # @return [RubyLint::Presenter]
126
+ # @raise ArgumentError Raised when an invalid presenter is specified.
77
127
  #
78
- def set_reporting_levels(levels)
79
- self.report_levels = []
80
- available = self.class.names['levels']
128
+ def presenter=(name)
129
+ found = self.class.names['presenters'][name]
81
130
 
82
- levels.each do |level|
83
- report_levels << available[level] if available[level]
131
+ if found
132
+ @presenter = found
133
+ else
134
+ raise ArgumentError, "Invalid presenter: #{name}"
84
135
  end
85
136
  end
86
137
 
87
138
  ##
88
- # Sets the presenter based on a set of CLI options.
139
+ # Returns a collection of the analysis constants to use.
89
140
  #
90
- # @param [String] name
141
+ # @param [Array] names The analysis names as given by the user.
142
+ # @return [Array]
91
143
  #
92
- def set_presenter(name)
93
- if self.class.names['presenters'][name]
94
- self.presenter = self.class.names['presenters'][name]
144
+ def analysis_classes=(names)
145
+ classes = []
146
+ available = self.class.names['analysis']
147
+
148
+ names.each do |name|
149
+ classes << available[name] if available[name]
95
150
  end
151
+
152
+ if classes.empty?
153
+ classes = default_analysis_classes
154
+ end
155
+
156
+ @analysis_classes = classes
96
157
  end
97
158
 
98
159
  ##
99
- # Sets the analysis classes based on a set of CLI options.
160
+ # Returns the default (= all) analysis classes to use.
100
161
  #
101
- # @param [Array] names
162
+ # @return [Array]
102
163
  #
103
- def set_analysis(names)
104
- self.analysis = []
105
- available = self.class.names['analysis']
164
+ def default_analysis_classes
165
+ return self.class.names['analysis'].values
166
+ end
106
167
 
107
- names.each do |name|
108
- self.analysis << available[name] if available[name]
109
- end
168
+ ##
169
+ # @return [Array]
170
+ #
171
+ def default_report_levels
172
+ return RubyLint::Report::DEFAULT_LEVELS
173
+ end
174
+
175
+ ##
176
+ # @return [Class]
177
+ #
178
+ def default_presenter
179
+ return RubyLint::Presenter::Text
110
180
  end
111
181
  end # Configuration
112
182
  end # RubyLint
@@ -11,6 +11,8 @@ module RubyLint
11
11
  # @return [Hash] Hash containing the loaded constants.
12
12
  #
13
13
  class ConstantLoader < Iterator
14
+ include Helper::ConstantPaths
15
+
14
16
  attr_reader :loaded
15
17
 
16
18
  ##
@@ -19,42 +21,22 @@ module RubyLint
19
21
  # @return [Array]
20
22
  #
21
23
  LOAD_PATH = [
22
- File.expand_path('../definitions/core', __FILE__)
24
+ File.expand_path('../definitions/core', __FILE__),
25
+ File.expand_path('../definitions/rails', __FILE__)
23
26
  ]
24
27
 
25
28
  ##
26
- # @see RubyLint::Iterator#initialize
27
- #
28
- def initialize(*args)
29
- super
30
-
31
- @loaded = {}
32
- @in_constant_path = false
33
- end
34
-
35
- ##
36
- # @param [RubyLint::Node] node
37
- #
38
- def on_constant_path(node)
39
- @in_constant_path = true
40
-
41
- load(node.children.first.name)
42
- end
43
-
44
- ##
45
- # @param [RubyLint::Node] node
29
+ # Called after a new instance of the class is created.
46
30
  #
47
- def after_constant_path(node)
48
- @in_constant_path = false
31
+ def after_initialize
32
+ @loaded = {}
49
33
  end
50
34
 
51
35
  ##
52
36
  # @param [RubyLint::Node] node
53
37
  #
54
- def on_constant(node)
55
- return if @in_constant_path
56
-
57
- load(node.name)
38
+ def on_const(node)
39
+ load_constant(constant_segments(node).first)
58
40
  end
59
41
 
60
42
  ##
@@ -72,7 +54,7 @@ module RubyLint
72
54
  #
73
55
  # @param [String] constant
74
56
  #
75
- def load(constant)
57
+ def load_constant(constant)
76
58
  return if loaded?(constant)
77
59
 
78
60
  filename = constant.snake_case + '.rb'