inch 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -6
  3. data/TODOS.md +7 -0
  4. data/lib/inch/cli/arguments.rb +36 -2
  5. data/lib/inch/cli/command/base.rb +56 -8
  6. data/lib/inch/cli/command/base_list.rb +17 -3
  7. data/lib/inch/cli/command/base_object.rb +17 -4
  8. data/lib/inch/cli/command/options/base.rb +55 -10
  9. data/lib/inch/cli/command/options/base_list.rb +25 -5
  10. data/lib/inch/cli/command/options/base_object.rb +0 -2
  11. data/lib/inch/cli/command/options/list.rb +2 -2
  12. data/lib/inch/cli/command/options/show.rb +2 -2
  13. data/lib/inch/cli/command/options/suggest.rb +2 -2
  14. data/lib/inch/cli/command/output/base.rb +9 -0
  15. data/lib/inch/cli/command/output/console.rb +4 -0
  16. data/lib/inch/cli/command/output/inspect.rb +2 -2
  17. data/lib/inch/cli/command/output/list.rb +1 -1
  18. data/lib/inch/cli/command_parser.rb +30 -9
  19. data/lib/inch/code_object/nodoc_helper.rb +23 -2
  20. data/lib/inch/code_object/proxy.rb +16 -2
  21. data/lib/inch/code_object/proxy/base.rb +2 -23
  22. data/lib/inch/code_object/proxy/method_object.rb +1 -0
  23. data/lib/inch/code_object/proxy/method_parameter_object.rb +4 -1
  24. data/lib/inch/evaluation.rb +0 -2
  25. data/lib/inch/evaluation/base.rb +1 -0
  26. data/lib/inch/evaluation/constant_object.rb +0 -3
  27. data/lib/inch/evaluation/file.rb +0 -4
  28. data/lib/inch/evaluation/namespace_object.rb +1 -7
  29. data/lib/inch/evaluation/role/base.rb +29 -5
  30. data/lib/inch/evaluation/role/constant.rb +0 -5
  31. data/lib/inch/evaluation/role/object.rb +1 -5
  32. data/lib/inch/evaluation/score_range.rb +12 -0
  33. data/lib/inch/rake/suggest.rb +3 -0
  34. data/lib/inch/source_parser.rb +27 -1
  35. data/lib/inch/version.rb +1 -1
  36. data/test/fixtures/simple/lib/foo.rb +6 -0
  37. data/test/fixtures/simple/lib/role_namespaces.rb +15 -3
  38. data/test/inch/cli/command/base_test.rb +15 -0
  39. data/test/inch/cli/command/inspect_test.rb +9 -0
  40. data/test/inch/cli/command/list_test.rb +3 -0
  41. data/test/inch/cli/command/options/base_list_test.rb +50 -0
  42. data/test/inch/cli/command/options/base_object_test.rb +14 -0
  43. data/test/inch/cli/command/options/base_test.rb +8 -0
  44. data/test/inch/cli/command/suggest_test.rb +11 -0
  45. data/test/inch/cli/trace_helper_test.rb +47 -0
  46. data/test/inch/code_object/proxy_test.rb +10 -0
  47. data/test/integration/visibility_options_test.rb +24 -17
  48. data/test/test_helper.rb +80 -0
  49. metadata +13 -3
@@ -1,6 +1,9 @@
1
1
  module Inch
2
2
  module Evaluation
3
+ # Role objects are assigned to evaluations of code objects. They describe
4
+ # the object they are attached to.
3
5
  module Role
6
+ # @abstract
4
7
  class Base
5
8
  attr_reader :object
6
9
 
@@ -9,33 +12,54 @@ module Inch
9
12
  @value = value
10
13
  end
11
14
 
12
- # Override this method to that a max_score for the evaluation.
15
+ # Returns a maximal score for the object.
16
+ # The final score can not be higher than this.
17
+ # @note Override this method to that a max_score for the evaluation.
18
+ # @return [Float]
13
19
  def max_score
