inch 0.5.0.rc8 → 0.5.0.rc9

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 (24) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/lib/inch/language/elixir/code_object/function_object.rb +3 -1
  4. data/lib/inch/language/elixir/code_object/function_parameter_object.rb +64 -0
  5. data/lib/inch/language/elixir/evaluation/function_object.rb +33 -0
  6. data/lib/inch/language/elixir/import.rb +1 -0
  7. data/lib/inch/language/elixir/provider/reader/object/base.rb +2 -1
  8. data/lib/inch/language/elixir/provider/reader/object/function_object.rb +24 -0
  9. data/lib/inch/language/elixir/provider/reader/object/function_parameter_object.rb +66 -0
  10. data/lib/inch/language/elixir/roles/function_parameter.rb +84 -0
  11. data/lib/inch/language/nodejs/code_object/function_object.rb +3 -1
  12. data/lib/inch/language/nodejs/code_object/function_parameter_object.rb +64 -0
  13. data/lib/inch/language/nodejs/evaluation/function_object.rb +33 -3
  14. data/lib/inch/language/nodejs/import.rb +1 -0
  15. data/lib/inch/language/nodejs/provider/jsdoc/docstring.rb +52 -0
  16. data/lib/inch/language/nodejs/provider/jsdoc/object/base.rb +9 -2
  17. data/lib/inch/language/nodejs/provider/jsdoc/object/function_object.rb +2 -0
  18. data/lib/inch/language/nodejs/provider/jsdoc/object/function_parameter_object.rb +66 -0
  19. data/lib/inch/language/nodejs/roles/function_parameter.rb +84 -0
  20. data/lib/inch/language/ruby/provider/yard/docstring.rb +20 -14
  21. data/lib/inch/version.rb +1 -1
  22. data/test/unit/language/elixir/code_object/function_object_test.rb +13 -1
  23. data/test/unit/language/nodejs/provider/jsdoc/docstring_test.rb +109 -0
  24. metadata +10 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cf685167eb90266f1ade2a603f466791804dcee0
4
- data.tar.gz: fba628a914b7dc892d6e8fedfb8875348995961f
3
+ metadata.gz: 307bb0b28d76ee1c7f05a226cfaf421ba6620077
4
+ data.tar.gz: 4e9b727f8db07d2da162538d0db12eb143aa3d43
5
5
  SHA512:
6
- metadata.gz: 13fca201ad1cd8a476dbff2f3161c6afe02cfda60086da40f9eed0edaf20db143b6fa435d1dc983371eef80a0b457baa4a6f92999ad10863d0f54009d1e24bb5
7
- data.tar.gz: 59da30a14fb8c646a517c9aec2886e36769fc37d285e474eb52f973445c799dba31bc15d552c05da88438030e048ae863516f1e7a696ac3f20715391702af20a
6
+ metadata.gz: b5540bb674d846f63d1a41f530d2bdb9ad4b93555b3f837c728d0f2e082ecb1bf87615d0416d849a6ca7c05d77cb4c1588f09c8f4f630722648ab96e68e9e626
7
+ data.tar.gz: ffa06231bf7c91dc536ec131e3c0e9b2993207b7b022e3852db3304bb378f0eab3214f844dd2e98f3860126769eef50f959b6165adb2f9a831a09b7745879bbf
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.1.0
1
+ ruby-2.1.3
@@ -1,3 +1,5 @@
1
+ require 'inch/language/elixir/code_object/function_parameter_object'
2
+
1
3
  module Inch
2
4
  module Language
3
5
  module Elixir
@@ -31,7 +33,7 @@ module Inch
31
33
 
32
34
  def parameters
33
35
  @parameters ||= self[:parameters].map do |param_attr|
34
- MethodParameterObject.new(param_attr)
36
+ FunctionParameterObject.new(param_attr)
35
37
  end
36
38
  end
37
39
 
