screenomat 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ .bundle/*
2
+ *.gem
data/.project ADDED
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <projectDescription>
3
+ <name>screenie</name>
4
+ <comment></comment>
5
+ <projects>
6
+ </projects>
7
+ <buildSpec>
8
+ </buildSpec>
9
+ <natures>
10
+ <nature>com.aptana.ruby.core.rubynature</nature>
11
+ </natures>
12
+ </projectDescription>
data/.screenomat ADDED
@@ -0,0 +1,4 @@
1
+ session do
2
+ screen! "bundle exec autotest", :title => 'autotest'
3
+ screen :title => 'command prompt'
4
+ end
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,33 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ screenomat (0.0.1)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ ZenTest (4.4.1)
10
+ autotest (4.4.6)
11
+ ZenTest (>= 4.4.1)
12
+ diff-lcs (1.1.2)
13
+ mocha (0.9.10)
14
+ rake
15
+ rake (0.8.7)
16
+ rspec (2.2.0)
17
+ rspec-core (~> 2.2)
18
+ rspec-expectations (~> 2.2)
19
+ rspec-mocks (~> 2.2)
20
+ rspec-core (2.2.1)
21
+ rspec-expectations (2.2.0)
22
+ diff-lcs (~> 1.1.2)
23
+ rspec-mocks (2.2.0)
24
+
25
+ PLATFORMS
26
+ ruby
27
+
28
+ DEPENDENCIES
29
+ autotest
30
+ bundler (>= 1.0.0)
31
+ mocha
32
+ rspec
33
+ screenomat!
data/README.md ADDED
@@ -0,0 +1,85 @@
1
+ # screenomat
2
+
3
+ You like screen, I like screen. Make getting those big multi-command line-running projects
4
+ even easier to get started up with `screenomat`.
5
+
6
+ ## How?
7
+
8
+ Make a `.screenomat` file in your app and write:
9
+
10
+ <pre>
11
+ session do
12
+ screen "bundle exec autotest", :title => "autotest"
13
+ screen "rails c", :title => "dev console"
14
+ screen "rails s", :title => "dev server"
15
+ screen "less +F -fr log/test.log", :title => "test log tail"
16
+ screen! :title => "bash"
17
+ end
18
+ </pre>
19
+
20
+ Then run:
21
+
22
+ screenomat
23
+
24
+ _~~whoa~~_
25
+
26
+ ### More?
27
+
28
+ <pre>
29
+ session :backend do
30
+ screen "bundle exec autotest", :title => "autotest"
31
+ screen "less +F -fr log/test.log", :title => "test log tail"
32
+ screen! :title => "bash"
33
+ end
34
+
35
+ session :frontend do
36
+ screen "bundle exec autotest", :title => "autotest"
37
+ screen "rails c", :title => "console"
38
+ screen "rails s", :title => "server"
39
+ screen "rake jasmine", :title => "jasmine"
40
+ screen! :title => "bash"
41
+ end
42
+ </pre>
43
+
44
+ Then run:
45
+
46
+ screenomat backend
47
+
48
+ or even:
49
+
50
+ screenomat frontend
51
+
52
+ ## Defaults?
53
+
54
+ Like magic `screenomat` bits anywhere? `~/.screenomat` is what you want! Same syntax!
55
+
56
+ ## Ruby? DRY?
57
+
58
+ Just like `Gemfile`, `*.gemspec`, and other modern Ruby things, `.screenomat` is Ruby code. Like
59
+ DRYing things? You can do it!
60
+
61
+ <pre>
62
+ class Screenomat::DSL::Session
63
+ def whoa(&block)
64
+ screen :title => "first"
65
+ instance_eval(&block)
66
+ screen :title => "last"
67
+ end
68
+ end
69
+
70
+ session :first do
71
+ whoa do
72
+ screen "bundle exec autotest", :title => 'autotest'
73
+ end
74
+ end
75
+
76
+ session :second do
77
+ whoa do
78
+ screen %{echo "cats"}
79
+ end
80
+ end
81
+ </pre>
82
+
83
+ ## What's left?
84
+
85
+ A _bunch_. I write what I need. Feel like adding fun things and/or tests? Fork, hack, pull request. You know the drill.
@@ -0,0 +1 @@
1
+ Autotest.add_discovery { "rspec2" }
data/bin/screenomat ADDED
@@ -0,0 +1,33 @@
1
+ #!which ruby
2
+
3
+ require 'getoptlong'
4
+ require 'screenomat/dsl/builder'
5
+
6
+ opt = GetoptLong.new(
7
+ [ '--input', '-i', GetoptLong::REQUIRED_ARGUMENT ]
8
+ )
9
+
10
+ files = %w{.screenomat ~/.screenomat}
11
+
12
+ opt.each do |key, value|
13
+ case key
14
+ when '--input'
15
+ files = [ value ]
16
+ end
17
+ end
18
+
19
+ session_name = ARGV.shift
20
+
21
+ files.each do |path|
22
+ if File.exist?(target = File.expand_path(path))
23
+ sessions = Screenomat::DSL::Builder.new(File.read(target))
24
+
25
+ if !session_name || session_name.empty?
26
+ session = sessions.first
27
+ else
28
+ session = sessions[session_name.to_sym]
29
+ end
30
+
31
+ session.to_cmd.each { |cmd| system cmd }
32
+ end
33
+ end
data/lib/screenomat.rb ADDED
@@ -0,0 +1,3 @@
1
+ module Screenomat
2
+
3
+ end
@@ -0,0 +1,35 @@
1
+ require 'screenomat/dsl/session'
2
+
3
+ module Screenomat
4
+ module DSL
5
+ class Builder
6
+ attr_reader :sessions
7
+
8
+ def initialize(code = '', &block)
9
+ @sessions = []
10
+
11
+ if !code.empty?
12
+ instance_eval(code)
13
+ else
14
+ instance_eval(&block)
15
+ end
16
+ end
17
+
18
+ def session(name = nil, &block)
19
+ name ||= "screenie-#{Time.now.to_i}"
20
+
21
+ session = Session.new(name.to_sym, &block)
22
+
23
+ @sessions << session
24
+ end
25
+
26
+ def first
27
+ @sessions.first
28
+ end
29
+
30
+ def [](key)
31
+ @sessions.find { |session| session.name == key }
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,47 @@
1
+ module Screenomat
2
+ module DSL
3
+ class Screen
4
+ attr_accessor :screen_id
5
+
6
+ def initialize(*options)
7
+ @options = options
8
+ @screen_id = nil
9
+
10
+ if @options.first.kind_of?(::Fixnum)
11
+ @screen_id = @options.shift
12
+ end
13
+ end
14
+
15
+ def stuff
16
+ output = [ %{-p #{@screen_id || 0} stuff} ]
17
+
18
+ if @options.first.kind_of?(::String)
19
+ output << %{"#{@options.first}\n"}
20
+ end
21
+
22
+ output * ' '
23
+ end
24
+
25
+ def screen
26
+ title = nil
27
+ if @options.last.kind_of?(::Hash)
28
+ opts = @options.last
29
+ title = opts[:title]
30
+ end
31
+
32
+ if @screen_id == 0
33
+ output = []
34
+ output << %{-p 0 title "#{title}"} if title
35
+ else
36
+ output = %w{screen}
37
+
38
+ output << %{-t "#{title}"} if title
39
+
40
+ output << (@screen_id || 0)
41
+ end
42
+
43
+ output * ' '
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,54 @@
1
+ require 'screenomat/dsl/screen'
2
+
3
+ module Screenomat
4
+ module DSL
5
+ class Session
6
+ attr_accessor :name
7
+
8
+ def initialize(name = '', code = '', &block)
9
+ @name = name
10
+ @screens = []
11
+ @start_screen = 0
12
+
13
+ @start_screen_to_use = nil
14
+
15
+ if !code.empty?
16
+ instance_eval(code)
17
+ else
18
+ instance_eval(&block)
19
+ end
20
+ end
21
+
22
+ def screen(*opts)
23
+ @screens << Screen.new(*opts)
24
+ end
25
+
26
+ def screen!(*opts)
27
+ @start_screen_to_use = Screen.new(*opts)
28
+ @screens << @start_screen_to_use
29
+ end
30
+
31
+ def to_cmd
32
+ output = [ %{screen -dmS "#{@name}"} ]
33
+
34
+ available_screen_ids = (0..9).to_a
35
+
36
+ output += @screens.collect { |screen|
37
+ if !screen.screen_id
38
+ screen.screen_id = available_screen_ids.shift
39
+ end
40
+
41
+ commands = []
42
+ commands << %{screen -X -S "#{@name}" #{screen.screen}} if !screen.screen.empty?
43
+ commands << %{screen -X -S "#{@name}" #{screen.stuff}}
44
+ }.flatten
45
+
46
+ @start_screen = @start_screen_to_use.screen_id if @start_screen_to_use
47
+
48
+ output << %{screen -x "#{@name}" -p #{@start_screen}}
49
+
50
+ output
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,3 @@
1
+ module Screenomat
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path("../lib/screenomat/version", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "screenomat"
6
+ s.version = Screenomat::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = []
9
+ s.email = []
10
+ s.homepage = "http://johnbintz.com/"
11
+ s.summary = "DSL for making GNU screen obey your will"
12
+ s.description = "DSL for making GNU screen obey your will"
13
+
14
+ s.required_rubygems_version = ">= 1.3.6"
15
+
16
+ s.add_development_dependency "bundler", ">= 1.0.0"
17
+ s.add_development_dependency "rspec"
18
+ s.add_development_dependency "mocha"
19
+ s.add_development_dependency "autotest"
20
+
21
+ s.files = `git ls-files`.split("\n")
22
+ s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
23
+ s.require_path = 'lib'
24
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ require 'screenomat/dsl/builder'
3
+
4
+ describe Screenomat::DSL::Builder do
5
+ describe '#sessions' do
6
+ context 'from block' do
7
+ subject { Screenomat::DSL::Builder.new { session("cats") { } }}
8
+
9
+ specify { subject[:cats].should_not be_nil }
10
+ end
11
+
12
+ context 'from code' do
13
+ subject { Screenomat::DSL::Builder.new(%{session("cats") { } })}
14
+
15
+ specify { subject[:cats].should_not be_nil }
16
+ end
17
+ end
18
+
19
+ describe '#first' do
20
+ subject { Screenomat::DSL::Builder.new { session do; end }}
21
+
22
+ its(:first) { should be_a_kind_of(Screenomat::DSL::Session) }
23
+ end
24
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+ require 'screenomat/dsl/screen'
3
+
4
+ describe Screenomat::DSL::Screen do
5
+ describe '#to_cmd' do
6
+ let(:screen) { Screenomat::DSL::Screen.new(*params) }
7
+
8
+ subject { screen }
9
+
10
+ context 'blank' do
11
+ let(:params) { [] }
12
+
13
+ its(:screen) { should == 'screen 0' }
14
+ end
15
+
16
+ context 'with command' do
17
+ let(:params) { ["command"] }
18
+
19
+ its(:screen) { should == 'screen 0' }
20
+ its(:stuff) { should == %{-p 0 stuff "command
21
+ "} }
22
+ end
23
+
24
+ context 'with number id' do
25
+ let(:params) { [ 1 ] }
26
+
27
+ its(:screen) { should == "screen 1" }
28
+
29
+ specify { screen.screen_id.should == 1 }
30
+ end
31
+
32
+ context 'with number id and command' do
33
+ let(:params) { [ 1, "command" ] }
34
+
35
+ its(:screen) { should == "screen 1" }
36
+ its(:stuff) { should == %{-p 1 stuff "command
37
+ "} }
38
+ specify { screen.screen_id.should == 1 }
39
+ end
40
+
41
+ context 'with title' do
42
+ let(:params) { [ { :title => 'My title' } ] }
43
+
44
+ its(:screen) { should == %{screen -t "My title" 0} }
45
+ specify { screen.screen_id.should == nil }
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+ require 'screenomat/dsl/session'
3
+
4
+ describe Screenomat::DSL::Session do
5
+ describe '#to_cmd' do
6
+ context 'one screen' do
7
+ subject {
8
+ Screenomat::DSL::Session.new("my-session") { screen "test" }.to_cmd
9
+ }
10
+
11
+ it { should == [
12
+ %{screen -dmS "my-session"},
13
+ %{screen -X -S "my-session" -p 0 stuff "test
14
+ "},
15
+ %{screen -x "my-session" -p 0}
16
+ ] }
17
+ end
18
+
19
+ context 'two screens' do
20
+ subject {
21
+ Screenomat::DSL::Session.new("my-session") { screen "test"; screen "test2" }.to_cmd
22
+ }
23
+
24
+ it { should == [
25
+ %{screen -dmS "my-session"},
26
+ %{screen -X -S "my-session" -p 0 stuff "test
27
+ "},
28
+ %{screen -X -S "my-session" screen 1},
29
+ %{screen -X -S "my-session" -p 1 stuff "test2
30
+ "},
31
+ %{screen -x "my-session" -p 0}
32
+ ] }
33
+ end
34
+ end
35
+
36
+ describe 'from string' do
37
+ subject {
38
+ Screenomat::DSL::Session.new("my-session", <<-EOR).to_cmd
39
+ screen "test"
40
+ EOR
41
+ }
42
+
43
+ it { should == [
44
+ %{screen -dmS "my-session"},
45
+ %{screen -X -S "my-session" -p 0 stuff "test
46
+ "},
47
+ %{screen -x "my-session" -p 0}
48
+ ] }
49
+ end
50
+
51
+ describe 'screen!' do
52
+ subject {
53
+ Screenomat::DSL::Session.new("my-session") { screen "test"; screen! "test2" }.to_cmd
54
+ }
55
+
56
+ it { should == [
57
+ %{screen -dmS "my-session"},
58
+ %{screen -X -S "my-session" -p 0 stuff "test
59
+ "},
60
+ %{screen -X -S "my-session" screen 1},
61
+ %{screen -X -S "my-session" -p 1 stuff "test2
62
+ "},
63
+ %{screen -x "my-session" -p 1}
64
+ ] }
65
+ end
66
+ end
@@ -0,0 +1,3 @@
1
+ RSpec.configure do |config|
2
+ config.mock_with :mocha
3
+ end
metadata ADDED
@@ -0,0 +1,144 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: screenomat
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors: []
13
+
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-12-09 00:00:00 -05:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: bundler
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 23
30
+ segments:
31
+ - 1
32
+ - 0
33
+ - 0
34
+ version: 1.0.0
35
+ type: :development
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 3
46
+ segments:
47
+ - 0
48
+ version: "0"
49
+ type: :development
50
+ version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: mocha
53
+ prerelease: false
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ type: :development
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: autotest
67
+ prerelease: false
68
+ requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ hash: 3
74
+ segments:
75
+ - 0
76
+ version: "0"
77
+ type: :development
78
+ version_requirements: *id004
79
+ description: DSL for making GNU screen obey your will
80
+ email: []
81
+
82
+ executables:
83
+ - screenomat
84
+ extensions: []
85
+
86
+ extra_rdoc_files: []
87
+
88
+ files:
89
+ - .gitignore
90
+ - .project
91
+ - .screenomat
92
+ - Gemfile
93
+ - Gemfile.lock
94
+ - README.md
95
+ - autotest/discover.rb
96
+ - bin/screenomat
97
+ - lib/screenomat.rb
98
+ - lib/screenomat/dsl/builder.rb
99
+ - lib/screenomat/dsl/screen.rb
100
+ - lib/screenomat/dsl/session.rb
101
+ - lib/screenomat/version.rb
102
+ - screenomat.gemspec
103
+ - spec/lib/screenomat/dsl/builder_spec.rb
104
+ - spec/lib/screenomat/dsl/screen_spec.rb
105
+ - spec/lib/screenomat/dsl/session_spec.rb
106
+ - spec/spec_helper.rb
107
+ has_rdoc: true
108
+ homepage: http://johnbintz.com/
109
+ licenses: []
110
+
111
+ post_install_message:
112
+ rdoc_options: []
113
+
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ hash: 3
122
+ segments:
123
+ - 0
124
+ version: "0"
125
+ required_rubygems_version: !ruby/object:Gem::Requirement
126
+ none: false
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ hash: 23
131
+ segments:
132
+ - 1
133
+ - 3
134
+ - 6
135
+ version: 1.3.6
136
+ requirements: []
137
+
138
+ rubyforge_project:
139
+ rubygems_version: 1.3.7
140
+ signing_key:
141
+ specification_version: 3
142
+ summary: DSL for making GNU screen obey your will
143
+ test_files: []
144
+