14
20
  end
15
21
 
16
- # Override this method to that a min_score for the evaluation.
22
+ # Returns a minimal score for the object.
23
+ # The final score can not be lower than this.
24
+ # @note Override this method to that a min_score for the evaluation.
25
+ # @return [Float]
17
26
  def min_score
18
27
  end
19
28
 
20
29
  # Returns a score that will be added to the associated object's
21
30
  # overall score.
22
31
  #
23
- # Override this method to that a score for the role.
32
+ # @note Override this method to assign a score for the role
33
+ # @return [Float]
24
34
  def score
25
35
  @value.to_f
26
36
  end
27
37
 
38
+ # Returns a potential score that would be added to the overall score
39
+ # if the object had implemented the Role's subject.
40
+ #
41
+ # @see Role::Missing
42
+ # @note Override this method to assign a potential score for the role
28
43
  # @return [Float]
29
- # a score that can be achieved by adding the missing thing mentioned
30
- # by the role
31
44
  def potential_score
32
45
  nil
33
46
  end
34
47
 
48
+ # Returns a priority that will be added to the associated object's
49
+ # overall priority.
50
+ #
51
+ # @note Override this method to assign a priority for the role
52
+ # @return [Fixnum]
35
53
  def priority
36
54
  0
37
55
  end
38
56
 
57
+ # Returns a suggestion to achieve the potential score that would be
58
+ # added to the overall score if the object had implemented the Role's
59
+ # subject.
60
+ #
61
+ # @see Role::Missing
62
+ # @return [Float]
39
63
  def suggestion
40
64
  nil
41
65
  end
@@ -17,11 +17,6 @@ module Inch
17
17
  -1
18
18
  end
19
19
  end
20
- class Protected < Object::Protected
21
- def priority
22
- -2
23
- end
24
- end
25
20
  class Private < Object::Private
26
21
  def priority
27
22
  -3
@@ -31,11 +31,7 @@ module Inch
31
31
 
32
32
  class Public < Base
33
33
  def priority
34
- if object.type == :constant
35
- -1
36
- else
37
- +2
38
- end
34
+ +2
39
35
  end
40
36
  end
41
37
  class Protected < Base
@@ -1,9 +1,17 @@
1
1
  module Inch
2
2
  module Evaluation
3
+ # ScoreRange objects associate a range of scores with a grade,
4
+ # description, color etc.
5
+ #
6
+ # @see .new_score_ranges
3
7
  class ScoreRange < Struct.new(:range, :grade, :description, :color, :bg_color)
4
8
  # Returns code_objects that received a score with the defined +range+
5
9
  attr_reader :objects
6
10
 
11
+ # Assigns code_objects that received a score with the defined +range+
12
+ #
13
+ # @param arr [Array<CodeObject::Proxy::Base>]
14
+ # @return [Array<CodeObject::Proxy::Base>]
7
15
  def objects=(arr)
8
16
  arr.each { |o| o.grade = grade }
9
17
  @objects = arr
@@ -17,6 +25,10 @@ module Inch
17
25
  [0..0, :U, "Undocumented", :color141, :color105],
18
26
  ]
19
27
 
28
+ # Returns newly instanciated score range objects based on
29
+ # {SCORE_RANGE_ARGS}
30
+ #
31
+ # @return [Array<ScoreRange>]
20
32
  def self.new_score_ranges
21
33
  SCORE_RANGE_ARGS.map do |args|
22
34
  ScoreRange.new(*args)
@@ -9,6 +9,9 @@ module Inch
9
9
  attr_accessor :name
10
10
  attr_accessor :args
11
11
 
12
+ # @param name [String] name of the Rake task
13
+ # @param *args [Array] arguments to be passed to Suggest.run
14
+ # @param &block [Proc] optional, evaluated inside the task definition
12
15
  def initialize(name = "inch", *args, &block)
