ruby-lint 0.0.2 → 0.0.3

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 (321) hide show
  1. data.tar.gz.asc +17 -0
  2. data/.gitignore +1 -0
  3. data/.travis.yml +25 -0
  4. data/.yardopts +4 -0
  5. data/Gemfile +1 -1
  6. data/LICENSE +1 -1
  7. data/MANIFEST +238 -49
  8. data/README.md +84 -131
  9. data/Rakefile +6 -0
  10. data/bin/ruby-lint +2 -2
  11. data/checksum/.gitkeep +0 -0
  12. data/doc/DCO.md +26 -0
  13. data/doc/architecture.md +63 -0
  14. data/doc/code_analysis.md +90 -0
  15. data/doc/configuration.md +86 -0
  16. data/doc/contributing.md +16 -0
  17. data/doc/graphviz/flow.dot +7 -0
  18. data/doc/images/.gitkeep +0 -0
  19. data/doc/images/flow.png +0 -0
  20. data/lib/ruby-lint.rb +35 -35
  21. data/lib/ruby-lint/analyze/argument_amount.rb +73 -0
  22. data/lib/ruby-lint/analyze/shadowing_variables.rb +19 -24
  23. data/lib/ruby-lint/analyze/undefined_methods.rb +68 -0
  24. data/lib/ruby-lint/analyze/undefined_variables.rb +42 -69
  25. data/lib/ruby-lint/analyze/unused_variables.rb +23 -78
  26. data/lib/ruby-lint/base.rb +85 -0
  27. data/lib/ruby-lint/cli.rb +23 -167
  28. data/lib/ruby-lint/cli/analyze.rb +99 -0
  29. data/lib/ruby-lint/cli/ast.rb +35 -0
  30. data/lib/ruby-lint/cli/base.rb +120 -0
  31. data/lib/ruby-lint/configuration.rb +112 -0
  32. data/lib/ruby-lint/constant_loader.rb +92 -0
  33. data/lib/ruby-lint/definition/ruby_method.rb +248 -0
  34. data/lib/ruby-lint/definition/ruby_object.rb +757 -0
  35. data/lib/ruby-lint/definition_generator.rb +155 -0
  36. data/lib/ruby-lint/definitions/core.rb +5 -0
  37. data/lib/ruby-lint/definitions/core/arg0.rb +7 -0
  38. data/lib/ruby-lint/definitions/core/argf.rb +7 -0
  39. data/lib/ruby-lint/definitions/core/argument_error.rb +12 -0
  40. data/lib/ruby-lint/definitions/core/argv.rb +7 -0
  41. data/lib/ruby-lint/definitions/core/array.rb +414 -0
  42. data/lib/ruby-lint/definitions/core/autoload.rb +39 -0
  43. data/lib/ruby-lint/definitions/core/basic_object.rb +46 -0
  44. data/lib/ruby-lint/definitions/core/bignum.rb +128 -0
  45. data/lib/ruby-lint/definitions/core/binding.rb +52 -0
  46. data/lib/ruby-lint/definitions/core/class.rb +23 -0
  47. data/lib/ruby-lint/definitions/core/comparable.rb +38 -0
  48. data/lib/ruby-lint/definitions/core/complex.rb +195 -0
  49. data/lib/ruby-lint/definitions/core/condition_variable.rb +19 -0
  50. data/lib/ruby-lint/definitions/core/continuation.rb +8 -0
  51. data/lib/ruby-lint/definitions/core/data.rb +8 -0
  52. data/lib/ruby-lint/definitions/core/date.rb +706 -0
  53. data/lib/ruby-lint/definitions/core/date_time.rb +381 -0
  54. data/lib/ruby-lint/definitions/core/default_record_separator.rb +7 -0
  55. data/lib/ruby-lint/definitions/core/digest.rb +166 -0
  56. data/lib/ruby-lint/definitions/core/dir.rb +496 -0
  57. data/lib/ruby-lint/definitions/core/encoding.rb +2030 -0
  58. data/lib/ruby-lint/definitions/core/encoding_error.rb +8 -0
  59. data/lib/ruby-lint/definitions/core/enumerable.rb +352 -0
  60. data/lib/ruby-lint/definitions/core/enumerator.rb +37 -0
  61. data/lib/ruby-lint/definitions/core/env.rb +7 -0
  62. data/lib/ruby-lint/definitions/core/eoferror.rb +8 -0
  63. data/lib/ruby-lint/definitions/core/erb.rb +304 -0
  64. data/lib/ruby-lint/definitions/core/errno.rb +3331 -0
  65. data/lib/ruby-lint/definitions/core/etc.rb +138 -0
  66. data/lib/ruby-lint/definitions/core/exception.rb +72 -0
  67. data/lib/ruby-lint/definitions/core/false.rb +7 -0
  68. data/lib/ruby-lint/definitions/core/false_class.rb +30 -0
  69. data/lib/ruby-lint/definitions/core/fatal_error.rb +8 -0
  70. data/lib/ruby-lint/definitions/core/fiber.rb +35 -0
  71. data/lib/ruby-lint/definitions/core/fiber_error.rb +8 -0
  72. data/lib/ruby-lint/definitions/core/file.rb +1277 -0
  73. data/lib/ruby-lint/definitions/core/file_list.rb +727 -0
  74. data/lib/ruby-lint/definitions/core/file_test.rb +106 -0
  75. data/lib/ruby-lint/definitions/core/file_utils.rb +1027 -0
  76. data/lib/ruby-lint/definitions/core/fixnum.rb +156 -0
  77. data/lib/ruby-lint/definitions/core/float.rb +307 -0
  78. data/lib/ruby-lint/definitions/core/float_domain_error.rb +8 -0
  79. data/lib/ruby-lint/definitions/core/gc.rb +57 -0
  80. data/lib/ruby-lint/definitions/core/gem.rb +3161 -0
  81. data/lib/ruby-lint/definitions/core/hash.rb +512 -0
  82. data/lib/ruby-lint/definitions/core/immediate_value.rb +19 -0
  83. data/lib/ruby-lint/definitions/core/index_error.rb +8 -0
  84. data/lib/ruby-lint/definitions/core/integer.rb +100 -0
  85. data/lib/ruby-lint/definitions/core/interrupt.rb +14 -0
  86. data/lib/ruby-lint/definitions/core/io.rb +928 -0
  87. data/lib/ruby-lint/definitions/core/ioerror.rb +8 -0
  88. data/lib/ruby-lint/definitions/core/kernel.rb +504 -0
  89. data/lib/ruby-lint/definitions/core/key_error.rb +8 -0
  90. data/lib/ruby-lint/definitions/core/load_error.rb +28 -0
  91. data/lib/ruby-lint/definitions/core/local_jump_error.rb +8 -0
  92. data/lib/ruby-lint/definitions/core/main.rb +25 -0
  93. data/lib/ruby-lint/definitions/core/marshal.rb +466 -0
  94. data/lib/ruby-lint/definitions/core/match_data.rb +73 -0
  95. data/lib/ruby-lint/definitions/core/math.rb +205 -0
  96. data/lib/ruby-lint/definitions/core/memory_segmention_error.rb +8 -0
  97. data/lib/ruby-lint/definitions/core/method.rb +61 -0
  98. data/lib/ruby-lint/definitions/core/module.rb +262 -0
  99. data/lib/ruby-lint/definitions/core/monitor.rb +39 -0
  100. data/lib/ruby-lint/definitions/core/monitor_mixin.rb +59 -0
  101. data/lib/ruby-lint/definitions/core/mutex.rb +32 -0
  102. data/lib/ruby-lint/definitions/core/name_error.rb +16 -0
  103. data/lib/ruby-lint/definitions/core/nil.rb +7 -0
  104. data/lib/ruby-lint/definitions/core/nil_class.rb +46 -0
  105. data/lib/ruby-lint/definitions/core/no_memory_error.rb +8 -0
  106. data/lib/ruby-lint/definitions/core/no_method_error.rb +18 -0
  107. data/lib/ruby-lint/definitions/core/not_implemented_error.rb +8 -0
  108. data/lib/ruby-lint/definitions/core/numeric.rb +123 -0
  109. data/lib/ruby-lint/definitions/core/object.rb +31 -0
  110. data/lib/ruby-lint/definitions/core/object_space.rb +41 -0
  111. data/lib/ruby-lint/definitions/core/open_struct.rb +49 -0
  112. data/lib/ruby-lint/definitions/core/option_parser.rb +1355 -0
  113. data/lib/ruby-lint/definitions/core/precision.rb +21 -0
  114. data/lib/ruby-lint/definitions/core/primitive_failure.rb +8 -0
  115. data/lib/ruby-lint/definitions/core/proc.rb +109 -0
  116. data/lib/ruby-lint/definitions/core/process.rb +602 -0
  117. data/lib/ruby-lint/definitions/core/psych.rb +2231 -0
  118. data/lib/ruby-lint/definitions/core/queue.rb +44 -0
  119. data/lib/ruby-lint/definitions/core/rake.rb +4784 -0
  120. data/lib/ruby-lint/definitions/core/rake_file_utils.rb +203 -0
  121. data/lib/ruby-lint/definitions/core/rakeversion.rb +7 -0
  122. data/lib/ruby-lint/definitions/core/random.rb +38 -0
  123. data/lib/ruby-lint/definitions/core/range.rb +104 -0
  124. data/lib/ruby-lint/definitions/core/range_error.rb +8 -0
  125. data/lib/ruby-lint/definitions/core/rational.rb +96 -0
  126. data/lib/ruby-lint/definitions/core/rb_config.rb +36 -0
  127. data/lib/ruby-lint/definitions/core/regexp.rb +396 -0
  128. data/lib/ruby-lint/definitions/core/regexp_error.rb +8 -0
  129. data/lib/ruby-lint/definitions/core/rubinius.rb +16637 -0
  130. data/lib/ruby-lint/definitions/core/ruby_copyright.rb +7 -0
  131. data/lib/ruby-lint/definitions/core/ruby_description.rb +7 -0
  132. data/lib/ruby-lint/definitions/core/ruby_engine.rb +7 -0
  133. data/lib/ruby-lint/definitions/core/ruby_lint.rb +93 -0
  134. data/lib/ruby-lint/definitions/core/ruby_patchlevel.rb +7 -0
  135. data/lib/ruby-lint/definitions/core/ruby_platform.rb +7 -0
  136. data/lib/ruby-lint/definitions/core/ruby_release_date.rb +7 -0
  137. data/lib/ruby-lint/definitions/core/ruby_version.rb +7 -0
  138. data/lib/ruby-lint/definitions/core/runtime_error.rb +8 -0
  139. data/lib/ruby-lint/definitions/core/scan_error.rb +8 -0
  140. data/lib/ruby-lint/definitions/core/script_error.rb +8 -0
  141. data/lib/ruby-lint/definitions/core/security_error.rb +8 -0
  142. data/lib/ruby-lint/definitions/core/shellwords.rb +37 -0
  143. data/lib/ruby-lint/definitions/core/signal.rb +37 -0
  144. data/lib/ruby-lint/definitions/core/signal_exception.rb +19 -0
  145. data/lib/ruby-lint/definitions/core/singleton.rb +37 -0
  146. data/lib/ruby-lint/definitions/core/sized_queue.rb +42 -0
  147. data/lib/ruby-lint/definitions/core/standard_error.rb +8 -0
  148. data/lib/ruby-lint/definitions/core/stderr.rb +7 -0
  149. data/lib/ruby-lint/definitions/core/stdin.rb +7 -0
  150. data/lib/ruby-lint/definitions/core/stdout.rb +7 -0
  151. data/lib/ruby-lint/definitions/core/stop_iteration.rb +8 -0
  152. data/lib/ruby-lint/definitions/core/string.rb +713 -0
  153. data/lib/ruby-lint/definitions/core/string_io.rb +287 -0
  154. data/lib/ruby-lint/definitions/core/string_scanner.rb +158 -0
  155. data/lib/ruby-lint/definitions/core/struct.rb +357 -0
  156. data/lib/ruby-lint/definitions/core/syck.rb +30 -0
  157. data/lib/ruby-lint/definitions/core/symbol.rb +90 -0
  158. data/lib/ruby-lint/definitions/core/syntax_error.rb +44 -0
  159. data/lib/ruby-lint/definitions/core/system_call_error.rb +31 -0
  160. data/lib/ruby-lint/definitions/core/system_exit.rb +19 -0
  161. data/lib/ruby-lint/definitions/core/system_stack_error.rb +8 -0
  162. data/lib/ruby-lint/definitions/core/thread.rb +209 -0
  163. data/lib/ruby-lint/definitions/core/thread_error.rb +8 -0
  164. data/lib/ruby-lint/definitions/core/thread_group.rb +22 -0
  165. data/lib/ruby-lint/definitions/core/time.rb +233 -0
  166. data/lib/ruby-lint/definitions/core/toplevel_binding.rb +7 -0
  167. data/lib/ruby-lint/definitions/core/true.rb +7 -0
  168. data/lib/ruby-lint/definitions/core/true_class.rb +30 -0
  169. data/lib/ruby-lint/definitions/core/type_error.rb +8 -0
  170. data/lib/ruby-lint/definitions/core/unbound_method.rb +51 -0
  171. data/lib/ruby-lint/definitions/core/unmarshalable.rb +13 -0
  172. data/lib/ruby-lint/definitions/core/unsupported_library_error.rb +8 -0
  173. data/lib/ruby-lint/definitions/core/weak_ref.rb +42 -0
  174. data/lib/ruby-lint/definitions/core/zero_division_error.rb +8 -0
  175. data/lib/ruby-lint/definitions_builder.rb +692 -0
  176. data/lib/ruby-lint/extensions/string.rb +15 -0
  177. data/lib/ruby-lint/helper/constant_paths.rb +41 -0
  178. data/lib/ruby-lint/helper/conversion.rb +33 -0
  179. data/lib/ruby-lint/helper/current_scope.rb +98 -0
  180. data/lib/ruby-lint/helper/methods.rb +91 -0
  181. data/lib/ruby-lint/inspector.rb +191 -0
  182. data/lib/ruby-lint/iterator.rb +187 -127
  183. data/lib/ruby-lint/node.rb +107 -0
  184. data/lib/ruby-lint/parser.rb +510 -1137
  185. data/lib/ruby-lint/parser_error.rb +15 -27
  186. data/lib/ruby-lint/presenter/json.rb +19 -0
  187. data/lib/ruby-lint/presenter/text.rb +37 -0
  188. data/lib/ruby-lint/report.rb +95 -53
  189. data/lib/ruby-lint/report/entry.rb +71 -0
  190. data/lib/ruby-lint/template/definition.erb +24 -0
  191. data/lib/ruby-lint/template/scope.rb +25 -0
  192. data/lib/ruby-lint/variable_predicates.rb +109 -0
  193. data/lib/ruby-lint/version.rb +1 -1
  194. data/ruby-lint.gemspec +19 -8
  195. data/spec/helper.rb +10 -2
  196. data/spec/ruby-lint/analyze/argument_amount.rb +91 -0
  197. data/spec/ruby-lint/analyze/shadowing_variables.rb +69 -14
  198. data/spec/ruby-lint/analyze/undefined_methods.rb +174 -0
  199. data/spec/ruby-lint/analyze/undefined_variables.rb +70 -179
  200. data/spec/ruby-lint/analyze/unused_variables.rb +63 -183
  201. data/spec/ruby-lint/configuration.rb +15 -0
  202. data/spec/ruby-lint/constant_loader.rb +32 -0
  203. data/spec/ruby-lint/definition/dsl.rb +142 -0
  204. data/spec/ruby-lint/definition/method_calls.rb +26 -0
  205. data/spec/ruby-lint/definition/ruby_method.rb +175 -0
  206. data/spec/ruby-lint/definition/ruby_object.rb +228 -0
  207. data/spec/ruby-lint/definitions_builder/assignments/arrays.rb +71 -0
  208. data/spec/ruby-lint/definitions_builder/assignments/hashes.rb +65 -0
  209. data/spec/ruby-lint/definitions_builder/assignments/objects.rb +23 -0
  210. data/spec/ruby-lint/definitions_builder/assignments/optional.rb +22 -0
  211. data/spec/ruby-lint/definitions_builder/assignments/return_values.rb +78 -0
  212. data/spec/ruby-lint/definitions_builder/assignments/variables.rb +71 -0
  213. data/spec/ruby-lint/definitions_builder/associate_nodes.rb +17 -0
  214. data/spec/ruby-lint/definitions_builder/blocks.rb +40 -0
  215. data/spec/ruby-lint/definitions_builder/classes.rb +230 -0
  216. data/spec/ruby-lint/definitions_builder/for.rb +16 -0
  217. data/spec/ruby-lint/definitions_builder/methods.rb +147 -0
  218. data/spec/ruby-lint/definitions_builder/modules.rb +175 -0
  219. data/spec/ruby-lint/definitions_builder/reference_amount.rb +31 -0
  220. data/spec/ruby-lint/definitions_builder/unused.rb +15 -0
  221. data/spec/ruby-lint/extensions/string.rb +7 -0
  222. data/spec/ruby-lint/iterator.rb +42 -417
  223. data/spec/ruby-lint/node.rb +38 -0
  224. data/spec/ruby-lint/parser/assignments.rb +225 -0
  225. data/spec/ruby-lint/parser/classes.rb +80 -122
  226. data/spec/ruby-lint/parser/errors.rb +7 -14
  227. data/spec/ruby-lint/parser/metadata.rb +17 -0
  228. data/spec/ruby-lint/parser/method_definitions.rb +111 -0
  229. data/spec/ruby-lint/parser/methods.rb +184 -216
  230. data/spec/ruby-lint/parser/modules.rb +54 -33
  231. data/spec/ruby-lint/parser/operators.rb +30 -65
  232. data/spec/ruby-lint/parser/statements/begin.rb +55 -0
  233. data/spec/ruby-lint/parser/statements/case.rb +34 -0
  234. data/spec/ruby-lint/parser/statements/defined.rb +11 -0
  235. data/spec/ruby-lint/parser/statements/for.rb +34 -0
  236. data/spec/ruby-lint/parser/statements/if.rb +46 -0
  237. data/spec/ruby-lint/parser/statements/return.rb +14 -0
  238. data/spec/ruby-lint/parser/statements/super.rb +49 -0
  239. data/spec/ruby-lint/parser/statements/unless.rb +42 -0
  240. data/spec/ruby-lint/parser/statements/until.rb +25 -0
  241. data/spec/ruby-lint/parser/statements/while.rb +25 -0
  242. data/spec/ruby-lint/parser/statements/yield.rb +18 -0
  243. data/spec/ruby-lint/parser/types/arrays.rb +47 -0
  244. data/spec/ruby-lint/parser/types/booleans.rb +11 -0
  245. data/spec/ruby-lint/parser/types/constants.rb +32 -0
  246. data/spec/ruby-lint/parser/types/hashes.rb +55 -0
  247. data/spec/ruby-lint/parser/types/nil.rb +7 -0
  248. data/spec/ruby-lint/parser/types/numbers.rb +11 -0
  249. data/spec/ruby-lint/parser/types/procs.rb +11 -0
  250. data/spec/ruby-lint/parser/types/ranges.rb +11 -0
  251. data/spec/ruby-lint/parser/types/regexp.rb +27 -0
  252. data/spec/ruby-lint/parser/types/strings.rb +44 -0
  253. data/spec/ruby-lint/parser/types/symbols.rb +15 -0
  254. data/spec/ruby-lint/presenter/json.rb +31 -0
  255. data/spec/ruby-lint/presenter/text.rb +22 -0
  256. data/spec/ruby-lint/report.rb +45 -15
  257. data/spec/ruby-lint/report/entry.rb +24 -0
  258. data/spec/support/bacon.rb +33 -0
  259. data/spec/support/building.rb +43 -0
  260. data/spec/support/definitions.rb +23 -0
  261. data/spec/support/parsing.rb +23 -0
  262. data/spec/support/simplecov.rb +16 -0
  263. data/task/build.rake +9 -0
  264. data/task/checksum.rake +13 -0
  265. data/task/coverage.rake +6 -0
  266. data/task/doc.rake +5 -0
  267. data/task/generate.rake +34 -0
  268. data/task/graphviz.rake +12 -0
  269. data/task/stdlib.rake +2 -9
  270. data/task/tag.rake +6 -0
  271. metadata +337 -68
  272. metadata.gz.asc +17 -0
  273. data/.rbenv-version +0 -1
  274. data/lib/ruby-lint/analyze/coding_style.rb +0 -407
  275. data/lib/ruby-lint/analyze/definitions.rb +0 -244
  276. data/lib/ruby-lint/analyze/method_validation.rb +0 -104
  277. data/lib/ruby-lint/callback.rb +0 -67
  278. data/lib/ruby-lint/constant_importer.rb +0 -112
  279. data/lib/ruby-lint/definition.rb +0 -230
  280. data/lib/ruby-lint/formatter/text.rb +0 -54
  281. data/lib/ruby-lint/helper/definition_resolver.rb +0 -143
  282. data/lib/ruby-lint/helper/scoping.rb +0 -138
  283. data/lib/ruby-lint/options.rb +0 -58
  284. data/lib/ruby-lint/token/assignment_token.rb +0 -35
  285. data/lib/ruby-lint/token/begin_rescue_token.rb +0 -57
  286. data/lib/ruby-lint/token/block_token.rb +0 -26
  287. data/lib/ruby-lint/token/case_token.rb +0 -44
  288. data/lib/ruby-lint/token/class_token.rb +0 -24
  289. data/lib/ruby-lint/token/keyword_token.rb +0 -43
  290. data/lib/ruby-lint/token/method_definition_token.rb +0 -64
  291. data/lib/ruby-lint/token/method_token.rb +0 -56
  292. data/lib/ruby-lint/token/parameters_token.rb +0 -99
  293. data/lib/ruby-lint/token/regexp_token.rb +0 -15
  294. data/lib/ruby-lint/token/statement_token.rb +0 -69
  295. data/lib/ruby-lint/token/token.rb +0 -176
  296. data/lib/ruby-lint/token/variable_token.rb +0 -18
  297. data/spec/benchmarks/memory.rb +0 -52
  298. data/spec/benchmarks/parse_parser.rb +0 -16
  299. data/spec/fixtures/stdlib/un.rb +0 -348
  300. data/spec/ruby-lint/analyze/coding_style.rb +0 -224
  301. data/spec/ruby-lint/analyze/complex/un.rb +0 -29
  302. data/spec/ruby-lint/analyze/definitions/classes.rb +0 -114
  303. data/spec/ruby-lint/analyze/definitions/methods.rb +0 -91
  304. data/spec/ruby-lint/analyze/definitions/modules.rb +0 -207
  305. data/spec/ruby-lint/analyze/definitions/variables.rb +0 -103
  306. data/spec/ruby-lint/analyze/method_validation.rb +0 -177
  307. data/spec/ruby-lint/callback.rb +0 -28
  308. data/spec/ruby-lint/constant_importer.rb +0 -27
  309. data/spec/ruby-lint/definition.rb +0 -96
  310. data/spec/ruby-lint/formatter/text.rb +0 -21
  311. data/spec/ruby-lint/parser/arrays.rb +0 -147
  312. data/spec/ruby-lint/parser/expander_assignments.rb +0 -183
  313. data/spec/ruby-lint/parser/hashes.rb +0 -136
  314. data/spec/ruby-lint/parser/keywords.rb +0 -89
  315. data/spec/ruby-lint/parser/objects.rb +0 -39
  316. data/spec/ruby-lint/parser/procs.rb +0 -113
  317. data/spec/ruby-lint/parser/ranges.rb +0 -49
  318. data/spec/ruby-lint/parser/regexp.rb +0 -31
  319. data/spec/ruby-lint/parser/scalars.rb +0 -93
  320. data/spec/ruby-lint/parser/statements.rb +0 -591
  321. data/spec/ruby-lint/parser/variables.rb +0 -230
