inch 0.2.3 → 0.3.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/.simplecov +7 -0
  3. data/TODOS.md +0 -5
  4. data/config/defaults.rb +26 -1
  5. data/inch.gemspec +1 -0
  6. data/lib/inch.rb +2 -1
  7. data/lib/inch/api.rb +34 -0
  8. data/lib/inch/api/filter.rb +17 -0
  9. data/lib/inch/api/get.rb +30 -0
  10. data/lib/inch/api/list.rb +10 -0
  11. data/lib/inch/api/options/base.rb +45 -0
  12. data/lib/inch/api/options/filter.rb +25 -0
  13. data/lib/inch/api/options/suggest.rb +36 -0
  14. data/lib/inch/api/stats.rb +7 -0
  15. data/lib/inch/api/suggest.rb +110 -0
  16. data/lib/inch/cli.rb +4 -1
  17. data/lib/inch/cli/command/base.rb +1 -17
  18. data/lib/inch/cli/command/base_list.rb +3 -63
  19. data/lib/inch/cli/command/base_object.rb +6 -28
  20. data/lib/inch/cli/command/list.rb +3 -2
  21. data/lib/inch/cli/command/options/base.rb +1 -1
  22. data/lib/inch/cli/command/options/base_list.rb +4 -2
  23. data/lib/inch/cli/command/options/suggest.rb +9 -8
  24. data/lib/inch/cli/command/output/base.rb +9 -11
  25. data/lib/inch/cli/command/output/list.rb +2 -2
  26. data/lib/inch/cli/command/output/show.rb +2 -10
  27. data/lib/inch/cli/command/output/stats.rb +4 -3
  28. data/lib/inch/cli/command/output/suggest.rb +5 -5
  29. data/lib/inch/cli/command/stats.rb +4 -3
  30. data/lib/inch/cli/command/suggest.rb +4 -94
  31. data/lib/inch/code_object.rb +2 -2
  32. data/lib/inch/code_object/converter.rb +89 -0
  33. data/lib/inch/code_object/provider.rb +36 -0
  34. data/lib/inch/code_object/provider/yard.rb +19 -0
  35. data/lib/inch/code_object/provider/yard/docstring.rb +106 -0
  36. data/lib/inch/code_object/provider/yard/nodoc_helper.rb +93 -0
  37. data/lib/inch/code_object/provider/yard/object.rb +55 -0
  38. data/lib/inch/code_object/provider/yard/object/base.rb +262 -0
  39. data/lib/inch/code_object/provider/yard/object/class_object.rb +12 -0
  40. data/lib/inch/code_object/provider/yard/object/constant_object.rb +12 -0
  41. data/lib/inch/code_object/provider/yard/object/method_object.rb +126 -0
  42. data/lib/inch/code_object/provider/yard/object/method_parameter_object.rb +88 -0
  43. data/lib/inch/code_object/provider/yard/object/module_object.rb +12 -0
  44. data/lib/inch/code_object/provider/yard/object/namespace_object.rb +47 -0
  45. data/lib/inch/code_object/provider/yard/parser.rb +54 -0
  46. data/lib/inch/code_object/proxy.rb +5 -3
  47. data/lib/inch/code_object/proxy/base.rb +103 -110
  48. data/lib/inch/code_object/proxy/class_object.rb +0 -1
  49. data/lib/inch/code_object/proxy/method_object.rb +20 -99
  50. data/lib/inch/code_object/proxy/method_parameter_object.rb +15 -39
  51. data/lib/inch/code_object/proxy/namespace_object.rb +7 -18
  52. data/lib/inch/codebase.rb +19 -0
  53. data/lib/inch/codebase/objects.rb +73 -0
  54. data/lib/inch/codebase/objects_filter.rb +61 -0
  55. data/lib/inch/codebase/proxy.rb +22 -0
  56. data/lib/inch/config.rb +8 -1
  57. data/lib/inch/evaluation.rb +5 -7
  58. data/lib/inch/evaluation/file.rb +1 -1
  59. data/lib/inch/evaluation/grade.rb +1 -1
  60. data/lib/inch/evaluation/object_schema.rb +3 -1
  61. data/lib/inch/evaluation/priority_range.rb +44 -0
  62. data/lib/inch/evaluation/proxy.rb +25 -0
  63. data/lib/inch/evaluation/proxy/base.rb +146 -0
  64. data/lib/inch/evaluation/proxy/class_object.rb +8 -0
  65. data/lib/inch/evaluation/proxy/constant_object.rb +19 -0
  66. data/lib/inch/evaluation/proxy/method_object.rb +65 -0
  67. data/lib/inch/evaluation/proxy/module_object.rb +8 -0
  68. data/lib/inch/evaluation/proxy/namespace_object.rb +27 -0
  69. data/lib/inch/evaluation/role/base.rb +19 -0
  70. data/lib/inch/evaluation/role/constant.rb +16 -0
  71. data/lib/inch/evaluation/role/method.rb +22 -0
  72. data/lib/inch/evaluation/role/method_parameter.rb +31 -1
  73. data/lib/inch/evaluation/role/namespace.rb +15 -0
  74. data/lib/inch/evaluation/role/object.rb +24 -0
  75. data/lib/inch/rake/suggest.rb +1 -0
  76. data/lib/inch/utils/read_write_methods.rb +44 -0
  77. data/lib/inch/{cli → utils}/weighted_list.rb +1 -1
  78. data/lib/inch/version.rb +1 -1
  79. data/test/fixtures/simple/lib/broken.rb +8 -0
  80. data/test/inch/api/filter_test.rb +51 -0
  81. data/test/inch/api/get_test.rb +22 -0
  82. data/test/inch/api/list_test.rb +15 -0
  83. data/test/inch/api/options/base_test.rb +30 -0
  84. data/test/inch/api/stats_test.rb +15 -0
  85. data/test/inch/api/suggest_test.rb +26 -0
  86. data/test/inch/cli/command/list_test.rb +2 -1
  87. data/test/inch/code_object/converter_test.rb +29 -0
  88. data/test/inch/code_object/{docstring_test.rb → provider/yard/docstring_test.rb} +13 -13
  89. data/test/inch/code_object/{nodoc_helper_test.rb → provider/yard/nodoc_helper_test.rb} +6 -6
  90. data/test/inch/code_object/provider/yard_test.rb +11 -0
  91. data/test/inch/code_object/provider_test.rb +9 -0
  92. data/test/inch/code_object/proxy/method_object_test.rb +22 -22
  93. data/test/inch/code_object/proxy_test.rb +10 -10
  94. data/test/inch/codebase/objects_test.rb +28 -0
  95. data/test/inch/codebase/proxy_test.rb +17 -0
  96. data/test/inch/evaluation/role/base_test.rb +71 -0
  97. data/test/inch/{cli → utils}/weighted_list_test.rb +2 -2
  98. data/test/shared/base_list.rb +73 -0
  99. data/test/test_helper.rb +0 -95
  100. metadata +89 -24
  101. data/lib/inch/code_object/docstring.rb +0 -102
  102. data/lib/inch/code_object/nodoc_helper.rb +0 -107
  103. data/lib/inch/evaluation/base.rb +0 -157
  104. data/lib/inch/evaluation/class_object.rb +0 -6
  105. data/lib/inch/evaluation/constant_object.rb +0 -33
  106. data/lib/inch/evaluation/method_object.rb +0 -105
  107. data/lib/inch/evaluation/module_object.rb +0 -6
  108. data/lib/inch/evaluation/namespace_object.rb +0 -52
  109. data/lib/inch/evaluation/read_write_methods.rb +0 -21
  110. data/lib/inch/source_parser.rb +0 -62
  111. data/test/inch/source_parser_test.rb +0 -23