13
16
  @name = name
14
17
  @args = args
@@ -1,23 +1,49 @@
1
1
  module Inch
2
- # Parses the source tree
2
+ # Parses the source tree (using YARD)
3
3
  class SourceParser
4
+ # Helper method to run an instance with the given +args+
5
+ #
6
+ # @see #run
7
+ # @return [SourceParser] the instance that ran
4
8
  def self.run(*args)
5
9
  parser = self.new
6
10
  parser.run(*args)
7
11
  parser
8
12
  end
9
13
 
14
+ # Returns all parsed objects as code object proxies
15
+ #
16
+ # @see CodeObject::Proxy.for
17
+ # @return [Array<CodeObject::Proxy::Base>]
10
18
  def all_objects
11
19
  @all_objects ||= all_parsed_objects.map do |o|
12
20
  CodeObject::Proxy.for(o)
13
21
  end.sort_by(&:path)
14
22
  end
15
23
 
24
+ # Returns the object with the given +path+
25
+ #
26
+ # @example
27
+ #
28
+ # SourceParser.find_objects("Foo#bar")
29
+ # # => returns code object proxy for Foo#bar
30
+ #
31
+ # @param path [String] partial path/name of an object
32
+ # @return [CodeObject::Proxy::Base]
16
33
  def find_object(path)
17
34
  all_objects.detect { |o| o.path == path }
18
35
  end
19
36
  alias :[] :find_object
20
37
 
38
+ # Returns all objects where the +path+ starts_with the given +path+
39
+ #
40
+ # @example
41
+ #
42
+ # SourceParser.find_objects("Foo#")
43
+ # # => returns code object proxies for all instance methods of Foo
44
+ #
45
+ # @param path [String] partial path/name of an object
46
+ # @return [Array<CodeObject::Proxy::Base>]
21
47
  def find_objects(path)
22
48
  all_objects.select { |o| o.path.start_with?(path) }
23
49
  end
@@ -1,3 +1,3 @@
1
1
  module Inch
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
@@ -27,6 +27,12 @@ module Foo
27
27
  # @param p2 [String, nil] optionally param
28
28
  # @return [void]
29
29
  def method_with_full_doc(p1, p2 = nil)
30
+ many_lines = true
31
+ if true
32
+ if many_lines
33
+ true
34
+ end
35
+ end
30
36
  end
31
37
 
32
38
  # @param p1 [String] mandatory param
@@ -3,6 +3,9 @@
3
3
  # @see PureNamespace
4
4
  PUBLIC_ROOT_CONSTANT = :foo
5
5
 
6
+ PRIVATE_ROOT_CONSTANT = :foo
7
+ private_constant :PRIVATE_ROOT_CONSTANT
8
+
6
9
  class String
7
10
  def foobar
8
11
  self + 'foobar!'
@@ -12,20 +15,29 @@ end
12
15
  module InchTest
13
16
  # You would want to use it like this:
14
17
  #
15
- # CodeExample.new
18
+ # CodeExample.new
16
19
  #
17
20
  class CodeExample
18
21
  end
19
22
 
20
23
  # You would want to use it like this:
21
24
  #
22
- # CodeExample.new
25
+ # MultipleCodeExamples.new
23
26
  #
24
- # CodeExample.new # => something
27
+ # MultipleCodeExamples.new # => something
25
28
  #
26
29
  class MultipleCodeExamples
27
30
  end
28
31
 
32
+ # You would want to use it like this:
33
+ #
34
+ # @example
35
+ # MultipleCodeExamples2.new
36
+ # MultipleCodeExamples2.new # => something
37
+ #
38
+ class MultipleCodeExamples2
39
+ end
40
+
29
41
  module PureNamespace
30
42
  end
31
43
 
