inch 0.1.4 → 0.2.0
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/TODOS.md +5 -3
- data/bin/inch +9 -4
- data/inch.gemspec +9 -4
- data/lib/inch.rb +1 -0
- data/lib/inch/cli.rb +6 -0
- data/lib/inch/cli/command.rb +0 -6
- data/lib/inch/cli/command_parser.rb +0 -2
- data/lib/inch/code_object/nodoc_helper.rb +1 -1
- data/lib/inch/code_object/proxy/base.rb +18 -3
- data/lib/inch/code_object/proxy/method_object.rb +5 -0
- data/lib/inch/config.rb +53 -0
- data/lib/inch/evaluation.rb +1 -1
- data/lib/inch/evaluation/base.rb +45 -1
- data/lib/inch/evaluation/constant_object.rb +10 -5
- data/lib/inch/evaluation/criteria.rb +38 -0
- data/lib/inch/evaluation/method_object.rb +50 -42
- data/lib/inch/evaluation/namespace_object.rb +38 -33
- data/lib/inch/evaluation/role/constant.rb +1 -0
- data/lib/inch/evaluation/role/method.rb +41 -10
- data/lib/inch/evaluation/role/method_parameter.rb +16 -1
- data/lib/inch/evaluation/role/namespace.rb +17 -5
- data/lib/inch/evaluation/role/object.rb +35 -0
- data/lib/inch/version.rb +1 -1
- data/test/fixtures/simple/lib/foo.rb +0 -37
- data/test/fixtures/simple/lib/nodoc.rb +45 -0
- data/test/fixtures/simple/lib/role_methods.rb +4 -0
- data/test/inch/code_object/nodoc_helper_test.rb +3 -1
- data/test/inch/code_object/proxy/method_object_test.rb +9 -0
- metadata +26 -32
- data/lib/inch/cli/command/console.rb +0 -22
- data/lib/inch/cli/command/inspect.rb +0 -20
- data/lib/inch/cli/command/options/console.rb +0 -26
- data/lib/inch/cli/command/options/inspect.rb +0 -25
- data/lib/inch/cli/command/output/console.rb +0 -49
- data/lib/inch/cli/command/output/inspect.rb +0 -129
- data/test/inch/cli/command/console_test.rb +0 -59
- data/test/inch/cli/command/inspect_test.rb +0 -68
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf840afb1d2d50573095b6a0592280e814d4329b
|
4
|
+
data.tar.gz: 95f117197464c1d151531ec48a43a90d4260341b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c58bc5692ce925bb99f44c885562a4c648289ca9a8331e255cf40b6718d8707775bacb30c37df19f86d462abfa9bad420c34f1751d8b90778f7f699336ee5b06
|
7
|
+
data.tar.gz: ccbb7641f546e75111cd698187ad1ad79c50ac5dc843b68481815649e54ee32758ad57f4200fe25281ec9e270ae4410a8f94b93334ccc4a18c8209286cc0d58e
|
data/TODOS.md
CHANGED
@@ -7,10 +7,12 @@
|
|
7
7
|
visibility options
|
8
8
|
* Add support for multiple signatures for methods
|
9
9
|
(realized via the @overload tag in YARD)
|
10
|
+
|
10
11
|
* Think about implicit cases in terms of evaluation:
|
11
|
-
* constructors
|
12
|
-
*
|
12
|
+
* constructors and ?-methods are automatically assigned a @return tag
|
13
|
+
* attr_* methods are automatically assigned a docstring and @param tag
|
14
|
+
|
13
15
|
* Think about limiting the number of `B`-objects in `inch suggest`
|
14
16
|
`inch suggest` shows too many `B`s even though there are still undocumented
|
15
17
|
objects in the codebase. this becomes a problem, when one thinks of `B` as
|
16
|
-
"good enough", which Inch itself suggests.
|
18
|
+
"good enough", which Inch itself suggests.
|
data/bin/inch
CHANGED
@@ -6,11 +6,16 @@ Signal.trap("INT") do
|
|
6
6
|
exit 1
|
7
7
|
end
|
8
8
|
|
9
|
-
path
|
10
|
-
|
11
|
-
path =
|
9
|
+
# @return [String] the path to the 'lib' directory of Inch
|
10
|
+
def find_lib_path
|
11
|
+
path = __FILE__
|
12
|
+
while File.symlink?(path)
|
13
|
+
path = File.expand_path(File.readlink(path), File.dirname(path))
|
14
|
+
end
|
15
|
+
File.join(File.dirname(File.expand_path(path)), '..', 'lib')
|
12
16
|
end
|
13
|
-
|
17
|
+
|
18
|
+
$LOAD_PATH.unshift(find_lib_path)
|
14
19
|
|
15
20
|
require 'inch'
|
16
21
|
|
data/inch.gemspec
CHANGED
@@ -13,16 +13,21 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.homepage = "http://trivelop.de/inch/"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
|
-
|
16
|
+
all_files = `git ls-files -z`.split("\x0")
|
17
|
+
files_without_dev_commands = all_files.select do |f|
|
18
|
+
f !~ /cli\/command\/.*(console|inspect)/
|
19
|
+
end
|
20
|
+
|
21
|
+
spec.files = files_without_dev_commands
|
17
22
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
23
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
24
|
spec.require_paths = ["lib"]
|
20
25
|
|
21
26
|
spec.add_development_dependency "bundler", "~> 1.5"
|
22
27
|
spec.add_development_dependency "rake"
|
28
|
+
spec.add_development_dependency "pry"
|
23
29
|
|
24
|
-
spec.add_dependency
|
30
|
+
spec.add_dependency 'sparkr', ">= 0.2.0"
|
25
31
|
spec.add_dependency "term-ansicolor"
|
26
|
-
spec.add_dependency
|
27
|
-
spec.add_dependency "pry"
|
32
|
+
spec.add_dependency "yard", "~> 0.8.7"
|
28
33
|
end
|
data/lib/inch.rb
CHANGED
data/lib/inch/cli.rb
CHANGED
@@ -22,3 +22,9 @@ require_relative 'cli/trace_helper'
|
|
22
22
|
require_relative 'cli/yardopts_helper'
|
23
23
|
require_relative 'cli/command'
|
24
24
|
require_relative 'cli/command_parser'
|
25
|
+
|
26
|
+
console_rb = File.join(File.dirname(__FILE__), 'cli', 'command', 'console.rb')
|
27
|
+
if File.exists?(console_rb)
|
28
|
+
require_relative 'cli/command/console'
|
29
|
+
require_relative 'cli/command/inspect'
|
30
|
+
end
|
data/lib/inch/cli/command.rb
CHANGED
@@ -2,8 +2,6 @@ require_relative 'command/base'
|
|
2
2
|
require_relative 'command/base_list'
|
3
3
|
require_relative 'command/base_object'
|
4
4
|
|
5
|
-
require_relative 'command/console'
|
6
|
-
require_relative 'command/inspect'
|
7
5
|
require_relative 'command/list'
|
8
6
|
require_relative 'command/show'
|
9
7
|
require_relative 'command/stats'
|
@@ -13,16 +11,12 @@ require_relative 'command/options/base'
|
|
13
11
|
require_relative 'command/options/base_list'
|
14
12
|
require_relative 'command/options/base_object'
|
15
13
|
|
16
|
-
require_relative 'command/options/console'
|
17
|
-
require_relative 'command/options/inspect'
|
18
14
|
require_relative 'command/options/list'
|
19
15
|
require_relative 'command/options/show'
|
20
16
|
require_relative 'command/options/stats'
|
21
17
|
require_relative 'command/options/suggest'
|
22
18
|
|
23
19
|
require_relative 'command/output/base'
|
24
|
-
require_relative 'command/output/console'
|
25
|
-
require_relative 'command/output/inspect'
|
26
20
|
require_relative 'command/output/list'
|
27
21
|
require_relative 'command/output/show'
|
28
22
|
require_relative 'command/output/stats'
|
@@ -8,7 +8,7 @@ module Inch
|
|
8
8
|
extend Forwardable
|
9
9
|
include NodocHelper
|
10
10
|
|
11
|
-
# the actual (YARD) code object
|
11
|
+
# @return [YARD::CodeObjects::Base] the actual (YARD) code object
|
12
12
|
attr_accessor :object
|
13
13
|
|
14
14
|
# @return [Symbol]
|
@@ -17,7 +17,7 @@ module Inch
|
|
17
17
|
attr_writer :grade
|
18
18
|
|
19
19
|
# Tags considered by wrapper methods like {#has_code_example?}
|
20
|
-
CONSIDERED_YARD_TAGS = %w(example param private return)
|
20
|
+
CONSIDERED_YARD_TAGS = %w(api example param private return)
|
21
21
|
|
22
22
|
# convenient shortcuts to (YARD) code object
|
23
23
|
def_delegators :object, :type, :path, :name, :namespace, :source, :source_type, :signature, :group, :dynamic, :visibility, :docstring
|
@@ -25,10 +25,15 @@ module Inch
|
|
25
25
|
# convenient shortcuts to evalution object
|
26
26
|
def_delegators :evaluation, :score, :roles, :priority
|
27
27
|
|
28
|
+
# @param object [YARD::CodeObjects::Base] the actual (YARD) code object
|
28
29
|
def initialize(object)
|
29
30
|
self.object = object
|
30
31
|
end
|
31
32
|
|
33
|
+
def api_tag?
|
34
|
+
!object.tag(:api).nil? || (parent && parent.api_tag?)
|
35
|
+
end
|
36
|
+
|
32
37
|
# To be overridden
|
33
38
|
# @see Proxy::NamespaceObject
|
34
39
|
# @return [Array,nil] the children of the current object or +nil+
|
@@ -36,10 +41,12 @@ module Inch
|
|
36
41
|
nil
|
37
42
|
end
|
38
43
|
|
44
|
+
# @return [Docstring]
|
39
45
|
def docstring
|
40
46
|
@docstring ||= Docstring.new(object.docstring)
|
41
47
|
end
|
42
48
|
|
49
|
+
# @return [Evaluation::Base]
|
43
50
|
def evaluation
|
44
51
|
@evaluation ||= Evaluation.for(self)
|
45
52
|
end
|
@@ -52,6 +59,7 @@ module Inch
|
|
52
59
|
files.size > 0 ? files[0][0] : nil
|
53
60
|
end
|
54
61
|
|
62
|
+
# @return [Symbol]
|
55
63
|
def grade
|
56
64
|
@grade ||= Evaluation.new_score_ranges.detect { |range|
|
57
65
|
range.range.include?(score)
|
@@ -133,8 +141,15 @@ module Inch
|
|
133
141
|
visibility == :private
|
134
142
|
end
|
135
143
|
|
144
|
+
# @return [Boolean]
|
145
|
+
# +true+ if the object or its parent is tagged as @private
|
136
146
|
def private_tag?
|
137
|
-
|
147
|
+
!object.tag(:private).nil? || (parent && parent.private_tag?)
|
148
|
+
end
|
149
|
+
|
150
|
+
def private_api_tag?
|
151
|
+
tag = object.tag(:api)
|
152
|
+
tag.text == 'private'
|
138
153
|
end
|
139
154
|
|
140
155
|
def protected?
|
data/lib/inch/config.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
module Inch
|
2
|
+
module Evaluation
|
3
|
+
|
4
|
+
ConstantObject.criteria do
|
5
|
+
docstring 1.0
|
6
|
+
|
7
|
+
# optional:
|
8
|
+
unconsidered_tag 0.2
|
9
|
+
end
|
10
|
+
|
11
|
+
ClassObject.criteria do
|
12
|
+
docstring 1.0
|
13
|
+
|
14
|
+
# optional:
|
15
|
+
code_example_single 0.1
|
16
|
+
code_example_multi 0.2
|
17
|
+
unconsidered_tag 0.2
|
18
|
+
end
|
19
|
+
|
20
|
+
ModuleObject.criteria do
|
21
|
+
docstring 1.0
|
22
|
+
|
23
|
+
# optional:
|
24
|
+
code_example_single 0.1
|
25
|
+
code_example_multi 0.2
|
26
|
+
unconsidered_tag 0.2
|
27
|
+
end
|
28
|
+
|
29
|
+
MethodObject.criteria do
|
30
|
+
docstring 0.5
|
31
|
+
parameters 0.4
|
32
|
+
return_type 0.1
|
33
|
+
return_description 0.3
|
34
|
+
|
35
|
+
if object.constructor? || object.questioning_name?
|
36
|
+
parameters parameters + return_type
|
37
|
+
return_type 0.0
|
38
|
+
end
|
39
|
+
|
40
|
+
unless object.has_parameters?
|
41
|
+
return_description docstring + parameters
|
42
|
+
docstring docstring + parameters
|
43
|
+
parameters 0.0
|
44
|
+
end
|
45
|
+
|
46
|
+
# optional:
|
47
|
+
code_example_single 0.1
|
48
|
+
code_example_multi 0.25
|
49
|
+
unconsidered_tag 0.2
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
data/lib/inch/evaluation.rb
CHANGED
data/lib/inch/evaluation/base.rb
CHANGED
@@ -9,29 +9,36 @@ module Inch
|
|
9
9
|
|
10
10
|
TAGGED_SCORE = 20 # assigned per unconsidered tag
|
11
11
|
|
12
|
-
|
12
|
+
# @return [CodeObject::Proxy::Base]
|
13
13
|
attr_accessor :object
|
14
|
+
|
14
15
|
attr_reader :min_score, :max_score
|
15
16
|
|
17
|
+
# @param object [CodeObject::Proxy::Base]
|
16
18
|
def initialize(object)
|
17
19
|
self.object = object
|
18
20
|
@roles = []
|
19
21
|
evaluate
|
20
22
|
end
|
21
23
|
|
24
|
+
# Evaluates the objects and assigns roles
|
25
|
+
# @abstract
|
22
26
|
def evaluate
|
23
27
|
end
|
24
28
|
|
29
|
+
# @return [Float]
|
25
30
|
def max_score
|
26
31
|
arr = @roles.map(&:max_score).compact
|
27
32
|
[MAX_SCORE].concat(arr).min
|
28
33
|
end
|
29
34
|
|
35
|
+
# @return [Float]
|
30
36
|
def min_score
|
31
37
|
arr = @roles.map(&:min_score).compact
|
32
38
|
[MIN_SCORE].concat(arr).max
|
33
39
|
end
|
34
40
|
|
41
|
+
# @return [Float]
|
35
42
|
def score
|
36
43
|
value = @roles.inject(0) { |sum,r| sum + r.score.to_f }
|
37
44
|
if value < min_score
|
@@ -43,19 +50,56 @@ module Inch
|
|
43
50
|
end
|
44
51
|
end
|
45
52
|
|
53
|
+
# @return [Fixnum]
|
46
54
|
def priority
|
47
55
|
@roles.inject(0) { |sum,r| sum + r.priority.to_i }
|
48
56
|
end
|
49
57
|
|
58
|
+
# @return [Array<Evaluation::Role::Base>]
|
50
59
|
def roles
|
51
60
|
@roles
|
52
61
|
end
|
53
62
|
|
63
|
+
class << self
|
64
|
+
attr_reader :criteria_map
|
65
|
+
|
66
|
+
# Defines the weights during evaluation for different criteria
|
67
|
+
#
|
68
|
+
# MethodObject.criteria do
|
69
|
+
# docstring 0.5
|
70
|
+
# parameters 0.4
|
71
|
+
# return_type 0.1
|
72
|
+
#
|
73
|
+
# if object.constructor?
|
74
|
+
# parameters 0.5
|
75
|
+
# return_type 0.0
|
76
|
+
# end
|
77
|
+
# end
|
78
|
+
#
|
79
|
+
# @return [void]
|
80
|
+
def criteria(&block)
|
81
|
+
@criteria_map ||= {}
|
82
|
+
@criteria_map[to_s] ||= Criteria.new(&block)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
54
86
|
protected
|
55
87
|
|
56
88
|
def add_role(role)
|
57
89
|
@roles << role
|
58
90
|
end
|
91
|
+
|
92
|
+
def criteria
|
93
|
+
@criteria ||= begin
|
94
|
+
c = self.class.criteria_map[self.class.to_s]
|
95
|
+
c.evaluate(object)
|
96
|
+
c
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def score_for(criteria_name)
|
101
|
+
criteria.send(criteria_name) * MAX_SCORE
|
102
|
+
end
|
59
103
|
end
|
60
104
|
end
|
61
105
|
end
|
@@ -1,20 +1,25 @@
|
|
1
1
|
module Inch
|
2
2
|
module Evaluation
|
3
3
|
class ConstantObject < Base
|
4
|
-
DOC_SCORE = MAX_SCORE
|
5
|
-
|
6
4
|
def evaluate
|
7
5
|
if object.has_doc?
|
8
|
-
add_role Role::Constant::WithDoc.new(object,
|
6
|
+
add_role Role::Constant::WithDoc.new(object, score_for(:docstring))
|
9
7
|
else
|
10
|
-
add_role Role::Constant::WithoutDoc.new(object,
|
8
|
+
add_role Role::Constant::WithoutDoc.new(object, score_for(:docstring))
|
11
9
|
end
|
12
10
|
if object.nodoc?
|
13
11
|
add_role Role::Constant::TaggedAsNodoc.new(object)
|
14
12
|
end
|
13
|
+
if object.api_tag?
|
14
|
+
if object.private_api_tag?
|
15
|
+
add_role Role::Object::TaggedAsPrivateAPI.new(object)
|
16
|
+
else
|
17
|
+
add_role Role::Object::TaggedAsAPI.new(object)
|
18
|
+
end
|
19
|
+
end
|
15
20
|
if object.has_unconsidered_tags?
|
16
21
|
count = object.unconsidered_tags.size
|
17
|
-
add_role Role::Object::Tagged.new(object,
|
22
|
+
add_role Role::Object::Tagged.new(object, score_for(:unconsidered_tag) * count)
|
18
23
|
end
|
19
24
|
if object.in_root?
|
20
25
|
add_role Role::Constant::InRoot.new(object)
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Inch
|
2
|
+
module Evaluation
|
3
|
+
class Criteria
|
4
|
+
attr_reader :object
|
5
|
+
|
6
|
+
def initialize(&block)
|
7
|
+
@block = block
|
8
|
+
end
|
9
|
+
|
10
|
+
def evaluate(object)
|
11
|
+
@object = object
|
12
|
+
instance_eval(&@block)
|
13
|
+
end
|
14
|
+
|
15
|
+
NAMES = %w(
|
16
|
+
docstring
|
17
|
+
parameters
|
18
|
+
return_type
|
19
|
+
return_description
|
20
|
+
code_example_single
|
21
|
+
code_example_multi
|
22
|
+
unconsidered_tag
|
23
|
+
)
|
24
|
+
|
25
|
+
NAMES.each do |name|
|
26
|
+
class_eval """
|
27
|
+
def #{name}(value = nil)
|
28
|
+
if value.nil?
|
29
|
+
@#{name}.to_f
|
30
|
+
else
|
31
|
+
@#{name} = value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
"""
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|