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
@@ -0,0 +1,65 @@
1
+ require File.expand_path('../../../../helper', __FILE__)
2
+
3
+ describe 'Building variable definitions' do
4
+ should 'assign hashes as instances' do
5
+ defs = build_definitions('numbers = {}')
6
+ value = defs.lookup(:local_variable, 'numbers').value
7
+
8
+ value.instance?.should == true
9
+
10
+ value.has_definition?(:instance_method, 'each').should == true
11
+ end
12
+
13
+ describe 'hash key assignments' do
14
+ should 'return key/value pairs as an Array' do
15
+ code = 'numbers = {:key => "value", :extra => "example"}'
16
+ defs = build_definitions(code)
17
+ numbers = defs.lookup(:local_variable, 'numbers')
18
+ value = numbers.value
19
+
20
+ value.value.is_a?(Array).should == true
21
+ value.value.length.should == 2
22
+
23
+ value.value[0].name.should == 'key'
24
+ value.value[0].value.type.should == :string
25
+ value.value[0].value.value.should == 'value'
26
+
27
+ value.value[1].name.should == 'extra'
28
+ value.value[1].value.type.should == :string
29
+ value.value[1].value.value.should == 'example'
30
+ end
31
+
32
+ should 'process a single key assignment' do
33
+ code = <<-CODE
34
+ numbers = {}
35
+ numbers['one'] = 1
36
+ CODE
37
+
38
+ defs = build_definitions(code)
39
+
40
+ numbers = defs.lookup(:local_variable, 'numbers')
41
+ one = numbers.lookup(:member, 'one')
42
+
43
+ one.is_a?(ruby_object).should == true
44
+ one.name.should == 'one'
45
+ one.type.should == :string
46
+
47
+ one.value.type.should == :integer
48
+ one.value.value.should == '1'
49
+ end
50
+
51
+ should 'process a single key assignment using variables' do
52
+ code = <<-CODE
53
+ key = 'one'
54
+ numbers = {'two' => 2}
55
+ numbers[key] = 1
56
+ CODE
57
+
58
+ defs = build_definitions(code)
59
+ numbers = defs.lookup(:local_variable, 'numbers')
60
+
61
+ numbers.lookup(:member, 'one').value.value.should == '1'
62
+ numbers.lookup(:member, 'two').value.value.should == '2'
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,23 @@
1
+ require File.expand_path('../../../../helper', __FILE__)
2
+
3
+ describe 'Building variable definitions' do
4
+ describe 'object member assignments' do
5
+ should 'process a single member assignment' do
6
+ code = <<-CODE
7
+ person = OpenStruct.new
8
+ person.name = 'Matz'
9
+ CODE
10
+
11
+ defs = build_definitions(code)
12
+ person = defs.lookup(:local_variable, 'person')
13
+ name = person.lookup(:member, 'name')
14
+
15
+ name.is_a?(ruby_object).should == true
16
+ name.name.should == 'name'
17
+ name.type.should == :identifier
18
+
19
+ name.value.type.should == :string
20
+ name.value.value.should == 'Matz'
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ require File.expand_path('../../../../helper', __FILE__)
2
+
3
+ describe 'Building variable definitions' do
4
+ describe 'optional assignments' do
5
+ should 'process an assignment for an existing variable' do
6
+ code = <<-CODE
7
+ number = 10
8
+ number ||= 20
9
+ CODE
10
+
11
+ defs = build_definitions(code)
12
+
13
+ defs.lookup(:local_variable, 'number').value.value.should == '10'
14
+ end
15
+
16
+ should 'process an assignment for a non existing variable' do
17
+ defs = build_definitions('number ||= 10')
18
+
19
+ defs.lookup(:local_variable, 'number').value.value.should == '10'
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,78 @@
1
+ require File.expand_path('../../../../helper', __FILE__)
2
+
3
+ describe 'Using return values in assignments' do
4
+ it 'should assign a return value' do
5
+ code = 'word = String.new'
6
+ defs = build_definitions(code)
7
+ value = defs.lookup(:local_variable, 'word').value
8
+
9
+ value.is_a?(ruby_object).should == true
10
+
11
+ value.type.should == :constant
12
+ value.name.should == 'String'
13
+ value.instance?.should == true
14
+ end
15
+
16
+ it 'should assign a nil value for a missing return value' do
17
+ code = <<-CODE
18
+ def example
19
+ end
20
+
21
+ number = example
22
+ CODE
23
+
24
+ defs = build_definitions(code)
25
+
26
+ defs.lookup(:local_variable, 'number').value.nil?.should == true
27
+ end
28
+
29
+ it 'should assign return values when chaining method calls' do
30
+ code = 'word = String.new.initialize.initialize'
31
+ defs = build_definitions(code)
32
+ value = defs.lookup(:local_variable, 'word').value
33
+
34
+ value.is_a?(ruby_object).should == true
35
+
36
+ value.type.should == :constant
37
+ value.name.should == 'String'
38
+ value.instance?.should == true
39
+ end
40
+
41
+ describe 'setting instance types for core Ruby types' do
42
+ should 'create a new String instance' do
43
+ defs = build_definitions('number = "10"')
44
+
45
+ defs.lookup(:local_variable, 'number').value.instance?.should == true
46
+ end
47
+
48
+ should 'create a new Symbol instance' do
49
+ defs = build_definitions('number = :"10"')
50
+
51
+ defs.lookup(:local_variable, 'number').value.instance?.should == true
52
+ end
53
+
54
+ should 'create a new Fixnum instance' do
55
+ defs = build_definitions('number = 10')
56
+
57
+ defs.lookup(:local_variable, 'number').value.instance?.should == true
58
+ end
59
+
60
+ should 'create a new Float instance' do
61
+ defs = build_definitions('number = 10.0')
62
+
63
+ defs.lookup(:local_variable, 'number').value.instance?.should == true
64
+ end
65
+
66
+ should 'create a new Array instance' do
67
+ defs = build_definitions('number = [10]')
68
+
69
+ defs.lookup(:local_variable, 'number').value.instance?.should == true
70
+ end
71
+
72
+ should 'create a new Hash instance' do
73
+ defs = build_definitions('number = {:a => 10}')
74
+
75
+ defs.lookup(:local_variable, 'number').value.instance?.should == true
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,71 @@
1
+ require File.expand_path('../../../../helper', __FILE__)
2
+
3
+ describe 'Building variable definitions' do
4
+ describe 'variables' do
5
+ should 'process basic variable assignments' do
6
+ defs = build_definitions('number = 10')
7
+ number = defs.lookup(:local_variable, 'number')
8
+
9
+ number.is_a?(ruby_object).should == true
10
+ number.name.should == 'number'
11
+
12
+ number.value.is_a?(ruby_object).should == true
13
+ number.value.value.should == '10'
14
+ end
15
+
16
+ should 'process mass variable assignments' do
17
+ defs = build_definitions('number, numberx = 10, 20')
18
+ number = defs.lookup(:local_variable, 'number')
19
+ numberx = defs.lookup(:local_variable, 'numberx')
20
+
21
+ number.is_a?(ruby_object).should == true
22
+
23
+ number.name.should == 'number'
24
+ number.value.value.should == '10'
25
+
26
+ numberx.is_a?(ruby_object).should == true
27
+
28
+ numberx.name.should == 'numberx'
29
+ numberx.value.value.should == '20'
30
+ end
31
+
32
+ should 'process constant path assignments' do
33
+ defs = build_definitions('Kernel::FOO = 10')
34
+ foo = defs.lookup(:constant, 'Kernel').lookup(:constant, 'FOO')
35
+
36
+ foo.is_a?(ruby_object).should == true
37
+
38
+ foo.name.should == 'FOO'
39
+ foo.value.value.should == '10'
40
+ end
41
+
42
+ should 'process recursive variable assignments' do
43
+ code = <<-CODE
44
+ a = 1
45
+ b = a
46
+ c = b
47
+ d = c
48
+ CODE
49
+
50
+ defs = build_definitions(code)
51
+ var = defs.lookup(:local_variable, 'd')
52
+
53
+ var.value.type.should == :integer
54
+ var.value.value.should == '1'
55
+ end
56
+
57
+ should 'handle multiple variable assignments' do
58
+ code = 'first = second = third = 10'
59
+ defs = build_definitions(code)
60
+
61
+ %w{first second third}.each do |name|
62
+ variable = defs.lookup(:local_variable, name)
63
+
64
+ variable.is_a?(ruby_object).should == true
65
+
66
+ variable.value.type.should == :integer
67
+ variable.value.value.should == '10'
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,17 @@
1
+ require File.expand_path('../../../helper', __FILE__)
2
+
3
+ describe 'Associating AST nodes with definitions' do
4
+ should 'associate AST nodes and their definitions' do
5
+ tokens = parse('def foobar; end', false)
6
+ iterator = RubyLint::DefinitionsBuilder.new
7
+
8
+ iterator.iterate(tokens)
9
+
10
+ defs = iterator.options[:definitions]
11
+ assoc = iterator.options[:node_definitions]
12
+ method = tokens.children[0]
13
+
14
+ assoc.key?(method).should == true
15
+ assoc[method].should == defs.lookup(:instance_method, 'foobar')
16
+ end
17
+ end
@@ -0,0 +1,40 @@
1
+ require File.expand_path('../../../helper', __FILE__)
2
+
3
+ describe 'Building definitions for blocks' do
4
+ should 'make outer local variables available to the inside of a block' do
5
+ code = <<-CODE
6
+ number = 10
7
+
8
+ example do
9
+ number_string = number.to_s
10
+ end
11
+ CODE
12
+
13
+ ast = parse(code, false)
14
+ builder = RubyLint::DefinitionsBuilder.new
15
+
16
+ builder.iterate(ast)
17
+
18
+ block = builder.options[:node_definitions].values.last
19
+ number = block.lookup(:local_variable, 'number')
20
+
21
+ number.is_a?(ruby_object).should == true
22
+
23
+ number.value.type.should == :integer
24
+ number.value.value.should == '10'
25
+ end
26
+
27
+ should 'use outer local variables when overwriting them' do
28
+ code = <<-CODE
29
+ number = 10
30
+
31
+ example do
32
+ number = 20
33
+ end
34
+ CODE
35
+
36
+ defs = build_definitions(code)
37
+
38
+ defs.lookup(:local_variable, 'number').value.value.should == '20'
39
+ end
40
+ end
@@ -0,0 +1,230 @@
1
+ require File.expand_path('../../../helper', __FILE__)
2
+
3
+ describe 'Building class definitions' do
4
+ describe 'scoping definitions' do
5
+ should 'process a global class' do
6
+ defs = build_definitions('class Example; end')
7
+ example = defs.lookup(:constant, 'Example')
8
+
9
+ example.is_a?(ruby_object).should == true
10
+
11
+ example.type.should == :class
12
+ example.name.should == 'Example'
13
+ end
14
+
15
+ should 'process a nested class' do
16
+ code = <<-CODE
17
+ class First
18
+ class Second
19
+ end
20
+ end
21
+ CODE
22
+
23
+ defs = build_definitions(code)
24
+ first = defs.lookup(:constant, 'First')
25
+
26
+ first.is_a?(ruby_object).should == true
27
+
28
+ defs.lookup(:constant, 'Second').nil?.should == true
29
+
30
+ first.lookup(:constant, 'Second') \
31
+ .is_a?(ruby_object) \
32
+ .should == true
33
+ end
34
+
35
+ should 'process a global and nested class' do
36
+ code = <<-CODE
37
+ class First
38
+ class Second
39
+ end
40
+ end
41
+
42
+ class Third
43
+ end
44
+ CODE
45
+
46
+ defs = build_definitions(code)
47
+ first = defs.lookup(:constant, 'First')
48
+
49
+ first.lookup(:constant, 'Second').is_a?(ruby_object).should == true
50
+ first.lookup(:constant, 'Third').is_a?(ruby_object).should == true
51
+
52
+ first.lookup(:constant, 'Second') \
53
+ .lookup(:constant, 'Third') \
54
+ .is_a?(ruby_object) \
55
+ .should == true
56
+
57
+ defs.lookup(:constant, 'Third').is_a?(ruby_object).should == true
58
+ end
59
+ end
60
+
61
+ describe 'redefining classes' do
62
+ should 'update a class when it is redefined' do
63
+ code = <<-CODE
64
+ class First
65
+ end
66
+
67
+ class First
68
+ def example
69
+ end
70
+ end
71
+ CODE
72
+
73
+ defs = build_definitions(code)
74
+
75
+ defs.lookup(:constant, 'First') \
76
+ .lookup(:instance_method, 'example') \
77
+ .is_a?(ruby_method) \
78
+ .should == true
79
+ end
80
+ end
81
+
82
+ describe 'extending classes' do
83
+ should 'set the default parent class' do
84
+ defs = build_definitions('class First; end')
85
+
86
+ defs.lookup(:constant, 'First') \
87
+ .lookup(:method, 'new') \
88
+ .is_a?(ruby_method) \
89
+ .should == true
90
+ end
91
+
92
+ should 'extend a class using a parent' do
93
+ code = <<-CODE
94
+ class First
95
+ def example
96
+ end
97
+ end
98
+
99
+ class Second < First
100
+ end
101
+ CODE
102
+
103
+ defs = build_definitions(code)
104
+
105
+ defs.lookup(:constant, 'Second') \
106
+ .parents \
107
+ .map(&:name) \
108
+ .should == ['First', 'root']
109
+
110
+ defs.lookup(:constant, 'Second') \
111
+ .lookup(:instance_method, 'example') \
112
+ .is_a?(ruby_method) \
113
+ .should == true
114
+ end
115
+
116
+ should 'extend a class using a constant path as the parent class' do
117
+ code = <<-CODE
118
+ class First
119
+ class Second
120
+ def example
121
+ end
122
+ end
123
+ end
124
+
125
+ class Third < First::Second
126
+ end
127
+ CODE
128
+
129
+ defs = build_definitions(code)
130
+
131
+ defs.lookup(:constant, 'Third') \
132
+ .parents \
133
+ .map(&:name) \
134
+ .should == ['Second', 'root']
135
+
136
+ defs.lookup(:constant, 'Third') \
137
+ .lookup(:instance_method, 'example') \
138
+ .is_a?(ruby_method) \
139
+ .should == true
140
+ end
141
+ end
142
+
143
+ describe 'defining class methods' do
144
+ should 'define a single class method using `self`' do
145
+ code = <<-CODE
146
+ class Example
147
+ def self.class_method
148
+ end
149
+ end
150
+ CODE
151
+
152
+ defs = build_definitions(code)
153
+
154
+ defs.lookup(:constant, 'Example') \
155
+ .lookup(:method, 'class_method') \
156
+ .is_a?(ruby_method) \
157
+ .should == true
158
+ end
159
+ end
160
+
161
+ describe 'using sclass blocks' do
162
+ should 'define a class method using `class << self`' do
163
+ code = <<-CODE
164
+ class First
165
+ class << self
166
+ def example
167
+ end
168
+ end
169
+ end
170
+ CODE
171
+
172
+ defs = build_definitions(code)
173
+
174
+ defs.lookup(:constant, 'First') \
175
+ .lookup(:method, 'example') \
176
+ .is_a?(ruby_method) \
177
+ .should == true
178
+ end
179
+
180
+ should 'define a class method using `class << String`' do
181
+ code = <<-CODE
182
+ class << String
183
+ def example
184
+ end
185
+ end
186
+ CODE
187
+
188
+ defs = build_definitions(code)
189
+
190
+ defs.lookup(:constant, 'String') \
191
+ .lookup(:method, 'example') \
192
+ .is_a?(ruby_method) \
193
+ .should == true
194
+ end
195
+
196
+ should 'define a class method using `class << String` nested in a class' do
197
+ code = <<-CODE
198
+ class First
199
+ class << String
200
+ def example
201
+ end
202
+ end
203
+ end
204
+ CODE
205
+
206
+ defs = build_definitions(code)
207
+
208
+ defs.lookup(:constant, 'First') \
209
+ .lookup(:method, 'example') \
210
+ .is_a?(ruby_method) \
211
+ .should == false
212
+
213
+ defs.lookup(:constant, 'String') \
214
+ .lookup(:method, 'example') \
215
+ .is_a?(ruby_method) \
216
+ .should == true
217
+ end
218
+ end
219
+
220
+ describe 'inheriting definitions' do
221
+ should 'inherit from Object when importing String' do
222
+ defs = build_definitions('String')
223
+
224
+ defs.lookup(:constant, 'String') \
225
+ .lookup(:method, 'new') \
226
+ .is_a?(ruby_method) \
227
+ .should == true
228
+ end
229
+ end
230
+ end