ruby-lint 1.0.3 → 1.1.0

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 (341) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +2 -5
  4. data/Gemfile +9 -4
  5. data/MANIFEST +32 -28
  6. data/README.md +18 -5
  7. data/Rakefile +7 -3
  8. data/checksum/ruby-lint-1.0.2.gem.sha512 +1 -0
  9. data/checksum/ruby-lint-1.0.3.gem.sha512 +1 -0
  10. data/doc/changelog.md +40 -0
  11. data/doc/definitions.md +182 -0
  12. data/gen/rails/constants.txt +12 -0
  13. data/gen/rails/requires.rb +2 -0
  14. data/gen/stdlib/constants.rb +30 -0
  15. data/gen/stdlib/constants.txt +214 -0
  16. data/gen/stdlib/requires.rb +64 -0
  17. data/lib/ruby-lint.rb +7 -14
  18. data/lib/ruby-lint/analysis/undefined_methods.rb +8 -1
  19. data/lib/ruby-lint/analysis/useless_equality_checks.rb +92 -0
  20. data/lib/ruby-lint/cli.rb +1 -2
  21. data/lib/ruby-lint/cli/analyze.rb +55 -26
  22. data/lib/ruby-lint/cli/cache.rb +60 -0
  23. data/lib/ruby-lint/configuration.rb +10 -4
  24. data/lib/ruby-lint/constant_loader.rb +75 -22
  25. data/lib/ruby-lint/definition/constant_proxy.rb +51 -3
  26. data/lib/ruby-lint/definition/registry.rb +126 -0
  27. data/lib/ruby-lint/definition/ruby_method.rb +0 -11
  28. data/lib/ruby-lint/definition/ruby_object.rb +32 -24
  29. data/lib/ruby-lint/definition_builder/base.rb +9 -12
  30. data/lib/ruby-lint/definition_builder/primitive.rb +1 -1
  31. data/lib/ruby-lint/definition_builder/ruby_array.rb +1 -1
  32. data/lib/ruby-lint/definition_builder/ruby_block.rb +3 -3
  33. data/lib/ruby-lint/definition_builder/ruby_class.rb +2 -2
  34. data/lib/ruby-lint/definition_builder/ruby_hash.rb +1 -1
  35. data/lib/ruby-lint/definition_builder/ruby_method.rb +1 -1
  36. data/lib/ruby-lint/definition_builder/ruby_module.rb +4 -4
  37. data/lib/ruby-lint/definition_generator.rb +12 -2
  38. data/lib/ruby-lint/definitions/core/abbrev.rb +8 -11
  39. data/lib/ruby-lint/definitions/core/argf.rb +9 -7
  40. data/lib/ruby-lint/definitions/core/argument_error.rb +8 -10
  41. data/lib/ruby-lint/definitions/core/argv.rb +9 -9
  42. data/lib/ruby-lint/definitions/core/array.rb +296 -534
  43. data/lib/ruby-lint/definitions/core/base64.rb +22 -25
  44. data/lib/ruby-lint/definitions/core/basic_object.rb +30 -30
  45. data/lib/ruby-lint/definitions/core/basic_socket.rb +341 -455
  46. data/lib/ruby-lint/definitions/core/benchmark.rb +157 -24
  47. data/lib/ruby-lint/definitions/core/bignum.rb +110 -95
  48. data/lib/ruby-lint/definitions/core/binding.rb +38 -35
  49. data/lib/ruby-lint/definitions/core/cgi.rb +333 -49
  50. data/lib/ruby-lint/definitions/core/class.rb +16 -16
  51. data/lib/ruby-lint/definitions/core/common_headers.rb +4 -548
  52. data/lib/ruby-lint/definitions/core/common_libs.rb +4 -421
  53. data/lib/ruby-lint/definitions/core/comparable.rb +28 -29
  54. data/lib/ruby-lint/definitions/core/complex.rb +103 -141
  55. data/lib/ruby-lint/definitions/core/condition_variable.rb +14 -14
  56. data/lib/ruby-lint/definitions/core/config.rb +4 -318
  57. data/lib/ruby-lint/definitions/core/conftest_c.rb +4 -548
  58. data/lib/ruby-lint/definitions/core/coutflag.rb +4 -548
  59. data/lib/ruby-lint/definitions/core/csv.rb +729 -329
  60. data/lib/ruby-lint/definitions/core/data.rb +9 -8
  61. data/lib/ruby-lint/definitions/core/date.rb +452 -526
  62. data/lib/ruby-lint/definitions/core/date_time.rb +234 -303
  63. data/lib/ruby-lint/definitions/core/delegator.rb +57 -48
  64. data/lib/ruby-lint/definitions/core/digest.rb +94 -115
  65. data/lib/ruby-lint/definitions/core/dir.rb +89 -459
  66. data/lib/ruby-lint/definitions/core/drb.rb +531 -36
  67. data/lib/ruby-lint/definitions/core/drb_id_conv.rb +10 -19
  68. data/lib/ruby-lint/definitions/core/drb_object.rb +53 -58
  69. data/lib/ruby-lint/definitions/core/drb_undumped.rb +7 -10
  70. data/lib/ruby-lint/definitions/core/encoding.rb +1026 -1718
  71. data/lib/ruby-lint/definitions/core/encoding_error.rb +9 -8
  72. data/lib/ruby-lint/definitions/core/enumerable.rb +123 -292
  73. data/lib/ruby-lint/definitions/core/enumerator.rb +28 -26
  74. data/lib/ruby-lint/definitions/core/env.rb +8 -9
  75. data/lib/ruby-lint/definitions/core/eoferror.rb +9 -8
  76. data/lib/ruby-lint/definitions/core/erb.rb +201 -226
  77. data/lib/ruby-lint/definitions/core/errno.rb +1593 -2917
  78. data/lib/ruby-lint/definitions/core/etc.rb +86 -107
  79. data/lib/ruby-lint/definitions/core/exception.rb +70 -50
  80. data/lib/ruby-lint/definitions/core/exception_for_matrix.rb +24 -37
  81. data/lib/ruby-lint/definitions/core/export_prefix.rb +4 -16
  82. data/lib/ruby-lint/definitions/core/failed_message.rb +4 -548
  83. data/lib/ruby-lint/definitions/core/false.rb +9 -7
  84. data/lib/ruby-lint/definitions/core/false_class.rb +40 -22
  85. data/lib/ruby-lint/definitions/core/fcntl.rb +120 -7
  86. data/lib/ruby-lint/definitions/core/fiber.rb +25 -26
  87. data/lib/ruby-lint/definitions/core/fiber_error.rb +9 -8
  88. data/lib/ruby-lint/definitions/core/file.rb +1119 -860
  89. data/lib/ruby-lint/definitions/core/file_test.rb +79 -80
  90. data/lib/ruby-lint/definitions/core/file_utils.rb +1203 -765
  91. data/lib/ruby-lint/definitions/core/find.rb +9 -12
  92. data/lib/ruby-lint/definitions/core/fixnum.rb +113 -663
  93. data/lib/ruby-lint/definitions/core/float.rb +171 -2755
  94. data/lib/ruby-lint/definitions/core/float_domain_error.rb +9 -8
  95. data/lib/ruby-lint/definitions/core/forwardable.rb +37 -30
  96. data/lib/ruby-lint/definitions/core/gc.rb +31 -38
  97. data/lib/ruby-lint/definitions/core/gem.rb +2324 -2183
  98. data/lib/ruby-lint/definitions/core/getopt_long.rb +107 -32
  99. data/lib/ruby-lint/definitions/core/gserver.rb +61 -61
  100. data/lib/ruby-lint/definitions/core/hash.rb +354 -1172
  101. data/lib/ruby-lint/definitions/core/hdr_ext.rb +4 -421
  102. data/lib/ruby-lint/definitions/core/index_error.rb +9 -8
  103. data/lib/ruby-lint/definitions/core/install_dirs.rb +4 -421
  104. data/lib/ruby-lint/definitions/core/integer.rb +93 -67
  105. data/lib/ruby-lint/definitions/core/interrupt.rb +11 -11
  106. data/lib/ruby-lint/definitions/core/io.rb +574 -673
  107. data/lib/ruby-lint/definitions/core/ioerror.rb +9 -8
  108. data/lib/ruby-lint/definitions/core/ipaddr.rb +115 -90
  109. data/lib/ruby-lint/definitions/core/ipsocket.rb +301 -472
  110. data/lib/ruby-lint/definitions/core/irb.rb +1206 -34
  111. data/lib/ruby-lint/definitions/core/json.rb +483 -74
  112. data/lib/ruby-lint/definitions/core/kconv.rb +88 -36
  113. data/lib/ruby-lint/definitions/core/kernel.rb +408 -412
  114. data/lib/ruby-lint/definitions/core/key_error.rb +9 -8
  115. data/lib/ruby-lint/definitions/core/libarg.rb +4 -548
  116. data/lib/ruby-lint/definitions/core/libpathflag.rb +4 -548
  117. data/lib/ruby-lint/definitions/core/link_so.rb +4 -548
  118. data/lib/ruby-lint/definitions/core/load_error.rb +24 -25
  119. data/lib/ruby-lint/definitions/core/local_jump_error.rb +9 -8
  120. data/lib/ruby-lint/definitions/core/logger.rb +294 -61
  121. data/lib/ruby-lint/definitions/core/logging.rb +17 -20
  122. data/lib/ruby-lint/definitions/core/make_makefile.rb +548 -384
  123. data/lib/ruby-lint/definitions/core/marshal.rb +260 -358
  124. data/lib/ruby-lint/definitions/core/match_data.rb +51 -48
  125. data/lib/ruby-lint/definitions/core/math.rb +170 -178
  126. data/lib/ruby-lint/definitions/core/matrix.rb +354 -297
  127. data/lib/ruby-lint/definitions/core/method.rb +41 -42
  128. data/lib/ruby-lint/definitions/core/module.rb +219 -223
  129. data/lib/ruby-lint/definitions/core/monitor.rb +26 -28
  130. data/lib/ruby-lint/definitions/core/monitor_mixin.rb +36 -42
  131. data/lib/ruby-lint/definitions/core/mutex.rb +20 -22
  132. data/lib/ruby-lint/definitions/core/mutex_m.rb +24 -27
  133. data/lib/ruby-lint/definitions/core/name_error.rb +13 -13
  134. data/lib/ruby-lint/definitions/core/nil.rb +9 -7
  135. data/lib/ruby-lint/definitions/core/nil_class.rb +47 -31
  136. data/lib/ruby-lint/definitions/core/nkf.rb +76 -9
  137. data/lib/ruby-lint/definitions/core/no_memory_error.rb +9 -8
  138. data/lib/ruby-lint/definitions/core/no_method_error.rb +14 -14
  139. data/lib/ruby-lint/definitions/core/not_implemented_error.rb +9 -8
  140. data/lib/ruby-lint/definitions/core/numeric.rb +88 -80
  141. data/lib/ruby-lint/definitions/core/object.rb +20 -20
  142. data/lib/ruby-lint/definitions/core/object_space.rb +28 -31
  143. data/lib/ruby-lint/definitions/core/observable.rb +20 -23
  144. data/lib/ruby-lint/definitions/core/open3.rb +47 -50
  145. data/lib/ruby-lint/definitions/core/open_ssl.rb +4158 -13
  146. data/lib/ruby-lint/definitions/core/open_struct.rb +40 -37
  147. data/lib/ruby-lint/definitions/core/open_uri.rb +142 -25
  148. data/lib/ruby-lint/definitions/core/option_parser.rb +919 -981
  149. data/lib/ruby-lint/definitions/core/orig_libpath.rb +4 -32
  150. data/lib/ruby-lint/definitions/core/outflag.rb +4 -548
  151. data/lib/ruby-lint/definitions/core/pathname.rb +211 -186
  152. data/lib/ruby-lint/definitions/core/pp.rb +160 -99
  153. data/lib/ruby-lint/definitions/core/pretty_print.rb +170 -56
  154. data/lib/ruby-lint/definitions/core/prime.rb +329 -234
  155. data/lib/ruby-lint/definitions/core/proc.rb +63 -75
  156. data/lib/ruby-lint/definitions/core/process.rb +504 -412
  157. data/lib/ruby-lint/definitions/core/profiler__.rb +13 -16
  158. data/lib/ruby-lint/definitions/core/pstore.rb +66 -36
  159. data/lib/ruby-lint/definitions/core/queue.rb +32 -32
  160. data/lib/ruby-lint/definitions/core/random.rb +29 -29
  161. data/lib/ruby-lint/definitions/core/range.rb +123 -77
  162. data/lib/ruby-lint/definitions/core/range_error.rb +9 -8
  163. data/lib/ruby-lint/definitions/core/rational.rb +84 -67
  164. data/lib/ruby-lint/definitions/core/rb_config.rb +18 -29
  165. data/lib/ruby-lint/definitions/core/readline.rb +85 -41
  166. data/lib/ruby-lint/definitions/core/regexp.rb +239 -293
  167. data/lib/ruby-lint/definitions/core/regexp_error.rb +9 -8
  168. data/lib/ruby-lint/definitions/core/resolv.rb +1365 -38
  169. data/lib/ruby-lint/definitions/core/rpathflag.rb +4 -548
  170. data/lib/ruby-lint/definitions/core/ruby_copyright.rb +9 -9
  171. data/lib/ruby-lint/definitions/core/ruby_description.rb +9 -9
  172. data/lib/ruby-lint/definitions/core/ruby_engine.rb +9 -9
  173. data/lib/ruby-lint/definitions/core/ruby_patchlevel.rb +9 -9
  174. data/lib/ruby-lint/definitions/core/ruby_platform.rb +9 -9
  175. data/lib/ruby-lint/definitions/core/ruby_release_date.rb +9 -9
  176. data/lib/ruby-lint/definitions/core/ruby_revision.rb +4 -246
  177. data/lib/ruby-lint/definitions/core/ruby_version.rb +9 -9
  178. data/lib/ruby-lint/definitions/core/runtime_error.rb +9 -8
  179. data/lib/ruby-lint/definitions/core/scan_error.rb +9 -8
  180. data/lib/ruby-lint/definitions/core/scanf.rb +83 -7
  181. data/lib/ruby-lint/definitions/core/script_error.rb +9 -8
  182. data/lib/ruby-lint/definitions/core/secure_random.rb +22 -25
  183. data/lib/ruby-lint/definitions/core/security_error.rb +9 -8
  184. data/lib/ruby-lint/definitions/core/set.rb +154 -504
  185. data/lib/ruby-lint/definitions/core/shellwords.rb +27 -28
  186. data/lib/ruby-lint/definitions/core/signal.rb +21 -29
  187. data/lib/ruby-lint/definitions/core/signal_exception.rb +15 -15
  188. data/lib/ruby-lint/definitions/core/simple_delegator.rb +10 -26
  189. data/lib/ruby-lint/definitions/core/single_forwardable.rb +35 -38
  190. data/lib/ruby-lint/definitions/core/singleton.rb +21 -28
  191. data/lib/ruby-lint/definitions/core/sized_queue.rb +35 -31
  192. data/lib/ruby-lint/definitions/core/socket.rb +2942 -438
  193. data/lib/ruby-lint/definitions/core/socket_error.rb +4 -54
  194. data/lib/ruby-lint/definitions/core/sorted_set.rb +49 -263
  195. data/lib/ruby-lint/definitions/core/src_ext.rb +4 -421
  196. data/lib/ruby-lint/definitions/core/standard_error.rb +9 -8
  197. data/lib/ruby-lint/definitions/core/stderr.rb +9 -9
  198. data/lib/ruby-lint/definitions/core/stdin.rb +9 -9
  199. data/lib/ruby-lint/definitions/core/stdout.rb +9 -9
  200. data/lib/ruby-lint/definitions/core/stop_iteration.rb +10 -8
  201. data/lib/ruby-lint/definitions/core/string.rb +451 -1222
  202. data/lib/ruby-lint/definitions/core/string_io.rb +226 -518
  203. data/lib/ruby-lint/definitions/core/string_scanner.rb +107 -108
  204. data/lib/ruby-lint/definitions/core/struct.rb +113 -761
  205. data/lib/ruby-lint/definitions/core/syck.rb +1292 -25
  206. data/lib/ruby-lint/definitions/core/symbol.rb +78 -59
  207. data/lib/ruby-lint/definitions/core/syntax_error.rb +23 -33
  208. data/lib/ruby-lint/definitions/core/system_call_error.rb +26 -24
  209. data/lib/ruby-lint/definitions/core/system_exit.rb +15 -15
  210. data/lib/ruby-lint/definitions/core/system_stack_error.rb +9 -8
  211. data/lib/ruby-lint/definitions/core/tcpserver.rb +291 -486
  212. data/lib/ruby-lint/definitions/core/tcpsocket.rb +302 -483
  213. data/lib/ruby-lint/definitions/core/tempfile.rb +39 -832
  214. data/lib/ruby-lint/definitions/core/th_wait.rb +35 -70
  215. data/lib/ruby-lint/definitions/core/thread.rb +131 -144
  216. data/lib/ruby-lint/definitions/core/thread_error.rb +9 -8
  217. data/lib/ruby-lint/definitions/core/thread_group.rb +23 -16
  218. data/lib/ruby-lint/definitions/core/threads_wait.rb +43 -63
  219. data/lib/ruby-lint/definitions/core/time.rb +236 -159
  220. data/lib/ruby-lint/definitions/core/timeout.rb +40 -14
  221. data/lib/ruby-lint/definitions/core/timeout_error.rb +4 -54
  222. data/lib/ruby-lint/definitions/core/toplevel_binding.rb +9 -7
  223. data/lib/ruby-lint/definitions/core/true.rb +9 -7
  224. data/lib/ruby-lint/definitions/core/true_class.rb +40 -22
  225. data/lib/ruby-lint/definitions/core/try_link.rb +4 -548
  226. data/lib/ruby-lint/definitions/core/tsort.rb +21 -19
  227. data/lib/ruby-lint/definitions/core/type_error.rb +9 -8
  228. data/lib/ruby-lint/definitions/core/udpsocket.rb +302 -487
  229. data/lib/ruby-lint/definitions/core/unbound_method.rb +35 -36
  230. data/lib/ruby-lint/definitions/core/universal_ints.rb +4 -421
  231. data/lib/ruby-lint/definitions/core/unixserver.rb +291 -490
  232. data/lib/ruby-lint/definitions/core/unixsocket.rb +314 -476
  233. data/lib/ruby-lint/definitions/core/uri.rb +1309 -38
  234. data/lib/ruby-lint/definitions/core/vector.rb +143 -242
  235. data/lib/ruby-lint/definitions/core/weak_ref.rb +29 -32
  236. data/lib/ruby-lint/definitions/core/webrick.rb +2430 -7
  237. data/lib/ruby-lint/definitions/core/xmlrpc.rb +5 -7
  238. data/lib/ruby-lint/definitions/core/yaml.rb +109 -2325
  239. data/lib/ruby-lint/definitions/core/zero_division_error.rb +9 -8
  240. data/lib/ruby-lint/definitions/core/zlib.rb +272 -8526
  241. data/lib/ruby-lint/definitions/gems/.gitkeep +0 -0
  242. data/lib/ruby-lint/definitions/gems/devise.rb +2271 -0
  243. data/lib/ruby-lint/definitions/gems/nokogiri.rb +7668 -0
  244. data/lib/ruby-lint/definitions/rails/abstract_controller.rb +508 -322
  245. data/lib/ruby-lint/definitions/rails/action_controller.rb +2252 -4462
  246. data/lib/ruby-lint/definitions/rails/action_dispatch.rb +3448 -1846
  247. data/lib/ruby-lint/definitions/rails/action_mailer.rb +750 -1349
  248. data/lib/ruby-lint/definitions/rails/action_pack.rb +31 -14
  249. data/lib/ruby-lint/definitions/rails/action_view.rb +5788 -5748
  250. data/lib/ruby-lint/definitions/rails/active_model.rb +1015 -1065
  251. data/lib/ruby-lint/definitions/rails/active_record.rb +8080 -8075
  252. data/lib/ruby-lint/definitions/rails/active_support.rb +3844 -4153
  253. data/lib/ruby-lint/definitions/rails/arel.rb +6752 -2301
  254. data/lib/ruby-lint/definitions/rails/rails.rb +1553 -2383
  255. data/lib/ruby-lint/definitions/rails/sprockets.rb +1131 -3140
  256. data/lib/ruby-lint/file_list.rb +43 -0
  257. data/lib/ruby-lint/file_scanner.rb +3 -3
  258. data/lib/ruby-lint/generated_constant.rb +5 -1
  259. data/lib/ruby-lint/inspector.rb +108 -46
  260. data/lib/ruby-lint/method_call/attribute.rb +3 -1
  261. data/lib/ruby-lint/rake_task.rb +98 -0
  262. data/lib/ruby-lint/ruby_lint.rb +11 -0
  263. data/lib/ruby-lint/runner.rb +0 -11
  264. data/lib/ruby-lint/template/definition.erb +26 -19
  265. data/lib/ruby-lint/template/scope.rb +12 -0
  266. data/lib/ruby-lint/variable_predicates.rb +14 -0
  267. data/lib/ruby-lint/version.rb +1 -1
  268. data/lib/ruby-lint/virtual_machine.rb +82 -46
  269. data/ruby-lint.gemspec +3 -14
  270. data/spec/ruby-lint/analysis/undefined_methods_spec.rb +20 -3
  271. data/spec/ruby-lint/analysis/useless_equality_checks_spec.rb +107 -0
  272. data/spec/ruby-lint/configuration_spec.rb +20 -0
  273. data/spec/ruby-lint/constant_loader_spec.rb +79 -0
  274. data/spec/ruby-lint/definition/constant_proxy_spec.rb +65 -34
  275. data/spec/ruby-lint/definition/registry_spec.rb +106 -0
  276. data/spec/ruby-lint/definition/ruby_object_spec.rb +25 -25
  277. data/spec/ruby-lint/definition_builder/primitive_spec.rb +10 -10
  278. data/spec/ruby-lint/definition_builder/ruby_class_spec.rb +18 -19
  279. data/spec/ruby-lint/definition_builder/ruby_method_spec.rb +12 -12
  280. data/spec/ruby-lint/definition_builder/ruby_module_spec.rb +14 -14
  281. data/spec/ruby-lint/definitions/argv_spec.rb +3 -2
  282. data/spec/ruby-lint/definitions/env_spec.rb +5 -3
  283. data/spec/ruby-lint/definitions/file_spec.rb +17 -0
  284. data/spec/ruby-lint/definitions/fixnum_spec.rb +18 -0
  285. data/spec/ruby-lint/definitions/io_spec.rb +5 -3
  286. data/spec/ruby-lint/definitions/kernel_spec.rb +18 -0
  287. data/spec/ruby-lint/definitions/range_spec.rb +21 -0
  288. data/spec/ruby-lint/definitions/string_spec.rb +20 -0
  289. data/spec/ruby-lint/file_list_spec.rb +25 -0
  290. data/spec/ruby-lint/file_scanner_spec.rb +12 -0
  291. data/spec/ruby-lint/inspector_spec.rb +203 -23
  292. data/spec/ruby-lint/method_call/.gitkeep +0 -0
  293. data/spec/ruby-lint/variable_predicates_spec.rb +30 -0
  294. data/spec/ruby-lint/virtual_machine/associate_nodes_spec.rb +6 -4
  295. data/spec/ruby-lint/virtual_machine/autoloading_spec.rb +3 -16
  296. data/spec/ruby-lint/virtual_machine/classes/redefining_spec.rb +28 -1
  297. data/spec/ruby-lint/virtual_machine/complex/rails_spec.rb +12 -9
  298. data/spec/ruby-lint/virtual_machine/global_variables_spec.rb +8 -5
  299. data/spec/ruby-lint/virtual_machine/method_call_tracking_spec.rb +0 -7
  300. data/spec/ruby-lint/virtual_machine/methods/attr_spec.rb +66 -0
  301. data/spec/ruby-lint/virtual_machine/methods/calls_spec.rb +25 -0
  302. data/spec/ruby-lint/virtual_machine/methods/define_method_spec.rb +1 -1
  303. data/spec/ruby-lint/virtual_machine/methods/docstrings_spec.rb +20 -9
  304. data/spec/ruby-lint/virtual_machine/methods/kernel_spec.rb +25 -0
  305. data/spec/ruby-lint/virtual_machine/methods/patching_spec.rb +0 -6
  306. data/spec/ruby-lint/virtual_machine/methods/square_bracket_spec.rb +32 -0
  307. data/spec/ruby-lint/virtual_machine/self_spec.rb +37 -0
  308. data/spec/spec_helper.rb +0 -1
  309. data/spec/support/building.rb +0 -4
  310. data/spec/support/definitions.rb +16 -0
  311. data/task/generate.rake +35 -33
  312. data/task/todo.rake +1 -1
  313. metadata +73 -100
  314. data/lib/ruby-lint/cli/ast.rb +0 -50
  315. data/lib/ruby-lint/cli/plot.rb +0 -94
  316. data/lib/ruby-lint/definitions/core/arg0.rb +0 -9
  317. data/lib/ruby-lint/definitions/core/autoload.rb +0 -41
  318. data/lib/ruby-lint/definitions/core/continuation.rb +0 -10
  319. data/lib/ruby-lint/definitions/core/default_record_separator.rb +0 -9
  320. data/lib/ruby-lint/definitions/core/fatal_error.rb +0 -10
  321. data/lib/ruby-lint/definitions/core/file_list.rb +0 -729
  322. data/lib/ruby-lint/definitions/core/immediate_value.rb +0 -21
  323. data/lib/ruby-lint/definitions/core/md5.rb +0 -80
  324. data/lib/ruby-lint/definitions/core/memory_segmention_error.rb +0 -10
  325. data/lib/ruby-lint/definitions/core/precision.rb +0 -23
  326. data/lib/ruby-lint/definitions/core/primitive_failure.rb +0 -10
  327. data/lib/ruby-lint/definitions/core/psych.rb +0 -139
  328. data/lib/ruby-lint/definitions/core/rake.rb +0 -4786
  329. data/lib/ruby-lint/definitions/core/rake_file_utils.rb +0 -205
  330. data/lib/ruby-lint/definitions/core/rakeversion.rb +0 -9
  331. data/lib/ruby-lint/definitions/core/rdoc.rb +0 -15
  332. data/lib/ruby-lint/definitions/core/rexml.rb +0 -13
  333. data/lib/ruby-lint/definitions/core/rss.rb +0 -13
  334. data/lib/ruby-lint/definitions/core/sha1.rb +0 -80
  335. data/lib/ruby-lint/definitions/core/unmarshalable.rb +0 -15
  336. data/lib/ruby-lint/definitions/core/unsupported_library_error.rb +0 -10
  337. data/lib/ruby-lint/definitions/global_variables.rb +0 -9
  338. data/lib/ruby-lint/definitions/rails.rb +0 -12
  339. data/lib/ruby-lint/global_scope.rb +0 -56
  340. data/spec/ruby-lint/cli/ast_spec.rb +0 -23
  341. data/spec/ruby-lint/method_call/assign_member_spec.rb +0 -25
