cobra_commander 0.15.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -2
  3. data/.rubocop.yml +0 -5
  4. data/Gemfile +7 -0
  5. data/cobra_commander.gemspec +6 -1
  6. data/doc/dependency_decisions.yml +9 -0
  7. data/docs/CHANGELOG.md +13 -0
  8. data/docs/README.md +3 -129
  9. data/exe/cobra +5 -0
  10. data/lib/cobra_commander/affected.rb +17 -49
  11. data/lib/cobra_commander/cli/filters.rb +1 -3
  12. data/lib/cobra_commander/{output → cli/output}/ascii_tree.rb +7 -5
  13. data/lib/cobra_commander/cli/output/change.rb +91 -0
  14. data/lib/cobra_commander/cli/output/dot_graph.rb +21 -0
  15. data/lib/cobra_commander/cli.rb +58 -30
  16. data/lib/cobra_commander/component.rb +6 -10
  17. data/lib/cobra_commander/executor/command.rb +75 -0
  18. data/lib/cobra_commander/executor/execution.rb +52 -0
  19. data/lib/cobra_commander/executor/interactive_printer.rb +53 -0
  20. data/lib/cobra_commander/executor/job.rb +51 -0
  21. data/lib/cobra_commander/executor/markdown_printer.rb +21 -0
  22. data/lib/cobra_commander/executor/package_criteria.rb +21 -0
  23. data/lib/cobra_commander/executor/script.rb +45 -0
  24. data/lib/cobra_commander/executor/spinners.rb +40 -0
  25. data/lib/cobra_commander/executor.rb +37 -6
  26. data/lib/cobra_commander/git_changed.rb +16 -11
  27. data/lib/cobra_commander/package.rb +21 -0
  28. data/lib/cobra_commander/registry.rb +29 -0
  29. data/lib/cobra_commander/source.rb +37 -0
  30. data/lib/cobra_commander/umbrella.rb +70 -17
  31. data/lib/cobra_commander/version.rb +1 -1
  32. data/lib/cobra_commander.rb +10 -16
  33. data/mkdocs.yml +1 -1
  34. metadata +37 -43
  35. data/.editorconfig +0 -11
  36. data/.github/workflows/ci.yml +0 -44
  37. data/.github/workflows/release.yml +0 -20
  38. data/.rubocop_todo.yml +0 -15
  39. data/LICENSE.txt +0 -21
  40. data/_config.yml +0 -1
  41. data/docs/CODE_OF_CONDUCT.md +0 -74
  42. data/gemfiles/bundler1.gemfile +0 -7
  43. data/gemfiles/bundler2.gemfile +0 -7
  44. data/lib/cobra_commander/change.rb +0 -87
  45. data/lib/cobra_commander/dependencies/bundler/package.rb +0 -17
  46. data/lib/cobra_commander/dependencies/bundler.rb +0 -44
  47. data/lib/cobra_commander/dependencies/yarn/package.rb +0 -21
  48. data/lib/cobra_commander/dependencies/yarn.rb +0 -40
  49. data/lib/cobra_commander/dependencies.rb +0 -4
  50. data/lib/cobra_commander/executor/concurrent.rb +0 -51
  51. data/lib/cobra_commander/executor/context.rb +0 -49
  52. data/lib/cobra_commander/output/flat_list.rb +0 -16
  53. data/lib/cobra_commander/output/graph_viz.rb +0 -27
  54. data/lib/cobra_commander/output/interactive_printer.rb +0 -53
  55. data/lib/cobra_commander/output/markdown_printer.rb +0 -24
  56. data/lib/cobra_commander/output.rb +0 -7
  57. data/portal.yml +0 -12
  58. data/renovate.json +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d625729cf3e531754033d5e368c51e228ffb2e4e46d3c85e841e1731ec3ebc16
4
- data.tar.gz: 7e9e07583026f458cae3eb4820e6a2de08afd91ea1d76203cc17c6f7666bd0a5
3
+ metadata.gz: 1a3895a540b9a0393d9574c2117b0cf84bb2de0109be7dada0f75e7355179d39
4
+ data.tar.gz: 254aff0eb790d9db8b1cb1f216b4e2a3d964b91dee54250403dac9089b4db944
5
5
  SHA512:
6
- metadata.gz: 2cbf7b292a417763f26e2b4345c90d77bd33ad33e96b12c0823274fbcd94cc545d6f0ee58508171d1020ebfbddef33dd376406887a1a7a04583e8dec760b942d
7
- data.tar.gz: dfbb0224eea4dcac7037add00b03f8e41cc4563e50ec3880283028fb940b2f9ad72dba4aa40f6d487f4ef4df68431f1e40b6bb9a74208299e822e7e80fce7ea3
6
+ metadata.gz: 7825c34b935c88c0f36549bba626bddd3f9d58f6cfd815035b8bba7c2f13d07344b4c01b0666d2540ed53ad7001ddd7ddc40edd385be4e30e23ef9dcb616fb04
7
+ data.tar.gz: c063f162e6525252c4692a026f36f7e016c335fcf5ac48213f77da487737f9378244b233959abbe42ec738bc877e2e40422ca512fbb3ace997f5daa56cac6d20
data/.gitignore CHANGED
@@ -4,7 +4,6 @@
4
4
  /Gemfile.lock
5
5
  /_yardoc/
6
6
  /coverage/
7
- /doc/
8
7
  /graph.*
9
8
  /pkg/
10
9
  /spec/examples.txt
@@ -15,4 +14,3 @@
15
14
  /tmp/
16
15
 
17
16
  .bundle