@@ -3,38 +3,26 @@ module RubyLint
3
3
  # Exception class that's raised when the parser {RubyLint::Parser} detects
4
4
  # syntax errors.
5
5
  #
6
+ # @!attribute [r] line
7
+ # @return [Numeric]
8
+ # @!attribute [r] column
9
+ # @return [Numeric]
10
+ # @!attribute [r] file
11
+ # @return [String]
12
+ #
6
13
  class ParserError < SyntaxError
7
- ##
8
- # The line number on which the error occured.
9
- #
10
- # @return [Fixnum|Bignum]
11
- #
12
- attr_reader :line
14
+ attr_reader :line, :column, :file
13
15
 
14
16
  ##
15
- # The column on which the error occured.
16
- #
17
- # @return [Fixnum|Bignum]
18
- #
19
- attr_reader :column
20
-
21
- ##
22
- # The name of the file in which the error occured.
23
- #
24
- # @return [String]
25
- #
26
- attr_reader :file
27
-
28
- ##
29
- # Creates a new instance of the error class.
30
- #
31
- # @param [String] message The error message.
32
- # @param [Fixnum|Bignum] line The line of the error.
33
- # @param [Fixnum|Bignum] column The column of the error.
34
- # @param [String] file The file in which the error occured.
17
+ # @param [String] message
18
+ # @param [Numeric] line
19
+ # @param [Numeric] column
20
+ # @param [String] file
35
21
  #
