ruby-lint 1.0.3 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0b345fdf9724a766a2684c0977f862cd7e408ce9
4
- data.tar.gz: a6d56efba7d749595035211678c38c8a4323c94d
3
+ metadata.gz: dd18d2ac845d4520591324dc3491cbd5a3d9b0ca
4
+ data.tar.gz: b7a344031e1b300104e1331486dbc4b8903ff9c8
5
5
  SHA512:
6
- metadata.gz: efe10626ab798f0d8069d5bceb3c39efb634c1afbf009490c0a01670ca2f049ddabbbf9f17f3f9a84058cb69fe14c9b42f3031da4d9211c1d8f075d3889596af
7
- data.tar.gz: 14f98dd7fdf7875035021f5830da8574c0f4ab82bbbc7775a1476a26e56052dd4259ba0d67e9c8a1893e090bc5c4db3dc069e6f2ac2d0ddd4ceae06617872813
6
+ metadata.gz: 78ad431d97cef27b33f53842e36b46771895a3d1cef0ce8982a77245e5ce3b1c1400318ece043a24a594277eb21ab5dad6026d74473c9d1c9354a5289ddf6309
7
+ data.tar.gz: c6010baaeb8aec96bdaf8a00eb80c92a186be594fa20136e45a3a374749c20588a3a0dd8bac2dd659d7f911eb40cd321f28f291dd1c3dd92daf6932d7fd3234f
@@ -1 +1 @@
1
- 2.0
1
+ 2.1
@@ -4,7 +4,8 @@ script: bundle exec rake travis
4
4
  rvm:
5
5
  - 1.9.3
6
6
  - 2.0.0
7
- - rbx-2.2.1
7
+ - 2.1.0
8
+ - rbx-2.2
8
9
  - jruby-19mode
9
10
 
10
11
  notifications:
@@ -15,8 +16,4 @@ notifications:
15
16
  on_success: change
16
17
  on_failure: always
17
18
 
18
- branches:
19
- only:
20
- - master
21
-
22
19
  cache: bundler
data/Gemfile CHANGED
@@ -3,8 +3,13 @@ source 'https://rubygems.org/'
3
3
  gemspec
4
4
 
5
5
  group :testing do
6
- gem 'rubysl', :platform => :rbx
7
- gem 'rubinius-developer_tools', :platform => :rbx
8
- gem 'racc', :platform => :rbx
9
- gem 'ruby-prof', :platform => :mri
6
+ platform :rbx do
7
+ gem 'rubysl'
8
+ gem 'rubinius-developer_tools'
9
+ gem 'racc'
10
+ end
11
+
12
+ platform :mri do
13
+ gem 'ruby-prof'
14
+ end
10
15
  end
data/MANIFEST CHANGED
@@ -21,6 +21,8 @@ checksum/ruby-lint-0.9.1.gem.sha512
21
21
  checksum/ruby-lint-1.0.0.gem.sha512
22
22
  checksum/ruby-lint-1.0.0.pre.preview1.gem.sha512
23
23
  checksum/ruby-lint-1.0.1.gem.sha512
24
+ checksum/ruby-lint-1.0.2.gem.sha512
25
+ checksum/ruby-lint-1.0.3.gem.sha512
24
26
  doc/.gitkeep
25
27
  doc/DCO.md
26
28
  doc/architecture.md
@@ -29,9 +31,15 @@ doc/code_analysis.md
29
31
  doc/configuration.md
30
32
  doc/css/.gitkeep
31
33
  doc/css/common.css
34
+ doc/definitions.md
32
35
  doc/graphviz/flow.dot
33
36
  doc/images/.gitkeep
34
37
  doc/images/flow.png
38
+ gen/rails/constants.txt
39
+ gen/rails/requires.rb
40
+ gen/stdlib/constants.rb
41
+ gen/stdlib/constants.txt
42
+ gen/stdlib/requires.rb
35
43
  lib/ruby-lint.rb
36
44
  lib/ruby-lint/analysis/argument_amount.rb
37
45
  lib/ruby-lint/analysis/base.rb
@@ -40,6 +48,7 @@ lib/ruby-lint/analysis/shadowing_variables.rb
40
48
  lib/ruby-lint/analysis/undefined_methods.rb
41
49
  lib/ruby-lint/analysis/undefined_variables.rb
42
50
  lib/ruby-lint/analysis/unused_variables.rb
51
+ lib/ruby-lint/analysis/useless_equality_checks.rb
43
52
  lib/ruby-lint/ast/builder.rb
44
53
  lib/ruby-lint/ast/node.rb