@@ -0,0 +1,43 @@
1
+ module RubyLint
2
+ ##
3
+ # The FileList class acts as a small wrapper around `Dir.glob` and is mainly
4
+ # used to turn a list of filenames/directory names into a list of just file
5
+ # names (excluding ones that don't exist).
6
+ #
7
+ class FileList
8
+ ##
9
+ # @param [Array] files
10
+ # @return [Array]
11
+ # @raise [Errno::ENOENT] Raised if a file or directory does not exist.
12
+ #
13
+ def process(files)
14
+ existing = []
15
+
16
+ files.each do |file|
17
+ file = File.expand_path(file)
18
+
19
+ if File.file?(file)
20
+ existing << file
21
+
22
+ elsif File.directory?(file)
23
+ existing = existing | glob_files(file)
24
+
25
+ else
26
+ raise Errno::ENOENT, "The file/directory #{file} does not exist"
27
+ end
28
+ end
29
+
30
+ return existing
31
+ end
32
+
33
+ ##
34
+ # Returns a list of Ruby files in the given directory. This list includes
35
+ # deeply nested files.
36
+ #
37
+ # @return [Array]
38
+ #
39
+ def glob_files(directory)
40
+ return Dir.glob(File.join(directory, '**/*.rb'))
41
+ end
42
+ end # FileList
43
+ end # RubyLint
@@ -69,15 +69,15 @@ module RubyLint
69
69
  return @constant_paths_cache[constant]