@@ -7,6 +7,25 @@ module Inch
7
7
  class Base
8
8
  attr_reader :object
9
9
 
10
+ class << self
11
+ def applicable_if(symbol = nil, &block)
12
+ @applicable_procs ||= {}
13
+ @applicable_procs[to_s] = block || symbol.to_proc
14
+ end
15
+
16
+ def applicable_unless(symbol = nil, &block)
17
+ @applicable_procs ||= {}
18
+ @applicable_procs[to_s] = proc do |object|
19
+ !(block || symbol.to_proc).call(object)
20
+ end
21
+ end
22
+
23
+ def applicable?(object)
24
+ @applicable_procs ||= {}
25
+ @applicable_procs[to_s].call(object)
26
+ end
27
+ end
28
+
10
29
  def initialize(object, value = nil)
11
30
  @object = object
12
31
  @value = value
@@ -4,31 +4,47 @@ module Inch
4
4
  # Roles assigned to constants
5
5
  module Constant
6
6
  class WithDoc < Object::WithDoc
7
+ applicable_if :has_doc?
7
8
  end
8
9
  class WithoutDoc < Object::WithoutDoc
10
+ applicable_unless :has_doc?
9
11
  end
10
12
 
11
13
  class TaggedAsNodoc < Object::TaggedAsNodoc
