debtective 0.2.1 → 0.2.2
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/lib/debtective/end_of_statement.rb +15 -25
- data/lib/debtective/file_todos.rb +2 -3
- data/lib/debtective/stderr_helper.rb +15 -0
- data/lib/debtective/todo.rb +37 -0
- data/lib/debtective/todo_list.rb +3 -18
- data/lib/debtective/todo_list_counts.rb +29 -0
- data/lib/debtective/version.rb +1 -1
- data/lib/tasks/debtective/todo_list.rake +18 -29
- metadata +5 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fa54bf140a87eeb794cba1f8823d00a9ab5407b77f7d8b18c39414857e301edc
|
4
|
+
data.tar.gz: 2169b279c88a1527c3e1107921aaacd7b81905442361804ac4eaf3731856357e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3c5d0c77005f8b6d410339b9e649ba774d4a677ccc60cb7ee96c4761b24bc740880d648871cc65309b542935008a13df8fcd30cd89b7c968243231046fdd728
|
7
|
+
data.tar.gz: 8a9e4f628f36eb6d21eef51464d068e24fd696c8e8335127a2d95cc683bbca0c59bc91272e0450c8daac662f8f7f5014ff060bc692e7699925778c2f64725d9c
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "debtective/stderr_helper"
|
4
4
|
|
5
5
|
module Debtective
|
6
6
|
# Find the index of the line ending a statement
|
@@ -18,6 +18,8 @@ module Debtective
|
|
18
18
|
# => 3
|
19
19
|
#
|
20
20
|
class EndOfStatement
|
21
|
+
include StderrHelper
|
22
|
+
|
21
23
|
# @param lines [Array<String>] lines of code
|
22
24
|
# @param index [Integer] index of the statement first line
|
23
25
|
def initialize(lines, first_line_index)
|
@@ -27,24 +29,24 @@ module Debtective
|
|
27
29
|
|
28
30
|
# index of the line ending the statement
|
29
31
|
# @return [Integer]
|
32
|
+
# @note use suppress_stderr to prevent error outputs
|
33
|
+
# from RubyVM::InstructionSequence.compile
|
30
34
|
def call
|
31
|
-
suppress_stderr
|
32
|
-
last_line_index || @first_line_index
|
33
|
-
end
|
35
|
+
suppress_stderr { last_line_index }
|
34
36
|
end
|
35
37
|
|
36
38
|
private
|
37
39
|
|
38
|
-
# index of the line ending the statement
|
40
|
+
# recursively find index of the line ending the statement
|
41
|
+
# @param index [Integer] used for recursion
|
39
42
|
# @return[Integer, void]
|
40
43
|
# @note it is possible that no line ends the statement
|
41
44
|
# especially if first line is not the start of a statement
|
42
|
-
def last_line_index
|
43
|
-
@
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
45
|
+
def last_line_index(index = @first_line_index)
|
46
|
+
return @first_line_index if index >= @lines.size
|
47
|
+
return index if !chained?(index) && statement?(index)
|
48
|
+
|
49
|
+
last_line_index(index + 1)
|
48
50
|
end
|
49
51
|
|
50
52
|
# check if the code from first index to given index is a statement
|
@@ -53,9 +55,8 @@ module Debtective
|
|
53
55
|
# @return boolean
|
54
56
|
def statement?(index)
|
55
57
|
code = @lines[@first_line_index..index].join("\n")
|
56
|
-
::
|
57
|
-
|
58
|
-
rescue Parser::SyntaxError
|
58
|
+
RubyVM::InstructionSequence.compile(code)
|
59
|
+
rescue SyntaxError
|
59
60
|
false
|
60
61
|
end
|
61
62
|
|
@@ -66,16 +67,5 @@ module Debtective
|
|
66
67
|
def chained?(index)
|
67
68
|
@lines[index + 1]&.match?(/^(\s*)\./)
|
68
69
|
end
|
69
|
-
|
70
|
-
# silence the $stderr
|
71
|
-
# to avoid logs from the parser
|
72
|
-
# @return void
|
73
|
-
def suppress_stderr
|
74
|
-
original_stderr = $stderr.clone
|
75
|
-
$stderr.reopen(File.new("/dev/null", "w"))
|
76
|
-
yield
|
77
|
-
ensure
|
78
|
-
$stderr.reopen(original_stderr)
|
79
|
-
end
|
80
70
|
end
|
81
71
|
end
|
@@ -1,12 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "debtective/todo"
|
3
4
|
require "debtective/end_of_statement"
|
4
5
|
|
5
6
|
module Debtective
|
6
7
|
# Find the todos comments and their boundaries
|
7
8
|
class FileTodos
|
8
|
-
Result = Struct.new(:pathname, :todo_index, :boundaries)
|
9
|
-
|
10
9
|
BEFORE_LINE_TODO_REGEX = /^\s*#\sTODO:\s/
|
11
10
|
INLINE_TODO_REGEX = /\s*#\sTODO:\s/
|
12
11
|
COMMENT_REGEX = /\s*#/
|
@@ -22,7 +21,7 @@ module Debtective
|
|
22
21
|
boundaries = boundaries(line, index)
|
23
22
|
next if boundaries.nil?
|
24
23
|
|
25
|
-
|
24
|
+
Todo.new(@pathname, index, boundaries)
|
26
25
|
end
|
27
26
|
end
|
28
27
|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Debtective
|
4
|
+
# Silence the $stderr
|
5
|
+
module StderrHelper
|
6
|
+
# @return void
|
7
|
+
def suppress_stderr
|
8
|
+
original_stderr = $stderr.clone
|
9
|
+
$stderr.reopen(File.new("/dev/null", "w"))
|
10
|
+
yield
|
11
|
+
ensure
|
12
|
+
$stderr.reopen(original_stderr)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "debtective/end_of_statement"
|
4
|
+
|
5
|
+
module Debtective
|
6
|
+
# Hold todo information
|
7
|
+
class Todo
|
8
|
+
attr_accessor :pathname, :todo_index, :boundaries
|
9
|
+
|
10
|
+
# @param pathname [Pathname]
|
11
|
+
# @param todo_index [Integer] first line of todo comment
|
12
|
+
# @param boundaries [Range] first and last index of the concerned code
|
13
|
+
def initialize(pathname, todo_index, boundaries)
|
14
|
+
@pathname = pathname
|
15
|
+
@todo_index = todo_index
|
16
|
+
@boundaries = boundaries
|
17
|
+
end
|
18
|
+
|
19
|
+
# location in the codebase
|
20
|
+
# @return [String]
|
21
|
+
def location
|
22
|
+
"#{pathname}:#{todo_index + 1}"
|
23
|
+
end
|
24
|
+
|
25
|
+
# size of the todo code
|
26
|
+
# @return [Integer]
|
27
|
+
def size
|
28
|
+
boundaries.size
|
29
|
+
end
|
30
|
+
|
31
|
+
# line numbers (like displayed in an IDE)
|
32
|
+
# @return [Range]
|
33
|
+
def line_numbers
|
34
|
+
(boundaries.min + 1)..(boundaries.max + 1)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/debtective/todo_list.rb
CHANGED
@@ -7,17 +7,10 @@ module Debtective
|
|
7
7
|
class TodoList
|
8
8
|
DEFAULT_PATHS = ["./**/*"].freeze
|
9
9
|
|
10
|
-
|
11
|
-
combined_count
|
12
|
-
extended_count
|
13
|
-
todos
|
14
|
-
].freeze
|
15
|
-
|
16
|
-
Result = Struct.new(*REPORTS)
|
17
|
-
|
18
|
-
# @return [TodoList::Result]
|
10
|
+
# @return [Array<FileTodos::Result>]
|
19
11
|
def call
|
20
|
-
|
12
|
+
ruby_pathnames
|
13
|
+
.flat_map { FileTodos.new(_1).call }
|
21
14
|
end
|
22
15
|
|
23
16
|
private
|
@@ -35,14 +28,6 @@ module Debtective
|
|
35
28
|
.select { _1.file? && _1.extname == ".rb" }
|
36
29
|
end
|
37
30
|
|
38
|
-
# @return [Array<FileTodos::Result>]
|
39
|
-
def todos
|
40
|
-
@todos ||=
|
41
|
-
ruby_pathnames
|
42
|
-
.flat_map { FileTodos.new(_1).call }
|
43
|
-
.select(&:any?)
|
44
|
-
end
|
45
|
-
|
46
31
|
# @return [Integer]
|
47
32
|
def extended_count
|
48
33
|
todos
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Debtective
|
4
|
+
# Apply calculations on a todo list
|
5
|
+
class TodoListCounts
|
6
|
+
# @param todo_list [Array<Debtective::Todo>]
|
7
|
+
def initialize(todos)
|
8
|
+
@todos = todos
|
9
|
+
end
|
10
|
+
|
11
|
+
# @return [Integer]
|
12
|
+
def extended_count
|
13
|
+
@todos.sum(&:size)
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [Integer]
|
17
|
+
def combined_count
|
18
|
+
@todos
|
19
|
+
.group_by(&:pathname)
|
20
|
+
.values
|
21
|
+
.sum do |pathname_todos|
|
22
|
+
pathname_todos
|
23
|
+
.map { _1.boundaries.to_a }
|
24
|
+
.reduce(:|)
|
25
|
+
.length
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/debtective/version.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "debtective/todo_list"
|
4
|
+
require "debtective/todo_list_counts"
|
4
5
|
|
5
6
|
begin
|
6
7
|
require "#{Rails.root}/config/initializers/debtective" if defined?(Rails)
|
@@ -11,51 +12,39 @@ end
|
|
11
12
|
namespace :debtective do
|
12
13
|
desc "Todo List"
|
13
14
|
task :todo_list do
|
14
|
-
|
15
|
-
|
15
|
+
array_row =
|
16
|
+
lambda do |value1, value2, value3|
|
17
|
+
[
|
18
|
+
value1.to_s.ljust(120),
|
19
|
+
value2.to_s.rjust(12),
|
20
|
+
value3.to_s.rjust(12)
|
21
|
+
].join(" | ").prepend("| ").concat(" |")
|
22
|
+
end
|
16
23
|
|
17
|
-
separator = Array.new(
|
24
|
+
separator = Array.new(array_row.call(nil, nil, nil).size) { "-" }.join
|
18
25
|
|
19
|
-
|
26
|
+
todo_list = Debtective::TodoList.new.call
|
27
|
+
todos = todo_list.sort_by { _1.boundaries.size }.reverse
|
28
|
+
todo_list_counts = Debtective::TodoListCounts.new(todos)
|
20
29
|
|
30
|
+
puts separator
|
21
31
|
puts "todo list"
|
22
|
-
|
23
32
|
puts separator
|
24
|
-
|
25
|
-
puts(
|
26
|
-
[
|
27
|
-
"pathname".ljust(120),
|
28
|
-
"lines".rjust(12)
|
29
|
-
].join(" | ")
|
30
|
-
)
|
31
|
-
|
33
|
+
puts array_row.call("pathname", "line numbers", "lines count")
|
32
34
|
puts separator
|
33
|
-
|
34
|
-
todos.each do |todo|
|
35
|
-
location = "#{todo.pathname}:#{todo.todo_index + 1}".ljust(120)
|
36
|
-
puts(
|
37
|
-
[
|
38
|
-
location,
|
39
|
-
[todo.boundaries.first + 1, todo.boundaries.last + 1].join(":").rjust(12),
|
40
|
-
todo.boundaries.size.to_s.rjust(12)
|
41
|
-
].join(" | ")
|
42
|
-
)
|
43
|
-
end
|
35
|
+
todos.each { puts array_row.call(_1.location, _1.line_numbers, _1.size) }
|
44
36
|
|
45
37
|
puts separator
|
46
|
-
|
47
38
|
puts "todos count"
|
48
39
|
puts todos.count
|
49
40
|
|
50
41
|
puts separator
|
51
|
-
|
52
42
|
puts "combined lines count"
|
53
|
-
puts
|
43
|
+
puts todo_list_counts.combined_count
|
54
44
|
|
55
45
|
puts separator
|
56
|
-
|
57
46
|
puts "extended lines count"
|
58
|
-
puts
|
47
|
+
puts todo_list_counts.extended_count
|
59
48
|
|
60
49
|
puts separator
|
61
50
|
end
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: debtective
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Edouard Piron
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-02-
|
11
|
+
date: 2023-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: parser
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: rake
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -123,7 +109,10 @@ files:
|
|
123
109
|
- lib/debtective/end_of_statement.rb
|
124
110
|
- lib/debtective/file_todos.rb
|
125
111
|
- lib/debtective/railtie.rb
|
112
|
+
- lib/debtective/stderr_helper.rb
|
113
|
+
- lib/debtective/todo.rb
|
126
114
|
- lib/debtective/todo_list.rb
|
115
|
+
- lib/debtective/todo_list_counts.rb
|
127
116
|
- lib/debtective/version.rb
|
128
117
|
- lib/tasks/debtective/todo_list.rake
|
129
118
|
homepage: https://github.com/BigBigDoudou/debtective
|