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
@@ -1,167 +1,23 @@
1
- require 'optparse'
2
-
3
- module RubyLint
4
- ##
5
- # {RubyLint::CLI} is the commandline interface to RubyLint.
6
- #
7
- class CLI
8
- ##
9
- # Creates a new instance of the class and configures OptionParser.
10
- #
11
- def initialize
12
- @formatters = constant_short_names(RubyLint::Formatter)
13
- @analyzers = constant_short_names(RubyLint::Analyze)
14
-
15
- @option_parser = OptionParser.new do |opts|
16
- opts.banner = 'A static code analysis tool and linter for Ruby'
17
- opts.program_name = 'ruby-lint'
18
- opts.version = RubyLint::VERSION
19
- opts.summary_indent = ' '
20
-
21
- opts.separator ''
22
- opts.separator 'Usage:'
23
- opts.separator ' $ ruby-ling [FILES] [OPTIONS]'
24
-
25
- opts.separator ''
26
- opts.separator 'Analyzers:'
27
- opts.separator hash_to_list(@analyzers)
28
-
29
- opts.separator ''
30
- opts.separator 'Formatters:'
31
- opts.separator hash_to_list(@formatters)
32
-
33
- opts.separator ''
34
- opts.separator 'Reporting Levels:'
35
- opts.separator " error\n warning\n info"
36
-
37
- opts.separator ''
38
- opts.separator 'Options:'
39
-
40
- opts.on(
41
- '-f',
42
- '--formatter=VALUE',
43
- 'The formatter to use',
44
- String
45
- ) do |formatter|
46
- if @formatters.key?(formatter)
47
- RubyLint.options.formatter = @formatters[formatter]
48
- end
49
- end
50
-
51
- opts.on(
52
- '-l',
53
- '--levels=VALUE',
54
- 'The reporting levels to enable',
55
- Array
56
- ) do |levels|
57
- RubyLint.options.levels = levels.map { |level| level.to_sym }
58
- end
59
-
60
- opts.on(
61
- '-a',
62
- '--analyzers=VALUE',
63
- 'The analyzers to enable',
64
- Array
65
- ) do |names|
66
- analyzers = Options::REQUIRED_ANALYZERS.dup
67
-
68
- names.each do |name|
69
- const = @analyzers[name]
70
-
71
- if const and !analyzers.include?(const)
72
- analyzers << const
73
- end
74
- end
75
-
76
- RubyLint.options.analyzers = analyzers
77
- end
78
-
79
- opts.on('-h', '--help', 'Shows this help message') do
80
- puts @option_parser
81
- exit
82
- end
83
-
84
- opts.on('-v', '--version', 'Shows the current version') do
85
- version
86
- end
87
- end
88
- end
89
-
90
- ##
91
- # Runs RubyLint.
92
- #
93
- # @param [Array] argv Array of commandline parameters.
94
- #
95
- def run(argv = ARGV)
96
- @option_parser.parse!(argv)
97
-
98
- abort 'You have to specify a file to analyze' if argv.empty?
99
-
100
- argv.each do |file|
101
- abort "The file #{file} is not valid" unless File.file?(file)
102
-
103
- code = File.read(file, File.size(file))
104
- tokens = Parser.new(code, file).parse
105
- report = Report.new(file, RubyLint.options.levels)
106
- iterator = Iterator.new(report)
107
- formatter = RubyLint.options.formatter.new
108
-
109
- RubyLint.options.analyzers.each { |const| iterator.bind(const) }
110
-
111
- iterator.run(tokens)
112
-
113
- output = formatter.format(report)
114
-
115
- puts output unless output.empty?
116
- end
117
- end
118
-
119
- ##
120
- # Shows the current version of RubyLint.
121
- #
122
- def version
123
- puts "RubyLint version #{RubyLint::VERSION} running on #{RUBY_DESCRIPTION}"
124
- exit
125
- end
126
-
127
- private
128
-
129
- ##
130
- # Returns a hash containing various short names and the constants to use.
131
- #
132
- # @param [Class] constant The constant to use.
133
- # @return [Hash]
134
- #
135
- def constant_short_names(constant)
136
- hash = {}
137
-
138
- constant.constants.sort.each do |const|
139
- name = const.to_s.gsub(/([a-z]+)([A-Z]+)/, '\\1_\\2').downcase
140
- hash[name] = constant.const_get(const)
141
- end
142
-
143
- return hash
144
- end
145
-
146
- ##
147
- # Returns a string containing the names and descriptions of various
148
- # constants formatted as a list.
149
- #
150
- # @param [Hash] hash
151
- # @return [String]
152
- #
153
- def hash_to_list(hash)
154
- longest = hash.keys.sort { |l, r| l.length <=> r.length }[-1].length
155
- longest = longest > 32 ? longest : 32
156
- list = []
157
-
158
- hash.each do |name, const|
159
- description = const.const_get(:DESCRIPTION)
160
-
161
- list << " %-#{longest}s %s" % [name, description]
162
- end
163
-
164
- return list.join("\n")
165
- end
166
- end # CLI
167
- end # RubyLint
1
+ RubyLint::Configuration.register_names 'analysis' do |names|
2
+ names['argument_amount'] = RubyLint::Analyze::ArgumentAmount
3
+ names['shadowing_variables'] = RubyLint::Analyze::ShadowingVariables
4
+ names['undefined_methods'] = RubyLint::Analyze::UndefinedMethods
5
+ names['undefined_variables'] = RubyLint::Analyze::UndefinedVariables
6
+ names['unused_variables'] = RubyLint::Analyze::UnusedVariables
7
+ end
8
+
9
+ RubyLint::Configuration.register_names 'presenters' do |names|
10
+ names['text'] = RubyLint::Presenter::Text
11
+ names['json'] = RubyLint::Presenter::JSON
12
+ end
13
+
14
+ RubyLint::Configuration.register_names 'levels' do |names|
15
+ RubyLint::Report.levels.each do |level|
16
+ names[level.to_s] = level
17
+ end
18
+ end
19
+
20
+ require 'slop'
21
+ require_relative 'cli/base'
22
+ require_relative 'cli/analyze'
23
+ require_relative 'cli/ast'
@@ -0,0 +1,99 @@
1
+ RubyLint::CLI.options.command :analyze do
2
+ banner 'Usage: ruby-lint analyze [FILES] [OPTIONS]'
3
+ description 'Analyzes the source code of Ruby files'
4
+
5
+ separator <<-EOF.chomp
6
+
7
+ About:
8
+
9
+ This command analyses the source code of a Ruby file and presents a report
10
+ containing information such as errors about invalid code, warnings and
11
+ informational messages.
12
+
13
+ Configuration:
14
+
15
+ When this command is executed it will try to load a configuration file in
16
+ one of the following two locations (in this order):
17
+
18
+ * $PWD/ruby-lint.rb
19
+ * ~/.ruby-lint.rb
20
+
21
+ Only the first existing configuration file is loaded.
22
+
23
+ These configuration files can be used for specifying the presenter, reporting
24
+ levels and various other options.
25
+
26
+ You can also configure various parts using the supplied commandline options.
27
+ For example, to use the JSON presenter you'd run the following:
28
+
29
+ $ ruby-lint analyze ./test_file.rb --presenter=json
30
+
31
+ Analysis Classes:
32
+
33
+ #{RubyLint::CLI.format_names('analysis')}
34
+
35
+ Presenters:
36
+
37
+ #{RubyLint::CLI.format_names('presenters')}
38
+
39
+ Reporting Levels:
40
+
41
+ #{RubyLint::CLI.format_names('levels')}
42
+
43
+ Examples:
44
+
45
+ To analyze a single file you can run the following command:
46
+
47
+ $ ruby-lint analyze ./test_file.rb
48
+
49
+ You can also specify multiple files:
50
+
51
+ $ ruby-lint analyze first_file.rb second_file.rb
52
+ EOF
53
+
54
+ separator RubyLint::CLI::OPTIONS_HEADER
55
+
56
+ RubyLint::CLI.help_option(self)
57
+
58
+ on :l=, :levels=, 'The reporting levels to enable', :as => Array
59
+ on :p=, :presenter=, 'The presenter to use', :as => String
60
+ on :a=, :analysis=, 'The analysis classes to use', :as => Array
61
+
62
+ run do |opts, args|
63
+ abort 'You must specify at least one file to analyze' if args.empty?
64
+
65
+ files = RubyLint::CLI.existing_files(args)
66
+
67
+ RubyLint.load_configuration
68
+
69
+ RubyLint.configuration.set_reporting_levels(opts[:l]) if opts[:l]
70
+ RubyLint.configuration.set_presenter(opts[:p]) if opts[:p]
71
+ RubyLint.configuration.set_analysis(opts[:a]) if opts[:a]
72
+
73
+ files.each do |file|
74
+ ast = RubyLint::Parser.new(File.read(file), file).parse
75
+
76
+ RubyLint::ConstantLoader.new.iterate(ast)
77
+
78
+ report = RubyLint.configuration.report
79
+ presenter = RubyLint.configuration.presenter.new
80
+ defs_builder = RubyLint::DefinitionsBuilder.new
81
+
82
+ defs_builder.iterate(ast)
83
+
84
+ RubyLint.configuration.analysis.each do |constant|
85
+ instance = constant.new(
86
+ :report => report,
87
+ :definitions => defs_builder.options[:definitions],
88
+ :node_definitions => defs_builder.options[:node_definitions]
89
+ )
90
+
91
+ instance.iterate(ast)
92
+ end
93
+
94
+ output = presenter.present(report)
95
+
96
+ puts output unless output.empty?
97
+ end
98
+ end # run do |opts, args|
99
+ end # RubyLint::CLI.options.command
@@ -0,0 +1,35 @@
1
+ RubyLint::CLI.options.command :ast do
2
+ banner 'Usage: ruby-lint ast [FILE] [OPTIONS]'
3
+ description 'Shows the AST of a Ruby file'
4
+
5
+ separator <<-EOF.chomp
6
+
7
+ About:
8
+
9
+ This command displays the raw AST of a Ruby file. Unlike the `analyze`
10
+ command this particular one only takes a single file.
11
+
12
+ The output is a set of S expressions generated by the ruby-lint parser
13
+ (RubyLint::Parser).
14
+
15
+ Examples:
16
+
17
+ Displaying the AST:
18
+
19
+ $ ruby-lint ast ./test_file.rb
20
+ EOF
21
+
22
+ separator RubyLint::CLI::OPTIONS_HEADER
23
+
24
+ RubyLint::CLI.help_option(self)
25
+
26
+ run do |opts, args|
27
+ file = args[0]
28
+
29
+ if !file or !File.file?(file)
30
+ abort 'You must specify an existing file'
31
+ end
32
+
33
+ puts RubyLint::Parser.new(File.read(file), file).parse.inspect
34
+ end
35
+ end
@@ -0,0 +1,120 @@
1
+ module RubyLint
2
+ module CLI
3
+ ##
4
+ # Hash containing configuration options for Slop.
5
+ #
6
+ # @return [Hash]
7
+ #
8
+ SLOP_OPTIONS = {
9
+ :strict => true,
10
+ :banner => 'Usage: ruby-lint [COMMAND] [OPTIONS]'
11
+ }
12
+
13
+ ##
14
+ # The header to use for separating options with other bits of information
15
+ # in help messages.
16
+ #
17
+ # @return [String]
18
+ #
19
+ OPTIONS_HEADER = "\nOptions:\n"
20
+
21
+ ##
22
+ # Returns an Array containing the file paths that exist. If a non existing
23
+ # file is encountered `abort` is called.
24
+ #
25
+ # @param [Array] files
26
+ # @return [Array]
27
+ #
28
+ def self.existing_files(files)
29
+ existing = []
30
+
31
+ files.each do |file|
32
+ file = File.expand_path(file)
33
+
34
+ if File.file?(file)
35
+ existing << file
36
+ else
37
+ abort "The file #{file} does not exist"
38
+ end
39
+ end
40
+
41
+ return existing
42
+ end
43
+
44
+ ##
45
+ # Returns a String containing a list of names as registered in
46
+ # {RubyLint::Configuration.names}.
47
+ #
48
+ # @param [String] scope
49
+ # @see RubyLint::Configuration.names
50
+ # @return [String]
51
+ #
52
+ def self.format_names(scope)
53
+ return "* #{Configuration.names[scope].keys.sort.join("\n * ")}"
54
+ end
55
+
56
+ ##
57
+ # Starts the CLI.
58
+ #
59
+ def self.run
60
+ options.parse
61
+ end
62
+
63
+ ##
64
+ # @return [Slop]
65
+ #
66
+ def self.options
67
+ return @options ||= default_options
68
+ end
69
+
70
+ ##
71
+ # @return [Slop]
72
+ #
73
+ def self.default_options
74
+ return Slop.new(SLOP_OPTIONS) do
75
+ separator OPTIONS_HEADER
76
+
77
+ CLI.help_option(self)
78
+
79
+ on :v, :version, 'Shows the current version' do
80
+ puts CLI.version_information
81
+ exit
82
+ end
83
+
84
+ run do |opts, args|
85
+ if args.empty?
86
+ puts self
87
+ exit
88
+ else
89
+ CLI.options.commands['analyze'].parse(args)
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ ##
96
+ # Adds a `-h/--help` option for a command. This method should be executed
97
+ # in the context of a Slop command.
98
+ #
99
+ # @param [Mixed] command
100
+ #
101
+ def self.help_option(command)
102
+ command.instance_eval do
103
+ on :h, :help, 'Shows this help message' do
104
+ puts self
105
+ exit
106
+ end
107
+ end
108
+ end
109
+
110
+ ##
111
+ # Returns a String containing information about the current ruby-lint
112
+ # version and platform.
113
+ #
114
+ # @return [String]
115
+ #
116
+ def self.version_information
117
+ return "ruby-lint v#{VERSION} on #{RUBY_DESCRIPTION}"
118
+ end
119
+ end # CLI
120
+ end # RubyLint
@@ -0,0 +1,112 @@
1
+ module RubyLint
2
+ ##
3
+ # The Configuration class is used for storing configuration information used
4
+ # when running the CLI of ruby-lint. It contains information such as the
5
+ # reporting levels, the formatter to use and so on.
6
+ #
7
+ # @!attribute [rw] presenter
8
+ # @return [RubyLint::Presenter] The presenter to use for displaying reports.
9
+ # @!attribute [rw] report_levels
10
+ # @return [Array] The reporting levels to use.
11
+ # @!attribute [rw] analysis
12
+ # @return [Array] The analysis classes to enable.
13
+ #
14
+ class Configuration
15
+ attr_accessor :presenter, :report_levels, :analysis
16
+
17
+ ##
18
+ # Provides a small block based DSL for registering multiple names.
19
+ #
20
+ # @param [String] scope The scope to store the names under.
21
+ # @see RubyLint::Configuration.names
22
+ #
23
+ def self.register_names(scope)
24
+ hash = {}
25
+
26
+ yield hash
27
+
28
+ names[scope] = hash
29
+ end
30
+
31
+ ##
32
+ # Returns a Hash used for storing values and their human readable names.
33
+ # This Hash is primarily used for the CLI.
34
+ #
35
+ # @return [Hash]
36
+ #
37
+ def self.names
38
+ return @names ||= {}
39
+ end
40
+
41
+ ##
42
+ # @param [Hash] options
43
+ #
44
+ def initialize(options = {})
45
+ options.each do |key, value|
46
+ instance_variable_set("@#{key}", value)
47
+ end
48
+
49
+ @presenter ||= RubyLint::Presenter::Text
50
+ @report_levels ||= Report::DEFAULT_LEVELS
51
+ @analysis ||= default_analysis_classes
52
+ end
53
+
54
+ ##
55
+ # @return [Array]
56
+ #
57
+ def default_analysis_classes
58
+ return Analyze.constants.map do |const|
59
+ Analyze.const_get(const)
60
+ end
61
+ end
62
+
63
+ ##
64
+ # Returns a report with the report levels set based on this configuration
65
+ # instance.
66
+ #
67
+ # @return [RubyLint::Report]
68
+ #
69
+ def report
70
+ return Report.new(report_levels)
71
+ end
72
+
73
+ ##
74
+ # Set the reporting levels based on a set of CLI options.
75
+ #
76
+ # @param [Array] levels
77
+ #
78
+ def set_reporting_levels(levels)
79
+ self.report_levels = []
80
+ available = self.class.names['levels']
81
+
82
+ levels.each do |level|
83
+ report_levels << available[level] if available[level]
84
+ end
85
+ end
86
+
87
+ ##
88
+ # Sets the presenter based on a set of CLI options.
89
+ #
90
+ # @param [String] name
91
+ #
92
+ def set_presenter(name)
93
+ if self.class.names['presenters'][name]
94
+ self.presenter = self.class.names['presenters'][name]
95
+ end
96
+ end
97
+
98
+ ##
99
+ # Sets the analysis classes based on a set of CLI options.
100
+ #
101
+ # @param [Array] names
102
+ #
103
+ def set_analysis(names)
104
+ self.analysis = []
105
+ available = self.class.names['analysis']
106
+
107
+ names.each do |name|
108
+ self.analysis << available[name] if available[name]
109
+ end
110
+ end
111
+ end # Configuration
112
+ end # RubyLint