inch 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/README.md +335 -3
- data/Rakefile +8 -0
- data/TODOS.md +12 -0
- data/bin/inch +17 -0
- data/inch.gemspec +7 -2
- data/lib/inch.rb +6 -1
- data/lib/inch/cli.rb +24 -0
- data/lib/inch/cli/arguments.rb +45 -0
- data/lib/inch/cli/command.rb +29 -0
- data/lib/inch/cli/command/base.rb +62 -0
- data/lib/inch/cli/command/base_list.rb +75 -0
- data/lib/inch/cli/command/base_object.rb +40 -0
- data/lib/inch/cli/command/console.rb +22 -0
- data/lib/inch/cli/command/inspect.rb +20 -0
- data/lib/inch/cli/command/list.rb +25 -0
- data/lib/inch/cli/command/options/base.rb +137 -0
- data/lib/inch/cli/command/options/base_list.rb +84 -0
- data/lib/inch/cli/command/options/base_object.rb +47 -0
- data/lib/inch/cli/command/options/console.rb +26 -0
- data/lib/inch/cli/command/options/inspect.rb +25 -0
- data/lib/inch/cli/command/options/list.rb +30 -0
- data/lib/inch/cli/command/options/show.rb +27 -0
- data/lib/inch/cli/command/options/stats.rb +20 -0
- data/lib/inch/cli/command/options/suggest.rb +61 -0
- data/lib/inch/cli/command/output/base.rb +32 -0
- data/lib/inch/cli/command/output/console.rb +45 -0
- data/lib/inch/cli/command/output/inspect.rb +129 -0
- data/lib/inch/cli/command/output/list.rb +87 -0
- data/lib/inch/cli/command/output/show.rb +79 -0
- data/lib/inch/cli/command/output/stats.rb +111 -0
- data/lib/inch/cli/command/output/suggest.rb +104 -0
- data/lib/inch/cli/command/show.rb +20 -0
- data/lib/inch/cli/command/stats.rb +20 -0
- data/lib/inch/cli/command/suggest.rb +104 -0
- data/lib/inch/cli/command_parser.rb +82 -0
- data/lib/inch/cli/sparkline_helper.rb +31 -0
- data/lib/inch/cli/trace_helper.rb +42 -0
- data/lib/inch/cli/yardopts_helper.rb +49 -0
- data/lib/inch/code_object.rb +8 -0
- data/lib/inch/code_object/docstring.rb +97 -0
- data/lib/inch/code_object/nodoc_helper.rb +84 -0
- data/lib/inch/code_object/proxy.rb +37 -0
- data/lib/inch/code_object/proxy/base.rb +194 -0
- data/lib/inch/code_object/proxy/class_object.rb +9 -0
- data/lib/inch/code_object/proxy/constant_object.rb +8 -0
- data/lib/inch/code_object/proxy/method_object.rb +118 -0
- data/lib/inch/code_object/proxy/method_parameter_object.rb +81 -0
- data/lib/inch/code_object/proxy/module_object.rb +8 -0
- data/lib/inch/code_object/proxy/namespace_object.rb +38 -0
- data/lib/inch/core_ext.rb +2 -0
- data/lib/inch/core_ext/string.rb +3 -0
- data/lib/inch/core_ext/yard.rb +4 -0
- data/lib/inch/evaluation.rb +35 -0
- data/lib/inch/evaluation/base.rb +60 -0
- data/lib/inch/evaluation/class_object.rb +6 -0
- data/lib/inch/evaluation/constant_object.rb +34 -0
- data/lib/inch/evaluation/file.rb +66 -0
- data/lib/inch/evaluation/method_object.rb +127 -0
- data/lib/inch/evaluation/module_object.rb +6 -0
- data/lib/inch/evaluation/namespace_object.rb +94 -0
- data/lib/inch/evaluation/role/base.rb +49 -0
- data/lib/inch/evaluation/role/constant.rb +43 -0
- data/lib/inch/evaluation/role/method.rb +60 -0
- data/lib/inch/evaluation/role/method_parameter.rb +46 -0
- data/lib/inch/evaluation/role/missing.rb +20 -0
- data/lib/inch/evaluation/role/namespace.rb +58 -0
- data/lib/inch/evaluation/role/object.rb +64 -0
- data/lib/inch/evaluation/score_range.rb +26 -0
- data/lib/inch/rake.rb +1 -0
- data/lib/inch/rake/suggest.rb +26 -0
- data/lib/inch/source_parser.rb +36 -0
- data/lib/inch/version.rb +1 -1
- data/test/fixtures/code_examples/lib/foo.rb +87 -0
- data/test/fixtures/readme/lib/foo.rb +17 -0
- data/test/fixtures/simple/README +25 -0
- data/test/fixtures/simple/lib/broken.rb +10 -0
- data/test/fixtures/simple/lib/foo.rb +214 -0
- data/test/fixtures/simple/lib/role_methods.rb +78 -0
- data/test/fixtures/simple/lib/role_namespaces.rb +68 -0
- data/test/fixtures/visibility/lib/foo.rb +18 -0
- data/test/fixtures/yardopts/.yardopts +1 -0
- data/test/fixtures/yardopts/foo/bar.rb +6 -0
- data/test/inch/cli/arguments_test.rb +70 -0
- data/test/inch/cli/command/console_test.rb +59 -0
- data/test/inch/cli/command/inspect_test.rb +59 -0
- data/test/inch/cli/command/list_test.rb +61 -0
- data/test/inch/cli/command/show_test.rb +59 -0
- data/test/inch/cli/command/stats_test.rb +57 -0
- data/test/inch/cli/command/suggest_test.rb +57 -0
- data/test/inch/cli/command_parser_test.rb +33 -0
- data/test/inch/cli/yardopts_helper_test.rb +84 -0
- data/test/inch/code_object/docstring_test.rb +204 -0
- data/test/inch/code_object/nodoc_helper_test.rb +38 -0
- data/test/inch/code_object/proxy_test.rb +188 -0
- data/test/inch/source_parser_test.rb +23 -0
- data/test/integration/stats_options_test.rb +34 -0
- data/test/integration/visibility_options_test.rb +79 -0
- data/test/test_helper.rb +21 -0
- metadata +184 -7
@@ -0,0 +1,87 @@
|
|
1
|
+
module Inch
|
2
|
+
module CLI
|
3
|
+
module Command
|
4
|
+
module Output
|
5
|
+
class List < Base
|
6
|
+
attr_reader :objects
|
7
|
+
|
8
|
+
PER_RANGE = 10
|
9
|
+
|
10
|
+
def initialize(options, objects, ranges)
|
11
|
+
@options = options
|
12
|
+
@objects = objects
|
13
|
+
@ranges = ranges
|
14
|
+
@omitted = 0
|
15
|
+
|
16
|
+
display_list
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def display_list
|
22
|
+
@ranges.each do |range|
|
23
|
+
if range.objects.empty?
|
24
|
+
# pass
|
25
|
+
else
|
26
|
+
trace
|
27
|
+
trace_header(range.description, range.color, range.bg_color)
|
28
|
+
display_range(range)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
if @omitted > 0
|
33
|
+
trace
|
34
|
+
trace "This output omitted #{@omitted} objects. ".dark +
|
35
|
+
"Use `--all` to display all objects.".dark
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def display_range(range)
|
40
|
+
display_count = @options.full ? range.objects.size : PER_RANGE
|
41
|
+
list = range.objects[0...display_count]
|
42
|
+
list.each do |o|
|
43
|
+
echo range.color, result(o, range.color)
|
44
|
+
end
|
45
|
+
|
46
|
+
display_omitted_hint(range, display_count)
|
47
|
+
end
|
48
|
+
|
49
|
+
def display_omitted_hint(range, display_count)
|
50
|
+
omitted = range.objects.size - display_count
|
51
|
+
if omitted > 0
|
52
|
+
@omitted += omitted
|
53
|
+
echo range.color, "... (omitting #{omitted} objects)".dark
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def echo(color, msg)
|
58
|
+
trace edged(color, msg)
|
59
|
+
end
|
60
|
+
|
61
|
+
def result(object, color)
|
62
|
+
if @options.numbers
|
63
|
+
result_numbers(object, color)
|
64
|
+
else
|
65
|
+
result_grades(object, color)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def result_grades(object, color)
|
70
|
+
grade = object.grade.to_s
|
71
|
+
grade = grade.ljust(2).color(color)
|
72
|
+
priority = object.priority
|
73
|
+
" #{grade} #{priority_arrow(priority, color)} #{object.path}"
|
74
|
+
end
|
75
|
+
|
76
|
+
def result_numbers(object, color)
|
77
|
+
score = object.score.to_i.to_s
|
78
|
+
score = score.rjust(3).color(color)
|
79
|
+
priority = object.priority
|
80
|
+
"#{score} #{priority} #{object.path}"
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Inch
|
2
|
+
module CLI
|
3
|
+
module Command
|
4
|
+
module Output
|
5
|
+
class Show < Base
|
6
|
+
attr_reader :objects
|
7
|
+
|
8
|
+
COLOR = :color132
|
9
|
+
BG_COLOR = :color138
|
10
|
+
LJUST = 20
|
11
|
+
|
12
|
+
def initialize(options, objects)
|
13
|
+
@options = options
|
14
|
+
@objects = objects
|
15
|
+
|
16
|
+
display_objects
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def display_objects
|
22
|
+
objects.each do |o|
|
23
|
+
print_object(o)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def print_object(o)
|
28
|
+
trace
|
29
|
+
trace_header(o.path, COLOR, BG_COLOR)
|
30
|
+
|
31
|
+
print_file_info(o)
|
32
|
+
print_grade_info(o)
|
33
|
+
print_roles_info(o)
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
def print_file_info(o)
|
38
|
+
o.files.each do |f|
|
39
|
+
echo "-> #{f[0]}:#{f[1]}".color(COLOR)
|
40
|
+
end
|
41
|
+
echo separator
|
42
|
+
end
|
43
|
+
|
44
|
+
def print_grade_info(o)
|
45
|
+
echo "Grade: #{grade(o.score)}".rjust(5)
|
46
|
+
echo separator
|
47
|
+
end
|
48
|
+
|
49
|
+
def print_roles_info(o)
|
50
|
+
if o.roles.empty?
|
51
|
+
echo "No roles assigned.".dark
|
52
|
+
else
|
53
|
+
o.roles.each_with_index do |role, index|
|
54
|
+
if role.suggestion
|
55
|
+
echo "+".color(COLOR) + " #{role.suggestion}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
echo separator
|
60
|
+
end
|
61
|
+
|
62
|
+
def echo(msg = "")
|
63
|
+
trace edged(COLOR, msg)
|
64
|
+
end
|
65
|
+
|
66
|
+
def separator
|
67
|
+
"-".color(COLOR) * (CLI::COLUMNS - 2)
|
68
|
+
end
|
69
|
+
|
70
|
+
def grade(score)
|
71
|
+
ranges ||= Evaluation.new_score_ranges
|
72
|
+
r = ranges.detect { |r| r.range.include?(score) }
|
73
|
+
"#{r.grade} - #{r.description}".color(r.color)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Inch
|
5
|
+
module CLI
|
6
|
+
module Command
|
7
|
+
module Output
|
8
|
+
class Stats < Base
|
9
|
+
include SparklineHelper
|
10
|
+
|
11
|
+
attr_reader :objects
|
12
|
+
|
13
|
+
PRIORITY_COLORS = [
|
14
|
+
[213,212,211,210,210,209,209],
|
15
|
+
[177],
|
16
|
+
[203, 203, 204, 204, 205, 206, 207]
|
17
|
+
].flatten.map { |s| :"color#{s}" }
|
18
|
+
|
19
|
+
def initialize(options, objects, ranges)
|
20
|
+
@options = options
|
21
|
+
@objects = objects
|
22
|
+
@ranges = ranges
|
23
|
+
|
24
|
+
method("display_#{@options.format}").call
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def display_text
|
30
|
+
display_text_grades
|
31
|
+
display_text_priorities
|
32
|
+
puts
|
33
|
+
puts 'Try `--format json|yaml` for raw numbers.'.dark
|
34
|
+
end
|
35
|
+
|
36
|
+
def display_text_grades
|
37
|
+
sparkline = ranges_sparkline(@ranges).to_s(' ')
|
38
|
+
puts
|
39
|
+
puts 'Grade distribution: (undocumented, C, B, A)'
|
40
|
+
puts
|
41
|
+
puts " Overall: #{sparkline} #{objects.size.to_s.rjust(5)} objects"
|
42
|
+
puts
|
43
|
+
puts 'Grade distribution by priority:'
|
44
|
+
puts
|
45
|
+
PRIORITY_MAP.each do |priority_range, arrow|
|
46
|
+
list = objects.select { |o| priority_range.include?(o.priority) }
|
47
|
+
sparkline = grades_sparkline(list).to_s(' ')
|
48
|
+
puts " #{arrow} #{sparkline} " +
|
49
|
+
"#{list.size.to_s.rjust(5)} objects"
|
50
|
+
puts
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def display_text_priorities
|
55
|
+
puts "Priority distribution in grades: (low to high)"
|
56
|
+
puts
|
57
|
+
puts " #{PRIORITY_MAP.values.reverse.join(' ')}"
|
58
|
+
@ranges.reverse.each do |range|
|
59
|
+
list = range.objects.map(&:priority)
|
60
|
+
|
61
|
+
priorities = {}
|
62
|
+
(-7..7).each do |key|
|
63
|
+
priorities[key.to_s] = list.select { |p| p == key }.size
|
64
|
+
end
|
65
|
+
|
66
|
+
sparkline = Sparkr::Sparkline.new(priorities.values)
|
67
|
+
sparkline.format do |tick, count, index|
|
68
|
+
tick.color( PRIORITY_COLORS[index] )
|
69
|
+
end
|
70
|
+
puts " #{range.grade}: " + sparkline.to_s(' ') +
|
71
|
+
" #{range.objects.size.to_s.rjust(5)} objects"
|
72
|
+
puts
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def display_json
|
77
|
+
puts JSON.pretty_generate(stats_hash)
|
78
|
+
end
|
79
|
+
|
80
|
+
def display_yaml
|
81
|
+
puts YAML.dump(stats_hash)
|
82
|
+
end
|
83
|
+
|
84
|
+
def stats_hash
|
85
|
+
hash = {}
|
86
|
+
|
87
|
+
hash['ranges'] = {}
|
88
|
+
@ranges.each do |r|
|
89
|
+
hash['ranges'][r.grade.to_s] = r.objects.size
|
90
|
+
end
|
91
|
+
|
92
|
+
hash['scores'] = {}
|
93
|
+
@objects.sort_by(&:score).each do |o|
|
94
|
+
hash['scores'][o.score.to_i] ||= 0
|
95
|
+
hash['scores'][o.score.to_i] += 1
|
96
|
+
end
|
97
|
+
|
98
|
+
hash['priorities'] = {}
|
99
|
+
@objects.sort_by(&:priority).each do |o|
|
100
|
+
hash['priorities'][o.priority.to_i] ||= 0
|
101
|
+
hash['priorities'][o.priority.to_i] += 1
|
102
|
+
end
|
103
|
+
|
104
|
+
hash
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'sparkr'
|
2
|
+
|
3
|
+
module Inch
|
4
|
+
module CLI
|
5
|
+
module Command
|
6
|
+
module Output
|
7
|
+
class Suggest < Base
|
8
|
+
include SparklineHelper
|
9
|
+
|
10
|
+
attr_reader :objects, :files
|
11
|
+
|
12
|
+
FILE_COLOR = :dark # TODO: store all colors somewhere
|
13
|
+
RANGE_LABELS = {
|
14
|
+
:A => "Nearly perfect:",
|
15
|
+
:B => "Properly documented, could be improved:",
|
16
|
+
:C => "Not properly documented:",
|
17
|
+
:U => "Undocumented:",
|
18
|
+
}
|
19
|
+
|
20
|
+
# @param options [Command::Options::Suggest]
|
21
|
+
# @param objects_to_display [Array<CodeObject::Proxy::Base>]
|
22
|
+
# @param relevant_objects [Array<CodeObject::Proxy::Base>] the objects meeting the criteria defined in +options+
|
23
|
+
# @param ranges [Array<Evaluation::ScoreRange>]
|
24
|
+
# @param files [Array<Evaluation::File>]
|
25
|
+
def initialize(options, objects_to_display, relevant_objects, ranges, files)
|
26
|
+
@options = options
|
27
|
+
@objects = objects_to_display
|
28
|
+
@relevant_objects = relevant_objects
|
29
|
+
@ranges = ranges
|
30
|
+
@files = files
|
31
|
+
|
32
|
+
if objects.empty?
|
33
|
+
# TODO: show hint
|
34
|
+
else
|
35
|
+
display_list
|
36
|
+
display_files
|
37
|
+
display_distribution
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def display_distribution
|
44
|
+
sparkline = grades_sparkline(@relevant_objects).to_s(' ')
|
45
|
+
puts "Grade distribution (undocumented, C, B, A): " + sparkline
|
46
|
+
puts
|
47
|
+
puts priority_filter_hint
|
48
|
+
end
|
49
|
+
|
50
|
+
def priority_filter_hint
|
51
|
+
arrows = min_priority_arrows
|
52
|
+
pretext = if @options.pedantic
|
53
|
+
"Considering priority objects: #{arrows}"
|
54
|
+
else
|
55
|
+
"Only considering priority objects: #{arrows}"
|
56
|
+
end
|
57
|
+
"#{pretext} (use `--help` for options).".dark
|
58
|
+
end
|
59
|
+
|
60
|
+
def display_files
|
61
|
+
trace
|
62
|
+
trace "You might want to look at these files:"
|
63
|
+
trace
|
64
|
+
|
65
|
+
files.each do |f|
|
66
|
+
trace edged(FILE_COLOR, f.path.color(FILE_COLOR))
|
67
|
+
end
|
68
|
+
trace
|
69
|
+
end
|
70
|
+
|
71
|
+
def display_list
|
72
|
+
@options.grades_to_display.map do |grade|
|
73
|
+
r = range(grade)
|
74
|
+
grade_objects = objects.select { |o| o.grade == r.grade }
|
75
|
+
unless grade_objects.empty?
|
76
|
+
trace
|
77
|
+
trace_header(RANGE_LABELS[r.grade], r.color, r.bg_color)
|
78
|
+
grade_objects.each do |o|
|
79
|
+
grade = o.grade.to_s.ljust(2).color(r.color)
|
80
|
+
priority = o.priority
|
81
|
+
trace edged(r.color, " #{grade} #{priority_arrow(priority, r.color)} #{o.path}")
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def min_priority_arrows
|
88
|
+
priority_arrows_gte(@options.object_min_priority).join(' ')
|
89
|
+
end
|
90
|
+
|
91
|
+
def priority_arrows_gte(min_priority)
|
92
|
+
PRIORITY_MAP.map do |range, str|
|
93
|
+
str if range.min >= min_priority
|
94
|
+
end.compact
|
95
|
+
end
|
96
|
+
|
97
|
+
def range(grade)
|
98
|
+
@ranges.detect { |r| r.grade == grade }
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Inch
|
2
|
+
module CLI
|
3
|
+
module Command
|
4
|
+
class Show < BaseObject
|
5
|
+
def description
|
6
|
+
'Shows an object with its results'
|
7
|
+
end
|
8
|
+
|
9
|
+
def usage
|
10
|
+
'Usage: inch show [paths] OBJECT_NAME [[OBJECT_NAME2] ...] [options]'
|
11
|
+
end
|
12
|
+
|
13
|
+
def run(*args)
|
14
|
+
prepare_objects(*args)
|
15
|
+
Output::Show.new(@options, objects)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Inch
|
2
|
+
module CLI
|
3
|
+
module Command
|
4
|
+
class Stats < List
|
5
|
+
def description
|
6
|
+
'Lists all objects with their results'
|
7
|
+
end
|
8
|
+
|
9
|
+
def usage
|
10
|
+
'Usage: inch stats [paths] [options]'
|
11
|
+
end
|
12
|
+
|
13
|
+
def run(*args)
|
14
|
+
prepare_list(*args)
|
15
|
+
Output::Stats.new(@options, objects, @ranges)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
module Inch
|
2
|
+
module CLI
|
3
|
+
module Command
|
4
|
+
class Suggest < List
|
5
|
+
def description
|
6
|
+
'Suggests some objects to be doucmented (better)'
|
7
|
+
end
|
8
|
+
|
9
|
+
def usage
|
10
|
+
'Usage: inch suggest [paths] [options]'
|
11
|
+
end
|
12
|
+
|
13
|
+
# Runs the commandline utility, parsing arguments and displaying a
|
14
|
+
# list of objects
|
15
|
+
#
|
16
|
+
# @param [Array<String>] args the list of arguments.
|
17
|
+
# @return [void]
|
18
|
+
def run(*args)
|
19
|
+
prepare_list(*args)
|
20
|
+
Output::Suggest.new(@options, objects_to_display, relevant_objects, @ranges, files)
|
21
|
+
end
|
22
|
+
|
23
|
+
def objects_to_display
|
24
|
+
@objects_to_display ||= filter_objects_to_display
|
25
|
+
end
|
26
|
+
|
27
|
+
def filter_objects_to_display
|
28
|
+
list = []
|
29
|
+
@options.grades_to_display.map do |grade|
|
30
|
+
r = range(grade)
|
31
|
+
arr = select_by_priority(r.objects, @options.object_min_priority)
|
32
|
+
arr = arr.select { |o| o.score <= @options.object_max_score }
|
33
|
+
list.concat arr
|
34
|
+
end
|
35
|
+
|
36
|
+
list = sort_by_priority(list)
|
37
|
+
|
38
|
+
if list.size > @options.object_count
|
39
|
+
list = list[0...@options.object_count]
|
40
|
+
elsif list.size < @options.object_count
|
41
|
+
# should we add objects with lower priority to fill out the
|
42
|
+
# requested count?
|
43
|
+
end
|
44
|
+
list
|
45
|
+
end
|
46
|
+
|
47
|
+
def files
|
48
|
+
list = files_sorted_by_importance
|
49
|
+
how_many = @options.file_count || list.size
|
50
|
+
list[0...how_many]
|
51
|
+
end
|
52
|
+
|
53
|
+
def files_sorted_by_importance
|
54
|
+
list = all_filenames(relevant_objects).uniq.map do |filename|
|
55
|
+
f = Evaluation::File.for(filename, relevant_objects)
|
56
|
+
end
|
57
|
+
|
58
|
+
list = list.select do |f|
|
59
|
+
relevant_grades.include?(f.grade) &&
|
60
|
+
relevant_priorities.include?(f.priority)
|
61
|
+
end
|
62
|
+
|
63
|
+
sort_by_priority(list)
|
64
|
+
end
|
65
|
+
|
66
|
+
def all_filenames(objects)
|
67
|
+
objects.map do |o|
|
68
|
+
o.files.map(&:first)
|
69
|
+
end.flatten
|
70
|
+
end
|
71
|
+
|
72
|
+
# Returns the unique grades assigned to objects
|
73
|
+
#
|
74
|
+
# grades # => [:A, :B, :C, :U]
|
75
|
+
#
|
76
|
+
# @return [Array<Symbol>]
|
77
|
+
def grades
|
78
|
+
objects.map(&:grade).uniq
|
79
|
+
end
|
80
|
+
|
81
|
+
def range(grade)
|
82
|
+
@ranges.detect { |r| r.grade == grade }
|
83
|
+
end
|
84
|
+
|
85
|
+
def relevant_objects
|
86
|
+
select_by_priority(objects, @options.object_min_priority)
|
87
|
+
end
|
88
|
+
|
89
|
+
def relevant_grades
|
90
|
+
grades.size >= 2 ? grades[-2..-1] : [grades.last].compact
|
91
|
+
end
|
92
|
+
|
93
|
+
def relevant_priorities
|
94
|
+
(@options.object_min_priority..99)
|
95
|
+
end
|
96
|
+
|
97
|
+
def select_by_priority(list, min_priority)
|
98
|
+
list.select { |o| o.priority >= min_priority }
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|