36
22
  def initialize(message, line, column, file)
37
- @line, @column, @file = line, column, file
23
+ @line = line
24
+ @column = column
25
+ @file = file
38
26
 
39
27
  super(message)
40
28
  end
@@ -0,0 +1,19 @@
1
+ module RubyLint
2
+ module Presenter
3
+ ##
4
+ # {RubyLint::Presenter::JSON} formats a instance of {RubyLint::Report} into
5
+ # a JSON formatted string.
6
+ #
7
+ class JSON
8
+ ##
9
+ # @param [RubyLint::Report] report The report to present.
10
+ # @return [String]
11
+ #
12
+ def present(report)
13
+ require 'json'
14
+
15
+ return report.entries.sort.map(&:attributes).to_json
16
+ end
17
+ end # Text
18
+ end # Presenter
19
+ end # RubyLint
@@ -0,0 +1,37 @@
1
+ module RubyLint
2
+ module Presenter
3
+ ##
4
+ # {RubyLint::Presenter::Text} formats a instance of {RubyLint::Report} into
5
+ # a text based, human readable format.
6
+ #
7
+ class Text
8
+ ##
9
+ # The default format to use when presenting report entries.
10
+ #
11
+ # @return [String]
12
+ #
13
+ FORMAT = '%{file}: %{level}: line %{line}, column %{column}: %{message}'
14
+
15
+ ##
16
+ # @param [String] format The format to use for each entry.
17
+ #
18
+ def initialize(format = FORMAT.dup)
19
+ @format = format
20
+ end
21
+
22
+ ##
23
+ # @param [RubyLint::Report] report The report to present.
24
+ # @return [String]
25
+ #
26
+ def present(report)
27
+ entries = []
28
+
29
+ report.entries.sort.each do |entry|
30
+ entries << @format % entry.attributes
31
+ end
32
+
33
+ return entries.join("\n")
34
+ end
35
+ end # Text
36
+ end # Presenter
37
+ end # RubyLint
@@ -1,98 +1,140 @@
1
1
  module RubyLint
