github_cli 0.5.9 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +1 -0
- data/CHANGELOG.md +12 -1
- data/Gemfile.lock +12 -10
- data/README.md +18 -0
- data/features/authorization.feature +53 -0
- data/features/blob.feature +1 -1
- data/features/download.feature +13 -11
- data/features/gist.feature +9 -1
- data/features/label.feature +11 -12
- data/features/member.feature +5 -4
- data/features/merging.feature +5 -4
- data/features/organization.feature +5 -4
- data/features/repository.feature +9 -1
- data/features/search.feature +5 -4
- data/github_cli.gemspec +1 -1
- data/lib/github_cli/api.rb +56 -49
- data/lib/github_cli/apis/assignee.rb +6 -6
- data/lib/github_cli/apis/authorization.rb +5 -5
- data/lib/github_cli/apis/blob.rb +6 -6
- data/lib/github_cli/apis/collaborator.rb +12 -12
- data/lib/github_cli/apis/commit.rb +6 -6
- data/lib/github_cli/apis/content.rb +9 -9
- data/lib/github_cli/apis/download.rb +15 -15
- data/lib/github_cli/apis/email.rb +9 -9
- data/lib/github_cli/apis/event.rb +24 -24
- data/lib/github_cli/apis/follower.rb +16 -15
- data/lib/github_cli/apis/fork.rb +6 -6
- data/lib/github_cli/apis/gist.rb +31 -30
- data/lib/github_cli/apis/hook.rb +6 -6
- data/lib/github_cli/apis/issue.rb +12 -12
- data/lib/github_cli/apis/key.rb +15 -15
- data/lib/github_cli/apis/label.rb +24 -26
- data/lib/github_cli/apis/member.rb +15 -27
- data/lib/github_cli/apis/merging.rb +3 -3
- data/lib/github_cli/apis/milestone.rb +15 -15
- data/lib/github_cli/apis/notification.rb +18 -18
- data/lib/github_cli/apis/organization.rb +9 -9
- data/lib/github_cli/apis/pull_request.rb +24 -24
- data/lib/github_cli/apis/reference.rb +15 -15
- data/lib/github_cli/apis/repository.rb +13 -12
- data/lib/github_cli/apis/search.rb +12 -12
- data/lib/github_cli/apis/starring.rb +15 -15
- data/lib/github_cli/apis/status.rb +6 -6
- data/lib/github_cli/apis/tag.rb +6 -6
- data/lib/github_cli/apis/team.rb +39 -39
- data/lib/github_cli/apis/tree.rb +6 -6
- data/lib/github_cli/apis/user.rb +9 -9
- data/lib/github_cli/apis/watching.rb +15 -15
- data/lib/github_cli/cli.rb +24 -16
- data/lib/github_cli/commands/assignees.rb +8 -2
- data/lib/github_cli/commands/authorizations.rb +10 -13
- data/lib/github_cli/commands/blobs.rb +9 -3
- data/lib/github_cli/commands/collaborators.rb +16 -4
- data/lib/github_cli/commands/commits.rb +11 -6
- data/lib/github_cli/commands/contents.rb +9 -6
- data/lib/github_cli/commands/downloads.rb +30 -6
- data/lib/github_cli/commands/emails.rb +12 -3
- data/lib/github_cli/commands/events.rb +30 -8
- data/lib/github_cli/commands/followers.rb +20 -5
- data/lib/github_cli/commands/forks.rb +6 -4
- data/lib/github_cli/commands/gists.rb +39 -12
- data/lib/github_cli/commands/hooks.rb +1 -1
- data/lib/github_cli/commands/issues.rb +15 -4
- data/lib/github_cli/commands/keys.rb +20 -5
- data/lib/github_cli/commands/labels.rb +53 -14
- data/lib/github_cli/commands/members.rb +28 -9
- data/lib/github_cli/commands/merging.rb +3 -2
- data/lib/github_cli/commands/milestones.rb +27 -15
- data/lib/github_cli/commands/notifications.rb +19 -11
- data/lib/github_cli/commands/organizations.rb +24 -5
- data/lib/github_cli/commands/pull_requests.rb +30 -8
- data/lib/github_cli/commands/references.rb +17 -5
- data/lib/github_cli/commands/repositories.rb +6 -4
- data/lib/github_cli/commands/search.rb +24 -6
- data/lib/github_cli/commands/starring.rb +19 -5
- data/lib/github_cli/commands/statuses.rb +7 -3
- data/lib/github_cli/commands/tags.rb +7 -3
- data/lib/github_cli/commands/teams.rb +52 -17
- data/lib/github_cli/commands/trees.rb +6 -2
- data/lib/github_cli/commands/users.rb +9 -3
- data/lib/github_cli/commands/watching.rb +19 -5
- data/lib/github_cli/vendor/thor/actions/directory.rb +2 -0
- data/lib/github_cli/vendor/thor/actions/empty_directory.rb +3 -19
- data/lib/github_cli/vendor/thor/actions/file_manipulation.rb +4 -1
- data/lib/github_cli/vendor/thor/actions.rb +1 -1
- data/lib/github_cli/vendor/thor/base.rb +20 -18
- data/lib/github_cli/vendor/thor/command.rb +1 -1
- data/lib/github_cli/vendor/thor/error.rb +0 -4
- data/lib/github_cli/vendor/thor/group.rb +4 -9
- data/lib/github_cli/vendor/thor/runner.rb +1 -1
- data/lib/github_cli/vendor/thor/shell/basic.rb +25 -7
- data/lib/github_cli/vendor/thor/version.rb +1 -1
- data/lib/github_cli/vendor/thor.rb +17 -2
- data/lib/github_cli/version.rb +1 -1
- data/spec/github_cli/api/configure_spec.rb +50 -0
- data/spec/github_cli/api/github_api_spec.rb +19 -0
- data/spec/github_cli/commands/assignees_spec.rb +1 -1
- data/spec/github_cli/commands/blobs_spec.rb +1 -1
- data/spec/github_cli/commands/collaborators_spec.rb +1 -1
- data/spec/github_cli/commands/commits_spec.rb +1 -1
- data/spec/github_cli/commands/contents_spec.rb +1 -1
- data/spec/github_cli/commands/downloads_spec.rb +35 -0
- data/spec/github_cli/commands/emails_spec.rb +1 -1
- data/spec/github_cli/commands/events_spec.rb +1 -1
- data/spec/github_cli/commands/followers_spec.rb +1 -1
- data/spec/github_cli/commands/forks_spec.rb +1 -1
- data/spec/github_cli/commands/gists_spec.rb +6 -1
- data/spec/github_cli/commands/issues_spec.rb +1 -1
- data/spec/github_cli/commands/keys_spec.rb +1 -1
- data/spec/github_cli/commands/labels_spec.rb +13 -3
- data/spec/github_cli/commands/members_spec.rb +46 -0
- data/spec/github_cli/commands/merging_spec.rb +1 -1
- data/spec/github_cli/commands/milestones_spec.rb +1 -1
- data/spec/github_cli/commands/notifications_spec.rb +1 -1
- data/spec/github_cli/commands/organizations_spec.rb +30 -0
- data/spec/github_cli/commands/pull_requests_spec.rb +1 -1
- data/spec/github_cli/commands/references_spec.rb +1 -1
- data/spec/github_cli/commands/repositories_spec.rb +5 -0
- data/spec/github_cli/commands/starring_spec.rb +1 -1
- data/spec/github_cli/commands/statuses_spec.rb +1 -1
- data/spec/github_cli/commands/tags_spec.rb +1 -1
- data/spec/github_cli/commands/teams_spec.rb +1 -1
- data/spec/github_cli/commands/trees_spec.rb +1 -1
- data/spec/github_cli/commands/users_spec.rb +1 -1
- data/spec/github_cli/commands/watching_spec.rb +1 -1
- metadata +27 -17
- data/spec/github_cli/api_spec.rb +0 -19
@@ -7,12 +7,18 @@ module GithubCLI
|
|
7
7
|
|
8
8
|
desc 'list <org>', "List teams"
|
9
9
|
def list(org)
|
10
|
-
|
10
|
+
global_options = options.dup
|
11
|
+
params = options[:params].dup
|
12
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
13
|
+
Team.all org, params, global_options
|
11
14
|
end
|
12
15
|
|
13
16
|
desc 'get <id>', "Get a team"
|
14
17
|
def get(id)
|
15
|
-
|
18
|
+
global_options = options.dup
|
19
|
+
params = options[:params].dup
|
20
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
21
|
+
Team.get id, params, global_options
|
16
22
|
end
|
17
23
|
|
18
24
|
option :name, :type => :string, :required => true
|
@@ -32,12 +38,13 @@ module GithubCLI
|
|
32
38
|
* admin - team members can pull, push and administor these repositories.\n
|
33
39
|
DESC
|
34
40
|
def create(org)
|
41
|
+
global_options = options.dup
|
35
42
|
params = options[:params].dup
|
36
|
-
params['name']
|
43
|
+
params['name'] = options[:name]
|
37
44
|
params['repo_names'] = options[:repo_names] if options[:repo_names]
|
38
45
|
params['permission'] = options[:permission] if options[:permission]
|
39
|
-
|
40
|
-
Team.create org, params,
|
46
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
47
|
+
Team.create org, params, global_options
|
41
48
|
end
|
42
49
|
|
43
50
|
option :name, :type => :string, :required => true
|
@@ -55,11 +62,12 @@ module GithubCLI
|
|
55
62
|
* admin - team members can pull, push and administor these repositories.\n
|
56
63
|
DESC
|
57
64
|
def edit(id)
|
65
|
+
global_options = options.dup
|
58
66
|
params = options[:params].dup
|
59
|
-
params['name']
|
67
|
+
params['name'] = options[:name]
|
60
68
|
params['permission'] = options[:permission] if options[:permission]
|
61
|
-
|
62
|
-
Team.edit id, params,
|
69
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
70
|
+
Team.edit id, params, global_options
|
63
71
|
end
|
64
72
|
|
65
73
|
desc 'delete <id>', 'Delete team <id>'
|
@@ -67,12 +75,18 @@ module GithubCLI
|
|
67
75
|
In order to delete a team, the authenticated user must be an owner of the org that the team is associated with.
|
68
76
|
DESC
|
69
77
|
def delete(id)
|
70
|
-
|
78
|
+
global_options = options.dup
|
79
|
+
params = options[:params].dup
|
80
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
81
|
+
Team.delete id, params, global_options
|
71
82
|
end
|
72
83
|
|
73
84
|
desc 'list_member <id>', "List team <id> members"
|
74
85
|
def list_member(id)
|
75
|
-
|
86
|
+
global_options = options.dup
|
87
|
+
params = options[:params].dup
|
88
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
89
|
+
Team.all_member id, params, global_options
|
76
90
|
end
|
77
91
|
|
78
92
|
desc 'member <id> <user>', 'Check if <user> is a team member'
|
@@ -80,7 +94,10 @@ module GithubCLI
|
|
80
94
|
In order to get if a user is a member of a team, the authenticated user must be a member of the team.
|
81
95
|
DESC
|
82
96
|
def member(id, user)
|
83
|
-
|
97
|
+
global_options = options.dup
|
98
|
+
params = options[:params].dup
|
99
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
100
|
+
Team.member id, user, params, global_options
|
84
101
|
end
|
85
102
|
|
86
103
|
desc 'add_member <id> <user>', 'Add team member'
|
@@ -88,7 +105,10 @@ module GithubCLI
|
|
88
105
|
In order to add a user to a team, the authenticated user must have ‘admin’ permissions to the team or be an owner of the org that the team is associated with.
|
89
106
|
DESC
|
90
107
|
def add_member(id, user)
|
91
|
-
|
108
|
+
global_options = options.dup
|
109
|
+
params = options[:params].dup
|
110
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
111
|
+
Team.add_member id, user, params, global_options
|
92
112
|
end
|
93
113
|
|
94
114
|
desc 'remove_member <id> <user>', 'Remove team member'
|
@@ -99,17 +119,26 @@ module GithubCLI
|
|
99
119
|
them from the team.
|
100
120
|
DESC
|
101
121
|
def remove_member(id, user)
|
102
|
-
|
122
|
+
global_options = options.dup
|
123
|
+
params = options[:params].dup
|
124
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
125
|
+
Team.remove_member id, user, params, global_options
|
103
126
|
end
|
104
127
|
|
105
128
|
desc 'list_repo <id>', "List team <id> repositories"
|
106
129
|
def list_repo(id)
|
107
|
-
|
130
|
+
global_options = options.dup
|
131
|
+
params = options[:params].dup
|
132
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
133
|
+
Team.all_repo id, params, global_options
|
108
134
|
end
|
109
135
|
|
110
136
|
desc 'repo <id> <user> <repo>', 'Check if <repo> is managed by team <id>'
|
111
137
|
def repo(id, user, repo)
|
112
|
-
|
138
|
+
global_options = options.dup
|
139
|
+
params = options[:params].dup
|
140
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
141
|
+
Team.repo id, user, repo, params, global_options
|
113
142
|
end
|
114
143
|
|
115
144
|
desc 'add_repo <id> <user> <repo>', 'Add team <repo>'
|
@@ -119,7 +148,10 @@ module GithubCLI
|
|
119
148
|
by the organization, or a direct for of a repo owned by the organization.
|
120
149
|
DESC
|
121
150
|
def add_repo(id, user, repo)
|
122
|
-
|
151
|
+
global_options = options.dup
|
152
|
+
params = options[:params].dup
|
153
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
154
|
+
Team.add_repo id, user, repo, params, global_options
|
123
155
|
end
|
124
156
|
|
125
157
|
desc 'remove_repo <id> <user> <repo>', 'Remove team <repo>'
|
@@ -129,7 +161,10 @@ module GithubCLI
|
|
129
161
|
delete the repo, it just removes it from the team.
|
130
162
|
DESC
|
131
163
|
def remove_repo(id, user, repo)
|
132
|
-
|
164
|
+
global_options = options.dup
|
165
|
+
params = options[:params].dup
|
166
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
167
|
+
Team.remove_repo id, user, repo, params, global_options
|
133
168
|
end
|
134
169
|
|
135
170
|
end # Teams
|
@@ -9,9 +9,11 @@ module GithubCLI
|
|
9
9
|
method_option :recursive, :type => :boolean, :aliases => ["-r"],
|
10
10
|
:desc => 'get a tree recursively'
|
11
11
|
def get(user, repo, sha)
|
12
|
+
global_options = options.dup
|
12
13
|
params = options[:params].dup
|
13
14
|
params['recursive'] = options[:recursive] if options[:recursive]
|
14
|
-
|
15
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
16
|
+
Tree.get user, repo, sha, params, global_options
|
15
17
|
end
|
16
18
|
|
17
19
|
desc 'create <user> <repo>', 'Create a new Tree'
|
@@ -36,10 +38,12 @@ module GithubCLI
|
|
36
38
|
tree.content - String of content you want this file to have - GitHub will write this blob out and use the SHA for this entry. Use either this or tree.sha
|
37
39
|
DESC
|
38
40
|
def create(user, repo)
|
41
|
+
global_options = options.dup
|
39
42
|
params = options[:params].dup
|
40
43
|
params['base_tree'] = options[:base_tree] if options[:base_tree]
|
41
44
|
params['tree'] = options[:tree] if options[:tree]
|
42
|
-
|
45
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
46
|
+
Tree.create user, repo, params, global_options
|
43
47
|
end
|
44
48
|
|
45
49
|
end # Blobs
|
@@ -9,9 +9,11 @@ module GithubCLI
|
|
9
9
|
option :since, :type => :string, :banner => "<user>",
|
10
10
|
:desc => "The integer ID of the last User that you’ve seen."
|
11
11
|
def list
|
12
|
+
global_options = options.dup
|
12
13
|
params = options[:params].dup
|
13
14
|
params['since'] = options[:since] if options[:since]
|
14
|
-
|
15
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
16
|
+
User.all params, global_options
|
15
17
|
end
|
16
18
|
|
17
19
|
desc 'get', 'Get the authenticated user'
|
@@ -19,9 +21,11 @@ module GithubCLI
|
|
19
21
|
:desc => 'Get a single unauthenticated <user>',
|
20
22
|
:banner => '<user>'
|
21
23
|
def get
|
24
|
+
global_options = options.dup
|
22
25
|
params = options[:params].dup
|
23
26
|
params['user'] = options[:user] if options[:user]
|
24
|
-
|
27
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
28
|
+
User.get params, global_options
|
25
29
|
end
|
26
30
|
|
27
31
|
desc 'update', 'Update the authenticated user'
|
@@ -33,6 +37,7 @@ module GithubCLI
|
|
33
37
|
option :hireable, :type => :string
|
34
38
|
option :bio, :type => :string
|
35
39
|
def update
|
40
|
+
global_options = options.dup
|
36
41
|
params = options[:params].dup
|
37
42
|
params['name'] = options[:name] if options[:name]
|
38
43
|
params['email'] = options[:email] if options[:email]
|
@@ -41,7 +46,8 @@ module GithubCLI
|
|
41
46
|
params['location'] = options[:location] if options[:location]
|
42
47
|
params['hireable'] = options[:hireable] if options[:hireable]
|
43
48
|
params['bio'] = options[:bio] if options[:bio]
|
44
|
-
|
49
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
50
|
+
User.update params, global_options
|
45
51
|
end
|
46
52
|
|
47
53
|
end # Users
|
@@ -7,33 +7,47 @@ module GithubCLI
|
|
7
7
|
|
8
8
|
desc 'list <user> <repo>', 'Lists repo watchers'
|
9
9
|
def list(user, repo)
|
10
|
-
|
10
|
+
global_options = options.dup
|
11
|
+
params = options[:params].dup
|
12
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
13
|
+
Watching.list user, repo, params, global_options
|
11
14
|
end
|
12
15
|
|
13
16
|
desc 'watched', 'Lists repos being watched by a user'
|
14
17
|
method_option :user, :type => :string, :aliases => ["-u"],
|
15
18
|
:desc => 'Watch repositories for <user>'
|
16
19
|
def watched
|
20
|
+
global_options = options.dup
|
17
21
|
params = options[:params].dup
|
18
22
|
if options[:user]
|
19
23
|
params['user'] = options[:user]
|
20
24
|
end
|
21
|
-
|
25
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
26
|
+
Watching.watched params, global_options
|
22
27
|
end
|
23
28
|
|
24
29
|
desc 'watching <user> <repo>', 'Check if you are watching a repository'
|
25
30
|
def watching(user, repo)
|
26
|
-
|
31
|
+
global_options = options.dup
|
32
|
+
params = options[:params].dup
|
33
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
34
|
+
Watching.watching? user, repo, params, global_options
|
27
35
|
end
|
28
36
|
|
29
37
|
desc 'start <user> <repo>', 'Watch a repository'
|
30
38
|
def start(user, repo)
|
31
|
-
|
39
|
+
global_options = options.dup
|
40
|
+
params = options[:params].dup
|
41
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
42
|
+
Watching.start user, repo, params, global_options
|
32
43
|
end
|
33
44
|
|
34
45
|
desc 'stop <user> <repo>', 'Stop watching a repository'
|
35
46
|
def stop(user, repo)
|
36
|
-
|
47
|
+
global_options = options.dup
|
48
|
+
params = options[:params].dup
|
49
|
+
Util.hash_without!(global_options, params.keys + ['params'])
|
50
|
+
Watching.stop user, repo, params, global_options
|
37
51
|
end
|
38
52
|
|
39
53
|
end # Watching
|
@@ -39,6 +39,7 @@ class Thor
|
|
39
39
|
# config<Hash>:: give :verbose => false to not log the status.
|
40
40
|
# If :recursive => false, does not look for paths recursively.
|
41
41
|
# If :mode => :preserve, preserve the file mode from the source.
|
42
|
+
# If :exclude_pattern => /regexp/, prevents copying files that match that regexp.
|
42
43
|
#
|
43
44
|
# ==== Examples
|
44
45
|
#
|
@@ -78,6 +79,7 @@ class Thor
|
|
78
79
|
|
79
80
|
files(lookup).sort.each do |file_source|
|
80
81
|
next if File.directory?(file_source)
|
82
|
+
next if config[:exclude_pattern] && file_source.match(config[:exclude_pattern])
|
81
83
|
file_destination = File.join(given_destination, file_source.gsub(source, '.'))
|
82
84
|
file_destination.gsub!('/./', '/')
|
83
85
|
|
@@ -97,28 +97,12 @@ class Thor
|
|
97
97
|
#
|
98
98
|
# user.rb
|
99
99
|
#
|
100
|
-
# The method referenced
|
101
|
-
# get the exception with the corresponding error message.
|
100
|
+
# The method referenced can be either public or private.
|
102
101
|
#
|
103
102
|
def convert_encoded_instructions(filename)
|
104
103
|
filename.gsub(/%(.*?)%/) do |initial_string|
|
105
|
-
|
106
|
-
|
107
|
-
end
|
108
|
-
|
109
|
-
# Calls `base`'s public method `sym`.
|
110
|
-
# Returns:: result of `base.sym` or `nil` if `sym` wasn't found in
|
111
|
-
# `base`
|
112
|
-
# Raises:: Thor::PrivateMethodEncodedError if `sym` references
|
113
|
-
# a private method.
|
114
|
-
def call_public_method(sym)
|
115
|
-
if base.respond_to?(sym)
|
116
|
-
base.send(sym)
|
117
|
-
elsif base.respond_to?(sym, true)
|
118
|
-
raise Thor::PrivateMethodEncodedError,
|
119
|
-
"Method #{base.class}##{sym} should be public, not private"
|
120
|
-
else
|
121
|
-
nil
|
104
|
+
method = $1.strip
|
105
|
+
base.respond_to?(method, true) ? base.send(method) : initial_string
|
122
106
|
end
|
123
107
|
end
|
124
108
|
|
@@ -293,8 +293,11 @@ class Thor
|
|
293
293
|
end
|
294
294
|
alias :remove_dir :remove_file
|
295
295
|
|
296
|
+
attr_accessor :output_buffer
|
297
|
+
private :output_buffer, :output_buffer=
|
298
|
+
|
296
299
|
private
|
297
|
-
|
300
|
+
|
298
301
|
def concat(string)
|
299
302
|
@output_buffer.concat(string)
|
300
303
|
end
|
@@ -227,7 +227,7 @@ class Thor
|
|
227
227
|
# ==== Parameters
|
228
228
|
# command<String>:: the command to be executed.
|
229
229
|
# config<Hash>:: give :verbose => false to not log the status, :capture => true to hide to output. Specify :with
|
230
|
-
# to append an executable to command
|
230
|
+
# to append an executable to command execution.
|
231
231
|
#
|
232
232
|
# ==== Example
|
233
233
|
#
|
@@ -119,6 +119,18 @@ class Thor
|
|
119
119
|
end
|
120
120
|
|
121
121
|
module ClassMethods
|
122
|
+
def attr_reader(*) #:nodoc:
|
123
|
+
no_commands { super }
|
124
|
+
end
|
125
|
+
|
126
|
+
def attr_writer(*) #:nodoc:
|
127
|
+
no_commands { super }
|
128
|
+
end
|
129
|
+
|
130
|
+
def attr_accessor(*) #:nodoc:
|
131
|
+
no_commands { super }
|
132
|
+
end
|
133
|
+
|
122
134
|
# If you want to raise an error for unknown options, call check_unknown_options!
|
123
135
|
# This is disabled by default to allow dynamic invocations.
|
124
136
|
def check_unknown_options!
|
@@ -406,11 +418,10 @@ class Thor
|
|
406
418
|
# thor :my_command
|
407
419
|
#
|
408
420
|
def namespace(name=nil)
|
409
|
-
|
410
|
-
when nil
|
411
|
-
@namespace || Thor::Util.namespace_from_thor_class(self)
|
412
|
-
else
|
421
|
+
if name
|
413
422
|
@namespace = name.to_s
|
423
|
+
else
|
424
|
+
@namespace ||= Thor::Util.namespace_from_thor_class(self)
|
414
425
|
end
|
415
426
|
end
|
416
427
|
|
@@ -462,17 +473,11 @@ class Thor
|
|
462
473
|
end
|
463
474
|
alias handle_no_task_error handle_no_command_error
|
464
475
|
|
465
|
-
def handle_argument_error(command, error, arity
|
466
|
-
msg = "#{basename} #{command.name}"
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
msg << "s" if required > 1
|
471
|
-
else
|
472
|
-
msg = "call #{msg} as"
|
473
|
-
end
|
474
|
-
|
475
|
-
msg << ": #{self.banner(command).inspect}."
|
476
|
+
def handle_argument_error(command, error, args, arity) #:nodoc:
|
477
|
+
msg = "ERROR: #{basename} #{command.name} was called with "
|
478
|
+
msg << 'no arguments' if args.empty?
|
479
|
+
msg << 'arguments ' << args.inspect if !args.empty?
|
480
|
+
msg << "\nUsage: #{self.banner(command).inspect}."
|
476
481
|
raise InvocationError, msg
|
477
482
|
end
|
478
483
|
|
@@ -584,9 +589,6 @@ class Thor
|
|
584
589
|
# Return if it's not a public instance method
|
585
590
|
return unless public_method_defined?(meth.to_sym)
|
586
591
|
|
587
|
-
# Return if attr_* added the method
|
588
|
-
return if caller.first.to_s[/`attr_(reader|writer|accessor)'/]
|
589
|
-
|
590
592
|
return if @no_commands || !create_command(meth)
|
591
593
|
|
592
594
|
is_thor_reserved_word?(meth, :command)
|
@@ -32,7 +32,7 @@ class Thor
|
|
32
32
|
end
|
33
33
|
rescue ArgumentError => e
|
34
34
|
handle_argument_error?(instance, e, caller) ?
|
35
|
-
instance.class.handle_argument_error(self, e, arity) : (raise e)
|
35
|
+
instance.class.handle_argument_error(self, e, args, arity) : (raise e)
|
36
36
|
rescue NoMethodError => e
|
37
37
|
handle_no_method_error?(instance, e, caller) ?
|
38
38
|
instance.class.handle_no_command_error(name) : (raise e)
|
@@ -205,15 +205,10 @@ class Thor::Group
|
|
205
205
|
end
|
206
206
|
alias printable_tasks printable_commands
|
207
207
|
|
208
|
-
def handle_argument_error(command, error, arity
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
msg << ", but it should not."
|
213
|
-
else
|
214
|
-
msg = "You should not pass arguments to #{basename} #{command.name}."
|
215
|
-
end
|
216
|
-
|
208
|
+
def handle_argument_error(command, error, args, arity) #:nodoc:
|
209
|
+
msg = "#{basename} #{command.name} takes #{arity} argument"
|
210
|
+
msg << "s" if arity > 1
|
211
|
+
msg << ", but it should not."
|
217
212
|
raise error, msg
|
218
213
|
end
|
219
214
|
|
@@ -206,7 +206,7 @@ class Thor::Runner < Thor #:nodoc:
|
|
206
206
|
# in the thor_root instead of loading them all.
|
207
207
|
#
|
208
208
|
# By default, it also traverses the current path until find Thor files, as
|
209
|
-
# described in thorfiles. This look up can be skipped by
|
209
|
+
# described in thorfiles. This look up can be skipped by supplying
|
210
210
|
# skip_lookup true.
|
211
211
|
#
|
212
212
|
def initialize_thorfiles(relevant_to=nil, skip_lookup=false)
|
@@ -47,8 +47,13 @@ class Thor
|
|
47
47
|
#
|
48
48
|
def ask(statement, *args)
|
49
49
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
50
|
+
color = args.first
|
50
51
|
|
51
|
-
|
52
|
+
if options[:limited_to]
|
53
|
+
ask_filtered(statement, color, options)
|
54
|
+
else
|
55
|
+
ask_simply(statement, color, options)
|
56
|
+
end
|
52
57
|
end
|
53
58
|
|
54
59
|
# Say (print) something to the user. If the sentence ends with a whitespace
|
@@ -372,17 +377,30 @@ HELP
|
|
372
377
|
end
|
373
378
|
end
|
374
379
|
|
375
|
-
def ask_simply(statement, color
|
376
|
-
|
377
|
-
|
380
|
+
def ask_simply(statement, color, options)
|
381
|
+
default = options[:default]
|
382
|
+
message = [statement, ("(#{default})" if default), nil].uniq.join(" ")
|
383
|
+
say(message, color)
|
384
|
+
result = stdin.gets
|
385
|
+
|
386
|
+
return unless result
|
387
|
+
|
388
|
+
result.strip!
|
389
|
+
|
390
|
+
if default && result == ""
|
391
|
+
default
|
392
|
+
else
|
393
|
+
result
|
394
|
+
end
|
378
395
|
end
|
379
396
|
|
380
|
-
def ask_filtered(statement,
|
397
|
+
def ask_filtered(statement, color, options)
|
398
|
+
answer_set = options[:limited_to]
|
381
399
|
correct_answer = nil
|
382
400
|
until correct_answer
|
383
|
-
|
401
|
+
answers = answer_set.join(", ")
|
402
|
+
answer = ask_simply("#{statement} [#{answers}]", color, options)
|
384
403
|
correct_answer = answer_set.include?(answer) ? answer : nil
|
385
|
-
answers = answer_set.map(&:inspect).join(", ")
|
386
404
|
say("Your response must be one of: [#{answers}]. Please try again.") unless correct_answer
|
387
405
|
end
|
388
406
|
correct_answer
|
@@ -3,6 +3,16 @@ require 'thor/base'
|
|
3
3
|
|
4
4
|
class Thor
|
5
5
|
class << self
|
6
|
+
# Allows for custom "Command" package naming.
|
7
|
+
#
|
8
|
+
# === Parameters
|
9
|
+
# name<String>
|
10
|
+
# options<Hash>
|
11
|
+
#
|
12
|
+
def package_name(name, options={})
|
13
|
+
@package_name = name.nil? || name == '' ? nil : name
|
14
|
+
end
|
15
|
+
|
6
16
|
# Sets the default command when thor is executed without an explicit command to be called.
|
7
17
|
#
|
8
18
|
# ==== Parameters
|
@@ -185,7 +195,12 @@ class Thor
|
|
185
195
|
end
|
186
196
|
list.sort!{ |a,b| a[0] <=> b[0] }
|
187
197
|
|
188
|
-
|
198
|
+
if @package_name
|
199
|
+
shell.say "#{@package_name} commands:"
|
200
|
+
else
|
201
|
+
shell.say "Commands:"
|
202
|
+
end
|
203
|
+
|
189
204
|
shell.print_table(list, :indent => 2, :truncate => true)
|
190
205
|
shell.say
|
191
206
|
class_options_help(shell)
|
@@ -299,7 +314,7 @@ class Thor
|
|
299
314
|
end
|
300
315
|
|
301
316
|
def stop_on_unknown_option?(command) #:nodoc:
|
302
|
-
|
317
|
+
command && !@stop_on_unknown_option.nil? && @stop_on_unknown_option.include?(command.name.to_sym)
|
303
318
|
end
|
304
319
|
|
305
320
|
protected
|
data/lib/github_cli/version.rb
CHANGED
@@ -0,0 +1,50 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe GithubCLI::API, '#configure' do
|
6
|
+
let(:object) { described_class }
|
7
|
+
|
8
|
+
before {
|
9
|
+
GithubCLI.stub(:config).and_return(config)
|
10
|
+
}
|
11
|
+
|
12
|
+
subject { object.configure }
|
13
|
+
|
14
|
+
context 'with default' do
|
15
|
+
let(:config) { { } }
|
16
|
+
|
17
|
+
its(:adapter) { should eql(:net_http) }
|
18
|
+
|
19
|
+
its(:ssl) { should eql({}) }
|
20
|
+
|
21
|
+
its(:site) { should eql('https://github.com') }
|
22
|
+
|
23
|
+
its(:endpoint) { should eql('https://api.github.com') }
|
24
|
+
|
25
|
+
its(:oauth_token) { should be_nil }
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'with config values' do
|
29
|
+
let(:config) {
|
30
|
+
{
|
31
|
+
'core.ssl' => {"verify" => false},
|
32
|
+
'core.adapter' => :patron,
|
33
|
+
'core.site' => 'http://site.com',
|
34
|
+
'core.endpoint' => 'http://api.com',
|
35
|
+
'user.token' => 'abc1234'
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
its(:adapter) { should eql(:patron) }
|
40
|
+
|
41
|
+
its(:ssl) { should eql({"verify" => false})}
|
42
|
+
|
43
|
+
its(:site) { should eql('http://site.com')}
|
44
|
+
|
45
|
+
its(:endpoint) { should eql('http://api.com') }
|
46
|
+
|
47
|
+
its(:oauth_token) { should eql('abc1234') }
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GithubCLI::API, '#gihtub_api' do
|
4
|
+
before {
|
5
|
+
described_class.send(:instance_variable_set, :@github_api, nil)
|
6
|
+
}
|
7
|
+
|
8
|
+
it 'sets up github api connection' do
|
9
|
+
github_instance = stub.as_null_object
|
10
|
+
Github.should_receive(:new).and_return github_instance
|
11
|
+
expect(described_class.github_api).to eql(github_instance)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'does not instantiate on subsequent calls' do
|
15
|
+
described_class.github_api
|
16
|
+
Github.should_receive(:new).exactly(0).times
|
17
|
+
described_class.github_api
|
18
|
+
end
|
19
|
+
end # GithubCLI::API
|