github_api 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -12,7 +12,7 @@ Grab the gem by issuing
12
12
 
13
13
  or in your Gemfile
14
14
 
15
- gem "github_api", "~> 0.1.1"
15
+ gem "github_api", "~> 0.2.0"
16
16
 
17
17
  == Usage
18
18
 
@@ -35,4 +35,8 @@ class Hash # :nodoc:
35
35
  return hash
36
36
  end unless method_defined?(:symbolize_keys!)
37
37
 
38
+ def serialize # :nodoc:
39
+ self.map { |key, val| [key, val].join("=") }.join("&")
40
+ end unless method_defined?(:serialize)
41
+
38
42
  end # Hash
@@ -12,7 +12,8 @@ module Github
12
12
  :Forks => 'forks',
13
13
  :Hooks => 'hooks',
14
14
  :Keys => 'keys',
15
- :Watching => 'watching'
15
+ :Watching => 'watching',
16
+ :PubSubHubbub => 'pub_sub_hubbub'
16
17
 
17
18
  include Github::Repos::Collaborators
18
19
  include Github::Repos::Commits
@@ -21,6 +22,7 @@ module Github
21
22
  include Github::Repos::Hooks
22
23
  include Github::Repos::Keys
23
24
  include Github::Repos::Watching
25
+ include Github::Repos::PubSubHubbub
24
26
 
25
27
  DEFAULT_REPO_OPTIONS = {
26
28
  "homepage" => "https://github.com",
@@ -28,7 +30,7 @@ module Github
28
30
  "has_issues" => true,
29
31
  "has_wiki" => true,
30
32
  "has_downloads" => true
31
- }
33
+ }.freeze
32
34
 
33
35
  VALID_REPO_OPTIONS = %w[
34
36
  name
@@ -40,7 +42,7 @@ module Github
40
42
  has_downloads
41
43
  ].freeze
42
44
 
43
- VALID_REPO_TYPES = %w[ all public private member ]
45
+ VALID_REPO_TYPES = %w[ all public private member ].freeze
44
46
 
45
47
  # Creates new Repositories API
46
48
  def initialize(options = {})
@@ -3,10 +3,100 @@
3
3
  module Github
4
4
  class Repos
5
5
  module PubSubHubbub
6
-
7
- def subscribe(topic, callback)
8
- post("/hub")
6
+
7
+ # Subscribe to existing topic through pubsubhubbub
8
+ #
9
+ # = Parameters
10
+ # * topic - Required string - The URI of the GitHub repository to subscribe to. The path must be in the format of /:user/:repo/events/:event.
11
+ # * callback - Required string - The URI to receive the updates to the topic.
12
+ #
13
+ # = Examples
14
+ # @github = Github.new :oauth_token => '...'
15
+ # @github.subscribe 'https://github.com/:user/:repo/events/push',
16
+ # 'github://Email?address=peter-murach@gmail.com',
17
+ # :verify => 'sync',
18
+ # :secret => '...'
19
+ #
20
+ def subscribe(topic, callback, params={})
21
+ _validate_presence_of topic, callback
22
+ _normalize_params_keys(params)
23
+ _merge_action!("subscribe", topic, callback, params)
24
+
25
+ post("/hub", params)
26
+ end
27
+
28
+ # Unsubscribe from existing topic though pubsubhubbub
29
+ #
30
+ #
31
+ def unsubscribe(topic, callback, params={})
32
+ _validate_presence_of topic, callback
33
+ _normalize_params_keys(params)
34
+ _merge_action!("unsubscribe", topic, callback, params)
35
+
36
+ post("/hub", params)
37
+ end
38
+
39
+ # Subscribe repository to service hook through pubsubhubbub
40
+ #
41
+ # = Parameters
42
+ # * repo-name - Required string,
43
+ # * service-name - Required string
44
+ # * <tt>:event</tt> - Required hash key for the type of event. The default event is <tt>push</tt>
45
+ #
46
+ # = Examples
47
+ # @github = Github.new :oauth_token => '...'
48
+ # @github.repos.subscribe_service 'user-name', 'repo-name', 'campfire',
49
+ # :subdomain => 'github',
50
+ # :room => 'Commits',
51
+ # :token => 'abc123',
52
+ # :event => 'watch'
53
+ #
54
+ def subscribe_service(user_name, repo_name, service_name, params={})
55
+ _validate_presence_of user_name, repo_name, service_name
56
+ _normalize_params_keys(params)
57
+ event = params.delete('event') || 'push'
58
+ topic = "https://github.com/#{user_name}/#{repo_name}/events/#{event}"
59
+ callback = "github://#{service_name}?#{params.serialize}"
60
+
61
+ subscribe(topic, callback)
9
62
  end
