defunkt-github 0.1.2 → 0.1.3
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/Manifest +7 -7
- data/README +2 -1
- data/commands/commands.rb +79 -25
- data/commands/helpers.rb +69 -30
- data/lib/github/command.rb +4 -4
- data/lib/github/extensions.rb +28 -0
- data/lib/github.rb +42 -14
- data/spec/command_spec.rb +66 -0
- data/spec/extensions_spec.rb +36 -0
- data/spec/github_spec.rb +65 -0
- data/spec/helper_spec.rb +212 -0
- data/spec/spec_helper.rb +133 -4
- data/spec/ui_spec.rb +506 -0
- data/spec/windoze_spec.rb +36 -0
- metadata +12 -11
- data/spec/helpers/owner_spec.rb +0 -12
- data/spec/helpers/project_spec.rb +0 -12
- data/spec/helpers/public_url_for_spec.rb +0 -12
- data/spec/helpers/repo_for_spec.rb +0 -12
- data/spec/helpers/user_and_repo_from_spec.rb +0 -15
- data/spec/helpers/user_for_spec.rb +0 -12
data/Manifest
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
bin/github
|
2
2
|
commands/commands.rb
|
3
3
|
commands/helpers.rb
|
4
|
+
lib/github/extensions.rb
|
4
5
|
lib/github/command.rb
|
5
6
|
lib/github/helper.rb
|
6
7
|
lib/github.rb
|
7
8
|
LICENSE
|
9
|
+
Manifest
|
8
10
|
README
|
9
11
|
spec/command_spec.rb
|
10
|
-
spec/
|
11
|
-
spec/
|
12
|
-
spec/
|
13
|
-
spec/helpers/repo_for_spec.rb
|
14
|
-
spec/helpers/user_and_repo_from_spec.rb
|
15
|
-
spec/helpers/user_for_spec.rb
|
12
|
+
spec/extensions_spec.rb
|
13
|
+
spec/github_spec.rb
|
14
|
+
spec/helper_spec.rb
|
16
15
|
spec/spec_helper.rb
|
17
|
-
|
16
|
+
spec/ui_spec.rb
|
17
|
+
spec/windoze_spec.rb
|
data/README
CHANGED
@@ -9,7 +9,7 @@ Catch us in the #github room on freenode if you want to get involved. Or just f
|
|
9
9
|
Getting started
|
10
10
|
===========
|
11
11
|
|
12
|
-
$ gem install github
|
12
|
+
$ gem install defunkt-github -s http://gems.github.com
|
13
13
|
|
14
14
|
Run it:
|
15
15
|
|
@@ -51,3 +51,4 @@ Contributors
|
|
51
51
|
- defunkt
|
52
52
|
- maddox
|
53
53
|
- halorgium
|
54
|
+
- kballard
|
data/commands/commands.rb
CHANGED
@@ -1,54 +1,108 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
desc "Open this repo's master branch in a web browser."
|
2
|
+
command :home do |user|
|
3
|
+
if helper.project
|
4
|
+
helper.open helper.homepage_for(user || helper.owner, 'master')
|
5
|
+
end
|
4
6
|
end
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
+
desc "Open this repo in a web browser."
|
9
|
+
command :browse do |user, branch|
|
8
10
|
if helper.project
|
9
|
-
|
11
|
+
# if one arg given, treat it as a branch name
|
12
|
+
# unless it maches user/branch, then split it
|
13
|
+
# if two args given, treat as user branch
|
14
|
+
# if no args given, use defaults
|
15
|
+
user, branch = user.split("/", 2) if branch.nil? unless user.nil?
|
16
|
+
branch = user and user = nil if branch.nil?
|
17
|
+
user ||= helper.branch_user
|
18
|
+
branch ||= helper.branch_name
|
19
|
+
helper.open helper.homepage_for(user, branch)
|
10
20
|
end
|
11
21
|
end
|
12
22
|
|
13
|
-
|
14
|
-
|
23
|
+
desc "Open the network page for this repo in a web browser."
|
24
|
+
command :network do |user|
|
15
25
|
if helper.project
|
16
|
-
|
26
|
+
user ||= helper.owner
|
27
|
+
helper.open helper.network_page_for(user)
|
17
28
|
end
|
18
29
|
end
|
19
30
|
|
20
|
-
|
21
|
-
|
31
|
+
desc "Info about this project."
|
32
|
+
command :info do
|
22
33
|
puts "== Info for #{helper.project}"
|
23
34
|
puts "You are #{helper.owner}"
|
24
|
-
puts "Currently tracking:
|
25
|
-
helper.tracking.each do |(name,user_or_url)|
|
35
|
+
puts "Currently tracking:"
|
36
|
+
helper.tracking.sort { |(a,),(b,)| a == :origin ? -1 : b == :origin ? 1 : a.to_s <=> b.to_s }.each do |(name,user_or_url)|
|
26
37
|
puts " - #{user_or_url} (as #{name})"
|
27
38
|
end
|
28
39
|
end
|
29
40
|
|
30
|
-
|
31
|
-
|
41
|
+
desc "Track another user's repository."
|
42
|
+
flags :private => "Use git@github.com: instead of git://github.com/."
|
43
|
+
flags :ssh => 'Equivalent to --private'
|
44
|
+
command :track do |remote, user|
|
45
|
+
# track remote user
|
46
|
+
# track remote user/repo
|
47
|
+
# track user
|
48
|
+
# track user/repo
|
49
|
+
user, remote = remote, nil if user.nil?
|
32
50
|
die "Specify a user to track" if user.nil?
|
51
|
+
user, repo = user.split("/", 2)
|
33
52
|
die "Already tracking #{user}" if helper.tracking?(user)
|
53
|
+
repo = @helper.project if repo.nil?
|
54
|
+
repo.chomp!(".git")
|
55
|
+
remote ||= user
|
34
56
|
|
35
|
-
|
57
|
+
if options[:private] || options[:ssh]
|
58
|
+
git "remote add #{remote} #{helper.private_url_for_user_and_repo(user, repo)}"
|
59
|
+
else
|
60
|
+
git "remote add #{remote} #{helper.public_url_for_user_and_repo(user, repo)}"
|
61
|
+
end
|
36
62
|
end
|
37
63
|
|
38
|
-
|
39
|
-
|
64
|
+
desc "Pull from a remote."
|
65
|
+
flags :merge => "Automatically merge remote's changes into your master."
|
66
|
+
command :pull do |user, branch|
|
40
67
|
die "Specify a user to pull from" if user.nil?
|
41
|
-
|
68
|
+
user, branch = user.split("/", 2) if branch.nil?
|
42
69
|
branch ||= 'master'
|
43
|
-
|
44
|
-
puts "Switching to #{user}/#{branch}"
|
45
|
-
git "checkout #{user}/#{branch}" if git("checkout -b #{user}/#{branch}").error?
|
70
|
+
GitHub.invoke(:track, user) unless helper.tracking?(user)
|
46
71
|
|
47
72
|
if options[:merge]
|
48
|
-
|
49
|
-
git "checkout master"
|
50
|
-
git_exec "merge #{user}/#{branch}"
|
73
|
+
git_exec "pull #{user} #{branch}"
|
51
74
|
else
|
75
|
+
puts "Switching to #{user}/#{branch}"
|
76
|
+
git "checkout #{user}/#{branch}" if git("checkout -b #{user}/#{branch}").error?
|
52
77
|
git_exec "pull #{user} #{branch}"
|
53
78
|
end
|
54
79
|
end
|
80
|
+
|
81
|
+
desc "Clone a repo."
|
82
|
+
flags :ssh => "Clone using the git@github.com style url."
|
83
|
+
command :clone do |user, repo, dir|
|
84
|
+
die "Specify a user to pull from" if user.nil?
|
85
|
+
if user.include? ?/
|
86
|
+
die "Expected user/repo dir, given extra argument" if dir
|
87
|
+
(user, repo), dir = [user.split('/', 2), repo]
|
88
|
+
end
|
89
|
+
die "Specify a repo to pull from" if repo.nil?
|
90
|
+
|
91
|
+
if options[:ssh]
|
92
|
+
git_exec "clone git@github.com:#{user}/#{repo}.git" + (dir ? " #{dir}" : "")
|
93
|
+
else
|
94
|
+
git_exec "clone git://github.com/#{user}/#{repo}.git" + (dir ? " #{dir}" : "")
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
desc "Generate the text for a pull request."
|
99
|
+
command :'pull-request' do |user, branch|
|
100
|
+
if helper.project
|
101
|
+
die "Specify a user for the pull request" if user.nil?
|
102
|
+
user, branch = user.split('/', 2) if branch.nil?
|
103
|
+
branch ||= 'master'
|
104
|
+
GitHub.invoke(:track, user) unless helper.tracking?(user)
|
105
|
+
|
106
|
+
git_exec "request-pull #{user}/#{branch} origin"
|
107
|
+
end
|
108
|
+
end
|
data/commands/helpers.rb
CHANGED
@@ -1,58 +1,69 @@
|
|
1
|
-
|
1
|
+
helper :user_and_repo_from do |url|
|
2
2
|
case url
|
3
|
-
when %r|^git://github\.com/(
|
4
|
-
when %r|^git@github\.com:(
|
3
|
+
when %r|^git://github\.com/([^/]+/[^/]+)$|: $1.split('/')
|
4
|
+
when %r|^(?:ssh://)?(?:git@)?github\.com:([^/]+/[^/]+)$|: $1.split('/')
|
5
5
|
end
|
6
6
|
end
|
7
7
|
|
8
|
-
|
8
|
+
helper :user_and_repo_for do |remote|
|
9
9
|
user_and_repo_from(url_for(remote))
|
10
10
|
end
|
11
11
|
|
12
|
-
|
13
|
-
user_and_repo_for(remote).first
|
12
|
+
helper :user_for do |remote|
|
13
|
+
user_and_repo_for(remote).try.first
|
14
14
|
end
|
15
15
|
|
16
|
-
|
17
|
-
user_and_repo_for(remote).last
|
16
|
+
helper :repo_for do |remote|
|
17
|
+
user_and_repo_for(remote).try.last
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
repo_for(:origin)
|
20
|
+
helper :project do
|
21
|
+
repo = repo_for(:origin)
|
22
|
+
if repo.nil?
|
23
|
+
if url_for(:origin) == ""
|
24
|
+
STDERR.puts "Error: missing remote 'origin'"
|
25
|
+
else
|
26
|
+
STDERR.puts "Error: remote 'origin' is not a github URL"
|
27
|
+
end
|
28
|
+
exit 1
|
29
|
+
end
|
30
|
+
repo.chomp('.git')
|
22
31
|
end
|
23
32
|
|
24
|
-
|
33
|
+
helper :url_for do |remote|
|
25
34
|
`git config --get remote.#{remote}.url`.chomp
|
26
35
|
end
|
27
36
|
|
28
|
-
|
37
|
+
helper :remotes do
|
29
38
|
regexp = '^remote\.(.+)\.url$'
|
30
|
-
`git config --get-regexp '#{regexp}'`.split(/\n/).
|
39
|
+
`git config --get-regexp '#{regexp}'`.split(/\n/).inject({}) do |memo, line|
|
31
40
|
name_string, url = line.split(/ /, 2)
|
32
41
|
m, name = *name_string.match(/#{regexp}/)
|
33
|
-
[name
|
42
|
+
memo[name.to_sym] = url
|
43
|
+
memo
|
34
44
|
end
|
35
45
|
end
|
36
46
|
|
37
|
-
|
38
|
-
remotes.
|
47
|
+
helper :tracking do
|
48
|
+
remotes.inject({}) do |memo, (name, url)|
|
39
49
|
if ur = user_and_repo_from(url)
|
40
|
-
[name
|
50
|
+
memo[name] = ur.first
|
41
51
|
else
|
42
|
-
[name
|
52
|
+
memo[name] = url
|
43
53
|
end
|
54
|
+
memo
|
44
55
|
end
|
45
56
|
end
|
46
57
|
|
47
|
-
|
48
|
-
tracking.include?(user)
|
58
|
+
helper :tracking? do |user|
|
59
|
+
tracking.values.include?(user)
|
49
60
|
end
|
50
61
|
|
51
|
-
|
62
|
+
helper :owner do
|
52
63
|
user_for(:origin)
|
53
64
|
end
|
54
65
|
|
55
|
-
|
66
|
+
helper :user_and_branch do
|
56
67
|
raw_branch = `git rev-parse --symbolic-full-name HEAD`.chomp.sub(/^refs\/heads\//, '')
|
57
68
|
user, branch = raw_branch.split(/\//, 2)
|
58
69
|
if branch
|
@@ -62,23 +73,51 @@ GitHub.helper :user_and_branch do
|
|
62
73
|
end
|
63
74
|
end
|
64
75
|
|
65
|
-
|
76
|
+
helper :branch_user do
|
66
77
|
user_and_branch.first
|
67
78
|
end
|
68
79
|
|
69
|
-
|
80
|
+
helper :branch_name do
|
70
81
|
user_and_branch.last
|
71
82
|
end
|
72
83
|
|
73
|
-
|
74
|
-
"git://github.com/#{user}/#{
|
84
|
+
helper :public_url_for_user_and_repo do |user, repo|
|
85
|
+
"git://github.com/#{user}/#{repo}.git"
|
86
|
+
end
|
87
|
+
|
88
|
+
helper :private_url_for_user_and_repo do |user, repo|
|
89
|
+
"git@github.com:#{user}/#{repo}.git"
|
90
|
+
end
|
91
|
+
|
92
|
+
helper :public_url_for do |user|
|
93
|
+
public_url_for_user_and_repo user, project
|
75
94
|
end
|
76
95
|
|
77
|
-
|
96
|
+
helper :private_url_for do |user|
|
97
|
+
private_url_for_user_and_repo user, project
|
98
|
+
end
|
99
|
+
|
100
|
+
helper :homepage_for do |user, branch|
|
78
101
|
"https://github.com/#{user}/#{project}/tree/#{branch}"
|
79
102
|
end
|
80
103
|
|
81
|
-
|
82
|
-
|
104
|
+
helper :network_page_for do |user|
|
105
|
+
"https://github.com/#{user}/#{project}/network"
|
106
|
+
end
|
107
|
+
|
108
|
+
helper :has_launchy? do |blk|
|
109
|
+
begin
|
110
|
+
gem 'launchy'
|
111
|
+
require 'launchy'
|
112
|
+
blk.call
|
113
|
+
rescue Gem::LoadError
|
114
|
+
STDERR.puts "Sorry, you need to install launchy: `gem install launchy`"
|
115
|
+
end
|
83
116
|
end
|
84
|
-
|
117
|
+
|
118
|
+
helper :open do |url|
|
119
|
+
has_launchy? proc {
|
120
|
+
Launchy::Browser.new.visit url
|
121
|
+
}
|
122
|
+
end
|
123
|
+
|
data/lib/github/command.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
if Windoze
|
1
|
+
if RUBY_PLATFORM =~ /mswin|mingw/
|
4
2
|
begin
|
5
3
|
require 'win32/open3'
|
6
4
|
rescue LoadError
|
@@ -40,7 +38,9 @@ module GitHub
|
|
40
38
|
end
|
41
39
|
|
42
40
|
def git_exec(*command)
|
43
|
-
|
41
|
+
cmdstr = ['git', command].flatten.join(' ')
|
42
|
+
GitHub.debug "exec: #{cmdstr}"
|
43
|
+
exec cmdstr
|
44
44
|
end
|
45
45
|
|
46
46
|
def sh(*command)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# define #try
|
2
|
+
class Object
|
3
|
+
def try
|
4
|
+
self
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
class NilClass
|
9
|
+
klass = Class.new
|
10
|
+
klass.class_eval do
|
11
|
+
instance_methods.each { |meth| undef_method meth.to_sym unless meth =~ /^__(id|send)__$/ }
|
12
|
+
def method_missing(*args)
|
13
|
+
self
|
14
|
+
end
|
15
|
+
end
|
16
|
+
NilProxy = klass.new
|
17
|
+
def try
|
18
|
+
NilProxy
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# define #tap
|
23
|
+
class Object
|
24
|
+
def tap(&block)
|
25
|
+
block.call(self)
|
26
|
+
self
|
27
|
+
end
|
28
|
+
end
|
data/lib/github.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
$:.unshift File.dirname(__FILE__)
|
2
|
+
require 'github/extensions'
|
2
3
|
require 'github/command'
|
3
4
|
require 'github/helper'
|
5
|
+
require 'rubygems'
|
4
6
|
|
5
7
|
##
|
6
8
|
# Starting simple.
|
7
9
|
#
|
8
10
|
# $ github <command> <args>
|
9
11
|
#
|
10
|
-
# GitHub.
|
12
|
+
# GitHub.command <command> do |*args|
|
11
13
|
# whatever
|
12
14
|
# end
|
13
15
|
#
|
@@ -20,13 +22,22 @@ module GitHub
|
|
20
22
|
|
21
23
|
BasePath = File.expand_path(File.dirname(__FILE__) + '/..')
|
22
24
|
|
23
|
-
def
|
25
|
+
def command(command, &block)
|
24
26
|
debug "Registered `#{command}`"
|
27
|
+
descriptions[command] = @next_description if @next_description
|
28
|
+
@next_description = nil
|
29
|
+
flag_descriptions[command].update @next_flags if @next_flags
|
30
|
+
@next_flags = nil
|
25
31
|
commands[command.to_s] = Command.new(block)
|
26
32
|
end
|
27
33
|
|
28
|
-
def
|
29
|
-
|
34
|
+
def desc(str)
|
35
|
+
@next_description = str
|
36
|
+
end
|
37
|
+
|
38
|
+
def flags(hash)
|
39
|
+
@next_flags ||= {}
|
40
|
+
@next_flags.update hash
|
30
41
|
end
|
31
42
|
|
32
43
|
def helper(command, &block)
|
@@ -36,6 +47,7 @@ module GitHub
|
|
36
47
|
|
37
48
|
def activate(args)
|
38
49
|
@options = parse_options(args)
|
50
|
+
@debug = @options[:debug]
|
39
51
|
load 'helpers.rb'
|
40
52
|
load 'commands.rb'
|
41
53
|
invoke(args.shift, *args)
|
@@ -55,27 +67,38 @@ module GitHub
|
|
55
67
|
@descriptions ||= {}
|
56
68
|
end
|
57
69
|
|
70
|
+
def flag_descriptions
|
71
|
+
@flagdescs ||= Hash.new { |h, k| h[k] = {} }
|
72
|
+
end
|
73
|
+
|
58
74
|
def options
|
59
75
|
@options
|
60
76
|
end
|
61
77
|
|
62
78
|
def parse_options(args)
|
63
|
-
|
64
|
-
args.inject({}) do |memo, arg|
|
65
|
-
|
66
|
-
|
79
|
+
idx = 0
|
80
|
+
args.clone.inject({}) do |memo, arg|
|
81
|
+
case arg
|
82
|
+
when /^--(.+?)=(.*)/
|
83
|
+
args.delete_at(idx)
|
67
84
|
memo.merge($1.to_sym => $2)
|
68
|
-
|
69
|
-
args.
|
85
|
+
when /^--(.+)/
|
86
|
+
args.delete_at(idx)
|
70
87
|
memo.merge($1.to_sym => true)
|
88
|
+
when "--"
|
89
|
+
args.delete_at(idx)
|
90
|
+
return memo
|
71
91
|
else
|
92
|
+
idx += 1
|
72
93
|
memo
|
73
94
|
end
|
74
95
|
end
|
75
96
|
end
|
76
97
|
|
77
98
|
def load(file)
|
78
|
-
file[0] == ?/ ?
|
99
|
+
file[0] == ?/ ? path = file : path = BasePath + "/commands/#{file}"
|
100
|
+
data = File.read(path)
|
101
|
+
GitHub.module_eval data, path
|
79
102
|
end
|
80
103
|
|
81
104
|
def debug(*messages)
|
@@ -87,13 +110,18 @@ module GitHub
|
|
87
110
|
end
|
88
111
|
end
|
89
112
|
|
90
|
-
GitHub.
|
113
|
+
GitHub.command :default do
|
91
114
|
puts "Usage: github command <space separated arguments>", ''
|
92
115
|
puts "Available commands:", ''
|
93
116
|
longest = GitHub.descriptions.map { |d,| d.to_s.size }.max
|
94
117
|
GitHub.descriptions.each do |command, desc|
|
95
|
-
|
96
|
-
puts " #{
|
118
|
+
cmdstr = "%-#{longest}s" % command
|
119
|
+
puts " #{cmdstr} => #{desc}"
|
120
|
+
flongest = GitHub.flag_descriptions[command].map { |d,| "--#{d}".size }.max
|
121
|
+
GitHub.flag_descriptions[command].each do |flag, fdesc|
|
122
|
+
flagstr = "#{" " * longest} %-#{flongest}s" % "--#{flag}"
|
123
|
+
puts " #{flagstr}: #{fdesc}"
|
124
|
+
end
|
97
125
|
end
|
98
126
|
puts
|
99
127
|
end
|
data/spec/command_spec.rb
CHANGED
@@ -0,0 +1,66 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe GitHub::Command do
|
4
|
+
before(:each) do
|
5
|
+
@command = GitHub::Command.new(proc { |x| puts x })
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should return a GitHub::Helper" do
|
9
|
+
@command.helper.should be_instance_of(GitHub::Helper)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should call successfully" do
|
13
|
+
@command.should_receive(:puts).with("test").once
|
14
|
+
@command.call("test")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should return options" do
|
18
|
+
GitHub.should_receive(:options).with().once.and_return({:ssh => true})
|
19
|
+
@command.options.should == {:ssh => true}
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should successfully call out to the shell" do
|
23
|
+
unguard(Kernel, :fork)
|
24
|
+
unguard(Kernel, :exec)
|
25
|
+
hi = @command.sh("echo hi")
|
26
|
+
hi.should == "hi"
|
27
|
+
hi.out?.should be(true)
|
28
|
+
hi.error?.should be(false)
|
29
|
+
hi.command.should == "echo hi"
|
30
|
+
bye = @command.sh("echo bye >&2")
|
31
|
+
bye.should == "bye"
|
32
|
+
bye.out?.should be(false)
|
33
|
+
bye.error?.should be(true)
|
34
|
+
bye.command.should == "echo bye >&2"
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should return the results of a git operation" do
|
38
|
+
GitHub::Command::Shell.should_receive(:new).with("git rev-parse master").once.and_return do |*cmds|
|
39
|
+
s = mock("GitHub::Commands::Shell")
|
40
|
+
s.should_receive(:run).once.and_return("sha1")
|
41
|
+
s
|
42
|
+
end
|
43
|
+
@command.git("rev-parse master").should == "sha1"
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should print the results of a git operation" do
|
47
|
+
@command.should_receive(:puts).with("sha1").once
|
48
|
+
GitHub::Command::Shell.should_receive(:new).with("git rev-parse master").once.and_return do |*cmds|
|
49
|
+
s = mock("GitHub::Commands::Shell")
|
50
|
+
s.should_receive(:run).once.and_return("sha1")
|
51
|
+
s
|
52
|
+
end
|
53
|
+
@command.pgit("rev-parse master")
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should exec a git command" do
|
57
|
+
@command.should_receive(:exec).with("git rev-parse master").once
|
58
|
+
@command.git_exec "rev-parse master"
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should die" do
|
62
|
+
@command.should_receive(:puts).once.with("=> message")
|
63
|
+
@command.should_receive(:exit!).once
|
64
|
+
@command.die "message"
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/spec_helper"
|
2
|
+
|
3
|
+
describe "When calling #try" do
|
4
|
+
specify "objects should return themselves" do
|
5
|
+
obj = 1; obj.try.should equal(obj)
|
6
|
+
obj = "foo"; obj.try.should equal(obj)
|
7
|
+
obj = { :foo => "bar" }; obj.try.should equal(obj)
|
8
|
+
end
|
9
|
+
|
10
|
+
specify "objects should behave as if #try wasn't called" do
|
11
|
+
"foo".try.size.should == 3
|
12
|
+
{ :foo => :bar }.try.fetch(:foo).should == :bar
|
13
|
+
[1, 2, 3].try.map { |x| x + 1 }.should == [2, 3, 4]
|
14
|
+
end
|
15
|
+
|
16
|
+
specify "nil should return the singleton NilClass::NilProxy" do
|
17
|
+
nil.try.should equal(NilClass::NilProxy)
|
18
|
+
end
|
19
|
+
|
20
|
+
specify "nil should ignore any calls made past #try" do
|
21
|
+
nil.try.size.should equal(NilClass::NilProxy)
|
22
|
+
nil.try.sdlfj.should equal(NilClass::NilProxy)
|
23
|
+
nil.try.one.two.three.should equal(NilClass::NilProxy)
|
24
|
+
end
|
25
|
+
|
26
|
+
specify "classes should respond just like objects" do
|
27
|
+
String.try.should equal(String)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "When calling #tap" do
|
32
|
+
specify "objects should behave like Ruby 1.9's #tap" do
|
33
|
+
obj = "foo"
|
34
|
+
obj.tap { |obj| obj.size.should == 3 }.should equal(obj)
|
35
|
+
end
|
36
|
+
end
|
data/spec/github_spec.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe "GitHub.parse_options" do
|
4
|
+
it "should parse --bare options" do
|
5
|
+
args = ["--bare", "--test"]
|
6
|
+
GitHub.parse_options(args).should == {:bare => true, :test => true}
|
7
|
+
args.should == []
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should parse options intermixed with non-options" do
|
11
|
+
args = ["text", "--bare", "more text", "--option", "--foo"]
|
12
|
+
GitHub.parse_options(args).should == {:bare => true, :option => true, :foo => true}
|
13
|
+
args.should == ["text", "more text"]
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should parse --foo=bar style options" do
|
17
|
+
args = ["--foo=bar", "--bare"]
|
18
|
+
GitHub.parse_options(args).should == {:bare => true, :foo => "bar"}
|
19
|
+
args.should == []
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should stop parsing options at --" do
|
23
|
+
args = ["text", "--bare", "--", "--foo"]
|
24
|
+
GitHub.parse_options(args).should == {:bare => true}
|
25
|
+
args.should == ["text", "--foo"]
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should handle duplicate options" do
|
29
|
+
args = ["text", "--foo=bar", "--bare", "--foo=baz"]
|
30
|
+
GitHub.parse_options(args).should == {:foo => "baz", :bare => true}
|
31
|
+
args.should == ["text"]
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should handle duplicate --bare options surrounding --" do
|
35
|
+
args = ["text", "--bare", "--", "--bare"]
|
36
|
+
GitHub.parse_options(args).should == {:bare => true}
|
37
|
+
args.should == ["text", "--bare"]
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should handle no options" do
|
41
|
+
args = ["text", "more text"]
|
42
|
+
GitHub.parse_options(args).should == {}
|
43
|
+
args.should == ["text", "more text"]
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should handle no args" do
|
47
|
+
args = []
|
48
|
+
GitHub.parse_options(args).should == {}
|
49
|
+
args.should == []
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should not set up debugging when --debug not passed" do
|
53
|
+
GitHub.stub!(:load)
|
54
|
+
GitHub.stub!(:invoke)
|
55
|
+
GitHub.activate(['default'])
|
56
|
+
GitHub.should_not be_debug
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should set up debugging when passed --debug" do
|
60
|
+
GitHub.stub!(:load)
|
61
|
+
GitHub.stub!(:invoke)
|
62
|
+
GitHub.activate(['default', '--debug'])
|
63
|
+
GitHub.should be_debug
|
64
|
+
end
|
65
|
+
end
|