14
+ applicable_if :nodoc?
12
15
  end
13
16
  class InRoot < Object::InRoot
17
+ applicable_if :in_root?
14
18
  end
15
19
 
16
20
  class Public < Object::Public
21
+ applicable_if :public?
22
+
17
23
  def priority
18
24
  -1
19
25
  end
20
26
  end
21
27
  class Private < Object::Private
28
+ applicable_if :private?
29
+
22
30
  def priority
23
31
  -3
24
32
  end
25
33
  end
26
34
 
27
35
  class WithCodeExample < Object::WithCodeExample
36
+ applicable_if do |o|
37
+ o.has_code_example? && !o.has_multiple_code_examples?
38
+ end
28
39
  end
40
+
29
41
  class WithMultipleCodeExamples < Object::WithMultipleCodeExamples
42
+ applicable_if :has_multiple_code_examples?
30
43
  end
44
+
31
45
  class WithoutCodeExample < Object::WithoutCodeExample
46
+ applicable_unless :has_code_example?
47
+
32
48
  def suggestion
33
49
  nil
34
50
  end
@@ -4,12 +4,15 @@ module Inch
4
4
  module Method
5
5
  # Role assigned to methods without parameters
6
6
  class WithoutParameters < Base
7
+ applicable_unless :has_parameters?
7
8
  end
8
9
 
9
10
  # Role assigned to methods with many parameters
10
11
  #
11
12
  # @see CodeObject::Proxy::MethodObject#has_many_parameters?
12
13
  class WithManyParameters < Base
14
+ applicable_if :has_many_parameters?
15
+
13
16
  def priority
14
17
  +2
15
18
  end
@@ -17,10 +20,13 @@ module Inch
17
20
 
18
21
  # Role assigned to methods where the return value is typed in the docs
19
22
  class WithReturnType < Base
23
+ applicable_if :return_typed?
20
24
  end
21
25
 
22
26
  # Role assigned to methods where the return value is not typed
23
27
  class WithoutReturnType < Missing
28
+ applicable_unless :return_typed?
29
+
24
30
  def suggestion
25
31
  "Describe what '#{object.name}' returns"
26
32
  end
@@ -28,10 +34,13 @@ module Inch
28
34
 
29
35
  # Role assigned to methods where the return value is decribed in the docs
30
36
  class WithReturnDescription < Base
37
+ applicable_if :return_described?
31
38
  end
32
39
 
33
40
  # Role assigned to methods where the return value is not decribed
34
41
  class WithoutReturnDescription < Missing
42
+ applicable_unless :return_described?
43
+
35
44
  def suggestion
36
45
  "Describe what '#{object.name}' returns"
37
46
  end
@@ -42,6 +51,8 @@ module Inch
42
51
  #
43
52
  # @see CodeObject::Proxy::MethodObject#has_many_lines?