70
70
  end
71
71
 
72
- private
73
-
74
72
  ##
75
73
  # @return [Array]
76
74
  #
77
75
  def glob_ruby_files
78
- return Dir.glob("#{directories.join(',')}/**/*.rb")
76
+ return Dir.glob("{#{directories.join(',')}}/**/*.rb")
79
77
  end
80
78
 
79
+ private
80
+
81
81
  ##
82
82
  # Searches all the files that could potentially define the given constant
83
83
  # and caches them.
@@ -15,8 +15,11 @@ module RubyLint
15
15
  # @!attribute [r] superclass
16
16
  # @return [String]
17
17
  #
18
+ # @!attribute [r] modules
19
+ # @return [Array]
20
+ #
18
21
  class GeneratedConstant
19
- attr_reader :methods, :name, :constant, :superclass
22
+ attr_reader :methods, :name, :constant, :superclass, :modules
20
23
 
21
24
  ##
22
25
  # @param [Hash] attributes
@@ -26,6 +29,7 @@ module RubyLint
26
29
  instance_variable_set("@#{key}", value)
27
30
  end
28
31
 
32
+ @modules ||= []
29
33
  @methods ||= []
30
34
  @superclass ||= 'Object'
31
35
  end
@@ -8,6 +8,7 @@ module RubyLint
8
8
  #
