cobra_commander 0.12.0 → 0.13.0
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/.github/workflows/ci.yml +4 -7
- data/.github/workflows/release.yml +1 -1
- data/CHANGELOG.md +5 -0
- data/Rakefile +3 -5
- data/cobra_commander.gemspec +13 -13
- data/lib/cobra_commander/affected.rb +4 -7
- data/lib/cobra_commander/change.rb +1 -1
- data/lib/cobra_commander/cli/filters.rb +1 -1
- data/lib/cobra_commander/cli.rb +6 -6
- data/lib/cobra_commander/component.rb +2 -2
- data/lib/cobra_commander/dependencies/bundler.rb +2 -2
- data/lib/cobra_commander/dependencies/yarn/package.rb +2 -2
- data/lib/cobra_commander/dependencies/yarn_workspace.rb +2 -2
- data/lib/cobra_commander/executor/concurrent.rb +2 -2
- data/lib/cobra_commander/executor/context.rb +3 -1
- data/lib/cobra_commander/executor.rb +1 -1
- data/lib/cobra_commander/output/ascii_tree.rb +4 -4
- data/lib/cobra_commander/output/graph_viz.rb +1 -1
- data/lib/cobra_commander/output/interactive_printer.rb +27 -11
- data/lib/cobra_commander/output/markdown_printer.rb +3 -3
- data/lib/cobra_commander/version.rb +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4eb007805f5f11954ed14e349409c7486fc6b52d0a041f8066c75c47f8d045b8
|
4
|
+
data.tar.gz: 68ac383fb087d118a276e5aed0199b51fd09b05c110d7ff4539f18097b1ea367
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a5f69e411bf49bd1de717934f27c0d364378e07ce1728855b2783de0c73dff791be433565b689656d4481b2ad294086fc43118beafc16ca445a2c91ea7916c9
|
7
|
+
data.tar.gz: afdf327649c953bc155f5e01a6db9f4cef12ed625f7c791534e7ae65ac0d05c2260bfd20b03f382eac9aaee9f2e84612806c050327491c2f806223d7e612aa67
|
data/.github/workflows/ci.yml
CHANGED
@@ -40,10 +40,7 @@ jobs:
|
|
40
40
|
- uses: ruby/setup-ruby@v1
|
41
41
|
with:
|
42
42
|
ruby-version: 3.0
|
43
|
-
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
fail_on_error: true
|
48
|
-
rubocop_extensions: ""
|
49
|
-
github_token: ${{ secrets.github_token }}
|
43
|
+
- name: Bundle
|
44
|
+
run: bundle
|
45
|
+
- name: Run standard
|
46
|
+
run: bundle exec rake standard
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,11 @@
|
|
2
2
|
|
3
3
|
## Unreleased
|
4
4
|
|
5
|
+
## Version 0.13.0 - 2021-10-21
|
6
|
+
|
7
|
+
* Sorts the interactive UI alphabetically with failures first [#66](https://github.com/powerhome/cobra_commander/pull/66)
|
8
|
+
* Switch linter to standardrb [#67](https://github.com/powerhome/cobra_commander/pull/67)
|
9
|
+
|
5
10
|
## Version 0.12.0 - 2021-09-21
|
6
11
|
|
7
12
|
* Add interactive UI and Markdown output to `cobra exec` [#63](https://github.com/powerhome/cobra_commander/pull/63)
|
data/Rakefile
CHANGED
@@ -1,11 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "bundler/gem_tasks"
|
4
|
-
|
4
|
+
require "standard/rake"
|
5
5
|
require "rspec/core/rake_task"
|
6
|
-
RSpec::Core::RakeTask.new(:spec)
|
7
6
|
|
8
|
-
|
9
|
-
RuboCop::RakeTask.new
|
7
|
+
RSpec::Core::RakeTask.new(:spec)
|
10
8
|
|
11
|
-
task default: %i[spec
|
9
|
+
task default: %i[spec standard]
|
data/cobra_commander.gemspec
CHANGED
@@ -5,32 +5,32 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
5
|
require "cobra_commander/version"
|
6
6
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
|
-
spec.name
|
9
|
-
spec.version
|
10
|
-
spec.authors
|
8
|
+
spec.name = "cobra_commander"
|
9
|
+
spec.version = CobraCommander::VERSION
|
10
|
+
spec.authors = [
|
11
11
|
"Ben Langfeld",
|
12
12
|
"Garett Arrowood",
|
13
|
-
"Carlos Palhares"
|
13
|
+
"Carlos Palhares"
|
14
14
|
]
|
15
15
|
spec.email = [
|
16
16
|
"blangfeld@powerhrg.com",
|
17
17
|
"garett.arrowood@powerhrg.com",
|
18
|
-
"carlos.palhares@powerhrg.com"
|
18
|
+
"carlos.palhares@powerhrg.com"
|
19
19
|
]
|
20
|
-
spec.summary
|
21
|
-
spec.description
|
20
|
+
spec.summary = "Tools for working with Component Based Rails Apps"
|
21
|
+
spec.description = <<~DESCRIPTION
|
22
22
|
Tools for working with Component Based Rails Apps (see http://shageman.github.io/cbra.info/).
|
23
23
|
Includes tools for graphing the components of an app and their relationships, as well as selectively
|
24
24
|
testing components based on changes made.
|
25
25
|
DESCRIPTION
|
26
|
-
spec.homepage
|
27
|
-
spec.license
|
26
|
+
spec.homepage = "http://tech.powerhrg.com/cobra_commander/"
|
27
|
+
spec.license = "MIT"
|
28
28
|
|
29
|
-
spec.files
|
29
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
30
30
|
f.match(%r{^(test|spec|features)/})
|
31
31
|
end
|
32
|
-
spec.bindir
|
33
|
-
spec.executables
|
32
|
+
spec.bindir = "exe"
|
33
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
34
34
|
spec.require_paths = ["lib"]
|
35
35
|
|
36
36
|
spec.add_dependency "bundler"
|
@@ -47,5 +47,5 @@ Gem::Specification.new do |spec|
|
|
47
47
|
spec.add_development_dependency "pry"
|
48
48
|
spec.add_development_dependency "rake", ">= 12.3.3"
|
49
49
|
spec.add_development_dependency "rspec", "~> 3.5"
|
50
|
-
spec.add_development_dependency "
|
50
|
+
spec.add_development_dependency "standard", ">= 1.3.0"
|
51
51
|
end
|
@@ -25,21 +25,18 @@ module CobraCommander
|
|
25
25
|
@transitively.map(&method(:affected_component))
|
26
26
|
end
|
27
27
|
|
28
|
-
def json_representation
|
28
|
+
def json_representation
|
29
29
|
{
|
30
30
|
changed_files: @changes,
|
31
31
|
directly_affected_components: directly,
|
32
32
|
transitively_affected_components: transitively,
|
33
33
|
test_scripts: scripts,
|
34
34
|
component_names: names,
|
35
|
-
languages: {
|
36
|
-
ruby: contains_ruby?,
|
37
|
-
javascript: contains_js?,
|
38
|
-
},
|
35
|
+
languages: {ruby: contains_ruby?, javascript: contains_js?}
|
39
36
|
}.to_json
|
40
37
|
end
|
41
38
|
|
42
|
-
|
39
|
+
private
|
43
40
|
|
44
41
|
def run!
|
45
42
|
@transitively = Set.new
|
@@ -68,7 +65,7 @@ module CobraCommander
|
|
68
65
|
{
|
69
66
|
name: component.name,
|
70
67
|
path: component.root_paths,
|
71
|
-
type: component.sources.keys.map(&:to_s).map(&:capitalize).join(" & ")
|
68
|
+
type: component.sources.keys.map(&:to_s).map(&:capitalize).join(" & ")
|
72
69
|
}
|
73
70
|
end
|
74
71
|
|
data/lib/cobra_commander/cli.rb
CHANGED
@@ -28,7 +28,7 @@ module CobraCommander
|
|
28
28
|
|
29
29
|
desc "ls [component]", "Lists the components in the context of a given component or umbrella"
|
30
30
|
filter_options dependents: "Lists all dependents of a given component",
|
31
|
-
|
31
|
+
dependencies: "Lists all dependencies of a given component"
|
32
32
|
method_option :total, type: :boolean, aliases: "-t", desc: "Prints the total count of components"
|
33
33
|
def ls(component = nil)
|
34
34
|
components = components_filtered(component)
|
@@ -38,17 +38,17 @@ module CobraCommander
|
|
38
38
|
desc "exec [component] <command>", "Executes the command in the context of a given component or set thereof. " \
|
39
39
|
"Defaults to all components."
|
40
40
|
filter_options dependents: "Run the command on each dependent of a given component",
|
41
|
-
|
41
|
+
dependencies: "Run the command on each dependency of a given component"
|
42
42
|
method_option :concurrency, type: :numeric, default: DEFAULT_CONCURRENCY, aliases: "-c",
|
43
43
|
desc: "Max number of jobs to run concurrently"
|
44
44
|
method_option :interactive, type: :boolean, default: true, aliases: "-i",
|
45
|
-
desc: "Runs in interactive mode to allow the user to inspect the output of each
|
45
|
+
desc: "Runs in interactive mode to allow the user to inspect the output of each " \
|
46
|
+
"component"
|
46
47
|
def exec(command_or_component, command = nil)
|
47
48
|
results = CobraCommander::Executor.exec(
|
48
49
|
components: components_filtered(command && command_or_component),
|
49
50
|
command: command || command_or_component,
|
50
|
-
concurrency: options.concurrency,
|
51
|
-
status_output: $stderr
|
51
|
+
concurrency: options.concurrency, status_output: $stderr
|
52
52
|
)
|
53
53
|
if options.interactive && results.size > 1
|
54
54
|
CobraCommander::Output::InteractivePrinter.run(results, $stdout)
|
@@ -83,7 +83,7 @@ module CobraCommander
|
|
83
83
|
Change.new(umbrella, options.results, options.branch).run!
|
84
84
|
end
|
85
85
|
|
86
|
-
|
86
|
+
private
|
87
87
|
|
88
88
|
def umbrella
|
89
89
|
@umbrella ||= CobraCommander.umbrella(options.app, yarn: options.js, bundler: options.ruby)
|
@@ -21,11 +21,11 @@ module CobraCommander
|
|
21
21
|
|
22
22
|
def components
|
23
23
|
components_source.specs.map do |spec|
|
24
|
-
{
|
24
|
+
{path: spec.loaded_from, name: spec.name, dependencies: spec.dependencies.map(&:name)}
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
|
28
|
+
private
|
29
29
|
|
30
30
|
def lockfile
|
31
31
|
@lockfile ||= ::Bundler::LockfileParser.new(::Bundler.read_file(path))
|
@@ -24,10 +24,10 @@ module CobraCommander
|
|
24
24
|
|
25
25
|
def dependencies
|
26
26
|
json.fetch("dependencies", {})
|
27
|
-
|
27
|
+
.merge(json.fetch("devDependencies", {}))
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
private
|
31
31
|
|
32
32
|
def json
|
33
33
|
@json ||= JSON.parse(File.read(@path))
|
@@ -28,11 +28,11 @@ module CobraCommander
|
|
28
28
|
|
29
29
|
def components
|
30
30
|
@repo.specs.map do |spec|
|
31
|
-
{
|
31
|
+
{path: spec.path, name: untag(spec.name), dependencies: spec.dependencies.keys.map(&method(:untag))}
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
|
35
|
+
private
|
36
36
|
|
37
37
|
def load_workspace_packages
|
38
38
|
workspace_spec.map do |_name, spec|
|
@@ -23,7 +23,7 @@ module CobraCommander
|
|
23
23
|
@results
|
24
24
|
end
|
25
25
|
|
26
|
-
|
26
|
+
private
|
27
27
|
|
28
28
|
def pastel
|
29
29
|
@pastel ||= Pastel.new
|
@@ -33,7 +33,7 @@ module CobraCommander
|
|
33
33
|
@spinner_options ||= {
|
34
34
|
format: :bouncing,
|
35
35
|
success_mark: pastel.green("[DONE]"),
|
36
|
-
error_mark: pastel.red("[ERROR]")
|
36
|
+
error_mark: pastel.red("[ERROR]")
|
37
37
|
}
|
38
38
|
end
|
39
39
|
|
@@ -4,6 +4,8 @@ require "tty-command"
|
|
4
4
|
|
5
5
|
module CobraCommander
|
6
6
|
module Executor
|
7
|
+
# Represents a component context to execute a command
|
8
|
+
# @private
|
7
9
|
class Context
|
8
10
|
attr_reader :component, :command
|
9
11
|
|
@@ -33,7 +35,7 @@ module CobraCommander
|
|
33
35
|
results.join("\n")
|
34
36
|
end
|
35
37
|
|
36
|
-
|
38
|
+
private
|
37
39
|
|
38
40
|
def isolate_bundle(&block)
|
39
41
|
if Bundler.respond_to?(:with_unbundled_env)
|
@@ -6,9 +6,9 @@ module CobraCommander
|
|
6
6
|
module Output
|
7
7
|
# Prints the tree in a nice tree form
|
8
8
|
class AsciiTree
|
9
|
-
SPACE
|
10
|
-
BAR
|
11
|
-
TEE
|
9
|
+
SPACE = " "
|
10
|
+
BAR = "│ "
|
11
|
+
TEE = "├── "
|
12
12
|
CORNER = "└── "
|
13
13
|
|
14
14
|
def initialize(component)
|
@@ -22,7 +22,7 @@ module CobraCommander
|
|
22
22
|
end.string
|
23
23
|
end
|
24
24
|
|
25
|
-
|
25
|
+
private
|
26
26
|
|
27
27
|
def list_dependencies(io, component, outdents = [])
|
28
28
|
component.dependencies.each do |dep|
|
@@ -17,7 +17,7 @@ module CobraCommander
|
|
17
17
|
end
|
18
18
|
|
19
19
|
private_class_method def self.extract_format(output)
|
20
|
-
format = output[-3..-1]
|
20
|
+
format = output[-3..-1] # standard:disable Style/SlicingWithRange
|
21
21
|
return format if %w[png dot].include?(format)
|
22
22
|
|
23
23
|
raise ArgumentError, "output format must be 'png' or 'dot'"
|
@@ -6,26 +6,42 @@ require "tty-prompt"
|
|
6
6
|
module CobraCommander
|
7
7
|
module Output
|
8
8
|
# Runs an interactive output printer
|
9
|
-
|
9
|
+
class InteractivePrinter
|
10
10
|
pastel = Pastel.new
|
11
|
-
SUCCESS = "#{pastel.green("✔")} %s"
|
12
|
-
ERROR = "#{pastel.red("✖")} %s"
|
13
|
-
BYE = pastel.decorate("👋 Bye!", :white, :on_black, :bold).freeze
|
11
|
+
SUCCESS = "#{pastel.green("✔")} %s"
|
12
|
+
ERROR = "#{pastel.red("✖")} %s"
|
13
|
+
BYE = pastel.decorate("\n\n👋 Bye!", :white, :on_black, :bold).freeze
|
14
14
|
|
15
15
|
def self.run(contexts, output)
|
16
|
-
|
17
|
-
|
16
|
+
new(contexts).run(output)
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(contexts)
|
20
|
+
@prompt = TTY::Prompt.new
|
21
|
+
@options = contexts.sort(&method(:sort_contexts))
|
22
|
+
.reduce({}) do |options, context|
|
18
23
|
template = context.success? ? SUCCESS : ERROR
|
19
|
-
options.merge(
|
20
|
-
format(template, context.component_name) => context
|
21
|
-
)
|
24
|
+
options.merge format(template, context.component_name) => context
|
22
25
|
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def run(output)
|
23
29
|
loop do
|
24
|
-
context = prompt.select("Print output?",
|
30
|
+
context = @prompt.select("Print output?", @options)
|
25
31
|
output.puts context.output
|
26
32
|
end
|
27
33
|
rescue TTY::Reader::InputInterrupt
|
28
|
-
output.puts
|
34
|
+
output.puts BYE
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def sort_contexts(context_a, context_b)
|
40
|
+
if context_a.success? == context_b.success?
|
41
|
+
context_a.component_name <=> context_b.component_name
|
42
|
+
else
|
43
|
+
context_a.success? ? 1 : -1
|
44
|
+
end
|
29
45
|
end
|
30
46
|
end
|
31
47
|
end
|
@@ -7,9 +7,9 @@ module CobraCommander
|
|
7
7
|
module Output
|
8
8
|
# Prints the given CobraCommander::Executor::Context to [output] collection in markdown
|
9
9
|
module MarkdownPrinter
|
10
|
-
SUCCESS = "\n## ✔ %s\n"
|
11
|
-
ERROR = "\n## ✖ %s\n"
|
12
|
-
OUTPUT = "\n```\n$ %s\n\n%s\n```\n"
|
10
|
+
SUCCESS = "\n## ✔ %s\n"
|
11
|
+
ERROR = "\n## ✖ %s\n"
|
12
|
+
OUTPUT = "\n```\n$ %s\n\n%s\n```\n"
|
13
13
|
|
14
14
|
def self.run(contexts, output)
|
15
15
|
contexts.each do |context|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cobra_commander
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Langfeld
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2021-
|
13
|
+
date: 2021-10-21 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -201,19 +201,19 @@ dependencies:
|
|
201
201
|
- !ruby/object:Gem::Version
|
202
202
|
version: '3.5'
|
203
203
|
- !ruby/object:Gem::Dependency
|
204
|
-
name:
|
204
|
+
name: standard
|
205
205
|
requirement: !ruby/object:Gem::Requirement
|
206
206
|
requirements:
|
207
|
-
- -
|
207
|
+
- - ">="
|
208
208
|
- !ruby/object:Gem::Version
|
209
|
-
version:
|
209
|
+
version: 1.3.0
|
210
210
|
type: :development
|
211
211
|
prerelease: false
|
212
212
|
version_requirements: !ruby/object:Gem::Requirement
|
213
213
|
requirements:
|
214
|
-
- -
|
214
|
+
- - ">="
|
215
215
|
- !ruby/object:Gem::Version
|
216
|
-
version:
|
216
|
+
version: 1.3.0
|
217
217
|
description: |
|
218
218
|
Tools for working with Component Based Rails Apps (see http://shageman.github.io/cbra.info/).
|
219
219
|
Includes tools for graphing the components of an app and their relationships, as well as selectively
|