inch 0.2.3 → 0.3.0.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.
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