@@ -0,0 +1,15 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../test_helper')
2
+
3
+ describe ::Inch::CLI::Command::Console do
4
+ before do
5
+ @command = ::Inch::CLI::Command::Base.new
6
+ end
7
+
8
+ it "should implement some defaults" do
9
+ assert @command.name
10
+ assert @command.usage
11
+ assert @command.description
12
+
13
+ assert_raises(NotImplementedError) { @command.run("something") }
14
+ end
15
+ end
@@ -33,6 +33,15 @@ describe ::Inch::CLI::Command::Inspect do
33
33
  assert err.empty?, "there should be no errors"
34
34
  end
35
35
 
36
+
37
+ it "should output some info when run with a definitive object name" do
38
+ out, err = capture_io do
39
+ @command.run("Foo::Qux")
40
+ end
41
+ refute out.empty?, "there should be some output"
42
+ assert err.empty?, "there should be no errors"
43
+ end
44
+
36
45
  it "should output all children info when run with a partial name" do
37
46
  out, err = capture_io do
38
47
  @command.run("Foo::Bar#", "--no-color")
@@ -6,6 +6,8 @@ describe ::Inch::CLI::Command::List do
6
6
  @command = ::Inch::CLI::Command::List
7
7
  end
8
8
 
9
+ include BaseListTests
10
+
9
11
  it "should run without args" do
10
12
  out, err = capture_io do
11
13
  @command.run()
@@ -59,3 +61,4 @@ describe ::Inch::CLI::Command::List do
59
61
  assert err.empty?, "there should be no errors"
60
62
  end
61
63
  end
64
+
@@ -0,0 +1,50 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../../test_helper')
2
+
3
+ describe ::Inch::CLI::Command::Options::BaseList do
4
+ it "should run parse without errors" do
5
+ @options = ::Inch::CLI::Command::Options::BaseList.new
6
+ @options.parse(["--no-color"])
7
+ assert_equal false, @options.show_all?
8
+ assert_equal [:public, :protected], @options.visibility
9
+ assert @options.namespaces.nil?
10
+ assert @options.undocumented.nil?
11
+ assert @options.depth.nil?
12
+ end
13
+
14
+ it "should run parse twice without affecting the second run" do
15
+ @options = ::Inch::CLI::Command::Options::BaseList.new
16
+ @options.parse(["--no-public", "--no-protected", "--private"])
17
+ assert_equal [:private], @options.visibility
18
+
19
+ @options = ::Inch::CLI::Command::Options::BaseList.new
20
+ @options.parse(["--no-color"])
21
+ assert_equal [:public, :protected], @options.visibility
22
+ end
23
+
24
+ it "should interpret --all options" do
25
+ @options = ::Inch::CLI::Command::Options::BaseList.new
26
+ @options.parse(["--all"])
27
+ assert_equal true, @options.show_all?
28
+ end
29
+
30
+ it "should interpret visibility options" do
31
+ @options = ::Inch::CLI::Command::Options::BaseList.new
32
+ @options.parse(["--no-public", "--no-protected", "--private"])
33
+ assert_equal [:private], @options.visibility
34
+ end
35
+
36
+ it "should interpret options" do
37
+ @options = ::Inch::CLI::Command::Options::BaseList.new
38
+ @options.parse(["--no-namespaces", "--no-undocumented", "--depth=2"])
39
+ assert_equal :none, @options.namespaces
40
+ assert_equal :none, @options.undocumented
41
+ assert_equal 2, @options.depth
42
+ end
43
+
44
+ it "should interpret other options" do
45
+ @options = ::Inch::CLI::Command::Options::BaseList.new
46
+ @options.parse(["--only-namespaces", "--only-undocumented"])
47
+ assert_equal :only, @options.namespaces
48
+ assert_equal :only, @options.undocumented
49
+ end
50
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../../test_helper')
2
+
3
+ describe ::Inch::CLI::Command::Options::BaseObject do
4
+ it "should run parse without errors" do
5
+ @options = ::Inch::CLI::Command::Options::BaseObject.new
6
+ @options.parse(["--no-color"])
7
+ end
8
+
9
+ it "should interpret options" do
10
+ @options = ::Inch::CLI::Command::Options::BaseObject.new
11
+ @options.parse(["Foo", "Foo::Bar", "--no-color"])
12
+ assert_equal ["Foo", "Foo::Bar"], @options.object_names
13
+ end
14
+ end
@@ -0,0 +1,8 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../../test_helper')
2
+
3
+ describe ::Inch::CLI::Command::Options::Base do
4
+ it "should run parse without errors" do
5
+ @options = ::Inch::CLI::Command::Options::Base.new
6
+ @options.parse(["--no-color"])
7
+ end
8
+ end
@@ -46,6 +46,17 @@ describe ::Inch::CLI::Command::Suggest do
46
46
  #assert err.empty?, "there should be no errors"
