threeman 0.1.1 → 0.2.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/CHANGELOG.md +14 -0
- data/README.md +9 -4
- data/lib/threeman/cli.rb +46 -26
- data/lib/threeman/command.rb +20 -0
- data/lib/threeman/frontend.rb +16 -0
- data/lib/threeman/frontends/iterm3.rb +34 -0
- data/lib/threeman/frontends/mac_terminal.rb +41 -0
- data/lib/threeman/procfile.rb +16 -0
- data/lib/threeman/version.rb +1 -1
- data/threeman.gemspec +2 -1
- metadata +36 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 765f19786b13a7cb5a023f159e8d430d1a0e75a3
|
4
|
+
data.tar.gz: f86d28d400765992a9de7df2323f1b414f30b493
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddbce7064da10dfb54e0c9b5951c0432a185e015b08de43991b310d66bca1f68ce8220f78cf348db3262b6d5a49ec49829cc58eb288775dbd81ed944c16182b4
|
7
|
+
data.tar.gz: 2150184f85c6c89adc40105462d305db012073c82102bbb910691c03d2142ae5f85b78550b0c4501ad77b6d1a32913fd55a72edf8f4c931cef805bb2d0ce96ed
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# 0.2.0 - March 29, 2016
|
2
|
+
|
3
|
+
* Refactor into multiple frontends
|
4
|
+
* Add support for Mac OS X Terminal.app
|
5
|
+
|
6
|
+
# 0.1.1 - March 28, 2016
|
7
|
+
|
8
|
+
* Add license
|
9
|
+
* Add code of conduct
|
10
|
+
* Change ownership to patientslikeme
|
11
|
+
|
12
|
+
# 0.1.0 - March 28, 2016
|
13
|
+
|
14
|
+
* First release
|
data/README.md
CHANGED
@@ -1,13 +1,18 @@
|
|
1
1
|
# Threeman
|
2
2
|
|
3
|
-
Threeman is an alternative to [Foreman](https://github.com/ddollar/foreman)
|
3
|
+
Threeman is an alternative to [Foreman](https://github.com/ddollar/foreman). Rather than running all the commands together in one terminal, it opens a new terminal window with each command in a tab. The benefits of this are:
|
4
4
|
|
5
|
-
*
|
5
|
+
* Your terminal app will notify you using an icon when there's new output from each command
|
6
6
|
* Because your command's input and output aren't being intercepted by Foreman, you can use [Pry](http://pryrepl.org)
|
7
7
|
|
8
|
+
Threeman also has an extensible architecture to allow it to support multiple terminal apps. Right now, it supports:
|
9
|
+
|
10
|
+
* iTerm 2.9 and above
|
11
|
+
* Mac OS X's built-in Terminal app
|
12
|
+
|
8
13
|
## Installation
|
9
14
|
|
10
|
-
Make sure you have
|
15
|
+
Make sure you have a supported terminal app installed.
|
11
16
|
|
12
17
|
Run:
|
13
18
|
|
@@ -19,7 +24,7 @@ From your app's directory (with a Procfile in it), run:
|
|
19
24
|
|
20
25
|
$ threeman
|
21
26
|
|
22
|
-
Threeman will open a new
|
27
|
+
Threeman will open a new terminal window with each of your Procfile commands running in a separate tab.
|
23
28
|
|
24
29
|
## Development
|
25
30
|
|
data/lib/threeman/cli.rb
CHANGED
@@ -1,43 +1,63 @@
|
|
1
|
-
require '
|
2
|
-
require 'shellwords'
|
3
|
-
require 'rb-scpt'
|
1
|
+
require 'threeman/procfile'
|
4
2
|
require 'thor'
|
5
3
|
|
6
4
|
module Threeman
|
5
|
+
FRONTENDS = {
|
6
|
+
:iterm3 => lambda {
|
7
|
+
require 'threeman/frontends/iterm3'
|
8
|
+
Threeman::Frontends::Iterm3.new
|
9
|
+
},
|
10
|
+
:mac_terminal => lambda {
|
11
|
+
require 'threeman/frontends/mac_terminal'
|
12
|
+
Threeman::Frontends::MacTerminal.new
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
7
16
|
class CLI < Thor
|
8
17
|
default_task :start
|
9
18
|
|
10
19
|
desc "start", "Start the application"
|
20
|
+
option :frontend
|
11
21
|
def start
|
12
|
-
iterm = Appscript.app("iTerm")
|
13
|
-
iterm.activate
|
14
|
-
window = iterm.create_window_with_default_profile
|
15
|
-
|
16
22
|
pwd = Dir.pwd
|
23
|
+
procfile = Threeman::Procfile.new(File.expand_path("Procfile", pwd))
|
24
|
+
commands = procfile.commands(pwd)
|
17
25
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
else
|
24
|
-
window.create_tab_with_default_profile
|
25
|
-
end
|
26
|
-
|
27
|
-
run_command(current_tab.current_session, name, pwd, command)
|
28
|
-
is_first = false
|
26
|
+
frontend_name = options[:frontend] || auto_frontend
|
27
|
+
unless frontend_name
|
28
|
+
puts "Couldn't determine a frontend to use. Please specify one using --frontend."
|
29
|
+
print_valid_frontend_names
|
30
|
+
exit! 1
|
29
31
|
end
|
32
|
+
|
33
|
+
frontend(frontend_name).run_commands(commands)
|
30
34
|
end
|
31
35
|
|
32
36
|
private
|
33
|
-
def
|
34
|
-
|
35
|
-
|
36
|
-
"
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
def frontend(name)
|
38
|
+
frontend_lambda = FRONTENDS[name.to_sym]
|
39
|
+
unless frontend_lambda
|
40
|
+
puts "No frontend named #{name}!"
|
41
|
+
print_valid_frontend_names
|
42
|
+
exit! 1
|
43
|
+
end
|
44
|
+
|
45
|
+
frontend_lambda.call
|
46
|
+
end
|
47
|
+
|
48
|
+
def auto_frontend
|
49
|
+
if File.exist?('/Applications/iTerm.app/Contents/Info.plist')
|
50
|
+
iterm_version = `defaults read /Applications/iTerm.app/Contents/Info.plist CFBundleShortVersionString`
|
51
|
+
return :iterm3 if iterm_version >= "2.9"
|
52
|
+
end
|
53
|
+
|
54
|
+
if File.exist?('/Applications/Utilities/Terminal.app/Contents/Info.plist')
|
55
|
+
return :mac_terminal
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def print_valid_frontend_names
|
60
|
+
puts "Valid frontend names are: #{FRONTENDS.keys.sort.join(', ')}."
|
41
61
|
end
|
42
62
|
end
|
43
63
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'shellwords'
|
2
|
+
|
3
|
+
module Threeman
|
4
|
+
class Command
|
5
|
+
attr_accessor :name, :command, :workdir
|
6
|
+
|
7
|
+
def initialize(name, command, workdir)
|
8
|
+
@name = name
|
9
|
+
@command = command
|
10
|
+
@workdir = workdir
|
11
|
+
end
|
12
|
+
|
13
|
+
def bash_script
|
14
|
+
[
|
15
|
+
"cd #{workdir}",
|
16
|
+
command
|
17
|
+
].join(" ; ")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'shellwords'
|
2
|
+
|
3
|
+
module Threeman
|
4
|
+
class Frontend
|
5
|
+
def run_commands(commands)
|
6
|
+
raise "Subclasses must implement #run_commands"
|
7
|
+
end
|
8
|
+
|
9
|
+
def bash_script(command)
|
10
|
+
[
|
11
|
+
"echo -ne \"\\033]0;#{Shellwords.escape command.name}\\007\"",
|
12
|
+
command.bash_script
|
13
|
+
].join(" ; ")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'threeman/frontend'
|
2
|
+
begin
|
3
|
+
require 'rb-scpt'
|
4
|
+
rescue LoadError
|
5
|
+
puts "The iterm3 frontend for Threeman requires the rb-scpt gem. Install it using: gem install rb-scpt"
|
6
|
+
exit!
|
7
|
+
end
|
8
|
+
|
9
|
+
module Threeman
|
10
|
+
module Frontends
|
11
|
+
class Iterm3 < Threeman::Frontend
|
12
|
+
def run_commands(commands)
|
13
|
+
iterm = Appscript.app("iTerm")
|
14
|
+
iterm.activate
|
15
|
+
window = iterm.create_window_with_default_profile
|
16
|
+
|
17
|
+
commands.each_with_index do |command, index|
|
18
|
+
current_tab = if index == 0
|
19
|
+
window
|
20
|
+
else
|
21
|
+
window.create_tab_with_default_profile
|
22
|
+
end
|
23
|
+
|
24
|
+
run_command(current_tab.current_session, command)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def run_command(session, command)
|
30
|
+
session.write(text: "bash -c #{Shellwords.escape bash_script(command)}")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'threeman/frontend'
|
2
|
+
begin
|
3
|
+
require 'rb-scpt'
|
4
|
+
rescue LoadError
|
5
|
+
puts "The mac_terminal frontend for Threeman requires the rb-scpt gem. Install it using: gem install rb-scpt"
|
6
|
+
exit!
|
7
|
+
end
|
8
|
+
|
9
|
+
module Threeman
|
10
|
+
module Frontends
|
11
|
+
class MacTerminal < Threeman::Frontend
|
12
|
+
def run_commands(commands)
|
13
|
+
events = Appscript.app("System Events")
|
14
|
+
|
15
|
+
terminal = Appscript.app("Terminal")
|
16
|
+
terminal.activate
|
17
|
+
|
18
|
+
terminal_controller = events.processes['Terminal']
|
19
|
+
|
20
|
+
commands.each_with_index do |command, index|
|
21
|
+
if index == 0
|
22
|
+
terminal.do_script("")
|
23
|
+
else
|
24
|
+
sleep 0.3 # Terminal is slow and its scripting API is prone to misbehavior; wait for it to finish doing the thing we just did
|
25
|
+
|
26
|
+
terminal_controller.keystroke("t", using: [:command_down])
|
27
|
+
terminal.do_script("", in: terminal.windows[0])
|
28
|
+
end
|
29
|
+
|
30
|
+
sleep 0.3
|
31
|
+
terminal_controller.keystroke(bash_cmd(command) + "\n")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
def bash_cmd(command)
|
37
|
+
"bash -c #{Shellwords.escape bash_script(command)}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'foreman/procfile'
|
2
|
+
require 'threeman/command'
|
3
|
+
|
4
|
+
module Threeman
|
5
|
+
class Procfile < Foreman::Procfile
|
6
|
+
def commands(workdir)
|
7
|
+
commands = []
|
8
|
+
|
9
|
+
entries do |name, command|
|
10
|
+
commands << Threeman::Command.new(name, command, workdir)
|
11
|
+
end
|
12
|
+
|
13
|
+
commands
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/threeman/version.rb
CHANGED
data/threeman.gemspec
CHANGED
@@ -19,10 +19,11 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
-
spec.add_dependency "rb-scpt"
|
23
22
|
spec.add_dependency "foreman"
|
24
23
|
|
25
24
|
spec.add_development_dependency "bundler", "~> 1.10"
|
26
25
|
spec.add_development_dependency "rake", "~> 10.0"
|
27
26
|
spec.add_development_dependency "minitest"
|
27
|
+
spec.add_development_dependency "pry"
|
28
|
+
spec.add_development_dependency "rb-scpt"
|
28
29
|
end
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: threeman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nat Budin
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: rb-scpt
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: foreman
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +66,34 @@ dependencies:
|
|
80
66
|
- - ">="
|
81
67
|
- !ruby/object:Gem::Version
|
82
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rb-scpt
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
description: An alternative to Foreman for Mac users, which runs each command in a
|
84
98
|
separate iTerm 2 tab
|
85
99
|
email:
|
@@ -91,6 +105,7 @@ extra_rdoc_files: []
|
|
91
105
|
files:
|
92
106
|
- ".gitignore"
|
93
107
|
- ".travis.yml"
|
108
|
+
- CHANGELOG.md
|
94
109
|
- CODE_OF_CONDUCT.md
|
95
110
|
- Gemfile
|
96
111
|
- LICENSE
|
@@ -101,6 +116,11 @@ files:
|
|
101
116
|
- exe/threeman
|
102
117
|
- lib/threeman.rb
|
103
118
|
- lib/threeman/cli.rb
|
119
|
+
- lib/threeman/command.rb
|
120
|
+
- lib/threeman/frontend.rb
|
121
|
+
- lib/threeman/frontends/iterm3.rb
|
122
|
+
- lib/threeman/frontends/mac_terminal.rb
|
123
|
+
- lib/threeman/procfile.rb
|
104
124
|
- lib/threeman/version.rb
|
105
125
|
- threeman.gemspec
|
106
126
|
homepage: https://github.com/patientslikeme/threeman
|