44
53
  class WithManyLines < Base
54
+ applicable_if :has_many_lines?
55
+
45
56
  def priority
46
57
  +2
47
58
  end
@@ -49,6 +60,8 @@ module Inch
49
60
 
50
61
  # Role assigned to methods whose name end in a '!'
51
62
  class WithBangName < Base
63
+ applicable_if :bang_name?
64
+
52
65
  def priority
53
66
  +3
54
67
  end
@@ -56,6 +69,8 @@ module Inch
56
69
 
57
70
  # Role assigned to methods whose name end in a '?'
58
71
  class WithQuestioningName < Base
72
+ applicable_if :questioning_name?
73
+
59
74
  def priority
60
75
  -4
61
76
  end
@@ -63,6 +78,8 @@ module Inch
63
78
 
64
79
  # Role assigned to methods which are aliased
65
80
  class HasAlias < Base
81
+ applicable_if :has_alias?
82
+
66
83
  def priority
67
84
  +2
68
85
  end
@@ -70,18 +87,23 @@ module Inch
70
87
 
71
88
  # Role assigned to methods that are constructors
72
89
  class Constructor < Base
90
+ applicable_if :constructor?
73
91
  end
74
92
 
75
93
  # Role assigned to methods that are getters
76
94
  class Getter < Base
95
+ applicable_if :getter?
77
96
  end
78
97
 
79
98
  # Role assigned to methods that are setters
80
99
  class Setter < Base
100
+ applicable_if :setter?
81
101
  end
82
102
 
83
103
  # Role assigned to methods that are overriding another method
84
104
  class Overridden < Base
105
+ applicable_if :overridden?
106
+
85
107
  # It seems more important to document the overridden method,
86
108
  # than the overriding one
87
109
  def priority
@@ -2,35 +2,58 @@ module Inch
2
2
  module Evaluation
3
3
  module Role
4
4
  # Roles assigned to method parameters
5
+ #
6
+ # @note The +object+ is a MethodParameterObject here!
5
7
  module MethodParameter
6
8
  # Role assigned to parameters that are mentioned in the docs
9
+ #
10
+ # @see CodeObject::Proxy::MethodParameterObject#mentioned?
7
11
  class WithMention < Base
12
+ applicable_if :mentioned?
8
13
  end
9
14
 
10
15
  # Role assigned to parameters that are not mentioned in the docs
16
+ #
17
+ # @see CodeObject::Proxy::MethodParameterObject#mentioned?
11
18
  class WithoutMention < Missing
19
+ applicable_unless :mentioned?
20
+
12
21
  def suggestion
13
22
  "Describe the parameter '#{object.name}'"
14
23
  end
15
24
  end
16
25
 
17
26
  # Role assigned to parameters that are typed in the docs
27
+ #
28
+ # @see CodeObject::Proxy::MethodParameterObject#typed?
18
29
  class WithType < Base
30
+ applicable_if :typed?
19
31
  end
20
32
 
21
33
  # Role assigned to parameters that are not typed in the docs
34
+ #
35
+ # @see CodeObject::Proxy::MethodParameterObject#typed?
22
36
  class WithoutType < Missing
37
+ applicable_unless :typed?
23
38
  end
24
39
 
25
40
  # Role assigned to parameters that are spalts, e.g. +*args+
41
+ #
42
+ # @see CodeObject::Proxy::MethodParameterObject#splat?
26
43
  class Splat < Base
44
+ applicable_if :splat?
45
+
27
46
  def priority
28
47
  +1
29
48
  end
30
49
  end
31
50
 
32
51
  # Role assigned to parameters that are blocks, e.g. +&block+
52
+ #
53
+ # @see CodeObject::Proxy::MethodParameterObject#block?
33
54
  class Block < Base
55
+ applicable_if :block?
56
+
34
57
  def priority
35
58
  +1
36
59
  end
@@ -38,10 +61,15 @@ module Inch
38
61
 
39
62
  # Role assigned to parameters that are documented, but not part of
40
63
  # the method signature