2
2
  ##
3
- # {RubyLint::Report} is a class used for storing error messages, warnings and
4
- # informational messages about code processed by {RubyLint::Iterator} and
5
- # individual callback classes.
3
+ # {RubyLint::Report} is a data container for error messages, warnings,
4
+ # informational messages and other custom defined types of messages. It
5
+ # should be used by the various analysis classes to store information such as
6
+ # errors for undefined variables and warnings for potentially confusing code.
6
7
  #
7
- # The process of adding data to a report involves two steps:
8
+ # ## Levels
8
9
  #
9
- # 1. setting which levels to enable
10
- # 2. adding the data
10
+ # Each instance can add entries for a set of predefined reporting levels. By
11
+ # default the following levels are defined:
11
12
  #
12
- # The first step is done by creating a new instance of this class and
13
- # defining a list of level names in the constructor's second parameter. The
14
- # following levels are used by RubyLint itself:
13
+ # * error
14
+ # * warning
15
+ # * info
15
16
  #
16
- # * `:error`
17
- # * `:warning`
18
- # * `:info`
17
+ # Unless other levels are specified when creating an instance these levels
18
+ # are used for each new instance.
19
19
  #
20
- # The second step is done by calling {RubyLint::Report#add}. This method is used
21
- # to add data for a specific level. If this level is disabled the data is not
22
- # added to the report.
20
+ # Adding available levels can be done as following:
23
21
  #
