threeman 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|