inch 0.4.2 → 0.4.3.rc1
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 +10 -0
- data/lib/inch/cli.rb +4 -3
- data/lib/inch/code_object/provider/yard/docstring.rb +2 -0
- data/lib/inch/code_object/provider/yard/object/base.rb +2 -2
- data/lib/inch/code_object/provider/yard/object/method_object.rb +11 -62
- data/lib/inch/code_object/provider/yard/object/method_signature.rb +109 -0
- data/lib/inch/code_object/provider/yard/parser.rb +1 -1
- data/lib/inch/version.rb +1 -1
- data/test/fixtures/simple/lib/broken.rb +22 -0
- data/test/unit/code_object/provider/yard/object/method_object_test.rb +52 -0
- data/test/unit/code_object/proxy/method_object_test.rb +18 -0
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8df11f0c3f8e4f6ac9aea9b24fc63cd6ecc9d31f
|
4
|
+
data.tar.gz: b91f994c074b34d6d67f81ee36b17c6029c8961d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e98e2c4bbcf6f32fd6fb9df7b03be207be2d92d103615493b9be1859d1f4fe14e90292d89c4d3cf4090f11d7f2e38c5d8b9cf4b7299cdb5ae6963e02320fbd14
|
7
|
+
data.tar.gz: 8cd1a2706a738a6cb5d4fe970d09aa519e058494c66cdf3d84e4def4b054d600ad49af9634a0f1965b9c42c452f3765b103a97f7b04effa3d7b78943b7f5f5ea
|
data/.travis.yml
CHANGED
data/lib/inch/cli.rb
CHANGED
@@ -7,13 +7,14 @@ module Inch
|
|
7
7
|
class << self
|
8
8
|
# Returns the columns of the terminal window
|
9
9
|
# (defaults to 80)
|
10
|
+
# @param default [Fixnum] default value for columns
|
10
11
|
# @return [Fixnum]
|
11
|
-
def get_term_columns
|
12
|
+
def get_term_columns(default = 80)
|
12
13
|
str = `stty size`
|
13
14
|
rows_cols = str.split(' ').map(&:to_i)
|
14
|
-
rows_cols[1]
|
15
|
+
rows_cols[1] || default
|
15
16
|
rescue
|
16
|
-
|
17
|
+
default
|
17
18
|
end
|
18
19
|
end
|
19
20
|
COLUMNS = get_term_columns
|
@@ -28,12 +28,14 @@ module Inch
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def describes_parameter?(name)
|
31
|
+
return false if name.nil?
|
31
32
|
describe_parameter_regexps(name).any? do |pattern|
|
32
33
|
@text.index(pattern)
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
36
37
|
def mentions_parameter?(name)
|
38
|
+
return false if name.nil?
|
37
39
|
mention_parameter_regexps(name).any? do |pattern|
|
38
40
|
@text.index(pattern)
|
39
41
|
end
|
@@ -20,7 +20,7 @@ module Inch
|
|
20
20
|
CONSIDERED_YARD_TAGS = %w(api example param private return since)
|
21
21
|
|
22
22
|
# convenient shortcuts to (YARD) code object
|
23
|
-
def_delegators :object, :type, :namespace, :source, :source_type, :
|
23
|
+
def_delegators :object, :type, :namespace, :source, :source_type, :group, :dynamic, :visibility
|
24
24
|
|
25
25
|
# @param object [YARD::CodeObjects::Base] the actual (YARD) code object
|
26
26
|
def initialize(object)
|
@@ -227,7 +227,7 @@ module Inch
|
|
227
227
|
end
|
228
228
|
|
229
229
|
def inspect
|
230
|
-
"#<#{self.class.to_s}: #{
|
230
|
+
"#<#{self.class.to_s}: #{fullname}>"
|
231
231
|
end
|
232
232
|
|
233
233
|
protected
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require_relative 'method_signature'
|
2
|
+
|
1
3
|
module Inch
|
2
4
|
module CodeObject
|
3
5
|
module Provider
|
@@ -28,7 +30,7 @@ module Inch
|
|
28
30
|
end
|
29
31
|
|
30
32
|
def has_doc?
|
31
|
-
super && !implicit_docstring? ||
|
33
|
+
super && !implicit_docstring? || signatures.any? { |t| t.has_doc? }
|
32
34
|
end
|
33
35
|
|
34
36
|
def method?
|
@@ -36,13 +38,7 @@ module Inch
|
|
36
38
|
end
|
37
39
|
|
38
40
|
def parameters
|
39
|
-
@parameters ||=
|
40
|
-
signature_name = in_signature(name)
|
41
|
-
tag = parameter_tag(name) || parameter_tag(signature_name) ||
|
42
|
-
param_tag_in_overload_tags(name) ||
|
43
|
-
param_tag_in_overload_tags(signature_name)
|
44
|
-
MethodParameterObject.new(self, name, signature_name, tag)
|
45
|
-
end
|
41
|
+
@parameters ||= signatures.map(&:parameters).flatten
|
46
42
|
end
|
47
43
|
|
48
44
|
def parameter(name)
|
@@ -80,18 +76,19 @@ module Inch
|
|
80
76
|
name =~ /\=$/ && parameters.size == 1
|
81
77
|
end
|
82
78
|
|
79
|
+
def signatures
|
80
|
+
[self, *overload_tags].map do |tag_or_self|
|
81
|
+
MethodSignature.new(self, tag_or_self)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
83
85
|
def questioning_name?
|
84
86
|
name =~ /\?$/
|
85
87
|
end
|
86
88
|
|
87
89
|
private
|
88
90
|
|
89
|
-
|
90
|
-
names = signature_parameter_names
|
91
|
-
names.concat parameter_tags.map(&:name)
|
92
|
-
names.compact.map { |name| name.gsub(/[\*\&]/, '') }.uniq
|
93
|
-
end
|
94
|
-
|
91
|
+
# Returns +true+ if the docstring was generated by YARD
|
95
92
|
def implicit_docstring?
|
96
93
|
if getter?
|
97
94
|
docstring == "Returns the value of attribute #{name}"
|
@@ -103,58 +100,10 @@ module Inch
|
|
103
100
|
end
|
104
101
|
end
|
105
102
|
|
106
|
-
def in_signature(name)
|
107
|
-
possible_names = [name, "*#{name}", "&#{name}"]
|
108
|
-
(signature_parameter_names & possible_names).first
|
109
|
-
end
|
110
|
-
|
111
|
-
def normalize_parameter_name(name)
|
112
|
-
# remove leading and trailing brackets
|
113
|
-
# (sometimes used to indicate optional parameters in overload
|
114
|
-
# signatures)
|
115
|
-
name.gsub(/[\[\]]/, '')
|
116
|
-
end
|
117
|
-
|
118
103
|
def overload_tags
|
119
104
|
object.tags(:overload)
|
120
105
|
end
|
121
106
|
|
122
|
-
# Returns all parameter names from all overload signatures.
|
123
|
-
# @todo analyse each signature on its own
|
124
|
-
def overloaded_parameter_names
|
125
|
-
overload_tags.map do |tag|
|
126
|
-
Array(tag.parameters).map do |parameter|
|
127
|
-
normalize_parameter_name(parameter[0])
|
128
|
-
end
|
129
|
-
end.flatten
|
130
|
-
end
|
131
|
-
|
132
|
-
def param_tag_in_overload_tags(name)
|
133
|
-
overload_tags.map do |overload_tag|
|
134
|
-
find_param_tag(overload_tag, name)
|
135
|
-
end.first
|
136
|
-
end
|
137
|
-
|
138
|
-
def find_param_tag(overload_tag, name)
|
139
|
-
overload_tag.tags(:param).detect do |param_tag|
|
140
|
-
param_tag.name == name
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
def signature_parameter_names
|
145
|
-
object.parameters.map(&:first) + overloaded_parameter_names
|
146
|
-
end
|
147
|
-
|
148
|
-
def parameter_tag(param_name)
|
149
|
-
parameter_tags.detect do |tag|
|
150
|
-
tag.name == param_name
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
def parameter_tags
|
155
|
-
object.tags(:param)
|
156
|
-
end
|
157
|
-
|
158
107
|
def return_tags
|
159
108
|
object.tags(:return) + overloaded_return_tags
|
160
109
|
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
module Inch
|
2
|
+
module CodeObject
|
3
|
+
module Provider
|
4
|
+
module YARD
|
5
|
+
module Object
|
6
|
+
# Utility class to describe (overloaded) method signatures
|
7
|
+
class MethodSignature < Struct.new(:method, :tag_or_method)
|
8
|
+
def has_code_example?
|
9
|
+
!yard_object.tags(:example).empty?
|
10
|
+
end
|
11
|
+
|
12
|
+
def has_doc?
|
13
|
+
!docstring.empty?
|
14
|
+
end
|
15
|
+
|
16
|
+
def parameters
|
17
|
+
@parameters ||= all_parameter_names.map do |name|
|
18
|
+
signature_name = in_signature(name)
|
19
|
+
tag = parameter_tag(name) || parameter_tag(signature_name)
|
20
|
+
MethodParameterObject.new(method, name, signature_name, tag)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def parameter(name)
|
25
|
+
parameters.detect { |p| p.name == name.to_s }
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns the actual signature of the method.
|
29
|
+
# @return [String]
|
30
|
+
def signature
|
31
|
+
if tag?
|
32
|
+
tag_or_method.signature
|
33
|
+
else
|
34
|
+
yard_object.signature.gsub(/^(def\ )/, '')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
#private
|
39
|
+
|
40
|
+
def all_parameter_names
|
41
|
+
all_names = all_signature_parameter_names + parameter_tags.map(&:name)
|
42
|
+
all_names.map do |name|
|
43
|
+
normalize_parameter_name(name) if name
|
44
|
+
end.compact.uniq
|
45
|
+
end
|
46
|
+
|
47
|
+
def all_signature_parameter_names
|
48
|
+
if tag?
|
49
|
+
tag_or_method.parameters.map(&:first)
|
50
|
+
else
|
51
|
+
yard_object.parameters.map(&:first)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def docstring
|
56
|
+
if tag?
|
57
|
+
tag_or_method.docstring
|
58
|
+
else
|
59
|
+
yard_object.docstring
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Returns how the given parameter is noted in the method's
|
64
|
+
# signature.
|
65
|
+
#
|
66
|
+
# @param name [String] parameter name
|
67
|
+
# @return [String]
|
68
|
+
def in_signature(name)
|
69
|
+
possible_names = [name, "*#{name}", "&#{name}"]
|
70
|
+
(all_signature_parameter_names & possible_names).first
|
71
|
+
end
|
72
|
+
|
73
|
+
# Removes block, splat symbols, dollar sign,
|
74
|
+
# leading and trailing brackets from a given +name+
|
75
|
+
# (sometimes used to indicate optional parameters in overload
|
76
|
+
# signatures).
|
77
|
+
# @param name [String] parameter name
|
78
|
+
# @return [String]
|
79
|
+
def normalize_parameter_name(name)
|
80
|
+
name.gsub(/[\&\*\$\[\]]/, '')
|
81
|
+
end
|
82
|
+
|
83
|
+
def parameter_tag(param_name)
|
84
|
+
parameter_tags.detect do |tag|
|
85
|
+
tag.name == param_name
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def parameter_tags
|
90
|
+
if tag?
|
91
|
+
tag_or_method.tags(:param)
|
92
|
+
else
|
93
|
+
yard_object.tags(:param)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def tag?
|
98
|
+
tag_or_method.respond_to?(:signature)
|
99
|
+
end
|
100
|
+
|
101
|
+
def yard_object
|
102
|
+
tag_or_method.object
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -9,7 +9,7 @@ module Inch
|
|
9
9
|
# Helper method to parse an instance with the given +args+
|
10
10
|
#
|
11
11
|
# @see #parse
|
12
|
-
# @return [CodeObject::Provider::YARD] the instance that ran
|
12
|
+
# @return [CodeObject::Provider::YARD::Parser] the instance that ran
|
13
13
|
def self.parse(*args)
|
14
14
|
parser = self.new
|
15
15
|
parser.parse(*args)
|
data/lib/inch/version.rb
CHANGED
@@ -179,6 +179,28 @@ module Overloading
|
|
179
179
|
# @return [void]
|
180
180
|
def missing_param_names(*identifiers)
|
181
181
|
end
|
182
|
+
|
183
|
+
# Creates a Hello OpenFlow message.
|
184
|
+
#
|
185
|
+
# @overload params_only_in_overloads()
|
186
|
+
# @example
|
187
|
+
# Hello.new
|
188
|
+
#
|
189
|
+
# @overload params_only_in_overloads(transaction_id)
|
190
|
+
# @example
|
191
|
+
# Hello.new(123)
|
192
|
+
# @param [Number] transaction_id
|
193
|
+
# An unsigned 32-bit integer number associated with this
|
194
|
+
# message. If not specified, an auto-generated value is set.
|
195
|
+
#
|
196
|
+
# @example
|
197
|
+
# Hello.new(transaction_id: 123)
|
198
|
+
# Hello.new(xid: 123)
|
199
|
+
# @param [Hash] user_options the options to create a message with.
|
200
|
+
# @option user_options [Number] :transaction_id
|
201
|
+
# @option user_options [Number] :xid an alias to transaction_id.
|
202
|
+
def params_only_in_overloads(user_options = {})
|
203
|
+
end
|
182
204
|
end
|
183
205
|
|
184
206
|
module YardError
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../../../../test_helper')
|
2
|
+
|
3
|
+
describe ::Inch::CodeObject::Provider::YARD::Parser do
|
4
|
+
before do
|
5
|
+
@config = Inch::Config.codebase
|
6
|
+
@parser = ::Inch::CodeObject::Provider::YARD::Parser.parse(fixture_path(:simple), @config)
|
7
|
+
@objects = @parser.objects
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should work for Overloading#params_only_in_overloads" do
|
11
|
+
m = @objects.detect { |o| o.fullname == 'Overloading#params_only_in_overloads' }
|
12
|
+
|
13
|
+
assert m.has_code_example?
|
14
|
+
|
15
|
+
refute m.signatures.empty?
|
16
|
+
assert_equal 3, m.signatures.size
|
17
|
+
assert_equal 2, m.parameters.size # at this moment, this counts all parameters in all overloaded signatures
|
18
|
+
|
19
|
+
signature = m.signatures[0]
|
20
|
+
assert_equal "params_only_in_overloads(user_options = {})", signature.signature
|
21
|
+
assert_equal 1, signature.parameters.size
|
22
|
+
refute signature.parameter(:user_options).nil?
|
23
|
+
assert signature.has_code_example?
|
24
|
+
assert signature.has_doc?
|
25
|
+
|
26
|
+
signature = m.signatures[1]
|
27
|
+
assert_equal "params_only_in_overloads()", signature.signature
|
28
|
+
assert signature.parameters.empty?, "Should have been empty: #{signature.parameters.inspect}"
|
29
|
+
assert signature.has_code_example?
|
30
|
+
refute signature.has_doc?
|
31
|
+
|
32
|
+
signature = m.signatures[2]
|
33
|
+
assert_equal "params_only_in_overloads(transaction_id)", signature.signature
|
34
|
+
assert_equal 1, signature.parameters.size
|
35
|
+
refute signature.parameter(:transaction_id).nil?
|
36
|
+
assert signature.has_code_example?
|
37
|
+
refute signature.has_doc?
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should work" do
|
41
|
+
m = @objects.detect { |o| o.fullname == 'Foo::Bar#method_with_unstructured_doc' }
|
42
|
+
assert_equal 1, m.signatures.size
|
43
|
+
assert_equal 1, m.parameters.size
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should work 2" do
|
47
|
+
m = @objects.detect { |o| o.fullname == 'Foo#method_with_splat_parameter' }
|
48
|
+
assert_equal 1, m.signatures.size
|
49
|
+
assert_equal 1, m.parameters.size
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -259,8 +259,12 @@ describe ::Inch::CodeObject::Proxy::MethodObject do
|
|
259
259
|
end
|
260
260
|
|
261
261
|
def test_splat_parameter_notation
|
262
|
+
# it should assign the same score whether the parameter is
|
263
|
+
# described with or without the splat (*) operator
|
262
264
|
m1 = @objects.find("Foo#method_with_splat_parameter")
|
263
265
|
m2 = @objects.find("Foo#method_with_splat_parameter2")
|
266
|
+
assert_equal 1, m1.parameters.size
|
267
|
+
assert_equal 1, m2.parameters.size
|
264
268
|
assert_equal m1.score, m2.score
|
265
269
|
end
|
266
270
|
|
@@ -278,6 +282,7 @@ describe ::Inch::CodeObject::Proxy::MethodObject do
|
|
278
282
|
list << @objects.find("Overloading#mix")
|
279
283
|
list << @objects.find("Overloading#hooks")
|
280
284
|
list << @objects.find("Overloading#identifiers")
|
285
|
+
list << @objects.find("Overloading#params_only_in_overloads")
|
281
286
|
list.each do |m|
|
282
287
|
assert_equal 100, m.score, "#{m.fullname} did not get 100"
|
283
288
|
end
|
@@ -287,4 +292,17 @@ describe ::Inch::CodeObject::Proxy::MethodObject do
|
|
287
292
|
m = @objects.find("Overloading#missing_param_names")
|
288
293
|
refute m.has_doc? # it may be mentioned in the docs, but it's malformed.
|
289
294
|
end
|
295
|
+
|
296
|
+
def test_overloading_with_bad_doc
|
297
|
+
m = @objects.find("Overloading#params_only_in_overloads")
|
298
|
+
roles = m.roles.map(&:class)
|
299
|
+
bad_roles = [
|
300
|
+
Inch::Evaluation::Role::Object::WithoutCodeExample,
|
301
|
+
Inch::Evaluation::Role::MethodParameter::WithoutMention,
|
302
|
+
Inch::Evaluation::Role::MethodParameter::WithoutType,
|
303
|
+
]
|
304
|
+
bad_roles.each do |role|
|
305
|
+
refute roles.include?(role), "Should not assign #{role}"
|
306
|
+
end
|
307
|
+
end
|
290
308
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: inch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- René Föhring
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -192,6 +192,7 @@ files:
|
|
192
192
|
- lib/inch/code_object/provider/yard/object/constant_object.rb
|
193
193
|
- lib/inch/code_object/provider/yard/object/method_object.rb
|
194
194
|
- lib/inch/code_object/provider/yard/object/method_parameter_object.rb
|
195
|
+
- lib/inch/code_object/provider/yard/object/method_signature.rb
|
195
196
|
- lib/inch/code_object/provider/yard/object/module_object.rb
|
196
197
|
- lib/inch/code_object/provider/yard/object/namespace_object.rb
|
197
198
|
- lib/inch/code_object/provider/yard/object/root_object.rb
|
@@ -288,6 +289,7 @@ files:
|
|
288
289
|
- test/unit/code_object/converter_test.rb
|
289
290
|
- test/unit/code_object/provider/yard/docstring_test.rb
|
290
291
|
- test/unit/code_object/provider/yard/nodoc_helper_test.rb
|
292
|
+
- test/unit/code_object/provider/yard/object/method_object_test.rb
|
291
293
|
- test/unit/code_object/provider/yard_test.rb
|
292
294
|
- test/unit/code_object/provider_test.rb
|
293
295
|
- test/unit/code_object/proxy/method_object_test.rb
|
@@ -313,9 +315,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
313
315
|
version: '0'
|
314
316
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
315
317
|
requirements:
|
316
|
-
- - "
|
318
|
+
- - ">"
|
317
319
|
- !ruby/object:Gem::Version
|
318
|
-
version:
|
320
|
+
version: 1.3.1
|
319
321
|
requirements: []
|
320
322
|
rubyforge_project:
|
321
323
|
rubygems_version: 2.2.2
|
@@ -370,6 +372,7 @@ test_files:
|
|
370
372
|
- test/unit/code_object/converter_test.rb
|
371
373
|
- test/unit/code_object/provider/yard/docstring_test.rb
|
372
374
|
- test/unit/code_object/provider/yard/nodoc_helper_test.rb
|
375
|
+
- test/unit/code_object/provider/yard/object/method_object_test.rb
|
373
376
|
- test/unit/code_object/provider/yard_test.rb
|
374
377
|
- test/unit/code_object/provider_test.rb
|
375
378
|
- test/unit/code_object/proxy/method_object_test.rb
|