18
- gemfiles/*.lock
data/.rubocop.yml CHANGED
@@ -1,13 +1,8 @@
1
- inherit_from: .rubocop_todo.yml
2
-
3
1
  require:
4
2
  - rubocop-powerhome
5
3
 
6
4
  Rails:
7
5
  Enabled: false
8
6
 
9
- Gemspec/RequireMFA:
10
- Enabled: false
11
-
12
7
  Style/ClassAndModuleChildren:
13
8
  Enabled: false
data/Gemfile CHANGED
@@ -3,3 +3,10 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gemspec
6
+
7
+ bundler_version = ENV.fetch("BUNDLER_VERSION", "2")
8
+ gem "bundler", "~> #{bundler_version}"
9
+
10
+ group :cobra do
11
+ gem "cobra_commander-stub", path: "./spec/support/", require: "stub_source"
12
+ end
@@ -26,6 +26,11 @@ Gem::Specification.new do |spec|
26
26
  spec.homepage = "http://tech.powerhrg.com/cobra_commander/"
27
27
  spec.license = "MIT"
28
28
 
29
+ spec.metadata["rubygems_mfa_required"] = "true"
30
+ spec.metadata["homepage_uri"] = spec.homepage
31
+ spec.metadata["source_code_uri"] = "https://github.com/powerhome/cobra_commander"
32
+ spec.metadata["changelog_uri"] = "https://github.com/powerhome/cobra_commander/blob/main/cobra_commander/docs/CHANGELOG.md"
33
+
29
34
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
30
35
  f.match(%r{^(test|spec|features)/})
31
36
  end
@@ -35,7 +40,6 @@ Gem::Specification.new do |spec|
35
40
 
36
41
  spec.add_dependency "bundler"
37
42
  spec.add_dependency "concurrent-ruby", "~> 1.1"
38
- spec.add_dependency "ruby-graphviz", "~> 1.2.3"
39
43
  spec.add_dependency "thor", ["< 2.0", ">= 0.18.1"]
40
44
  spec.add_dependency "tty-command", "~> 0.10.0"
41
45
  spec.add_dependency "tty-prompt", "~> 0.23.1"
@@ -44,6 +48,7 @@ Gem::Specification.new do |spec|
44
48
  spec.add_development_dependency "aruba", "~> 0.14.2"
45
49
  spec.add_development_dependency "bundler"
46
50
  spec.add_development_dependency "guard-rspec"
51
+ spec.add_development_dependency "license_finder", ">= 7.0"
47
52
  spec.add_development_dependency "pry"
48
53
  spec.add_development_dependency "rake", ">= 12.3.3"
49
54
  spec.add_development_dependency "rspec", "~> 3.5"
@@ -0,0 +1,9 @@
1
+ ---
2
+ - - :inherit_from
3
+ - https://raw.githubusercontent.com/powerhome/oss-guide/master/license_rules.yml
4
+ - - :approve
5
+ - bundler
6
+ - :who: Carlos Palhares <carlos.palhares@powerhrg.com>
7
+ :why: 'Bundler <https://rubygems.org/gems/bundler/versions/1.17.3> is licensed under MIT, but license_finder sometimes fails to resolve that with 1.17.3.'
8
+ :versions: [1.17.3]
9
+ :when: 2022-11-02 20:36:55.617698000 Z
data/docs/CHANGELOG.md CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## Version 1.0.0 - 2022-10-15
6
+
7
+ * Extract Ruby and Yarn package loading to plugins by @xjunior [#87](https://github.com/powerhome/cobra_commander/pull/87)
8
+ * Remove unused/broken methods from CobraCommander API by @xjunior [#84](https://github.com/powerhome/cobra_commander/pull/84)
9
+ * Ruby sources are not hardcoded to "components" anymore by @xjunior [#85](https://github.com/powerhome/cobra_commander/pull/85)
10
+ * Remove graphviz graph in favor of plain dot graph file by @xjunior [#88](https://github.com/powerhome/cobra_commander/pull/88)
11
+ * Add license_finder to cobra CI by @xjunior [#89](https://github.com/powerhome/cobra_commander/pull/89)
12
+ * Umbrella now "depends" on all packages in Yarn AND Ruby by @xjunior [#90](https://github.com/powerhome/cobra_commander/pull/90)
13
+ * Refactor affected to reuse umbrella#resolve by @xjunior [#91](https://github.com/powerhome/cobra_commander/pull/91)
14
+ * Umbrella root is not a component by itself anymore by @xjunior [#92](https://github.com/powerhome/cobra_commander/pull/92)
15
+ * Move output into CLI by @xjunior [#93](https://github.com/powerhome/cobra_commander/pull/93)
16
+ * Simplify Executor and remove Executor::Concurrent by @xjunior [#94](https://github.com/powerhome/cobra_commander/pull/94)
17
+
5
18
  ## Version 0.15.1 - 2022-08-23
6
19
 
7
20
  * Fix `--affected` filter [#82](https://github.com/powerhome/cobra_commander/pull/82)
data/docs/README.md CHANGED
@@ -1,10 +1,5 @@
1
1
  # cobra_commander
2
2
 
3
- [![Gem](https://img.shields.io/gem/dv/cobra_commander/stable.svg)](https://rubygems.org/gems/cobra_commander)
4
- [![Gem](https://img.shields.io/gem/v/cobra_commander.svg)](https://rubygems.org/gems/cobra_commander)
5
- [![CI](https://github.com/powerhome/cobra_commander/actions/workflows/ci.yml/badge.svg)](https://github.com/powerhome/cobra_commander/actions/workflows/ci.yml)
6
- [![Maintainability](https://api.codeclimate.com/v1/badges/7fe0781c18f6923ab753/maintainability)](https://codeclimate.com/github/powerhome/cobra_commander/maintainability)
7
-
8
3
  Tools for working with Component Based Rails Apps (see https://cbra.info). Includes tools for graphing both Ruby and Javascript components in an application and their relationships, as well as selectively testing components based on changes made.
9
4
 
10
5
  ## Installation
@@ -23,138 +18,17 @@ Or install it yourself as:
23
18
 
24
19
  $ gem install cobra_commander
25
20
 
26
- ## Usage (cobra help)
27
-
28
- ```bash
29
- Commands:
30
- cobra changes [--results=RESULTS] [--branch=BRANCH] # Prints list of changed files
31
- cobra exec [components] <command> # Executes the command in the context of a given component or set thereof. Defaults to all components.
32
- cobra graph [component] # Outputs a graph of a given component or umbrella
33
- cobra help [COMMAND] # Describe available commands or one specific command
34
- cobra ls [components] # Lists the components in the context of a given component or umbrella
35
- cobra tree [component] # Prints the dependency tree of a given component or umbrella
36
- cobra version # Prints version
37
-
38
- Options:
39
- -a, [--app=APP]
40
- # Default: /Users/me/myapp
41
- [--js], [--no-js] # Consider only the JS dependency graph
42
- [--ruby], [--no-ruby] # Consider only the Ruby dependency graph
43
- ```
44
-
45
- ### cobra changes
46
-
47
- ```sh
48
- Usage:
49
- cobra changes [--results=RESULTS] [--branch=BRANCH]
50
-
51
- Options:
52
- -r, [--results=RESULTS] # Accepts test, full, name or json
53
- # Default: test
54
- -b, [--branch=BRANCH] # Specified target to calculate against
55
- # Default: master
56
- -a, [--app=APP]
57
- # Default: /Users/me/myapp
58
- [--js], [--no-js] # Consider only the JS dependency graph
59
- [--ruby], [--no-ruby] # Consider only the Ruby dependency graph
60
-
61
- Prints list of changed files
62
- ```
63
-
64
- ### cobra exec
65
-
66
- ```sh
67
- Usage:
68
- cobra exec [components] <command>
69
-
70
- [components] is all components by default, or a comma separated list of component names (no spaces between)
71
-
72
- Options:
73
- [--affected=AFFECTED] # Components affected since given branch [default: main]
74
- -d, [--dependencies], [--no-dependencies] # Run the command on each dependency of a given component
75
- -D, [--dependents], [--no-dependents] # Run the command on each dependent of a given component
76
- [--self], [--no-self] # Include the own component
77
- # Default: true
78
- -c, [--concurrency=N] # Max number of jobs to run concurrently
79
- # Default: 5
80
- -i, [--interactive], [--no-interactive] # Runs in interactive mode to allow the user to inspect the output of each component
81
- # Default: true
82
- -a, [--app=APP]
83
- # Default: /Users/me/myapp
84
- [--js], [--no-js] # Consider only the JS dependency graph
85
- [--ruby], [--no-ruby] # Consider only the Ruby dependency graph
86
-
87
- Executes the command in the context of a given component or set thereof. Defaults to all components.
88
- ```
89
-
90
- ### cobra graph
91
-
92
- ```sh
93
- Usage:
94
- cobra graph [component]
95
-
96
- Options:
97
- -o, [--output=OUTPUT] # Output file, accepts .png or .dot
98
- # Default: /Users/me/myapp/output.png
99
- -a, [--app=APP]
100
- # Default: /Users/me/myapp
101
- [--js], [--no-js] # Consider only the JS dependency graph
102
- [--ruby], [--no-ruby] # Consider only the Ruby dependency graph
103
-
104
- Outputs a graph of a given component or umbrella
105
- ```
106
-
107
- ### cobra ls
108
-
109
- ```sh
110
- Usage:
111
- cobra ls [components]
112
-
113
- [components] is all components by default, or a comma separated list of component names (no spaces between)
114
-
115
- Options:
116
- [--affected=AFFECTED] # Components affected since given branch [default: main]
117
- -d, [--dependencies], [--no-dependencies] # Lists all dependencies of a given component
118
- -D, [--dependents], [--no-dependents] # Lists all dependents of a given component
119
- [--self], [--no-self] # Include the own component
120
- # Default: true
121
- -t, [--total], [--no-total] # Prints the total count of components
122
- -a, [--app=APP]
123
- # Default: /Users/me/myapp
124
- [--js], [--no-js] # Consider only the JS dependency graph
125
- [--ruby], [--no-ruby] # Consider only the Ruby dependency graph
126
-
127
- Lists the components in the context of a given component or umbrella
128
- ```
129
-
130
- ### cobra tree
131
-
132
- ```sh
133
- Usage:
134
- cobra tree [component]
135
-
136
- Options:
137
- -a, [--app=APP]
138
- # Default: /Users/me/myapp
139
- [--js], [--no-js] # Consider only the JS dependency graph
140
- [--ruby], [--no-ruby] # Consider only the Ruby dependency graph
141
-
142
- Prints the dependency tree of a given component or umbrella
143
- ```
144
-
145
21
  ## Development
146
22
 
147
- After checking out the repo, run `bin/setup` to install dependencies. You will also need to install `graphviz` by running `brew install graphviz`. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
148
-
149
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
23
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
150
24
 
151
25
  ### Bundled App
152
26
 
153
- In order to maintain the features around umbrella apps and specially `changes`, a bundled [`umbrella app repo`](spec/fixtures/app.tgz) is included in this repository. This repo is compacted by `tar`/`gzip` in order to keep isolation, the format was chosen to avoid issues described in https://github.com/swcarpentry/git-novice/issues/272. To avoid the same issues, the workflow for this fixture app is the following:
27
+ In order to maintain the features around umbrella apps and specially `changes`, a bundled [`umbrella app repo`](spec/fixtures/modified-app.tgz) is included in this repository. This repo is compacted by `tar`/`gzip` in order to keep isolation, the format was chosen to avoid issues described in https://github.com/swcarpentry/git-novice/issues/272. To avoid the same issues, the workflow for this fixture modified-app is the following:
154
28
 
155
29
  1. unpack it somewhere outside your repo
156
30
  1. do your changes and commit (locally only, it doesn't have a remote)
157
- 1. from within the app run `tar cfz path/to/cobra/spec/fixtures/app.tgz .`
31
+ 1. from within the app run `tar cfz path/to/cobra/spec/fixtures/modified-app.tgz .`
158
32
 
159
33
  ## Contributing
160
34
 
data/exe/cobra CHANGED
@@ -1,6 +1,11 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
+ require "bundler"
5
+
6
+ # Require plugins
7
+ Bundler.require(:cobra)
8
+
4
9
  require "cobra_commander/cli"
5
10
 
6
11
  CobraCommander::CLI.start
@@ -1,20 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "json"
4
+
3
5
  module CobraCommander
4
6
  # Calculates directly & transitively affected components
5
7
  class Affected
6
8
  def initialize(umbrella, changes)
7
9
  @umbrella = umbrella
8
10
  @changes = changes
9
- run!
10
11
  end
11
12
 
12
13
  def names
13
- @names ||= all_affected.map(&:name)
14
+ @names ||= all.map(&:name)
14
15
  end
15
16
 
16
- def all_affected
17
- @all_affected ||= (@directly | @transitively).sort_by(&:name)
17
+ def all
18
+ @all ||= (directly | transitively).sort_by(&:name)
18
19
  end
19
20
 
20
21
  def scripts
@@ -22,75 +23,42 @@ module CobraCommander
22
23
  end
23
24
 
24
25
  def directly
25
- @directly.map(&method(:affected_component))
26
+ @directly ||= @changes.filter_map { |path| @umbrella.resolve(path) }
27
+ .uniq.sort_by(&:name)
26
28
  end
27
29
 
28
30
  def transitively
29
- @transitively.map(&method(:affected_component))
31
+ @transitively ||= directly.flat_map(&:deep_dependents)
32
+ .uniq.sort_by(&:name)
30
33
  end
31
34
 
32
- def json_representation
35
+ def to_json(*_args)
33
36
  {
34
37
  changed_files: @changes,
35
- directly_affected_components: directly,
36
- transitively_affected_components: transitively,
38
+ directly_affected_components: directly.map { |c| affected_component(c) },
39
+ transitively_affected_components: transitively.map { |c| affected_component(c) },
37
40
  test_scripts: scripts,
38
41
  component_names: names,
39
- languages: { ruby: contains_ruby?, javascript: contains_js? },
42
+ languages: all_affected_packages,
40
43
  }.to_json
41
44
  end
42
45
 
43
46
  private
44
47
 
45
- def run!
46
- @transitively = Set.new
47
- @directly = Set.new
48
- @umbrella.components.each(&method(:add_if_changed))
49
- @transitively = @transitively.sort_by(&:name)
50
- @directly = @directly.sort_by(&:name)
51
- end
52
-
53
- def component_changed?(component)
54
- component.root_paths.any? do |component_path|
55
- @changes.any? do |file_path|
56
- file_path.start_with?(component_path)
57
- end
58
- end
59
- end
60
-
61
- def add_if_changed(component)
62
- return unless component_changed?(component)
63
-
64
- @directly << component
65
- @transitively.merge(component.deep_dependents)
66
- end
67
-
68
48
  def affected_component(component)
69
49
  {
70
50
  name: component.name,
71
- path: component.root_paths,
72
- type: component.packages.keys.map(&:to_s).map(&:capitalize).join(" & "),
51
+ path: component.root_paths.map(&:to_s),
52
+ type: component.packages.map(&:key).map(&:to_s),
73
53
  }
74
54
  end
75
55
 
76
56
  def paths
77
- @paths ||= all_affected.map(&:root_paths).flatten
57
+ @paths ||= all.map(&:root_paths).flatten
78
58
  end
79
59
 
80
60
  def all_affected_packages
81
- all_affected
82
- .map(&:packages)
83
- .map(&:keys)
84
- .flatten
85
- .uniq
86
- end
87
-
88
- def contains_ruby?
89
- all_affected_packages.include?(:bundler)
90
- end
91
-
92
- def contains_js?
93
- all_affected_packages.include?(:yarn)
61
+ all.flat_map(&:packages).map(&:key).uniq
94
62
  end
95
63
  end
96
64
  end
@@ -13,8 +13,6 @@ module CobraCommander
13
13
  private
14
14
 
15
15
  def find_component(name)
16
- return umbrella.root unless name
17
-
18
16
  umbrella.find(name) || error("Component #{name} not found, maybe #{suggestion(name)}") || exit(1)
19
17
  end
20
18
 
@@ -31,7 +29,7 @@ module CobraCommander
31
29
 
32
30
  def affected_by_changes(origin_branch)
33
31
  changes = GitChanged.new(umbrella.path, origin_branch)
34
- Affected.new(umbrella, changes).all_affected
32
+ Affected.new(umbrella, changes).all
35
33
  end
36
34
 
37
35
  def filter_component(component_name)
@@ -3,7 +3,7 @@
3
3
  require "stringio"
4
4
 
5
5
  module CobraCommander
6
- module Output
6
+ module CLI::Output
7
7
  # Prints the tree in a nice tree form
8
8
  class AsciiTree
9
9
  SPACE = " "
@@ -11,14 +11,16 @@ module CobraCommander
11
11
  TEE = "├── "
12
12
  CORNER = "└── "
13
13
 
14
- def initialize(component)
15
- @component = component
14
+ def initialize(components)
15
+ @components = components.sort_by(&:name)
16
16
  end
17
17
 
18
18
  def to_s
19
19
  StringIO.new.tap do |io|
20
- io.puts @component.name
21
- list_dependencies(io, @component)
20
+ @components.each do |component|
21
+ io.puts component.name
22
+ list_dependencies(io, component)
23
+ end
22
24
  end.string
23
25
  end
24
26
 
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cobra_commander/git_changed"
4
+ require "cobra_commander/affected"
5
+
6
+ module CobraCommander
7
+ class CLI
8
+ module Output
9
+ # Calculates and prints affected components & files
10
+ class Change
11
+ InvalidSelectionError = Class.new(StandardError)
12
+
13
+ def initialize(umbrella, oformat, branch, changes: nil)
14
+ @format = oformat
15
+ @branch = branch
16
+ @umbrella = umbrella
17
+ @changes = changes || GitChanged.new(umbrella.path, branch)
18
+ end
19
+
20
+ def run!
21
+ assert_valid_result_choice
22
+ if selected_format?("json")
23
+ puts affected.to_json
24
+ else
25
+ show_full if selected_format?("full")
26
+ tests_to_run
27
+ end
28
+ rescue GitChanged::InvalidSelectionError => e
29
+ puts e.message
30
+ end
31
+
32
+ private
33
+
34
+ def affected
35
+ @affected ||= Affected.new(@umbrella, @changes)
36
+ end
37
+
38
+ def show_full
39
+ changes_since_last_commit
40
+ directly_affected_components
41
+ transitively_affected_components
42
+ end
43
+
44
+ def assert_valid_result_choice
45
+ return if %w[test full name json].include?(@format)
46
+
47
+ raise InvalidSelectionError, "--results must be 'test', 'full', 'name' or 'json'"
48
+ end
49
+
50
+ def selected_format?(result)
51
+ @format == result
52
+ end
53
+
54
+ def changes_since_last_commit
55
+ puts "<<< Changes since last commit on #{@branch} >>>"
56
+ puts(*@changes) if @changes.any?
57
+ puts blank_line
58
+ end
59
+
60
+ def directly_affected_components
61
+ puts "<<< Directly affected components >>>"
62
+ affected.directly.each { |component| puts display(component) }
63
+ puts blank_line
64
+ end
65
+
66
+ def transitively_affected_components
67
+ puts "<<< Transitively affected components >>>"
68
+ affected.transitively.each { |component| puts display(component) }
69
+ puts blank_line
70
+ end
71
+
72
+ def tests_to_run
73
+ puts "<<< Test scripts to run >>>" if selected_format?("full")
74
+ if selected_format?("name")
75
+ affected.names.each { |component_name| puts component_name }
76
+ else
77
+ affected.scripts.each { |component_script| puts component_script }
78
+ end
79
+ end
80
+
81
+ def display(component)
82
+ "#{component.name} - #{component.packages.map(&:key).map(&:to_s).map(&:capitalize).join(' & ')}"
83
+ end
84
+
85
+ def blank_line
86
+ ""
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CobraCommander
4
+ class CLI
5
+ module Output
6
+ # Generates graphs of components
7
+ module DotGraph
8
+ def self.generate(components, output)
9
+ output << "digraph G {\n"
10
+ [*components, *components.flat_map(&:deep_dependencies)].uniq.each do |comp|
11
+ output << "\t#{comp.name};\n"
12
+ comp.dependencies.each do |dep|
13
+ output << "\t#{comp.name} -> #{dep.name};\n"
14
+ end
15
+ end
16
+ output << "}\n"
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end