63
+ alias :subscribe_repository :subscribe_service
64
+
65
+ # Subscribe repository to service hook through pubsubhubbub
66
+ #
67
+ # = Parameters
68
+ # * repo-name - Required string,
69
+ # * service-name - Required string
70
+ # * <tt>:event</tt> - Optional hash key for the type of event. The default event is <tt>push</tt>
71
+ #
72
+ # = Examples
73
+ # @github = Github.new :oauth_token => '...'
74
+ # @github.repos.unsubscribe_service 'user-name', 'repo-name', 'campfire'
75
+ #
76
+ def unsubscribe_service(user_name, repo_name, service_name, params={})
77
+ _validate_presence_of user_name, repo_name, service_name
78
+ _normalize_params_keys(params)
79
+ event = params.delete('event') || 'push'
80
+ topic = "https://github.com/#{user_name}/#{repo_name}/events/#{event}"
81
+ callback = "github://#{service_name}"
82
+
83
+ unsubscribe(topic, callback)
84
+ end
85
+ alias :unsubscribe_repository :unsubscribe_service
86
+
87
+ private
88
+
89
+ def _merge_action!(action, topic, callback, params) # :nodoc:
90
+ options = {
91
+ "hub.mode" => action.to_s,
92
+ "hub.topic" => topic.to_s,
93
+ "hub.callback" => callback,
94
+ "hub.verify" => params.delete('verify') || 'sync',
95
+ "hub.secret" => params.delete('secret') || ''
96
+ }
97
+ params.merge! options
98
+ end
99
+
10
100
  end # PubSubHubbub
11
101
  end # Repos
12
102
  end # Github
@@ -3,8 +3,8 @@
3
3
  module Github
4
4
  module VERSION
5
5
  MAJOR = 0
6
- MINOR = 1
7
- PATCH = 2
6
+ MINOR = 2
7
+ PATCH = 0
8
8
  BUILD = nil
9
9
 
10
10
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.');
@@ -4,6 +4,8 @@ describe Hash do
4
4
 
5
5
  before do
6
6
  Github.new
7
+ @hash = { :a => 1, :b => 2, :c => 'e'}
8
+ @serialized = "a=1&b=2&c=e"
7
9
  @nested_hash = { 'a' => { 'b' => {'c' => 1 } } }
8
10
  @symbols = { :a => { :b => { :c => 1 } } }
9
11
  end
@@ -24,6 +26,10 @@ describe Hash do
24
26
  @nested_hash.should respond_to :symbolize_keys
25
27
  end
26
28
 
29
+ it "should respond to serialize" do
30
+ @nested_hash.should respond_to :serialize
31
+ end
32
+
27
33
  it "should remove key from the hash" do
28
34
  @nested_hash.except('a').should be_empty
29
35
  end
@@ -31,4 +37,8 @@ describe Hash do
31
37
  it "should convert nested keys to symbols" do
32
38
  @nested_hash.symbolize_keys!.should == @symbols
33
39
  end