24
- # A basic example of this is the following:
22
+ # RubyLint::Report.add_level(:pedantic)
25
23
  #
26
- # report = RubyLint::Report.new('test_file.rb', [:error])
24
+ # Retrieving a list of available levels in turn is done as following:
27
25
  #
28
- # report.add(:error, 'This is an error message', 1, 0)
26
+ # RubyLint::Report.levels # => [:error, :warning, :info, :pedantic]
29
27
  #
30
- # # This message will not be added since it's not an error.
31
- # report.add(:info, 'This is an info message', 2, 0)
28
+ # Each level is a Symbol and will be cased to one automatically.
29
+ #
30
+ # ## Adding Entries
31
+ #
32
+ # Adding entries can be done by either calling {RubyLint::Report#add} or a
33
+ # method for the corresponding reporting level:
34
+ #
35
+ # report = RubyLint::Report.new
36
+ #
37
+ # # Both these calls do the same.
38
+ # report.add(:info, 'informational message', 1, 2, 'file.rb')
39
+ # report.info('informational message', 1, 2, 'file.rb')
40
+ #
41
+ # When using {RubyLint::Report#add} any invalid/disabled reporting levels
42
+ # will be silently ignored. This makes it easier for code to add entries of a
43
+ # particular level without having to manually check if said level is enabled.
44
+ #
45
+ # @!attribute [r] entries
46
+ # @return [Array] The entries of the report.
47
+ # @!attribute [r] levels
48
+ # @return [Array] The enabled levels of the report.
32
49
  #
