screenomat 0.0.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.
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
+