40
+
41
+ it "should serialize hash" do
42
+ @hash.serialize.should == @serialized
43
+ end
34
44
  end
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+
3
+ describe Github::Repos::PubSubHubbub do
4
+
5
+ let(:github) { Github.new }
6
+ let(:topic) { "https://github.com/peter-murach/github/events/push"}
7
+ let(:callback) { "github://campfire?subdomain=github&room=Commits&token=abc123" }
8
+ let(:hub_inputs) {
9
+ {
10
+ "hub.mode" => 'subscribe',
11
+ "hub.topic" => topic,
12
+ "hub.callback" => callback,
13
+ "hub.verify" => 'sync',
14
+ "hub.secret" => ''
15
+ }
16
+ }
17
+
18
+ describe "subscribe" do
19
+ context "success" do
20
+ before do
21
+ github.oauth_token = OAUTH_TOKEN
22
+ stub_post("/hub?access_token=#{OAUTH_TOKEN}").with(hub_inputs).
23
+ to_return(:body => '', :status => 200, :headers => {:content_type => "application/json; charset=utf-8"})
24
+ end
25
+
26
+ after do
27
+ github.oauth_token = nil
28
+ end
29
+
30
+ it "should subscribe to hub" do
31
+ github.repos.subscribe topic, callback
32
+ a_post("/hub?access_token=#{OAUTH_TOKEN}").with(hub_inputs).should have_been_made
33
+ end
34
+ end
35
+
36
+ context "failure" do
37
+ before do
38
+ github.oauth_token = OAUTH_TOKEN
39
+ stub_post("/hub?access_token=#{OAUTH_TOKEN}").with(hub_inputs).
40
+ to_return(:body => '', :status => 404, :headers => {:content_type => "application/json; charset=utf-8"})
41
+ end
42
+
43
+ it "should fail to subscribe to hub" do
44
+ expect {
45
+ github.repos.subscribe topic, callback
46
+ }.to raise_error(Github::ResourceNotFound)
47
+ end
48
+ end
49
+ end
50
+
51
+ describe "unsubscribe" do
52
+ context "success" do
53
+ before do
54
+ github.oauth_token = OAUTH_TOKEN
55
+ stub_post("/hub?access_token=#{OAUTH_TOKEN}").with(hub_inputs.merge("hub.mode" => 'unsubscribe')).
56
+ to_return(:body => '', :status => 200, :headers => {:content_type => "application/json; charset=utf-8"})
57
+ end
58
+
59
+ after do
60
+ github.oauth_token = nil
61
+ end
62
+
63
+ it "should subscribe to hub" do
64
+ github.repos.unsubscribe topic, callback
65
+ a_post("/hub?access_token=#{OAUTH_TOKEN}").with(hub_inputs).should have_been_made
66
+ end
67
+ end
68
+
69
+ context "failure" do
70
+ before do
71
+ github.oauth_token = OAUTH_TOKEN
72
+ stub_post("/hub?access_token=#{OAUTH_TOKEN}").with(hub_inputs.merge("hub.mode" => 'unsubscribe')).
73
+ to_return(:body => '', :status => 404, :headers => {:content_type => "application/json; charset=utf-8"})
74
+ end
75
+
76
+ it "should fail to subscribe to hub" do
77
+ expect {
78
+ github.repos.unsubscribe topic, callback
79
+ }.to raise_error(Github::ResourceNotFound)
80
+ end
81
+ end
82
+ end
83
+ end # Github::Repos::PubSubHubbub
data/spec/spec_helper.rb CHANGED
@@ -15,35 +15,35 @@ RSpec.configure do |config|
15
15
  config.include WebMock::API
16
16
  end
17
17
 
18
- def stub_get(path, endpoint = Github.endpoint)
18
+ def stub_get(path, endpoint = Github.endpoint.to_s)
19
19
  stub_request(:get, endpoint + path)
20
20
  end
21
21
 
22
- def stub_post(path, endpoint = Github.endpoint)
22
+ def stub_post(path, endpoint = Github.endpoint.to_s)
23
23
  stub_request(:post, endpoint + path)
24
24
  end
25
25
 
26
- def stub_patch(path, endpoint = Github.endpoint)
26
+ def stub_patch(path, endpoint = Github.endpoint.to_s)
27
27
  stub_request(:patch, endpoint + path)
28
28
  end
29
29
 
30
- def stub_put(path, endpoint = Github.endpoint)
30
+ def stub_put(path, endpoint = Github.endpoint.to_s)
31
31
  stub_request(:put, endpoint + path)
32
32
  end
33
33
 
34
- def stub_delete(path, endpoint = Github.endpoint)
34
+ def stub_delete(path, endpoint = Github.endpoint.to_s)
35
35
  stub_request(:delete, endpoint + path)
36
36
  end
37
37
 
38
- def a_get(path, endpoint = Github.endpoint)
38
+ def a_get(path, endpoint = Github.endpoint.to_s)
39
39
  a_request(:get, endpoint + path)
40
40
  end
41
41
 
42
- def a_post(path, endpoint = Github.endpoint)
42
+ def a_post(path, endpoint = Github.endpoint.to_s)
43
43
  a_request(:post, endpoint + path)
44
44
  end
45
45
 
46
- def a_patch(path, endpoint = Github.endpoint)
46
+ def a_patch(path, endpoint = Github.endpoint.to_s)
47
47
  a_request(:patch, endpoint + path)
48
48
  end
49
49
 
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
8
7
  - 2
9
- version: 0.1.2
8
+ - 0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Piotr Murach
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-10-22 00:00:00 +01:00
17
+ date: 2011-10-23 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -285,6 +285,7 @@ files:
285
285
  - spec/github/repos/forks_spec.rb
286
286
  - spec/github/repos/hooks_spec.rb
287
287
  - spec/github/repos/keys_spec.rb
288
+ - spec/github/repos/pub_sub_hubbub_spec.rb
288
289
  - spec/github/repos/watching_spec.rb
289
290
  - spec/github/repos_spec.rb
290
291
  - spec/github_spec.rb