scide 0.0.12 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +0 -1
- data/.ruby-version +1 -0
- data/.screenrc +8 -0
- data/.travis.yml +1 -1
- data/Gemfile +10 -11
- data/Gemfile.lock +46 -39
- data/LICENSE.txt +1 -1
- data/README.md +36 -144
- data/Rakefile +19 -26
- data/VERSION +1 -1
- data/bin/scide +1 -2
- data/lib/scide/auto.rb +33 -0
- data/lib/scide/list.rb +33 -0
- data/lib/scide/open.rb +57 -0
- data/lib/scide/program.rb +109 -0
- data/lib/scide/setup.rb +16 -0
- data/lib/scide.rb +25 -57
- data/scide.gemspec +51 -59
- data/spec/auto_spec.rb +72 -0
- data/spec/cli/list_spec.rb +81 -0
- data/spec/cli/open_spec.rb +131 -0
- data/spec/cli/setup_spec.rb +82 -0
- data/spec/helper.rb +12 -24
- data/spec/list_spec.rb +113 -0
- data/spec/open_spec.rb +228 -0
- data/spec/setup_spec.rb +106 -0
- data/spec/version_spec.rb +3 -5
- metadata +150 -72
- data/.document +0 -5
- data/.rvmrc +0 -41
- data/TODO.md +0 -21
- data/lib/scide/command.rb +0 -124
- data/lib/scide/commands/edit.rb +0 -37
- data/lib/scide/commands/run.rb +0 -25
- data/lib/scide/commands/show.rb +0 -29
- data/lib/scide/commands/tail.rb +0 -37
- data/lib/scide/config.rb +0 -105
- data/lib/scide/global.rb +0 -30
- data/lib/scide/opts.rb +0 -35
- data/lib/scide/overmind.rb +0 -70
- data/lib/scide/project.rb +0 -93
- data/lib/scide/screen.rb +0 -77
- data/lib/scide/window.rb +0 -88
- data/spec/command_spec.rb +0 -86
- data/spec/commands/edit_spec.rb +0 -19
- data/spec/commands/run_spec.rb +0 -9
- data/spec/commands/show_spec.rb +0 -15
- data/spec/commands/tail_spec.rb +0 -14
- data/spec/config_spec.rb +0 -113
- data/spec/global_spec.rb +0 -38
- data/spec/opts_spec.rb +0 -42
- data/spec/project_spec.rb +0 -171
- data/spec/results/config1.yml +0 -14
- data/spec/results/malformed_config.yml +0 -2
- data/spec/results/project1.screen +0 -10
- data/spec/results/screen1.screen +0 -14
- data/spec/scide_spec.rb +0 -38
- data/spec/screen_spec.rb +0 -90
- data/spec/window_spec.rb +0 -122
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'commander'
|
2
|
+
|
3
|
+
module Scide
|
4
|
+
|
5
|
+
class Program < Commander::Runner
|
6
|
+
|
7
|
+
BACKTRACE_NOTICE = ' (use --trace to view backtrace)'
|
8
|
+
|
9
|
+
include Commander::UI
|
10
|
+
include Commander::UI::AskForClass
|
11
|
+
|
12
|
+
def initialize argv = ARGV
|
13
|
+
super argv
|
14
|
+
|
15
|
+
program :name, 'scide'
|
16
|
+
program :version, Scide::VERSION
|
17
|
+
program :description, 'GNU Screen IDE. Scide is a wrapper to launch screen with a .screenrc configuration file in the current directory or in project directories.'
|
18
|
+
program :help, 'H4LP', 'https://github.com/AlphaHydrae/scide/issues'
|
19
|
+
|
20
|
+
global_option '-p', '--projects PROJECTS_DIR', 'Use a custom projects directory (defaults to $SCIDE_PROJECTS or ~/src)'
|
21
|
+
|
22
|
+
command :open do |c|
|
23
|
+
|
24
|
+
c.syntax = 'scide open [PROJECT_NAME]'
|
25
|
+
c.description = 'Open the project in PROJECTS_DIR/PROJECT_NAME or the project in the current directory.'
|
26
|
+
|
27
|
+
c.option '-p', '--projects PROJECTS_DIR', 'Use a custom projects directory (defaults to $SCIDE_PROJECTS or ~/src)'
|
28
|
+
c.option '-a', '--auto', "Automatically use a default screen configuration if the current directory doesn't have a .screenrc file (defaults to $SCIDE_AUTO)"
|
29
|
+
c.option '-b', '--bin BIN', 'Path to screen binary (defaults to $SCIDE_BIN or searches in the PATH)'
|
30
|
+
c.option '-s', '--screen OPTIONS', 'Custom screen options (defaults to $SCIDE_SCREEN or -U)'
|
31
|
+
c.option '-n', '--noop', 'Show the command that would be run'
|
32
|
+
|
33
|
+
c.example 'scide', 'Open the project in the current directory (.screenrc required).'
|
34
|
+
c.example 'scide -p ~/src my-project', 'Open a named project from ~/src (config at ~/src/my-project/.screenrc).'
|
35
|
+
c.example 'scide my-project', 'Open a named project (from $SCIDE_PROJECTS or ~/src).'
|
36
|
+
|
37
|
+
c.action do |args,options|
|
38
|
+
to_trace_or_not_to_trace options.trace do
|
39
|
+
options = extract :projects, :auto, :bin, :screen, :noop, options
|
40
|
+
args << options unless options.empty?
|
41
|
+
result = Scide.open *args
|
42
|
+
puts result if options[:noop]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
command :list do |c|
|
48
|
+
|
49
|
+
c.syntax = 'scide list'
|
50
|
+
c.description = 'List the projects with a .screenrc file in PROJECTS_DIR.'
|
51
|
+
|
52
|
+
c.option '-p', '--projects PROJECTS_DIR', 'Use a custom projects directory (defaults to $SCIDE_PROJECTS or ~/src)'
|
53
|
+
|
54
|
+
c.example 'scide list', 'List the projects with a .screenrc file in $SCIDE_PROJECTS or ~/src.'
|
55
|
+
c.example 'scide -p ~/Projects list', 'List the projects with a .screenrc file in ~/Projects.'
|
56
|
+
|
57
|
+
c.action do |args,options|
|
58
|
+
to_trace_or_not_to_trace options.trace do
|
59
|
+
projects = Scide.list extract(:projects, options)
|
60
|
+
puts projects.join("\n")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
command :setup do |c|
|
66
|
+
|
67
|
+
c.syntax = 'scide setup [PROJECT_NAME]'
|
68
|
+
c.description = 'Create a default .screenrc file in PROJECTS_DIR/PROJECT_NAME or in the current directory.'
|
69
|
+
|
70
|
+
c.option '-p', '--projects PROJECTS_DIR', 'Use a custom projects directory (defaults to $SCIDE_PROJECTS or ~/src)'
|
71
|
+
|
72
|
+
c.example 'scide setup', 'Create a default .screenrc file in the current directory.'
|
73
|
+
c.example 'scide -p ~/src setup my-project', 'Create a default .screenrc file in ~/src/my-project.'
|
74
|
+
c.example 'scide setup my-project', 'Create a default .screenrc file in $SCIDE_PROJECTS/my-project or ~/src/my-project.'
|
75
|
+
|
76
|
+
c.action do |args,options|
|
77
|
+
to_trace_or_not_to_trace options.trace do
|
78
|
+
options = extract :projects, :noop, options
|
79
|
+
args << options unless options.empty?
|
80
|
+
result = Scide.setup *args
|
81
|
+
puts Paint[result, :green]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
default_command :open
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
def to_trace_or_not_to_trace trace = false
|
92
|
+
begin
|
93
|
+
yield
|
94
|
+
rescue Scide::Error => e
|
95
|
+
if trace
|
96
|
+
raise e
|
97
|
+
else
|
98
|
+
warn Paint["#{e.message}#{BACKTRACE_NOTICE}", :red]
|
99
|
+
exit e.code
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def extract *args
|
105
|
+
options = args.pop
|
106
|
+
args.inject({}){ |memo,k| memo[k] = options.__send__(k); memo }.reject{ |k,v| v.nil? }
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
data/lib/scide/setup.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
module Scide
|
3
|
+
|
4
|
+
def self.setup *args
|
5
|
+
|
6
|
+
options = args.last.kind_of?(Hash) ? args.pop : {}
|
7
|
+
dir = current_project_dir args, options
|
8
|
+
|
9
|
+
file = File.join dir, '.screenrc'
|
10
|
+
error "#{file} already exists" if File.exists? file
|
11
|
+
|
12
|
+
File.open(file, 'w'){ |f| f.write auto_config }
|
13
|
+
|
14
|
+
file
|
15
|
+
end
|
16
|
+
end
|
data/lib/scide.rb
CHANGED
@@ -1,71 +1,39 @@
|
|
1
1
|
require 'paint'
|
2
|
-
require '
|
2
|
+
require 'which_works'
|
3
|
+
require 'shellwords'
|
3
4
|
|
4
|
-
# Generator of GNU Screen configuration files.
|
5
5
|
module Scide
|
6
|
+
VERSION = '0.1.0'
|
6
7
|
|
7
|
-
#
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
:not_initialized => 3,
|
15
|
-
:screen_not_found => 4,
|
16
|
-
:config_not_found => 10,
|
17
|
-
:config_not_readable => 11,
|
18
|
-
:malformed_config => 12,
|
19
|
-
:invalid_config => 13,
|
20
|
-
:unknown_project => 14
|
21
|
-
}
|
22
|
-
|
23
|
-
# Prints a message on <tt>stderr</tt> and exits.
|
24
|
-
# If <tt>condition</tt> is a key from {EXIT}, the corresponding value
|
25
|
-
# will be used as the exit code. Otherwise, scide exits with
|
26
|
-
# status 1.
|
27
|
-
def self.fail condition, msg
|
28
|
-
if @@exit_on_fail
|
29
|
-
puts
|
30
|
-
warn Paint[msg, :yellow]
|
31
|
-
puts
|
32
|
-
EXIT.key?(condition) ? exit(EXIT[condition]) : exit(1)
|
33
|
-
else
|
34
|
-
raise Scide::Error.new condition, msg
|
8
|
+
# TODO: add detailed error description for non-trace mode
|
9
|
+
class Error < StandardError
|
10
|
+
attr_reader :code
|
11
|
+
|
12
|
+
def initialize msg, code = 1
|
13
|
+
super msg
|
14
|
+
@code = code
|
35
15
|
end
|
36
16
|
end
|
37
17
|
|
38
|
-
|
39
|
-
# and exits if an error occurs. If <tt>exit_on_fail</tt> is
|
40
|
-
# false, a {Scide::Error} will be raised instead. Scide can then
|
41
|
-
# be used by another script.
|
42
|
-
def self.exit_on_fail= exit_on_fail
|
43
|
-
@@exit_on_fail = exit_on_fail
|
44
|
-
end
|
18
|
+
private
|
45
19
|
|
46
|
-
|
47
|
-
|
48
|
-
def self.exit_on_fail
|
49
|
-
@@exit_on_fail
|
20
|
+
def self.error msg, code = 1
|
21
|
+
raise Error.new msg, code
|
50
22
|
end
|
51
23
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
# A symbol indicating the error type. See {EXIT}.
|
56
|
-
attr_reader :condition
|
57
|
-
|
58
|
-
# Returns a new error.
|
59
|
-
def initialize condition, msg
|
60
|
-
super msg
|
61
|
-
@condition = condition
|
62
|
-
end
|
24
|
+
def self.projects_dir options = {}
|
25
|
+
options[:projects] || ENV['SCIDE_PROJECTS'] || File.expand_path('~/src')
|
63
26
|
end
|
64
27
|
|
65
|
-
|
66
|
-
|
67
|
-
|
28
|
+
def self.current_project_dir args, options = {}
|
29
|
+
project_name = args.shift
|
30
|
+
error "Only one project name must be given, got #{args.unshift project_name}" if args.any?
|
31
|
+
dir = project_name ? File.join(projects_dir(options), project_name) : Dir.pwd
|
32
|
+
error %/Cannot use home directory/ if File.expand_path(dir) == File.expand_path('~')
|
33
|
+
error %/No such directory "#{dir}"/ unless File.directory? dir
|
34
|
+
dir
|
35
|
+
end
|
68
36
|
end
|
69
37
|
|
70
|
-
|
71
|
-
|
38
|
+
Dir[File.join File.dirname(__FILE__), File.basename(__FILE__, '.*'), '*.rb'].each{ |lib| require lib }
|
39
|
+
|
data/scide.gemspec
CHANGED
@@ -5,12 +5,12 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "scide"
|
8
|
-
s.version = "0.0
|
8
|
+
s.version = "0.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["AlphaHydrae"]
|
12
|
-
s.date = "
|
13
|
-
s.description = "
|
11
|
+
s.authors = ["Simon Oulevay (AlphaHydrae)"]
|
12
|
+
s.date = "2013-05-02"
|
13
|
+
s.description = "GNU screen wrapper to open projects with a .screenrc file."
|
14
14
|
s.email = "hydrae.alpha@gmail.com"
|
15
15
|
s.executables = ["scide"]
|
16
16
|
s.extra_rdoc_files = [
|
@@ -18,94 +18,86 @@ Gem::Specification.new do |s|
|
|
18
18
|
"README.md"
|
19
19
|
]
|
20
20
|
s.files = [
|
21
|
-
".document",
|
22
21
|
".rspec",
|
23
|
-
".
|
22
|
+
".ruby-version",
|
23
|
+
".screenrc",
|
24
24
|
".travis.yml",
|
25
25
|
"Gemfile",
|
26
26
|
"Gemfile.lock",
|
27
27
|
"LICENSE.txt",
|
28
28
|
"README.md",
|
29
29
|
"Rakefile",
|
30
|
-
"TODO.md",
|
31
30
|
"VERSION",
|
32
31
|
"bin/scide",
|
33
32
|
"lib/scide.rb",
|
34
|
-
"lib/scide/
|
35
|
-
"lib/scide/
|
36
|
-
"lib/scide/
|
37
|
-
"lib/scide/
|
38
|
-
"lib/scide/
|
39
|
-
"lib/scide/config.rb",
|
40
|
-
"lib/scide/global.rb",
|
41
|
-
"lib/scide/opts.rb",
|
42
|
-
"lib/scide/overmind.rb",
|
43
|
-
"lib/scide/project.rb",
|
44
|
-
"lib/scide/screen.rb",
|
45
|
-
"lib/scide/window.rb",
|
33
|
+
"lib/scide/auto.rb",
|
34
|
+
"lib/scide/list.rb",
|
35
|
+
"lib/scide/open.rb",
|
36
|
+
"lib/scide/program.rb",
|
37
|
+
"lib/scide/setup.rb",
|
46
38
|
"scide.gemspec",
|
47
|
-
"spec/
|
48
|
-
"spec/
|
49
|
-
"spec/
|
50
|
-
"spec/
|
51
|
-
"spec/commands/tail_spec.rb",
|
52
|
-
"spec/config_spec.rb",
|
53
|
-
"spec/global_spec.rb",
|
39
|
+
"spec/auto_spec.rb",
|
40
|
+
"spec/cli/list_spec.rb",
|
41
|
+
"spec/cli/open_spec.rb",
|
42
|
+
"spec/cli/setup_spec.rb",
|
54
43
|
"spec/helper.rb",
|
55
|
-
"spec/
|
56
|
-
"spec/
|
57
|
-
"spec/
|
58
|
-
"spec/
|
59
|
-
"spec/results/project1.screen",
|
60
|
-
"spec/results/screen1.screen",
|
61
|
-
"spec/scide_spec.rb",
|
62
|
-
"spec/screen_spec.rb",
|
63
|
-
"spec/version_spec.rb",
|
64
|
-
"spec/window_spec.rb"
|
44
|
+
"spec/list_spec.rb",
|
45
|
+
"spec/open_spec.rb",
|
46
|
+
"spec/setup_spec.rb",
|
47
|
+
"spec/version_spec.rb"
|
65
48
|
]
|
66
49
|
s.homepage = "http://github.com/AlphaHydrae/scide"
|
67
50
|
s.licenses = ["MIT"]
|
68
51
|
s.require_paths = ["lib"]
|
69
|
-
s.rubygems_version = "1.8.
|
70
|
-
s.summary = "GNU Screen IDE
|
52
|
+
s.rubygems_version = "1.8.25"
|
53
|
+
s.summary = "GNU Screen IDE"
|
71
54
|
|
72
55
|
if s.respond_to? :specification_version then
|
73
56
|
s.specification_version = 3
|
74
57
|
|
75
58
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
76
|
-
s.add_runtime_dependency(%q<
|
59
|
+
s.add_runtime_dependency(%q<commander>, ["~> 4.1.3"])
|
60
|
+
s.add_runtime_dependency(%q<paint>, ["~> 0.8.6"])
|
77
61
|
s.add_runtime_dependency(%q<which_works>, ["~> 0.1.0"])
|
78
|
-
s.add_development_dependency(%q<rspec>, [">= 0"])
|
79
|
-
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
80
62
|
s.add_development_dependency(%q<bundler>, [">= 0"])
|
81
|
-
s.add_development_dependency(%q<
|
63
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
64
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
65
|
+
s.add_development_dependency(%q<fakefs>, [">= 0"])
|
66
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
67
|
+
s.add_development_dependency(%q<gemcutter>, [">= 0"])
|
68
|
+
s.add_development_dependency(%q<gem-release>, [">= 0"])
|
69
|
+
s.add_development_dependency(%q<rake-version>, [">= 0"])
|
82
70
|
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
83
|
-
s.add_development_dependency(%q<
|
84
|
-
s.add_development_dependency(%q<rdiscount>, [">= 0"])
|
85
|
-
s.add_development_dependency(%q<travis-lint>, ["~> 1.3.0"])
|
71
|
+
s.add_development_dependency(%q<travis-lint>, [">= 0"])
|
86
72
|
else
|
87
|
-
s.add_dependency(%q<
|
73
|
+
s.add_dependency(%q<commander>, ["~> 4.1.3"])
|
74
|
+
s.add_dependency(%q<paint>, ["~> 0.8.6"])
|
88
75
|
s.add_dependency(%q<which_works>, ["~> 0.1.0"])
|
89
|
-
s.add_dependency(%q<rspec>, [">= 0"])
|
90
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
91
76
|
s.add_dependency(%q<bundler>, [">= 0"])
|
92
|
-
s.add_dependency(%q<
|
77
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
78
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
79
|
+
s.add_dependency(%q<fakefs>, [">= 0"])
|
80
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
81
|
+
s.add_dependency(%q<gemcutter>, [">= 0"])
|
82
|
+
s.add_dependency(%q<gem-release>, [">= 0"])
|
83
|
+
s.add_dependency(%q<rake-version>, [">= 0"])
|
93
84
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
94
|
-
s.add_dependency(%q<
|
95
|
-
s.add_dependency(%q<rdiscount>, [">= 0"])
|
96
|
-
s.add_dependency(%q<travis-lint>, ["~> 1.3.0"])
|
85
|
+
s.add_dependency(%q<travis-lint>, [">= 0"])
|
97
86
|
end
|
98
87
|
else
|
99
|
-
s.add_dependency(%q<
|
88
|
+
s.add_dependency(%q<commander>, ["~> 4.1.3"])
|
89
|
+
s.add_dependency(%q<paint>, ["~> 0.8.6"])
|
100
90
|
s.add_dependency(%q<which_works>, ["~> 0.1.0"])
|
101
|
-
s.add_dependency(%q<rspec>, [">= 0"])
|
102
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
103
91
|
s.add_dependency(%q<bundler>, [">= 0"])
|
104
|
-
s.add_dependency(%q<
|
92
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
93
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
94
|
+
s.add_dependency(%q<fakefs>, [">= 0"])
|
95
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
96
|
+
s.add_dependency(%q<gemcutter>, [">= 0"])
|
97
|
+
s.add_dependency(%q<gem-release>, [">= 0"])
|
98
|
+
s.add_dependency(%q<rake-version>, [">= 0"])
|
105
99
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
106
|
-
s.add_dependency(%q<
|
107
|
-
s.add_dependency(%q<rdiscount>, [">= 0"])
|
108
|
-
s.add_dependency(%q<travis-lint>, ["~> 1.3.0"])
|
100
|
+
s.add_dependency(%q<travis-lint>, [">= 0"])
|
109
101
|
end
|
110
102
|
end
|
111
103
|
|
data/spec/auto_spec.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
describe Scide do
|
5
|
+
include FakeFS::SpecHelpers
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
FileUtils.mkdir_p '/tmp'
|
9
|
+
end
|
10
|
+
|
11
|
+
context ".auto_config_file" do
|
12
|
+
|
13
|
+
before(:each){ Scide.stub auto_config: 'foo' }
|
14
|
+
|
15
|
+
it "should create a temporary configuration file" do
|
16
|
+
Scide.auto_config_file do |auto_file|
|
17
|
+
expect(auto_file).to be_a_kind_of(Tempfile)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should create a file containing the results of ::auto_config" do
|
22
|
+
Scide.auto_config_file do |auto_file|
|
23
|
+
expect(File.read(auto_file)).to eq('foo')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context ".auto_config" do
|
29
|
+
|
30
|
+
let(:expected_config){ %|screen -t editor 0\nstuff "\\${PROJECT_EDITOR-\\$EDITOR}\\012"\nscreen -t shell 1\nselect editor| }
|
31
|
+
subject{ Scide.auto_config }
|
32
|
+
|
33
|
+
it{ should eq(expected_config) }
|
34
|
+
|
35
|
+
context "with a .screenrc file in the home directory" do
|
36
|
+
let(:expected_config){ %|source $HOME/.screenrc\n\n#{super()}| }
|
37
|
+
before(:each){ setup '~' }
|
38
|
+
it{ should eq(expected_config) }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context ".auto?" do
|
43
|
+
|
44
|
+
let(:options){ {} }
|
45
|
+
let(:env_auto){ nil }
|
46
|
+
subject{ Scide.auto? options }
|
47
|
+
it{ should be_false }
|
48
|
+
|
49
|
+
before :each do
|
50
|
+
ENV['SCIDE_AUTO'] = env_auto if env_auto
|
51
|
+
end
|
52
|
+
|
53
|
+
context "with the auto option" do
|
54
|
+
let(:options){ { auto: true } }
|
55
|
+
it{ should be_true }
|
56
|
+
end
|
57
|
+
|
58
|
+
[ '1', 'y', 'yes', 't', 'true' ].each do |valid|
|
59
|
+
context "with $SCIDE_AUTO set to #{valid}" do
|
60
|
+
let(:env_auto){ valid }
|
61
|
+
it{ should be_true }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def setup dir, config = true
|
67
|
+
dir = File.expand_path dir
|
68
|
+
FileUtils.mkdir_p dir
|
69
|
+
FileUtils.touch File.join(dir, '.screenrc') if config
|
70
|
+
dir
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe 'scide list' do
|
4
|
+
|
5
|
+
let(:argv){ [ 'list' ] }
|
6
|
+
let(:expected_options){ {} }
|
7
|
+
|
8
|
+
before :each do
|
9
|
+
Scide.stub :list
|
10
|
+
Scide.stub(:open).and_raise(StandardError.new('open should not be called'))
|
11
|
+
Scide.stub(:setup).and_raise(StandardError.new('setup should not be called'))
|
12
|
+
end
|
13
|
+
|
14
|
+
shared_examples_for "list" do
|
15
|
+
|
16
|
+
it "should output nothing if there are no projects" do
|
17
|
+
Scide.stub list: []
|
18
|
+
expect_success "\n"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should output the list of projects" do
|
22
|
+
Scide.stub list: [ '.', 'a', 'b', 'c' ]
|
23
|
+
expect_success ".\na\nb\nc\n"
|
24
|
+
end
|
25
|
+
|
26
|
+
context "if it fails" do
|
27
|
+
|
28
|
+
before :each do
|
29
|
+
Scide.stub(:list).and_raise(Scide::Error.new('fubar'))
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should output the error to stderr" do
|
33
|
+
expect_failure "fubar#{Scide::Program::BACKTRACE_NOTICE}"
|
34
|
+
end
|
35
|
+
|
36
|
+
context "with the trace option" do
|
37
|
+
|
38
|
+
let(:argv){ super().unshift '--trace' }
|
39
|
+
|
40
|
+
it "should raise the error" do
|
41
|
+
expect_failure "fubar", true
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it_behaves_like "list"
|
48
|
+
|
49
|
+
[ '-p', '--projects' ].each do |opt|
|
50
|
+
context "with the #{opt} option" do
|
51
|
+
let(:projects_dir){ '~/Projects' }
|
52
|
+
let(:expected_options){ { projects: projects_dir } }
|
53
|
+
let(:argv){ super() + [ opt, projects_dir ] }
|
54
|
+
it_behaves_like "list"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def expect_success output
|
59
|
+
Scide.should_receive(:list).with expected_options
|
60
|
+
program = Scide::Program.new argv
|
61
|
+
stdout, stderr = StringIO.new, StringIO.new
|
62
|
+
$stdout, $stderr = stdout, stderr
|
63
|
+
expect{ program.run! }.to_not raise_error
|
64
|
+
$stdout, $stderr = STDOUT, STDERR
|
65
|
+
expect(stdout.string).to eq(output)
|
66
|
+
expect(stderr.string).to be_empty
|
67
|
+
end
|
68
|
+
|
69
|
+
def expect_failure message, expect_raise = false, code = 1, &block
|
70
|
+
program = Scide::Program.new argv
|
71
|
+
if expect_raise
|
72
|
+
expect{ program.run! }.to raise_error(Scide::Error){ |e| expect(e.message).to eq(message) }
|
73
|
+
else
|
74
|
+
stderr = StringIO.new
|
75
|
+
$stderr = stderr
|
76
|
+
expect{ program.run! }.to raise_error(SystemExit){ |e| expect(e.status).to eq(code) }
|
77
|
+
$stderr = STDERR
|
78
|
+
expect(Paint.unpaint(stderr.string.strip)).to eq(message)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe 'scide open' do
|
4
|
+
|
5
|
+
let(:argv){ [] }
|
6
|
+
let(:expected_args){ [] }
|
7
|
+
let(:expected_options){ {} }
|
8
|
+
let(:expected_output){ expected_options[:noop] ? fake_command : '' }
|
9
|
+
let(:fake_command){ 'foo' }
|
10
|
+
|
11
|
+
before :each do
|
12
|
+
Scide.stub :open
|
13
|
+
Scide.stub(:list).and_raise(StandardError.new('list should not be called'))
|
14
|
+
Scide.stub(:setup).and_raise(StandardError.new('setup should not be called'))
|
15
|
+
end
|
16
|
+
|
17
|
+
shared_examples_for "open" do
|
18
|
+
|
19
|
+
before :each do
|
20
|
+
Scide.stub open: fake_command
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should open the current directory" do
|
24
|
+
expect_success
|
25
|
+
end
|
26
|
+
|
27
|
+
context "with a project name" do
|
28
|
+
let(:argv){ super().push 'a' }
|
29
|
+
let(:expected_args){ [ 'a' ] }
|
30
|
+
|
31
|
+
it "should open the project" do
|
32
|
+
expect_success
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "if it fails" do
|
37
|
+
|
38
|
+
before :each do
|
39
|
+
Scide.stub(:open).and_raise(Scide::Error.new('fubar'))
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should output the error to stderr" do
|
43
|
+
expect_failure "fubar#{Scide::Program::BACKTRACE_NOTICE}"
|
44
|
+
end
|
45
|
+
|
46
|
+
context "with the trace option" do
|
47
|
+
|
48
|
+
let(:argv){ super().unshift '--trace' }
|
49
|
+
|
50
|
+
it "should raise the error" do
|
51
|
+
expect_failure "fubar", true
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
it_behaves_like "open"
|
58
|
+
|
59
|
+
[ '-p', '--projects' ].each do |opt|
|
60
|
+
context "with the #{opt} option" do
|
61
|
+
let(:projects_dir){ '~/Projects' }
|
62
|
+
let(:expected_options){ { projects: projects_dir } }
|
63
|
+
let(:argv){ [ opt, projects_dir ] }
|
64
|
+
it_behaves_like "open"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
[ '-a', '--auto' ].each do |opt|
|
69
|
+
context "with the #{opt} option" do
|
70
|
+
let(:expected_options){ { auto: true } }
|
71
|
+
let(:argv){ [ opt ] }
|
72
|
+
it_behaves_like "open"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
[ '-n', '--noop' ].each do |opt|
|
77
|
+
context "with the #{opt} option" do
|
78
|
+
let(:expected_options){ { noop: true } }
|
79
|
+
let(:argv){ [ opt ] }
|
80
|
+
it_behaves_like "open"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
[ '-b', '--bin' ].each do |opt|
|
85
|
+
context "with the #{opt} option" do
|
86
|
+
let(:expected_options){ { bin: '/bin/custom-screen' } }
|
87
|
+
let(:argv){ [ opt, '/bin/custom-screen' ] }
|
88
|
+
it_behaves_like "open"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
[ '-s', '--screen' ].each do |opt|
|
93
|
+
context "with the #{opt} option" do
|
94
|
+
let(:expected_options){ { screen: '-a' } }
|
95
|
+
let(:argv){ [ opt, "-a" ] }
|
96
|
+
it_behaves_like "open"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
context "with all options" do
|
101
|
+
let(:projects_dir){ '~/Projects' }
|
102
|
+
let(:expected_options){ { projects: projects_dir, auto: true, bin: '/bin/custom-screen', screen: '-r -x', noop: true } }
|
103
|
+
let(:argv){ [ '--projects', projects_dir, '--auto', '--bin', '/bin/custom-screen', '--screen', '-r -x', '--noop' ] }
|
104
|
+
it_behaves_like "open"
|
105
|
+
end
|
106
|
+
|
107
|
+
def expect_success *args
|
108
|
+
args = args.empty? ? expected_args + (expected_options.empty? ? [] : [ expected_options ]) : args
|
109
|
+
Scide.should_receive(:open).with *args
|
110
|
+
program = Scide::Program.new argv
|
111
|
+
stdout, stderr = StringIO.new, StringIO.new
|
112
|
+
$stdout, $stderr = stdout, stderr
|
113
|
+
expect{ program.run! }.to_not raise_error
|
114
|
+
$stdout, $stderr = STDOUT, STDERR
|
115
|
+
expect(Paint.unpaint(stdout.string.chomp "\n")).to eq(expected_output)
|
116
|
+
expect(stderr.string).to be_empty
|
117
|
+
end
|
118
|
+
|
119
|
+
def expect_failure message, expect_raise = false, code = 1, &block
|
120
|
+
program = Scide::Program.new argv
|
121
|
+
if expect_raise
|
122
|
+
expect{ program.run! }.to raise_error(Scide::Error){ |e| expect(e.message).to eq(message) }
|
123
|
+
else
|
124
|
+
stderr = StringIO.new
|
125
|
+
$stderr = stderr
|
126
|
+
expect{ program.run! }.to raise_error(SystemExit){ |e| expect(e.status).to eq(code) }
|
127
|
+
expect(Paint.unpaint(stderr.string.strip)).to eq(message)
|
128
|
+
$stderr = STDERR
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|