ruby-lint 1.0.0 → 1.0.1
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.
- 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.
|