churn_vs_complexity 1.5.1 → 1.5.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dba0d67852cef763abe50d7fa5a63a7e9b4687b5232d05b281ed267cf948a0c4
4
- data.tar.gz: 1839953429d9840ce96782431d530f45e8169441e54c94badf9f12fc9aea7b0a
3
+ metadata.gz: 843cae8dad7f09344cbea477eb73ae3d9d57945df8a5955d93d6dfc820b5a8e1
4
+ data.tar.gz: 5066b98af73acde0f18b233fd12efe6858bb9977c4a9d553970c6ad859db98a9
5
5
  SHA512:
6
- metadata.gz: 699fad42098c2a7e9e4e1368a03fda265ef3333b0e9c0895f6095e38898cf68a36a1c15d152de98f39a4f2a3ce866ce481bea68f83033876aa0d400cfe024b57
7
- data.tar.gz: dd4a1412a7c49e76c7dd7624e80f5bd06f3c5bb027402f3eba8f9842568db3f4f6a2e1f6b9b5a559af6eee61c3049e7cd8848640432e3929f4b554b9c28dc847
6
+ metadata.gz: 7af6d2c460fd9bb2cb78751d8a7f5cdd3ada48e9026e61ccbd3ef74a22c738bcfea4185984ffea2476a5d4b726f902c881edabf2baefa211884bfb129b59f80c
7
+ data.tar.gz: c3cf5e4dfd7bea34298fac9d7e2db1b7ffe58ad16acab25e9217dae0f84b43e2da7d89f147027f1ebb3fd52115538aba81a1f05bca5a0f7e13f0ad5d3a7b9aef
data/CHANGELOG.md CHANGED
@@ -1,4 +1,9 @@
1
- ## [1.5.1] - 2024-10-15
1
+ ## [1.5.2] - 2024-10-21
2
+
3
+ - Fixed bug where delta mode validations would fail when the commit was a non-sha value.
4
+ - Allow HEAD as specified commit in delta mode
5
+
6
+ ## [1.5.1] - 2024-10-15
2
7
 
3
8
  - Fix bug where worktree checkout silently failed
4
9
 
@@ -32,4 +37,4 @@
32
37
 
33
38
  ## [1.0.0] - 2024-06-07
34
39
 
