clamshell 0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,2 @@
1
+ .bundle
2
+ *.swp
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source :rubygems
2
+
3
+ gem "thor"
4
+
5
+ group :test do
6
+ gem "rake"
7
+ gem "rspec"
8
+ end
@@ -0,0 +1,22 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ diff-lcs (1.1.2)
5
+ rake (0.8.7)
6
+ rspec (2.4.0)
7
+ rspec-core (~> 2.4.0)
8
+ rspec-expectations (~> 2.4.0)
9
+ rspec-mocks (~> 2.4.0)
10
+ rspec-core (2.4.0)
11
+ rspec-expectations (2.4.0)
12
+ diff-lcs (~> 1.1.2)
13
+ rspec-mocks (2.4.0)
14
+ thor (0.14.6)
15
+
16
+ PLATFORMS
17
+ ruby
18
+
19
+ DEPENDENCIES
20
+ rake
21
+ rspec
22
+ thor
@@ -0,0 +1,126 @@
1
+ # Clamshell
2
+
3
+ Clamshell is a tool that converts generic shell statements into shell specific
4
+ statements that can be sourced to set up an environment.
5
+
6
+ ## Motivation
7
+
8
+ While working on a legacy project that used tcsh as its primary shell, I wanted
9
+ to use bash, but realized that some of the old schoolers actually liked tcsh.
10
+ This was the compromise.
11
+
12
+ ## Installation
13
+
14
+ gem install clamshell
15
+
16
+ ## Setting up an environment file
17
+
18
+ Sometimes your project has a dependency that is shell specific (environment variables,
19
+ aliases). Setup a `Shell.env` file in your project root with the following:
20
+
21
+ Environment.setup ("bash") do
22
+ env_var "LC_CTYPE", "en_US"
23
+ env_var "PATH", :prepend => "~/bin", :delimiter => ":"
24
+ env_var "PATH", :append => "/usr/bin", :delimiter => ":"
25
+ env_alias editor "vim"
26
+ end
27
+
28
+ You can convert these statements to bash statements as follows:
29
+
30
+ clamshell convert SHELL.env
31
+
32
+ which will print the following to standard out (or to a file using the `--shell-out=FILE` flag).
33
+
34
+ export LC_CTYPE=en_US
35
+ export PATH=~/bin:$PATH
36
+ export PATH=$PATH:/usr/bin
37
+ alias editor=vim
38
+
39
+ ### Shell independence
40
+
41
+ Your environment file doesn't even need to specify a shell:
42
+
43
+ Environment.setup do
44
+ ...
45
+ end
46
+
47
+ But you must pass the flag `--shell=SHELLNAME`.
48
+ Best practices for multi-shell environments use the following command:
49
+
50
+ --shell=`ps -p $$ | awk 'NR==2 {print $4}'`
51
+
52
+ which will set the shell flag to the type of shell currently being ran.
53
+
54
+ Currently, the shells supported are tcsh and bash. However, I am assuming that
55
+ csh and zsh are supported as well since they are closely related to tcsh and
56
+ bash, respectively. Hence, aliases are set up for their respective shells.
57
+
58
+ ### Generic shell statements
59
+
60
+ You can also call generic shell statements that are valid in all shells:
61
+
62
+ echo -n FOO
63
+
64
+ But you must be verbose that you are doing so:
65
+
66
+ cmd "echo -n FOO"
67
+
68
+ ### Unique shell statements
69
+
70
+ If you need to setup the environment and produce a shell command that is
71
+ different depending on the shell being used, the global variable `$SHELL`
72
+ is available:
73
+
74
+ Environment.setup do
75
+ if $SHELL == "tcsh"
76
+ cmd "unlimit coredumpsize"
77
+ elsif $SHELL == "bash"
78
+ cmd "ulimit -c unlimited"
79
+ end
80
+ end
81
+
82
+ ### Splitting the environment
83
+
84
+ If you want to split your environment files up, the `include_file` command
85
+ is as your disposal.
86
+
87
+ Environment.setup do
88
+ include_file "/path/to/another.file"
89
+ end
90
+
91
+ `another.file`'s contents:
92
+
93
+ env_var "CLASSPATH", :append => "~/java"
94
+ cmd "echo FOOBAR"
95
+
96
+ If you definitely need to split your environment up, take this approach.
97
+
98
+ #### Pitfall
99
+
100
+ Another approach you might have considered is to generate multiple
101
+ files and source each one.
102
+
103
+ __DON'T!__
104
+
105
+ In tcsh, appending to an environment variable that doesn't exist throws an
106
+ error. There is an internal mechanism in clamshell that detects if an
107
+ environment variable doesn't exist. If it doesn't it creates one and sets
108
+ it to an empty string before appending.
109
+
110
+ So the previous example would generate the following statements:
111
+
112
+ setenv CLASSPATH ""
113
+ setenv CLASSPATH ${CLASSPATH}:~/java
114
+ echo FOOBAR
115
+
116
+ This can cause some headaches if more than one file is generated.
117
+
118
+ *Rule of thumb: generate one file, source one file.*
119
+
120
+ ### Conversion on the fly
121
+
122
+ If you need to convert a generic statement without using a file, you can
123
+ use the `convert_string` action, but you must specify a shell.
124
+
125
+ clamshell convert_string "env_var 'FOO' 'BAR'" --shell=tcsh
126
+ => setenv FOO BAR\n
@@ -0,0 +1,4 @@
1
+ require 'fileutils'
2
+ require './lib/clamshell'
3
+
4
+ Dir['tasks/**/*.rake'].each { |t| load t }
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.dirname(__FILE__) + '/../lib/clamshell'
4
+ require File.dirname(__FILE__) + '/../lib/clamshell/cli'
5
+
6
+ begin
7
+ Clamshell::CLI.start
8
+ rescue StandardError => e
9
+ puts e.message
10
+ exit 1
11
+ rescue Interrupt => e
12
+ puts "\nQuitting..."
13
+ exit 1
14
+ end
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "clamshell/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "clamshell"
7
+ s.version = Clamshell::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Eric Thomas"]
10
+ s.email = ["eric.l.m.thomas@gmail.com"]
11
+ s.homepage = "https://github.com/et/clamshell"
12
+ s.summary = %q{Clamshell manages your environment in a shell-independent setup.}
13
+ s.description = %q{Clamshell allows you to setup shell statements which configure
14
+ your project's environment that doesn't care about which shell
15
+ (bash, tcsh) the target user will be using.}
16
+
17
+ s.rubyforge_project = "clamshell"
18
+
19
+ s.add_dependency('thor')
20
+
21
+ s.add_development_dependency('rspec')
22
+
23
+ s.files = `git ls-files`.split("\n")
24
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
25
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
26
+ s.require_paths = ["lib"]
27
+ end
@@ -0,0 +1,19 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ module Clamshell
5
+
6
+ autoload :Dsl, 'clamshell/dsl'
7
+ autoload :Environment, 'clamshell/environment'
8
+
9
+ class SafeExit < StandardError; end
10
+ class DslError < StandardError; end
11
+
12
+ class << self
13
+ attr_writer :settings
14
+
15
+ def settings
16
+ @settings ||= {}
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,41 @@
1
+ require 'thor'
2
+
3
+ module Clamshell
4
+ class CLI < Thor
5
+
6
+ def initialize(*)
7
+ super
8
+ Clamshell.settings = options
9
+ end
10
+
11
+ desc "convert FILE", "Converts an environment file to shell statements"
12
+ method_option :shell, :type => :string, :banner => "Shell to create statements for"
13
+ method_option :shell_out, :type => :string, :banner => "File to output to"
14
+ def convert(file)
15
+ check_file(file)
16
+
17
+ file_out = Clamshell.settings[:shell_out]
18
+ if file_out
19
+ File.open(file_out, "w") {|f| f.write(Dsl.build(file) + "\n") }
20
+ else
21
+ puts Dsl.build(file)
22
+ end
23
+ end
24
+
25
+ desc "convert_string STRING", "Converts a string on the fly."
26
+ method_option :shell, :type => :string, :banner => "Shell to create statements for", :required => true
27
+ def convert_string(string)
28
+ input = <<-I
29
+ Environment.setup do
30
+ #{string}
31
+ end
32
+ I
33
+ puts instance_eval(input).inspect
34
+ end
35
+
36
+ private
37
+ def check_file(file)
38
+ abort("File: #{file}, not found.") unless File.exist?(file)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,8 @@
1
+ module Clamshell
2
+ class Dsl
3
+ def self.build(file)
4
+ builder = instance_eval(IO.read(file))
5
+ builder.inspect
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,94 @@
1
+ module Clamshell
2
+ class Environment
3
+
4
+ attr_reader :shell
5
+
6
+ def self.setup(shell = nil, &block)
7
+ $SHELL = shell ||= Clamshell.settings[:shell]
8
+ raise "No shell specified" unless shell
9
+
10
+ e = new(shell)
11
+ e.instance_eval(&block)
12
+ return e
13
+ end
14
+
15
+ def initialize(shell)
16
+ @shell = case shell
17
+ when "csh", "tcsh" then TcshAdapter
18
+ when "zsh", "bash" then BashAdapter
19
+ else
20
+ raise "Unsupported shell"
21
+ end
22
+ @stmts = []
23
+ end
24
+
25
+
26
+ def env_var(name, *args)
27
+ case
28
+ when args[0].class == String # direct assignment
29
+ @stmts << @shell.env_var(name, args[0])
30
+
31
+ else # appending or prepending to existing variable
32
+
33
+ # In csh, concatting to an undefined environment variable
34
+ # results in an error. This is a safe guard that sets the
35
+ # environment variable to an empty string before appending/prepending.
36
+ unless ENV[name]
37
+ ENV[name] = %q{""}
38
+ @stmts << @shell.env_var(name, ENV[name])
39
+ end
40
+
41
+ delimiter = args[0][:delimiter] || ""
42
+ if args[0][:prepend]
43
+ val = args[0][:prepend] + delimiter + "${#{name}}"
44
+ elsif args[0][:append]
45
+ val = "${#{name}}" + delimiter + args[0][:append]
46
+ else
47
+ raise DslError, "Must specify prepend or append"
48
+ end
49
+ @stmts << @shell.env_var(name, val)
50
+ end
51
+ end
52
+
53
+ def env_alias(name, val)
54
+ @stmts << @shell.env_alias(name, val)
55
+ end
56
+
57
+ def cmd(stmt)
58
+ @stmts << stmt
59
+ end
60
+
61
+ def include_file(file)
62
+ instance_eval File.read(file), file
63
+ end
64
+
65
+ def to_s
66
+ @stmts.join("\n")
67
+ end
68
+
69
+ private
70
+ def quote(val)
71
+ %Q{"#{val}"}
72
+ end
73
+ end
74
+
75
+ class BashAdapter
76
+ def self.env_var(name, val)
77
+ "export #{name}=#{val}"
78
+ end
79
+
80
+ def self.env_alias(name, val)
81
+ "alias #{name}=#{val}"
82
+ end
83
+ end
84
+
85
+ class TcshAdapter
86
+ def self.env_var(name, val)
87
+ "setenv #{name} #{val}"
88
+ end
89
+
90
+ def self.env_alias(name, val)
91
+ "alias #{name} #{val}"
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,3 @@
1
+ module Clamshell
2
+ VERSION = "0.2"
3
+ end
@@ -0,0 +1,73 @@
1
+ require 'tempfile'
2
+
3
+ require 'spec_helper'
4
+ require 'clamshell/cli'
5
+
6
+ describe Clamshell::CLI do
7
+
8
+ # explicit subject
9
+ subject { Clamshell::CLI }
10
+
11
+ after :each do
12
+ Clamshell.settings = {}
13
+ end
14
+
15
+ describe "#initialize" do
16
+
17
+ it "shows the help listing with no args" do
18
+ capture(:stdout){ subject.start }.should =~ /Tasks:/
19
+ end
20
+ end
21
+
22
+ describe "#convert" do
23
+ before do
24
+ @action = "convert"
25
+ @file_in = "#{FIXTURES_DIR}/Shell.env"
26
+ end
27
+
28
+ it "shows an error for a file not found" do
29
+ test_missing_file([@action, "missing_file"])
30
+ end
31
+
32
+ it "#--shell, it should set a shell option" do
33
+ capture(:stdout){ subject.start([@action, @file_in, "--shell=bash"])}
34
+ Clamshell.settings[:shell].should == "bash"
35
+ end
36
+
37
+ context "output" do
38
+ it "should print to standard out" do
39
+ capture(:stdout){ subject.start [@action, @file_in]}.should_not be_empty
40
+ end
41
+
42
+ it "#--shell-out, should output to a file" do
43
+ file = mock('file')
44
+ File.should_receive(:open).with("filename", "w").and_yield(file)
45
+ file.should_receive(:write)
46
+ subject.start ["convert", @file_in, "--shell-out=filename"]
47
+ end
48
+ end
49
+ end
50
+
51
+ describe "#convert_string" do
52
+ before do
53
+ @action = "convert_string"
54
+ @string_in = %q{env_var "FOO", "BAR"}
55
+ end
56
+
57
+ it "show an error when --shell is not used" do
58
+ capture(:stderr) {
59
+ subject.start [@action, @string_in]
60
+ }.should =~ /No value provided for required options '--shell'/
61
+ end
62
+
63
+ it "should convert a string" do
64
+ capture(:stdout) {
65
+ subject.start [@action, @string_in, "--shell=tcsh"]
66
+ }.should == "setenv FOO BAR\n"
67
+ end
68
+ end
69
+ end
70
+
71
+ def test_missing_file(argv)
72
+ expect { capture(:stderr){ subject.start(argv)}}.to raise_error(SystemExit, /File: \S*, not found/)
73
+ end
@@ -0,0 +1,194 @@
1
+ require 'spec_helper'
2
+
3
+ describe Clamshell::Environment do
4
+
5
+ describe "setup" do
6
+ it "should raise an error when no shell is given" do
7
+ expect { Clamshell::Environment.setup( & proc{})}.to raise_error(RuntimeError, /No shell specified/)
8
+ end
9
+
10
+ it "should return an Environment object" do
11
+ Clamshell::Environment.setup("bash", & proc{}).should be_an_instance_of Clamshell::Environment
12
+ end
13
+ end
14
+
15
+ describe "shell initializer" do
16
+ it "should set up a tcsh shell" do
17
+ Clamshell::Environment.new("tcsh").shell.should be Clamshell::TcshAdapter
18
+ end
19
+
20
+ it "should set up a csh(tcsh) shell" do
21
+ Clamshell::Environment.new("csh").shell.should be Clamshell::TcshAdapter
22
+ end
23
+
24
+ it "should set up a bash shell" do
25
+ Clamshell::Environment.new("bash").shell.should be Clamshell::BashAdapter
26
+ end
27
+
28
+ it "should set up a zsh(bash) shell" do
29
+ Clamshell::Environment.new("zsh").shell.should be Clamshell::BashAdapter
30
+ end
31
+
32
+ it "should raise an error on an unknown shell" do
33
+ expect { Clamshell::Environment.new("sea")}.to raise_error(RuntimeError, /Unsupported shell/)
34
+ end
35
+ end
36
+
37
+ describe 'shell specific' do
38
+ before :each do
39
+ @bash = Clamshell::Environment.new("bash")
40
+ @tcsh = Clamshell::Environment.new("tcsh")
41
+ end
42
+
43
+ describe "env_alias" do
44
+ it "should set a tcsh alias" do
45
+ @tcsh.env_alias("FOO", "BAR")
46
+ @tcsh.inspect.should == %q{alias FOO BAR}
47
+ end
48
+ it "should set a bash alias" do
49
+ @bash.env_alias("FOO", "BAR")
50
+ @bash.inspect.should == %q{alias FOO=BAR}
51
+ end
52
+ end
53
+
54
+ describe "environment variable" do
55
+ describe "set" do
56
+
57
+ it "should set up a bash environment variable" do
58
+ @bash.env_var("FOO", "BAR")
59
+ @bash.inspect.should == "export FOO=BAR"
60
+ end
61
+
62
+ it "should set up a tcsh environment variable" do
63
+ @tcsh.env_var("FOO", "BAR")
64
+ @tcsh.inspect.should == "setenv FOO BAR"
65
+ end
66
+ end
67
+
68
+ describe "concat" do
69
+
70
+ before :all do
71
+ ENV['FOO'] = 'FOO'
72
+ end
73
+
74
+ after :all do
75
+ ENV['FOO'] = nil
76
+ end
77
+
78
+ describe "prepend" do
79
+ it "should prepend to a bash environment variable" do
80
+ @bash.env_var("FOO", :prepend => "BAR")
81
+ @bash.inspect.should == "export FOO=BAR${FOO}"
82
+ end
83
+
84
+ it "should prepend to a tcsh environment variable" do
85
+ @tcsh.env_var("FOO", :prepend => "BAR")
86
+ @tcsh.inspect.should == "setenv FOO BAR${FOO}"
87
+ end
88
+ end
89
+
90
+ describe "append" do
91
+ it "should append to a bash environment variable" do
92
+ @bash.env_var("FOO", :append => "BAR")
93
+ @bash.inspect.should == %q{export FOO=${FOO}BAR}
94
+ end
95
+
96
+ it "should append to a tcsh environment variable" do
97
+ @tcsh.env_var("FOO", :append => "BAR")
98
+ @tcsh.inspect.should == %q{setenv FOO ${FOO}BAR}
99
+ end
100
+ end
101
+
102
+ context "safe concat" do
103
+ before :each do
104
+ ENV['UNDEFINED'] = nil
105
+ end
106
+
107
+ it "should set the environment variable to empty string if not set" do
108
+ @tcsh.env_var("UNDEFINED", :append => "FOO")
109
+ @tcsh.inspect.should == %Q{setenv UNDEFINED ""\nsetenv UNDEFINED ${UNDEFINED}FOO}
110
+ end
111
+
112
+ it "should not try to keep setting the environment variable" do
113
+ @tcsh.env_var("UNDEFINED", :append => "FOO")
114
+ @tcsh.env_var("UNDEFINED", :append => "BAR")
115
+ @tcsh.inspect.should == %Q{setenv UNDEFINED ""\nsetenv UNDEFINED ${UNDEFINED}FOO\nsetenv UNDEFINED ${UNDEFINED}BAR}
116
+ end
117
+ end
118
+ end
119
+
120
+ describe "delimiter" do
121
+ it "should raise an error when prepend/append not defined" do
122
+ expect { @bash.env_var("FOO", :delimiter => ":")}.to raise_error(Clamshell::DslError, /Must specify prepend or append/)
123
+ end
124
+
125
+ it "should use a delimiter to append a variable" do
126
+ @bash.env_var("FOO", :append => "BAR", :delimiter => ":")
127
+ @bash.inspect.should == %q{export FOO=${FOO}:BAR}
128
+ end
129
+ end
130
+
131
+ end
132
+
133
+ describe "generic statement" do
134
+ it "should print out what it receives" do
135
+ @bash.cmd "echo blah"
136
+ @bash.inspect.should == %q{echo blah}
137
+ end
138
+ end
139
+
140
+ describe "include_file" do
141
+ it "should include a file" do
142
+ input = <<-I.gsub(/^\s+/, "").chop
143
+ env_var "FOO", "BAR"
144
+ cmd "echo blah"
145
+ I
146
+ File.stub!(:read).with("included_file.txt").and_return(input)
147
+ @bash.include_file("included_file.txt")
148
+ @bash.inspect.should == %Q{export FOO=BAR\necho blah}
149
+ end
150
+ end
151
+ end
152
+
153
+ describe "to_s" do
154
+ it "should convert a block" do
155
+ block = proc {
156
+ env_var "FOO", "BAR"
157
+ env_var "BAZ", "BUZZ"
158
+ }
159
+
160
+ out = <<-O.gsub(/^\s+/, "").chop
161
+ export FOO=BAR
162
+ export BAZ=BUZZ
163
+ O
164
+
165
+ Clamshell::Environment.setup("bash", &block).inspect.should == out
166
+ end
167
+
168
+ it "should convert a block with generic statements" do
169
+ block = proc {
170
+ env_var "FOO", "BAR"
171
+ cmd "echo -n blah"
172
+ env_var "BAZ", "BUZZ"
173
+ }
174
+
175
+ out = <<-O.gsub(/^\s+/, "").chop
176
+ setenv FOO BAR
177
+ echo -n blah
178
+ setenv BAZ BUZZ
179
+ O
180
+ Clamshell::Environment.setup("tcsh", &block).inspect.should == out
181
+ end
182
+
183
+ it "should provide a $SHELL global variable" do
184
+ block = proc {
185
+ if $SHELL == "tcsh"
186
+ cmd "unlimited coredumpsize"
187
+ elsif $SHELL == "bash"
188
+ cmd "ulimit -c unlimited"
189
+ end
190
+ }
191
+ Clamshell::Environment.setup("tcsh", &block).inspect.should == "unlimited coredumpsize"
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,24 @@
1
+ ######################################
2
+ # The following will return:
3
+ # export LC_CTYPE=en_US
4
+ # export PATH=/usr/bin
5
+ # export PATH=~/usr/bin:${PATH}
6
+ # export PATH=~alice/bin:${PATH}
7
+ # export PATH=~bob/bin:${PATH}
8
+ # export PATH=~eve/bin:${PATH}
9
+ # alias EDITOR=vim
10
+ # echo -e FOO
11
+ #
12
+ Environment.setup("bash") do
13
+ env_var "LC_CTYPE", "en_US"
14
+ env_var "PATH", "/usr/bin"
15
+ env_var "PATH", :prepend => "~/usr/bin", :delimiter => ":"
16
+
17
+ ["~alice/bin", "~bob/bin", "~eve/bin"].each do |p|
18
+ env_var "PATH", :prepend => p, :delimiter => ":"
19
+ end
20
+
21
+ env_alias "EDITOR", "vim"
22
+
23
+ cmd "echo -e FOO"
24
+ end
@@ -0,0 +1,23 @@
1
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
2
+ require 'clamshell'
3
+ require 'rspec'
4
+ require 'stringio'
5
+
6
+ FIXTURES_DIR = File.dirname(__FILE__) + '/fixtures'
7
+
8
+ ARGV.clear
9
+
10
+ RSpec.configure do |config|
11
+ def capture(stream)
12
+ begin
13
+ stream = stream.to_s
14
+ eval "$#{stream} = StringIO.new"
15
+ yield
16
+ result = eval("$#{stream}").string
17
+ ensure
18
+ eval("$#{stream} = #{stream.upcase}")
19
+ end
20
+
21
+ result
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ begin
2
+ require 'rake'
3
+ require 'rspec'
4
+ rescue LoadError
5
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
6
+ require 'rspec'
7
+ end
8
+ begin
9
+ require 'rspec/core/rake_task'
10
+ rescue LoadError
11
+ puts <<-EOS
12
+ To use rspec for testing you must install rspec gem:
13
+ gem install rspec
14
+ EOS
15
+ exit(0)
16
+ end
17
+
18
+ desc "Run all of the spec tests"
19
+ Rspec::Core::RakeTask.new do |t|
20
+ t.rspec_opts = ['--options', "spec/spec.opts"]
21
+ t.pattern = FileList['spec/**/*_spec.rb']
22
+ end
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: clamshell
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 2
8
+ version: "0.2"
9
+ platform: ruby
10
+ authors:
11
+ - Eric Thomas
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+
16
+ date: 2011-04-02 00:00:00 -04:00
17
+ default_executable:
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
20
+ name: thor
21
+ prerelease: false
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :runtime
31
+ version_requirements: *id001
32
+ - !ruby/object:Gem::Dependency
33
+ name: rspec
34
+ prerelease: false
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ segments:
41
+ - 0
42
+ version: "0"
43
+ type: :development
44
+ version_requirements: *id002
45
+ description: |-
46
+ Clamshell allows you to setup shell statements which configure
47
+ your project's environment that doesn't care about which shell
48
+ (bash, tcsh) the target user will be using.
49
+ email:
50
+ - eric.l.m.thomas@gmail.com
51
+ executables:
52
+ - clamshell
53
+ extensions: []
54
+
55
+ extra_rdoc_files: []
56
+
57
+ files:
58
+ - .gitignore
59
+ - .rspec
60
+ - Gemfile
61
+ - Gemfile.lock
62
+ - README.md
63
+ - Rakefile
64
+ - bin/clamshell
65
+ - clamshell.gemspec
66
+ - lib/clamshell.rb
67
+ - lib/clamshell/cli.rb
68
+ - lib/clamshell/dsl.rb
69
+ - lib/clamshell/environment.rb
70
+ - lib/clamshell/version.rb
71
+ - spec/clamshell/cli_spec.rb
72
+ - spec/clamshell/environment_spec.rb
73
+ - spec/fixtures/Shell.env
74
+ - spec/spec_helper.rb
75
+ - tasks/rspec.rake
76
+ has_rdoc: true
77
+ homepage: https://github.com/et/clamshell
78
+ licenses: []
79
+
80
+ post_install_message:
81
+ rdoc_options: []
82
+
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ segments:
91
+ - 0
92
+ version: "0"
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ segments:
99
+ - 0
100
+ version: "0"
101
+ requirements: []
102
+
103
+ rubyforge_project: clamshell
104
+ rubygems_version: 1.3.7
105
+ signing_key:
106
+ specification_version: 3
107
+ summary: Clamshell manages your environment in a shell-independent setup.
108
+ test_files:
109
+ - spec/clamshell/cli_spec.rb
110
+ - spec/clamshell/environment_spec.rb
111
+ - spec/fixtures/Shell.env
112
+ - spec/spec_helper.rb