45
54
  lib/ruby-lint/benchmark/average.rb
@@ -47,14 +56,14 @@ lib/ruby-lint/cache.rb
47
56
  lib/ruby-lint/cache_entry.rb
48
57
  lib/ruby-lint/cli.rb
49
58
  lib/ruby-lint/cli/analyze.rb
50
- lib/ruby-lint/cli/ast.rb
51
59
  lib/ruby-lint/cli/base.rb
52
- lib/ruby-lint/cli/plot.rb
60
+ lib/ruby-lint/cli/cache.rb
53
61
  lib/ruby-lint/configuration.rb
54
62
  lib/ruby-lint/constant_loader.rb
55
63
  lib/ruby-lint/constant_path.rb
56
64
  lib/ruby-lint/default_names.rb
57
65
  lib/ruby-lint/definition/constant_proxy.rb
66
+ lib/ruby-lint/definition/registry.rb
58
67
  lib/ruby-lint/definition/ruby_method.rb
59
68
  lib/ruby-lint/definition/ruby_object.rb
60
69
  lib/ruby-lint/definition_builder/base.rb
@@ -68,12 +77,10 @@ lib/ruby-lint/definition_builder/ruby_module.rb
68
77
  lib/ruby-lint/definition_generator.rb
69
78
  lib/ruby-lint/definitions/core.rb
70
79
  lib/ruby-lint/definitions/core/abbrev.rb
71
- lib/ruby-lint/definitions/core/arg0.rb
72
80
  lib/ruby-lint/definitions/core/argf.rb
73
81
  lib/ruby-lint/definitions/core/argument_error.rb
74
82
  lib/ruby-lint/definitions/core/argv.rb
75
83
  lib/ruby-lint/definitions/core/array.rb
76
- lib/ruby-lint/definitions/core/autoload.rb
77
84
  lib/ruby-lint/definitions/core/base64.rb
78
85
  lib/ruby-lint/definitions/core/basic_object.rb
79
86
  lib/ruby-lint/definitions/core/basic_socket.rb
@@ -89,13 +96,11 @@ lib/ruby-lint/definitions/core/complex.rb
89
96
  lib/ruby-lint/definitions/core/condition_variable.rb
90
97
  lib/ruby-lint/definitions/core/config.rb
91
98
  lib/ruby-lint/definitions/core/conftest_c.rb
92
- lib/ruby-lint/definitions/core/continuation.rb
93
99
  lib/ruby-lint/definitions/core/coutflag.rb
94
100
  lib/ruby-lint/definitions/core/csv.rb
95
101
  lib/ruby-lint/definitions/core/data.rb
96
102
  lib/ruby-lint/definitions/core/date.rb
97
103
  lib/ruby-lint/definitions/core/date_time.rb
98
- lib/ruby-lint/definitions/core/default_record_separator.rb
99
104
  lib/ruby-lint/definitions/core/delegator.rb
100
105
  lib/ruby-lint/definitions/core/digest.rb
101
106
  lib/ruby-lint/definitions/core/dir.rb
@@ -118,12 +123,10 @@ lib/ruby-lint/definitions/core/export_prefix.rb
118
123
  lib/ruby-lint/definitions/core/failed_message.rb
119
124
  lib/ruby-lint/definitions/core/false.rb
120
125
  lib/ruby-lint/definitions/core/false_class.rb
121
- lib/ruby-lint/definitions/core/fatal_error.rb
122
126
  lib/ruby-lint/definitions/core/fcntl.rb
123
127
  lib/ruby-lint/definitions/core/fiber.rb
124
128
  lib/ruby-lint/definitions/core/fiber_error.rb
125
129
  lib/ruby-lint/definitions/core/file.rb
126
- lib/ruby-lint/definitions/core/file_list.rb
127
130
  lib/ruby-lint/definitions/core/file_test.rb
128
131
  lib/ruby-lint/definitions/core/file_utils.rb
129
132
  lib/ruby-lint/definitions/core/find.rb
@@ -137,7 +140,6 @@ lib/ruby-lint/definitions/core/getopt_long.rb
137
140
  lib/ruby-lint/definitions/core/gserver.rb
138
141
  lib/ruby-lint/definitions/core/hash.rb
139
142
  lib/ruby-lint/definitions/core/hdr_ext.rb
140
- lib/ruby-lint/definitions/core/immediate_value.rb
141
143
  lib/ruby-lint/definitions/core/index_error.rb
142
144
  lib/ruby-lint/definitions/core/install_dirs.rb