35
- - Initial release
40
+ - Initial release
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![Gem Version](https://badge.fury.io/rb/churn_vs_complexity.svg)](https://badge.fury.io/rb/churn_vs_complexity)
2
+
1
3
  # ChurnVsComplexity
2
4
 
3
5
  A tool to visualise code complexity in a project and help direct refactoring efforts.
@@ -47,9 +49,10 @@ Usage: churn_vs_complexity [options] folder
47
49
  -q, --quarter Calculate churn for the quarter leading up to the most recent commit
48
50
  -y, --year Calculate churn for the year leading up to the most recent commit
49
51
  --timetravel N Calculate summary for all commits at intervals of N days throughout project history or from the date specified with --since
50
- --delta SHA Identify changes between the specified commit and the previous commit and annotate changed files with complexity score. Can be used multiple times to specify multiple commits.
52
+ --delta SHA Identify changes between the specified commit (SHA) and the previous commit and annotate changed files with complexity score. SHA can be a full or short commit hash, or the value HEAD. Can be used multiple times to specify multiple commits.
51
53
  --dry-run Echo the chosen options from the CLI
52
54
  -h, --help Display help
55
+ --version Display version
53
56
  ```
54
57
 
55
58
  Note that when using the `--timetravel` mode, the semantics of some flags are subtly different from normal mode:
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'optparse'
4
+
5
+ module ChurnVsComplexity
6
+ module CLI
7
+ module Main
8
+ class << self
9
+ def run!(options, folder)
10
+ validate_folder!(folder)
11
+ validate_options!(options)
12
+ config = config(options)
13
+ config.validate!
14
+
15
+ config.checker.check(folder:)
16
+ end
17
+
18
+ private
19
+
20
+ def validate_folder!(folder)
21
+ raise ValidationError, 'No folder selected. Use --help for usage information.' if folder.nil? || folder.empty?
22
+ raise ValidationError, "Folder #{folder} does not exist" unless File.directory?(folder)
23
+ end
24
+
25
+ def validate_options!(options)
26
+ raise ValidationError, 'No options selected. Use --help for usage information.' if options.empty?
27
+ raise ValidationError, 'No language selected. Use --help for usage information.' if options[:language].nil?
28
+
29
+ return unless options[:serializer].nil?
30
+
31
+ raise ValidationError, 'No serializer selected. Use --help for usage information.'
32
+ end
33
+
34
+ def config(options)
35
+ config_class =
36
+ case options[:mode]
37
+ when :timetravel then Timetravel::Config
38
+ when :delta then Delta::Config
39
+ else Normal::Config
40
+ end
41
+ config_class.new(**options)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -64,7 +64,7 @@ module ChurnVsComplexity
64
64
  end
65
65
 
66
66
  opts.on('--delta SHA',
67
- 'Identify changes between the specified commit and the previous commit and annotate changed files with complexity score. Can be used multiple times to specify multiple commits.',) do |value|
67
+ 'Identify changes between the specified commit (SHA) and the previous commit and annotate changed files with complexity score. SHA can be a full or short commit hash, or the value HEAD. Can be used multiple times to specify multiple commits.',) do |value|
68
68
  options[:mode] = :delta
69
69
  (options[:commits] ||= []) << value
70
70
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'cli/parser'
4
+ require_relative 'cli/main'
4
5
 
5
6
  module ChurnVsComplexity
6
7
  module CLI
@@ -11,33 +12,7 @@ module ChurnVsComplexity
11
12
  # First argument that is not an option is the folder
12
13
  folder = ARGV.first
13
14
 
14
- validate_folder!(folder)
15
- validate_options!(options)
16
- config = config(options)
17
- config.validate!
18
- puts config.checker.check(folder:)
19
- end
20
-
21
- private
22
-
23
- def validate_folder!(folder)
24
- raise Error, 'No folder selected. Use --help for usage information.' if folder.nil? || folder.empty?
25
- raise Error, "Folder #{folder} does not exist" unless File.directory?(folder)
26
- end
27
-
28
- def validate_options!(options)
29
- raise Error, 'No options selected. Use --help for usage information.' if options.empty?
30
- raise Error, 'No language selected. Use --help for usage information.' if options[:language].nil?
31
- raise Error, 'No serializer selected. Use --help for usage information.' if options[:serializer].nil?
32
- end
33
-
34
- def config(options)
35
- config_class = case options[:mode]
36
- when :timetravel then Timetravel::Config
37
- when :delta then Delta::Config
38
- else Normal::Config
39
- end
40
- config_class.new(**options)
15
+ puts Main.run!(options, folder)
41
16
  end
42
17
  end
43
18
  end
@@ -40,12 +40,10 @@ module ChurnVsComplexity
40
40
  end
41
41
 
42
42
  def commit_summary(folder:)
43
- summary = { commit: @commit }
44
- if @serializer.respond_to?(:has_commit_summary?) && @serializer.has_commit_summary?
45
- parent, next_commit = @factory.git_strategy(folder:).surrounding(commit: @commit)
46
- summary.merge!(parent:, next_commit:)
47
- end
48
- summary
43
+ CommitHydrator.new(
44
+ git_strategy: @factory.git_strategy(folder:),
45
+ serializer: @serializer,
46
+ ).hydrate(@commit)
49
47
  end
50
48
 
51
49
  def valid_commit?(folder:)
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ChurnVsComplexity
4
+ module Delta
5
+ class CommitHydrator
6
+ def initialize(git_strategy:, serializer:)
7
+ @git_strategy = git_strategy
8
+ @serializer = serializer
9
+ end
10
+
11
+ def hydrate(commit_sha)
12
+ commit = @git_strategy.object(commit_sha)
13
+ summary = { commit: commit.sha }
14
+ if @serializer.respond_to?(:has_commit_summary?) && @serializer.has_commit_summary?
15
+ parent, next_commit = @git_strategy.surrounding(commit:)
16
+ summary.merge!(parent:, next_commit:)
17
+ end
18
+ summary
19
+ end
20
+ end
21
+ end
22
+ end
@@ -38,7 +38,7 @@ module ChurnVsComplexity
38
38
  end
39
39
 
40
40
  def validate_commit!(commit)
41
- return if commit.match?(/\A[0-9a-f]{40}\z/i) || @commit.match?(/\A[0-9a-f]{8}\z/i)
41
+ return if commit == 'HEAD' || commit.match?(/\A[0-9a-f]{40}\z/i) || commit.match?(/\A[0-9a-f]{8}\z/i)
42
42
 
43
43
  raise ValidationError,
44
44
  "Invalid commit: #{commit}. It must be a valid 40-character SHA-1 hash or an 8-character shortened form."
@@ -6,6 +6,7 @@ require_relative 'delta/serializer'
6
6
  require_relative 'delta/factory'
7
7
  require_relative 'delta/complexity_annotator'
8
8
  require_relative 'delta/multi_checker'
9
+ require_relative 'delta/commit_hydrator'
9
10
 
10
11
  module ChurnVsComplexity
11
12
  module Delta
@@ -14,13 +14,15 @@ module ChurnVsComplexity
14
14
  false
15
15
  end
16
16
 
17
+ def object(commit)
18
+ commit.is_a?(Git::Object::Commit) ? commit : @repo.object(commit)
19
+ end
20
+
17
21
  def surrounding(commit:)
18
- current = @repo.object(commit)
19
- parent = current.parent
20
- next_commit = @repo.log(100_000).find do |c|
21
- c.parents.map(&:sha).include?(current.sha)
22
- end
23
- [parent&.sha, next_commit&.sha]
22
+ current = object(commit)
23
+ is_head = current.sha == @repo.object('HEAD').sha
24
+ next_commit = is_head ? nil : @repo.log(100_000).find { |c| c.parents.map(&:sha).include?(current.sha) }
25
+ [current.parent&.sha, next_commit&.sha]
24
26
  end
25
27
 
26
28
  def changes(commit:)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ChurnVsComplexity
4
- VERSION = '1.5.1'
4
+ VERSION = '1.5.2'
5
5
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: churn_vs_complexity
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.1
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik T. Madsen
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2024-10-15 00:00:00.000000000 Z
10
+ date: 2024-10-21 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: flog
@@ -62,6 +62,7 @@ files:
62
62
  - lib/churn_vs_complexity.rb
63
63
  - lib/churn_vs_complexity/churn.rb
64
64
  - lib/churn_vs_complexity/cli.rb
65
+ - lib/churn_vs_complexity/cli/main.rb
65
66
  - lib/churn_vs_complexity/cli/parser.rb
66
67
  - lib/churn_vs_complexity/complexity.rb
67
68
  - lib/churn_vs_complexity/complexity/eslint_calculator.rb
@@ -73,6 +74,7 @@ files:
73
74
  - lib/churn_vs_complexity/concurrent_calculator.rb
74
75
  - lib/churn_vs_complexity/delta.rb
75
76
  - lib/churn_vs_complexity/delta/checker.rb
77
+ - lib/churn_vs_complexity/delta/commit_hydrator.rb
76
78
  - lib/churn_vs_complexity/delta/complexity_annotator.rb
77
79
  - lib/churn_vs_complexity/delta/config.rb
78
80
  - lib/churn_vs_complexity/delta/factory.rb