9
9
  # @!attribute [r] constant
10
10
  # @return [Class]
11
+ #
11
12
  # @!attribute [r] constant_name
12
13
  # @return [String]
13
14
  #
@@ -18,70 +19,71 @@ module RubyLint
18
19
  # @param [String|Class] constant
19
20
  #
20
21
  def initialize(constant)
21
- @constant_name = constant
22
+ @constant_name = constant.to_s
22
23
 
23
24
  if constant.is_a?(String)
24
- constant = resolve_constant(constant)
25
+ @constant = resolve_constant(constant)
26
+ else
27
+ @constant = constant
25
28
  end
26
-
27
- @constant = constant
28
29
  end
29
30
 
30
31
  ##
31
- # Returns an Array containing all child constants and their children
32
+ # Returns an Array containing all constants and their child constants
32
33
  # (recursively).
33
34
  #
34
- # The constants returned by this method are returned as String instances
35
- # containing the full path (e.g. `Encoding::BINARY` instead of `BINARY`).
36
- #
37
35
  # @param [Class] source
38
36
  # @param [Array] ignore
39
37
  # @return [Array<String>]
40
38
  #
41
39
  def inspect_constants(source = constant, ignore = [])
40
+ names = []
42
41
  source_name = source.to_s
43
- constants = []
44
42
  have_children = []
