debtective 0.2.3.3 → 0.2.3.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f5c39390d5b43a335045481e47b106c30facd0d66ea88359209ecc57887f6a4e
4
- data.tar.gz: 182beede8ace506b42e175bdd9fec0748464bfe4aa75ff1e95c7d100df4c5444
3
+ metadata.gz: '09e2ba02faff3be09a87e2babe120bb59e28f0ea509ad8cc8ef1f9a12cf55ae6'
4
+ data.tar.gz: e1c5d6197706783907a1756671928eac854d1d771eb541d58b18dba8053da003
5
5
  SHA512:
6
- metadata.gz: c846a7c047b667926d576a51331820b26e98d8e25ff16bdb192a2c8aa080aceac69f9cb7f747c90d8e3c25ed6c7c59bd3fbd6642a2da2572ffeeb304c54aa10d
7
- data.tar.gz: 4870ac4fcc0b9fa93eeaf2f72e410b06bd7b9bcea56e44557f32ee2788c572186cdea8177a6168c24cc6917360e5d02e90793b951d5d1bcdb58806cad00ca28b
6
+ metadata.gz: f1641ef5d5031d12d7c85665a252ab168cf456297621b81c400f22c8a8017868eb3c7873eade9ae2c8b0cb21c93a85d702ff16ffd4a45b822edd0d450ca42835
7
+ data.tar.gz: f371a5a826c7daff0c6cc2a31e7e5686731f29d74b568e96174de0000bdec70c62318481ff2a21ef98ff84d279053fbbb747511f75b0e0c79c8adb160f540bcb
data/bin/debtective CHANGED
@@ -14,9 +14,12 @@ quiet = ARGV.include?("--quiet")
14
14
 
15
15
  case ARGV[0]
16
16
  when "--todos"
17
- require "debtective/todos/output"
18
- Debtective::Todos::Output.new(user_name, quiet: quiet).call
19
- when "--offenses", "--gems"
17
+ require "debtective/todos/export"
18
+ Debtective::Todos::Export.new(user_name: user_name, quiet: quiet).call
19
+ when "--offenses"
20
+ require "debtective/offenses/export"
21
+ Debtective::Offenses::Export.new(user_name: user_name, quiet: quiet).call
22
+ when "--gems"
20
23
  puts "Upcoming feature"
21
24
  else
22
25
  puts "Please pass one of this options: [--todos, --offenses, --gems]"
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "pathname"
5
+ require "debtective/print"
6
+
7
+ module Debtective
8
+ # Export elements in a JSON file
9
+ class Export
10
+ # @param user_name [String] git user email to filter
11
+ # @param quiet [boolean]
12
+ def initialize(user_name: nil, quiet: false)
13
+ @user_name = user_name
14
+ @quiet = quiet
15
+ end
16
+
17
+ # @return [void]
18
+ def call
19
+ @elements = @quiet ? find_elements : log_table
20
+ filter_elements!
21
+ log_counts unless @quiet
22
+ update_json_file
23
+ puts(FILE_PATH) unless @quiet
24
+ end
25
+
26
+ private
27
+
28
+ FILE_PATH = ""
29
+
30
+ # list of paths to search in
31
+ # @return [Array<String>]
32
+ def pathnames
33
+ (Debtective.configuration&.paths || ["./**/*"])
34
+ .flat_map { Dir[_1] }
35
+ .map { Pathname(_1) }
36
+ .select { _1.file? && _1.extname == ".rb" }
37
+ end
38
+
39
+ # select only elements commited by the given user
40
+ # @return [void]
41
+ def filter_elements!
42
+ return if @user_name.nil?
43
+
44
+ @elements.select! { _1.commit.author.name == @user_name }
45
+ end
46
+
47
+ # @return [void]
48
+ def log_counts
49
+ puts "total: #{@elements.count}"
50
+ end
51
+
52
+ # write elements into the JSON file
53
+ # @return [void]
54
+ def update_json_file
55
+ File.open(self.class::FILE_PATH, "w") do |file|
56
+ file.puts(
57
+ JSON.pretty_generate(
58
+ @elements.map(&:to_h)
59
+ )
60
+ )
61
+ end
62
+ end
63
+ end
64
+ end
@@ -4,7 +4,7 @@ require "git"
4
4
  require "open3"
5
5
 
6
6
  module Debtective
7
- # find the commit that introduced a line of code
7
+ # Find the commit that introduced the given line of code
8
8
  class FindCommit
