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
@@ -1,5 +1,4 @@
1
1
  require 'slop'
2
2
  require_relative 'cli/base'
3
3
  require_relative 'cli/analyze'
4
- require_relative 'cli/ast'
5
- require_relative 'cli/plot'
4
+ require_relative 'cli/cache'
@@ -75,33 +75,10 @@ Examples:
75
75
  # @return [Array]
76
76
  #
77
77
  def extract_files(files)
78
- existing = []
78
+ return RubyLint::FileList.new.process(files)
79
79
 
80
- files.each do |file|
81
- file = File.expand_path(file)
82
-
83
- if File.file?(file)
84
- existing << file
85
-
86
- elsif File.directory?(file)
87
- existing = existing | glob_files(file)
88
-
89
- else
90
- abort "The file/directory #{file} does not exist"
91
- end
92
- end
93
-
94
- return existing
95
- end
96
-
97
- ##
98
- # Returns a list of Ruby files in the given directory. This list includes
99
- # deeply nested files.
100
- #
101
- # @return [Array]
102
- #
103
- def glob_files(directory)
104
- return Dir.glob(File.join(directory, '**/*.rb'))
80
+ rescue Errno::ENOENT => error
81
+ abort error.message
105
82
  end
106
83
 
107
84
  ##
@@ -130,6 +107,22 @@ Examples:
130
107
  @output_destination = destination
131
108
  end
132
109
 
110
+ # The stdout and stderr methods mainly exist to make testing a bit easier.
111
+
112
+ ##
113
+ # @return [IO]
114
+ #
115
+ def stdout
116
+ return STDOUT
117
+ end
118
+
119
+ ##
120
+ # @return [IO]
121
+ #
122
+ def stderr
123
+ return STDERR
124
+ end
125
+
133
126
  ##
134
127
  # @param [RubyLint::Configuration] configuration
135
128
  # @param [Hash] opts
@@ -160,6 +153,40 @@ Examples:
160
153
  "(#{memory_kb.round(2)} KB)"
161
154
  end
162
155
 
156
+ ##
157
+ # Shows a lump of debugging information before the rest of the output.
158
+ #
159
+ # @param [RubyLint::Configuration] config
160
+ #
161
+ #:nocov:
162
+ def debug_header(config)
163
+ directories = config.directories.map do |dir|
164
+ File.directory?(dir) ? "#{dir}: exists" : "#{dir}: doesn't exist"
165
+ end
166
+
167
+ directories = directories.empty? ? 'None' : directories.join("\n")
168
+
169
+ stderr.puts <<-EOF.strip
170
+ ruby: #{RUBY_DESCRIPTION}
171
+ ruby-lint: #{RubyLint::VERSION}
172
+ directory: #{Dir.pwd}
173
+
174
+ Caching:
175
+
176
+ enabled: #{config.enable_cache}
177
+ directory: #{config.cache_directory}
178
+
179
+ Directories:
180
+
181
+ #{directories}
182
+
183
+ ------
184
+ EOF
185
+
186
+ stderr.puts
187
+ end
188
+ #:nocov:
189
+
163
190
  run do |opts, args|
164
191
  abort 'You must specify at least one file to analyze' if args.empty?
165
192
 
@@ -169,6 +196,8 @@ Examples:
169
196
 
170
197
  configure(configuration, opts)
171
198
 
199
+ debug_header(configuration) if configuration.debug
200
+
172
201
  runner = RubyLint::Runner.new(configuration)
173
202
  output = runner.analyze(files)
174
203
  exec_time = Time.now.to_f - start_time
