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,30 +1,37 @@
1
1
  # This file was automatically generated, any manual changes will be lost the
2
2
  # next time this file is generated.
3
3
  #
4
- # Created: <%= Time.new %>
5
4
  # Platform: <%= RUBY_ENGINE %> <%= Rubinius::VERSION rescue RUBY_VERSION %>
6
5
 
7
- <% @constants.each do |constant| %>
8
- RubyLint::GlobalScope.definitions.define_constant('<%= constant.name %>') do |klass|
9
- <%- if constant.superclass -%>
10
- klass.inherits(RubyLint::GlobalScope.constant_proxy('<%= constant.superclass %>'))
11
- <%- end -%>
6
+ RubyLint.registry.register('<%= @constants[0].name %>') do |defs|
7
+ <%- @constants.each do |constant| -%>
8
+ defs.define_constant('<%= constant.name %>') do |klass|
9
+ <%- if constant.superclass -%>
10
+ klass.inherits(defs.constant_proxy('<%= constant.superclass %>', RubyLint.registry))
11
+ <%- end -%>
12
+ <%- constant.modules.each do |mod| -%>
13
+ klass.inherits(defs.constant_proxy('<%= mod %>', RubyLint.registry))
14
+ <%- end -%>
12
15
 
13
- <%- constant.methods.each do |type, collection| -%>
14
- <%- collection.each do |name, args| -%>
16
+ <%- constant.methods.each do |type, collection| -%>
17
+ <%- collection.each do |name, args| -%>
15
18
 
16
- <%- if args.empty? -%>
17
- klass.define_<%= type %>('<%= name %>')
18
- <%- else -%>
19
- klass.define_<%= type %>('<%= name %>') do |method|
20
- <%- args.each do |arg| -%>
21
- method.define_<%= arg[:type] %>('<%= arg[:name] %>')
19
+ <%- if args.empty? -%>
20
+ klass.define_<%= type %>('<%= name %>')
21
+ <%- else -%>
22
+ klass.define_<%= type %>('<%= name %>') do |method|
23
+ <%- args.each do |arg| -%>
24
+ method.define_<%= arg[:type] %>('<%= arg[:name] %>')
25
+ <%- end -%>
26
+ <%- if return_instance?(type, name) -%>
27
+
28
+ method.returns { |object| object.instance }
29
+ <%- end -%>
30
+ end
31
+ <%- end -%>
32
+ <%- end -%>
22
33
  <%- end -%>
23
34
  end
24
- <%- end -%>
25
- <%- end -%>
35
+
26
36
  <%- end -%>
27
37
  end
28
- <% end %>
29
-
30
- RubyLint::GlobalScope.definitions.lookup(:const, '<%= @constants[0].name %>').deep_freeze
@@ -14,6 +14,18 @@ module RubyLint
14
14
  end
15
15
  end
16
16
 
17
+ ##
18
+ # Returns `true` if the method's definition should return an instance of
19
+ # the container.
20
+ #
21
+ # @param [Symbol] type
22
+ # @param [Symbol] name
23
+ #
24
+ def return_instance?(type, name)
25
+ return (type == :method && name == :new) ||
26
+ (type == :instance_method && name == :initialize)
27
+ end
28
+
17
29
  ##
18
30
  # @return [Binding]
19
31
  #
@@ -34,6 +34,13 @@ module RubyLint
34
34
  :nil => 'NilClass'
35
35
  }
36
36
 
37
+ ##
38
+ # List of variable types used in {#variable?}.
39
+ #
40
+ # @return [Array]
41
+ #
42
+ VARIABLE_TYPES = [:lvar, :ivar, :cvar, :gvar]
43
+
37
44
  PREDICATE_METHODS.each do |type|
38
45
  define_method("#{type}?") do
39
46
  return @type == type
@@ -60,5 +67,12 @@ module RubyLint
60
67
  def ruby_class
61
68
  return RUBY_CLASSES[type]
62
69
  end
