cobra_commander 0.8.1 → 0.11.0

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: a07c92126bfb5a1179d1fb056a0c33452d5b9cab9087c9062d3c0e8203b3d165
4
- data.tar.gz: a338e59737c442e533d7c9cf951dde539666617d2c571999c8d104b1dddb68aa
3
+ metadata.gz: cf88be500ee51ad9217ce6729399a3dd45ea69bc91f8d0a2f9ffc97521f802a3
4
+ data.tar.gz: 13c889293a2173dc698257d1e614a2072b705faca25c3a59d8066e5d09326974
5
5
  SHA512:
6
- metadata.gz: b47bca554823ceaca8ce8449c0a0a955103d84dd979ebc232b577042ee3e2f6a5a99e976277cbe926a6f4e3929f072f69e086dfad6f9805f6c1bce6b5167ff01
7
- data.tar.gz: 27ee91733374ae24fbb24fe26fa3692bd0a2afa22ebbd5a213431b51f55a84631b5e0d9fcaa8f30c1ccc15095afe090b94bbe7ff6a955e4f19120e3b2e9f942a
6
+ metadata.gz: 2300c5d0b41084a2d6403444c8548710e57a6645e770ee0d1befa029bfa947e738fe0909d33c522a1543b24892580e0acd7dd2504baae7100ed05af5e32e4a45
7
+ data.tar.gz: 64e6ff60e979d5ffe2c0c7cceed3cd23733694cc479ad96f484b4af1b6ed421a2aa65ec2e4450699363b3006274784daed0737e27b4b4f4c904123764b1c11ed
@@ -1,24 +1,36 @@
1
1
  name: CI
2
2
 
3
- on: [push, pull_request]
3
+ on:
4
+ push:
5
+ pull_request:
6
+ types: [opened, reopened]
4
7
 
5
8
  jobs:
6
9
  test:
7
10
  name: Tests
8
11
  runs-on: ubuntu-latest
9
12
  strategy:
13
+ fail-fast: false
10
14
  matrix:
11
15
  ruby:
12
16
  - "2.5"
13
17
  - "2.6"
18
+ - "2.7"
19
+ - "3.0"
20
+ bundler:
21
+ - "1"
22
+ - "2"
23
+ env:
24
+ BUNDLE_GEMFILE: gemfiles/bundler${{ matrix.bundler }}.gemfile
14
25
  steps:
15
26
  - uses: actions/checkout@v2
16
- - name: Set up Ruby
17
- uses: ruby/setup-ruby@v1
27
+ - uses: ruby/setup-ruby@v1
18
28
  with:
19
29
  ruby-version: ${{ matrix.ruby }}
20
- bundler: 1
30
+ bundler: ${{ matrix.bundler }}
21
31
  bundler-cache: true
32
+ - name: Install bundler v1 # Even if we're testing bundler v2, we need v1 available because the fixture components have it in their Gemfile.locks
33
+ run: gem install bundler -v "~> 1" --no-document
22
34
  - name: Install Graphviz
23
35
  run: sudo apt -qq install graphviz
24
36
  - name: Run tests
@@ -28,10 +40,12 @@ jobs:
28
40
  runs-on: ubuntu-latest
29
41
  steps:
30
42
  - uses: actions/checkout@v2
31
- - name: rubocop
32
- uses: reviewdog/action-rubocop@v1
43
+ - uses: ruby/setup-ruby@v1
33
44
  with:
34
- rubocop_version: 0.48.1
45
+ ruby-version: 3.0
46
+ - uses: reviewdog/action-rubocop@v1
47
+ with:
48
+ rubocop_version: 0.88.0
35
49
  filter_mode: nofilter
36
50
  fail_on_error: true
37
51
  rubocop_extensions: ""
@@ -0,0 +1,20 @@
1
+ name: Publish Gem
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ tags:
8
+ - v*
9
+ jobs:
10
+ build:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v1
14
+ - name: Release Gem
15
+ uses: cadwallion/publish-rubygems-action@master
16
+ if: contains(github.ref, 'refs/tags/v')
17
+ env:
18
+ GITHUB_TOKEN: ${{ secrets.github_token }}
19
+ RUBYGEMS_API_KEY: ${{ secrets.rubygems_api_key }}
20
+ RELEASE_COMMAND: rake release
data/.gitignore CHANGED
@@ -13,3 +13,6 @@
13
13
  /spec/fixtures/app/node_manifest/node_modules/