@@ -0,0 +1,60 @@
1
+ RubyLint::CLI.options.command :cache do
2
+ banner 'Usage: ruby-lint cache [COMMAND] [OPTIONS]'
3
+ description 'Manages ruby-lint cache files'
4
+
5
+ separator <<-EOF.chomp
6
+
7
+ About:
8
+
9
+ This command can be used to view and manage cache entries created by
10
+ ruby-lint. This command is mainly meant to be used for debugging purposes.
11
+
12
+ Examples:
13
+
14
+ Print a summary of the cache:
15
+
16
+ $ ruby-lint cache
17
+
18
+ Clear the cache:
19
+
20
+ $ ruby-lint cache clear
21
+ EOF
22
+
23
+ separator RubyLint::CLI::OPTIONS_HEADER
24
+
25
+ RubyLint::CLI.help_option(self)
26
+
27
+ run do
28
+ config = RubyLint::Configuration.load_from_file
29
+ pattern = File.join(config.cache_directory, '*.cache')
30
+ files = Dir.glob(pattern)
31
+ size = files.map { |file| File.size(file) }.inject(:+).to_f
32
+
33
+ size_kb = (size / 1024).round(2)
34
+ size_mb = (size / 1024 / 1024).round(2)
35
+
36
+ puts <<-EOF.strip
37
+ Directory: #{config.cache_directory}
38
+ Total files: #{files.length}
39
+ Total size: #{size_kb} KB (#{size_mb} MB)
40
+ EOF
41
+ end
42
+
43
+ command :clear do
44
+ banner 'Usage: ruby-lint cache clear [OPTIONS]'
45
+ description 'Removes all the cache files'
46
+
47
+ separator RubyLint::CLI::OPTIONS_HEADER
48
+
49
+ RubyLint::CLI.help_option(self)
50
+
51
+ run do
52
+ config = RubyLint::Configuration.load_from_file
53
+ pattern = File.join(config.cache_directory, '*.cache')
54
+
55
+ Dir.glob(pattern).each do |file|
56
+ File.unlink(file)
57
+ end
58
+ end
59
+ end
60
+ end
@@ -201,13 +201,19 @@ module RubyLint
201
201
  # @param [Array] directories
202
202
  #
203
203
  def directories=(directories)
204
- directories.each do |dir|
205
- unless File.directory?(dir)
206
- raise ArgumentError, "The directory #{dir} does not exist"
204
+ valid = []
205
+
206
+ if directories
207
+ directories.each do |dir|
208
+ unless File.directory?(dir)
209
+ raise ArgumentError, "The directory #{dir} does not exist"
210
+ end
211
+
212
+ valid << File.expand_path(dir)
207
213
  end
208
214
  end
209
215
 
210
- @directories = directories
216
+ @directories = valid
211
217
  end
212
218
 
213
219
  ##
@@ -1,33 +1,75 @@
1
1
  module RubyLint
2
2
  ##
3
- # The ConstantLoader class tries to pre-load various constants in a given
4
- # file before the definitions are being built and analysis is performed.
3
+ # The ConstantLoader is an iterator class (using {RubyLint::Iterator}) that
4
+ # iterates over an AST and tries to load the corresponding built-in
5
+ # definitions. For example, if it finds a constant node for the `ERB` class
6
+ # it will apply the definitions for `ERB` to the ones set in
7
+ # {RubyLint::ConstantLoader#definitions}.
5
8
  #
6
- # Note that this pre-loader is rather basic and as such there are chances you
7
- # still have to manually require definitions to ensure that they are being
8
- # used.
9
+ # This class also takes care of bootstrapping the target definitions so that
10
+ # the bare minimum definitions (e.g. Module and Object) are always available.
11
+ # Global variables are also bootstrapped.
9
12
  #
10
13
  # @!attribute [r] loaded
11
- # @return [Hash] Hash containing the loaded constants.
14
+ # @return [Set] Set containing the loaded constants.
15
+ #
16
+ # @!attribute [r] definitions
17
+ # @return [RubyLint::Definition::RubyObject]
12
18
  #
13
19
  class ConstantLoader < Iterator
14
- attr_reader :loaded
20
+ attr_reader :loaded, :definitions
21
+
22
+ ##
23
+ # Built-in definitions that should be bootstrapped.
24
+ #
25
+ # @return [Array]
26
+ #
27
+ BOOTSTRAP_CONSTS = %w{Module Class Kernel BasicObject Object}
15
28
 
16
29
  ##
17
- # List of directories to search for definition files.
30
+ # List of global variables that should be bootstrapped.
18
31
  #
19
32
  # @return [Array]
20
33
  #