45
43
  include_source = source != Object
46
44
 
47
- if include_source
48
- constants << source_name
49
- ignore = ignore + [source.to_s]
45
+ if include_source and !ignore.include?(source_name)
46
+ names << source_name
47
+ ignore << source_name
50
48
  end
51
49
 
52
50
  source.constants.each do |name|
53
- next unless source.const_defined?(name)
51
+ next if skip_constant?(source, name)
54
52
 
55
- # FIXME: When using autoload/Rails in some cases this will trigger a
56
- # load error. I have no idea why.
53
+ full_name = include_source ? "#{source_name}::#{name}" : name.to_s
54
+
55
+ # In certain cases this code tries to load a constant that apparently
56
+ # *is* defined but craps out upon error (e.g. Bundler::Specification).
57
57
  begin
58
58
  constant = source.const_get(name)
59
- rescue LoadError => error
59
+ rescue Exception => error
60
60
  warn error.message
61
-
62
61
  next
63
62
  end
64
63
 
65
- name = name.to_s
66
- full_name = include_source ? "#{source_name}::#{name}" : name
67
-
68
- next if ignore.include?(full_name)
64
+ # Skip those that we've already processed.
65
+ if ignore.include?(full_name) or source == constant
66
+ next
67
+ end
69
68
 
70
- ignore << constant
71
- constants << full_name
69
+ names << full_name
70
+ ignore << full_name
71
+ have_children << constant if process_child_constants?(constant)
72
+ end
72
73
 