70
+
71
+ ##
72
+ # @return [TrueClass|FalseClass]
73
+ #
74
+ def variable?
75
+ return VARIABLE_TYPES.include?(type)
76
+ end
63
77
  end # VariablePredicates
64
78
  end # RubyLint
@@ -1,3 +1,3 @@
1
1
  module RubyLint
2
- VERSION = '1.0.3'
2
+ VERSION = '1.1.0'
3
3
  end # RubyLint
@@ -161,16 +161,19 @@ module RubyLint
161
161
  def after_initialize
162
162
  @comments ||= {}
163
163
 
164
- @associations = {}
165
- @definitions = initial_definitions
166
- @scopes = [@definitions]
167
- @value_stack = NestedStack.new
168
- @variable_stack = NestedStack.new
169
- @ignored_nodes = []
170
- @visibility = :public
164
+ @associations = {}
165
+ @definitions = initial_definitions
166
+ @constant_loader = ConstantLoader.new(:definitions => @definitions)
167
+ @scopes = [@definitions]
168
+ @value_stack = NestedStack.new
169
+ @variable_stack = NestedStack.new
170
+ @ignored_nodes = []
171
+ @visibility = :public
171
172
 
172
173
  reset_docstring_tags
173
174
  reset_method_type
175
+
176
+ @constant_loader.bootstrap
174
177
  end
175
178
 
176
179
  ##
@@ -182,6 +185,9 @@ module RubyLint
182
185
  def run(ast)
183
186
  ast = [ast] unless ast.is_a?(Array)
184
187
 
188
+ # pre-load all the built-in definitions.
189
+ @constant_loader.run(ast)
190
+
185
191
  ast.each { |node| iterate(node) }
186
192
 
187
193
  freeze
@@ -386,7 +392,7 @@ module RubyLint
386
392
  def after_array(node)
387
393
  builder = DefinitionBuilder::RubyArray.new(
388
394
  node,
389
- current_scope,
395
+ self,
390
396
  :values => value_stack.pop
391
397
  )
392
398
 
@@ -408,7 +414,7 @@ module RubyLint
408
414
  def after_hash(node)
409
415
  builder = DefinitionBuilder::RubyHash.new(
410
416
  node,
411
- current_scope,
417
+ self,
412
418
  :values => value_stack.pop
413
419
  )
414
420
 
@@ -478,6 +484,7 @@ module RubyLint
478
484
  parent = evaluate_node(parent_node)
479
485
 
480
486
  if !parent or !parent.const?
487
+ # FIXME: this should use `definitions` instead.
481
488
  parent = current_scope.lookup(:const, 'Object')
482
489
  end
483
490
  end
@@ -498,7 +505,7 @@ module RubyLint
498
505
  # @param [RubyLint::AST::Node] node
499
506
  #
500
507
  def on_block(node)
501
- builder = DefinitionBuilder::RubyBlock.new(node, current_scope)
508
+ builder = DefinitionBuilder::RubyBlock.new(node, self)
502
509
  definition = builder.build
503
510
 
504
511
  associate_node(node, definition)
@@ -555,7 +562,7 @@ module RubyLint
555
562
 