33
50
  class Report
51
+ attr_reader :entries, :levels
52
+
34
53
  ##
35
- # Array containing the levels that are enabled by default.
54
+ # Reporting levels that are always available.
36
55
  #
37
56
  # @return [Array]
38
57
  #
39
58
  DEFAULT_LEVELS = [:error, :warning, :info]
40
59
 
41
60
  ##
42
- # A hash containing the various messages stored per level.
61
+ # Adds a new reporting level to the list of available levels.
43
62
  #
44
- # @return [Hash]
63
+ # @param [#to_sym] level The reporting level to add.
45
64
  #
46
- attr_reader :messages
65
+ def self.add_level(level)
66
+ levels << level.to_sym
67
+ end
47
68
 
48
69
  ##
49
- # An array of levels to use. For example, if `:info` is not included any
50
- # message using this level is ignored.
70
+ # Deletes a reporting level from the list of available levels. This does
71
+ # not affect existing instances of this class.
51
72
  #
52
- # @return [Array]
73
+ # @param [#to_sym] level The level to delete.
53
74
  #
54
- attr_reader :levels
75
+ def self.delete_level(level)
76
+ levels.delete(level.to_sym)
77
+ end
55
78
 
56
79
  ##
57
- # String containing the name/path of the file this report belongs to.
80
+ # Returns a list of the available reporting levels.
58
81
  #