@@ -0,0 +1,64 @@
1
+ module Inch
2
+ module Language
3
+ module Elixir
4
+ module CodeObject
5
+ # Proxy class for method parameters
6
+ class FunctionParameterObject
7
+ def initialize(attributes)
8
+ @attributes = attributes
9
+ end
10
+
11
+ def [](key)
12
+ @attributes[key]
13
+ end
14
+
15
+ BAD_NAME_EXCEPTIONS = %w(id)
16
+ BAD_NAME_THRESHOLD = 3
17
+
18
+ # @return [Boolean] +true+ if the name of the parameter is
19
+ # uncommunicative
20
+ def bad_name?
21
+ return false if BAD_NAME_EXCEPTIONS.include?(name)
22
+ name.size < BAD_NAME_THRESHOLD || name =~ /[0-9]$/
23
+ end
24
+
25
+ # @return [Boolean] +true+ if the parameter is a block
26
+ def block?
27
+ self[:block?]
28
+ end
29
+
30
+ # @return [Boolean] +true+ if an additional description given?
31
+ def described?
32
+ self[:described?]
33
+ end
34
+
35
+ # @return [Boolean] +true+ if the parameter is mentioned in the docs
36
+ def mentioned?
37
+ self[:mentioned?]
38
+ end
39
+
40
+ def name
41
+ self[:name]
42
+ end
43
+ alias_method :fullname, :name
44
+
45
+ # @return [Boolean] +true+ if the parameter is a splat argument
46
+ def splat?
47
+ self[:splat?]
48
+ end
49
+
50
+ # @return [Boolean] +true+ if the type of the parameter is defined
51
+ def typed?
52
+ self[:typed?]
53
+ end
54
+
55
+ # @return [Boolean] +true+ if the parameter is mentioned in the docs,
56
+ # but not present in the method's signature
57
+ def wrongly_mentioned?
58
+ self[:wrongly_mentioned?]
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -4,12 +4,28 @@ module Inch
4
4
  module Evaluation
5
5
  # Proxy class for functions
6
6
  class FunctionObject < Base
7
+ def evaluate
8
+ super
9
+ evaluate_parameters
10
+ end
11
+
7
12
  protected
8
13
 
9
14
  def relevant_roles
10
15
  relevant_base_roles.merge(relevant_function_roles)
11
16
  end
12
17
 
18
+ private
19
+
20
+ def evaluate_parameters
21
+ params = object.parameters
22
+ per_param = score_for_single_parameter
23
+ params.each do |param|
24
+ role_classes = relevant_parameter_roles(param, per_param)
25
+ __evaluate(param, role_classes)
26
+ end
27
+ end
28
+
13
29
  def relevant_function_roles
14
30
  {
15
31
  Role::Function::Getter => nil,
@@ -24,6 +40,23 @@ module Inch
24
40
  Role::Function::WithQuestioningName => nil
25
41
  }
26
42
  end
43
+
44
+ def relevant_parameter_roles(param, per_param)
45
+ {
46
+ Role::FunctionParameter::WithWrongMention =>
47
+ -score_for(:parameters),
48
+ Role::FunctionParameter::WithMention => per_param * 0.5,
49
+ Role::FunctionParameter::WithoutMention => per_param * 0.5,
50
+ Role::FunctionParameter::WithType => per_param * 0.5,
51
+ Role::FunctionParameter::WithoutType => per_param * 0.5,
52
+ Role::FunctionParameter::WithBadName => nil,
53
+ }
54
+ end
55
+
56
+ def score_for_single_parameter
57
+ @param_score ||= score_for(:parameters) / object.parameters.size
58
+ end
59
+
27
60
  end
28
61
  end
29
62
  end
@@ -21,4 +21,5 @@ require 'inch/language/elixir/roles/base'
21
21
  require 'inch/language/elixir/roles/object'
22
22
  require 'inch/language/elixir/roles/module'
23
23
  require 'inch/language/elixir/roles/function'
24
+ require 'inch/language/elixir/roles/function_parameter'
24
25
  require 'inch/language/elixir/roles/type'
@@ -128,7 +128,7 @@ module Inch
128
128
  end
129
129
 
130
130
  def parameters
131
- [] # raise NotImplementedError
131
+ []
132
132
  end
133
133
 
134
134
  def private?
@@ -190,6 +190,7 @@ module Inch
190
190
  def visibility
191
191
  :public
192
192
  end
193
+
193
194
  end
194
195
  end
195
196
  end
@@ -1,3 +1,5 @@
1
+ require 'inch/language/elixir/provider/reader/object/function_parameter_object'
2
+
1
3
  module Inch
2
4
  module Language
3
5
  module Elixir
@@ -17,6 +19,28 @@ module Inch
17
19
  def method?
18
20
  true
19
21
  end