73
- if process_child_constants?(source, constant)
74
- have_children << constant
75
- end
74
+ have_children.each do |const|
75
+ names |= inspect_constants(const, ignore)
76
76
  end
77
77
 
78
- have_children.each do |constant|
79
- inspect_constants(constant, ignore).each do |child|
80
- constants << child unless constants.include?(child)
81
- end
78
+ # Reject every constant that, if we should include the source name, was
79
+ # not defined under that constant. This applies on for example Rubinius
80
+ # since `Range::Enumerator` is a constant that points to
81
+ # `Enumerable::Enumerator`.
82
+ if include_source
83
+ names = names.select { |name| name.start_with?(source_name) }
82
84
  end
83
85
 
84
- return constants
86
+ return names
85
87
  end
86
88
 
87
89
  ##
@@ -114,16 +116,45 @@ module RubyLint
114
116
  return methods.sort_by(&:name)
115
117
  end
116
118
 
119
+ ##
120
+ # Returns the modules that are included in the constant.
121
+ #
122
+ # @return [Array]
123
+ #
124
+ def inspect_modules
125
+ modules = []
126
+
127
+ if constant.respond_to?(:ancestors)
128
+ parent = inspect_superclass
129
+
130
+ # Take all the modules included *directly* into the constant.
131
+ modules = constant.ancestors.take_while do |ancestor|
132
+ parent && ancestor != parent
133
+ end
134
+
135
+ # Get rid of non Module instances and modules that don't have a name.
136
+ modules = modules.select do |mod|
137
+ mod.instance_of?(Module) && mod.name
138
+ end
139
+ end
140
+
141
+ return modules
142
+ end
143
+
117
144
  ##