143
145
  lib/ruby-lint/definitions/core/integer.rb
@@ -163,8 +165,6 @@ lib/ruby-lint/definitions/core/marshal.rb
163
165
  lib/ruby-lint/definitions/core/match_data.rb
164
166
  lib/ruby-lint/definitions/core/math.rb
165
167
  lib/ruby-lint/definitions/core/matrix.rb
166
- lib/ruby-lint/definitions/core/md5.rb
167
- lib/ruby-lint/definitions/core/memory_segmention_error.rb
168
168
  lib/ruby-lint/definitions/core/method.rb
169
169
  lib/ruby-lint/definitions/core/module.rb
170
170
  lib/ruby-lint/definitions/core/monitor.rb
@@ -191,32 +191,23 @@ lib/ruby-lint/definitions/core/orig_libpath.rb
191
191
  lib/ruby-lint/definitions/core/outflag.rb
192
192
  lib/ruby-lint/definitions/core/pathname.rb
193
193
  lib/ruby-lint/definitions/core/pp.rb
194
- lib/ruby-lint/definitions/core/precision.rb
195
194
  lib/ruby-lint/definitions/core/pretty_print.rb
196
195
  lib/ruby-lint/definitions/core/prime.rb
197
- lib/ruby-lint/definitions/core/primitive_failure.rb
198
196
  lib/ruby-lint/definitions/core/proc.rb
199
197
  lib/ruby-lint/definitions/core/process.rb
200
198
  lib/ruby-lint/definitions/core/profiler__.rb
201
199
  lib/ruby-lint/definitions/core/pstore.rb
202
- lib/ruby-lint/definitions/core/psych.rb
203
200
  lib/ruby-lint/definitions/core/queue.rb
204
- lib/ruby-lint/definitions/core/rake.rb
205
- lib/ruby-lint/definitions/core/rake_file_utils.rb
206
- lib/ruby-lint/definitions/core/rakeversion.rb
207
201
  lib/ruby-lint/definitions/core/random.rb
208
202
  lib/ruby-lint/definitions/core/range.rb
209
203
  lib/ruby-lint/definitions/core/range_error.rb
210
204
  lib/ruby-lint/definitions/core/rational.rb
211
205
  lib/ruby-lint/definitions/core/rb_config.rb
212
- lib/ruby-lint/definitions/core/rdoc.rb
213
206
  lib/ruby-lint/definitions/core/readline.rb
214
207
  lib/ruby-lint/definitions/core/regexp.rb
215
208
  lib/ruby-lint/definitions/core/regexp_error.rb
216
209
  lib/ruby-lint/definitions/core/resolv.rb
217
- lib/ruby-lint/definitions/core/rexml.rb
218
210
  lib/ruby-lint/definitions/core/rpathflag.rb
219
- lib/ruby-lint/definitions/core/rss.rb
220
211
  lib/ruby-lint/definitions/core/ruby_copyright.rb
221
212
  lib/ruby-lint/definitions/core/ruby_description.rb
222
213
  lib/ruby-lint/definitions/core/ruby_engine.rb
@@ -232,7 +223,6 @@ lib/ruby-lint/definitions/core/script_error.rb
232
223
  lib/ruby-lint/definitions/core/secure_random.rb
233
224
  lib/ruby-lint/definitions/core/security_error.rb
234
225
  lib/ruby-lint/definitions/core/set.rb
235
- lib/ruby-lint/definitions/core/sha1.rb
236
226
  lib/ruby-lint/definitions/core/shellwords.rb
237
227
  lib/ruby-lint/definitions/core/signal.rb
238
228
  lib/ruby-lint/definitions/core/signal_exception.rb
@@ -281,8 +271,6 @@ lib/ruby-lint/definitions/core/unbound_method.rb
281
271
  lib/ruby-lint/definitions/core/universal_ints.rb
282
272
  lib/ruby-lint/definitions/core/unixserver.rb
283
273
  lib/ruby-lint/definitions/core/unixsocket.rb
284
- lib/ruby-lint/definitions/core/unmarshalable.rb
285
- lib/ruby-lint/definitions/core/unsupported_library_error.rb
286
274
  lib/ruby-lint/definitions/core/uri.rb
287
275
  lib/ruby-lint/definitions/core/vector.rb
288
276
  lib/ruby-lint/definitions/core/weak_ref.rb
@@ -291,8 +279,9 @@ lib/ruby-lint/definitions/core/xmlrpc.rb
291
279
  lib/ruby-lint/definitions/core/yaml.rb
292
280
  lib/ruby-lint/definitions/core/zero_division_error.rb