41
- class WithWrongMention < Missing
64
+ #
65
+ # @see CodeObject::Proxy::MethodParameterObject#wrongly_mentioned?
66
+ class WithWrongMention < Base
67
+ applicable_if :wrongly_mentioned?
68
+
42
69
  def suggestion
43
70
  "The parameter '#{object.name}' seems not to be part of the signature."
44
71
  end
72
+
45
73
  def priority
46
74
  +1
47
75
  end
@@ -51,6 +79,8 @@ module Inch
51
79
  #
52
80
  # @see CodeObject::Proxy::MethodParameterObject#bad_name?
53
81
  class WithBadName < Base
82
+ applicable_if :bad_name?
83
+
54
84
  def priority
55
85
  +1
56
86
  end
@@ -4,7 +4,11 @@ module Inch
4
4
  # Roles assigned to namespaces (classes and modules)
5
5
  module Namespace
6
6
  # Role assigned to namespaces with children
7
+ #
8
+ # @see CodeObject::Proxy::NamespaceObject#has_children?
7
9
  class WithChildren < Base
10
+ applicable_if :has_children?
11
+
8
12
  # This role doesnot assign a score.
9
13
  def score
10
14
  0
@@ -20,6 +24,8 @@ module Inch
20
24
  #
21
25
  # @see CodeObject::Proxy::NamespaceObject#has_many_children?
22
26
  class WithManyChildren < Base
27
+ applicable_if :has_many_children?
28
+
23
29
  # +priority
24
30
  def priority
25
31
  +1
@@ -30,6 +36,8 @@ module Inch
30
36
  #
31
37
  # @see CodeObject::Proxy::NamespaceObject#has_many_attributes?
32
38
  class WithManyAttributes < Base
39
+ applicable_if :has_many_attributes?
40
+
33
41
  # +priority
34
42
  def priority
35
43
  +1
@@ -38,10 +46,13 @@ module Inch
38
46
 
39
47
  # Role assigned to namespaces without any children
40
48
  class WithoutChildren < Base
49
+ applicable_unless :has_children?
41
50
  end
42
51
 
43
52
  # Role assigned to namespaces without any methods
44
53
  class WithoutMethods < Base
54
+ applicable_unless :has_methods?
55
+
45
56
  def priority
46
57
  -2
47
58
  end
@@ -49,6 +60,8 @@ module Inch
49
60
 
50
61
  # A 'pure' namespace has only namespaces as children
51
62
  class Pure < Base
63
+ applicable_if :pure_namespace?
64
+
52
65
  def priority
53
66
  -2
54
67
  end
@@ -60,6 +73,8 @@ module Inch
60
73
  # (the reasoning here is: just because we patch Hash does not mean
61
74
  # we need to document the Hash class itself)
62
75
  class Core < Base
76
+ applicable_if :core?
77
+
63
78
  def priority
64
79
  -7
65
80
  end
@@ -5,10 +5,13 @@ module Inch
5
5
  module Object
6
6
  # Role assigned to objects with a describing comment (docstring)
7
7
  class WithDoc < Base
8
+ applicable_if :has_doc?
8
9
  end
9
10
 
10
11
  # Role assigned to objects without a docstring
11
12
  class WithoutDoc < Missing
13
+ applicable_unless :has_doc?
14
+
12
15
  def suggestion
13
16
  "Add a comment describing the #{object_type}"
14
17
  end
@@ -18,6 +21,8 @@ module Inch
18
21
  # considered by Inch. Since these tags are parsed from the docstring
19
22
  # the object seems undocumented to Inch.
20
23
  class Tagged < Base
24
+ applicable_if :has_unconsidered_tags?
25
+
21
26
  def priority
22
27
  -1
23
28
  end
@@ -28,6 +33,8 @@ module Inch
28
33
  #
29
34
  # @see CodeObject::NodocHelper
30
35
  class TaggedAsNodoc < Base
36
+ applicable_if :nodoc?
37
+
31
38
  def priority