59
- # @return [String]
82
+ # @return [Array]
60
83
  #
61
- attr_reader :file
84
+ def self.levels
85
+ return @levels ||= DEFAULT_LEVELS.dup
86
+ end
62
87
 
63
88
  ##
64
- # Creates a new instance of the class.
65
- #
66
- # @param [String] file The name/path of the file that this report belongs
67
- # to.
68
- # @param [Array] levels The message levels to use for this report.
89
+ # @param [Array] levels The reporting levels to enable for this instance.
69
90
  #
70
- def initialize(file = '(ruby-lint)', levels = DEFAULT_LEVELS)
71
- @file = file
72
- @levels = levels
73
- @messages = {}
91
+ def initialize(levels = self.class.levels)
92
+ @levels = levels.map(&:to_sym)
93
+ @entries = []
74
94
  end
75
95
 
76
96
  ##
77
- # Adds a message to the report.
97
+ # Adds a new entry to the report.
78
98
  #
79
- # @param [#to_sym] level The level of the message.
80
- # @param [String] message The message to add.
81
- # @param [Fixnum] line The line number of the message.
82
- # @param [Fixnum] column The column number of the message.
99
+ # @param [#to_sym] level
100
+ # @param [String] message
101
+ # @param [Numeric] line
102
+ # @param [Numeric] column
103
+ # @param [String] file
83
104
  #
84
- def add(level, message, line, column)
105
+ def add(level, message, line, column, file)
85
106
  level = level.to_sym
86
107
 
87
- return unless @levels.include?(level)
108
+ if valid_level?(level)
109
+ @entries << Entry.new(level, message, line, column, file)
110
+ end
111
+ end
112
+
113
+ ##
114
+ # Makes it easier to add entries to a report by calling methods such as
115
+ # `#info` instead of `add(:info, ...)`.
116
+ #
117
+ # @param [Symbol] name
118
+ # @param [Array] args
119
+ # @param [Proc] block
120
+ # @raise [NoMethodError] Raised when an invalid method was called.
121
+ #
122
+ def method_missing(name, *args, &block)
123
+ if valid_level?(name)
124
+ return add(name, *args, &block)
125
+ else
126
+ raise NoMethodError, 'undefined method "%s" for %s' % [name, inspect]
127
+ end
128
+ end
88
129
 
89
- @messages[level] ||= []
130
+ private
90
131
 
91
- @messages[level] << {
92
- :message => message,
93
- :line => line,
94
- :column => column
95
- }
132
+ ##
133
+ # @param [Symbol] level
134
+ # @return [TrueClass|FalseClass]
135
+ #
136
+ def valid_level?(level)
137
+ return @levels.include?(level)
96
138
  end
97
139
  end # Report
98
140
  end # RubyLint