9
9
  Author = Struct.new(:email, :name)
10
10
  Commit = Struct.new(:sha, :author, :time)
@@ -12,10 +12,10 @@ module Debtective
12
12
  SPECIAL_CHARACTER_REGEX = /(?!\w|\s|#|:).+/
13
13
 
14
14
  # @param pathname [Pathname] file path
15
- # @param code [String] line of code
16
- def initialize(pathname, code)
15
+ # @param code_line [String] line of code_line
16
+ def initialize(pathname:, code_line:)
17
17
  @pathname = pathname
18
- @code = code
18
+ @code_line = code_line
19
19
  end
20
20
 
21
21
  # @return [Debtective::FindCommit::Commit]
@@ -36,17 +36,6 @@ module Debtective
36
36
  commit.date
37
37
  end
38
38
 
39
- # @return [Git::Base]
40
- def git
41
- Git.open(".")
42
- end
43
-
44
- # @return [Git::Object::Commit]
45
- def commit
46
- git.gcommit(sha)
47
- end
48
-
49
- # commit sha
50
39
  # @return [String]
51
40
  def sha
52
41
  @sha ||=
@@ -57,10 +46,22 @@ module Debtective
57
46
  end
58
47
  end
59
48
 
49
+ private
50
+
51
+ # @return [Git::Base]
52
+ def git
53
+ Git.open(".")
54
+ end
55
+
56
+ # @return [Git::Object::Commit]
57
+ def commit
58
+ git.gcommit(sha)
59
+ end
60
+
60
61
  # characters " and ` can break the git command
61
62
  # @return [String]
62
63
  def safe_code
63
- @code.gsub(/"/, "\\\"").gsub("`", "\\\\`")
64
+ @code_line.gsub(/"/, "\\\"").gsub("`", "\\\\`")
64
65
  end
65
66
  end
66
67
  end
@@ -23,7 +23,7 @@ module Debtective
23
23
 
24
24
  # @param lines [Array<String>] lines of code
25
25
  # @param index [Integer] index of the statement first line
26
- def initialize(lines, first_line_index)
26
+ def initialize(lines:, first_line_index:)
27
27
  @lines = lines
28
28
  @first_line_index = first_line_index
29
29
  end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "debtective/export"
4
+ require "debtective/print"
5
+ require "debtective/offenses/offense"
6
+
7
+ module Debtective
8
+ module Offenses
9
+ # Export offenses in a JSON file
10
+ class Export < Debtective::Export
11
+ private
12
+
13
+ FILE_PATH = "offenses.json"
14
+
15
+ TABLE_COLUMNS = [
16
+ Debtective::Print::Column.new(
17
+ "location",
18
+ "%-80.80s",
19
+ -> { _1.location }
20
+ ),
21
+ Debtective::Print::Column.new(
22
+ "author",
23
+ "%-20.20s",
24
+ -> { _1.commit.author.name || "?" }
25
+ ),
26
+ Debtective::Print::Column.new(
27
+ "cop",
28
+ "%-27.27s",
29
+ -> { _1.cop || "?" }
30
+ )
31
+ ].freeze
32
+
33
+ # @return [Array<Debtective::Offenses::Offense>]
34
+ def log_table
35
+ Debtective::Print.new(
36
+ columns: TABLE_COLUMNS,
37
+ track: Debtective::Offenses::Offense,
38
+ user_name: @user_name
39
+ ).call { find_elements }
40
+ end
41
+
42
+ # @return [Array<Debtective::Offenses::Offense>]
43
+ def find_elements
44
+ pathnames.flat_map do |pathname|
45
+ pathname.readlines.filter_map.with_index do |line, index|
46
+ next unless line =~ /\s# rubocop:disable (.*)/
47
+
48
+ Debtective::Offenses::Offense.new(
49
+ pathname: pathname,
50
+ index: index,
51
+ cop: Regexp.last_match[1]
52
+ )
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "debtective/find_commit"
4
+
5
+ module Debtective
6
+ module Offenses
7
+ # Hold offense information
8
+ class Offense
9
+ attr_accessor :pathname, :cop
10
+
11
+ # @param pathname [Pathname]
12
+ # @param cop [Array<String>]
13
+ def initialize(pathname:, index:, cop:)
14
+ @pathname = pathname
15
+ @index = index
16
+ @cop = cop
17
+ end
18
+
19
+ # location in the codebase
20
+ # @return [String]
21
+ def location
22
+ "#{@pathname}:#{@index + 1}"
23
+ end
24
+
25
+ # return commit that introduced the offense
26
+ # @return [Debtective::FindCommit::Commit]
27
+ def commit
28
+ @commit ||=
29
+ Debtective::FindCommit.new(
30
+ pathname: @pathname,
31
+ code_line: @pathname.readlines[@index]
32
+ ).call
33
+ end
34
+
35
+ # @return [Integer]
36
+ def days
37
+ return if commit.time.nil?
38
+
39
+ ((Time.now - commit.time) / (24 * 60 * 60)).round
40
+ end
41
+
42
+ # @return [Hash]
43
+ def to_h
44
+ {
45
+ pathname: @pathname,
46
+ location: location,
47
+ index: @index,
48
+ commit: {
49
+ sha: commit.sha,
50
+ author: commit.author.to_h,
51
+ time: commit.time
52
+ }
53
+ }
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Debtective
4
+ # Print elements as a table in the stdout
5
+ class Print
6
+ Column = Struct.new(:name, :format, :lambda)
7
+
8
+ # @param columns [Array<Debtective::Print::Column>]
9
+ # @param track [Class]
10
+ # @param user_name [String] git user name to filter
11
+ def initialize(columns:, track:, user_name: nil)
12
+ @columns = columns
13
+ @track = track
14
+ @user_name = user_name
15
+ end
16
+
17
+ # @return [Array]
18
+ def call
19
+ puts separator
20
+ puts headers_row
21
+ puts separator
22
+ trace.enable
23
+ result = yield
24
+ trace.disable
25
+ puts separator
26
+ result
27
+ end
28
+
29
+ private
30
+
31
+ # use a trace to log each element as soon as it is found
32
+ # @return [Tracepoint]
33
+ def trace
34
+ TracePoint.new(:return) do |trace_point|
35
+ next unless trace_point.defined_class == @track && trace_point.method_id == :initialize
36
+
37
+ object = trace_point.self
38
+ log_object(object)
39
+ end
40
+ end
41
+
42
+ # @return [String]
43
+ def headers_row
44
+ @columns.map do |column|
45
+ format(column.format, column.name)
46
+ end.join(" | ")
47
+ end
48
+
49
+ # @return [String]
50
+ def object_row(object)
51
+ @columns.map do |column|
52
+ format(column.format, column.lambda.call(object))
53
+ end.join(" | ")
54
+ end
55
+
56
+ # if a user_name is given and is not the commit author
57
+ # the line is temporary and will be replaced by the next one
58
+ # @return [void]
59
+ def log_object(object)
60
+ if @user_name.nil? || @user_name == object.commit.author.name
61
+ puts object_row(object)
62
+ else
63
+ print "#{object_row(object)}\r"
64
+ end
65
+ end
66
+
67
+ # @return [String]
68
+ def separator
69
+ @separator ||=
70
+ begin
71
+ size = @columns.map { format(_1.format, "") }.join("---").size
72
+ "-" * size
73
+ end
74
+ end
75
+ end
76
+ end
@@ -1,20 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "pathname"
4
3
  require "debtective/todos/todo"
5
4
  require "debtective/find_end_of_statement"
6
5
 
7
6
  module Debtective
8
7
  module Todos
9
- # Find the todos comments and their boundaries
8
+ # Build a Todo object given the pathname and the comment index
10
9
  class Build
11
10
  BEFORE_LINE_TODO_REGEX = /^\s*#\sTODO:\s/
12
11
  INLINE_TODO_REGEX = /\s*#\sTODO:\s/
13
- COMMENT_REGEX = /\s*#/
12
+ COMMENT_REGEX = /^\s*#/
14
13
 
15
14
  # @param pathname [Pathname]
16
15
  # @param index [Integer]
17
- def initialize(pathname, index)
16
+ def initialize(pathname:, index:)
18
17
  @pathname = pathname
19
18
  @index = index
20
19
  end
@@ -22,10 +21,10 @@ module Debtective
22
21
  # @return [Debtective::Todos::Todo]
23
22
  def call
24
23
  Debtective::Todos::Todo.new(
25
- @pathname,
26
- lines,
27
- todo_boundaries,
28
- statement_boundaries
24
+ pathname: @pathname,
25
+ lines: lines,
26
+ todo_boundaries: todo_boundaries,
27
+ statement_boundaries: statement_boundaries
29
28
  )
30
29
  end
31
30
 
@@ -48,7 +47,7 @@ module Debtective
48
47
  case lines[@index]
49
48
  when BEFORE_LINE_TODO_REGEX
50
49
  first_line_index = statement_start
51
- last_line_index = Debtective::FindEndOfStatement.new(lines, first_line_index).call
50
+ last_line_index = Debtective::FindEndOfStatement.new(lines: lines, first_line_index: first_line_index).call
52
51
  first_line_index..last_line_index
53
52
  when INLINE_TODO_REGEX
54
53
  @index..@index
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "debtective/export"
4
+ require "debtective/print"
5
+ require "debtective/todos/build"
6
+ require "debtective/todos/todo"
7
+
8
+ module Debtective
9
+ module Todos
10
+ # Export todos in a JSON file
11
+ class Export < Debtective::Export
12
+ private
13
+
14
+ FILE_PATH = "todos.json"
15
+
16
+ TABLE_COLUMNS = [
17
+ Debtective::Print::Column.new(
18
+ "location",
19
+ "%-80.80s",
20
+ -> { _1.location }
21
+ ),
22
+ Debtective::Print::Column.new(
23
+ "author",
24
+ "%-20.20s",
25
+ -> { _1.commit.author.name || "?" }
26
+ ),
27
+ Debtective::Print::Column.new(
28
+ "days",
29
+ "%-12.12s",
30
+ -> { _1.days || "?" }
31
+ ),
32
+ Debtective::Print::Column.new(
33
+ "size",
34
+ "%-12.12s",
35
+ -> { _1.size }
36
+ )
37
+ ].freeze
38
+
39
+ # @return [Array<Debtective::Todos::Todo>]
40
+ def log_table
41
+ Debtective::Print.new(
42
+ columns: TABLE_COLUMNS,
43
+ track: Debtective::Todos::Todo,
44
+ user_name: @user_name
45
+ ).call { find_elements }
46
+ end
47
+
48
+ # @return [Array<Debtective::Todos::Todo>]
49
+ def find_elements
50
+ pathnames.flat_map do |pathname|
51
+ pathname.readlines.filter_map.with_index do |line, index|
52
+ next unless line =~ /#\sTODO:/
53
+
54
+ Debtective::Todos::Build.new(
55
+ pathname: pathname,
56
+ index: index
57
+ ).call
58
+ end
59
+ end
60
+ end
61
+
62
+ # @return [void]
63
+ def log_counts
64
+ puts "total: #{@elements.count}"
65
+ puts "extended lines count: #{extended_count}"
66
+ puts "combined lines count: #{combined_count}"
67
+ end
68
+
69
+ # @return [Integer]
70
+ def extended_count
71
+ @elements.sum(&:size)
72
+ end
73
+
74
+ # @return [Integer]
75
+ def combined_count
76
+ @elements
77
+ .group_by(&:pathname)
78
+ .values
79
+ .sum do |pathname_todos|
80
+ pathname_todos
81
+ .map { _1.statement_boundaries.to_a }
82
+ .reduce(:|)
83
+ .length
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -6,20 +6,13 @@ module Debtective
6
6
  module Todos
7
7
  # Hold todo information
8
8
  class Todo
9
- class << self
10
- # @return [Debtective::Todos::Todo]
11
- def build(pathname, index)
12
- Build.new(pathname, index).call
13
- end
14
- end
15
-
16
9
  attr_accessor :pathname, :todo_boundaries, :statement_boundaries
17
10
 
18
11
  # @param pathname [Pathname]
19
12
  # @param lines [Array<String>]
20
13
  # @param todo_boundaries [Range]
21
14
  # @param statement_boundaries [Range]
22
- def initialize(pathname, lines, todo_boundaries, statement_boundaries)
15
+ def initialize(pathname:, lines:, todo_boundaries:, statement_boundaries:)
23
16
  @pathname = pathname
24
17
  @lines = lines
25
18
  @todo_boundaries = todo_boundaries
@@ -39,9 +32,13 @@ module Debtective
39
32
  end
40
33
 
41
34
  # return commit that introduced the todo
42
- # @return [Git::Object::Commit]
35
+ # @return [Debtective::FindCommit::Commit]
43
36
  def commit
44
- @commit ||= Debtective::FindCommit.new(@pathname, @lines[@todo_boundaries.min]).call
37
+ @commit ||=
38
+ Debtective::FindCommit.new(
39
+ pathname: @pathname,
40
+ code_line: @lines[@todo_boundaries.min]
41
+ ).call
45
42
  end
46
43
 
47
44
  # @return [Integer]
@@ -54,7 +51,7 @@ module Debtective
54
51
  # @return [Hash]
55
52
  def to_h
56
53
  {
57
- pathname: pathname,
54
+ pathname: @pathname,
58
55
  location: location,
59
56
  todo_boundaries: todo_boundaries.minmax,
60
57
  statement_boundaries: statement_boundaries.minmax,
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Debtective
4
- VERSION = "0.2.3.3"
4
+ VERSION = "0.2.3.4"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: debtective
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3.3
4
+ version: 0.2.3.4
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-18 00:00:00.000000000 Z
11
+ date: 2023-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: git
@@ -119,15 +119,16 @@ files:
119
119
  - bin/debtective
120
120
  - lib/debtective.rb
121
121
  - lib/debtective/configuration.rb
122
+ - lib/debtective/export.rb
122
123
  - lib/debtective/find_commit.rb
123
124
  - lib/debtective/find_end_of_statement.rb
125
+ - lib/debtective/offenses/export.rb
126
+ - lib/debtective/offenses/offense.rb
127
+ - lib/debtective/print.rb
124
128
  - lib/debtective/railtie.rb
125
129
  - lib/debtective/stderr_helper.rb
126
130
  - lib/debtective/todos/build.rb
127
- - lib/debtective/todos/find.rb
128
- - lib/debtective/todos/list.rb
129
- - lib/debtective/todos/output.rb
130
- - lib/debtective/todos/print_table.rb
131
+ - lib/debtective/todos/export.rb
131
132
  - lib/debtective/todos/todo.rb
132
133
  - lib/debtective/version.rb
133
134
  homepage: https://github.com/BigBigDoudou/debtective
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "pathname"
4
- require "debtective/todos/build"
5
-
6
- module Debtective
7
- module Todos
8
- # Find and investigate todo comments and return a list of todos
9
- class Find
10
- TODO_REGEX = /#\sTODO:/
11
-
12
- # @param paths [Array<String>]
13
- def initialize(paths)
14
- @paths = paths
15
- end
16
-
17
- # @return [Array<Debtective::Todos::Todo>]
18
- def call
19
- ruby_pathnames.flat_map { pathname_todos(_1) }
20
- end
21
-
22
- private
23
-
24
- # @return [Array<Pathname>] only pathes to ruby files
25
- def ruby_pathnames
26
- @paths
27
- .flat_map { Dir[_1] }
28
- .map { Pathname(_1) }
29
- .select { _1.file? && _1.extname == ".rb" }
30
- end
31
-
32
- # return todos in the pathname
33
- # @return [Array<Debtective::Todos::Todo>]
34
- def pathname_todos(pathname)
35
- pathname.readlines.filter_map.with_index do |line, index|
36
- next unless line.match?(TODO_REGEX)
37
-
38
- Debtective::Todos::Todo.build(pathname, index)
39
- end
40
- end
41
- end
42
- end
43
- end
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "debtective/todos/find"
4
-
5
- module Debtective
6
- module Todos
7
- # Information about the todos in the codebase
8
- class List
9
- Author = Struct.new(:email, :name, :todos)
10
-
11
- # @param paths [Array<String>]
12
- def initialize(paths)
13
- @paths = paths
14
- end
15
-
16
- # @return [Array<Debtective::Todos::Todo>]
17
- def todos
18
- @todos ||= Debtective::Todos::Find.new(@paths).call
19
- end
20
-
21
- # @return [Array<Debtective::Todos::List::Author>]
22
- def authors
23
- todos
24
- .map { [_1.commit.author.email, _1.commit.author.name] }
25
- .uniq
26
- .map { author(_1) }
27
- end
28
-
29
- # @return [Integer]
30
- def extended_count
31
- todos.sum(&:size)
32
- end
33
-
34
- # @return [Integer]
35
- def combined_count
36
- todos
37
- .group_by(&:pathname)
38
- .values
39
- .sum do |pathname_todos|
40
- pathname_todos
41
- .map { _1.statement_boundaries.to_a }
42
- .reduce(:|)
43
- .length
44
- end
45
- end
46
-
47
- private
48
-
49
- # @param email_and_name [Array<String>]
50
- # @return [Debtective::Todos::List::Author]
51
- def author(email_and_name)
52
- Author.new(
53
- *email_and_name,
54
- todos.select { email_and_name == [_1.commit.author.email, _1.commit.author.name] }
55
- )
56
- end
57
- end
58
- end
59
- end
@@ -1,65 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "json"
4
- require "debtective/todos/print_table"
5
-
6
- module Debtective
7
- module Todos
8
- # Generate todolist
9
- class Output
10
- FILE_PATH = "todos.json"
11
-
12
- # @param user_name [String] git user email to filter
13
- def initialize(user_name = nil, quiet: false)
14
- @user_name = user_name
15
- @quiet = quiet
16
- end
17
-
18
- # @return [void]
19
- def call
20
- @list = log_table
21
- @list ||= Debtective::Todos::List.new(Debtective.configuration&.paths || ["./**/*"])
22
- filter_list!
23
- log_counts
24
- update_json_file
25
- return if @quiet
26
-
27
- puts FILE_PATH
28
- end
29
-
30
- private
31
-
32
- # @return [void]
33
- def log_table
34
- return if @quiet
35
-
36
- Debtective::Todos::PrintTable.new(@user_name).call
37
- end
38
-
39
- # @return [void]
40
- def filter_list!
41
- !@user_name.nil? && @list.todos.select! { _1.commit.author.name == @user_name }
42
- end
43
-
44
- # @return [void]
45
- def log_counts
46
- return if @quiet
47
-
48
- puts "total: #{@list.todos.count}"
49
- puts "combined lines count: #{@list.combined_count}"
50
- puts "extended lines count: #{@list.extended_count}"
51
- end
52
-
53
- # @return [void]
54
- def update_json_file
55
- File.open(FILE_PATH, "w") do |file|
56
- file.puts(
57
- JSON.pretty_generate(
58
- @list.todos.map(&:to_h)
59
- )
60
- )
61
- end
62
- end
63
- end
64
- end
65
- end
@@ -1,89 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "debtective/todos/list"
4
-
5
- module Debtective
6
- module Todos
7
- # Print todos as a table in the stdout
8
- class PrintTable
9
- # @param user_name [String] git user email to filter
10
- def initialize(user_name = nil)
11
- @user_name = user_name
12
- end
13
-
14
- # @return [Debtective::Todos::List]
15
- def call
16
- log_table_headers
17
- log_table_rows
18
- list
19
- end
20
-
21
- private
22
-
23
- # @return [void]
24
- def log_table_headers
25
- puts separator
26
- puts table_row("location", "author", "days", "size")
27
- puts separator
28
- end
29
-
30
- # @return [void]
31
- def log_table_rows
32
- trace.enable
33
- list.todos
34
- trace.disable
35
- puts separator
36
- end
37
-
38
- # use a trace to log each todo as soon as it is found
39
- # @return [Tracepoint]
40
- def trace
41
- TracePoint.new(:return) do |trace_point|
42
- next unless trace_point.defined_class == Debtective::Todos::Build && trace_point.method_id == :call
43
-
44
- todo = trace_point.return_value
45
- log_todo(todo)
46
- end
47
- end
48
-
49
- # if a user_name is given and is not the commit author
50
- # the line is temporary and will be replaced by the next one
51
- # @return [void]
52
- def log_todo(todo)
53
- row = table_row(
54
- todo.location,
55
- todo.commit.author.name || "?",
56
- todo.days || "?",
57
- todo.size
58
- )
59
- if @user_name.nil? || @user_name == todo.commit.author.name
60
- puts row
61
- else
62
- print "#{row}\r"
63
- end
64
- end
65
-
66
- # @return [Debtective::Todos::Todo]
67
- def list
68
- @list ||= Debtective::Todos::List.new(
69
- Debtective.configuration&.paths || ["./**/*"]
70
- )
71
- end
72
-
73
- # @return [String]
74
- def table_row(location, author, days, size)
75
- [
76
- format("%-80.80s", location),
77
- format("%-20.20s", author),
78
- format("%-12.12s", days),
79
- format("%-12.12s", size)
80
- ].join(" | ")
81
- end
82
-
83
- # @return [String]
84
- def separator
85
- @separator ||= Array.new(table_row(nil, nil, nil, nil).size) { "-" }.join
86
- end
87
- end
88
- end
89
- end