monoz 0.4.1 → 0.5.1
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/lib/monoz/action.rb +28 -0
- data/lib/monoz/action_collection.rb +39 -0
- data/lib/monoz/application.rb +7 -1
- data/lib/monoz/project_collection.rb +1 -1
- data/lib/monoz/services/action_service.rb +36 -0
- data/lib/monoz/services/run_service.rb +77 -108
- data/lib/monoz/spinner.rb +64 -0
- data/lib/monoz/version.rb +1 -1
- data/lib/monoz.rb +18 -21
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6625aa97c175ce57eaff342c214f583d6ab09487d097b578ceedabfe6363cbdd
|
4
|
+
data.tar.gz: 145ca2d3ac1e2d07fc4ec4a10b2e560ab7724d5544d270ce5ea3eb5ebbbdfbda
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c59650aab90cb11f99e137433da29d74fa67de8ae9242edca28b8b68abb25b2358f3952bd47337a8ebb8cb97183b773890142905bbe81772c4a8dc7c72e16c5
|
7
|
+
data.tar.gz: 250473dcdb394005cb58cd4413c7f2eb5103e4ce0935f098e4f85b6a8cebceb0be1789db1dda1f300422d3778d6f07f1929e1b93b0cacee73b574c36c6400416
|
data/lib/monoz/action.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Monoz
|
4
|
+
class ActionCommand
|
5
|
+
attr_reader :filter, :command
|
6
|
+
def initialize(filter, command)
|
7
|
+
@filter = filter
|
8
|
+
@command = command
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class Action
|
13
|
+
attr_reader :name, :commands
|
14
|
+
|
15
|
+
def initialize(name, raw_commands)
|
16
|
+
@name = name
|
17
|
+
@commands = []
|
18
|
+
parse_commands(raw_commands)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def parse_commands(raw_commands)
|
23
|
+
raw_commands.each do |command|
|
24
|
+
@commands << Monoz::ActionCommand.new(command.dig("in"), command.dig("run"))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/core_ext/module/delegation"
|
4
|
+
|
5
|
+
module Monoz
|
6
|
+
class ActionCollection
|
7
|
+
include Enumerable
|
8
|
+
delegate_missing_to :@items
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@items = []
|
12
|
+
populate_items
|
13
|
+
end
|
14
|
+
|
15
|
+
def exist?(name)
|
16
|
+
!!find(name)
|
17
|
+
end
|
18
|
+
|
19
|
+
def find(name)
|
20
|
+
@items.select { |i| i.name == name.to_s }&.first
|
21
|
+
end
|
22
|
+
|
23
|
+
def all
|
24
|
+
@items
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
def populate_items
|
29
|
+
actions = Monoz.config.dig("actions")
|
30
|
+
return if actions.empty?
|
31
|
+
|
32
|
+
raise "Invalid format, actions must be a hash." unless actions.is_a?(Hash)
|
33
|
+
|
34
|
+
actions.each do |action_name, config_raw_data|
|
35
|
+
@items << Monoz::Action.new(action_name, config_raw_data)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/monoz/application.rb
CHANGED
@@ -6,7 +6,7 @@ require "fileutils"
|
|
6
6
|
|
7
7
|
module Monoz
|
8
8
|
class Application < Thor
|
9
|
-
class_option :
|
9
|
+
class_option :verbose, type: :boolean, aliases: ["--tty", "-t"], default: false
|
10
10
|
class_option :filter
|
11
11
|
|
12
12
|
def initialize(*args)
|
@@ -49,5 +49,11 @@ module Monoz
|
|
49
49
|
def version
|
50
50
|
say "Monoz version: #{Monoz::VERSION}"
|
51
51
|
end
|
52
|
+
|
53
|
+
# This method will be called when a command is not found
|
54
|
+
desc "[ACTION]", "Custom action"
|
55
|
+
def method_missing(action_name, *args)
|
56
|
+
Monoz::Services::ActionService.new(self).call(action_name)
|
57
|
+
end
|
52
58
|
end
|
53
59
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "yaml"
|
4
|
+
require "fileutils"
|
5
|
+
|
6
|
+
module Monoz
|
7
|
+
module Services
|
8
|
+
class ActionService < Monoz::Services::BaseService
|
9
|
+
def call(action)
|
10
|
+
@action = Monoz.actions.find(action)
|
11
|
+
say_invalid_action(action) if @action.nil?
|
12
|
+
Monoz.verbose = true
|
13
|
+
run_action
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
def run_action
|
18
|
+
say "Running Monoz action: "
|
19
|
+
say @action.name, [:bold, :blue]
|
20
|
+
|
21
|
+
@action.commands.each do |action_command|
|
22
|
+
projects = Monoz.projects.filter(action_command.filter).order(:dependants)
|
23
|
+
command = action_command.command.split(" ")
|
24
|
+
Monoz::Services::RunService.new(self).call(projects, *command)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def say_invalid_action(cmd_or_action)
|
29
|
+
say "Error: The command or action ", :red
|
30
|
+
say "#{cmd_or_action} ", [:red, :bold]
|
31
|
+
say "does not exist.", [:red]
|
32
|
+
exit(1)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -2,68 +2,26 @@
|
|
2
2
|
|
3
3
|
require "yaml"
|
4
4
|
require "fileutils"
|
5
|
-
require "
|
5
|
+
require "pty"
|
6
6
|
|
7
7
|
module Monoz
|
8
|
-
|
9
|
-
|
8
|
+
module Responses
|
9
|
+
class RunServiceResponse
|
10
|
+
attr_reader :output, :exit_code
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
@prefix = prefix
|
15
|
-
end
|
16
|
-
|
17
|
-
def start
|
18
|
-
@spinner = main
|
19
|
-
self
|
20
|
-
end
|
21
|
-
|
22
|
-
def success!
|
23
|
-
@spinner.kill
|
24
|
-
say_formatted(" \u2713 ", [:bold, :green])
|
25
|
-
say() # line break
|
26
|
-
end
|
27
|
-
|
28
|
-
def error!
|
29
|
-
@spinner.kill
|
30
|
-
say_formatted(" \u2717 ", [:bold, :red])
|
31
|
-
say() # line break
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
def reset
|
36
|
-
say("\r", nil, false)
|
12
|
+
def initialize(output, exit_code)
|
13
|
+
@output = output
|
14
|
+
@exit_code = exit_code
|
37
15
|
end
|
38
16
|
|
39
|
-
def
|
40
|
-
|
41
|
-
say "\r[#{@prefix}] ", [:blue, :bold], nil
|
42
|
-
say @message, nil, false
|
43
|
-
say suffix, suffix_formatting, false
|
44
|
-
else
|
45
|
-
say "\r#{@message}", nil, false
|
46
|
-
say suffix, suffix_formatting, false
|
47
|
-
end
|
17
|
+
def success?
|
18
|
+
exit_code == 0
|
48
19
|
end
|
49
20
|
|
50
|
-
def
|
51
|
-
|
52
|
-
|
53
|
-
Thread.new do
|
54
|
-
loop do
|
55
|
-
dots = case spinner_count % 3
|
56
|
-
when 0 then "."
|
57
|
-
when 1 then ".."
|
58
|
-
when 2 then "..."
|
59
|
-
end
|
60
|
-
|
61
|
-
say_formatted(dots)
|
62
|
-
spinner_count += 1
|
63
|
-
sleep(0.5)
|
64
|
-
end
|
65
|
-
end
|
21
|
+
def failed?
|
22
|
+
!!success?
|
66
23
|
end
|
24
|
+
end
|
67
25
|
end
|
68
26
|
|
69
27
|
module Services
|
@@ -71,27 +29,17 @@ module Monoz
|
|
71
29
|
attr_reader :errors, :warnings
|
72
30
|
|
73
31
|
def initialize(thor_instance)
|
32
|
+
super(thor_instance)
|
74
33
|
@projects = nil
|
75
34
|
@errors = []
|
76
35
|
@warnings = []
|
77
|
-
|
78
|
-
end
|
79
|
-
|
80
|
-
def success?
|
81
|
-
!errors? && !warnings?
|
82
|
-
end
|
83
|
-
|
84
|
-
def errors?
|
85
|
-
@errors.any?
|
86
|
-
end
|
87
|
-
|
88
|
-
def warnings?
|
89
|
-
@warnings.any?
|
36
|
+
@command = []
|
90
37
|
end
|
91
38
|
|
92
39
|
def call(projects, *command)
|
93
|
-
raise ArgumentError
|
40
|
+
raise ArgumentError, "Missing command" if command.empty?
|
94
41
|
|
42
|
+
@command = command
|
95
43
|
if projects.is_a?(Monoz::ProjectCollection)
|
96
44
|
@projects = projects.all
|
97
45
|
elsif projects.is_a?(Monoz::Project)
|
@@ -100,37 +48,16 @@ module Monoz
|
|
100
48
|
raise "Invalid projects"
|
101
49
|
end
|
102
50
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
if Monoz.tty?
|
108
|
-
say "[#{project.name}] ", [:blue, :bold], nil
|
109
|
-
say command.join(" ")
|
110
|
-
else
|
111
|
-
spinner = Monoz::Spinner.new(command.join(" "), prefix: project.name).start
|
112
|
-
end
|
113
|
-
|
114
|
-
response = run_commands_in_project(project, *command)
|
115
|
-
|
116
|
-
if response.success?
|
117
|
-
spinner.success! unless Monoz.tty?
|
118
|
-
else
|
119
|
-
spinner.error! unless Monoz.tty?
|
120
|
-
say response.output
|
121
|
-
say "" # line break
|
122
|
-
@errors << {
|
123
|
-
project: project.name,
|
124
|
-
command: command.join(" "),
|
125
|
-
exit_code: response.exit_code,
|
126
|
-
output: response.output
|
127
|
-
}
|
128
|
-
end
|
129
|
-
end
|
51
|
+
say "Running ", nil, false
|
52
|
+
say command.join(" "), [:bold], false
|
53
|
+
say " in #{@projects.map { |p| p.name }.join(", ")}:"
|
130
54
|
|
55
|
+
say ""
|
56
|
+
run_commands
|
131
57
|
say ""
|
132
58
|
|
133
59
|
if errors?
|
60
|
+
say ""
|
134
61
|
say "Error: The command ", :red
|
135
62
|
say "#{command.join(" ")} ", [:red, :bold]
|
136
63
|
say "failed to run in one or more project directories", [:red]
|
@@ -138,32 +65,74 @@ module Monoz
|
|
138
65
|
end
|
139
66
|
end
|
140
67
|
|
68
|
+
def success?
|
69
|
+
!errors? && !warnings?
|
70
|
+
end
|
71
|
+
|
72
|
+
def errors?
|
73
|
+
@errors.any?
|
74
|
+
end
|
75
|
+
|
76
|
+
def warnings?
|
77
|
+
@warnings.any?
|
78
|
+
end
|
79
|
+
|
141
80
|
private
|
142
|
-
def
|
143
|
-
|
81
|
+
def run_commands
|
82
|
+
@projects.each do |project|
|
83
|
+
if spinner?
|
84
|
+
spinner = Monoz::Spinner.new(@command.join(" "), prefix: project.name).start
|
85
|
+
else
|
86
|
+
say "[#{project.name}] ", [:blue, :bold], nil
|
87
|
+
say @command.join(" ")
|
88
|
+
end
|
89
|
+
|
90
|
+
response = run_in_project(project, *@command)
|
91
|
+
|
92
|
+
if response.success?
|
93
|
+
spinner&.success! if spinner?
|
94
|
+
else
|
95
|
+
spinner&.error! if spinner?
|
96
|
+
say response.output
|
97
|
+
say "" # line break
|
98
|
+
@errors << {
|
99
|
+
project: project.name,
|
100
|
+
command: @command.join(" "),
|
101
|
+
exit_code: response.exit_code,
|
102
|
+
output: response.output
|
103
|
+
}
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def spinner?
|
109
|
+
!Monoz.verbose?
|
110
|
+
end
|
111
|
+
|
112
|
+
def run_in_project(project, *command)
|
113
|
+
raise ArgumentError, "Invalid command" if command.empty?
|
144
114
|
|
145
115
|
output = ""
|
146
116
|
exit_status = nil
|
147
117
|
|
148
118
|
FileUtils.chdir(project.root_path) do
|
149
|
-
|
150
|
-
|
151
|
-
|
119
|
+
PTY.spawn(*command.map { |arg| Shellwords.escape(arg) }) do |stdout, stdin, pid|
|
120
|
+
begin
|
121
|
+
stdout.each do |line|
|
152
122
|
output += line
|
153
|
-
print line
|
123
|
+
print line if Monoz.verbose?
|
154
124
|
end
|
155
|
-
|
156
|
-
exit_status = wait_thr.value.exitstatus
|
125
|
+
rescue Errno::EIO
|
157
126
|
end
|
158
127
|
|
159
|
-
|
160
|
-
|
161
|
-
output, status = Open3.capture2e(*command.map { |arg| Shellwords.escape(arg) })
|
162
|
-
exit_status = status.exitstatus
|
128
|
+
Process.wait(pid)
|
129
|
+
exit_status = $?.exitstatus
|
163
130
|
end
|
164
131
|
end
|
165
132
|
|
166
|
-
|
133
|
+
Monoz::Responses::RunServiceResponse.new(output, exit_status)
|
134
|
+
rescue Errno::ENOENT => e
|
135
|
+
Monoz::Responses::RunServiceResponse.new(e.message, 1)
|
167
136
|
end
|
168
137
|
end
|
169
138
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Monoz
|
4
|
+
class Spinner
|
5
|
+
include Thor::Shell
|
6
|
+
|
7
|
+
def initialize(message, prefix: nil)
|
8
|
+
@spinner = nil
|
9
|
+
@message = message
|
10
|
+
@prefix = prefix
|
11
|
+
end
|
12
|
+
|
13
|
+
def start
|
14
|
+
@spinner = main
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def success!
|
19
|
+
@spinner.kill
|
20
|
+
say_formatted(" \u2713 ", [:bold, :green])
|
21
|
+
say() # line break
|
22
|
+
end
|
23
|
+
|
24
|
+
def error!
|
25
|
+
@spinner.kill
|
26
|
+
say_formatted(" \u2717 ", [:bold, :red])
|
27
|
+
say() # line break
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
def reset
|
32
|
+
say("\r", nil, false)
|
33
|
+
end
|
34
|
+
|
35
|
+
def say_formatted(suffix, suffix_formatting = nil)
|
36
|
+
if @prefix != nil
|
37
|
+
say "\r[#{@prefix}] ", [:blue, :bold], nil
|
38
|
+
say @message, nil, false
|
39
|
+
say suffix, suffix_formatting, false
|
40
|
+
else
|
41
|
+
say "\r#{@message}", nil, false
|
42
|
+
say suffix, suffix_formatting, false
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def main
|
47
|
+
spinner_count = 0
|
48
|
+
|
49
|
+
Thread.new do
|
50
|
+
loop do
|
51
|
+
dots = case spinner_count % 3
|
52
|
+
when 0 then "."
|
53
|
+
when 1 then ".."
|
54
|
+
when 2 then "..."
|
55
|
+
end
|
56
|
+
|
57
|
+
say_formatted(dots)
|
58
|
+
spinner_count += 1
|
59
|
+
sleep(0.5)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/monoz/version.rb
CHANGED
data/lib/monoz.rb
CHANGED
@@ -11,35 +11,20 @@ module Monoz
|
|
11
11
|
class ConfigurationNotFound < StandardError; end
|
12
12
|
end
|
13
13
|
|
14
|
-
module Responses
|
15
|
-
class CaptureRunResponse
|
16
|
-
attr_reader :output, :exit_code
|
17
|
-
|
18
|
-
def initialize(output, exit_code)
|
19
|
-
@output = output
|
20
|
-
@exit_code = exit_code
|
21
|
-
end
|
22
|
-
|
23
|
-
def success?
|
24
|
-
exit_code == 0
|
25
|
-
end
|
26
|
-
|
27
|
-
def error?
|
28
|
-
exit_code == 1
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
14
|
module Services
|
15
|
+
autoload "ActionService", "monoz/services/action_service"
|
34
16
|
autoload "BaseService", "monoz/services/base_service"
|
35
17
|
autoload "InitService", "monoz/services/init_service"
|
36
18
|
autoload "RunService", "monoz/services/run_service"
|
37
19
|
end
|
38
20
|
|
21
|
+
autoload "Action", "monoz/action"
|
22
|
+
autoload "ActionCollection", "monoz/action_collection"
|
39
23
|
autoload "Application", "monoz/application"
|
40
24
|
autoload "Configuration", "monoz/configuration"
|
41
25
|
autoload "Project", "monoz/project"
|
42
26
|
autoload "ProjectCollection", "monoz/project_collection"
|
27
|
+
autoload "Spinner", "monoz/spinner"
|
43
28
|
|
44
29
|
class << self
|
45
30
|
def app
|
@@ -54,12 +39,24 @@ module Monoz
|
|
54
39
|
@config ||= Monoz::Configuration.new(pwd)
|
55
40
|
end
|
56
41
|
|
42
|
+
def actions
|
43
|
+
@actions ||= Monoz::ActionCollection.new
|
44
|
+
end
|
45
|
+
|
57
46
|
def options
|
58
47
|
@app&.options
|
59
48
|
end
|
60
49
|
|
61
|
-
def
|
62
|
-
|
50
|
+
def folders
|
51
|
+
config.dig("folders") || ["apps", "gems"]
|
52
|
+
end
|
53
|
+
|
54
|
+
def verbose?
|
55
|
+
@verbose ||= Monoz.options.dig("verbose") == true
|
56
|
+
end
|
57
|
+
|
58
|
+
def verbose=(value)
|
59
|
+
@verbose = value
|
63
60
|
end
|
64
61
|
|
65
62
|
def projects
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: monoz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kjellberg
|
@@ -64,13 +64,17 @@ files:
|
|
64
64
|
- README.md
|
65
65
|
- bin/monoz
|
66
66
|
- lib/monoz.rb
|
67
|
+
- lib/monoz/action.rb
|
68
|
+
- lib/monoz/action_collection.rb
|
67
69
|
- lib/monoz/application.rb
|
68
70
|
- lib/monoz/configuration.rb
|
69
71
|
- lib/monoz/project.rb
|
70
72
|
- lib/monoz/project_collection.rb
|
73
|
+
- lib/monoz/services/action_service.rb
|
71
74
|
- lib/monoz/services/base_service.rb
|
72
75
|
- lib/monoz/services/init_service.rb
|
73
76
|
- lib/monoz/services/run_service.rb
|
77
|
+
- lib/monoz/spinner.rb
|
74
78
|
- lib/monoz/version.rb
|
75
79
|
homepage: https://github.com/kjellberg/monoz
|
76
80
|
licenses:
|
@@ -94,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
98
|
- !ruby/object:Gem::Version
|
95
99
|
version: '0'
|
96
100
|
requirements: []
|
97
|
-
rubygems_version: 3.4.
|
101
|
+
rubygems_version: 3.4.10
|
98
102
|
signing_key:
|
99
103
|
specification_version: 4
|
100
104
|
summary: Command line tool for managing ruby monorepos.
|