ruby-lint 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -1
- data/MANIFEST +4 -0
- data/README.md +48 -15
- data/checksum/ruby-lint-1.0.0.gem.sha512 +1 -0
- data/doc/changelog.md +15 -0
- data/lib/ruby-lint/analysis/unused_variables.rb +9 -1
- data/lib/ruby-lint/definitions/core/argv.rb +3 -1
- data/lib/ruby-lint/definitions/core/env.rb +2 -0
- data/lib/ruby-lint/method_call/assign_member.rb +2 -0
- data/lib/ruby-lint/version.rb +1 -1
- data/lib/ruby-lint/virtual_machine.rb +42 -15
- data/spec/ruby-lint/analysis/unused_variables_spec.rb +11 -0
- data/spec/ruby-lint/definitions/argv_spec.rb +17 -0
- data/spec/ruby-lint/definitions/env_spec.rb +11 -0
- data/spec/ruby-lint/method_call/assign_member_spec.rb +25 -0
- data/spec/ruby-lint/virtual_machine/assignments/variables_spec.rb +14 -0
- data/spec/ruby-lint/virtual_machine/reference_amount_spec.rb +20 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e5bbee286e1be1ba6f024458ccf916d7aaa6f6d
|
4
|
+
data.tar.gz: 62be929b8a02f3e9fc701d3a9d5cc979d69614d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45574e47f9dcb4017f64f80fd89bc8d7b10bffdbb4648ed3cc42b09373e04e3dd413a3ed4e68e84736082a1c377f0d6ce61b6b8729ef848bb26f0f4b4ce5574e
|
7
|
+
data.tar.gz: ab7b40f9108af2d2d6879ccfddf806cff09f413f9fd6adc4d499d874934a266be36d6884eb9629761c8dbc86d14559171cc8ef3863e6a3faffedc4f94e2a2494
|
data/.travis.yml
CHANGED
data/MANIFEST
CHANGED
@@ -18,6 +18,7 @@ checksum/ruby-lint-0.0.4.gem.sha512
|
|
18
18
|
checksum/ruby-lint-0.0.5.gem.sha512
|
19
19
|
checksum/ruby-lint-0.9.0.gem.sha512
|
20
20
|
checksum/ruby-lint-0.9.1.gem.sha512
|
21
|
+
checksum/ruby-lint-1.0.0.gem.sha512
|
21
22
|
checksum/ruby-lint-1.0.0.pre.preview1.gem.sha512
|
22
23
|
doc/.gitkeep
|
23
24
|
doc/DCO.md
|
@@ -382,6 +383,8 @@ spec/ruby-lint/definition_builder/primitive_spec.rb
|
|
382
383
|
spec/ruby-lint/definition_builder/ruby_class_spec.rb
|
383
384
|
spec/ruby-lint/definition_builder/ruby_method_spec.rb
|
384
385
|
spec/ruby-lint/definition_builder/ruby_module_spec.rb
|
386
|
+
spec/ruby-lint/definitions/argv_spec.rb
|
387
|
+
spec/ruby-lint/definitions/env_spec.rb
|
385
388
|
spec/ruby-lint/definitions/io_spec.rb
|
386
389
|
spec/ruby-lint/docstring/mapping.rb
|
387
390
|
spec/ruby-lint/docstring/parser_spec.rb
|
@@ -390,6 +393,7 @@ spec/ruby-lint/file_loader_spec.rb
|
|
390
393
|
spec/ruby-lint/file_scanner_spec.rb
|
391
394
|
spec/ruby-lint/inspector_spec.rb
|
392
395
|
spec/ruby-lint/iterator_spec.rb
|
396
|
+
spec/ruby-lint/method_call/assign_member_spec.rb
|
393
397
|
spec/ruby-lint/nested_stack_spec.rb
|
394
398
|
spec/ruby-lint/node_hash_spec.rb
|
395
399
|
spec/ruby-lint/parser_spec.rb
|
data/README.md
CHANGED
@@ -38,21 +38,6 @@ so as following:
|
|
38
38
|
|
39
39
|
This builds a new version of the Gem and saves it in the pkg/ directory.
|
40
40
|
|
41
|
-
## Security
|
42
|
-
|
43
|
-
As a basic form of security ruby-lint provides a set of SHA512 checksums for
|
44
|
-
every Gem release. These checksums can be found in the `checksum/` directory.
|
45
|
-
Although these checksums do not prevent malicious users from tampering with a
|
46
|
-
built Gem they can be used for basic integrity verification purposes.
|
47
|
-
|
48
|
-
The checksum of a file can be checked using the `sha512sum` command. For
|
49
|
-
example:
|
50
|
-
|
51
|
-
$ sha512sum pkg/ruby-lint-0.9.1.gem
|
52
|
-
10a51f27c455e5743fff7fefe29512cff20116b805bec148e09d4bade1727e3beab7f7f9ee97b020d290773edcb7bd1685858ccad0bbd1a35cc0282c00c760c6 pkg/ruby-lint-0.9.1.gem
|
53
|
-
|
54
|
-
In the past Gems were also signed using PGP, this is no longer the case.
|
55
|
-
|
56
41
|
## Usage
|
57
42
|
|
58
43
|
Using ruby-lint from the CLI is very easy. To analyze a set of files
|
@@ -88,6 +73,50 @@ the following output:
|
|
88
73
|
test.rb: warning: line 12, column 1: unused local variable greeting
|
89
74
|
test.rb: error: line 14, column 1: wrong number of arguments (expected 0 but got 1)
|
90
75
|
|
76
|
+
## Integration
|
77
|
+
|
78
|
+
* Vim using [Syntastic][syntastic]
|
79
|
+
* Emacs using [Flycheck][flycheck]
|
80
|
+
|
81
|
+
## ruby-lint versus Rubocop
|
82
|
+
|
83
|
+
A question commonly asked is what purpose ruby-lint serves compared to other
|
84
|
+
tools such as [Rubocop][rubocop]. After all, upon first sight the two tools
|
85
|
+
look pretty similar.
|
86
|
+
|
87
|
+
The big difference between ruby-lint and Rubocop is that ruby-lint focuses
|
88
|
+
primarily on technical problems such as the use of undefined methods/variables,
|
89
|
+
unused variables/method arguments and more. Rubocop on the other hand focuses
|
90
|
+
mostly on style related issues based on a community driven Ruby style guide.
|
91
|
+
This means that it will for example warn you about methods written using
|
92
|
+
camelCase and method bodies that are considered to be too long.
|
93
|
+
|
94
|
+
Personally I have little interest in adding style related analysis as Rubocop
|
95
|
+
already does that and in my opinion does a far better job at it. I also simply
|
96
|
+
think it's too boring to write analysis like this. Having said that, ruby-lint
|
97
|
+
has some basic style related analysis (e.g. the use of `BEGIN`) but this mostly
|
98
|
+
serves as a simple example on how to write analysis code.
|
99
|
+
|
100
|
+
In the end it depends on what your needs are. If you have a team that's having
|
101
|
+
trouble following a consistent coding style then Rubocop is probably the right
|
102
|
+
tool for the job. On the other hand, if you're trying to debug a nasty bug then
|
103
|
+
ruby-lint will most likely be more useful.
|
104
|
+
|
105
|
+
## Security
|
106
|
+
|
107
|
+
As a basic form of security ruby-lint provides a set of SHA512 checksums for
|
108
|
+
every Gem release. These checksums can be found in the `checksum/` directory.
|
109
|
+
Although these checksums do not prevent malicious users from tampering with a
|
110
|
+
built Gem they can be used for basic integrity verification purposes.
|
111
|
+
|
112
|
+
The checksum of a file can be checked using the `sha512sum` command. For
|
113
|
+
example:
|
114
|
+
|
115
|
+
$ sha512sum pkg/ruby-lint-0.9.1.gem
|
116
|
+
10a51f27c455e5743fff7fefe29512cff20116b805bec148e09d4bade1727e3beab7f7f9ee97b020d290773edcb7bd1685858ccad0bbd1a35cc0282c00c760c6 pkg/ruby-lint-0.9.1.gem
|
117
|
+
|
118
|
+
In the past Gems were also signed using PGP, this is no longer the case.
|
119
|
+
|
91
120
|
## Documentation
|
92
121
|
|
93
122
|
* {file:contributing Contributing}
|
@@ -100,3 +129,7 @@ the following output:
|
|
100
129
|
All source code in this repository is licensed under the MIT license unless
|
101
130
|
specified otherwise. A copy of this license can be found in the file "LICENSE"
|
102
131
|
in the root directory of this repository.
|
132
|
+
|
133
|
+
[syntastic]: https://github.com/scrooloose/syntastic
|
134
|
+
[flycheck]: https://github.com/flycheck/flycheck/
|
135
|
+
[rubocop]: https://github.com/bbatsov/rubocop
|
@@ -0,0 +1 @@
|
|
1
|
+
d02899dc114e6065d64bb5e8aed5735876740209d30c5549511d88d8966b3c0794f0bb16ed33a430829b918eba56e2764f91a51c299da47393c6256cf3cc9f62
|
data/doc/changelog.md
CHANGED
@@ -5,6 +5,21 @@ This document contains a short summary of the various releases of ruby-lint.
|
|
5
5
|
For a full list of commits included in each release see the corresponding Git
|
6
6
|
tags (named after the versions).
|
7
7
|
|
8
|
+
## 1.0.1 - 2013-12-15
|
9
|
+
|
10
|
+
A small bugfix release that contains the following changes/fixes:
|
11
|
+
|
12
|
+
* Anonymous splat arguments (`def foo(_); end`) are now ignored by the
|
13
|
+
`UnusedVariables` class.
|
14
|
+
* Frozen definitions no longer have their members updated, see
|
15
|
+
<https://github.com/YorickPeterse/ruby-lint/issues/75> for more information.
|
16
|
+
* ENV is now treated as an instance.
|
17
|
+
* When re-assigning a variable the VM now updates the corresponding definition
|
18
|
+
instead of overwriting it. This was added to fix
|
19
|
+
<https://github.com/YorickPeterse/ruby-lint/issues/77>.
|
20
|
+
* Global variables are stored in the global scope opposed to the current scope.
|
21
|
+
* ARGV is now treated as an instance and extends Array.
|
22
|
+
|
8
23
|
## 1.0.0 - 2013-12-01
|
9
24
|
|
10
25
|
The first stable release of ruby-lint. The 1.0 series will not introduce any
|
@@ -82,7 +82,15 @@ module RubyLint
|
|
82
82
|
# @return [TrueClass|FalseClass]
|
83
83
|
#
|
84
84
|
def add_warning?(variable)
|
85
|
-
return variable && !variable.used? && variable.name
|
85
|
+
return variable && !variable.used? && !ignore_variable?(variable.name)
|
86
|
+
end
|
87
|
+
|
88
|
+
##
|
89
|
+
# @param [String] name
|
90
|
+
# @return [TrueClass|FalseClass]
|
91
|
+
#
|
92
|
+
def ignore_variable?(name)
|
93
|
+
return name[0] == '_' || name.empty?
|
86
94
|
end
|
87
95
|
end # UnusedVariables
|
88
96
|
end # Analysis
|
@@ -4,6 +4,8 @@
|
|
4
4
|
# Platform: rbx 2.0.0.rc1
|
5
5
|
#
|
6
6
|
RubyLint::GlobalScope.definitions.define_constant('ARGV') do |klass|
|
7
|
+
klass.inherits(RubyLint::GlobalScope.constant_proxy('Array'))
|
8
|
+
klass.instance!
|
7
9
|
end
|
8
10
|
|
9
|
-
RubyLint::GlobalScope.definitions.lookup(:const, 'ARGV').deep_freeze
|
11
|
+
RubyLint::GlobalScope.definitions.lookup(:const, 'ARGV').deep_freeze
|
data/lib/ruby-lint/version.rb
CHANGED
@@ -141,6 +141,13 @@ module RubyLint
|
|
141
141
|
#
|
142
142
|
EXPORT_VARIABLES = [:ivar, :cvar, :const]
|
143
143
|
|
144
|
+
##
|
145
|
+
# List of variable types that should be assigned in the global scope.
|
146
|
+
#
|
147
|
+
# @return [Array]
|
148
|
+
#
|
149
|
+
ASSIGN_GLOBAL = [:gvar]
|
150
|
+
|
144
151
|
##
|
145
152
|
# The available method visibilities.
|
146
153
|
#
|
@@ -874,28 +881,48 @@ Received: #{arguments.length}
|
|
874
881
|
# @param [RubyLint::AST::Node] node
|
875
882
|
#
|
876
883
|
def assign_variable(type, name, value, node)
|
877
|
-
|
878
|
-
|
879
|
-
|
880
|
-
|
881
|
-
|
882
|
-
|
883
|
-
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
884
|
+
scope = assignment_scope(type)
|
885
|
+
variable = scope.lookup(type, name)
|
886
|
+
|
887
|
+
# If there's already a variable we'll just update it.
|
888
|
+
if variable
|
889
|
+
variable.reference_amount += 1
|
890
|
+
|
891
|
+
# `value` is not for conditional assignments as those are handled
|
892
|
+
# manually.
|
893
|
+
variable.value = value if value
|
894
|
+
else
|
895
|
+
variable = Definition::RubyObject.new(
|
896
|
+
:type => type,
|
897
|
+
:name => name,
|
898
|
+
:value => value,
|
899
|
+
:instance_type => :instance,
|
900
|
+
:reference_amount => 0,
|
901
|
+
:line => node.line,
|
902
|
+
:column => node.column,
|
903
|
+
:file => node.file
|
904
|
+
)
|
905
|
+
end
|
889
906
|
|
890
|
-
buffer_assignment_value(
|
907
|
+
buffer_assignment_value(value)
|
891
908
|
|
892
909
|
# Primarily used by #after_send to support variable assignments as method
|
893
910
|
# call arguments.
|
894
911
|
if value and !value_stack.empty?
|
895
|
-
value_stack.push(value)
|
912
|
+
value_stack.push(variable.value)
|
896
913
|
end
|
897
914
|
|
898
|
-
add_variable(variable)
|
915
|
+
add_variable(variable, scope)
|
916
|
+
end
|
917
|
+
|
918
|
+
##
|
919
|
+
# Determines the scope to use for a variable assignment.
|
920
|
+
#
|
921
|
+
# @param [Symbol] type
|
922
|
+
# @return [RubyLint::Definition::RubyObject]
|
923
|
+
#
|
924
|
+
def assignment_scope(type)
|
925
|
+
return ASSIGN_GLOBAL.include?(type) ? definitions : current_scope
|
899
926
|
end
|
900
927
|
|
901
928
|
##
|
@@ -227,6 +227,17 @@ end
|
|
227
227
|
|
228
228
|
report.entries.empty?.should == true
|
229
229
|
end
|
230
|
+
|
231
|
+
example 'do not warn for unused anonymous splat arguments' do
|
232
|
+
code = <<-CODE
|
233
|
+
def example(*)
|
234
|
+
end
|
235
|
+
CODE
|
236
|
+
|
237
|
+
report = build_report(code, RubyLint::Analysis::UnusedVariables)
|
238
|
+
|
239
|
+
report.entries.empty?.should == true
|
240
|
+
end
|
230
241
|
end
|
231
242
|
|
232
243
|
context 'block arguments' do
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'ruby-lint definitions' do
|
4
|
+
context 'ARGV' do
|
5
|
+
before do
|
6
|
+
@const = RubyLint::GlobalScope.global_constant('ARGV')
|
7
|
+
end
|
8
|
+
|
9
|
+
example 'treat ARGV as an instance' do
|
10
|
+
@const.instance?.should == true
|
11
|
+
end
|
12
|
+
|
13
|
+
example 'ARGV should be an Array' do
|
14
|
+
@const.has_definition?(:instance_method, 'each').should == true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RubyLint::MethodCall::AssignMember do
|
4
|
+
before do
|
5
|
+
@vm = RubyLint::VirtualMachine.new
|
6
|
+
@node = s(:send,
|
7
|
+
s(:const, nil, :ENV), :[]=, s(:str, 'FOO'), s(:str, 'bar')
|
8
|
+
)
|
9
|
+
|
10
|
+
@method_call = RubyLint::MethodCall::AssignMember.new(@node, @vm)
|
11
|
+
@arguments = [
|
12
|
+
ruby_object.new(:type => :str, :value => 'FOO'),
|
13
|
+
ruby_object.new(:type => :str, :value => 'bar')
|
14
|
+
]
|
15
|
+
|
16
|
+
@context = ruby_object.new(:type => :hash)
|
17
|
+
@context.deep_freeze
|
18
|
+
end
|
19
|
+
|
20
|
+
example 'do not update members of frozen definitions' do
|
21
|
+
@method_call.evaluate(@arguments, @context)
|
22
|
+
|
23
|
+
@context.has_definition?(:member, 'FOO').should == false
|
24
|
+
end
|
25
|
+
end
|
@@ -112,5 +112,19 @@ d = c
|
|
112
112
|
|
113
113
|
value.type.should == :unknown
|
114
114
|
end
|
115
|
+
|
116
|
+
example 'global variables should be assigned in the global scope' do
|
117
|
+
code = <<-CODE
|
118
|
+
class Foo
|
119
|
+
def foo
|
120
|
+
$bar = 10
|
121
|
+
end
|
122
|
+
end
|
123
|
+
CODE
|
124
|
+
|
125
|
+
defs = build_definitions(code)
|
126
|
+
|
127
|
+
defs.lookup(:gvar, '$bar').value.value.should == 10
|
128
|
+
end
|
115
129
|
end
|
116
130
|
end
|
@@ -57,5 +57,25 @@ number = 20
|
|
57
57
|
|
58
58
|
defs.lookup(:lvar, 'number').reference_amount.should == 1
|
59
59
|
end
|
60
|
+
|
61
|
+
example 'track ivar references in parent scopes' do
|
62
|
+
code = <<-CODE
|
63
|
+
def first
|
64
|
+
@number = 10
|
65
|
+
end
|
66
|
+
|
67
|
+
def second
|
68
|
+
@number = 20
|
69
|
+
@number
|
70
|
+
end
|
71
|
+
CODE
|
72
|
+
|
73
|
+
defs = build_definitions(code)
|
74
|
+
first = defs.lookup(:instance_method, 'first').lookup(:ivar, '@number')
|
75
|
+
second = defs.lookup(:instance_method, 'second').lookup(:ivar, '@number')
|
76
|
+
|
77
|
+
first.reference_amount.should == 2
|
78
|
+
second.reference_amount.should == 2
|
79
|
+
end
|
60
80
|
end
|
61
81
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-lint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yorick Peterse
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-12-
|
11
|
+
date: 2013-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -211,6 +211,7 @@ files:
|
|
211
211
|
- checksum/ruby-lint-0.0.5.gem.sha512
|
212
212
|
- checksum/ruby-lint-0.9.0.gem.sha512
|
213
213
|
- checksum/ruby-lint-0.9.1.gem.sha512
|
214
|
+
- checksum/ruby-lint-1.0.0.gem.sha512
|
214
215
|
- checksum/ruby-lint-1.0.0.pre.preview1.gem.sha512
|
215
216
|
- doc/.gitkeep
|
216
217
|
- doc/DCO.md
|
@@ -575,6 +576,8 @@ files:
|
|
575
576
|
- spec/ruby-lint/definition_builder/ruby_class_spec.rb
|
576
577
|
- spec/ruby-lint/definition_builder/ruby_method_spec.rb
|
577
578
|
- spec/ruby-lint/definition_builder/ruby_module_spec.rb
|
579
|
+
- spec/ruby-lint/definitions/argv_spec.rb
|
580
|
+
- spec/ruby-lint/definitions/env_spec.rb
|
578
581
|
- spec/ruby-lint/definitions/io_spec.rb
|
579
582
|
- spec/ruby-lint/docstring/mapping.rb
|
580
583
|
- spec/ruby-lint/docstring/parser_spec.rb
|
@@ -583,6 +586,7 @@ files:
|
|
583
586
|
- spec/ruby-lint/file_scanner_spec.rb
|
584
587
|
- spec/ruby-lint/inspector_spec.rb
|
585
588
|
- spec/ruby-lint/iterator_spec.rb
|
589
|
+
- spec/ruby-lint/method_call/assign_member_spec.rb
|
586
590
|
- spec/ruby-lint/nested_stack_spec.rb
|
587
591
|
- spec/ruby-lint/node_hash_spec.rb
|
588
592
|
- spec/ruby-lint/parser_spec.rb
|
@@ -680,7 +684,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
680
684
|
version: '0'
|
681
685
|
requirements: []
|
682
686
|
rubyforge_project:
|
683
|
-
rubygems_version: 2.
|
687
|
+
rubygems_version: 2.0.14
|
684
688
|
signing_key:
|
685
689
|
specification_version: 4
|
686
690
|
summary: A linter and static code analysis tool for Ruby.
|