21
- LOAD_PATH = [
22
- File.expand_path('../definitions/core', __FILE__),
23
- File.expand_path('../definitions/rails', __FILE__)
34
+ BOOTSTRAP_GVARS = [
35
+ '$!', '$$', '$&', '$\'', '$*', '$+', '$,', '$-0', '$-F', '$-I', '$-K',
36
+ '$-W', '$-a', '$-d', '$-i', '$-l', '$-p', '$-v', '$-w', '$.', '$/', '$0',
37
+ '$1', '$2', '$3', '$4', '$5', '$6', '$7', '$8', '$9', '$:', '$;', '$<',
38
+ '$=', '$>', '$?', '$@', '$DEBUG', '$FILENAME', '$KCODE',
39
+ '$LOADED_FEATURES', '$LOAD_PATH', '$PROGRAM_NAME', '$SAFE', '$VERBOSE',
40
+ '$\"', '$\\', '$_', '$`', '$stderr', '$stdin', '$stdout', '$~'
24
41
  ]
25
42
 
43
+ ##
44
+ # Bootstraps various core definitions.
45
+ #
46
+ def bootstrap
47
+ types = VariablePredicates::RUBY_CLASSES.values
48
+
49
+ (BOOTSTRAP_CONSTS | types).each do |name|
50
+ load_constant(name)
51
+ end
52
+
53
+ BOOTSTRAP_GVARS.each do |gvar|
54
+ definitions.define_global_variable(gvar)
55
+ end
56
+ end
57
+
58
+ ##
59
+ # Bootstraps various core definitions (Fixnum, Object, etc) and loads the
60
+ # extra constants referred in the supplied AST.
61
+ #
62
+ # @param [Array<RubyLint::AST::Node>] ast
63
+ #
64
+ def run(ast)
65
+ ast.each { |node| iterate(node) }
66
+ end
67
+
26
68
  ##
27
69
  # Called after a new instance of the class is created.
28
70
  #
29
71
  def after_initialize
30
- @loaded = {}
72
+ @loaded = Set.new
31
73
  end
32
74
 
33
75
  ##
@@ -44,7 +86,14 @@ module RubyLint
44
86
  # @return [TrueClass|FalseClass]
45
87
  #
46
88
  def loaded?(constant)
47
- return loaded.key?(constant)
89
+ return loaded.include?(constant)
90
+ end
91
+
92
+ ##
93
+ # @return [RubyLint::Definition::Registry]
94
+ #
95
+ def registry
96
+ return RubyLint.registry
48
97
  end
49
98
 
50
99
  ##
@@ -55,18 +104,22 @@ module RubyLint
55
104
  def load_constant(constant)
56
105
  return if loaded?(constant)
57
106
 
58
- filename = constant.snake_case + '.rb'
107
+ registry.load(constant)
59
108
 
60
- LOAD_PATH.each do |path|
61
- path = File.join(path, filename)
109
+ return unless registry.include?(constant)
62
110
 
63
- if File.file?(path)
64
- require(path)
65
- loaded[constant] = true
111
+ apply(constant)
112
+ end
66
113
 
67
- break
68
- end
69
- end
114
+ private
115
+
116
+ ##
117
+ # @param [String] constant
118
+ #
119
+ def apply(constant)
120
+ loaded << constant
121
+
122
+ registry.apply(constant, definitions)
70
123
  end
71
124
  end # ConstantLoader
72
125
  end # RubyLint
@@ -13,22 +13,32 @@ module RubyLint
13
13
  # @!attribute [r] proxy_name
14
14
  # @return [String]
15
15
  #
16
+ # @!attribute [r] registry
17
+ # @return [RubyLint::Definition::Registry]
18
+ #
16
19
  # @!attribute [r] proxy_definition
17
20
  # @return [RubyLint::Definition::RubyObject]
18
21
  #
19
22
  class ConstantProxy
20
- attr_reader :proxy_source, :proxy_name, :proxy_definition
23
+ include VariablePredicates
24
+
25
+ attr_reader :proxy_source, :proxy_name, :proxy_definition, :registry
21
26
 
22
27
  ##
23
28
  # @param [RubyLint::Definition::RubyObject] source The source definition
24
29
  # to use for looking up the definition associated with the current
25
30
  # proxy.
31
+ #
26
32
  # @param [String] name The name/constant path of the constant that this
27
33
  # proxy belongs to.
28
34
  #
29
- def initialize(source, name)
35
+ # @param [RubyLint::Registry] registry The registry to use when trying
36
+ # to autoload a constant.
37
+ #
38
+ def initialize(source, name, registry = nil)
30
39
  @proxy_source = source
31
40
  @proxy_name = name
41
+ @registry = registry
32
42
  end
33
43
 
34
44
  # Pre-define all the methods of the definition, this is faster than
@@ -58,7 +68,45 @@ module RubyLint
58
68
  def lookup_proxy_definition
59
69
  return if proxy_definition
60
70
 
61
- @proxy_definition = proxy_source.lookup_constant_path(proxy_name)
71
+ found = lookup_constant
72
+ root = root_constant
73
+
74
+ if !found and use_registry?(root)
75
+ registry.apply(root, proxy_source)
76
+
77
+ found = lookup_constant
78
+ end
79
+
80
+ @proxy_definition = found
81
+ end
82
+
83
+ ##
84
+ # @param [String] constant
85
+ # @return [TrueClass|FalseClass]
86
+ #
87
+ def use_registry?(constant)
88
+ return false unless registry
89
+
90
+ # Don't load the constant if we already have it.
91
+ return true if registry.include?(constant)
92
+
93
+ registry.load(constant)
94
+
95
+ return registry.include?(constant)
96
+ end
97
+
98
+ ##
99
+ # @return [String]
100
+ #
101
+ def root_constant
102
+ return proxy_name.split(RubyObject::PATH_SEPARATOR)[0]
103
+ end
104
+
105
+ ##
106
+ # @return [RubyLint::Definition::RubyObject]
107
+ #
108
+ def lookup_constant
109
+ return proxy_source.lookup_constant_path(proxy_name)
62
110
  end
63
111
  end # ConstantProxy
64
112
  end # Definition
@@ -0,0 +1,126 @@
1
+ module RubyLint
2
+ module Definition
3
+ ##
4
+ # The Registry class is used to register and store definitions that have
5
+ # to be applied to instances of {RubyLint::VirtualMachine}. It can also be
6
+ # used to load constant definition files from a custom load path.
7
+ #
8
+ # @!attribute [r] load_path
9
+ # @return [Array] List of directories to search in for definitions.
10
+ #
11
+ # @!attribute [r] loaded_constants
12
+ # @return [Set] Set containing the constants loaded from the load path.
13
+ #
14
+ # @!attribute [r] registered
15
+ # @return [Hash] Returns the registered definitions as a Hash. The keys
16
+ # are set to the constant names, the values to `Proc` instances that,
17
+ # when evaluated, create the corresponding definitions.
18
+ #
19
+ class Registry
20
+ attr_reader :load_path, :loaded_constants, :registered
21
+
22
+ ##
23
+ # The default load path to use.
24
+ #
25
+ # @return [Array]
26
+ #
27
+ DEFAULT_LOAD_PATH = [
28
+ File.expand_path('../../definitions/core', __FILE__),
29
+ File.expand_path('../../definitions/rails', __FILE__),
30
+ File.expand_path('../../definitions/gems', __FILE__)
31
+ ]
32
+
33
+ def initialize
34
+ @registered = {}
35
+ @load_path = DEFAULT_LOAD_PATH.dup
36
+ @loaded_constants = Set.new
37
+ end
38
+
39
+ ##
40
+ # Registers a new definition with the given name.
41
+ #
42
+ # @param [String] name The name of the constant.
43
+ #
44
+ def register(name, &block)
45
+ registered[name] = block
46
+ end
47
+
48
+ ##
49
+ # Gets the constant with the given name.
50
+ #
51
+ # @param [String] constant
52
+ # @raise [ArgumentError] Raised if the given constant doesn't exist.
53
+ #
54
+ def get(constant)
55
+ found = registered[constant]
56
+
57
+ if found
58
+ return found
59
+ else
60
+ raise ArgumentError, "The constant #{constant} does not exist"
61
+ end
62
+ end
63
+
64
+ ##
65
+ # Returns `true` if the given constant has been registered.
66
+ #
67
+ # @param [String] constant
68
+ # @return [TrueClass|FalseClass]
69
+ #
70
+ def include?(constant)
71
+ return registered.key?(constant) || loaded_constants.include?(constant)
72
+ end
73
+
74
+ ##
75
+ # Applies the definitions of a given name to the given
76
+ # {RubyLint::Definition::RubyObject} instance.
77
+ #
78
+ # @param [String] constant
79
+ # @param [RubyLint::Definition::RubyObject] definitions
80
+ #
81
+ def apply(constant, definitions)
82
+ unless definitions.defines?(:const, constant)
83
+ get(constant).call(definitions)
84
+ end
85
+ end
86
+
87
+ ##
88
+ # Tries to find a definition in the current load path and loads it if
89
+ # found.
90
+ #
91
+ # @param [String] constant The name of the top level constant.
92
+ #
93
+ def load(constant)
94
+ return if include?(constant)
95
+
96
+ filename = file_for_constant(constant)
97
+
98
+ load_path.each do |dir|
99
+ filepath = File.join(dir, filename)
100
+
101
+ if File.file?(filepath)
102
+ require(filepath)
103
+
104
+ # Only update the path if we actually found the right constant
105
+ # file.
106
+ if registered.key?(constant)
107
+ loaded_constants << constant
108
+ end
109
+
110
+ break
111
+ end
112
+ end
113
+ end
114
+
115
+ private
116
+
117
+ ##
118
+ # @param [String] constant
119
+ # @return [String]
120
+ #
121
+ def file_for_constant(constant)
122
+ return constant.snake_case + '.rb'
123
+ end
124
+ end # Registry
125
+ end # Definition
126
+ end # RubyLint