293
281
  lib/ruby-lint/definitions/core/zlib.rb
294
- lib/ruby-lint/definitions/global_variables.rb
295
- lib/ruby-lint/definitions/rails.rb
282
+ lib/ruby-lint/definitions/gems/.gitkeep
283
+ lib/ruby-lint/definitions/gems/devise.rb
284
+ lib/ruby-lint/definitions/gems/nokogiri.rb
296
285
  lib/ruby-lint/definitions/rails/abstract_controller.rb
297
286
  lib/ruby-lint/definitions/rails/action_controller.rb
298
287
  lib/ruby-lint/definitions/rails/action_dispatch.rb
@@ -310,10 +299,10 @@ lib/ruby-lint/docstring/param_tag.rb
310
299
  lib/ruby-lint/docstring/parser.rb
311
300
  lib/ruby-lint/docstring/return_tag.rb
312
301
  lib/ruby-lint/extensions/string.rb
302
+ lib/ruby-lint/file_list.rb
313
303
  lib/ruby-lint/file_loader.rb
314
304
  lib/ruby-lint/file_scanner.rb
315
305
  lib/ruby-lint/generated_constant.rb
316
- lib/ruby-lint/global_scope.rb
317
306
  lib/ruby-lint/inspector.rb
318
307
  lib/ruby-lint/iterator.rb
319
308
  lib/ruby-lint/method_call/alias.rb
@@ -329,8 +318,10 @@ lib/ruby-lint/parser.rb
329
318
  lib/ruby-lint/presenter/json.rb
330
319
  lib/ruby-lint/presenter/syntastic.rb
331
320
  lib/ruby-lint/presenter/text.rb
321
+ lib/ruby-lint/rake_task.rb
332
322
  lib/ruby-lint/report.rb
333
323
  lib/ruby-lint/report/entry.rb
324
+ lib/ruby-lint/ruby_lint.rb
334
325
  lib/ruby-lint/runner.rb
335
326
  lib/ruby-lint/template/definition.erb
336
327
  lib/ruby-lint/template/scope.rb
@@ -369,15 +360,17 @@ spec/ruby-lint/analysis/shadowing_variables_spec.rb
369
360
  spec/ruby-lint/analysis/undefined_methods_spec.rb
370
361
  spec/ruby-lint/analysis/undefined_variables_spec.rb
371
362
  spec/ruby-lint/analysis/unused_variables_spec.rb
363
+ spec/ruby-lint/analysis/useless_equality_checks_spec.rb
372
364
  spec/ruby-lint/ast/node_spec.rb
373
365
  spec/ruby-lint/cache_entry_spec.rb
374
366
  spec/ruby-lint/cache_spec.rb
375
367
  spec/ruby-lint/cli/analyze_spec.rb
376
- spec/ruby-lint/cli/ast_spec.rb
377
368
  spec/ruby-lint/configuration_spec.rb
369
+ spec/ruby-lint/constant_loader_spec.rb
378
370
  spec/ruby-lint/constant_path.rb
379
371
  spec/ruby-lint/definition/constant_proxy_spec.rb
380
372
  spec/ruby-lint/definition/dsl_spec.rb
373
+ spec/ruby-lint/definition/registry_spec.rb
381
374
  spec/ruby-lint/definition/ruby_method_spec.rb
382
375
  spec/ruby-lint/definition/ruby_object_spec.rb
383
376
  spec/ruby-lint/definition_builder/primitive_spec.rb
@@ -386,15 +379,21 @@ spec/ruby-lint/definition_builder/ruby_method_spec.rb
386
379
  spec/ruby-lint/definition_builder/ruby_module_spec.rb
387
380
  spec/ruby-lint/definitions/argv_spec.rb
388
381
  spec/ruby-lint/definitions/env_spec.rb
382
+ spec/ruby-lint/definitions/file_spec.rb
383
+ spec/ruby-lint/definitions/fixnum_spec.rb
389
384
  spec/ruby-lint/definitions/io_spec.rb
385
+ spec/ruby-lint/definitions/kernel_spec.rb
386
+ spec/ruby-lint/definitions/range_spec.rb
387
+ spec/ruby-lint/definitions/string_spec.rb
390
388
  spec/ruby-lint/docstring/mapping.rb
391
389
  spec/ruby-lint/docstring/parser_spec.rb
392
390
  spec/ruby-lint/extensions/string_spec.rb
391
+ spec/ruby-lint/file_list_spec.rb
393
392
  spec/ruby-lint/file_loader_spec.rb