14
14
  /spec/fixtures/app/components/*/node_modules/
15
15
  /tmp/
16
+
17
+ .bundle
18
+ gemfiles/*.lock
data/.rubocop.yml CHANGED
@@ -1,50 +1,20 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.3
3
-
4
- Metrics/LineLength:
5
- Max: 120
2
+ TargetRubyVersion: 2.5
3
+ NewCops: enable
6
4
 
7
5
  Metrics/BlockLength:
8
6
  Exclude:
9
7
  - spec/**/*.rb
10
8
  - cobra_commander.gemspec
11
9
 
12
- Metrics/ClassLength:
13
- Exclude:
14
- - spec/**/*.rb
15
- - cobra_commander.gemspec
16
-
17
- Style/AccessModifierIndentation:
10
+ Layout/AccessModifierIndentation:
18
11
  EnforcedStyle: outdent
19
12
 
20
- Style/Documentation:
21
- Enabled: true
22
-
23
- Style/ExtraSpacing:
24
- Exclude:
25
- - cobra_commander.gemspec
26
-
27
- Style/SpaceAroundOperators:
28
- Exclude:
29
- - cobra_commander.gemspec
30
-
31
- Style/Lambda:
32
- EnforcedStyle: literal
33
-
34
- Style/PercentLiteralDelimiters:
35
- PreferredDelimiters:
36
- default: ()
37
- '%i': '[]'
38
- '%I': '[]'
39
- '%r': '{}'
40
- '%w': '[]'
41
- '%W': '[]'
42
-
43
- # Single quotes being faster is hardly measurable and only affects parse time.
44
- # Enforcing double quotes reduces the times where you need to change them when introducing an interpolation.
45
- # Use single quotes only if their semantics are needed.
46
13
  Style/StringLiterals:
47
14
  EnforcedStyle: double_quotes
48
15
 