@@ -0,0 +1,71 @@
1
+ module RubyLint
2
+ class Report
3
+ ##
4
+ # {RubyLint::Report::Entry} contains data about a single report entry such
5
+ # as the message and line number.
6
+ #
7
+ # @!attribute [r] level
8
+ # @return [Symbol]
9
+ # @!attribute [r] message
10
+ # @return [String]
11
+ # @!attribute [r] line
12
+ # @return [Numeric]
13
+ # @!attribute [r] column
14
+ # @return [Numeric]
15
+ # @!attribute [r] file
16
+ # @return [String]
17
+ #
18
+ class Entry
19
+ attr_reader :level, :message, :line, :column, :file
20
+
21
+ ##
22
+ # @param [Symbol] level
23
+ # @param [String] message
24
+ # @param [Numeric] line
25
+ # @param [Numeric] column
26
+ # @param [String] file
27
+ #
28
+ def initialize(level, message, line, column, file)
29
+ @level = level
30
+ @message = message
31
+ @line = line
32
+ @column = column
33
+ @file = file
34
+ end
35
+
36
+ ##
37
+ # @return [String]
38
+ #
39
+ def filename
40
+ return File.basename(file)
41
+ end
42
+
43
+ ##
44
+ # Returns a Hash containing the attributes of the entry.
45
+ #
46
+ # @return [Hash]
47
+ #
48
+ def attributes
49
+ return {
50
+ :level => level,
51
+ :message => message,
52
+ :line => line,
53
+ :column => column,
54
+ :file => file
55
+ }
56
+ end
57
+
58
+ ##
59
+ # Determines the sort order of the current entry. The entry is sorted
60
+ # based on the filename and the reporting level.
61
+ #
62
+ # @param [RubyLint::Report::Entry] other The entry to compare with the
63
+ # current one.
64
+ # @return [Numeric]
65
+ #
66
+ def <=>(other)
67
+ return (filename <=> other.filename) <=> (other.level <=> level)
68
+ end
69
+ end # Entry
70
+ end # Report
71
+ end # RubyLint
@@ -0,0 +1,24 @@
1
+ ##
2
+ # Constant: <%= @constant_name %>
3
+ # Created: <%= Time.new %>
4
+ # Platform: <%= RUBY_ENGINE %> <%= Rubinius::VERSION rescue RUBY_VERSION %>
5
+ #
6
+ RubyLint.global_scope.define_constant('<%= @constant_name %>') do |klass|
7
+ <%- if @superclass -%>
8
+ klass.inherits(RubyLint.global_constant('<%= @superclass %>'))
9
+ <%- end -%>
10
+ <%- @methods.each do |type, collection| -%>
11
+ <%- collection.each do |name, args| -%>
12
+
13
+ <%- if args.empty? -%>
14
+ klass.define_<%= type %>('<%= name %>')
15
+ <%- else -%>
16
+ klass.define_<%= type %>('<%= name %>') do |method|
17
+ <%- args.each do |arg| -%>
18
+ method.define_<%= arg[:method] %>('<%= arg[:name] %>')
19
+ <%- end -%>
20
+ end
21
+ <%- end -%>
22
+ <%- end -%>
23
+ <%- end -%>
24
+ end
@@ -0,0 +1,25 @@
1
+ module RubyLint
2
+ module Template
3
+ ##
4
+ # Class used for storing variables for an ERB template without polluting
5
+ # the namespace of the code that uses the template.
6
+ #
7
+ class Scope
8
+ ##
9
+ # @param [Hash] variables
10
+ #
11
+ def initialize(variables = {})
12
+ variables.each do |name, value|
13
+ instance_variable_set("@#{name}", value)
14
+ end
15
+ end
16
+
17
+ ##
18
+ # @return [Binding]
19
+ #
20
+ def get_binding
21
+ return binding # #binding() is a private method.
22
+ end
23
+ end # Scope
24
+ end # Template
25
+ end # RubyLint
@@ -0,0 +1,109 @@
1
+ module RubyLint
2
+ ##
3
+ # Module that provides various predicate methods for checking node/definition
4
+ # types.
5
+ #
6
+ module VariablePredicates
7
+ ##
8
+ # Array containing the various variable types that are available in Ruby.
9
+ #
10
+ # @return [Array]
11
+ #
12
+ VARIABLE_TYPES = [
13
+ :local_variable,
14
+ :instance_variable,
15
+ :class_variable,
16
+ :global_variable
17
+ ]
18
+
19
+ ##
20
+ # Array containing various Ruby types that are considered to be scalar
21
+ # values.
22
+ #
23
+ # @return [Array]
24
+ #
25
+ SCALAR_TYPES = [:integer, :float, :string, :symbol]
26
+
27
+ ##
28
+ # Array containing various predicate methods to create.
29
+ #
30
+ # @return [Array]
31
+ #
32
+ PREDICATE_METHODS = [
33
+ :aref,
34
+ :array,
35
+ :class,
36
+ :constant,
37
+ :constant_path,
38
+ :hash,
39
+ :identifier,
40
+ :keyword,
41
+ :method,
42
+ :method_definition,
43
+ :module
44
+ ]
45
+
46
+ ##
47
+ # Hash containing various Node types and the associated Ruby classes.
48
+ #
49
+ # @return [Hash]
50
+ #
51
+ RUBY_CLASSES = {
52
+ :string => 'String',
53
+ :symbol => 'Symbol',
54
+ :integer => 'Fixnum',
55
+ :float => 'Float',
56
+ :regexp => 'Regexp',
57
+ :array => 'Array',
58
+ :hash => 'Hash',
59
+ :range => 'Range',
60
+ :lambda => 'Proc'
61
+ }
62
+
63
+ (VARIABLE_TYPES + PREDICATE_METHODS).each do |type|
64
+ define_method("#{type}?") do
65
+ return @type == type
66
+ end
67
+ end
68
+
69
+ ##
70
+ # Returns `true` if the current node is a variable node.
71
+ #
72
+ # @return [TrueClass|FalseClass]
73
+ #
74
+ def variable?
75
+ return VARIABLE_TYPES.include?(@type)
76
+ end
77
+
78
+ ##
79
+ # @return [TrueClass|FalseClass]
80
+ #
81
+ def constant?
82
+ return @type == :constant || @type == :module || @type == :class
83
+ end
84
+
85
+ ##
86
+ # Returns `true` if the object type is a Ruby scalar such as a string or
87
+ # integer.
88
+ #
89
+ def scalar?
90
+ return SCALAR_TYPES.include?(@type)
91
+ end
92
+
93
+ ##
94
+ # Indicates if the node is a collection of values.
95
+ #
96
+ # @return [TrueClass|FalseClass]
97
+ #
98
+ def collection?
99
+ return array? || hash?
100
+ end
101
+
102
+ ##
103
+ # @return [String]
104
+ #
105
+ def ruby_class
106
+ return RUBY_CLASSES[type]
107
+ end
108
+ end # VariablePredicates
109
+ end # RubyLint