118
145
  # Returns the superclass of the current constant or `nil` if there is none.
119
146
  #
120
147
  # @return [Mixed]
121
148
  #
122
149
  def inspect_superclass
123
- return constant.respond_to?(:superclass) ? constant.superclass : nil
124
- end
150
+ parent = nil
125
151
 
126
- private
152
+ if constant.respond_to?(:superclass) && constant.superclass.name
153
+ return constant.superclass
154
+ end
155
+
156
+ return parent
157
+ end
127
158
 
128
159
  ##
129
160
  # Gets the methods of the current constant minus those defined in Object.
@@ -132,30 +163,61 @@ module RubyLint
132
163
  # @return [Array]
133
164
  #
134
165
  def get_methods(getter = :methods)
135
- diff = constant.send(getter) - Object.send(getter)
136
- methods = diff | constant.send(getter, false)
166
+ parent = inspect_superclass || Object
167
+ diff = constant.__send__(getter, false) -
168
+ parent.__send__(getter, false)
169
+
170
+ methods = diff | constant.__send__(getter, false)
137
171
 
138
172
  # If the constant manually defines the initialize method (= private)
139
173
  # we'll also want to include it.
140
- if getter == :instance_methods \
141
- and constant.is_a?(Class) \
142
- and constant.private_method_defined?(:initialize) \
143
- and constant.instance_method(:initialize).source_location
174
+ if include_initialize?(getter)
144
175
  methods = methods | [:initialize]
145
176
  end
146
177
 
147
178
  return methods
148
179
  end
149
180
 
181
+ private
182
+
183
+ ##
184
+ # @param [Symbol] getter
185
+ # @return [TrueClass|FalseClass]
186
+ #
187
+ def include_initialize?(getter)
188
+ return getter == :instance_methods \
189
+ && constant.is_a?(Class) \
190
+ && constant.private_instance_methods(false).include?(:initialize) \
191
+ && constant.instance_method(:initialize).source_location
192
+ end
193
+
194
+ ##
195
+ # @param [Module|Class] const
196
+ # @param [Symbol] child_name
197
+ # @return [TrueClass|FalseClass]
198
+ #
199
+ def skip_constant?(const, child_name)
200
+ # Module and Class defines the same child constants as Object but in a
201
+ # recursive manner. This is a bit of a dirty way to prevent this code
202
+ # from going into an infinite loop.
203
+ if const == Module or const == Class
204
+ return true
205
+ end
206
+
207
+ # Config is deprecated and triggers a warning.
208
+ if const == Object and child_name == :Config
209
+ return true
210
+ end
211
+
212
+ return !const.const_defined?(child_name)
213
+ end
214
+
150
215
  ##
151
- # @param [Class] source
152
216
  # @param [Class] constant