32
39
  -7
33
40
  end
@@ -37,11 +44,14 @@ module Inch
37
44
  # of an API. If the API is 'private' TaggedAsPrivateAPI is assigned
38
45
  # instead.
39
46
  class TaggedAsAPI < Base
47
+ applicable_if :api_tag?
40
48
  end
41
49
 
42
50
  # Role assigned to objects explicitly or implicitly tagged to be part
43
51
  # of a private API.
44
52
  class TaggedAsPrivateAPI < Base
53
+ applicable_if :private_api_tag?
54
+
45
55
  def priority
46
56
  -5
47
57
  end
@@ -49,6 +59,8 @@ module Inch
49
59
 
50
60
  # Role assigned to objects declared in the top-level namespace
51
61
  class InRoot < Base
62
+ applicable_if :in_root?
63
+
52
64
  def priority
53
65
  +3
54
66
  end
@@ -56,6 +68,8 @@ module Inch
56
68
 
57
69
  # Role assigned to public objects
58
70
  class Public < Base
71
+ applicable_if :public?
72
+
59
73
  def priority
60
74
  +2
61
75
  end
@@ -63,6 +77,8 @@ module Inch
63
77
 
64
78
  # Role assigned to protected objects
65
79
  class Protected < Base
80
+ applicable_if :protected?
81
+
66
82
  def priority
67
83
  +1
68
84
  end
@@ -70,6 +86,8 @@ module Inch
70
86
 
71
87
  # Role assigned to private objects
72
88
  class Private < Base
89
+ applicable_if :private?
90
+
73
91
  def priority
74
92
  -2
75
93
  end
@@ -77,14 +95,20 @@ module Inch
77
95
 
78
96
  # Role assigned to objects with a single code example
79
97
  class WithCodeExample < Base
98
+ applicable_if do |o|
99
+ o.has_code_example? && !o.has_multiple_code_examples?
100
+ end
80
101
  end
81
102
 
82
103
  # Role assigned to objects with multiple code examples
83
104
  class WithMultipleCodeExamples < Base
105
+ applicable_if :has_multiple_code_examples?
84
106
  end
85
107
 
86
108
  # Role assigned to objects without a code example
87
109
  class WithoutCodeExample < Missing
110
+ applicable_unless :has_code_example?
111
+
88
112
  def suggestion
89
113
  "Add a code example (optional)"
90
114
  end
@@ -4,6 +4,7 @@ require 'rake'
4
4
  require 'rake/tasklib'
5
5
 
6
6
  module Inch
7
+ # Holds all Rake tasks
7
8
  module Rake
8
9
  class Suggest < ::Rake::TaskLib
9
10
  attr_accessor :name
@@ -0,0 +1,44 @@
1
+ module Inch
2
+ module Utils
3
+ # Extend a class with ReadWriteMethods and you will gain the +rw_methods+
4
+ # macro.
5
+ #
6
+ # class User
7
+ # extend ReadWriteMethods
8
+ # rw_methods :name, :admin
9
+ # end
10
+ #
11
+ # This implements read methods that act as writer methods when called
12
+ # with a value parameter:
13
+ #
14
+ # user = User.new
15
+ # user.name # => nil
16
+ # user.name "Adam"
17
+ # user.name # => "Adam"
18
+ #
19
+ module ReadWriteMethods
20
+ # Implements a read method that acts as writer if called with a value
21
+ #
22
+ # @return [void]
23
+ def rw_method(name)
24
+ class_eval """
25
+ def #{name}(value = nil)
26
+ if value.nil?
27
+ @#{name}
28
+ else
29
+ @#{name} = value
30
+ end
31
+ end
32
+ """
33
+ end
34
+
35
+ # Implements multiple read(write) methods with the given +names+
36
+ #
37
+ # @param names [Array<String,Symbol>]
38
+ # @return [void]
39
+ def rw_methods(*names)
40
+ [names].flatten.each { |name| rw_method(name) }
41
+ end
42
+ end
43
+ end
44
+ end