394
393
  spec/ruby-lint/file_scanner_spec.rb
395
394
  spec/ruby-lint/inspector_spec.rb
396
395
  spec/ruby-lint/iterator_spec.rb
397
- spec/ruby-lint/method_call/assign_member_spec.rb
396
+ spec/ruby-lint/method_call/.gitkeep
398
397
  spec/ruby-lint/nested_stack_spec.rb
399
398
  spec/ruby-lint/node_hash_spec.rb
400
399
  spec/ruby-lint/parser_spec.rb
@@ -404,6 +403,7 @@ spec/ruby-lint/presenter/text_spec.rb
404
403
  spec/ruby-lint/report/entry_spec.rb
405
404
  spec/ruby-lint/report_spec.rb
406
405
  spec/ruby-lint/runner_spec.rb
406
+ spec/ruby-lint/variable_predicates_spec.rb
407
407
  spec/ruby-lint/virtual_machine/alias_spec.rb
408
408
  spec/ruby-lint/virtual_machine/assignments/arrays_spec.rb
409
409
  spec/ruby-lint/virtual_machine/assignments/assignment_arguments_spec.rb
@@ -433,16 +433,20 @@ spec/ruby-lint/virtual_machine/interpolation_spec.rb
433
433
  spec/ruby-lint/virtual_machine/location_spec.rb
434
434
  spec/ruby-lint/virtual_machine/method_call_tracking_spec.rb
435
435
  spec/ruby-lint/virtual_machine/methods/attr_spec.rb
436
+ spec/ruby-lint/virtual_machine/methods/calls_spec.rb
436
437
  spec/ruby-lint/virtual_machine/methods/define_method_spec.rb
437
438
  spec/ruby-lint/virtual_machine/methods/defining_spec.rb
438
439
  spec/ruby-lint/virtual_machine/methods/docstrings_spec.rb
439
440
  spec/ruby-lint/virtual_machine/methods/exporting_spec.rb
441
+ spec/ruby-lint/virtual_machine/methods/kernel_spec.rb
440
442
  spec/ruby-lint/virtual_machine/methods/parameters_spec.rb
441
443
  spec/ruby-lint/virtual_machine/methods/patching_spec.rb
442
444
  spec/ruby-lint/virtual_machine/methods/scoping_spec.rb
445
+ spec/ruby-lint/virtual_machine/methods/square_bracket_spec.rb
443
446
  spec/ruby-lint/virtual_machine/methods/visibility_spec.rb
444
447
  spec/ruby-lint/virtual_machine/modules_spec.rb
445
448
  spec/ruby-lint/virtual_machine/reference_amount_spec.rb
449
+ spec/ruby-lint/virtual_machine/self_spec.rb
446
450
  spec/ruby-lint/virtual_machine/unused_spec.rb
447
451
  spec/spec_helper.rb
448
452
  spec/support/building.rb