47
47
  end
48
48
 
49
+ it "should run with --objects switch" do
50
+ out, err = capture_io do
51
+ @command.run("lib/**/*.rb", "app/**/*.rb", "--objects=30")
52
+ end
53
+ refute out.empty?, "there should be some output"
54
+ assert err.empty?, "there should be no errors"
55
+ assert_match /\bFoo::Bar#method_with_wrong_doc\b/, out
56
+ assert_match /\bFoo::Bar#method_without_docstring\b/, out
57
+ assert_match /\bFoo::Bar#method_with_unstructured_doc\b/, out
58
+ end
59
+
49
60
  it "should give error when run with --unknown-switch" do
50
61
  out, err = capture_io do
51
62
  assert_raises(SystemExit) { @command.run("--unknown-switch") }
@@ -0,0 +1,47 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
2
+
3
+ class Tracer
4
+ include ::Inch::CLI::TraceHelper
5
+ end
6
+
7
+ describe ::Inch::CLI::TraceHelper do
8
+ before do
9
+ @instance = Tracer.new
10
+ end
11
+
12
+ it "should trace" do
13
+ out, err = capture_io do
14
+ @instance.trace("Test")
15
+ end
16
+ refute out.empty?, "there should be no output"
17
+ assert err.empty?, "there should be no errors"
18
+ end
19
+
20
+ it "should trace header" do
21
+ out, err = capture_io do
22
+ @instance.trace_header("Test", :red)
23
+ end
24
+ refute out.empty?, "there should be no output"
25
+ assert err.empty?, "there should be no errors"
26
+ end
27
+
28
+ it "should trace debug if ENV variable is set" do
29
+ ENV['DEBUG'] = "1"
30
+ out, err = capture_io do
31
+ @instance.debug("Test")
32
+ end
33
+ ENV['DEBUG'] = nil
34
+ refute out.empty?, "there should be no output"
35
+ assert err.empty?, "there should be no errors"
36
+ end
37
+
38
+ it "should not trace debug if ENV variable is set" do
39
+ refute ENV['DEBUG']
40
+ out, err = capture_io do
41
+ @instance.debug("Test")
42
+ end
43
+ assert out.empty?, "there should be no output"
44
+ assert err.empty?, "there should be no errors"
45
+ end
46
+
47
+ end
@@ -6,6 +6,16 @@ describe ::Inch::CodeObject::Proxy::Base do
6
6
  @source_parser = Inch::SourceParser.run(["lib/**/*.rb"])
7
7
  end
8
8
 
9
+ def test_inspect_gives_original_name
10
+ m = @source_parser.find_object("Foo::Bar#method_with_code_example")
11
+ assert_match /Foo::Bar#method_with_code_example/, m.inspect
12
+ end
13
+
14
+ def test_grade_is_not_nil
15
+ m = @source_parser.find_object("Foo::Bar#method_with_code_example")
16
+ assert m.grade
17
+ end
18
+
9
19
  def test_method_with_code_example
10
20
  m = @source_parser.find_object("Foo::Bar#method_with_code_example")
11
21
  assert m.has_code_example?