153
217
  # @return [TrueClass|FalseClass]
154
218
  #
155
- def process_child_constants?(source, constant)
156
- return constant.respond_to?(:consts) \
157
- && constant != source \
158
- && !constant.constants.empty?
219
+ def process_child_constants?(constant)
220
+ return constant.respond_to?(:constants) && !constant.constants.empty?
159
221
  end
160
222
 
161
223
  ##
@@ -166,7 +228,7 @@ module RubyLint
166
228
  # @return [UnboundMethod]
167
229
  #
168
230
  def method_information(type, name)
169
- return constant.send(type, name)
231
+ return constant.__send__(type, name)
170
232
  end
171
233
 
172
234
  ##
@@ -85,7 +85,9 @@ module RubyLint
85
85
  name = name + '='
86
86
  end
87
87
 
88
- context.define_instance_method(name)
88
+ context.define_instance_method(name) do |method|
89
+ method.define_argument('value') if setter
90
+ end
89
91
 
90
92
  unless context.has_definition?(:ivar, ivar_name)
91
93
  ivar = Definition::RubyObject.new(
@@ -0,0 +1,98 @@
1
+ require_relative '../ruby-lint'
2
+ require 'rake/tasklib'
3
+
4
+ module RubyLint
5
+ ##
6
+ # Class for easily creating Rake tasks without having to shell out to the
7
+ # commandline executable.
8
+ #
9
+ # Basic usage:
10
+ #
11
+ # require 'ruby-lint/rake_task'
12
+ #
13
+ # RubyLint::RakeTask.new do |task|
14
+ # task.name = 'lint'
15
+ # task.files = ['lib/my-project-name']
16
+ # end
17
+ #
18
+ # @!attribute [rw] name
19
+ # @return [String] The name of the task.
20
+ #
21
+ # @!attribute [rw] description
22
+ # @return [String] The description of the task.
23
+ #
24
+ # @!attribute [rw] debug
25
+ # @return [TrueClass|FalseClass] Enables/disables debugging mode.
26
+ #
27
+ # @!attribute [rw] files
28
+ # @return [Array] The files to check.
29
+ #
30
+ # @!attribute [rw] configuration
31
+ # @return [String] Path to the configuration file to use.
32
+ #
33
+ class RakeTask < Rake::TaskLib
34
+ attr_accessor :name, :description, :debug, :files, :configuration
35
+
36
+ ##
37
+ # @param [Hash] options
38
+ #
39
+ def initialize(options = {})
40
+ @name = 'lint'
41
+ @description = 'Check source code using ruby-lint'
42
+
43
+ options.each do |key, value|
44
+ instance_variable_set("@#{key}", value) if respond_to?(key)
45
+ end
46
+
47
+ yield self if block_given?
48
+
49
+ desc(description)
50
+ task(name) do
51
+ validate!
52
+ run_task
53
+ end
54
+ end
55
+
56
+ ##
57
+ # Checks if the task is configured properly, exists with code 1 if this
58
+ # isn't the case.
59
+ #
60
+ def validate!
61
+ if configuration and !File.file?(configuration)
62
+ abort "The configuration file #{configuration} does not exist"
63
+ end
64
+
65
+ if files.empty?
66
+ abort 'No files to check were specified'
67
+ end
68
+ end
69
+
70
+ ##
71
+ # Processes a list of files and writes the output to STDOUT.
72
+ #
73
+ def run_task
74
+ config = create_configuration
75
+ runner = RubyLint::Runner.new(config)
76
+ list = FileList.new
77
+ output = runner.analyze(list.process(files))
78
+
79
+ puts(output) unless output.empty?
80
+ end
81
+
82
+ ##
83
+ # @return [RubyLint::Configuration]
84
+ #
85
+ def create_configuration
86
+ config_files = RubyLint::Configuration.configuration_files
87
+
88
+ if configuration
89
+ config_files = [configuration]
90
+ end
91
+
92
+ config = RubyLint::Configuration.load_from_file(config_files)
93
+ config.debug = debug
94
+
95
+ return config
96
+ end
97
+ end # RakeTask
98
+ end # RubyLint
@@ -0,0 +1,11 @@
1
+ module RubyLint
2
+ ##
3
+ # Returns the global registry instance used for registering and applying
4
+ # definitions.
5
+ #
6
+ # @return [RubyLint::Definition::Registry]
7
+ #
8
+ def self.registry
9
+ return @registry ||= Definition::Registry.new
10
+ end
11
+ end # RubyLint
@@ -67,8 +67,6 @@ module RubyLint
67
67
 
68
68
  comments.merge!(extra_comments)
69
69
 
70
- autoload_constants(extra_ast)
71
-
72
70
  vm = run_vm(extra_ast, comments)
73
71
 
74
72
  run_analysis(ast, vm, report)
@@ -88,15 +86,6 @@ module RubyLint
88
86
  return ast, NodeHash.from_hash(comments)
89
87
  end
90
88
 
91
- ##
92
- # Automatically loads definitions using {RubyLint::ConstantLoader}.
93
- #
94
- # @param [Array] nodes
95
- #
96
- def autoload_constants(nodes)
97
- nodes.each { |node| GlobalScope.constant_loader.iterate(node) }
98
- end
99
-
100
89
  ##
101
90
  # Processes external Ruby files using {RubyLint::FileLoader}. The return
102
91
  # value is a collection of AST nodes and a Hash containing all the