556
563
  builder = DefinitionBuilder::RubyMethod.new(
557
564
  node,
558
- current_scope,
565
+ self,
559
566
  :type => @method_type,
560
567
  :receiver => receiver,
561
568
  :visibility => @visibility
@@ -613,6 +620,7 @@ module RubyLint
613
620
  update_parents_from_tag(docstring_tags.param_tags[name], var)
614
621
  end
615
622
 
623
+ associate_node(node, var)
616
624
  current_scope.add(type, name, var)
617
625
  current_scope.add_definition(var)
618
626
  end
@@ -660,6 +668,13 @@ Received: #{arguments.length}
660
668
  EOF
661
669
  end
662
670
 
671
+ # Associate the argument definitions with their nodes.
672
+ arguments.each_with_index do |obj, index|
673
+ arg_node = node.children[2 + index]
674
+
675
+ associate_node(arg_node, obj)
676
+ end
677
+
663
678
  # If the receiver doesn't exist there's no point in associating a context
664
679
  # with it.
665
680
  if receiver and !receiver_definition
@@ -736,6 +751,52 @@ Received: #{arguments.length}
736
751
  evaluator.evaluate(arguments, current_scope)
737
752
  end
738
753
 
754
+ ##
755
+ # @return [RubyLint::Definition::RubyObject]
756
+ #
757
+ def current_scope
758
+ return @scopes.last
759
+ end
760
+
761
+ ##
762
+ #
763
+ # @return [RubyLint::Definition::RubyObject]
764
+ #
765
+ def previous_scope
766
+ return @scopes[-2]
767
+ end
768
+
769
+ ##
770
+ # @param [String] name
771
+ # @return [RubyLint::Definition::RubyObject]
772
+ #
773
+ def global_constant(name)
774
+ found = definitions.lookup(:const, name)
775
+
776
+ # Didn't find it? Lets see if the constant loader knows about it.
777
+ unless found
778
+ @constant_loader.load_constant(name)
779
+
780
+ found = definitions.lookup(:const, name)
781
+ end
782
+
783
+ return found
784
+ end
785
+
786
+ ##
787
+ # Evaluates and returns the value of the given node.
788
+ #
789
+ # @param [RubyLint::AST::Node] node
790
+ # @return [RubyLint::Definition::RubyObject]
791
+ #
792
+ def evaluate_node(node)
793
+ value_stack.add_stack
794
+
795
+ iterate(node)
796
+
797
+ return value_stack.pop.first
798
+ end
799
+
739
800
  private
740
801
 
741
802
  ##
@@ -747,10 +808,14 @@ Received: #{arguments.length}
747
808
  definitions = Definition::RubyObject.new(
748
809
  :name => 'root',
749
810
  :type => :root,
750
- :parents => [GlobalScope.definitions],
751
- :instance_type => :instance
811
+ :instance_type => :instance,
812
+ :inherit_self => false
752
813
  )
753
814
 
815
+ definitions.parents = [
816
+ definitions.constant_proxy('Object', RubyLint.registry)
817
+ ]
818
+
754
819
  definitions.define_self
755
820
 
756
821
  return definitions
@@ -764,7 +829,7 @@ Received: #{arguments.length}
764
829
  # @param [Hash] options
765
830
  #
766
831
  def define_module(node, definition_builder, options = {})
767
- builder = definition_builder.new(node, current_scope, options)
832
+ builder = definition_builder.new(node, self, options)
768
833
  definition = builder.build
769
834
  scope = builder.scope
770
835
  existing = scope.lookup(definition.type, definition.name, false)
@@ -784,20 +849,6 @@ Received: #{arguments.length}
784
849
  push_scope(definition)
785
850
  end
786
851
 
787
- ##
788
- # @return [RubyLint::Definition::RubyObject]
789
- #
790
- def current_scope
791
- return @scopes.last
792
- end
793
-
794
- ##
795
- # @return [RubyLint::Definition::RubyObject]
796
- #
797
- def previous_scope
798
- return @scopes[-2]
799
- end
800
-
801
852
  ##
802
853
  # Associates the given node and defintion with each other.
803
854
  #
@@ -950,7 +1001,7 @@ Received: #{arguments.length}
950
1001
  # @param [Hash] options
951
1002
  #
952
1003
  def create_primitive(node, options = {})
953
- builder = DefinitionBuilder::Primitive.new(node, current_scope, options)
1004
+ builder = DefinitionBuilder::Primitive.new(node, self, options)
954
1005
 
955
1006
  return builder.build
956
1007
  end
@@ -1037,20 +1088,6 @@ Received: #{arguments.length}
1037
1088
  end
1038
1089
  end
1039
1090
 
1040
- ##
1041
- # Evaluates and returns the value of the given node.
1042
- #
1043
- # @param [RubyLint::AST::Node] node
1044
- # @return [RubyLint::Definition::RubyObject]
1045
- #
1046
- def evaluate_node(node)
1047
- value_stack.add_stack
1048
-
1049
- iterate(node)
1050
-
1051
- return value_stack.pop.first
1052
- end
1053
-
1054
1091
  ##
1055
1092
  # Includes the definition `inherit` in the list of parent definitions of
1056
1093
  # `definition`.
@@ -1145,8 +1182,7 @@ Received: #{arguments.length}
1145
1182
  # @return [RubyLint::Definition::RubyObject]
1146
1183
  #
1147
1184
  def lookup_type_definition(name)
1148
- return current_scope.lookup(:const, name) ||
1149
- GlobalScope.global_constant(name)
1185
+ return current_scope.lookup(:const, name) || global_constant(name)
1150
1186
  end
1151
1187
 
1152
1188
  ##
@@ -1159,7 +1195,7 @@ Received: #{arguments.length}
1159
1195
  # THINK: currently ruby-lint assumes methods always return a single type
1160
1196
  # but YARD allows you to specify multiple ones. For now we'll take the
1161
1197
  # first one but there should be a nicer way to do this.
1162
- definition.returns(definitions[0]) if definitions[0]
1198
+ definition.returns(definitions[0].instance) if definitions[0]
1163
1199
  end
1164
1200
 
1165
1201
  ##
@@ -12,34 +12,23 @@ Gem::Specification.new do |s|
12
12
  s.executables = ['ruby-lint']
13
13
  s.license = 'MIT'
14
14
 
15
- s.post_install_message = <<-EOF.strip
16
- Thanks for installing ruby-lint. Keep in mind that ruby-lint is still a young
17
- project and as such there will be bugs, false positives and otherwise weird
18
- behaviour. If you encounter any of these issues please report them (and provide
19
- some sample code) at the issue tracker:
20
-
21
- https://github.com/YorickPeterse/ruby-lint/issues/new
22
-
23
- If you have any further questions you can find me on Twitter/Freenode/Github
24
- using the handle "yorickpeterse".
25
- EOF
15
+ s.post_install_message = 'Please report any issues at: ' \
16
+ 'https://github.com/YorickPeterse/ruby-lint/issues/new'
26
17
 
27
18
  s.files = File.read(File.expand_path('../MANIFEST', __FILE__)).split("\n")
28
19
 
29
20
  s.has_rdoc = 'yard'
30
21
  s.required_ruby_version = '>= 1.9.3'
31
22
 
32
- s.add_dependency 'parser', ['~> 2.0']
23
+ s.add_dependency 'parser', ['~> 2.1', '>= 2.1.1']
33
24
  s.add_dependency 'slop', ['~> 3.4', '>= 3.4.7']
34
25
 
35
26
  s.add_development_dependency 'rake'
36
27
  s.add_development_dependency 'rspec', ['>= 2.14']
37
28
  s.add_development_dependency 'yard'
38
- s.add_development_dependency 'pry-rescue'
39
29
  s.add_development_dependency 'simplecov'
40
30
  s.add_development_dependency 'coveralls'
41
31
  s.add_development_dependency 'json'
42
32
  s.add_development_dependency 'kramdown'
43
33
  s.add_development_dependency 'redcard'
44
- s.add_development_dependency 'gnuplot'
45
34
  end
@@ -48,7 +48,7 @@ String.example_method
48
48
  example 'add an error when calling a method defined in a different scope' do
49
49
  code = <<-CODE
50
50
  class Person
51
- def name
51
+ def person_name
52
52
  return 'name'
53
53
  end
54
54
 
@@ -57,7 +57,7 @@ class Person
57
57
  end
58
58
  end
59
59
 
60
- name
60
+ person_name
61
61
  CODE
62
62
 
63
63
  report = build_report(code, RubyLint::Analysis::UndefinedMethods)
@@ -70,7 +70,7 @@ name
70
70
 
71
71
  entry.line.should == 11
72
72
  entry.column.should == 1
73
- entry.message.should == 'undefined method name'
73
+ entry.message.should == 'undefined method person_name'
74
74
  end
75
75
 
76
76
  describe 'core Ruby types' do
@@ -317,4 +317,21 @@ end
317
317
  entry.message.should == 'undefined method to_foo on an instance of ' \
318
318
  'Fixnum, Bignum or Numeric'
319
319
  end
320
+
321
+ context 'method missing' do
322
+ example 'do not add errors when method_missing is defined' do
323
+ code = <<-CODE
324
+ class Foo
325
+ def method_missing; end
326
+ end
327
+
328
+ foo = Foo.new
329
+ foo.bar
330
+ CODE
331
+
332
+ report = build_report(code, RubyLint::Analysis::UndefinedMethods)
333
+
334
+ report.entries.empty?.should == true
335
+ end
336
+ end
320
337
  end
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+
3
+ describe RubyLint::Analysis::UselessEqualityChecks do
4
+ example 'compare a String literal with a Fixnum literal' do
5
+ code = "'foo' == 10"
6
+ report = build_report(code, RubyLint::Analysis::UselessEqualityChecks)
7
+ entry = report.entries[0]
8
+
9
+ entry.line.should == 1
10
+ entry.column.should == 1
11
+ entry.message.should == 'Comparing String with Fixnum evaluates to false'
12
+ end
13
+
14
+ example 'compare a variable with a Fixnum literal' do
15
+ code = <<-EOF
16
+ string = 'foo'
17
+
18
+ string == 10
19
+ EOF
20
+
21
+ report = build_report(code, RubyLint::Analysis::UselessEqualityChecks)
22
+ entry = report.entries[0]
23
+
24
+ entry.message.should == 'Comparing String with Fixnum evaluates to false'
25
+ end
26
+
27
+ example 'compare two variables' do
28
+ code = <<-EOF
29
+ string = 'foo'
30
+ number = 10
31
+
32
+ string == number
33
+ EOF
34
+
35
+ report = build_report(code, RubyLint::Analysis::UselessEqualityChecks)
36
+ entry = report.entries[0]
37
+
38
+ entry.message.should == 'Comparing String with Fixnum evaluates to false'
39
+ end
40
+
41
+ example 'compare a String literal with a method call' do
42
+ code = <<-EOF
43
+ # @return [Fixnum]
44
+ def number
45
+ return 10
46
+ end
47
+
48
+ 'foo' == number
49
+ EOF
50
+
51
+ report = build_report(code, RubyLint::Analysis::UselessEqualityChecks)
52
+ entry = report.entries[0]
53
+
54
+ entry.message.should == 'Comparing String with Fixnum evaluates to false'
55
+ end
56
+
57
+ example 'ignore values that are unknown' do
58
+ code = <<-EOF
59
+ def foo
60
+ end
61
+
62
+ 10 == foo
63
+ EOF
64
+
65
+ report = build_report(code, RubyLint::Analysis::UselessEqualityChecks)
66
+
67
+ report.entries.empty?.should == true
68
+ end
69
+
70
+ example 'calling methods on objects that return unknown values' do
71
+ code = <<-CODE
72
+ def example(number)
73
+ return '10' == number.to_s
74
+ end
75
+ CODE
76
+
77
+ report = build_report(code, RubyLint::Analysis::UselessEqualityChecks)
78
+
79
+ report.entries.empty?.should == true
80
+ end
81
+
82
+ context 'ignoring variables with unknown values' do
83
+ example 'ignore a local variable without a value' do
84
+ code = <<-CODE
85
+ [10, 20].each do |number|
86
+ number == false
87
+ end
88
+ CODE
89
+
90
+ report = build_report(code, RubyLint::Analysis::UselessEqualityChecks)
91
+
92
+ report.entries.empty?.should == true
93
+ end
94
+
95
+ example 'ignore an instance variable without a value' do
96
+ code = <<-CODE
97
+ [10, 20].each do |@number|
98
+ @number == false
99
+ end
100
+ CODE
101
+
102
+ report = build_report(code, RubyLint::Analysis::UselessEqualityChecks)
103
+
104
+ report.entries.empty?.should == true
105
+ end
106
+ end
107
+ end