22
+
23
+ def parameters
24
+ names = FunctionSignature.new(name, @hash['signature']).parameter_names
25
+ names.map do |name|
26
+ FunctionParameterObject.new(self, name)
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ class FunctionSignature < Struct.new(:fun_name, :signature)
33
+ def parameter_names
34
+ base_name = fun_name.split('/').first
35
+ signature.gsub(/^(#{base_name}\()/, '').gsub(/(\))$/, '')
36
+ .gsub( /\([^\)]+\)/, '' )
37
+ .split(',')
38
+ .map do |param|
39
+ name = param.split("\\\\").first
40
+ name && name.strip
41
+ end.compact
42
+ end
43
+ end
20
44
  end
21
45
  end
22
46
  end
@@ -0,0 +1,66 @@
1
+ module Inch
2
+ module Language
3
+ module Elixir
4
+ module Provider
5
+ module Reader
6
+ module Object
7
+ # Proxy class for function parameters
8
+ class FunctionParameterObject
9
+ attr_reader :name # @return [String]
10
+
11
+ # @param method [YARD::Object::MethodObject] the method the
12
+ # parameter belongs to
13
+ # @param name [String] the name of the parameter
14
+ def initialize(method, name)
15
+ @method = method
16
+ @name = name
17
+ end
18
+
19
+ # @return [Boolean] +true+ if the parameter is a block
20
+ def block?
21
+ false
22
+ end
23
+
24
+ # @return [Boolean] +true+ if an additional description is given?
25
+ def described?
26
+ described_by_docstring?
27
+ end
28
+
29
+ # @return [Boolean] +true+ if the parameter is mentioned in the
30
+ # docs
31
+ def mentioned?
32
+ mentioned_by_docstring?
33
+ end
34
+
35
+ # @return [Boolean] +true+ if the parameter is a splat argument
36
+ def splat?
37
+ false
38
+ end
39
+
40
+ # @return [Boolean] +true+ if the type of the parameter is defined
41
+ def typed?
42
+ false # TODO: parse types of params
43
+ end
44
+
45
+ # @return [Boolean] +true+ if the parameter is mentioned in the
46
+ # docs, but not present in the method's signature
47
+ def wrongly_mentioned?
48
+ false
49
+ end
50
+
51
+ private
52
+
53
+ def described_by_docstring?
54
+ @method.docstring.describes_parameter?(name)
55
+ end
56
+
57
+ def mentioned_by_docstring?
58
+ @method.docstring.mentions_parameter?(name)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,84 @@
1
+ module Inch
2
+ module Language
3
+ module Elixir
4
+ module Evaluation
5
+ module Role
6
+ # Roles assigned to method parameters
7
+ #
8
+ # @note The +object+ is a MethodParameterObject here!
9
+ module FunctionParameter
10
+ # Role assigned to parameters that are mentioned in the docs
11
+ #
12
+ # @see CodeObject::Ruby::MethodParameterObject#mentioned?
13
+ class WithMention < Base
14
+ applicable_if :mentioned?
15
+ end
16
+
17
+ # Role assigned to parameters that are not mentioned in the docs
18
+ #
19
+ # @see CodeObject::Ruby::MethodParameterObject#mentioned?
20
+ class WithoutMention < Missing
21
+ applicable_unless :mentioned?
22
+
23
+ def suggestion
24
+ "Describe the parameter '#{object.name}'"
25
+ end
26
+ end
27
+
28
+ # Role assigned to parameters that are typed in the docs
29
+ #
30
+ # @see CodeObject::Ruby::MethodParameterObject#typed?
31
+ class WithType < Base
32
+ applicable_if :typed?
33
+ end
34
+
35
+ # Role assigned to parameters that are not typed in the docs
36
+ #
37
+ # @see CodeObject::Ruby::MethodParameterObject#typed?
38
+ class WithoutType < Missing
39
+ applicable_unless :typed?
40
+ end
41
+
42
+ # Role assigned to parameters that are spalts, e.g. +*args+
43
+ #
44
+ # @see CodeObject::Ruby::MethodParameterObject#splat?
45
+ class Splat < Base
46
+ applicable_if :splat?
47
+ priority +1
48
+ end
49
+
50
+ # Role assigned to parameters that are blocks, e.g. +&block+
51
+ #
52
+ # @see CodeObject::Ruby::MethodParameterObject#block?
53
+ class Block < Base
54
+ applicable_if :block?
55
+ priority +1
56
+ end
57
+
58
+ # Role assigned to parameters that are documented, but not part of
59
+ # the method signature
60
+ #
61
+ # @see CodeObject::Ruby::MethodParameterObject#wrongly_mentioned?
62
+ class WithWrongMention < Base
63
+ applicable_if :wrongly_mentioned?
64
+ priority +1
65
+
66
+ def suggestion
67
+ "The parameter '#{object.name}' seems not to be part of the " \
68
+ 'signature.'
69
+ end
70
+ end
71
+
72
+ # Role assigned to parameters that have a 'bad' name
73
+ #
74
+ # @see CodeObject::Ruby::MethodParameterObject#bad_name?
75
+ class WithBadName < Base
76
+ applicable_if :bad_name?
77
+ priority +1
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -1,3 +1,5 @@
1
+ require 'inch/language/nodejs/code_object/function_parameter_object'
2
+
1
3
  module Inch
2
4
  module Language
3
5
  module Nodejs
@@ -31,7 +33,7 @@ module Inch
31
33
 
32
34
  def parameters
33
35
  @parameters ||= self[:parameters].map do |param_attr|
34
- MethodParameterObject.new(param_attr)
36
+ FunctionParameterObject.new(param_attr)
35
37
  end
36
38
  end
37
39
 
@@ -0,0 +1,64 @@
1
+ module Inch
2
+ module Language
3
+ module Nodejs
4
+ module CodeObject
5
+ # Proxy class for method parameters
6
+ class FunctionParameterObject
7
+ def initialize(attributes)
8
+ @attributes = attributes
9
+ end
10
+
11
+ def [](key)
12
+ @attributes[key]
13
+ end
14
+
15
+ BAD_NAME_EXCEPTIONS = %w(id)
16
+ BAD_NAME_THRESHOLD = 3
17
+
18
+ # @return [Boolean] +true+ if the name of the parameter is
19
+ # uncommunicative
20
+ def bad_name?
21
+ return false if BAD_NAME_EXCEPTIONS.include?(name)
22
+ name.size < BAD_NAME_THRESHOLD || name =~ /[0-9]$/
23
+ end
24
+
25
+ # @return [Boolean] +true+ if the parameter is a block
26
+ def block?
27
+ self[:block?]
28
+ end
29
+
30
+ # @return [Boolean] +true+ if an additional description given?
31
+ def described?
32
+ self[:described?]
33
+ end
34
+
35
+ # @return [Boolean] +true+ if the parameter is mentioned in the docs
36
+ def mentioned?
37
+ self[:mentioned?]
38
+ end
39
+
40
+ def name
41
+ self[:name]
42
+ end
43
+ alias_method :fullname, :name
44
+
45
+ # @return [Boolean] +true+ if the parameter is a splat argument
46
+ def splat?
47
+ self[:splat?]
48
+ end
49
+
50
+ # @return [Boolean] +true+ if the type of the parameter is defined
51
+ def typed?
52
+ self[:typed?]
53
+ end
54
+
55
+ # @return [Boolean] +true+ if the parameter is mentioned in the docs,
56
+ # but not present in the method's signature
57
+ def wrongly_mentioned?
58
+ self[:wrongly_mentioned?]
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -4,12 +4,28 @@ module Inch
4
4
  module Evaluation
5
5
  # Proxy class for functions
6
6
  class FunctionObject < Base
7
+ def evaluate
8
+ super
9
+ evaluate_parameters
10
+ end
11
+
7
12
  protected
8
13
 
9
14
  def relevant_roles
10
15
  relevant_base_roles.merge(relevant_function_roles)
11
16
  end
12
17
 
18
+ private
19
+
20
+ def evaluate_parameters
21
+ params = object.parameters
22
+ per_param = score_for_single_parameter
23
+ params.each do |param|
24
+ role_classes = relevant_parameter_roles(param, per_param)
25
+ __evaluate(param, role_classes)
26
+ end
27
+ end
28
+
13
29
  def relevant_function_roles
14
30
  {
15
31
  Role::Function::Getter => nil,
@@ -19,11 +35,25 @@ module Inch
19
35
  object.overridden_method.score
20
36
  else
21
37
  nil
22
- end,
23
- Role::Function::WithBangName => nil,
24
- Role::Function::WithQuestioningName => nil
38
+ end
25
39
  }
26
40
  end
41
+
42
+ def relevant_parameter_roles(param, per_param)
43
+ {
44
+ Role::FunctionParameter::WithWrongMention =>
45
+ -score_for(:parameters),
46
+ Role::FunctionParameter::WithMention => per_param * 0.5,
47
+ Role::FunctionParameter::WithoutMention => per_param * 0.5,
48
+ Role::FunctionParameter::WithType => per_param * 0.5,
49
+ Role::FunctionParameter::WithoutType => per_param * 0.5,
50
+ Role::FunctionParameter::WithBadName => nil,
51
+ }
52
+ end
53
+
54
+ def score_for_single_parameter
55
+ @param_score ||= score_for(:parameters) / object.parameters.size
56
+ end
27
57
  end
28
58
  end
29
59
  end
@@ -21,4 +21,5 @@ require 'inch/language/nodejs/roles/base'
21
21
  require 'inch/language/nodejs/roles/object'
22
22
  require 'inch/language/nodejs/roles/module'
23
23
  require 'inch/language/nodejs/roles/function'
24
+ require 'inch/language/nodejs/roles/function_parameter'
24
25
  require 'inch/language/nodejs/roles/member'
@@ -5,6 +5,58 @@ module Inch
5
5
  module Provider
6
6
  module JSDoc
7
7
  class Docstring < Ruby::Provider::YARD::Docstring
8
+ # Removes the comment markers // /* */ from the docstring.
9
+ #
10
+ # Docstring.new("// test").without_comment_markers
11
+ # # => "test"
12
+ #
13
+ # @return [String]
14
+ def without_comment_markers
15
+ @text.lines.map do |line|
16
+ line.strip.gsub(/^(\s*(\/\*+|\/\/|\*+\/|\*)+\s?)/m, '')
17
+ end.join("\n").strip
18
+ end
19
+
20
+ def describes_internal_api?
21
+ tag?(:api, :private) || super
22
+ end
23
+
24
+ def describes_parameter?(name)
25
+ return false if name.nil?
26
+ parameter = parameter_notations(name)
27
+ tag?(:param, /#{parameter}\s+\S+/)
28
+ end
29
+
30
+ def mentions_parameter?(name)
31
+ return false if name.nil?
32
+ parameter = parameter_notations(name)
33
+ tag?(:param, /#{parameter}/) || super
34
+ end
35
+
36
+ def mentions_return?
37
+ tag?(:return) || super
38
+ end
39
+
40
+ def describes_return?
41
+ type_notation = /(\{[^\}]+\}|\[[^\]]+\])/
42
+ tag?(:return, /#{type_notation}*(\s\w+)/) || super
43
+ end
44
+
45
+ def visibility
46
+ %w(public protected private).detect do |v|
47
+ tag?(v)
48
+ end || 'public'
49
+ end
50
+
51
+ def tag?(tagname, regex = nil)
52
+ if without_comment_markers =~ /^\s*\@#{tagname}([^\n]*)$/m
53
+ if regex.nil?
54
+ true
55
+ else
56
+ $1 =~ /#{regex}/
57
+ end
58
+ end
59
+ end
8
60
  end
9
61
  end
10
62
  end
@@ -147,7 +147,14 @@ module Inch
147
147
  end
148
148
 
149
149
  def parameters
150
- [] # raise NotImplementedError
150
+ if meta? && meta['code']
151
+ names = meta['code']['paramnames'] || []
152
+ names.map do |name|
153
+ FunctionParameterObject.new(self, name)
154
+ end
155
+ else
156
+ []
157
+ end
151
158
  end
152
159
 
153
160
  def private?
@@ -207,7 +214,7 @@ module Inch
207
214
  end
208
215
 
209
216
  def visibility
210
- :public
217
+ docstring.visibility
211
218
  end
212
219
 
213
220
  protected
@@ -1,3 +1,5 @@
1
+ require 'inch/language/nodejs/provider/jsdoc/object/function_parameter_object'
2
+
1
3
  module Inch
2
4
  module Language
3
5
  module Nodejs
@@ -0,0 +1,66 @@
1
+ module Inch
2
+ module Language
3
+ module Nodejs
4
+ module Provider
5
+ module JSDoc
6
+ module Object
7
+ # Proxy class for function parameters
8
+ class FunctionParameterObject
9
+ attr_reader :name # @return [String]
10
+
11
+ # @param method [YARD::Object::MethodObject] the method the
12
+ # parameter belongs to
13
+ # @param name [String] the name of the parameter
14
+ def initialize(method, name)
15
+ @method = method
16
+ @name = name
17
+ end
18
+
19
+ # @return [Boolean] +true+ if the parameter is a block
20
+ def block?
21
+ false
22
+ end
23
+
24
+ # @return [Boolean] +true+ if an additional description is given?
25
+ def described?
26
+ described_by_docstring?
27
+ end
28
+
29
+ # @return [Boolean] +true+ if the parameter is mentioned in the
30
+ # docs
31
+ def mentioned?
32
+ mentioned_by_docstring?
33
+ end
34
+
35
+ # @return [Boolean] +true+ if the parameter is a splat argument
36
+ def splat?
37
+ false
38
+ end
39
+
40
+ # @return [Boolean] +true+ if the type of the parameter is defined
41
+ def typed?
42
+ false # TODO: parse types of params
43
+ end
44
+
45
+ # @return [Boolean] +true+ if the parameter is mentioned in the
46
+ # docs, but not present in the method's signature
47
+ def wrongly_mentioned?
48
+ false
49
+ end
50
+
51
+ private
52
+
53
+ def described_by_docstring?
54
+ @method.docstring.describes_parameter?(name)
55
+ end
56
+
57
+ def mentioned_by_docstring?
58
+ @method.docstring.mentions_parameter?(name)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,84 @@
1
+ module Inch
2
+ module Language
3
+ module Nodejs
4
+ module Evaluation
5
+ module Role
6
+ # Roles assigned to method parameters
7
+ #
8
+ # @note The +object+ is a MethodParameterObject here!
9
+ module FunctionParameter
10
+ # Role assigned to parameters that are mentioned in the docs
11
+ #
12
+ # @see CodeObject::Ruby::MethodParameterObject#mentioned?
13
+ class WithMention < Base
14
+ applicable_if :mentioned?
15
+ end
16
+
17
+ # Role assigned to parameters that are not mentioned in the docs
18
+ #
19
+ # @see CodeObject::Ruby::MethodParameterObject#mentioned?
20
+ class WithoutMention < Missing
21
+ applicable_unless :mentioned?
22
+
23
+ def suggestion
24
+ "Describe the parameter '#{object.name}'"
25
+ end
26
+ end
27
+
28
+ # Role assigned to parameters that are typed in the docs
29
+ #
30
+ # @see CodeObject::Ruby::MethodParameterObject#typed?
31
+ class WithType < Base
32
+ applicable_if :typed?
33
+ end
34
+
35
+ # Role assigned to parameters that are not typed in the docs
36
+ #
37
+ # @see CodeObject::Ruby::MethodParameterObject#typed?
38
+ class WithoutType < Missing
39
+ applicable_unless :typed?
40
+ end
41
+
42
+ # Role assigned to parameters that are spalts, e.g. +*args+
43
+ #
44
+ # @see CodeObject::Ruby::MethodParameterObject#splat?
45
+ class Splat < Base
46
+ applicable_if :splat?
47
+ priority +1
48
+ end
49
+
50
+ # Role assigned to parameters that are blocks, e.g. +&block+
51
+ #
52
+ # @see CodeObject::Ruby::MethodParameterObject#block?
53
+ class Block < Base
54
+ applicable_if :block?
55
+ priority +1
56
+ end
57
+
58
+ # Role assigned to parameters that are documented, but not part of
59
+ # the method signature
60
+ #
61
+ # @see CodeObject::Ruby::MethodParameterObject#wrongly_mentioned?
62
+ class WithWrongMention < Base
63
+ applicable_if :wrongly_mentioned?
64
+ priority +1
65
+
66
+ def suggestion
67
+ "The parameter '#{object.name}' seems not to be part of the " \
68
+ 'signature.'
69
+ end
70
+ end
71
+
72
+ # Role assigned to parameters that have a 'bad' name
73
+ #
74
+ # @see CodeObject::Ruby::MethodParameterObject#bad_name?
75
+ class WithBadName < Base
76
+ applicable_if :bad_name?
77
+ priority +1
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -59,7 +59,7 @@ module Inch
59
59
  @text
60
60
  end
61
61
 
62
- private
62
+ protected
63
63
 
64
64
  def first_line
65
65
  @first_line ||= @text.lines.to_a.first
@@ -103,23 +103,29 @@ module Inch
103
103
  # @param name [String] the name of the method parameter
104
104
  # @return [Array<Regexp>]
105
105
  def mention_parameter_patterns(name)
106
+ expr = parameter_notations(name)
107
+ [
108
+ /#{expr}\:\:/, # param1::
109
+ /\`#{expr}\`/, # `param1`
110
+ /\+#{expr}\+/, # +param1+
111
+ /\+#{expr}\+\:\:/, # +param1+::
112
+ /<tt>#{expr}<\/tt>/, # <tt>param1</tt>
113
+ /<tt>#{expr}<\/tt>\:\:/, # <tt>param1</tt>::
114
+ /^#{expr}\ \-\ / # param1 -
115
+ ]
116
+ end
117
+
118
+ # Returns possible notations for +name+.
119
+ # matches "param1" and "param1<String,nil>"
120
+ # @return [Regexp]
121
+ def parameter_notations(name)
106
122
  escaped_name = Regexp.escape(name)
107
123
  type = /<[^>]+>/
108
- [
109
- escaped_name,
110
- /#{escaped_name}#{type}/ # matches "param1<String,nil>"
111
- ].map do |expr|
112
- [
113
- /#{expr}\:\:/, # param1::
114
- /\+#{expr}\+/, # +param1+
115
- /\+#{expr}\+\:\:/, # +param1+::
116
- /<tt>#{expr}<\/tt>/, # <tt>param1</tt>
117
- /<tt>#{expr}<\/tt>\:\:/, # <tt>param1</tt>::
118
- /^#{expr}\ \-\ / # param1 -
119
- ]
120
- end.flatten
124
+ /(#{escaped_name}|#{escaped_name}#{type})/
121
125
  end
122
126
 
127
+ # Returns regexes to match parameter description on the next
128
+ # line.
123
129
  def describe_parameter_extra_regexps(name)
124
130
  [
125
131
  "#{name}::",
data/lib/inch/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Inch
2
- VERSION = '0.5.0.rc8'
2
+ VERSION = '0.5.0.rc9'
3
3
  end
@@ -10,7 +10,7 @@ describe ::Inch::Language::Elixir::CodeObject::FunctionObject do
10
10
  #
11
11
  it 'should not' do
12
12
  m = @objects.find('InchEx.generate_docs/3')
13
- assert m.score > 50
13
+ assert m.score >= 50
14
14
  end
15
15
  end
16
16
 
@@ -32,4 +32,16 @@ describe ::Inch::Language::Elixir::CodeObject::FunctionObject do
32
32
  m = @objects.find('InchEx.Docs.Formatter.run/2')
33
33
  assert_equal 4, m.depth
34
34
  end
35
+
36
+ it "should parse parameters correctly" do
37
+ m = @objects.find("Mix.Tasks.Inch.run/4")
38
+ #assert_equal 4, m.parameters.size
39
+ end
40
+
41
+ # TODO: move to own test file
42
+ it "should parse parameters correctly 1" do
43
+ klass = ::Inch::Language::Elixir::Provider::Reader::Object::FunctionObject::FunctionSignature
44
+ fn = klass.new('run/4', "run(args, config \\\\ Mix.Project.config(), generator \\\\ :erlang.make_fun(InchEx, :generate_docs, 3), reporter \\\\ InchEx.Reporter.Local)")
45
+ assert_equal %w(args config generator reporter), fn.parameter_names
46
+ end
35
47
  end
@@ -0,0 +1,109 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../../../test_helper')
2
+
3
+ describe ::Inch::Language::Nodejs::Provider::JSDoc::Docstring do
4
+ let(:described_class) { ::Inch::Language::Nodejs::Provider::JSDoc::Docstring }
5
+
6
+ #
7
+ # JSDoc compatibility
8
+ #
9
+
10
+ it 'should notice things in jsdoc style docs' do
11
+ text = <<-DOC
12
+ /**
13
+ * Set or get the context `Runnable` to `runnable`.
14
+ *
15
+ * @param {Runnable} runnable the runnable to execute
16
+ * @return {Context} the context
17
+ * @api private
18
+ */
19
+ DOC
20
+ docstring = described_class.new(text)
21
+ assert docstring.mentions_parameter?(:runnable)
22
+ assert docstring.describes_parameter?(:runnable)
23
+ assert docstring.describes_internal_api?
24
+ assert docstring.mentions_return?
25
+ assert docstring.describes_return?
26
+ end
27
+
28
+ it 'should notice things in jsdoc style docs 2' do
29
+ text = <<-DOC
30
+ /**
31
+ * Set or get the context `Runnable` to `runnable`.
32
+ *
33
+ * @param {Runnable} runnable
34
+ * @return {Context}
35
+ */
36
+ DOC
37
+ docstring = described_class.new(text)
38
+ assert docstring.mentions_parameter?(:runnable)
39
+ refute docstring.describes_parameter?(:runnable)
40
+ refute docstring.describes_internal_api?
41
+ assert docstring.mentions_return?
42
+ refute docstring.describes_return?
43
+ end
44
+
45
+ it 'should notice things in jsdoc style docs' do
46
+ %w(public protected private).each do |visibility|
47
+ text = <<-DOC
48
+ /**
49
+ * Set or get the context `Runnable` to `runnable`.
50
+ *
51
+ * @#{visibility}
52
+ */
53
+ DOC
54
+ docstring = described_class.new(text)
55
+ assert_equal visibility, docstring.visibility
56
+ end
57
+ end
58
+
59
+
60
+ # removing comment slashes
61
+
62
+ it 'should remove comment markers for parsing 1' do
63
+ text = <<-DOC
64
+ /**
65
+ * Set or get the context `Runnable` to `runnable`.
66
+ *
67
+ * @param {Runnable} runnable the runnable to execute
68
+ * @return {Context} the context
69
+ * @api private
70
+ */
71
+ DOC
72
+ without_comment_markers = <<-DOC
73
+ Set or get the context `Runnable` to `runnable`.
74
+
75
+ @param {Runnable} runnable the runnable to execute
76
+ @return {Context} the context
77
+ @api private
78
+ DOC
79
+ docstring = described_class.new(text)
80
+ assert_equal without_comment_markers.strip, docstring.without_comment_markers
81
+ end
82
+
83
+ it 'should remove comment markers for parsing 2' do
84
+ text = <<-DOC
85
+ /*
86
+ * Set or get the context `Runnable` to `runnable`.
87
+ *
88
+ */
89
+ DOC
90
+ without_comment_markers = <<-DOC
91
+ Set or get the context `Runnable` to `runnable`.
92
+ DOC
93
+ docstring = described_class.new(text)
94
+ assert_equal without_comment_markers.strip, docstring.without_comment_markers
95
+ end
96
+
97
+
98
+ it 'should remove comment markers for parsing 3' do
99
+ text = <<-DOC
100
+ //Set or get the context `Runnable` to `runnable`.
101
+ DOC
102
+ without_comment_markers = <<-DOC
103
+ Set or get the context `Runnable` to `runnable`.
104
+ DOC
105
+ docstring = described_class.new(text)
106
+ assert_equal without_comment_markers.strip, docstring.without_comment_markers
107
+ end
108
+
109
+ 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.5.0.rc8
4
+ version: 0.5.0.rc9
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-09-17 00:00:00.000000000 Z
11
+ date: 2014-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -211,6 +211,7 @@ files:
211
211
  - lib/inch/language.rb
212
212
  - lib/inch/language/elixir/code_object/base.rb
213
213
  - lib/inch/language/elixir/code_object/function_object.rb
214
+ - lib/inch/language/elixir/code_object/function_parameter_object.rb
214
215
  - lib/inch/language/elixir/code_object/module_object.rb
215
216
  - lib/inch/language/elixir/code_object/type_object.rb
216
217
  - lib/inch/language/elixir/evaluation/base.rb
@@ -223,16 +224,19 @@ files:
223
224
  - lib/inch/language/elixir/provider/reader/object.rb
224
225
  - lib/inch/language/elixir/provider/reader/object/base.rb
225
226
  - lib/inch/language/elixir/provider/reader/object/function_object.rb
227
+ - lib/inch/language/elixir/provider/reader/object/function_parameter_object.rb
226
228
  - lib/inch/language/elixir/provider/reader/object/module_object.rb
227
229
  - lib/inch/language/elixir/provider/reader/object/type_object.rb
228
230
  - lib/inch/language/elixir/provider/reader/parser.rb
229
231
  - lib/inch/language/elixir/roles/base.rb
230
232
  - lib/inch/language/elixir/roles/function.rb
233
+ - lib/inch/language/elixir/roles/function_parameter.rb
231
234
  - lib/inch/language/elixir/roles/module.rb
232
235
  - lib/inch/language/elixir/roles/object.rb
233
236
  - lib/inch/language/elixir/roles/type.rb
234
237
  - lib/inch/language/nodejs/code_object/base.rb
235
238
  - lib/inch/language/nodejs/code_object/function_object.rb
239
+ - lib/inch/language/nodejs/code_object/function_parameter_object.rb
236
240
  - lib/inch/language/nodejs/code_object/member_object.rb
237
241
  - lib/inch/language/nodejs/code_object/module_object.rb
238
242
  - lib/inch/language/nodejs/evaluation/base.rb
@@ -245,11 +249,13 @@ files:
245
249
  - lib/inch/language/nodejs/provider/jsdoc/object.rb
246
250
  - lib/inch/language/nodejs/provider/jsdoc/object/base.rb
247
251
  - lib/inch/language/nodejs/provider/jsdoc/object/function_object.rb
252
+ - lib/inch/language/nodejs/provider/jsdoc/object/function_parameter_object.rb
248
253
  - lib/inch/language/nodejs/provider/jsdoc/object/member_object.rb
249
254
  - lib/inch/language/nodejs/provider/jsdoc/object/module_object.rb
250
255
  - lib/inch/language/nodejs/provider/jsdoc/parser.rb
251
256
  - lib/inch/language/nodejs/roles/base.rb
252
257
  - lib/inch/language/nodejs/roles/function.rb
258
+ - lib/inch/language/nodejs/roles/function_parameter.rb
253
259
  - lib/inch/language/nodejs/roles/member.rb
254
260
  - lib/inch/language/nodejs/roles/module.rb
255
261
  - lib/inch/language/nodejs/roles/object.rb
@@ -359,6 +365,7 @@ files:
359
365
  - test/unit/config_test.rb
360
366
  - test/unit/evaluation/role_test.rb
361
367
  - test/unit/language/elixir/code_object/function_object_test.rb
368
+ - test/unit/language/nodejs/provider/jsdoc/docstring_test.rb
362
369
  - test/unit/language/ruby/code_object/alias_test.rb
363
370
  - test/unit/language/ruby/code_object/method_object_test.rb
364
371
  - test/unit/language/ruby/provider/yard/docstring_test.rb
@@ -451,6 +458,7 @@ test_files:
451
458
  - test/unit/config_test.rb
452
459
  - test/unit/evaluation/role_test.rb
453
460
  - test/unit/language/elixir/code_object/function_object_test.rb
461
+ - test/unit/language/nodejs/provider/jsdoc/docstring_test.rb
454
462
  - test/unit/language/ruby/code_object/alias_test.rb
455
463
  - test/unit/language/ruby/code_object/method_object_test.rb
456
464
  - test/unit/language/ruby/provider/yard/docstring_test.rb