49
- Style/TrailingCommaInLiteral:
50
- EnforcedStyleForMultiline: comma
16
+ Style/TrailingCommaInArrayLiteral:
17
+ EnforcedStyleForMultiline: consistent_comma
18
+
19
+ Style/TrailingCommaInHashLiteral:
20
+ EnforcedStyleForMultiline: consistent_comma
data/CHANGELOG.md CHANGED
@@ -2,6 +2,29 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## Version 0.11.0 - 2021-04-23
6
+
7
+ * Add concurrency limit to multi exec [#57](https://github.com/powerhome/cobra_commander/pull/57)
8
+ * Ruby 3.0 compatibility [#55](https://github.com/powerhome/cobra_commander/pull/55)
9
+
10
+ ## Version 0.10.0 - 2021-02-25
11
+
12
+ * Add support for Bundler 2 [#54](https://github.com/powerhome/cobra_commander/pull/54)
13
+ * Add support for Ruby 2.7 [#53](https://github.com/powerhome/cobra_commander/pull/53)
14
+
15
+ ## Version 0.9.2 -
16
+
17
+ * Another fix for binstubs [#51](https://github.com/powerhome/cobra_commander/pull/51)
18
+
19
+ ## Version 0.9.1 -
20
+
21
+ * Replace bundler encapsulation violation by LockfileParser [#48](https://github.com/powerhome/cobra_commander/pull/48)
22
+ * Fix bundle binstubs [#50](https://github.com/powerhome/cobra_commander/pull/50)
23
+
24
+ ## Version 0.9.0 - 2020-08-26
25
+
26
+ * Add support for parallel task execution to `cobra exec` [#49](https://github.com/powerhome/cobra_commander/pull/49)
27
+
5
28
  ## Version 0.8.1 - 2020-07-29
6
29
 
7
30
  * Fix CobraCommander::Executor when running [`bundler`](https://bundler.io/) based commands (i.e.: `bundle exec rspec`)
data/Gemfile CHANGED
@@ -2,5 +2,4 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- # Specify your gem's dependencies in cbra.gemspec
6
5
  gemspec
data/README.md CHANGED
@@ -2,11 +2,10 @@
2
2
 
3
3
  [![Gem](https://img.shields.io/gem/dv/cobra_commander/stable.svg)](https://rubygems.org/gems/cobra_commander)
4
4
  [![Gem](https://img.shields.io/gem/v/cobra_commander.svg)](https://rubygems.org/gems/cobra_commander)
5
- [![Travis](https://img.shields.io/travis/powerhome/cobra_commander.svg)](https://travis-ci.org/powerhome/cobra_commander)
6
- [![Code Climate](https://img.shields.io/codeclimate/github/powerhome/cobra_commander.svg)](https://codeclimate.com/github/powerhome/cobra_commander)
7
- [![Gemnasium](https://img.shields.io/gemnasium/powerhome/cobra_commander.svg)](https://gemnasium.com/github.com/powerhome/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)
8
7
 
9
- Tools for working with Component Based Rails Apps (see http://shageman.github.io/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.
8
+ 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.
10
9
 
11
10
  ## Installation
12
11
 
@@ -1,7 +1,6 @@
1
- # coding: utf-8
2
1
  # frozen_string_literal: true
3
2
 
4
- lib = File.expand_path("../lib", __FILE__)
3
+ lib = File.expand_path("lib", __dir__)
5
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
5
  require "cobra_commander/version"
7
6
 
@@ -13,7 +12,7 @@ Gem::Specification.new do |spec|
13
12
  "Garett Arrowood",
14
13
  "Carlos Palhares",
15
14
  ]
16
- spec.email = [
15
+ spec.email = [
17
16
  "blangfeld@powerhrg.com",
18
17
  "garett.arrowood@powerhrg.com",
19
18
  "carlos.palhares@powerhrg.com",
@@ -23,7 +22,7 @@ Gem::Specification.new do |spec|
23
22
  Tools for working with Component Based Rails Apps (see http://shageman.github.io/cbra.info/).
24
23
  Includes tools for graphing the components of an app and their relationships, as well as selectively
25
24
  testing components based on changes made.
26
- DESCRIPTION
25
+ DESCRIPTION
27
26
  spec.homepage = "http://tech.powerhrg.com/cobra_commander/"
28
27
  spec.license = "MIT"
29
28
 
@@ -34,15 +33,18 @@ DESCRIPTION
34
33
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
35
34
  spec.require_paths = ["lib"]
36
35
 
37
- spec.add_dependency "bundler", "~> 1.17"
38
- spec.add_dependency "thor", ["< 2.0", ">= 0.18.1"]
36
+ spec.add_dependency "bundler"
37
+ spec.add_dependency "concurrent-ruby", "~> 1.1"
39
38
  spec.add_dependency "ruby-graphviz", "~> 1.2.3"
39
+ spec.add_dependency "thor", ["< 2.0", ">= 0.18.1"]
40
+ spec.add_dependency "tty-command", "~> 0.10.0"
41
+ spec.add_dependency "tty-spinner", "~> 0.9.3"
40
42
 
41
- spec.add_development_dependency "bundler", "~> 1.17"
42
- spec.add_development_dependency "rake", "~> 10.0"
43
- spec.add_development_dependency "rspec", "~> 3.5"
44
- spec.add_development_dependency "guard-rspec"
45
43
  spec.add_development_dependency "aruba", "~> 0.14.2"
46
- spec.add_development_dependency "rubocop", "0.48.1"
44
+ spec.add_development_dependency "bundler"
45
+ spec.add_development_dependency "guard-rspec"
47
46
  spec.add_development_dependency "pry"
47
+ spec.add_development_dependency "rake", ">= 12.3.3"
48
+ spec.add_development_dependency "rspec", "~> 3.5"
49
+ spec.add_development_dependency "rubocop", "0.88.0"
48
50
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gemspec path: "../"
6
+
7
+ gem "bundler", "~> 1.17.3"
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gemspec path: "../"
6
+
7
+ gem "bundler", "~> 2.2.11"
@@ -42,16 +42,16 @@ module CobraCommander
42
42
  Open3.capture3("git", "diff", "--name-only", @branch)
43
43
  end
44
44
 
45
- if result.exitstatus == 128
46
- raise InvalidSelectionError, "Specified --branch could not be found"
47
- end
45
+ raise InvalidSelectionError, "Specified --branch could not be found" if result.exitstatus == 128
48
46
 
49
47
  diff.split("\n").map { |f| File.join(@root_dir, f) }
50
48
  end
51
49
  end
52
50
 
53
51
  def assert_valid_result_choice
54
- raise InvalidSelectionError, "--results must be 'test', 'full', 'name' or 'json'" unless %w[test full name json].include?(@results) # rubocop:disable Metrics/LineLength
52
+ return if %w[test full name json].include?(@results)
53
+
54
+ raise InvalidSelectionError, "--results must be 'test', 'full', 'name' or 'json'"
55
55
  end
56
56
 
57
57
  def selected_result?(result)
@@ -66,13 +66,13 @@ module CobraCommander
66
66
 
67
67
  def directly_affected_components
68
68
  puts "<<< Directly affected components >>>"
69
- @affected.directly.each { |component| puts display(component) }
69
+ @affected.directly.each { |component| puts display(**component) }
70
70
  puts blank_line
71
71
  end
72
72
 
73
73
  def transitively_affected_components
74
74
  puts "<<< Transitively affected components >>>"
75
- @affected.transitively.each { |component| puts display(component) }
75
+ @affected.transitively.each { |component| puts display(**component) }
76
76
  puts blank_line
77
77
  end
78
78
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "thor"
4
4
  require "fileutils"
5
+ require "concurrent-ruby"
5
6
 
6
7
  require "cobra_commander"
7
8
  require "cobra_commander/affected"
@@ -12,6 +13,8 @@ require "cobra_commander/output"
12
13
  module CobraCommander
13
14
  # Implements the tool's CLI
14
15
  class CLI < Thor
16
+ DEFAULT_CONCURRENCY = (Concurrent.processor_count / 2.0).ceil
17
+
15
18
  class_option :app, default: Dir.pwd, aliases: "-a", type: :string
16
19
  class_option :js, default: false, type: :boolean, desc: "Consider only the JS dependency graph"
17
20
  class_option :ruby, default: false, type: :boolean, desc: "Consider only the Ruby dependency graph"
@@ -36,10 +39,13 @@ module CobraCommander
36
39
  "Defaults to all components."
37
40
  method_option :dependencies, type: :boolean, desc: "Run the command on each dependency of a given component"
38
41
  method_option :dependents, type: :boolean, desc: "Run the command on each dependency of a given component"
42
+ method_option :concurrency, type: :numeric, default: DEFAULT_CONCURRENCY, aliases: "-c",
43
+ desc: "Max number of jobs to run concurrently"
39
44
  def exec(command_or_component, command = nil)
40
45
  CobraCommander::Executor.exec(
41
- components_filtered(command && command_or_component),
42
- command ? command : command_or_component
46
+ components: components_filtered(command && command_or_component),
47
+ command: command || command_or_component,
48
+ concurrency: options.concurrency
43
49
  )
44
50
  end
45
51
 
@@ -58,8 +64,8 @@ module CobraCommander
58
64
  options.output
59
65
  )
60
66
  puts "Graph generated at #{options.output}"
61
- rescue ArgumentError => error
62
- error error.message
67
+ rescue ArgumentError => e
68
+ error e.message
63
69
  end
64
70
 
65
71
  desc "changes [--results=RESULTS] [--branch=BRANCH]", "Prints list of changed files"
@@ -83,10 +89,12 @@ module CobraCommander
83
89
 
84
90
  def components_filtered(component_name)
85
91
  return umbrella.components unless component_name
92
+
86
93
  component = find_component(component_name)
87
94
 
88
95
  return component.deep_dependencies if options.dependencies
89
96
  return component.deep_dependents if options.dependents
97
+
90
98
  [component]
91
99
  end
92
100
  end
@@ -3,7 +3,7 @@
3
3
  module CobraCommander
4
4
  # Represents a component withing an Umbrella
5
5
  class Component
6
- attr_reader :name, :dependencies, :sources
6
+ attr_reader :name, :sources
7
7
 
8
8
  def initialize(umbrella, name)
9
9
  @umbrella = umbrella
@@ -1,23 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "bundler"
4
+ require "bundler/lockfile_parser"
5
+ require "pathname"
6
+
3
7
  module CobraCommander
4
8
  module Dependencies
5
9
  # Calculates ruby bundler dependencies
6
10
  class Bundler
7
- def initialize(root)
8
- @definition = ::Bundler::Definition.build(
9
- Pathname.new(File.join(root, "Gemfile")).realpath,
10
- Pathname.new(File.join(root, "Gemfile.lock")).realpath,
11
- false
12
- )
13
- end
11
+ attr_reader :path
14
12
 
15
- def path
16
- @definition.lockfile
13
+ def initialize(root)
14
+ @root = Pathname.new(root)
15
+ @path = @root.join("Gemfile.lock").realpath
17
16
  end
18
17
 
19
18
  def dependencies
20
- @definition.dependencies.map(&:name)
19
+ lockfile.dependencies.values.map(&:name)
21
20
  end
22
21
 
23
22
  def components
@@ -28,9 +27,14 @@ module CobraCommander
28
27
 
29
28
  private
30
29
 
30
+ def lockfile
31
+ @lockfile ||= ::Bundler::LockfileParser.new(::Bundler.read_file(path))
32
+ end
33
+
31
34
  def components_source
32
- @components_source ||= @definition.send(:sources).path_sources.find do |source|
33
- source.path.to_s.eql?("components")
35
+ @components_source ||= begin
36
+ source = @lockfile.sources.find { |s| s.path.to_s.eql?("components") }
37
+ ::Bundler::Source::Path.new(source.options.merge("root_path" => @root))
34
38
  end
35
39
  end
36
40
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "json"
4
+ require "pathname"
4
5
 
5
6
  module CobraCommander
6
7
  module Dependencies
@@ -10,11 +11,11 @@ module CobraCommander
10
11
  attr_reader :path
11
12
 
12
13
  def initialize(path)
13
- @path = Pathname.new(File.join(path, "package.json")).realpath
14
+ @path = ::Pathname.new(File.join(path, "package.json")).realpath
14
15
  end
15
16
 
16
17
  def project_tag
17
- name.match(%r{^@[\w-]+\/}).to_s
18
+ name.match(%r{^@[\w-]+/}).to_s
18
19
  end
19
20
 
20
21
  def name
@@ -6,7 +6,7 @@ module CobraCommander
6
6
  # Yarn package repository to load and cache package.json files
7
7
  class PackageRepo
8
8
  def initialize
9
- @specs ||= {}
9
+ @specs = {}
10
10
  end
11
11
 
12
12
  def specs
@@ -14,8 +14,9 @@ module CobraCommander
14
14
  end
15
15
 
16
16
  def load_linked_specs(package)
17
- package.dependencies.values.each do |spec|
17
+ package.dependencies.each_value do |spec|
18
18
  next unless spec =~ /link:(.+)/
19
+
19
20
  load_spec(File.join(package.path, "..", Regexp.last_match(1)))
20
21
  end
21
22
  end
@@ -1,18 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "executor/component_exec"
4
+ require_relative "executor/multi_exec"
5
+
3
6
  module CobraCommander
4
7
  # Execute commands on all components of a ComponentTree
5
8
  module Executor
6
- def self.exec(components, command, printer = $stdout)
7
- Bundler.with_original_env do
8
- components.each do |component|
9
- component.root_paths.each do |path|
10
- printer.puts "===> #{component.name} (#{path})"
11
- output, = Open3.capture2e(command, chdir: path)
12
- printer.puts output
13
- end
14
- end
15
- end
9
+ def self.exec(components:, command:, concurrency:, output: $stdout, status_output: $stderr)
10
+ components = Array(components)
11
+ exec = if components.size == 1
12
+ ComponentExec.new(components.first)
13
+ else
14
+ MultiExec.new(components, concurrency: concurrency, spin_output: status_output)
15
+ end
16
+ exec.run(command, output: output)
16
17
  end
17
18
  end
18
19
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tty-command"
4
+
5
+ module CobraCommander
6
+ module Executor
7
+ # Execute a command on a single component
8
+ class ComponentExec
9
+ def initialize(component)
10
+ @component = component
11
+ end
12
+
13
+ def run(command, output: $stdout, **cmd_options)
14
+ tty = TTY::Command.new(pty: true, printer: :quiet, output: output)
15
+ isolate_bundle do
16
+ @component.root_paths.all? do |path|
17
+ tty.run!(command, chdir: path, **cmd_options).success?
18
+ end
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def isolate_bundle(&block)
25
+ if Bundler.respond_to?(:with_unbundled_env)
26
+ Bundler.with_unbundled_env(&block)
27
+ else
28
+ Bundler.with_clean_env(&block)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tty-spinner"
4
+ require "stringio"
5
+ require "concurrent-ruby"
6
+
7
+ require_relative "component_exec"
8
+
9
+ module CobraCommander
10
+ module Executor
11
+ # Execute a command on multiple components
12
+ class MultiExec
13
+ def initialize(components, concurrency:, spin_output: $stderr)
14
+ @components = components
15
+ @multi = TTY::Spinner::Multi.new(":spinner :task", output: spin_output)
16
+ @semaphore = Concurrent::Semaphore.new(concurrency)
17
+ end
18
+
19
+ def run(command, output: $stdout, **kwargs)
20
+ buffer = StringIO.new
21
+ @multi.top_spinner.update(task: "Running #{command}")
22
+ @components.each do |component|
23
+ register_job(command: command, component: component,
24
+ output: buffer, stderr: :stdout,
25
+ only_output_on_error: true, **kwargs)
26
+ end
27
+ @multi.auto_spin
28
+ output << buffer.string
29
+ @multi.success?
30
+ end
31
+
32
+ private
33
+
34
+ def pastel
35
+ @pastel ||= Pastel.new
36
+ end
37
+
38
+ def spinner_options
39
+ @spinner_options ||= {
40
+ format: :bouncing,
41
+ success_mark: pastel.green("[DONE]"),
42
+ error_mark: pastel.red("[ERROR]"),
43
+ }
44
+ end
45
+
46
+ def register_job(component:, command:, **kwargs)
47
+ @multi.register(":spinner #{component.name}", **spinner_options) do |spinner|
48
+ @semaphore.acquire
49
+ exec = ComponentExec.new(component)
50
+ if exec.run(command, **kwargs)
51
+ spinner.success
52
+ else
53
+ spinner.error
54
+ end
55
+ @semaphore.release
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -18,7 +18,7 @@ module CobraCommander
18
18
 
19
19
  private_class_method def self.extract_format(output)
20
20
  format = output[-3..-1]
21
- return format if format == "png" || format == "dot"
21
+ return format if %w[png dot].include?(format)
22
22
 
23
23
  raise ArgumentError, "output format must be 'png' or 'dot'"
24
24
  end
@@ -21,6 +21,7 @@ module CobraCommander
21
21
 
22
22
  def resolve(component_root_path)
23
23
  return root if root.root_paths.include?(component_root_path)
24
+
24
25
  components.find do |component|
25
26
  component.root_paths.include?(component_root_path)
26
27
  end
@@ -28,9 +29,9 @@ module CobraCommander
28
29
 
29
30
  def add_source(key, source)
30
31
  @root_component.add_source key, source.path, source.dependencies
31
- source.components.each do |path:, name:, dependencies:|
32
- @components[name] ||= Component.new(self, name)
33
- @components[name].add_source key, path, dependencies
32
+ source.components.each do |component|
33
+ @components[component[:name]] ||= Component.new(self, component[:name])
34
+ @components[component[:name]].add_source key, component[:path], component[:dependencies]
34
35
  end
35
36
  end
36
37
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CobraCommander
4
- VERSION = "0.8.1"
4
+ VERSION = "0.11.0"
5
5
  end
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.8.1
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Langfeld
@@ -10,98 +10,126 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2020-07-29 00:00:00.000000000 Z
13
+ date: 2021-04-23 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: concurrent-ruby
17
31
  requirement: !ruby/object:Gem::Requirement
18
32
  requirements:
19
33
  - - "~>"
20
34
  - !ruby/object:Gem::Version
21
- version: '1.17'
35
+ version: '1.1'
22
36
  type: :runtime
23
37
  prerelease: false
24
38
  version_requirements: !ruby/object:Gem::Requirement
25
39
  requirements:
26
40
  - - "~>"
27
41
  - !ruby/object:Gem::Version
28
- version: '1.17'
42
+ version: '1.1'
29
43
  - !ruby/object:Gem::Dependency
30
- name: thor
44
+ name: ruby-graphviz
31
45
  requirement: !ruby/object:Gem::Requirement
32
46
  requirements:
33
- - - "<"
34
- - !ruby/object:Gem::Version
35
- version: '2.0'
36
- - - ">="
47
+ - - "~>"
37
48
  - !ruby/object:Gem::Version
38
- version: 0.18.1
49
+ version: 1.2.3
39
50
  type: :runtime
40
51
  prerelease: false
41
52
  version_requirements: !ruby/object:Gem::Requirement
42
53
  requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: 1.2.3
57
+ - !ruby/object:Gem::Dependency
58
+ name: thor
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: 0.18.1
43
64
  - - "<"
44
65
  - !ruby/object:Gem::Version
45
66
  version: '2.0'
67
+ type: :runtime
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
46
71
  - - ">="
47
72
  - !ruby/object:Gem::Version
48
73
  version: 0.18.1
74
+ - - "<"
75
+ - !ruby/object:Gem::Version
76
+ version: '2.0'
49
77
  - !ruby/object:Gem::Dependency
50
- name: ruby-graphviz
78
+ name: tty-command
51
79
  requirement: !ruby/object:Gem::Requirement
52
80
  requirements:
53
81
  - - "~>"
54
82
  - !ruby/object:Gem::Version
55
- version: 1.2.3
83
+ version: 0.10.0
56
84
  type: :runtime
57
85
  prerelease: false
58
86
  version_requirements: !ruby/object:Gem::Requirement
59
87
  requirements:
60
88
  - - "~>"
61
89
  - !ruby/object:Gem::Version
62
- version: 1.2.3
90
+ version: 0.10.0
63
91
  - !ruby/object:Gem::Dependency
64
- name: bundler
92
+ name: tty-spinner
65
93
  requirement: !ruby/object:Gem::Requirement
66
94
  requirements:
67
95
  - - "~>"
68
96
  - !ruby/object:Gem::Version
69
- version: '1.17'
70
- type: :development
97
+ version: 0.9.3
98
+ type: :runtime
71
99
  prerelease: false
72
100
  version_requirements: !ruby/object:Gem::Requirement
73
101
  requirements:
74
102
  - - "~>"
75
103
  - !ruby/object:Gem::Version
76
- version: '1.17'
104
+ version: 0.9.3
77
105
  - !ruby/object:Gem::Dependency
78
- name: rake
106
+ name: aruba
79
107
  requirement: !ruby/object:Gem::Requirement
80
108
  requirements:
81
109
  - - "~>"
82
110
  - !ruby/object:Gem::Version
83
- version: '10.0'
111
+ version: 0.14.2
84
112
  type: :development
85
113
  prerelease: false
86
114
  version_requirements: !ruby/object:Gem::Requirement
87
115
  requirements:
88
116
  - - "~>"
89
117
  - !ruby/object:Gem::Version
90
- version: '10.0'
118
+ version: 0.14.2
91
119
  - !ruby/object:Gem::Dependency
92
- name: rspec
120
+ name: bundler
93
121
  requirement: !ruby/object:Gem::Requirement
94
122
  requirements:
95
- - - "~>"
123
+ - - ">="
96
124
  - !ruby/object:Gem::Version
97
- version: '3.5'
125
+ version: '0'
98
126
  type: :development
99
127
  prerelease: false
100
128
  version_requirements: !ruby/object:Gem::Requirement
101
129
  requirements:
102
- - - "~>"
130
+ - - ">="
103
131
  - !ruby/object:Gem::Version
104
- version: '3.5'
132
+ version: '0'
105
133
  - !ruby/object:Gem::Dependency
106
134
  name: guard-rspec
107
135
  requirement: !ruby/object:Gem::Requirement
@@ -117,47 +145,61 @@ dependencies:
117
145
  - !ruby/object:Gem::Version
118
146
  version: '0'
119
147
  - !ruby/object:Gem::Dependency
120
- name: aruba
148
+ name: pry
121
149
  requirement: !ruby/object:Gem::Requirement
122
150
  requirements:
123
- - - "~>"
151
+ - - ">="
124
152
  - !ruby/object:Gem::Version
125
- version: 0.14.2
153
+ version: '0'
126
154
  type: :development
127
155
  prerelease: false
128
156
  version_requirements: !ruby/object:Gem::Requirement
129
157
  requirements:
130
- - - "~>"
158
+ - - ">="
131
159
  - !ruby/object:Gem::Version
132
- version: 0.14.2
160
+ version: '0'
133
161
  - !ruby/object:Gem::Dependency
134
- name: rubocop
162
+ name: rake
135
163
  requirement: !ruby/object:Gem::Requirement
136
164
  requirements:
137
- - - '='
165
+ - - ">="
138
166
  - !ruby/object:Gem::Version
139
- version: 0.48.1
167
+ version: 12.3.3
140
168
  type: :development
141
169
  prerelease: false
142
170
  version_requirements: !ruby/object:Gem::Requirement
143
171
  requirements:
144
- - - '='
172
+ - - ">="
145
173
  - !ruby/object:Gem::Version
146
- version: 0.48.1
174
+ version: 12.3.3
147
175
  - !ruby/object:Gem::Dependency
148
- name: pry
176
+ name: rspec
149
177
  requirement: !ruby/object:Gem::Requirement
150
178
  requirements:
151
- - - ">="
179
+ - - "~>"
152
180
  - !ruby/object:Gem::Version
153
- version: '0'
181
+ version: '3.5'
154
182
  type: :development
155
183
  prerelease: false
156
184
  version_requirements: !ruby/object:Gem::Requirement
157
185
  requirements:
158
- - - ">="
186
+ - - "~>"
159
187
  - !ruby/object:Gem::Version
160
- version: '0'
188
+ version: '3.5'
189
+ - !ruby/object:Gem::Dependency
190
+ name: rubocop
191
+ requirement: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - '='
194
+ - !ruby/object:Gem::Version
195
+ version: 0.88.0
196
+ type: :development
197
+ prerelease: false
198
+ version_requirements: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - '='
201
+ - !ruby/object:Gem::Version
202
+ version: 0.88.0
161
203
  description: |
162
204
  Tools for working with Component Based Rails Apps (see http://shageman.github.io/cbra.info/).
163
205
  Includes tools for graphing the components of an app and their relationships, as well as selectively
@@ -173,10 +215,10 @@ extra_rdoc_files: []
173
215
  files:
174
216
  - ".editorconfig"
175
217
  - ".github/workflows/ci.yml"
218
+ - ".github/workflows/release.yml"
176
219
  - ".gitignore"
177
220
  - ".rspec"
178
221
  - ".rubocop.yml"
179
- - ".travis.yml"
180
222
  - CHANGELOG.md
181
223
  - CODE_OF_CONDUCT.md
182
224
  - Gemfile
@@ -189,6 +231,8 @@ files:
189
231
  - bin/setup
190
232
  - cobra_commander.gemspec
191
233
  - exe/cobra
234
+ - gemfiles/bundler1.gemfile
235
+ - gemfiles/bundler2.gemfile
192
236
  - lib/cobra_commander.rb
193
237
  - lib/cobra_commander/affected.rb
194
238
  - lib/cobra_commander/change.rb
@@ -200,6 +244,8 @@ files:
200
244
  - lib/cobra_commander/dependencies/yarn/package_repo.rb
201
245
  - lib/cobra_commander/dependencies/yarn_workspace.rb
202
246
  - lib/cobra_commander/executor.rb
247
+ - lib/cobra_commander/executor/component_exec.rb
248
+ - lib/cobra_commander/executor/multi_exec.rb
203
249
  - lib/cobra_commander/output.rb
204
250
  - lib/cobra_commander/output/ascii_tree.rb
205
251
  - lib/cobra_commander/output/flat_list.rb
@@ -226,8 +272,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
226
272
  - !ruby/object:Gem::Version
227
273
  version: '0'
228
274
  requirements: []
229
- rubyforge_project:
230
- rubygems_version: 2.7.3
275
+ rubygems_version: 3.0.3
231
276
  signing_key:
232
277
  specification_version: 4
233
278
  summary: Tools for working with Component Based Rails Apps
data/.travis.yml DELETED
@@ -1,12 +0,0 @@
1
- sudo: true
2
- language: ruby
3
- before_install:
4
- - "find /home/travis/.rvm/rubies -wholename '*default/bundler-*.gemspec' -delete"
5
- - gem install bundler:"$BUNDLER_VERSION"
6
- - sudo apt-get -qq install graphviz
7
- - curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0
8
- - export PATH="$HOME/.yarn/bin:$PATH"
9
- rvm:
10
- - 2.5.1
11
- env:
12
- - BUNDLER_VERSION=1.17.3