github_api 0.1.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. data/LICENSE.txt +20 -0
  2. data/README.rdoc +159 -0
  3. data/Rakefile +52 -0
  4. data/features/github.feature +9 -0
  5. data/features/step_definitions/github_steps.rb +0 -0
  6. data/features/support/env.rb +13 -0
  7. data/lib/github_api.rb +55 -0
  8. data/lib/github_api/api.rb +133 -0
  9. data/lib/github_api/api/extract_options.rb +17 -0
  10. data/lib/github_api/api/mime.rb +5 -0
  11. data/lib/github_api/api/utils.rb +9 -0
  12. data/lib/github_api/client.rb +35 -0
  13. data/lib/github_api/configuration.rb +84 -0
  14. data/lib/github_api/connection.rb +91 -0
  15. data/lib/github_api/error.rb +35 -0
  16. data/lib/github_api/gists.rb +199 -0
  17. data/lib/github_api/gists/comments.rb +74 -0
  18. data/lib/github_api/git_data.rb +26 -0
  19. data/lib/github_api/git_data/blobs.rb +9 -0
  20. data/lib/github_api/git_data/commits.rb +9 -0
  21. data/lib/github_api/git_data/references.rb +9 -0
  22. data/lib/github_api/git_data/tags.rb +9 -0
  23. data/lib/github_api/git_data/trees.rb +9 -0
  24. data/lib/github_api/issues.rb +201 -0
  25. data/lib/github_api/issues/comments.rb +98 -0
  26. data/lib/github_api/issues/events.rb +50 -0
  27. data/lib/github_api/issues/labels.rb +191 -0
  28. data/lib/github_api/issues/milestones.rb +119 -0
  29. data/lib/github_api/orgs.rb +90 -0
  30. data/lib/github_api/orgs/members.rb +109 -0
  31. data/lib/github_api/orgs/teams.rb +236 -0
  32. data/lib/github_api/pull_requests.rb +210 -0
  33. data/lib/github_api/pull_requests/comments.rb +134 -0
  34. data/lib/github_api/repos.rb +256 -0
  35. data/lib/github_api/repos/collaborators.rb +59 -0
  36. data/lib/github_api/repos/commits.rb +115 -0
  37. data/lib/github_api/repos/downloads.rb +77 -0
  38. data/lib/github_api/repos/forks.rb +29 -0
  39. data/lib/github_api/repos/hooks.rb +67 -0
  40. data/lib/github_api/repos/keys.rb +53 -0
  41. data/lib/github_api/repos/watching.rb +50 -0
  42. data/lib/github_api/request.rb +75 -0
  43. data/lib/github_api/request/oauth2.rb +33 -0
  44. data/lib/github_api/response.rb +10 -0
  45. data/lib/github_api/response/jsonize.rb +22 -0
  46. data/lib/github_api/response/mashify.rb +26 -0
  47. data/lib/github_api/response/raise_error.rb +33 -0
  48. data/lib/github_api/users.rb +82 -0
  49. data/lib/github_api/users/emails.rb +49 -0
  50. data/lib/github_api/users/followers.rb +98 -0
  51. data/lib/github_api/users/keys.rb +84 -0
  52. data/lib/github_api/version.rb +12 -0
  53. data/spec/fixtures/collaborators_list.json +6 -0
  54. data/spec/fixtures/commits_list.json +25 -0
  55. data/spec/fixtures/repos_branches_list.json +7 -0
  56. data/spec/fixtures/repos_list.json +27 -0
  57. data/spec/github/api_spec.rb +6 -0
  58. data/spec/github/client_spec.rb +6 -0
  59. data/spec/github/gists/comments_spec.rb +5 -0
  60. data/spec/github/gists_spec.rb +5 -0
  61. data/spec/github/git_data/blobs_spec.rb +5 -0
  62. data/spec/github/git_data/commits_spec.rb +5 -0
  63. data/spec/github/git_data/references_spec.rb +5 -0
  64. data/spec/github/git_data/tags_spec.rb +5 -0
  65. data/spec/github/git_data/trees_spec.rb +5 -0
  66. data/spec/github/git_data_spec.rb +5 -0
  67. data/spec/github/issues/comments_spec.rb +5 -0
  68. data/spec/github/issues/events_spec.rb +5 -0
  69. data/spec/github/issues/labels_spec.rb +5 -0
  70. data/spec/github/issues/milestones_spec.rb +5 -0
  71. data/spec/github/issues_spec.rb +5 -0
  72. data/spec/github/orgs/members_spec.rb +5 -0
  73. data/spec/github/orgs/teams_spec.rb +5 -0
  74. data/spec/github/orgs_spec.rb +5 -0
  75. data/spec/github/repos/collaborators_spec.rb +6 -0
  76. data/spec/github/repos/commits_spec.rb +5 -0
  77. data/spec/github/repos/downloads_spec.rb +5 -0
  78. data/spec/github/repos/forks_spec.rb +5 -0
  79. data/spec/github/repos/hooks_spec.rb +5 -0
  80. data/spec/github/repos/keys_spec.rb +5 -0
  81. data/spec/github/repos/watching_spec.rb +5 -0
  82. data/spec/github/repos_spec.rb +35 -0
  83. data/spec/github_spec.rb +5 -0
  84. data/spec/spec_helper.rb +15 -0
  85. metadata +284 -0
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+
3
+ module Github
4
+ class Issues
5
+ module Events
6
+
7
+ # List events for an issue
8
+ #
9
+ # = Examples
10
+ # @github = Github.new
11
+ # @github.issues.events 'user-name', 'repo-name', 'issue-id'
12
+ #
13
+ # List events for a repository
14
+ #
15
+ # = Examples
16
+ # @github = Github.new
17
+ # @github.issues.events 'user-name', 'repo-name'
18
+ #
19
+ def events(user_name=nil, repo_name=nil, issue_id=nil, params={})
20
+ _update_user_repo_params(user_name, repo_name)
21
+ _validate_user_repo_params(user, repo) unless user? && repo?
22
+ _normalize_params_keys(params)
23
+
24
+ response = if issue_id
25
+ get("/repos/#{user}/#{repo}/issues/#{issue_id}/events", params)
26
+ else
27
+ get("/repos/#{user}/#{repo}/issues/events", params)
28
+ end
29
+ return response unless block_given?
30
+ response.each { |el| yield el }
31
+ end
32
+
33
+ # Get a single event
34
+ #
35
+ # = Examples
36
+ # @github = Github.new
37
+ # @github.issues.event 'user-name', 'repo-name', 'event-id'
38
+ #
39
+ def event(user_name, repo_name, event_id, params={})
40
+ _update_user_repo_params(user_name, repo_name)
41
+ _validate_user_repo_params(user, repo) unless user? && repo?
42
+ _validate_presence_of event_id
43
+ _normalize_params_keys(params)
44
+
45
+ get("/repos/#{user}/#{repo}/issues/events/#{event_id}")
46
+ end
47
+
48
+ end # Events
49
+ end # Issues
50
+ end # Github
@@ -0,0 +1,191 @@
1
+ # encoding: utf-8
2
+
3
+ module Github
4
+ class Issues
5
+ module Labels
6
+
7
+ VALID_LABEL_INPUTS = %w[ name color ]
8
+
9
+ # List all labels for a repository
10
+ #
11
+ # = Examples
12
+ # @github = Github.new :user => 'user-name', :repo => 'repo-name'
13
+ # @github.issues.labels
14
+ # @github.issues.labels { |label| ... }
15
+ #
16
+ def labels(user_name=nil, repo_name=nil, params={})
17
+ _update_user_repo_params(user_name, repo_name)
18
+ _validate_user_repo_params(user, repo) unless user? && repo?
19
+ _normalize_params_keys(params)
20
+
21
+ response = get("/repos/#{user}/#{repo}/labels", params)
22
+ return response unless block_given?
23
+ response.each { |el| yield el }
24
+ end
25
+
26
+ # Get a single label
27
+ #
28
+ # = Examples
29
+ # @github = Github.new
30
+ # @github.issues.label 'user-name', 'repo-name', 'label-id'
31
+ #
32
+ def label(user_name, repo_name, label_id, params={})
33
+ _update_user_repo_params(user_name, repo_name)
34
+ _validate_user_repo_params(user, repo) unless user? && repo?
35
+ _normalize_params_keys(params)
36
+
37
+ get("/repos/#{user}/#{repo}/labels/#{label_id}", params)
38
+ end
39
+
40
+ # Create a label
41
+ #
42
+ # = Inputs
43
+ # <tt>:name</tt> - Required string
44
+ # <tt>:color</tt> - Required string - 6 character hex code, without leading #
45
+ #
46
+ # = Examples
47
+ # @github = Github.new :user => 'user-name', :repo => 'repo-name'
48
+ # @github.issues.create_label :name => 'API', :color => 'FFFFFF'
49
+ #
50
+ def create_label(user_name=nil, repo_name=nil, params={})
51
+ _update_user_repo_params(user_name, repo_name)
52
+ _validate_user_repo_params(user, repo) unless user? && repo?
53
+
54
+ _normalize_params_keys(params)
55
+ _filter_params_keys(VALID_LABEL_INPUTS, params)
56
+
57
+ raise ArgumentError, "Required params are: :name, :color" unless _validate_inputs(VALID_LABEL_INPUTS, params)
58
+
59
+ post("/repos/#{user}/#{repo}/labels", params)
60
+ end
61
+
62
+ # Update a label
63
+ #
64
+ # = Inputs
65
+ # <tt>:name</tt> - Required string
66
+ # <tt>:color</tt> - Required string - 6 character hex code, without leading #
67
+ #
68
+ # = Examples
69
+ # @github = Github.new
70
+ # @github.issues.update_label 'user-name', 'repo-name', 'label-id', :name => 'API', :color => "FFFFFF"
71
+ #
72
+ def update_label(user_name, repo_name, label_id, params={})
73
+ _update_user_repo_params(user_name, repo_name)
74
+ _validate_user_repo_params(user, repo) unless user? && repo?
75
+ _validate_presence_of label_id
76
+
77
+ _normalize_params_keys(params)
78
+ _filter_params_keys(VALID_LABEL_INPUTS, params)
79
+
80
+ raise ArgumentError, "Required params are: :name, :color" unless _validate_inputs(VALID_LABEL_INPUTS, params)
81
+
82
+ patch("/repos/#{user}/#{repo}/labels/#{label_id}", params)
83
+ end
84
+
85
+ # Delete a label
86
+ #
87
+ # = Examples
88
+ # @github = Github.new
89
+ # @github.issues.delete_label 'user-name', 'repo-name', 'label-id'
90
+ #
91
+ def delete_label(user_name, repo_name, label_id, params={})
92
+ _update_user_repo_params(user_name, repo_name)
93
+ _validate_user_repo_params(user, repo) unless user? && repo?
94
+ _validate_presence_of milestone_id
95
+ _normalize_params_keys(params)
96
+
97
+ delete("/repos/#{user}/#{repo}/labels/#{label_id}", params)
98
+ end
99
+
100
+ # List labels on an issue
101
+ #
102
+ # = Examples
103
+ # @github = Github.new
104
+ # @github.issues.labels_for 'user-name', 'repo-name', 'issue-id'
105
+ #
106
+ def labels_for(user_name, repo_name, issue_id, params={})
107
+ _update_user_repo_params(user_name, repo_name)
108
+ _validate_user_repo_params(user, repo) unless user? && repo?
109
+ _validate_presence_of(issue_id)
110
+ _normalize_params_keys(params)
111
+
112
+ get("/repos/#{user}/#{repo}/issues/#{issue_id}/labels", params)
113
+ end
114
+
115
+ # Add labels to an issue
116
+ #
117
+ # = Examples
118
+ # @github = Github.new
119
+ # @github.issues.add_labels 'user-name', 'repo-name', 'issue-id', 'label1', 'label2', ...
120
+ #
121
+ def add_labels(user_name, repo_name, issue_id, *args)
122
+ params = args.last.is_a?(Hash) ? args.pop : {}
123
+ params['data'] = [args].flatten unless args.nil?
124
+ _update_user_repo_params(user_name, repo_name)
125
+ _validate_user_repo_params(user, repo) unless user? && repo?
126
+ _validate_presence_of(issue_id)
127
+ _normalize_params_keys(params)
128
+
129
+ post("/repos/#{user}/#{repo}/issues/#{issue_id}/labels", params)
130
+ end
131
+
132
+ # Remove a label from an issue
133
+ #
134
+ # = Examples
135
+ # @github = Github.new
136
+ # @github.issues.remove_label 'user-name', 'repo-name', 'issue-id', 'label-id'
137
+ #
138
+ # Remove all labels from an issue
139
+ # = Examples
140
+ # @github = Github.new
141
+ # @github.issues.remove_label 'user-name', 'repo-name', 'issue-id'
142
+ #
143
+ def remove_label(user_name, repo_name, issue_id, label_id=nil, params={})
144
+ _update_user_repo_params(user_name, repo_name)
145
+ _validate_user_repo_params(user, repo) unless user? && repo?
146
+ _validate_presence_of(issue_id)
147
+ _normalize_params_keys(params)
148
+
149
+ if label_id
150
+ delete("/repos/#{user}/#{repo}/issues/#{issue_id}/labels/#{label_id}", params)
151
+ else
152
+ delete("/repos/#{user}/#{repo}/issues/#{issue_id}/labels", params)
153
+ end
154
+ end
155
+
156
+ # Replace all labels for an issue
157
+ #
158
+ # Sending an empty array ([]) will remove all Labels from the Issue.
159
+ #
160
+ # = Examples
161
+ # @github = Github.new
162
+ # @github.issues.replace_labels 'user-name', 'repo-name', 'issue-id', 'label1', 'label2', ...
163
+ #
164
+ def replace_labels(user_name, repo_name, issue_id, *args)
165
+ params = args.last.is_a?(Hash) ? args.pop : {}
166
+ params['data'] = [args].flatten unless args.nil?
167
+ _update_user_repo_params(user_name, repo_name)
168
+ _validate_user_repo_params(user, repo) unless user? && repo?
169
+ _validate_presence_of(issue_id)
170
+ _normalize_params_keys(params)
171
+
172
+ put("/repos/#{user}/#{repo}/issues/#{issue_id}/labels", params)
173
+ end
174
+
175
+ # Get labels for every issue in a milestone
176
+ #
177
+ # = Examples
178
+ # @github = Github.new
179
+ # @github.issues.get_label 'user-name', 'repo-name', 'milestone-id'
180
+ #
181
+ def get_label(user_name, repo_name, milestone_id, params={})
182
+ _update_user_repo_params(user_name, repo_name)
183
+ _validate_user_repo_params(user, repo) unless user? && repo?
184
+ _validate_presence_of(issue_id)
185
+
186
+ get("/repos/#{user}/#{repo}/milestones/#{milestone_id}/labels", params)
187
+ end
188
+
189
+ end # Labels
190
+ end # Issues
191
+ end # Github
@@ -0,0 +1,119 @@
1
+ # encoding: utf-8
2
+
3
+ module Github
4
+ class Issues
5
+ module Milestones
6
+
7
+ VALID_MILSTONE_OPTIONS = {
8
+ 'state' => %w[ open closed ],
9
+ 'sort' => %w[ due_date completeness ],
10
+ 'direction' => %w[ desc asc ]
11
+ }
12
+
13
+ VALID_MILESTONE_INPUTS = %w[ title state description due_on ]
14
+
15
+ # List milestones for a repository
16
+ #
17
+ # = Parameters
18
+ # <tt>:state</tt> - <tt>open</tt>, <tt>closed</tt>, default: <tt>open</tt>
19
+ # <tt>:sort</tt> - <tt>due_date</tt>, <tt>completeness</tt>, default: <tt>due_date</tt>
20
+ # <tt>:direction</tt> - <tt>asc</tt>, <tt>desc</tt>, default: <tt>desc</tt>
21
+ #
22
+ # = Examples
23
+ # @github = Github.new :user => 'user-name', :repo => 'repo-name'
24
+ # @github.issues.milestones
25
+ #
26
+ def milestones(user_name=nil, repo_name=nil, params={})
27
+ _update_user_repo_params(user_name, repo_name)
28
+ _validate_user_repo_params(user, repo) unless user? && repo?
29
+
30
+ _normalize_params_keys(params)
31
+ _filter_params_keys(VALID_MILSTONE_OPTIONS.keys, params)
32
+ _validate_params_values(VALID_MILSTONE_OPTIONS, params)
33
+
34
+ response = get("/repos/#{user}/#{repo}/milestones", params)
35
+ return response unless block_given?
36
+ response.each { |el| yield el }
37
+ end
38
+
39
+ # Get a single milestone
40
+ #
41
+ # = Examples
42
+ # @github = Github.new
43
+ # @github.issues.milestone 'user-name', 'repo-name', 'milestone-id'
44
+ #
45
+ def milestone(user_name, repo_name, milestone_id, params={})
46
+ _update_user_repo_params(user_name, repo_name)
47
+ _validate_user_repo_params(user, repo) unless user? && repo?
48
+ _normalize_params_keys(params)
49
+
50
+ get("/repos/#{user}/#{repo}/milestones/#{milestone_id}", params)
51
+ end
52
+
53
+ # Create a milestone
54
+ #
55
+ # = Inputs
56
+ # <tt>:title</tt> - Required string
57
+ # <tt>:state</tt> - Optional string - <tt>open</tt> or <tt>closed</tt>
58
+ # <tt>:description</tt> - Optional string
59
+ # <tt>:due_on</tt> - Optional string - ISO 8601 time
60
+ #
61
+ # = Examples
62
+ # @github = Github.new :user => 'user-name', :repo => 'repo-name'
63
+ # @github.issues.create_milestone :title => 'hello-world'
64
+ #
65
+ def create_milestone(user_name=nil, repo_name=nil, params={})
66
+ _update_user_repo_params(user_name, repo_name)
67
+ _validate_user_repo_params(user, repo) unless user? && repo?
68
+
69
+ _normalize_params_keys(params)
70
+ _filter_params_keys(VALID_MILESTONE_INPUTS, params)
71
+
72
+ raise ArgumentError, "Required params are: :title" unless _validate_inputs(%w[ title ], params)
73
+
74
+ post("/repos/#{user}/#{repo}/milestones", params)
75
+ end
76
+
77
+ # Update a milestone
78
+ #
79
+ # = Inputs
80
+ # <tt>:title</tt> - Required string
81
+ # <tt>:state</tt> - Optional string - <tt>open</tt> or <tt>closed</tt>
82
+ # <tt>:description</tt> - Optional string
83
+ # <tt>:due_on</tt> - Optional string - ISO 8601 time
84
+ #
85
+ # = Examples
86
+ # @github = Github.new
87
+ # @github.issues.update_milestone 'user-name', 'repo-name', 'milestone-id', :title => 'hello-world'
88
+ #
89
+ def update_milestone(user_name, repo_name, milestone_id, params={})
90
+ _update_user_repo_params(user_name, repo_name)
91
+ _validate_user_repo_params(user, repo) unless user? && repo?
92
+ _validate_presence_of milestone_id
93
+
94
+ _normalize_params_keys(params)
95
+ _filter_params_keys(VALID_MILESTONE_INPUTS, params)
96
+
97
+ raise ArgumentError, "Required params are: :title" unless _validate_inputs(%w[ title ], params)
98
+
99
+ patch("/repos/#{user}/#{repo}/milestones/#{milestone_id}", params)
100
+ end
101
+
102
+ # Delete a milestone
103
+ #
104
+ # = Examples
105
+ # @github = Github.new
106
+ # @github.issues.delete_milestone 'user-name', 'repo-name', 'milestone-id'
107
+ #
108
+ def delete_milestone(user_name, repo_name, milestone_id, params={})
109
+ _update_user_repo_params(user_name, repo_name)
110
+ _validate_user_repo_params(user, repo) unless user? && repo?
111
+ _validate_presence_of milestone_id
112
+ _normalize_params_keys(params)
113
+
114
+ delete("/repos/#{user}/#{repo}/milestones/#{milestone_id}", params)
115
+ end
116
+
117
+ end # Milestones
118
+ end # Issues
119
+ end # Github
@@ -0,0 +1,90 @@
1
+ # encoding: utf-8
2
+
3
+ module Github
4
+ class Orgs < API
5
+ extend AutoloadHelper
6
+
7
+ autoload_all 'github_api/orgs',
8
+ :Members => 'members',
9
+ :Teams => 'teams'
10
+
11
+ include Github::Orgs::Members
12
+ include Github::Orgs::Teams
13
+
14
+ VALID_ORG_PARAM_NAMES = %w[
15
+ billing_email
16
+ company
17
+ email
18
+ location
19
+ name
20
+ ]
21
+
22
+ # Creates new Orgs API
23
+ def initialize(options = {})
24
+ super(options)
25
+ end
26
+
27
+ # List all public organizations for a user.
28
+ #
29
+ # = Examples
30
+ # @github = Github.new :user => 'user-name'
31
+ # @github.orgs.orgs
32
+ #
33
+ # List public and private organizations for the authenticated user.
34
+ #
35
+ # @github = Github.new :oauth_token => '..'
36
+ # @github.orgs.org 'github'
37
+ #
38
+ def orgs(user_name=nil, params={})
39
+ _update_user_repo_params(user_name)
40
+ _normalize_params_keys(params)
41
+
42
+ response = if user?
43
+ get("/users/#{user}/orgs", params)
44
+ else
45
+ get("/user/orgs", params)
46
+ end
47
+ return response unless block_given?
48
+ response.each { |el| yield el }
49
+ end
50
+
51
+ # Get properties for a single organization
52
+ #
53
+ # = Examples
54
+ # @github = Github.new
55
+ # @github.orgs.org 'github'
56
+ #
57
+ def org(org_name, params={})
58
+ _validate_presence_of org_name
59
+ get("/orgs/#{org_name}")
60
+ end
61
+
62
+ # Edit organization
63
+ #
64
+ # = Parameters
65
+ # <tt>:billing_email</tt> - Optional string - Billing email address. This address is not publicized.
66
+ # <tt>:company</tt> - Optional string
67
+ # <tt>:email</tt> - Optional string
68
+ # <tt>:location</tt> - Optional string
69
+ # <tt>:name</tt> - Optional string
70
+ #
71
+ # = Examples
72
+ # @github = Github.new :oauth_token => '...'
73
+ # @github.orgs.edit_org 'github',
74
+ # "billing_email" => "support@github.com",
75
+ # "blog" => "https://github.com/blog",
76
+ # "company" => "GitHub",
77
+ # "email" => "support@github.com",
78
+ # "location" => "San Francisco",
79
+ # "name" => "github"
80
+ #
81
+ def edit_org(org_name, params={})
82
+ _validate_presence_of org_name
83
+ _normalize_params_keys(params)
84
+ _filter_params_keys(VALID_ORG_PARAM_NAMES, params)
85
+
86
+ patch("/orgs/#{org_name}", params)
87
+ end
88
+
89
+ end # Orgs
90
+ end # Github