data/README.md CHANGED
@@ -4,10 +4,21 @@
4
4
  [![Coverage Status](https://coveralls.io/repos/YorickPeterse/ruby-lint/badge.png?branch=master)](https://coveralls.io/r/YorickPeterse/ruby-lint)
5
5
  [![Code Climate](https://codeclimate.com/github/YorickPeterse/ruby-lint.png)](https://codeclimate.com/github/YorickPeterse/ruby-lint)
6
6
 
7
- ruby-lint is a linter and static code analysis tool for Ruby. It is inspired by
8
- similar tools such as jshint, flake8 and similar tools. ruby-lint primarily
9
- focuses on logic related errors such as the use of non existing variables
10
- instead of focusing on semantics (e.g. the amount of characters per line).
7
+ ruby-lint is a static code analysis tool for Ruby. It is inspired by tools such
8
+ as jshint, flake8 and similar tools. ruby-lint primarily focuses on logic
9
+ related errors such as the use of non existing variables instead of focusing on
10
+ semantics (e.g. the amount of characters per line).
11
+
12
+ The features of ruby-lint include but are not limited to the detection of
13
+ unused variables, the use of undefined methods and method calls with invalid
14
+ argument amounts and more. More in-depth analysis will be added over time.
15
+
16
+ The aim of ruby-lint is to provide analysis that is as accurate as possible.
17
+ However, due to the dynamic nature of Ruby and the sheer amount of meta-magic
18
+ in third-party code there will at times be false positives. Analysis can be
19
+ improved by documenting your code using [YARD][yard], in particular the
20
+ `@param` and `@return` tags are used by ruby-lint to obtain extra information
21
+ when processing methods.
11
22
 
12
23
  ## Requirements
13
24
 
@@ -16,7 +27,7 @@ instead of focusing on semantics (e.g. the amount of characters per line).
16
27
 
17
28
  The following Ruby implementations/versions are officially supported:
18
29
 
19
- * MRI 1.9.3 and newer
30
+ * MRI 1.9.3, 2.0 or 2.1
20
31
  * Rubinius 2.0 and newer
21
32
  * Jruby 1.7 and newer
22
33
 
@@ -123,6 +134,7 @@ In the past Gems were also signed using PGP, this is no longer the case.
123
134
  * {file:architecture Architecture}
124
135
  * {file:code\_analysis Code Analysis}
125
136
  * {file:configuration Configuration}
137
+ * {file:definitions Definitions}
126
138
 
127
139
  ## License
128
140
 
@@ -133,3 +145,4 @@ in the root directory of this repository.
133
145
  [syntastic]: https://github.com/scrooloose/syntastic
134
146
  [flycheck]: https://github.com/flycheck/flycheck/
135
147
  [rubocop]: https://github.com/bbatsov/rubocop
148
+ [yard]: http://yardoc.org/
data/Rakefile CHANGED
@@ -1,6 +1,5 @@
1
- require File.expand_path('../lib/ruby-lint/extensions/string', __FILE__)
2
- require File.expand_path('../lib/ruby-lint/inspector', __FILE__)
3
- require File.expand_path('../lib/ruby-lint/definition_generator', __FILE__)
1
+ require_relative 'lib/ruby-lint/definition_generator'
2
+ require_relative 'lib/ruby-lint/rake_task'
4
3
 
5
4
  require 'yaml'
6
5
  require 'bundler/gem_tasks'
@@ -8,6 +7,11 @@ require 'digest/sha2'
8
7
  require 'coveralls/rake/task'
9
8
  require 'rake/clean'
10
9
 
10
+ RubyLint::RakeTask.new do |task|
11
+ task.name = 'lint'
12
+ task.files = ['./lib/ruby-lint']
13
+ end
14
+
11
15
  Coveralls::RakeTask.new
12
16
 
13
17
  GEMSPEC = Gem::Specification.load('ruby-lint.gemspec')
@@ -0,0 +1 @@
1
+ 01bdfe10f10950d2035dc1a0289e0cf1b6f40a0b23fead3ee1f39391e309ed00972bdc0a2b35859539660ebb1a2cc5a222f9eded6d511a28daa32fdeb9829786
@@ -0,0 +1 @@
1
+ dc93aa3a5f196b8badbab5c06975e7da6710508e2f6efebf16f063413d4f1d80d8f02897c0aced4a7593e16d1f2f53465a3be9ff16d0b6b084086ec6a169aa1a
@@ -5,6 +5,46 @@ This document contains a short summary of the various releases of ruby-lint.
5
5
  For a full list of commits included in each release see the corresponding Git
6
6
  tags (named after the versions).
7
7
 
8
+ ## 1.1.0 - 2014-02-02
9
+
10
+ This release changes the way the definitions system works so that it no longer
11
+ stores a set of global definition objects. Instead "templates" (so to speak)
12
+ are provided which are applied to individual `RubyLint::VirtualMachine`
13
+ instances. This makes it much easier to analyze code that patches core classes
14
+ such as `String` or `Fixnum`.
15
+
16
+ There have also been various other, smaller changes. The ones worth mentioning
17
+ as following:
18
+
19
+ * A new analysis class, UselessEqualityChecks, has been added. This class adds
20
+ warnings for expressions such as `"foo" == true`.
21
+ * A Rake task class has been added, making it easier to integrate ruby-lint in
22
+ a Rakefile.
23
+ * The CLI has been cleaned up and the `plot` and `ast` commands have been
24
+ removed. A new command, `cache` has been introduced to manage ruby-lint cache
25
+ files more easily.
26
+ * A bug has been fixed that would prevent ruby-lint from properly loading files
27
+ from multiple directories, see Git commit
28
+ `292bb2b73aa6adfdc750fb846884025afc841393`.
29
+ * Definitions have been added for Devise and Nokogiri.
30
+ * Most built-in definitions have been re-generated.
31
+ * Definitions system has been overhauled to no longer use a global state and a
32
+ complex data copying system. Instead the definitions are applied to every
33
+ individual `RubyLint::VirtualMachine` instance.
34
+ * Updated the version of the parser Gem to use.
35
+
36
+ The following bugs/issues have been resolved in this release:
37
+
38
+ * https://github.com/YorickPeterse/ruby-lint/issues/89
39
+ * https://github.com/YorickPeterse/ruby-lint/issues/85
40
+ * https://github.com/YorickPeterse/ruby-lint/issues/91
41
+ * https://github.com/YorickPeterse/ruby-lint/issues/92
42
+ * https://github.com/YorickPeterse/ruby-lint/issues/93
43
+ * https://github.com/YorickPeterse/ruby-lint/issues/94
44
+ * https://github.com/YorickPeterse/ruby-lint/issues/100
45
+ * https://github.com/YorickPeterse/ruby-lint/issues/101
46
+ * https://github.com/YorickPeterse/ruby-lint/issues/102
47
+
8
48
  ## 1.0.3 - 2013-12-23
9
49
 
10
50
  * `self` is now defined as a class and instance method to ensure that the right
@@ -0,0 +1,182 @@
1
+ # @title Definitions
2
+ # Definitions
3
+
4
+ To obtain extra information used in the analysis process ruby-lint uses a set
5
+ of so called "definitions". These definitions describe constants and their
6
+ methods and the associated arguments of said methods. The definitions can be
7
+ created using a basic DSL. Typically end users don't have to write these
8
+ manually as ruby-lint comes with a set of Rake tasks to ease the process of
9
+ creating these definitions. However, manual tweaking might be required in rare
10
+ cases.
11
+
12
+ ## Rationale
13
+
14
+ The definitions exist for 3 reasons:
15
+
16
+ 1. Both MRI and JRuby provide insufficient runtime reflection on method
17
+ arguments (more on this below), a rather crucial aspect in performing
18
+ meaningful analysis.
19
+ 2. Relying on the current runtime for extra information means that users will
20
+ have to load all their used libraries into a ruby-lint session. This will
21
+ often result in degraded performance, in particular startup times will
22
+ increase.
23
+ 3. It's not possible to, during runtime, determine the return type(s) of a
24
+ method. This can only be done by either relying on source documentation or
25
+ by other manual means.
26
+
27
+ These 3 topics are described in detail below.
28
+
29
+ ### Argument Reflection
30
+
31
+ Ruby as a language provides the means to, during runtime, find out what
32
+ arguments a method has, their types and names. For example, consider the
33
+ following code:
34
+
35
+ def example(a, b)
36
+ return a + b
37
+ end
38
+
39
+ We can obtain the arguments list by running the following code:
40
+
41
+ method(:example).parameters
42
+
43
+ This would result in the following value being returned:
44
+
45
+ [[:req, :a], [:req, :b]]
46
+
47
+ Using this we can see that the method takes two required arguments, `a` and
48
+ `b`.
49
+
50
+ Although this works great for methods that are defined in Ruby itself this does
51
+ not work reliably for methods defined in C (in case of MRI) or in Java (in case
52
+ of JRuby).
53
+
54
+ As an example, lets take a look at `String#gsub`. The RDoc documentation of
55
+ this method states the following about its arguments:
56
+
57
+ = String#gsub
58
+
59
+ (from ruby core)
60
+ ------------------------------------------------------------------------------
61
+ str.gsub(pattern, replacement) -> new_str
62
+ str.gsub(pattern, hash) -> new_str
63
+ str.gsub(pattern) {|match| block } -> new_str
64
+ str.gsub(pattern) -> enumerator
65
+
66
+ This states that the method takes 1 required argument (`pattern`), one optional
67
+ argument (`replacement` / `hash`) and a block. However, when we inspect the
68
+ arguments list of this method in MRI we get different results:
69
+
70
+ String.instance_method(:gsub).parameters # => [[:rest]]
71
+
72
+ This would indicate that the method instead takes a single rest argument. This
73
+ however is simply false as calling the method without any arguments (rest
74
+ arguments being optional) results in an argument error:
75
+
76
+ 'foo'.gsub # => ArgumentError: wrong number of arguments (0 for 1..2)
77
+
78
+ This is due to the fact that `String#gsub` method (and many other methods in
79
+ MRI) are defined in C. Since the C API doesn't expose proper systems for
80
+ exposing the argument amounts/types this information is lost.
81
+
82
+ JRuby is also affected by this though at present it's unclear to me if this is
83
+ intentional (in order to mimic MRI's broken behaviour) or a side effect.
84
+ Currently Rubinius is the only Ruby implementation that I know of that does not
85
+ suffer from this problem, largely due to it actually using Ruby for a large
86
+ amount of its core.
87
+
88
+ The above problem also affects every Ruby C extension such as Nokogiri and many
89
+ others.
90
+
91
+ This particular lack of information is problematic for ruby-lint as it means
92
+ that it can not perform meaningful analysis when it relies on the current
93
+ runtime. After all, the accuracy of the analysis process would change depending
94
+ on the Ruby implementation leading to confusing behaviour and false positives.
95
+
96
+ To combat this ruby-lint doesn't use the current runtime for obtaining method
97
+ information. Instead it uses definitions that are pre-generated using Rubinius.
98
+ However, even on Rubinius the accuracy of these definitions will vary for C
99
+ extensions depending on how much these extensions define in C opposed to Ruby.
100
+
101
+ ### Degraded Performance
102
+
103
+ The second reason for not using the current runtime is that by doing so users
104
+ would be required to load their libraries into a ruby-lint session. For
105
+ example, for a Rails project this means loading all of Rails, all the used
106
+ Gems, custom code defined in the `app/` directory and so forth. Doing so will
107
+ increase the startup time of ruby-lint up to a point where it becomes downright
108
+ annoying.
109
+
110
+ To give an example, merely loading Rails using `require 'rails/all'` will add
111
+ around 500 milliseconds to the startup time. Add a few more Gems such as
112
+ Devise, Mongoid and what not and you'll quickly end up having to wait seconds
113
+ for ruby-lint to start up (or any other Ruby program for that matter).
114
+
115
+ As a result of this it was decided that this was less than optimal, which in
116
+ turn was another reason to use pre-generated definitions.
117
+
118
+ ### Return Types
119
+
120
+ Due to Ruby being dynamically typed it's impossible to deduce the return type
121
+ of a method. As a result of this ruby-lint would not be able to figure out what
122
+ `SomeClass.new` would return. This means that for code such as
123
+ `SomeClass.new.foo` ruby-lint would have no other choice but to completely
124
+ ignore it.
125
+
126
+ ruby-lint tries to work around this using two methods:
127
+
128
+ 1. Using YARD documentation (in particular the `@return` and `@param` tags) to
129
+ obtain more information during runtime.
130
+ 2. Using pre-generated definitions that specify return types such as those for
131
+ the `new` and `initialize` methods.
132
+
133
+ This means that ruby-lint is capable of understanding that `String.new` returns
134
+ an instance of `String`. ruby-lint makes the assumption that the class method
135
+ `new` returns an instance of the constant it is defined in, unless the method
136
+ is explicitly overwritten.
137
+
138
+ ## Generating Definitions
139
+
140
+ In most cases one does not need to write these definitions manually, instead
141
+ they are generated using a set of Rake tasks. For best results it's recommended
142
+ to use Rubinius in case you're generating definitions for the Ruby standard
143
+ library.
144
+
145
+ Assuming you have a local copy of ruby-lint you can generate your definitions
146
+ by running the following Rake task:
147
+
148
+ rake -r YOUR_GEM generate:definitions[CONSTANT,lib/ruby-lint/definitions/gems]
149
+
150
+ Here `YOUR_GEM` would be the name of your Gem, `CONSTANT` would be the
151
+ top-level constant. For example, to generate the definitions for Devise you'd
152
+ run the following:
153
+
154
+ rake -r devise generate:definitions[Devise,lib/ruby-lint/definitions/gems]
155
+
156
+ If you are comfortable with the resulting definitions you can submit a pull
157
+ request and I'll take a look at it. I prefer for the definitions to be included
158
+ with ruby-lint itself as this makes it easier to maintain and distribute them
159
+ without requiring users to install a bunch of extra Gems.
160
+
161
+ ## Using Definitions
162
+
163
+ When processing source code ruby-lint will try to automatically load
164
+ definitions where needed. For this to work the definitions should be available
165
+ in the load path defined in {RubyLint::Definition::Registry#load\_path}. By
166
+ default the following directories are searched in for definitions:
167
+
168
+ * lib/ruby-lint/definitions/core
169
+ * lib/ruby-lint/definitions/rails
170
+ * lib/ruby-lint/definitions/gems
171
+
172
+ There should be no need to add extra paths to this list.
173
+
174
+ Definitions are looked up based on the top-level constant referenced in a file.
175
+ For example, of ruby-lint bumps into the constant path `Foo::Bar::Baz` it will
176
+ try to look for a file called `foo.rb` in the above directories. It is expected
177
+ that if this file exists it defines the `Foo` constant (and its child
178
+ constants).
179
+
180
+ The process of loading definitions is handled by
181
+ {RubyLint::Definition::Registry#load} and
182
+ {RubyLint::ConstantLoader#load\_constant}.