From 6e1cbd8a1ec8a24cbc970f03f5f65dea7e44c150 Mon Sep 17 00:00:00 2001 From: Brooks Swinnerton Date: Fri, 6 Apr 2018 18:32:54 -0400 Subject: [PATCH 01/46] Add ability to set public key signature This commit adds support for fetching and assigning a public key-based signature of the request body. Higher in the call stack, we instantiate a public key that is capable of signing a message and inject it into the `Service` base class along with whether or not the request needs to be signed. If it does need to be signed, we add the base64 encoded signature to the headers of the request, similar to HMAC signing. This, paired with metadata that's injected into the webhook body with requests that need to be signed, helps ensure that the request is authentic and not a malicious payload and can help protect against replay attacks. --- lib/service.rb | 2 ++ lib/service/http_helper.rb | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/lib/service.rb b/lib/service.rb index 5de58cb99..05194877a 100644 --- a/lib/service.rb +++ b/lib/service.rb @@ -484,6 +484,8 @@ def inherited(svc) attr_reader :remote_calls + attr_accessor :needs_public_key_signature, :public_key + def initialize(event = :push, data = {}, payload = nil) helper_name = "#{event.to_s.classify}Helpers" if Service.const_defined?(helper_name) diff --git a/lib/service/http_helper.rb b/lib/service/http_helper.rb index ce8024bec..56c6557e2 100644 --- a/lib/service/http_helper.rb +++ b/lib/service/http_helper.rb @@ -17,6 +17,7 @@ def deliver(url_value, options = {}) body = encode_body(ctype) set_body_signature(body, secret) + set_public_key_signature(body) if needs_public_key_signature http_post url, body end @@ -77,6 +78,12 @@ def set_body_signature(body, secret) 'sha1='+OpenSSL::HMAC.hexdigest(HMAC_DIGEST, secret, body) end + def set_public_key_signature(body) + public_key_signature = public_key.sign(message: body).signature + encoded_signature = Base64.strict_encode64(public_key_signature) + http.headers['GITHUB-PUBLIC-KEY-SIGNATURE'] = encoded_signature + end + def original_body raise NotImplementedError end From e03332d258976c81598753a726c46b6333ebbd7e Mon Sep 17 00:00:00 2001 From: Brooks Swinnerton Date: Fri, 6 Apr 2018 19:01:36 -0400 Subject: [PATCH 02/46] Pass raw argument to public key sign method --- lib/service/http_helper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/service/http_helper.rb b/lib/service/http_helper.rb index 56c6557e2..68c6d0650 100644 --- a/lib/service/http_helper.rb +++ b/lib/service/http_helper.rb @@ -79,8 +79,8 @@ def set_body_signature(body, secret) end def set_public_key_signature(body) - public_key_signature = public_key.sign(message: body).signature - encoded_signature = Base64.strict_encode64(public_key_signature) + public_key_signature = public_key.sign(message: body, raw: true).signature + encoded_signature = Base64.strict_encode64(public_key_signature) http.headers['GITHUB-PUBLIC-KEY-SIGNATURE'] = encoded_signature end From d3def889d8022e0b4691f10f022a8f8d06e74f7d Mon Sep 17 00:00:00 2001 From: Brooks Swinnerton Date: Sun, 8 Apr 2018 13:08:51 -0400 Subject: [PATCH 03/46] Add support for custom HTTP predelivery callbacks This approach will allow us to define last minute callbacks before performing the HTTP delivery to webhook consumers. Now in the webhook application that relies on github-services, we can do something like this: ```ruby service = Service::Web.new if webhook.needs_signed_header? service.before_delivery do |url, payload, headers, params| signature = public_key.sign(message: payload) headers['GITHUB-PUBLIC-KEY-SIGNATURE'] = signature end end ``` --- lib/service.rb | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/service.rb b/lib/service.rb index 05194877a..7ada65ee4 100644 --- a/lib/service.rb +++ b/lib/service.rb @@ -485,6 +485,7 @@ def inherited(svc) attr_reader :remote_calls attr_accessor :needs_public_key_signature, :public_key + attr_reader :pre_delivery_callbacks def initialize(event = :push, data = {}, payload = nil) helper_name = "#{event.to_s.classify}Helpers" @@ -502,6 +503,7 @@ def initialize(event = :push, data = {}, payload = nil) @http = @secrets = @email_config = nil @http_calls = [] @remote_calls = [] + @pre_delivery_callbacks = [] end # Boolean fields as either nil, "0", or "1". @@ -601,7 +603,7 @@ def http_get(url = nil, params = nil, headers = nil) # # Yields a Faraday::Request instance. # Returns a Faraday::Response instance. - def http_post(url = nil, body = nil, headers = nil, params = nil) + def http_post(url = nil, body = nil, headers = {}, params = {}) block = Proc.new if block_given? http_method :post, url, body, headers, params, &block end @@ -633,18 +635,22 @@ def http_post(url = nil, body = nil, headers = nil, params = nil) # # Yields a Faraday::Request instance. # Returns a Faraday::Response instance. - def http_method(method, url = nil, body = nil, headers = nil, params = nil) + def http_method(method, url = nil, body = nil, headers = {}, params = {}) block = Proc.new if block_given? url = url.strip if url raise_config_error("Invalid scheme") unless permitted_transport?(url) + if pre_delivery_callbacks.any? + pre_delivery_callbacks.each { |c| c.call(url, body, headers, params) } + end + check_ssl do http.send(method) do |req| req.url(url) if url - req.headers.update(headers) if headers + req.headers.update(headers) if headers.present? req.body = body if body - req.params = params if params + req.params = params if params.present? block.call req if block end end @@ -854,6 +860,10 @@ def reportable_http_env(env, time) } end + def before_delivery(&block) + @pre_delivery_callbacks << block + end + # Raised when an unexpected error occurs during service hook execution. class Error < StandardError attr_reader :original_exception From e21ec19f25f1b0a93aeb3b4491271d0a7c9b1b8e Mon Sep 17 00:00:00 2001 From: Brooks Swinnerton Date: Sun, 8 Apr 2018 13:10:51 -0400 Subject: [PATCH 04/46] Revert "Add ability to set public key signature" This reverts commit 6e1cbd8a1ec8a24cbc970f03f5f65dea7e44c150. --- lib/service.rb | 1 - lib/service/http_helper.rb | 7 ------- 2 files changed, 8 deletions(-) diff --git a/lib/service.rb b/lib/service.rb index 7ada65ee4..e18a8c164 100644 --- a/lib/service.rb +++ b/lib/service.rb @@ -484,7 +484,6 @@ def inherited(svc) attr_reader :remote_calls - attr_accessor :needs_public_key_signature, :public_key attr_reader :pre_delivery_callbacks def initialize(event = :push, data = {}, payload = nil) diff --git a/lib/service/http_helper.rb b/lib/service/http_helper.rb index 68c6d0650..ce8024bec 100644 --- a/lib/service/http_helper.rb +++ b/lib/service/http_helper.rb @@ -17,7 +17,6 @@ def deliver(url_value, options = {}) body = encode_body(ctype) set_body_signature(body, secret) - set_public_key_signature(body) if needs_public_key_signature http_post url, body end @@ -78,12 +77,6 @@ def set_body_signature(body, secret) 'sha1='+OpenSSL::HMAC.hexdigest(HMAC_DIGEST, secret, body) end - def set_public_key_signature(body) - public_key_signature = public_key.sign(message: body, raw: true).signature - encoded_signature = Base64.strict_encode64(public_key_signature) - http.headers['GITHUB-PUBLIC-KEY-SIGNATURE'] = encoded_signature - end - def original_body raise NotImplementedError end From c4ab8ff24ca81851d0f7f5e739dd31c21af10ac0 Mon Sep 17 00:00:00 2001 From: Brooks Swinnerton Date: Sun, 8 Apr 2018 13:32:34 -0400 Subject: [PATCH 05/46] Add ability to reset pre delivery callbacks --- lib/service.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/service.rb b/lib/service.rb index e18a8c164..dbc97ed17 100644 --- a/lib/service.rb +++ b/lib/service.rb @@ -565,7 +565,7 @@ def shorten_url(url) # # Yields a Faraday::Request instance. # Returns a Faraday::Response instance. - def http_get(url = nil, params = nil, headers = nil) + def http_get(url = nil, params = {}, headers = {}) raise_config_error("Invalid scheme") unless permitted_transport?(url) url = url.strip if url http.get do |req| @@ -863,6 +863,10 @@ def before_delivery(&block) @pre_delivery_callbacks << block end + def reset_pre_delivery_callbacks! + @pre_delivery_callbacks = [] + end + # Raised when an unexpected error occurs during service hook execution. class Error < StandardError attr_reader :original_exception From 68aaf5e36d9f7e783f41a11a6a74f28223969226 Mon Sep 17 00:00:00 2001 From: Brooks Swinnerton Date: Sun, 8 Apr 2018 14:38:33 -0400 Subject: [PATCH 06/46] Add tests for Service#before_delivery --- test/service_test.rb | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/service_test.rb b/test/service_test.rb index e3420c730..b14d4a123 100644 --- a/test/service_test.rb +++ b/test/service_test.rb @@ -171,6 +171,30 @@ def test_config_boolean_true_helper assert svc.config_boolean_true?("is_checked") end + def test_before_delivery + @service.before_delivery do |url, payload, headers, params| + headers['EDITED-IN-BEFORE-DELIVERY'] = true + payload.replace("EDITED") + end + + @stubs.post '/' do |env| + assert_equal '/', env.url.to_s + assert_equal 'EDITED', env[:body] + assert_equal true, env[:request_headers]['Edited-In-Before-Delivery'] + [200, {'X-Test' => 'success'}, 'OK'] + end + + @service.http_post('/', "desrever") + + @service.http_calls.each do |env| + assert_equal 200, env[:response][:status] + assert_equal 'success', env[:response][:headers]['X-Test'] + assert_equal 'OK', env[:response][:body] + end + + assert_equal 1, @service.http_calls.size + end + def service(*args) super TestService, *args end From dddd1ac4900a459dbef8f159440844f2995f390b Mon Sep 17 00:00:00 2001 From: Brooks Swinnerton Date: Sun, 8 Apr 2018 14:38:47 -0400 Subject: [PATCH 07/46] Add tests for Service#reset_pre_delivery_callbacks --- test/service_test.rb | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/test/service_test.rb b/test/service_test.rb index b14d4a123..b110a4e7b 100644 --- a/test/service_test.rb +++ b/test/service_test.rb @@ -195,6 +195,28 @@ def test_before_delivery assert_equal 1, @service.http_calls.size end + def test_reset_pre_delivery_callbacks! + @service.before_delivery do |url, payload, headers, params| + headers['EDITED-IN-BEFORE-DELIVERY'] = true + payload.replace("EDITED") + end + + @stubs.post '/' do |env| + assert_equal 'EDITED', env[:body] + assert_equal true, env[:request_headers]['Edited-In-Before-Delivery'] + [200, {'X-Test' => 'success'}, 'OK'] + end + + @service.http_post('/', "desrever") + @service.reset_pre_delivery_callbacks! + + @stubs.post '/' do |env| + refute_equal 'EDITED', env[:body] + refute_equal true, env[:request_headers]['Edited-In-Before-Delivery'] + [200, {'X-Test' => 'success'}, 'OK'] + end + end + def service(*args) super TestService, *args end From 15990b957c6a0fa784ebf915606d716f4edd354c Mon Sep 17 00:00:00 2001 From: Brooks Swinnerton Date: Sun, 8 Apr 2018 14:54:22 -0400 Subject: [PATCH 08/46] Use payload helper in http_post test This is coerced into a string in test to mirror the behavior of the deliver method, since the payload this time is already a JSON serialized string. --- test/service_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/service_test.rb b/test/service_test.rb index b110a4e7b..a077d79f8 100644 --- a/test/service_test.rb +++ b/test/service_test.rb @@ -184,7 +184,7 @@ def test_before_delivery [200, {'X-Test' => 'success'}, 'OK'] end - @service.http_post('/', "desrever") + @service.http_post('/', payload.to_s) @service.http_calls.each do |env| assert_equal 200, env[:response][:status] From 9056f8106b204b5667f48981a4fd9b4daa44f2f5 Mon Sep 17 00:00:00 2001 From: Brooks Swinnerton Date: Sun, 8 Apr 2018 14:56:23 -0400 Subject: [PATCH 09/46] Remove unnecessary response assertions Since these are tested elsewhere. --- test/service_test.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/service_test.rb b/test/service_test.rb index a077d79f8..245c3b55f 100644 --- a/test/service_test.rb +++ b/test/service_test.rb @@ -188,8 +188,6 @@ def test_before_delivery @service.http_calls.each do |env| assert_equal 200, env[:response][:status] - assert_equal 'success', env[:response][:headers]['X-Test'] - assert_equal 'OK', env[:response][:body] end assert_equal 1, @service.http_calls.size From 45d6348d8188d93bc3d48eb4b0f6980a28b7a48a Mon Sep 17 00:00:00 2001 From: Brooks Swinnerton Date: Sun, 8 Apr 2018 14:56:41 -0400 Subject: [PATCH 10/46] Add test for setting multiple callbacks --- test/service_test.rb | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/test/service_test.rb b/test/service_test.rb index 245c3b55f..7aa153244 100644 --- a/test/service_test.rb +++ b/test/service_test.rb @@ -193,6 +193,28 @@ def test_before_delivery assert_equal 1, @service.http_calls.size end + def test_multiple_before_delivery_callbacks + @service.before_delivery do |url, payload, headers, params| + headers['EDITED-IN-BEFORE-DELIVERY-1'] = true + end + + @service.before_delivery do |url, payload, headers, params| + headers['EDITED-IN-BEFORE-DELIVERY-2'] = true + end + + @stubs.post '/' do |env| + assert_equal true, env[:request_headers]['Edited-In-Before-Delivery-1'] + assert_equal true, env[:request_headers]['Edited-In-Before-Delivery-2'] + [200, {'X-Test' => 'success'}, 'OK'] + end + + @service.http_post('/', payload) + + @service.http_calls.each do |env| + assert_equal 200, env[:response][:status] + end + end + def test_reset_pre_delivery_callbacks! @service.before_delivery do |url, payload, headers, params| headers['EDITED-IN-BEFORE-DELIVERY'] = true From 5bf6a9d2ac9be3f32a4283194a34c618bfa28cbb Mon Sep 17 00:00:00 2001 From: Brooks Swinnerton Date: Sun, 8 Apr 2018 15:11:37 -0400 Subject: [PATCH 11/46] Add support for before_delivery in get requests --- lib/service.rb | 5 +++++ test/service_test.rb | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/service.rb b/lib/service.rb index dbc97ed17..fba16ca7c 100644 --- a/lib/service.rb +++ b/lib/service.rb @@ -568,6 +568,11 @@ def shorten_url(url) def http_get(url = nil, params = {}, headers = {}) raise_config_error("Invalid scheme") unless permitted_transport?(url) url = url.strip if url + + if pre_delivery_callbacks.any? + pre_delivery_callbacks.each { |c| c.call(url, nil, headers, params) } + end + http.get do |req| req.url(url) if url req.params.update(params) if params diff --git a/test/service_test.rb b/test/service_test.rb index 7aa153244..160ed1450 100644 --- a/test/service_test.rb +++ b/test/service_test.rb @@ -202,13 +202,13 @@ def test_multiple_before_delivery_callbacks headers['EDITED-IN-BEFORE-DELIVERY-2'] = true end - @stubs.post '/' do |env| + @stubs.get '/' do |env| assert_equal true, env[:request_headers]['Edited-In-Before-Delivery-1'] assert_equal true, env[:request_headers]['Edited-In-Before-Delivery-2'] [200, {'X-Test' => 'success'}, 'OK'] end - @service.http_post('/', payload) + @service.http_get('/') @service.http_calls.each do |env| assert_equal 200, env[:response][:status] From 5a01a4b35ca9542c2c90d3df9c48daa7faba5ed6 Mon Sep 17 00:00:00 2001 From: Brooks Swinnerton Date: Sun, 8 Apr 2018 15:15:44 -0400 Subject: [PATCH 12/46] Add similar .present? check to http_get method --- lib/service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/service.rb b/lib/service.rb index fba16ca7c..094ba06a0 100644 --- a/lib/service.rb +++ b/lib/service.rb @@ -575,8 +575,8 @@ def http_get(url = nil, params = {}, headers = {}) http.get do |req| req.url(url) if url - req.params.update(params) if params - req.headers.update(headers) if headers + req.params.update(params) if params.present? + req.headers.update(headers) if headers.present? yield req if block_given? end end From 799058abb342eb5b4ca722d2da397ba6bb1b51f3 Mon Sep 17 00:00:00 2001 From: Brooks Swinnerton Date: Mon, 9 Apr 2018 10:52:43 -0400 Subject: [PATCH 13/46] Remove documentation for depending.in Since the service was removed in #1240. --- docs/depending | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 docs/depending diff --git a/docs/depending b/docs/depending deleted file mode 100644 index 10e233a29..000000000 --- a/docs/depending +++ /dev/null @@ -1,7 +0,0 @@ -Install Notes -------------- - -1. Create an account at http://depending.in -2. Enter your Token (see instructions below) - -To get your Token: Log into your Depending account, click the carret icon at the top-right, then click the setting tab. \ No newline at end of file From 0f111bec67ae5e064c0921366281d9c2f4864f35 Mon Sep 17 00:00:00 2001 From: francisfuzz Date: Mon, 23 Apr 2018 14:14:35 -0700 Subject: [PATCH 14/46] Remove rapidpush --- docs/rapidpush | 9 --------- lib/services/rapidpush.rb | 12 ------------ test/rapidpush_test.rb | 24 ------------------------ 3 files changed, 45 deletions(-) delete mode 100644 docs/rapidpush delete mode 100644 lib/services/rapidpush.rb delete mode 100644 test/rapidpush_test.rb diff --git a/docs/rapidpush b/docs/rapidpush deleted file mode 100644 index e951239ac..000000000 --- a/docs/rapidpush +++ /dev/null @@ -1,9 +0,0 @@ -RapidPush is an easy-to-use push notification service. -You can receive notifications from third-party applications like nagios, GitHub or flexget directly to your smartphone. - -Install Notes -------------- -1. Get an account at https://rapidpush.net/signup -2. Install the RapidPush Android App through the Google Play Store and login to your created account -3. Generate an API-Key within the user interface under the API-Key tab and provide this key to the GitHub RapidPush service hook -4. Finished, you can now receive the notifications diff --git a/lib/services/rapidpush.rb b/lib/services/rapidpush.rb deleted file mode 100644 index 9241977b8..000000000 --- a/lib/services/rapidpush.rb +++ /dev/null @@ -1,12 +0,0 @@ -class Service::RapidPush < Service - string :apikey - - def receive_push - http.ssl[:verify] = false - http_post "https://rapidpush.net/api/github/#{apikey}", :payload => generate_json(payload) - end - - def apikey - data["apikey"].to_s.strip - end -end diff --git a/test/rapidpush_test.rb b/test/rapidpush_test.rb deleted file mode 100644 index 801a49579..000000000 --- a/test/rapidpush_test.rb +++ /dev/null @@ -1,24 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class RapidPushTest < Service::TestCase - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - end - - def test_push - @stubs.post "/api/github/a" do |env| - assert_equal 'rapidpush.net', env[:url].host - data = Faraday::Utils.parse_query(env[:body]) - assert_equal payload.to_json, data['payload'] - [200, {}, ''] - end - - svc = service({'apikey' => 'a'}, payload) - svc.receive_push - end - - def service(*args) - super Service::RapidPush, *args - end -end - From ad135470553d62b403793188c4230b209289d08b Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Wed, 25 Apr 2018 14:16:20 -0400 Subject: [PATCH 15/46] Update README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e27689300..1c7db7a1f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ GitHub Services =============== +**NOTE:** GitHub Services have been [marked for deprecation](https://developer.github.com/changes/2018-04-25-github-services-deprecation/). Functionality will be removed from GitHub.com on October 1, 2018. + This repository contains code to integrate GitHub.com with third party services. See the [Contributing Guidelines](https://github.com/github/github-services/blob/master/.github/CONTRIBUTING.md) for instructions on contributing a service. From cb04ca57ba09acfcd378e106b11fb19394d8a8e1 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Wed, 25 Apr 2018 14:19:20 -0400 Subject: [PATCH 16/46] Add note to body indicating deprecation --- lib/services/email.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/services/email.rb b/lib/services/email.rb index 3be8f2c17..7a324ae4f 100644 --- a/lib/services/email.rb +++ b/lib/services/email.rb @@ -192,7 +192,12 @@ def mail_body body << compare_text unless single_commit? - body + body << <<-NOTE + + **NOTE:** GitHub Services have been marked for deprecation: https://developer.github.com/changes/2018-04-25-github-services-deprecation/). + + Functionality will be removed from GitHub.com on October 1, 2018. + NOTE end # Public From f91df223f9fc9cb3aa8881e9f4382cd321d6f2dd Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Wed, 25 Apr 2018 14:21:13 -0400 Subject: [PATCH 17/46] =?UTF-8?q?Get=20the=20dates=20right=20=F0=9F=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- lib/services/email.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1c7db7a1f..4618c12c1 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ GitHub Services =============== -**NOTE:** GitHub Services have been [marked for deprecation](https://developer.github.com/changes/2018-04-25-github-services-deprecation/). Functionality will be removed from GitHub.com on October 1, 2018. +**NOTE:** GitHub Services have been [marked for deprecation](https://developer.github.com/changes/2018-04-25-github-services-deprecation/). Functionality will be removed from GitHub.com on January 31st, 2019. This repository contains code to integrate GitHub.com with third party services. diff --git a/lib/services/email.rb b/lib/services/email.rb index 7a324ae4f..b86b415e7 100644 --- a/lib/services/email.rb +++ b/lib/services/email.rb @@ -191,12 +191,12 @@ def mail_body end body << compare_text unless single_commit? - + binding body << <<-NOTE **NOTE:** GitHub Services have been marked for deprecation: https://developer.github.com/changes/2018-04-25-github-services-deprecation/). - Functionality will be removed from GitHub.com on October 1, 2018. + Functionality will be removed from GitHub.com on January 31st, 2019. NOTE end From 99cac3e2208ccccd09225451986b7800058414f0 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Wed, 25 Apr 2018 14:48:07 -0400 Subject: [PATCH 18/46] Grammar --- README.md | 2 +- lib/services/email.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4618c12c1..3b3ae6498 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ GitHub Services =============== -**NOTE:** GitHub Services have been [marked for deprecation](https://developer.github.com/changes/2018-04-25-github-services-deprecation/). Functionality will be removed from GitHub.com on January 31st, 2019. +**NOTE:** GitHub Services has been [marked for deprecation](https://developer.github.com/changes/2018-04-25-github-services-deprecation/). Functionality will be removed from GitHub.com on January 31st, 2019. This repository contains code to integrate GitHub.com with third party services. diff --git a/lib/services/email.rb b/lib/services/email.rb index b86b415e7..0ceb631a8 100644 --- a/lib/services/email.rb +++ b/lib/services/email.rb @@ -191,10 +191,10 @@ def mail_body end body << compare_text unless single_commit? - binding + body << <<-NOTE - **NOTE:** GitHub Services have been marked for deprecation: https://developer.github.com/changes/2018-04-25-github-services-deprecation/). + **NOTE:** This service been marked for deprecation: https://developer.github.com/changes/2018-04-25-github-services-deprecation/). Functionality will be removed from GitHub.com on January 31st, 2019. NOTE From 66192393bd6456d93d789754afce2654695361f3 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Wed, 25 Apr 2018 16:33:50 -0400 Subject: [PATCH 19/46] typo --- lib/services/email.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/services/email.rb b/lib/services/email.rb index 0ceb631a8..83ea543ee 100644 --- a/lib/services/email.rb +++ b/lib/services/email.rb @@ -194,7 +194,7 @@ def mail_body body << <<-NOTE - **NOTE:** This service been marked for deprecation: https://developer.github.com/changes/2018-04-25-github-services-deprecation/). + **NOTE:** This service been marked for deprecation: https://developer.github.com/changes/2018-04-25-github-services-deprecation/ Functionality will be removed from GitHub.com on January 31st, 2019. NOTE From aa2e640202b5dcd7c86849fd231937acdf4cf302 Mon Sep 17 00:00:00 2001 From: James Dennes Date: Thu, 26 Jul 2018 18:37:15 +0200 Subject: [PATCH 20/46] Fix grammar in mailer deprecation note Prefer "This service has been marked for deprecation" rather than "This service been marked for deprecation". --- lib/services/email.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/services/email.rb b/lib/services/email.rb index 83ea543ee..692779b7f 100644 --- a/lib/services/email.rb +++ b/lib/services/email.rb @@ -194,7 +194,7 @@ def mail_body body << <<-NOTE - **NOTE:** This service been marked for deprecation: https://developer.github.com/changes/2018-04-25-github-services-deprecation/ + **NOTE:** This service has been marked for deprecation: https://developer.github.com/changes/2018-04-25-github-services-deprecation/ Functionality will be removed from GitHub.com on January 31st, 2019. NOTE From d6f375268f0e092ce5ed4120f5973833ba0fcdba Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Sat, 4 Aug 2018 17:57:23 -0400 Subject: [PATCH 21/46] Remove Boxcar --- docs/boxcar | 10 ---------- lib/services/boxcar.rb | 12 ------------ test/boxcar_test.rb | 27 --------------------------- 3 files changed, 49 deletions(-) delete mode 100644 docs/boxcar delete mode 100644 lib/services/boxcar.rb delete mode 100644 test/boxcar_test.rb diff --git a/docs/boxcar b/docs/boxcar deleted file mode 100644 index 4584be2c3..000000000 --- a/docs/boxcar +++ /dev/null @@ -1,10 +0,0 @@ -Install Notes -------------- - -Send your commits to Boxcar, a messaging platform. Get instant commit messages on your desktop and mobile devices. - -1. Download and install Boxcar from - -2. Type in the Boxcar e-mail addresses of the users wanting to be notified of commits to this repository (comma separated). - -3. If the user does not yet have Boxcar, we'll send them an e-mail to let them know where they can get it. \ No newline at end of file diff --git a/lib/services/boxcar.rb b/lib/services/boxcar.rb deleted file mode 100644 index 6fb5db036..000000000 --- a/lib/services/boxcar.rb +++ /dev/null @@ -1,12 +0,0 @@ -class Service::Boxcar < Service - string :subscribers - white_list :subscribers - - def receive_push - http_post \ - "http://providers.boxcar.io/github/%s" % - [secrets['boxcar']['apikey']], - :emails => data['subscribers'], - :payload => generate_json(payload) - end -end diff --git a/test/boxcar_test.rb b/test/boxcar_test.rb deleted file mode 100644 index 2455b2a15..000000000 --- a/test/boxcar_test.rb +++ /dev/null @@ -1,27 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class BoxcarTest < Service::TestCase - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - end - - def test_push - svc = service :push, {'subscribers' => 'abc'}, 'a' => 1 - svc.secrets = {'boxcar' => {'apikey' => 'key'}} - - @stubs.post "/github/key" do |env| - assert_match /(^|\&)emails=abc($|\&)/, env[:body] - assert_match /(^|\&)payload=%7B%22a%22%3A1%7D($|\&)/, env[:body] - [200, {}, ''] - end - - svc.receive - - @stubs.verify_stubbed_calls - end - - def service(*args) - super Service::Boxcar, *args - end -end - From f9a718fa081af3e27f33bbac3dc35ceff4748126 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 08:19:59 -0400 Subject: [PATCH 22/46] Remove Yammer --- docs/yammer | 5 - lib/github-services.rb | 1 - lib/services/yammer.rb | 13 --- test/yammer_test.rb | 42 -------- vendor/internal-gems/yammer4r-0.1.5/README | 16 --- vendor/internal-gems/yammer4r-0.1.5/Rakefile | 13 --- vendor/internal-gems/yammer4r-0.1.5/TODO | 2 - .../bin/yammer_create_oauth_yml.rb | 71 ------------- .../internal-gems/yammer4r-0.1.5/example.rb | 15 --- .../yammer4r-0.1.5/lib/ext/core_ext.rb | 30 ------ .../yammer4r-0.1.5/lib/yammer/client.rb | 100 ------------------ .../yammer4r-0.1.5/lib/yammer/message.rb | 26 ----- .../yammer4r-0.1.5/lib/yammer/message_list.rb | 20 ---- .../yammer4r-0.1.5/lib/yammer/user.rb | 17 --- .../yammer4r-0.1.5/lib/yammer4r.rb | 21 ---- .../yammer4r-0.1.5/oauth.yml.template | 7 -- .../yammer4r-0.1.5/spec/spec_helper.rb | 3 - .../yammer4r-0.1.5/spec/yammer/client_spec.rb | 53 ---------- 18 files changed, 455 deletions(-) delete mode 100644 docs/yammer delete mode 100644 lib/services/yammer.rb delete mode 100644 test/yammer_test.rb delete mode 100644 vendor/internal-gems/yammer4r-0.1.5/README delete mode 100644 vendor/internal-gems/yammer4r-0.1.5/Rakefile delete mode 100644 vendor/internal-gems/yammer4r-0.1.5/TODO delete mode 100644 vendor/internal-gems/yammer4r-0.1.5/bin/yammer_create_oauth_yml.rb delete mode 100644 vendor/internal-gems/yammer4r-0.1.5/example.rb delete mode 100644 vendor/internal-gems/yammer4r-0.1.5/lib/ext/core_ext.rb delete mode 100644 vendor/internal-gems/yammer4r-0.1.5/lib/yammer/client.rb delete mode 100644 vendor/internal-gems/yammer4r-0.1.5/lib/yammer/message.rb delete mode 100644 vendor/internal-gems/yammer4r-0.1.5/lib/yammer/message_list.rb delete mode 100644 vendor/internal-gems/yammer4r-0.1.5/lib/yammer/user.rb delete mode 100644 vendor/internal-gems/yammer4r-0.1.5/lib/yammer4r.rb delete mode 100644 vendor/internal-gems/yammer4r-0.1.5/oauth.yml.template delete mode 100644 vendor/internal-gems/yammer4r-0.1.5/spec/spec_helper.rb delete mode 100644 vendor/internal-gems/yammer4r-0.1.5/spec/yammer/client_spec.rb diff --git a/docs/yammer b/docs/yammer deleted file mode 100644 index 1f73c1500..000000000 --- a/docs/yammer +++ /dev/null @@ -1,5 +0,0 @@ -Install Notes -------------- - -1. Go to the Yammer App Directory and login in the GitHub app. -2. Enter the token above. diff --git a/lib/github-services.rb b/lib/github-services.rb index 3a2b1dedb..722c0d087 100644 --- a/lib/github-services.rb +++ b/lib/github-services.rb @@ -24,7 +24,6 @@ require 'xmpp4r/roster' require 'rubyforge' require 'oauth' -require 'yammer4r' require 'twilio-ruby' # vendor diff --git a/lib/services/yammer.rb b/lib/services/yammer.rb deleted file mode 100644 index 38a1393ef..000000000 --- a/lib/services/yammer.rb +++ /dev/null @@ -1,13 +0,0 @@ -class Service::Yammer < Service - default_events :push, :commit_comment, :pull_request, :pull_request_review_comment, :public - password :token - - def receive_event - http_post "https://yammer-github.herokuapp.com/#{token}/notify/#{event}", :payload => generate_json(payload) - end - - def token - data["token"].to_s.strip - end -end - diff --git a/test/yammer_test.rb b/test/yammer_test.rb deleted file mode 100644 index 4ae6b8c59..000000000 --- a/test/yammer_test.rb +++ /dev/null @@ -1,42 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class YammerTest < Service::TestCase - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - end - - def test_reads_token_from_data - svc = service({'token' => 'a4f1200fc99331027ab1239%3D%3D'}, payload) - assert_equal "a4f1200fc99331027ab1239%3D%3D", svc.token - end - - def test_strips_whitespace_from_token - svc = service({'token' => 'a4f1200fc99331027ab1239%3D%3D '}, payload) - assert_equal 'a4f1200fc99331027ab1239%3D%3D', svc.token - end - - def test_posts_payload - [:push, :commit_comment, :pull_request, :pull_request_review_comment, :public].each do |event| - svc = service(event, data, payload) - @stubs.post "/a4f1200fc99331027ab1239%3D%3D/notify/#{event}" do |env| - assert_equal 'https', env[:url].scheme - assert_equal 'yammer-github.herokuapp.com', env[:url].host - assert_equal "/a4f1200fc99331027ab1239%3D%3D/notify/#{event}", env[:url].path - assert_equal payload, JSON.parse(Faraday::Utils.parse_query(env[:body])['payload']) - end - - svc.receive_event - end - end - -private - - def service(*args) - super Service::Yammer, *args - end - - def data - { 'token' => 'a4f1200fc99331027ab1239%3D%3D' } - end - -end diff --git a/vendor/internal-gems/yammer4r-0.1.5/README b/vendor/internal-gems/yammer4r-0.1.5/README deleted file mode 100644 index 40290f9bc..000000000 --- a/vendor/internal-gems/yammer4r-0.1.5/README +++ /dev/null @@ -1,16 +0,0 @@ -= Yammer4R - -== Developers -* {Jim Patterson} - -== Description -Yammer4R provides an object based API to query or update your Yammer account via pure Ruby. It hides the ugly HTTP/REST code from your code. - -== External Dependencies -* Ruby 1.8 (tested with 1.8.7) -* JSON gem (tested with versions: 1.1.3) -* OAuth gem (tested with versions: 0.2.7) -* RSpec gem (tested with versions: 1.1.11) - -== Usage Examples -Coming soon... \ No newline at end of file diff --git a/vendor/internal-gems/yammer4r-0.1.5/Rakefile b/vendor/internal-gems/yammer4r-0.1.5/Rakefile deleted file mode 100644 index c183b6602..000000000 --- a/vendor/internal-gems/yammer4r-0.1.5/Rakefile +++ /dev/null @@ -1,13 +0,0 @@ -$:.unshift(File.join(File.dirname(__FILE__), 'lib')) - -require 'rubygems' -require 'rake' -require 'spec/rake/spectask' -require 'yammer4r' - -desc "Run all specs" -Spec::Rake::SpecTask.new('spec') do |t| - t.spec_files = FileList['spec/**/*spec.rb'] -end - -task :default => [:spec] \ No newline at end of file diff --git a/vendor/internal-gems/yammer4r-0.1.5/TODO b/vendor/internal-gems/yammer4r-0.1.5/TODO deleted file mode 100644 index 438a76403..000000000 --- a/vendor/internal-gems/yammer4r-0.1.5/TODO +++ /dev/null @@ -1,2 +0,0 @@ -Test! There are currently no tests for yammer4r, and that makes me very sad. -Switch to HTTParty instead of yammer_request. diff --git a/vendor/internal-gems/yammer4r-0.1.5/bin/yammer_create_oauth_yml.rb b/vendor/internal-gems/yammer4r-0.1.5/bin/yammer_create_oauth_yml.rb deleted file mode 100644 index 4c845e19f..000000000 --- a/vendor/internal-gems/yammer4r-0.1.5/bin/yammer_create_oauth_yml.rb +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env ruby - -# Instructions: -# -# Register your application at https://www.yammer.com/client_applications/new -# Upon successful registration, you'll recieve your consumer key and secret. -# Pass these values on the command line as --key (-k) and --secret (-s) then -# follow the instructions. - -require 'optparse' -require 'rubygems' -require 'oauth' - -OPTIONS = { - :outfile => 'oauth.yml' -} - -YAMMER_OAUTH = "https://www.yammer.com" - -ARGV.options do |o| - script_name = File.basename($0) - - o.set_summary_indent(' ') - o.banner = "Usage: #{script_name} [OPTIONS]" - o.define_head "Create a yaml file for yammer oauth" - o.separator "" - o.separator "[-k] and [-s] options are mandatory" - o.separator "" - - o.on("-o", "--outfile=[val]", String, - "Yaml output file", - "Default: #{OPTIONS[:outfile]}") { |OPTIONS[:outfile]| } - o.on("-k", "--key=val", String, - "Consumer key for Yammer app") { |key| OPTIONS[:key] = key} - o.on("-s", "--secret=val", String, - "Consumer secret for Yammer app") { |secret| OPTIONS[:secret] = secret} - - o.separator "" - - o.on_tail("-h", "--help", "Show this help message.") { puts o; exit } - o.parse! -end - -unless OPTIONS[:key] && OPTIONS[:secret] - raise ArgumentError, "Must supply consumer key and secret (use -h for help)" -end - -consumer = OAuth::Consumer.new OPTIONS[:key], OPTIONS[:secret], {:site => YAMMER_OAUTH} -request_token = consumer.get_request_token - -puts "Please visit the following URL in your browser to authorize your application, then enter the 4 character security code when done: #{request_token.authorize_url}" -oauth_verifier = gets -response = consumer.token_request(consumer.http_method, - (consumer.access_token_url? ? consumer.access_token_url : consumer.access_token_path), - request_token, - {}, - :oauth_verifier => oauth_verifier.chomp) -access_token = OAuth::AccessToken.new(consumer,response[:oauth_token],response[:oauth_token_secret]) - -oauth_yml = <<-EOT -consumer: - key: #{OPTIONS[:key]} - secret: #{OPTIONS[:secret]} -access: - token: #{access_token.token} - secret: #{access_token.secret} -EOT - -File.open(OPTIONS[:outfile], "w") do |f| - f.write oauth_yml -end diff --git a/vendor/internal-gems/yammer4r-0.1.5/example.rb b/vendor/internal-gems/yammer4r-0.1.5/example.rb deleted file mode 100644 index 17e0eed42..000000000 --- a/vendor/internal-gems/yammer4r-0.1.5/example.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'yammer4r' - -config_path = File.dirname(__FILE__) + 'oauth.yml' -yammer = Yammer::Client.new(:config => config_path) - -# Get all messages -messages = yammer.messages -puts messages.size -puts messages.last.body.plain -puts messages.last.body.parsed - -# Print out all the users -yammer.users.each do |u| - puts "#{u.name} - #{u.me?}" -end diff --git a/vendor/internal-gems/yammer4r-0.1.5/lib/ext/core_ext.rb b/vendor/internal-gems/yammer4r-0.1.5/lib/ext/core_ext.rb deleted file mode 100644 index fad18ac2d..000000000 --- a/vendor/internal-gems/yammer4r-0.1.5/lib/ext/core_ext.rb +++ /dev/null @@ -1,30 +0,0 @@ -class String - def to_boolean - case self - when 'true' - true - when 'false' - false - else - nil - end - end -end - -class Hash - def symbolize_keys - inject({}) do |options, (key, value)| - options[(key.to_sym rescue key) || key] = value - options - end - end - - def symbolize_keys! - self.replace(self.symbolize_keys) - end - - def assert_has_keys(*valid_keys) - missing_keys = [valid_keys].flatten - keys - raise(ArgumentError, "Missing Option(s): #{missing_keys.join(", ")}") unless missing_keys.empty? - end -end diff --git a/vendor/internal-gems/yammer4r-0.1.5/lib/yammer/client.rb b/vendor/internal-gems/yammer4r-0.1.5/lib/yammer/client.rb deleted file mode 100644 index 35a17a1cb..000000000 --- a/vendor/internal-gems/yammer4r-0.1.5/lib/yammer/client.rb +++ /dev/null @@ -1,100 +0,0 @@ -module Yammer - class Client - def initialize(options={}) - options.assert_has_keys(:consumer, :access) unless options.has_key?(:config) - - yammer_url = options.delete(:yammer_host) || "https://www.yammer.com" - @api_path = "/api/v1/" - - if options[:config] - config = YAML.load(open(options[:config])) - options[:consumer] = config['consumer'].symbolize_keys - options[:access] = config['access'].symbolize_keys - end - - consumer = OAuth::Consumer.new(options[:consumer][:key], options[:consumer][:secret], :site => yammer_url) - consumer.http.set_debug_output($stderr) if options[:verbose] == true - @access_token = OAuth::AccessToken.new(consumer, options[:access][:token], options[:access][:secret]) - end - - - # TODO: modularize message and user handling - def messages(action = :all, params = {}) - params.merge!(:resource => :messages) - params.merge!(:action => action) unless action == :all - - parsed_response = JSON.parse(yammer_request(:get, params).body) - older_available = parsed_response['meta']['older_available'] - - ml = parsed_response['messages'].map do |m| - mash(m) - end - Yammer::MessageList.new(ml, older_available, self) - end - - # POST or DELETE a message - def message(action, params) - params.merge!(:resource => :messages) - yammer_request(action, params) - end - - def users(params = {}) - params.merge!(:resource => :users) - JSON.parse(yammer_request(:get, params).body).map { |u| Yammer::User.new(mash(u), self) } - end - - def user(id) - u = JSON.parse(yammer_request(:get, {:resource => :users, :id => id}).body) - Yammer::User.new(mash(u), self) - end - - def current_user - u = JSON.parse(yammer_request(:get, {:resource => :users, :action => :current}).body) - Yammer::User.new(mash(u), self) - end - alias_method :me, :current_user - - private - - def yammer_request(http_method, options) - request_uri = @api_path + options.delete(:resource).to_s - [:action, :id].each {|k| request_uri += "/#{options.delete(k)}" if options.has_key?(k) } - request_uri += ".json" - - if options.any? - request_uri += "?#{create_query_string(options)}" unless http_method == :post - end - - if http_method == :post - handle_response(@access_token.send(http_method, request_uri, options)) - else - handle_response(@access_token.send(http_method, request_uri)) - end - end - - def create_query_string(options) - options.map {|k, v| "#{OAuth::Helper.escape(k)}=#{OAuth::Helper.escape(v)}"}.join('&') - end - - def mash(json) - Mash.new(json) - end - - def handle_response(response) - # TODO: Write classes for exceptions - case response.code.to_i - when 200..201 - response - when 400 - raise "Bad Request: #{response.body}" - when 401 - raise "Authentication failed. Check your username and password" - when 503 - raise "503: Service Unavailable" - else - raise "Error. HTTP Response #{response.code}: #{response.body}" - end - end - - end -end diff --git a/vendor/internal-gems/yammer4r-0.1.5/lib/yammer/message.rb b/vendor/internal-gems/yammer4r-0.1.5/lib/yammer/message.rb deleted file mode 100644 index 3b097d83b..000000000 --- a/vendor/internal-gems/yammer4r-0.1.5/lib/yammer/message.rb +++ /dev/null @@ -1,26 +0,0 @@ -class Yammer::Message - - attr_reader :id, :url, :web_url, :replied_to_id, :thread_id, - :body_plain, :body_parsed, :message_type, :client_type, - :sender_id, :sender_type - - def initialize(m) - @id = m['id'] - @url = m['url'] - @web_url = m['web_url'] - @replied_to_id = m['replied_to_id'] - @thread_id = m['thread_id'] - @body_plain = m['body']['plain'] - @body_parsed = m['body']['parsed'] - @message_type = m['message_type'] - @client_type = m['client_type'] - @sender_id = m['sender_id'] - @sender_type = m['sender_type'] - begin - @created_at = m['created_at'] - rescue ArgumentError => e - @created_at = nil - end - end - -end diff --git a/vendor/internal-gems/yammer4r-0.1.5/lib/yammer/message_list.rb b/vendor/internal-gems/yammer4r-0.1.5/lib/yammer/message_list.rb deleted file mode 100644 index 98928559e..000000000 --- a/vendor/internal-gems/yammer4r-0.1.5/lib/yammer/message_list.rb +++ /dev/null @@ -1,20 +0,0 @@ -class Yammer::MessageList < Array - - attr_reader :older_available, :ids - - def initialize(a, oa, c) - super(a) - @older_available = oa - @client = c - @ids = a.map {|m| m.id}.sort - end - - def first - self[0] - end - - def last - self[self.size - 1] - end - -end \ No newline at end of file diff --git a/vendor/internal-gems/yammer4r-0.1.5/lib/yammer/user.rb b/vendor/internal-gems/yammer4r-0.1.5/lib/yammer/user.rb deleted file mode 100644 index ff965fe9c..000000000 --- a/vendor/internal-gems/yammer4r-0.1.5/lib/yammer/user.rb +++ /dev/null @@ -1,17 +0,0 @@ -class Yammer::User - extend Forwardable - def_delegator :@user, :id - - def initialize(mash, client) - @user = mash - @client = client - end - - def me? - @user.id == @client.me.id - end - - def method_missing(call, *args) - @user.send(call, *args) - end -end diff --git a/vendor/internal-gems/yammer4r-0.1.5/lib/yammer4r.rb b/vendor/internal-gems/yammer4r-0.1.5/lib/yammer4r.rb deleted file mode 100644 index 0907b43a7..000000000 --- a/vendor/internal-gems/yammer4r-0.1.5/lib/yammer4r.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'forwardable' -require 'rubygems' -require 'date' -require 'yaml' -require 'open-uri' - -#gem 'json', '>= 1.1.7' -#require 'json' - -#gem 'oauth', '>=0.3.5' -require 'oauth' - -#gem 'mash', '>=0.0.3' -require 'mash' - -$:.unshift(File.dirname(__FILE__)) -require 'ext/core_ext' -require 'yammer/client' -require 'yammer/message' -require 'yammer/message_list' -require 'yammer/user' diff --git a/vendor/internal-gems/yammer4r-0.1.5/oauth.yml.template b/vendor/internal-gems/yammer4r-0.1.5/oauth.yml.template deleted file mode 100644 index 248c13b47..000000000 --- a/vendor/internal-gems/yammer4r-0.1.5/oauth.yml.template +++ /dev/null @@ -1,7 +0,0 @@ -consumer: - key: CLIENT_KEY - secret: CLIENT_SECRET - -access: - token: CONSUMER_TOKEN - secret: CONSUMER_SECRET diff --git a/vendor/internal-gems/yammer4r-0.1.5/spec/spec_helper.rb b/vendor/internal-gems/yammer4r-0.1.5/spec/spec_helper.rb deleted file mode 100644 index 64f17e490..000000000 --- a/vendor/internal-gems/yammer4r-0.1.5/spec/spec_helper.rb +++ /dev/null @@ -1,3 +0,0 @@ -$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib")) -require 'yammer4r' -require 'spec' \ No newline at end of file diff --git a/vendor/internal-gems/yammer4r-0.1.5/spec/yammer/client_spec.rb b/vendor/internal-gems/yammer4r-0.1.5/spec/yammer/client_spec.rb deleted file mode 100644 index 2d06e049c..000000000 --- a/vendor/internal-gems/yammer4r-0.1.5/spec/yammer/client_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') -require 'ostruct' - -describe Yammer::Client do - - context "creating" do - - before(:each) do - mock_consumer = mock(OAuth::Consumer) - OAuth::Consumer.stub!("new").and_return(mock_consumer) - @mock_http = mock("http") - mock_consumer.stub!("http").and_return(@mock_http) - end - - it "can be configured to be verbose" do - @mock_http.should_receive("set_debug_output").with($stderr) - Yammer::Client.new(:consumer => {}, :access => {}, :verbose => true) - end - - it "should not be configured to be verbose unless asked to be" do - @mock_http.should_not_receive("set_debug_output") - Yammer::Client.new(:consumer => {}, :access => {}) - end - - it "should not be configured to be verbose if asked not to be" do - @mock_http.should_not_receive("set_debug_output") - Yammer::Client.new(:consumer => {}, :access => {}, :verbose => false) - end - - end - - context "users" do - - before(:each) do - @mock_access_token = mock(OAuth::AccessToken) - @response = OpenStruct.new(:code => 200, :body => '{}') - OAuth::AccessToken.stub!("new").and_return(@mock_access_token) - @client = Yammer::Client.new(:consumer => {}, :access => {}) - end - - it "should request the first page by default" do - @mock_access_token.should_receive("get").with("/api/v1/users.json").and_return(@response) - @client.users - end - - it "can request a specified page" do - @mock_access_token.should_receive("get").with("/api/v1/users.json?page=2").and_return(@response) - @client.users(:page => 2) - end - - end - -end \ No newline at end of file From c029fd7741f4e2c74e1fed2db066c33a124d1083 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 08:20:57 -0400 Subject: [PATCH 23/46] Remove Visual Ops --- docs/visualops | 13 -------- lib/services/visualops.rb | 65 --------------------------------------- test/visualops_test.rb | 55 --------------------------------- 3 files changed, 133 deletions(-) delete mode 100644 docs/visualops delete mode 100644 lib/services/visualops.rb delete mode 100644 test/visualops_test.rb diff --git a/docs/visualops b/docs/visualops deleted file mode 100644 index 81ee9068d..000000000 --- a/docs/visualops +++ /dev/null @@ -1,13 +0,0 @@ -Trigger a re-deploy of VisualOps apps when you push to GitHub. You can set a list of app_id with correspond branch. - -Install Notes -------------- - -1. You will need to register an account and launch an app in [VisualOps][visualops], and get a token that authorises GitHub to write to the VisualOps API. -2. Supply a list of apps you want to update when you push to GitHub, and the apps are separated by commas. You can specify the git branch for every app with a colon suffix (`app_id:branch`), and the default branch for an app is `master`. The following is an example of App List: - - app-11223344, app-1a2b3c4d:develop, app-12345678:master - - Then the app `app-11223344` and `app-12345678` will be update when you push to `master` branch, and `app-1a2b3c4d` will you push to `develop` branch. And the you can find your app_id in the property pannel of VisualOps IDE - -[visualops]: http://www.visualops.io \ No newline at end of file diff --git a/lib/services/visualops.rb b/lib/services/visualops.rb deleted file mode 100644 index 89f513a07..000000000 --- a/lib/services/visualops.rb +++ /dev/null @@ -1,65 +0,0 @@ -class Service::VisualOps < Service::HttpPost - string :username, :app_list - password :consumer_token - - white_list :username, :app_list - - default_events :push - - url "http://www.visualops.io" - - maintained_by :github => "gnawux", - :twitter => "@gnawux" - - supported_by :email => 'support@visualops.io' - - def receive_event - return unless update_states? - - # Confirm all required config is present - assert_required_credentials - - # Update State - app = push_list(app_list) - if not app.empty? - data.update('app_list' => app) - deliver update_url, :content_type => 'application/json' - end - end - - private - - def update_states? - payload['commits'].size != 0 - end - - def app_list - data['app_list'].split(',').map do |ab_pair| - (app, sep, bx) = ab_pair.strip.partition(":") - branch = bx.empty? ? "master" : bx - [app, branch] - end - end - - def push_list(apps) - apps.keep_if{|x| x[1] == branch_name}.map{|x| x[0]} - end - - def assert_required_credentials - if (consumer_token.empty? || username.empty?) - raise_config_error "You need a user ID and an authorization Token." - end - end - - def update_url - "https://api.visualops.io:443/v1/github" - end - - def consumer_token - data['consumer_token'].to_s - end - - def username - data['username'].to_s - end -end diff --git a/test/visualops_test.rb b/test/visualops_test.rb deleted file mode 100644 index 1c43b736a..000000000 --- a/test/visualops_test.rb +++ /dev/null @@ -1,55 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class VisualOpsTest < Service::TestCase - - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - @data = {'username' => 'someuser', 'app_list' => 'abc123, madeira:master, xyz456:devel', 'consumer_token' => 'madeira-visualops'} - end - - def test_push - svc = service :push, @data - - @stubs.post "/v1/github" do |env| - assert_equal 'api.visualops.io', env[:url].host - body = JSON.parse(env[:body]) - assert_equal 'someuser', body['config']['username'] - assert_equal 'madeira-visualops', body['config']['consumer_token'] - assert_equal ['abc123','madeira'], body['config']['app_list'] - [200, {}, ''] - end - - svc.receive_event - end - - def test_develop - svc = service :push, @data, - payload.update("ref" => "refs/heads/devel") - - @stubs.post "/v1/github" do |env| - assert_equal 'api.visualops.io', env[:url].host - body = JSON.parse(env[:body]) - assert_equal 'someuser', body['config']['username'] - assert_equal 'madeira-visualops', body['config']['consumer_token'] - assert_equal ['xyz456'], body['config']['app_list'] - [200, {}, ''] - end - - svc.receive_event - end - - def test_other_branch - svc = service :push, @data, - payload.update("ref" => "refs/heads/no-such-branch") - - @stubs.post "/v1/github" do |env| - raise "This should not be called" - end - - svc.receive_event - end - - def service(*args) - super Service::VisualOps, *args - end -end From 88ac2bade714047f010c134dea97da8dce88d579 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 08:21:28 -0400 Subject: [PATCH 24/46] Remove Trajectory --- docs/trajectory | 7 ----- lib/services/trajectory.rb | 47 ---------------------------------- test/trajectory_test.rb | 52 -------------------------------------- 3 files changed, 106 deletions(-) delete mode 100644 docs/trajectory delete mode 100644 lib/services/trajectory.rb delete mode 100644 test/trajectory_test.rb diff --git a/docs/trajectory b/docs/trajectory deleted file mode 100644 index 13eef5e98..000000000 --- a/docs/trajectory +++ /dev/null @@ -1,7 +0,0 @@ -Install Notes -------------- - -1. api_key: Your api key can be found in this link: https://www.apptrajectory.com/profile/edit - -All you need to do is copy your api key from the application and paste it into the GitHub service configuration. - diff --git a/lib/services/trajectory.rb b/lib/services/trajectory.rb deleted file mode 100644 index d619ac0a2..000000000 --- a/lib/services/trajectory.rb +++ /dev/null @@ -1,47 +0,0 @@ -class Service::Trajectory < Service - string :api_key - BASE_URL = "https://www.apptrajectory.com/api/payloads?api_key=" - - def receive_push - send_to_trajectory - end - - def receive_pull_request - send_to_trajectory - end - - private - - def send_to_trajectory - set_http_headers - response = send_post - raise_config_error_for_bad_status(response) - end - - def set_http_headers - http.headers['content-type'] = 'application/json' - end - - def send_post - http_post full_url, json_payload - end - - def full_url - BASE_URL + api_key - end - - def raise_config_error_for_bad_status(response) - if response.status < 200 || response.status > 299 - raise_config_error - end - end - - def api_key - raise_config_error "Missing 'api_key'" if data['api_key'].to_s == '' - data['api_key'].to_s - end - - def json_payload - generate_json(payload) - end -end diff --git a/test/trajectory_test.rb b/test/trajectory_test.rb deleted file mode 100644 index e7edfb4fd..000000000 --- a/test/trajectory_test.rb +++ /dev/null @@ -1,52 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class TrajectoryTest < Service::TestCase - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - end - - def test_raise_config_error_without_api_key - assert_raises Service::ConfigurationError do - svc = service({}, payload) - svc.receive_push - end - - assert_raises Service::ConfigurationError do - svc = service({}, payload) - svc.receive_pull_request - end - end - - def test_push - @stubs.post '/api/payloads?api_key=test_api_key' do |env| - confirm_trajectory_receives_request(env) - [200, {}, ''] - end - - svc = service({'api_key' => 'test_api_key'}, payload) - svc.receive_push - - @stubs.verify_stubbed_calls - end - - def test_pull_request - @stubs.post '/api/payloads?api_key=test_api_key' do |env| - confirm_trajectory_receives_request(env) - [200, {}, ''] - end - - svc = service({'api_key' => 'test_api_key'}, payload) - svc.receive_pull_request - - @stubs.verify_stubbed_calls - end - - def service(*args) - super Service::Trajectory, *args - end - - def confirm_trajectory_receives_request(env) - assert_equal 'application/json', env[:request_headers]['Content-Type'] - assert_equal 'https://www.apptrajectory.com/api/payloads?api_key=test_api_key', env[:url].to_s - end -end From e28224af3757369c6543bab7e640cc91149833d6 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 08:22:07 -0400 Subject: [PATCH 25/46] Remove Stormpath --- docs/stormpath | 14 ------ lib/services/stormpath.rb | 40 ----------------- test/stormpath_test.rb | 92 --------------------------------------- 3 files changed, 146 deletions(-) delete mode 100644 docs/stormpath delete mode 100644 lib/services/stormpath.rb delete mode 100644 test/stormpath_test.rb diff --git a/docs/stormpath b/docs/stormpath deleted file mode 100644 index 0d3902fa4..000000000 --- a/docs/stormpath +++ /dev/null @@ -1,14 +0,0 @@ -[Stormpath](http://stormpath.com/) is a User Management API that reduces development time with instant-on, scalable user infrastructure. Stormpath's intuitive API and expert support make it easy for developers to authenticate, manage, and secure users and roles in any application. - -This service will help you update the Single Sign On site configured in Stormpath. In the Stormpath Admin Console, you can specify which branch needs to be synced with Stormpath. - -Install Notes -------------- - -After signing up for Stormpath at https://api.stormpath.com/register: - -1. Log in to the Stormpath Admin Console using the email address and password you used to register with Stormpath. -1. In the top-right corner of the resulting page, visit Settings > My Account. -1. On the Account Details page, under Security Credentials, click Create API Key. -1. Set **API Key ID** to the API Key ID generated by Stormpath -1. Set **API Key Secret** to the API Key Secret generated by Stormpath \ No newline at end of file diff --git a/lib/services/stormpath.rb b/lib/services/stormpath.rb deleted file mode 100644 index de13a33e5..000000000 --- a/lib/services/stormpath.rb +++ /dev/null @@ -1,40 +0,0 @@ -class Service::Stormpath < Service::HttpPost - - string :api_key_id - password :api_key_secret - white_list :api_key_id - - url "https://stormpath.com" - - maintained_by :github => "lhazlewood" - - default_events :push - - logo_url "https://api.stormpath.com/assets/images/logo_nav.png" - - supported_by :web => 'https://support.stormpath.com', - :email => 'support@stormpath.com', - :twitter => '@goStormpath' - - def receive_event - - id = required_config_value('api_key_id') - secret = required_config_value('api_key_secret') - - http.basic_auth id.to_s, secret.to_s - - res = deliver api_url - - case res.status - when 200..299 - when 401 then raise_config_error("Authentication with a valid API Key is required. The provided Api Key Id/Secret is invalid.") - else raise_config_error("HTTP: #{res.status}") - end - - end - - def api_url - "https://api.stormpath.com/vendors/github/events" - end - -end \ No newline at end of file diff --git a/test/stormpath_test.rb b/test/stormpath_test.rb deleted file mode 100644 index 1ab783290..000000000 --- a/test/stormpath_test.rb +++ /dev/null @@ -1,92 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class Hash - def except!(*keys) - keys.each { |key| delete(key) } - self - end -end - -class StormpathTest < Service::TestCase - include Service::HttpTestMethods - - TEST_API_KEY_ID = "18WJZYBI2I1YX8LDJBIK5DA6O" - TEST_API_KEY_SECRET = "5awFkPbNusdIKJkkmjVY6GUjap+VDw39Mnwy16C0luU" - - def data - { - 'api_key_id' => TEST_API_KEY_ID, - 'api_key_secret' => TEST_API_KEY_SECRET - } - end - - def payload - { - 'commits'=>[{'id'=>'test'}] - } - end - - def test_push - - svc = service(data, payload) - - @stubs.post "/vendors/github/events" do |env| - body = JSON.parse(env[:body]) - - assert_equal env[:request_headers]['content-type'], "application/json" - assert_equal 'test', body['payload']['commits'][0]['id'] - assert_match 'guid-', body['guid'] - assert_equal data, body['config'] - assert_equal 'push', body['event'] - [200, {}, ''] - end - - svc.receive_event - @stubs.verify_stubbed_calls - end - - def verify_requires(svc) - assert_raises Service::ConfigurationError do - svc.receive_event - end - end - - def test_requires_api_key_id - verify_requires(service(data.except!('api_key_id'), payload)) - end - - def test_requires_api_key_secret - verify_requires(service(data.except!('api_key_secret'), payload)) - end - - def test_invalid_api_key - - invalid_api_key = {'api_key_id' => 'invalid_id', 'api_key_secret' => 'invalid_secret'} - svc = service(invalid_api_key, payload) - - @stubs.post "/vendors/github/events" do |env| - body = JSON.parse(env[:body]) - - assert_equal env[:request_headers]['content-type'], "application/json" - assert_equal 'test', body['payload']['commits'][0]['id'] - assert_match 'guid-', body['guid'] - assert_equal 'push', body['event'] - [401, {}, ''] - end - - verify_requires svc - @stubs.verify_stubbed_calls - end - - def test_config - - svc = service(data, payload) - - assert_equal svc.data['api_key_id'], TEST_API_KEY_ID - assert_equal svc.data['api_key_secret'], TEST_API_KEY_SECRET - end - - def service_class - Service::Stormpath - end -end \ No newline at end of file From 59ba9c04e5aa73abfd033b430ae3447467755f7c Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 08:22:55 -0400 Subject: [PATCH 26/46] Remove Sqwiggle --- docs/sqwiggle | 13 --------- lib/services/sqwiggle.rb | 34 ---------------------- test/sqwiggle_test.rb | 61 ---------------------------------------- 3 files changed, 108 deletions(-) delete mode 100644 docs/sqwiggle delete mode 100644 lib/services/sqwiggle.rb delete mode 100644 test/sqwiggle_test.rb diff --git a/docs/sqwiggle b/docs/sqwiggle deleted file mode 100644 index b478302c2..000000000 --- a/docs/sqwiggle +++ /dev/null @@ -1,13 +0,0 @@ -This service alerts your colleagues, collaborators and friends of GitHub events -by posting a message into the Sqwiggle room of your choice! - -Install Notes ------------- - -**Token**: You'll need to generate an API Client and paste in the provided token. -(create one here: https://www.sqwiggle.com/company/clients) - -**Room**: (optional) The last part of the url for the room you would like the -messages to appear in e.g sqwiggle.com/company_name/ROOM_ID_HERE. Leave blank if you want to use the default room. - -See https://www.sqwiggle.com/docs for more info on the Sqwiggle API diff --git a/lib/services/sqwiggle.rb b/lib/services/sqwiggle.rb deleted file mode 100644 index 23bf5a6fa..000000000 --- a/lib/services/sqwiggle.rb +++ /dev/null @@ -1,34 +0,0 @@ -class Service::Sqwiggle < Service::HttpPost - password :token - string :room - - # only include 'room' in the debug logs, skip the api token. - white_list :room - - #accept all events and filter on sqwiggle servers so we can add events as - #requested without the need to wait on GitHub PR's - default_events Service::ALL_EVENTS - - url "https://www.sqwiggle.com" - logo_url "https://sqwiggle-assets.s3.amazonaws.com/assets/logo-header-b4bc3b6e82e42a0beb96b7fa413537f6.png" - - maintained_by :github => 'lukeroberts1990', - :twitter => '@lukeroberts1990' - - supported_by :web => 'https://www.sqwiggle.com/help', - :email => 'howdy@sqwiggle.com', - :twitter => '@sqwiggle' - - def receive_event - token = required_config_value('token') - http.basic_auth token, 'X' - - #dev url - # url = "http://localhost:3001/integrations/github/#{data['room']}" - - #production url - url = "https://api.sqwiggle.com:443/integrations/github/#{data['room']}" - - deliver url - end -end diff --git a/test/sqwiggle_test.rb b/test/sqwiggle_test.rb deleted file mode 100644 index fbf7929d4..000000000 --- a/test/sqwiggle_test.rb +++ /dev/null @@ -1,61 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class SqwiggleTest < Service::TestCase - include Service::HttpTestMethods - - def test_default_room_push - - data = { - 'token' => 'some_token' - } - - payload = {'commits'=>[{'id'=>'test'}]} - svc = service(data, payload) - - @stubs.post "integrations/github/" do |env| - body = JSON.parse(env[:body]) - - assert_equal env[:url].host, "api.sqwiggle.com" - assert_equal basic_auth('some_token', 'X'), env[:request_headers][:authorization] - assert_equal 'test', body['payload']['commits'][0]['id'] - assert_match 'guid-', body['guid'] - assert_equal data, body['config'] - assert_equal 'push', body['event'] - [200, {}, ''] - end - - svc.receive_event - @stubs.verify_stubbed_calls - end - - def test_specified_room_push - data = { - 'token' => 'some_token', - 'room' => 'some_room' - } - - payload = {'commits'=>[{'id'=>'test'}]} - svc = service(data, payload) - - @stubs.post "integrations/github/some_room" do |env| - body = JSON.parse(env[:body]) - - assert_equal env[:url].host, "api.sqwiggle.com" - assert_equal basic_auth('some_token', 'X'), env[:request_headers][:authorization] - assert_equal 'test', body['payload']['commits'][0]['id'] - assert_match 'guid-', body['guid'] - assert_equal data, body['config'] - assert_equal 'push', body['event'] - [200, {}, ''] - end - - svc.receive_event - @stubs.verify_stubbed_calls - end - - def service_class - Service::Sqwiggle - end -end - - From eb5a34b8ad0f8c7b89cca7fa2a0bc3060a63d680 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 08:23:32 -0400 Subject: [PATCH 27/46] Remove Pushalot --- docs/pushalot | 11 ----------- lib/services/pushalot.rb | 23 ---------------------- test/pushalot_test.rb | 42 ---------------------------------------- 3 files changed, 76 deletions(-) delete mode 100644 docs/pushalot delete mode 100644 lib/services/pushalot.rb delete mode 100644 test/pushalot_test.rb diff --git a/docs/pushalot b/docs/pushalot deleted file mode 100644 index 5df67e2ac..000000000 --- a/docs/pushalot +++ /dev/null @@ -1,11 +0,0 @@ -Pushalot is a platform for receiving custom push notifications to connected devices running Windows Phone or Windows 8. Custom means that those push notifications can be sent from virtually any source, as long as that source can interact with our open [REST API](https://pushalot.com/api). - -Install Notes -------------- - -1. Install the [Windows 8 app](https://pushalot.com/apps) from the Windows Store, or the [Windows Phone app](https://pushalot.com/apps) from the Windows Phone Apps+Games Store. - -2. Sign in to [Pushalot](https://pushalot.com/) and copy your authorization token. - -3. Add your authorization token in the field above. - diff --git a/lib/services/pushalot.rb b/lib/services/pushalot.rb deleted file mode 100644 index ab8c6cb90..000000000 --- a/lib/services/pushalot.rb +++ /dev/null @@ -1,23 +0,0 @@ -class Service::Pushalot < Service - password :authorization_token - - url "https://pushalot.com" - logo_url "https://pushalot.com/content/images/favicon.png" - maintained_by :github => 'molesinski' - supported_by :web => 'https://pushalot.com/support' - - def receive_push - res = http_post "https://pushalot.com/api/githubhook", - :authorizationToken => authorization_token, - :payload => generate_json(payload) - - if res.status != 200 - raise_config_error - end - end - - def authorization_token - data["authorization_token"].to_s.strip - end -end - diff --git a/test/pushalot_test.rb b/test/pushalot_test.rb deleted file mode 100644 index bff7e83c0..000000000 --- a/test/pushalot_test.rb +++ /dev/null @@ -1,42 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class PushalotTest < Service::TestCase - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - @svc = service(data, payload) - end - - def test_reads_token_from_data - assert_equal "be82304d88d74eb884e384a98a282b8a", @svc.authorization_token - end - - def test_strips_whitespace_from_token - svc = service({'authorization_token' => 'be82304d88d74eb884e384a98a282b8a '}, payload) - assert_equal 'be82304d88d74eb884e384a98a282b8a', svc.authorization_token - end - - def test_posts_payload - @stubs.post '/api/githubhook' do |env| - assert_equal 'https', env[:url].scheme - assert_equal 'pushalot.com', env[:url].host - data = Faraday::Utils.parse_query(env[:body]) - assert_equal "be82304d88d74eb884e384a98a282b8a", data["authorizationToken"] - assert_equal payload, JSON.parse(data['payload']) - [200, {}, 'ok'] - end - - @svc.receive_push - end - -private - - def service(*args) - super Service::Pushalot, *args - end - - def data - { 'authorization_token' => 'be82304d88d74eb884e384a98a282b8a' } - end - -end - From 6ba5ab4f95cdc2c26b6faa941a1d64dcc61ff61b Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 08:24:10 -0400 Subject: [PATCH 28/46] Remove NMA --- docs/nma | 11 ----------- lib/services/notifymyandroid.rb | 24 ------------------------ test/notifymyandroid_test.rb | 24 ------------------------ 3 files changed, 59 deletions(-) delete mode 100644 docs/nma delete mode 100644 lib/services/notifymyandroid.rb delete mode 100644 test/notifymyandroid_test.rb diff --git a/docs/nma b/docs/nma deleted file mode 100644 index f9e52cabb..000000000 --- a/docs/nma +++ /dev/null @@ -1,11 +0,0 @@ -With NotifyMyAndroid (NMA) you can push notifications to your Android devices -through Google's C2DM notification system. The [public Web API](http://www.notifymyandroid.com/api.php) -can be used by virtually any application to delivery push notifications to -your Android. - -Install Notes -------------- - -1. Register at https://www.notifymyandroid.com/register.php. - -2. Generate an API key at https://www.notifymyandroid.com/account.php to be used on GitHub. diff --git a/lib/services/notifymyandroid.rb b/lib/services/notifymyandroid.rb deleted file mode 100644 index 512573122..000000000 --- a/lib/services/notifymyandroid.rb +++ /dev/null @@ -1,24 +0,0 @@ -class Service::NMA < Service - string :apikey - self.title = 'Notify My Android' - - def receive_push - return unless payload['commits'] - - url = URI.parse('https://www.notifymyandroid.com/publicapi/notify') - repository = payload['repository']['url'].split("/") - event = [repository[-2], repository[-1]].join('/') - application = "GitHub" - description = "#{payload['commits'].length} commits pushed to #{application} (#{payload['commits'][-1]['id'][0..7]}..#{payload['commits'][0]['id'][0..7]}) - - Latest Commit by #{payload['commits'][-1]['author']['name']} - #{payload['commits'][-1]['id'][0..7]} #{payload['commits'][-1]['message']}" - - http_post 'https://www.notifymyandroid.com/publicapi/notify', - :apikey => data['apikey'], - :application => application, - :event => event, - :description => description, - :url => payload['compare'] - end -end diff --git a/test/notifymyandroid_test.rb b/test/notifymyandroid_test.rb deleted file mode 100644 index d793338dd..000000000 --- a/test/notifymyandroid_test.rb +++ /dev/null @@ -1,24 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class NMATest < Service::TestCase - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - end - - def test_push - @stubs.post "/publicapi/notify" do |env| - assert_equal 'www.notifymyandroid.com', env[:url].host - data = Faraday::Utils.parse_query(env[:body]) - assert_equal 'a', data['apikey'] - [200, {}, ''] - end - - svc = service({'apikey' => 'a'}, payload) - svc.receive_push - end - - def service(*args) - super Service::NMA, *args - end -end - From 5b8fbdb672c0c68470c7b2c322e7c337997a0b5e Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 08:24:51 -0400 Subject: [PATCH 29/46] Remove Honbu --- docs/honbu | 15 --------------- lib/services/honbu.rb | 29 ----------------------------- test/honbu_test.rb | 40 ---------------------------------------- 3 files changed, 84 deletions(-) delete mode 100644 docs/honbu delete mode 100644 lib/services/honbu.rb delete mode 100644 test/honbu_test.rb diff --git a/docs/honbu b/docs/honbu deleted file mode 100644 index 24f577511..000000000 --- a/docs/honbu +++ /dev/null @@ -1,15 +0,0 @@ -This service posts GitHub events to the Honbu integration service. - -Supported events are currently: -'push', 'issues', 'issue_comment', 'commit_comment', 'create', -'delete', pull_request', 'pull_request_review_comment', 'gollum', -'watch', 'release', 'fork', 'member', 'public', 'team_add', -'status', 'deployment', 'deployment_status'. - -As described at https://developer.github.com/webhooks/#service-hooks - - -Install Notes ------------- - -Token: The GUID generated by Honbu app when the user chooses to integrate with GitHub diff --git a/lib/services/honbu.rb b/lib/services/honbu.rb deleted file mode 100644 index f89d8d368..000000000 --- a/lib/services/honbu.rb +++ /dev/null @@ -1,29 +0,0 @@ -class Service::Honbu < Service::HttpPost - password :token - - - default_events :push, :issues, :issue_comment, :commit_comment, - :create, :delete, :pull_request, :follow, :gollum, :fork, - :member, :team_add, :deployment, :deployment_status - - - - url "http://honbu.io" - logo_url "http://honbu.io/assets/honbu-website-logo.png" - - maintained_by :github => 'RedFred7' - - supported_by :web => 'http://honbu.io/company', - :email => 'support@honbu.io' - - def receive_event - token = required_config_value('token') - - http.headers['Authorization'] = "#{token}" - http.headers['X-GitHub-Event'] = event.to_s - - url = "https://integrations.honbu.io/github" - - deliver url - end -end diff --git a/test/honbu_test.rb b/test/honbu_test.rb deleted file mode 100644 index 23148a3a7..000000000 --- a/test/honbu_test.rb +++ /dev/null @@ -1,40 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class HonbuTest < Service::TestCase - include Service::HttpTestMethods - - def test_push - test_token = "0123456789abcde" - - - data = { - 'token' => test_token, - } - - - - payload = {'commits'=>[{'id'=>'test'}]} - svc = service(data, payload) - - @stubs.post "/github" do |env| - body = JSON.parse(env[:body]) - - assert_equal env[:url].host, "integrations.honbu.io" - assert_equal env[:request_headers]['Authorization'], "#{test_token}" - assert_equal env[:request_headers]['X-GitHub-Event'], "push" - assert_equal 'test', body['payload']['commits'][0]['id'] - assert_match 'guid-', body['guid'] - assert_equal data, body['config'] - assert_equal 'push', body['event'] - [200, {}, ''] - end - - svc.receive_event - @stubs.verify_stubbed_calls - end - - def service_class - Service::Honbu - end -end - From 19cbfed088c94687e1d80432bbd994abb39aec10 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 08:25:34 -0400 Subject: [PATCH 30/46] Remove Hall --- docs/hall | 8 -------- lib/services/hall.rb | 19 ------------------- test/hall_test.rb | 23 ----------------------- 3 files changed, 50 deletions(-) delete mode 100644 docs/hall delete mode 100644 lib/services/hall.rb delete mode 100644 test/hall_test.rb diff --git a/docs/hall b/docs/hall deleted file mode 100644 index a790596a6..000000000 --- a/docs/hall +++ /dev/null @@ -1,8 +0,0 @@ -Broadcast this project's commits, pull requests, issues, and their respective comments to Hall. - -Install Notes -------------- - - * Room Token is a room-specific token. - * You can locate your token by viewing the desired room's setting page. - * Hall is available 24/7 to help. Email us at contact@hall-inc.com diff --git a/lib/services/hall.rb b/lib/services/hall.rb deleted file mode 100644 index da3f7292e..000000000 --- a/lib/services/hall.rb +++ /dev/null @@ -1,19 +0,0 @@ -class Service::Hall < Service - - default_events :commit_comment, :gollum, :issues, :issue_comment, :pull_request, :push - password :room_token - - # Contributing Assets - url "https://hall.com" - logo_url "https://s3.amazonaws.com/hall-production-assets/assets/media_kit/hall_logo-8b3fb6d39f78ad4b234e684f378b87b7.jpg" - maintained_by :github => 'bhellman1' - supported_by :web => 'https://hallcom.uservoice.com/', :email => 'contact@hall-inc.com', :twitter => 'hall' - - def receive_event - raise_config_error "Missing room token" if data['room_token'].to_s.empty? - room_token = data['room_token'].to_s - - res = http_post "https://hall.com/api/1/services/github/#{room_token}", :payload => generate_json(payload) - end - -end diff --git a/test/hall_test.rb b/test/hall_test.rb deleted file mode 100644 index a91a6c6d0..000000000 --- a/test/hall_test.rb +++ /dev/null @@ -1,23 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class HallTest < Service::TestCase - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - @room_token = "test_token" - end - - def test_push - @stubs.post "/api/1/services/github/#{@room_token}" do |env| - assert_equal 'hall.com', env[:url].host - [200, {}, ''] - end - - svc = service( - {'room_token' => 'test_token'}, payload) - svc.receive_event - end - - def service(*args) - super Service::Hall, *args - end -end From b5ff096bca53d01bc1ad2934d1c81e7a0f005479 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 08:26:11 -0400 Subject: [PATCH 31/46] Remove Coffeedoc --- docs/coffeedocinfo | 2 -- lib/services/coffeedocinfo.rb | 17 ----------------- test/coffeedocinfo_test.rb | 25 ------------------------- 3 files changed, 44 deletions(-) delete mode 100644 docs/coffeedocinfo delete mode 100644 lib/services/coffeedocinfo.rb delete mode 100644 test/coffeedocinfo_test.rb diff --git a/docs/coffeedocinfo b/docs/coffeedocinfo deleted file mode 100644 index 470cbd8d5..000000000 --- a/docs/coffeedocinfo +++ /dev/null @@ -1,2 +0,0 @@ -This service allows you to auto-publish documentation for your CoffeeScript library. -The resulting documentation will be hosted for you at http://coffeedoc.info/github/your-name/your-project diff --git a/lib/services/coffeedocinfo.rb b/lib/services/coffeedocinfo.rb deleted file mode 100644 index ba59eb493..000000000 --- a/lib/services/coffeedocinfo.rb +++ /dev/null @@ -1,17 +0,0 @@ -class Service::CoffeeDocInfo < Service::HttpPost - self.title = 'CoffeeDoc.info' - - default_events :push - - url "http://coffeedoc.info/" - - maintained_by :github => 'pwnall', :twitter => '@pwnall' - - supported_by :web => 'https://github.com/netzpirat/coffeedoc.info', - :twitter => 'netzpirat', :github => 'netzpirat' - - def receive_event - url = 'http://coffeedoc.info/checkout' - deliver url - end -end diff --git a/test/coffeedocinfo_test.rb b/test/coffeedocinfo_test.rb deleted file mode 100644 index 93dcde211..000000000 --- a/test/coffeedocinfo_test.rb +++ /dev/null @@ -1,25 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class CoffeeDocInfoTest < Service::TestCase - include Service::HttpTestMethods - - def test_push - @stubs.post "/checkout" do |env| - assert_equal 'coffeedoc.info', env[:url].host - body = JSON.parse(env[:body]) - assert_equal 'push', body['event'] - assert_equal 'test', body['payload']['commits'][0]['id'] - [200, {}, ''] - end - - payload = {'commits'=>[{'id'=>'test'}]} - svc = service({}, payload) - svc.receive_event - @stubs.verify_stubbed_calls - end - - def service_class - Service::CoffeeDocInfo - end -end - From 8e5386bd740bf09c4bd1fbf2b2e7094008cf95a7 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 08:26:46 -0400 Subject: [PATCH 32/46] Remove CodePorting --- docs/codeportingcsharp2java | 10 ---- lib/services/CodePorting-C#2Java.rb | 77 ----------------------------- test/CodePorting-C#2Java_test.rb | 42 ---------------- 3 files changed, 129 deletions(-) delete mode 100644 docs/codeportingcsharp2java delete mode 100644 lib/services/CodePorting-C#2Java.rb delete mode 100644 test/CodePorting-C#2Java_test.rb diff --git a/docs/codeportingcsharp2java b/docs/codeportingcsharp2java deleted file mode 100644 index b989bbcb6..000000000 --- a/docs/codeportingcsharp2java +++ /dev/null @@ -1,10 +0,0 @@ -Allows you to setup a GitHub repository to port C# code to Java on git commit. - -Install Notes -------------- - -1. Enter name for your project (It will be used to organize target repository structure) -2. Enter name for your source repository, the one which contains CSharp code. -3. Enter name for your target repository, the one which will contain the Java ported code (the target repository must be git initialized first). -4. Signup for a CodePorting account at https://apps.codeporting.com/signup and add your CodePorting username/password above. -5. Authorize CodePorting to use your GitHub account and enter GitHub access token above on service settings page. diff --git a/lib/services/CodePorting-C#2Java.rb b/lib/services/CodePorting-C#2Java.rb deleted file mode 100644 index 11b6e1a13..000000000 --- a/lib/services/CodePorting-C#2Java.rb +++ /dev/null @@ -1,77 +0,0 @@ -class Service::CodePortingCSharp2Java < Service - string :project_name, :repo_key, :target_repo_key, :codeporting_username - password :codeporting_password, :github_access_token - - self.title = 'CodePorting-C#2Java' - - def receive_push - return if Array(payload['commits']).empty? - - check_configuration_options(data) - - response = nil - token = perform_login - - if token.blank? - response = "Unable to login on codeporting.com at the moment :( " - raise_config_error "#{response}" - end - - response = process_on_codeporting(token) - if response != "True" - raise_config_error 'Porting performed with errors, porting will be performed again on next commit.' - end - - response - end - - def perform_login - http.ssl[:verify] = false - login_url = "https://apps.codeporting.com/csharp2java/v0/UserSignin" - resp = http.post login_url do |req| - req.body = {:LoginName => data['codeporting_username'], :Password => data['codeporting_password']} - end - - doc = REXML::Document.new(resp.body) - retValue = nil - doc.each_element('//return') do |item| - retValue = item.attributes['success'] - end - - if retValue == "True" - token = nil - doc.each_element('//Token') do |item| - token = item.text - end - token - end - end - - def process_on_codeporting(token) - process_url = "https://apps.codeporting.com/csharp2java/v0/githubpluginsupport" - resp = http.post process_url do |req| - req.body = {:token => token, :ProjectName => data['project_name'], - :RepoKey => data['repo_key'], :TarRepoKey => data['target_repo_key'], - :Username => data['codeporting_username'], :Password => data['codeporting_password'], - :GithubAccessToken => data['github_access_token']} - end - - doc = REXML::Document.new(resp.body) - retValue = nil - doc.each_element('//return') do |item| - retValue = item.attributes['success'] - end - retValue - end - - private - - def check_configuration_options(data) - raise_config_error 'Project name must be set' if data['project_name'].blank? - raise_config_error 'Repository is required' if data['repo_key'].blank? - raise_config_error 'Target repository is required' if data['target_repo_key'].blank? - raise_config_error 'Codeporting username must be provided' if data['codeporting_username'].blank? - raise_config_error 'Codeporting password must be provided' if data['codeporting_password'].blank? - raise_config_error 'GitHub Access Token must be provided for committing changes back to GitHub' if data['github_access_token'].blank? - end -end diff --git a/test/CodePorting-C#2Java_test.rb b/test/CodePorting-C#2Java_test.rb deleted file mode 100644 index 3b7d7a59a..000000000 --- a/test/CodePorting-C#2Java_test.rb +++ /dev/null @@ -1,42 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class CodePortingCSharp2JavaTest < Service::TestCase - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - @stubs.post '/csharp2java/v0/UserSignin' do |env| - form = Faraday::Utils.parse_query(env[:body]) - assert_equal 'codeportingtest', form['LoginName'] - assert_equal 'testpassword', form['Password'] - [200, {}, %(MONKEY)] - end - end - - def test_push - @stubs.post '/csharp2java/v0/githubpluginsupport' do |env| - form = Faraday::Utils.parse_query(env[:body]) - assert_equal 'MONKEY', form['token'] - assert_equal 'Test_Project', form['ProjectName'] - assert_equal 'Test', form['RepoKey'] - assert_equal 'TestJava', form['TarRepoKey'] - assert_equal 'codeportingtest', form['Username'] - assert_equal 'testpassword', form['Password'] - assert_equal '0314adcacbb895bd52f3bc6f2f361ebac3ffbfb6', form['GithubAccessToken'] - [200, {}, %()] - end - - svc = service({'project_name' => 'Test_Project', - 'repo_key' => 'Test', - 'target_repo_key' => 'TestJava', - 'codeporting_username' => 'codeportingtest', - 'codeporting_password' => 'testpassword', - 'active' => '1', - 'github_access_token' => '0314adcacbb895bd52f3bc6f2f361ebac3ffbfb6'}, payload) - - assert_equal 3, payload['commits'].size - assert_equal "True", svc.receive_push - end - - def service(*args) - super Service::CodePortingCSharp2Java, *args - end -end From 93f01d985f14d8552d689c02d59fa41d5e3f90c0 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 08:27:22 -0400 Subject: [PATCH 33/46] Remove CoOp --- docs/coop | 8 -------- lib/services/co_op.rb | 23 ----------------------- test/coop_test.rb | 40 ---------------------------------------- 3 files changed, 71 deletions(-) delete mode 100644 docs/coop delete mode 100644 lib/services/co_op.rb delete mode 100644 test/coop_test.rb diff --git a/docs/coop b/docs/coop deleted file mode 100644 index 6a30dcad0..000000000 --- a/docs/coop +++ /dev/null @@ -1,8 +0,0 @@ -Install Notes -------------- - - 1. group_id is in the URL for your group, for example if your URL is "http://coopapp.com/groups/1066", your group_id is 1066 - - 2. token is your API token. You can find this token in the group management panel as the group administrator, eg: "http://coopapp.com/groups/1066/edit" - - 3. Commit messages show up as being from Cobot, the Co-op message robot \ No newline at end of file diff --git a/lib/services/co_op.rb b/lib/services/co_op.rb deleted file mode 100644 index 6de6d9e32..000000000 --- a/lib/services/co_op.rb +++ /dev/null @@ -1,23 +0,0 @@ -class Service::CoOp < Service - string :group_id - password :token - white_list :group_id - - self.title = 'Co-Op' - - def receive_push - repository = payload['repository']['name'] - payload['commits'].each do |commit| - status = "#{commit['author']['name']} just committed a change to #{repository} on GitHub: #{commit['message']} (#{commit['url']})" - res = http_post "http://coopapp.com/groups/%s/notes" % [data['group_id']], - generate_json(:status => status, :key => data['token']), - 'Accept' => 'application/json', - 'Content-Type' => 'application/json; charset=utf-8', - 'User-Agent' => 'GitHub Notifier' - - if res.status >= 400 - raise_config_error - end - end - end -end diff --git a/test/coop_test.rb b/test/coop_test.rb deleted file mode 100644 index 331e417db..000000000 --- a/test/coop_test.rb +++ /dev/null @@ -1,40 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class CoOpTest < Service::TestCase - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - end - - def test_push - svc = service({'group_id' => 'abc', 'token' => 'def'}, payload) - - num = 0 - @stubs.post "/groups/abc/notes" do |env| - data = JSON.parse env[:body] - assert_match /tom/i, data['status'] - assert_equal 'def', data['key'] - - assert_equal 'GitHub Notifier', env[:request_headers]['User-Agent'] - assert_equal 'application/json; charset=utf-8', - env[:request_headers]['Content-Type'] - assert_equal 'application/json', - env[:request_headers]['Accept'] - - num += 1 - - [200, {}, ''] - end - - svc.receive_push - assert_equal 3, num - - @stubs.verify_stubbed_calls - end - - def service(*args) - super Service::CoOp, *args - end -end - - - From d93302471719be80229ea61adf6840133c0236b2 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 08:29:44 -0400 Subject: [PATCH 34/46] Remove Masterbranch --- docs/masterbranch | 4 ---- lib/services/masterbranch.rb | 7 ------- test/masterbranch_test.rb | 23 ----------------------- 3 files changed, 34 deletions(-) delete mode 100644 docs/masterbranch delete mode 100644 lib/services/masterbranch.rb delete mode 100644 test/masterbranch_test.rb diff --git a/docs/masterbranch b/docs/masterbranch deleted file mode 100644 index 5bd8c21ab..000000000 --- a/docs/masterbranch +++ /dev/null @@ -1,4 +0,0 @@ -With this service your commit's logs will be sent to Masterbranch.com. -Masterbranch will proportionate you with an automatic-updated profile of your -project. This profile will show the different technologies you are using, -including some stats based on the contributors development. diff --git a/lib/services/masterbranch.rb b/lib/services/masterbranch.rb deleted file mode 100644 index 8caf78e21..000000000 --- a/lib/services/masterbranch.rb +++ /dev/null @@ -1,7 +0,0 @@ -class Service::Masterbranch < Service - def receive_push - http_post "http://webhooks.masterbranch.com/gh-hook", - :payload => generate_json(payload) - end -end - diff --git a/test/masterbranch_test.rb b/test/masterbranch_test.rb deleted file mode 100644 index 9a343f5e9..000000000 --- a/test/masterbranch_test.rb +++ /dev/null @@ -1,23 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class MasterbranchTest < Service::TestCase - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - end - - def test_push - @stubs.post "/gh-hook" do |env| - assert_equal 'webhooks.masterbranch.com', env[:url].host - assert_match 'payload=%7B%22a%22%3A1%7D', env[:body] - [200, {}, ''] - end - - svc = service({}, :a => 1) - svc.receive_push - end - - def service(*args) - super Service::Masterbranch, *args - end -end - From b8ae536da3a0ba036b80f920bd347f03bee80b5f Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 08:29:48 -0400 Subject: [PATCH 35/46] Remove Loggly --- docs/loggly | 7 ------- lib/services/loggly.rb | 9 --------- test/loggly_test.rb | 22 ---------------------- 3 files changed, 38 deletions(-) delete mode 100644 docs/loggly delete mode 100644 lib/services/loggly.rb delete mode 100644 test/loggly_test.rb diff --git a/docs/loggly b/docs/loggly deleted file mode 100644 index 64d1660b1..000000000 --- a/docs/loggly +++ /dev/null @@ -1,7 +0,0 @@ -This service hook allows you to log pushed commits directly to a Loggly HTTP -input. - -Install Notes -------------- - -1. input token -- take this from the detail page for your HTTP input. \ No newline at end of file diff --git a/lib/services/loggly.rb b/lib/services/loggly.rb deleted file mode 100644 index 8da0f9aa6..000000000 --- a/lib/services/loggly.rb +++ /dev/null @@ -1,9 +0,0 @@ -class Service::Loggly < Service - password :input_token - - def receive_push - http.headers['Content-Type'] = 'application/json' - url = "https://logs.loggly.com/inputs/#{data['input_token']}" - payload['commits'].each { |commit| http_post url, generate_json(commit) } - end -end diff --git a/test/loggly_test.rb b/test/loggly_test.rb deleted file mode 100644 index 2aafdbac7..000000000 --- a/test/loggly_test.rb +++ /dev/null @@ -1,22 +0,0 @@ -class LogglyTest < Service::TestCase - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - end - - def test_push - @stubs.post "/inputs/input-foo" do |env| - assert_equal 'application/json', env[:request_headers]['Content-Type'] - assert_equal 'logs.loggly.com', env[:url].host - [200, {}, ''] - end - - svc = service( - {"input_token" => "input-foo"}, - payload) - svc.receive_push - end - - def service(*args) - super Service::Loggly, *args - end -end From cc1ee7910466a81de5ec4372e6920e6857892809 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 08:30:22 -0400 Subject: [PATCH 36/46] Remove Distiller --- docs/distiller | 14 -------------- lib/services/distiller.rb | 24 ----------------------- test/distiller_test.rb | 40 --------------------------------------- 3 files changed, 78 deletions(-) delete mode 100644 docs/distiller delete mode 100644 lib/services/distiller.rb delete mode 100644 test/distiller_test.rb diff --git a/docs/distiller b/docs/distiller deleted file mode 100644 index fbe70bf3a..000000000 --- a/docs/distiller +++ /dev/null @@ -1,14 +0,0 @@ -Distiller is a hosted continuous integration service. - -If you already connected this repository to Distiller we've probably already set up a webhook for this repository - check this list of webhooks above. - -If you haven't connected this project but want to: - -1. Go to http://distiller.io/ and sign up with your GitHub credentials. -2. Create a New Project and add the GitHub repository. -3. Configure the project. -4. We'll add a webhook - you're done! - -If you or someone else has connected this repository to Distiller but wasn't able to configure the webhook (if, for example, they weren't an administrator for this repository), simply check “Active” to enable the hook and Distiller will automatically build this repository when you push. - -Learn more at http://distiller.io. \ No newline at end of file diff --git a/lib/services/distiller.rb b/lib/services/distiller.rb deleted file mode 100644 index 13503ead6..000000000 --- a/lib/services/distiller.rb +++ /dev/null @@ -1,24 +0,0 @@ -class Service::Distiller < Service::HttpPost - self.title = "Distiller" - url "http://distiller.io" - logo_url "http://www.distiller.io/favicon.ico" - - maintained_by :github => 'travis' - supported_by :web => 'http://distiller.io/chat', - :email => 'help@distiller.io' - - default_events :push - - def receive_event - http.headers['content-type'] = 'application/x-www-form-urlencoded' - http_post distiller_url, - "payload" => generate_json(payload), - "event_type" => generate_json(:event_type => event) - end - - private - - def distiller_url - "https://www.distiller.io/hooks/github" - end -end diff --git a/test/distiller_test.rb b/test/distiller_test.rb deleted file mode 100644 index 81e953482..000000000 --- a/test/distiller_test.rb +++ /dev/null @@ -1,40 +0,0 @@ -require File.expand_path('../helper', __FILE__) -class DistillerTest < Service::TestCase - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - end - - # currently supported events - - # push - - def test_push - post_to_service(:push) - end - - def test_supported_events - assert_equal Service::Distiller.supported_events.sort , Service::ALL_EVENTS.sort - assert_equal Service::Distiller.default_events.sort , [:push].sort - end - - private - - def service(*args) - super Service::Distiller, *args - end - - def post_to_service(event_name) - assert Service::ALL_EVENTS.include? event_name.to_s - svc = service(event_name, {'token' => 'abc'}, payload) - - @stubs.post "/hooks/github" do |env| - body = Faraday::Utils.parse_query env[:body] - assert_match "https://www.distiller.io/hooks/github", env[:url].to_s - assert_match 'application/x-www-form-urlencoded', env[:request_headers]['content-type'] - assert_equal payload, JSON.parse(body["payload"].to_s) - assert_equal event_name.to_s, JSON.parse(body["event_type"].to_s)["event_type"] - end - - svc.receive_event - end -end From 0dcc1dcedd7ab5d121e77afc6b76868b796d622f Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 08:31:03 -0400 Subject: [PATCH 37/46] Remove Cube --- docs/cube | 6 ------ lib/services/cube.rb | 13 ------------- test/cube_test.rb | 29 ----------------------------- 3 files changed, 48 deletions(-) delete mode 100644 docs/cube delete mode 100644 lib/services/cube.rb delete mode 100644 test/cube_test.rb diff --git a/docs/cube b/docs/cube deleted file mode 100644 index 8e01ef25e..000000000 --- a/docs/cube +++ /dev/null @@ -1,6 +0,0 @@ -Install Notes -------------- - - 1. **Domain** should be the company domain for Google Apps account or user email address for individual accounts. - 2. **Project** should be your project name. - 3. **Token** should be the project integration token as seen in the project's Settings tab. \ No newline at end of file diff --git a/lib/services/cube.rb b/lib/services/cube.rb deleted file mode 100644 index 92cb7d26f..000000000 --- a/lib/services/cube.rb +++ /dev/null @@ -1,13 +0,0 @@ -class Service::Cube < Service - string :domain, :project - password :token - white_list :domain, :project - - def receive_push - http_post "http://cube.bitrzr.com/integration/events/github/create", - 'payload' => generate_json(payload), - 'project_name' => data['project'], - 'project_token' => data['token'], - 'domain' => data['domain'] - end -end diff --git a/test/cube_test.rb b/test/cube_test.rb deleted file mode 100644 index 45869df51..000000000 --- a/test/cube_test.rb +++ /dev/null @@ -1,29 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class CubeTest < Service::TestCase - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - end - - def test_push - url = "/integration/events/github/create" - @stubs.post url do |env| - assert_match /(^|\&)payload=%7B%22a%22%3A1%7D($|\&)/, env[:body] - assert_match "project_name=p", env[:body] - assert_match "project_token=t", env[:body] - assert_match "domain=d", env[:body] - [200, {}, ''] - end - - svc = service( - {'project' => 'p', 'token' => 't', 'domain' => 'd'}, - 'a' => 1) - svc.receive_push - end - - def service(*args) - super Service::Cube, *args - end -end - - From 54cd10be474fb91a5a415befdc58d01c92c8ae34 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 08:31:35 -0400 Subject: [PATCH 38/46] Remove AgileZen --- docs/agilezen | 17 -------- lib/services/agilezen.rb | 23 ----------- test/agilezen_test.rb | 85 ---------------------------------------- 3 files changed, 125 deletions(-) delete mode 100644 docs/agilezen delete mode 100644 lib/services/agilezen.rb delete mode 100644 test/agilezen_test.rb diff --git a/docs/agilezen b/docs/agilezen deleted file mode 100644 index 81eb1d0a7..000000000 --- a/docs/agilezen +++ /dev/null @@ -1,17 +0,0 @@ -AgileZen is a simple and easy to use project management tool that helps you collaborate with your team and visualize all your work in progress. - -Integrating with GitHub will allow you to associate Git commits to specific story cards. If you add a story number to your commit message, AgileZen will associate the commit with the story, making it visible on the board and story focus screen. For example, if you add the text `#123` to your commit message, AgileZen will attach the commit to story card 123. - -This allows your team to stay up to date on the latest development work and view a history of commits for each story. - -Install Notes -------------- - -1. **API Key** - This is your AgileZen API key. -2. **Project ID** - This is the project's numeric ID (the number in the project's URL on AgileZen) to associate with the repository. -3. **Branches** - This is an optional space-separated list of branches to watch commits for. Commits to other branches will not be notified to AgileZen. If no branches are specified, AgileZen will be notified of all commits. - -Need Help? ----------- - -Check out our [step by step instructions](http://help.agilezen.com/kb/integrations/github). diff --git a/lib/services/agilezen.rb b/lib/services/agilezen.rb deleted file mode 100644 index 47e285947..000000000 --- a/lib/services/agilezen.rb +++ /dev/null @@ -1,23 +0,0 @@ -class Service::AgileZen < Service - string :api_key, :project_id, :branches - white_list :project_id, :branches - - def receive_push - raise_config_error "Missing 'api_key'" if data['api_key'].to_s == '' - raise_config_error "Missing 'project_id'" if data['project_id'].to_s == '' - - branches = data['branches'].to_s.split(/\s+/) - ref = payload["ref"].to_s - return unless branches.empty? || branches.include?(ref.split("/").last) - - http.headers['X-Zen-ApiKey'] = data['api_key'] - http.headers['Content-Type'] = 'application/json' - - res = http_post "https://agilezen.com/api/v1/projects/#{data['project_id']}/changesets/github", - generate_json(payload) - - if res.status < 200 || res.status > 299 - raise_config_error - end - end -end diff --git a/test/agilezen_test.rb b/test/agilezen_test.rb deleted file mode 100644 index e96a49823..000000000 --- a/test/agilezen_test.rb +++ /dev/null @@ -1,85 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class AgileZenTest < Service::TestCase - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - end - - def test_unspecified_branch - payload = {'answer' => 42, 'ref' => 'refs/heads/master'} - @stubs.post '/api/v1/projects/123/changesets/github' do |env| - body = JSON.parse(env[:body]) - assert_equal payload, body - assert_equal 'test_api_key', env[:request_headers]['X-Zen-ApiKey'] - assert_equal 'application/json', env[:request_headers]['Content-Type'] - [200, {}, ''] - end - - svc = service({'api_key' => 'test_api_key', 'project_id' => '123'}, payload) - svc.receive_push - @stubs.verify_stubbed_calls - end - - def test_matching_branch - payload = {"ref" => "refs/heads/foo"} - @stubs.post("/api/v1/projects/123/changesets/github") { |e| [200, {}, ''] } - - svc = service({'api_key' => 'test_api_key', 'project_id' => '123', 'branches' => 'foo'}, payload) - svc.receive_push - @stubs.verify_stubbed_calls - end - - def test_unmatching_branch - payload = {"ref" => "refs/heads/bar"} - @stubs.post("/api/v1/projects/123/changesets/github") { |e| [200, {}, ''] } - - svc = service({'api_key' => 'test_api_key', 'project_id' => '123', 'branches' => 'foo'}, payload) - svc.receive_push - - # Test that no post fired - begin - @stubs.verify_stubbed_calls - rescue RuntimeError - else - assert_true false - end - end - - def test_matching_branch_of_many - payload = {"ref" => "refs/heads/foo"} - @stubs.post("/api/v1/projects/123/changesets/github") { |e| [200, {}, ''] } - - svc = service({'api_key' => 'test_api_key', 'project_id' => '123', 'branches' => 'baz foo'}, payload) - svc.receive_push - @stubs.verify_stubbed_calls - end - - def test_unmatching_branch_of_many - payload = {"ref" => "refs/heads/bar"} - @stubs.post("/api/v1/projects/123/changesets/github") { |e| [200, {}, ''] } - - svc = service({'api_key' => 'test_api_key', 'project_id' => '123', 'branches' => 'baz foo'}, payload) - svc.receive_push - - # Test that no post fired - begin - @stubs.verify_stubbed_calls - rescue RuntimeError - else - assert_true false - end - end - - def test_matching_tag - payload = {"ref" => "refs/tags/foo"} - @stubs.post("/api/v1/projects/123/changesets/github") { |e| [200, {}, ''] } - - svc = service({'api_key' => 'test_api_key', 'project_id' => '123', 'branches' => 'foo'}, payload) - svc.receive_push - @stubs.verify_stubbed_calls - end - - def service(*args) - super Service::AgileZen, *args - end -end From 3d2902c76f23d266b20b2953dc5b4fcc83da99ab Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 16:44:56 -0400 Subject: [PATCH 39/46] yo get out of here --- .gitignore | 2 ++ github-services-1.0.0.bab7cf5.gem | Bin 142848 -> 0 bytes 2 files changed, 2 insertions(+) delete mode 100644 github-services-1.0.0.bab7cf5.gem diff --git a/.gitignore b/.gitignore index 482a03e0e..cd770bf1b 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ tmp pkg .iml Gemfile.lock + +github-services*.gem diff --git a/github-services-1.0.0.bab7cf5.gem b/github-services-1.0.0.bab7cf5.gem deleted file mode 100644 index ab1913fd8dec1ffa2f215c05b8cf3869ff9546d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142848 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

FxDk?Ed^c_VjJOE|5R`R$M4Y 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%0DR7@Ag+PD8{dUN0kgQJ`AL(5M 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�}f_k{cI1y8&^qQ?i6uxr>-r3 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 Date: Thu, 9 Aug 2018 16:46:37 -0400 Subject: [PATCH 40/46] Remove TinyPM --- docs/tinypm | 12 ------------ lib/services/tinypm.rb | 23 ----------------------- test/tinypm_test.rb | 33 --------------------------------- 3 files changed, 68 deletions(-) delete mode 100644 docs/tinypm delete mode 100644 lib/services/tinypm.rb delete mode 100644 test/tinypm_test.rb diff --git a/docs/tinypm b/docs/tinypm deleted file mode 100644 index d73e33c55..000000000 --- a/docs/tinypm +++ /dev/null @@ -1,12 +0,0 @@ -This service posts an event object for GitHub events to [tinyPM][tinyPM_link] application. - -[tinyPM][tinyPM_link] is an agile collaboration tool with product management, backlog, taskboard, user stories and wiki. Web-based and internationalized. - - -Install Notes -------------- - -1. You will need to copy your GitHub integration URL. Open your tinyPM and navigate to Application Settings (requires admin access to tinyPM). -2. Don't forget to check **Active** - -[tinyPM_link]: http://www.tinypm.com diff --git a/lib/services/tinypm.rb b/lib/services/tinypm.rb deleted file mode 100644 index cc631c966..000000000 --- a/lib/services/tinypm.rb +++ /dev/null @@ -1,23 +0,0 @@ -class Service::TinyPM < Service::HttpPost - string :url - # white_list :server - - default_events :push - - url "http://www.tinypm.com" - logo_url "http://www.tinypm.com/images/tinypm_logo.gif" - - maintained_by :github => 'raho', - :email => 'rafal.hotlos@gmail.com' - - supported_by :web => 'http://www.tinypm.com/', - :email => 'support@tinypm.com' - - - def receive_push - server_url = required_config_value('url') - http.headers['Content-Type'] = 'application/json' - http_post(server_url, generate_json(payload)) - end - -end diff --git a/test/tinypm_test.rb b/test/tinypm_test.rb deleted file mode 100644 index 1bf12acbc..000000000 --- a/test/tinypm_test.rb +++ /dev/null @@ -1,33 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class TinyPMTest < Service::TestCase - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - @data = {'url' => 'http://tinypm.com/github'} - end - - def test_push - @stubs.post "/github" do |env| - form = Faraday::Utils.parse_query(env[:body]) - assert_equal 'tinypm.com', env[:url].host - assert_equal 'application/json', env[:request_headers]['Content-Type'] - assert_equal JSON.generate(payload), env[:body] - [200, {}, ''] - end - - svc = service(@data, payload) - svc.receive_push - @stubs.verify_stubbed_calls - end - - def test_no_server - assert_raises Service::ConfigurationError do - svc = service :push, {'url' => ''}, payload - svc.receive_push - end - end - - def service(*args) - super Service::TinyPM, *args - end -end From f3fbd78ab7ae18636d83d9fcbecf80044af66226 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 16:46:43 -0400 Subject: [PATCH 41/46] Remove RailsBP --- docs/railsbp | 14 ------- lib/services/railsbp.rb | 21 ---------- test/railsbp_test.rb | 87 ----------------------------------------- 3 files changed, 122 deletions(-) delete mode 100644 docs/railsbp delete mode 100644 lib/services/railsbp.rb delete mode 100644 test/railsbp_test.rb diff --git a/docs/railsbp b/docs/railsbp deleted file mode 100644 index bb9fd27a0..000000000 --- a/docs/railsbp +++ /dev/null @@ -1,14 +0,0 @@ -Railsbp - a code analyzer service for rails projects. - -Install Notes -------------- - -1. Create an account on railsbp.com (just sign in with GitHub) -2. Create a repository on railsbp.com -3. Enter your token - - the token which you can find on repository edit page on railsbp.com -4. Enter your railsbp_url if you deploy the proxy on your own server -5. Check the "Active" checkbox and click "Update Settings" - -For more details about Railsbp, go to https://railsbp.com - diff --git a/lib/services/railsbp.rb b/lib/services/railsbp.rb deleted file mode 100644 index ba79c33d7..000000000 --- a/lib/services/railsbp.rb +++ /dev/null @@ -1,21 +0,0 @@ -class Service::Railsbp < Service - string :railsbp_url - password :token - white_list :railsbp_url - - def receive_push - http_post railsbp_url, :token => token, :payload => generate_json(payload) - end - - def railsbp_url - if !(url = data["railsbp_url"].to_s).empty? - url.strip - else - "https://railsbp.com" - end - end - - def token - data['token'].strip - end -end diff --git a/test/railsbp_test.rb b/test/railsbp_test.rb deleted file mode 100644 index b0aeeeaaf..000000000 --- a/test/railsbp_test.rb +++ /dev/null @@ -1,87 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class RailsbpTest < Service::TestCase - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - @svc = service(data, payload) - end - - def test_reads_token_from_data - assert_equal "xAAQZtJhYHGagsed1kYR", @svc.token - end - - def test_reads_default_railsbp_url_from_data - assert_equal "https://railsbp.com", @svc.railsbp_url - end - - def test_reads_custom_railsbp_url_from_data - data = { "token" => "xAAQZtJhYHGagsed1kYR", "railsbp_url" => "http://railsbp.heroku.com" } - svc = service(data, payload) - assert_equal "http://railsbp.heroku.com", svc.railsbp_url - end - - def test_strips_whitespace_from_form_values - data = { "token" => " xAAQZtJhYHGagsed1kYR ", "railsbp_url" => " http://railsbp.heroku.com " } - svc = service(data, payload) - assert_equal "xAAQZtJhYHGagsed1kYR", svc.token - assert_equal "http://railsbp.heroku.com", svc.railsbp_url - end - - def test_posts_payload - @stubs.post "/" do |env| - assert_equal payload, JSON.parse(Faraday::Utils.parse_query(env[:body])['payload']) - end - @svc.receive_push - end - - def service(*args) - super Service::Railsbp, *args - end - - def data - { "token" => "xAAQZtJhYHGagsed1kYR", 'railsbp_url' => '' } - end - - def payload - { - "before" => "a6ab010bc21151e238c73d5229c36892d51c2d4f", - "repository" => { - "url" => "https =>//github.com/railsbp/rails-bestpractices.com", - "name" => "rails-bestpractice.com", - "description" => "rails-bestpractices.com", - "watchers" => 64, - "forks" => 14, - "private" => 0, - "owner" => { - "email" => "flyerhzm@gmail.com", - "name" => "Richard Huang" - } - }, - "commits" => [ - { - "id" => "af9718a9bee64b9bbbefc4c9cf54c4cc102333a8", - "url" => "https =>//github.com/railsbp/rails-bestpractices.com/commit/af9718a9bee64b9bbbefc4c9cf54c4cc102333a8", - "author" => { - "email" => "flyerhzm@gmail.com", - "name" => "Richard Huang" - }, - "message" => "fix typo in .travis.yml", - "timestamp" => "2011-12-25T18 =>57 =>17+08 =>00", - "modified" => [".travis.yml"] - }, - { - "id" => "473d12b3ca40a38f12620e31725922a9d88b5386", - "url" => "https =>//github.com/railsbp/rails-bestpractices.com/commit/473d12b3ca40a38f12620e31725922a9d88b5386", - "author" => { - "email" => "flyerhzm@gmail.com", - "name" => "Richard Huang" - }, - "message" => "copy config yaml files for travis", - "timestamp" => "2011-12-25T20 =>36 =>34+08 =>00" - } - ], - "after" => "473d12b3ca40a38f12620e31725922a9d88b5386", - "ref" => "refs/heads/master" - } - end -end From 32e850be338327c4a083df6407086df0c3076167 Mon Sep 17 00:00:00 2001 From: "Garen J. Torikian" Date: Thu, 9 Aug 2018 16:46:49 -0400 Subject: [PATCH 42/46] Remove Rails Brakeman --- docs/railsbrakeman | 12 ----- lib/services/rails_brakeman.rb | 21 -------- test/rails_brakeman_test.rb | 87 ---------------------------------- 3 files changed, 120 deletions(-) delete mode 100644 docs/railsbrakeman delete mode 100644 lib/services/rails_brakeman.rb delete mode 100644 test/rails_brakeman_test.rb diff --git a/docs/railsbrakeman b/docs/railsbrakeman deleted file mode 100644 index fdc2256e0..000000000 --- a/docs/railsbrakeman +++ /dev/null @@ -1,12 +0,0 @@ -RailsBrakeman is an online service to find security issues in your Rails -projects. - -1. Create an account on rails-brakeman.com (just sign in with GitHub) -2. Create a repository on rails-brakeman.com -3. Enter your token - - the token which you can find on repository edit page on rails-brakeman.com -4. Enter your rails_brakeman_url if you deploy the proxy on your own server -5. Check the "Active" checkbox and click "Update Settings" - -For more details about RailsBrakeman, go to https://rails-brakeman.com - diff --git a/lib/services/rails_brakeman.rb b/lib/services/rails_brakeman.rb deleted file mode 100644 index 0a6dcaff3..000000000 --- a/lib/services/rails_brakeman.rb +++ /dev/null @@ -1,21 +0,0 @@ -class Service::RailsBrakeman < Service - string :rails_brakeman_url - password :token - white_list :rails_brakeman_url - - def receive_push - http_post rails_brakeman_url, :token => token, :payload => generate_json(payload) - end - - def rails_brakeman_url - if !(url = data["rails_brakeman_url"].to_s).empty? - url.strip - else - "https://rails-brakeman.com" - end - end - - def token - data['token'].strip - end -end diff --git a/test/rails_brakeman_test.rb b/test/rails_brakeman_test.rb deleted file mode 100644 index 5f7833d48..000000000 --- a/test/rails_brakeman_test.rb +++ /dev/null @@ -1,87 +0,0 @@ -require File.expand_path('../helper', __FILE__) - -class RailsBrakemanTest < Service::TestCase - def setup - @stubs = Faraday::Adapter::Test::Stubs.new - @svc = service(data, payload) - end - - def test_reads_token_from_data - assert_equal "xAAQZtJhYHGagsed1kYR", @svc.token - end - - def test_reads_default_rails_brakeman_url_from_data - assert_equal "https://rails-brakeman.com", @svc.rails_brakeman_url - end - - def test_reads_custom_rails_brakeman_url_from_data - data = { "token" => "xAAQZtJhYHGagsed1kYR", "rails_brakeman_url" => "http://rails-brakeman.heroku.com" } - svc = service(data, payload) - assert_equal "http://rails-brakeman.heroku.com", svc.rails_brakeman_url - end - - def test_strips_whitespace_from_form_values - data = { "token" => " xAAQZtJhYHGagsed1kYR ", "rails_brakeman_url" => " http://rails-brakeman.heroku.com " } - svc = service(data, payload) - assert_equal "xAAQZtJhYHGagsed1kYR", svc.token - assert_equal "http://rails-brakeman.heroku.com", svc.rails_brakeman_url - end - - def test_posts_payload - @stubs.post "/" do |env| - assert_equal payload, JSON.parse(Faraday::Utils.parse_query(env[:body])['payload']) - end - @svc.receive_push - end - - def service(*args) - super Service::RailsBrakeman, *args - end - - def data - { "token" => "xAAQZtJhYHGagsed1kYR", 'rails_brakeman_url' => '' } - end - - def payload - { - "before" => "a6ab010bc21151e238c73d5229c36892d51c2d4f", - "repository" => { - "url" => "https =>//github.com/flyerhzm/rails-brakeman.com", - "name" => "rails-brakeman.com", - "description" => "rails-brakeman.com", - "watchers" => 1, - "forks" => 1, - "private" => 0, - "owner" => { - "email" => "flyerhzm@gmail.com", - "name" => "Richard Huang" - } - }, - "commits" => [ - { - "id" => "af9718a9bee64b9bbbefc4c9cf54c4cc102333a8", - "url" => "https =>//github.com/flyerhzm/rails-brakeman.com/commit/af9718a9bee64b9bbbefc4c9cf54c4cc102333a8", - "author" => { - "email" => "flyerhzm@gmail.com", - "name" => "Richard Huang" - }, - "message" => "fix typo in .travis.yml", - "timestamp" => "2011-12-25T18 =>57 =>17+08 =>00", - "modified" => [".travis.yml"] - }, - { - "id" => "473d12b3ca40a38f12620e31725922a9d88b5386", - "url" => "https =>//github.com/flyerhzm/rails-brakeman.com/commit/473d12b3ca40a38f12620e31725922a9d88b5386", - "author" => { - "email" => "flyerhzm@gmail.com", - "name" => "Richard Huang" - }, - "message" => "copy config yaml files for travis", - "timestamp" => "2011-12-25T20 =>36 =>34+08 =>00" - } - ], - "after" => "473d12b3ca40a38f12620e31725922a9d88b5386", - "ref" => "refs/heads/master" - } - end -end From 594a635a256e12a1bbdc6f4bd688e48102f6eaf7 Mon Sep 17 00:00:00 2001 From: Brooks Swinnerton Date: Mon, 24 Sep 2018 15:05:51 -0400 Subject: [PATCH 43/46] Remove Rubyforge support Rubyforge closed down in May of 2014. This commit removes support for Rubyforge in github-services. --- lib/github-services.rb | 2 - .../internal-gems/rubyforge/lib/rubyforge.rb | 74 ------------------- 2 files changed, 76 deletions(-) delete mode 100644 vendor/internal-gems/rubyforge/lib/rubyforge.rb diff --git a/lib/github-services.rb b/lib/github-services.rb index 722c0d087..b76d5cbdc 100644 --- a/lib/github-services.rb +++ b/lib/github-services.rb @@ -22,13 +22,11 @@ require 'xmpp4r/presence' require 'xmpp4r/muc' require 'xmpp4r/roster' -require 'rubyforge' require 'oauth' require 'twilio-ruby' # vendor require 'basecamp' -require 'rubyforge' require 'softlayer/messaging' require 'faraday' diff --git a/vendor/internal-gems/rubyforge/lib/rubyforge.rb b/vendor/internal-gems/rubyforge/lib/rubyforge.rb deleted file mode 100644 index 61b0e9714..000000000 --- a/vendor/internal-gems/rubyforge/lib/rubyforge.rb +++ /dev/null @@ -1,74 +0,0 @@ -# This code was pretty much copied from Ara Howard's -# RubyForge gem... thanks Ara! :) - -require 'net/https' -require 'openssl' -require 'webrick/cookie' - -class RubyForge - def initialize(username, password) - @cookies = Array.new - login(username, password) - end - - def post_news(group_id, subject, body) - url = URI.parse('http://rubyforge.org/news/submit.php') - form = { - 'group_id' => group_id.to_s, - 'post_changes' => 'y', - 'summary' => subject, - 'details' => body, - 'submit' => 'Submit' - } - execute(url, form) - end - - ####### - private - ####### - - def login(username, password) - url = URI.parse('https://rubyforge.org/account/login.php') - form = { - 'return_to' => '', - 'form_loginname' => username, - 'form_pw' => password, - 'login' => 'Login' - } - response = execute(url, form) - bake_cookies(url, response) - end - - def execute(url, parameters) - request = Net::HTTP::Post.new(url.request_uri) - request['Content-Type'] = 'application/x-www-form-urlencoded' - @cookies.each do |cookie| - request['Cookie'] = cookie - end - http = Net::HTTP.new(url.host, url.port) - if url.scheme == 'https' - http.use_ssl = true - http.verify_mode = OpenSSL::SSL::VERIFY_NONE - end - request_data = query_string_for(parameters) - request['Content-Length'] = request_data.length.to_s - http.request(request, request_data) - end - - def bake_cookies(url, response) - (response.get_fields('Set-Cookie') || []).each do |raw_cookie| - WEBrick::Cookie.parse_set_cookies(raw_cookie).each do |baked_cookie| - baked_cookie.domain ||= url.host - baked_cookie.path ||= url.path - @cookies << baked_cookie - end - end - end - - def query_string_for(parameters) - parameters.sort_by { |k,v| k.to_s }.map { |k,v| - k && [ WEBrick::HTTPUtils.escape_form(k.to_s), - WEBrick::HTTPUtils.escape_form(v.to_s) ].join('=') - }.compact.join('&') - end -end From 9e7601491db59b2fb8ff5f61904f8c2a023b0e18 Mon Sep 17 00:00:00 2001 From: James Dennes Date: Fri, 28 Sep 2018 09:10:12 +0200 Subject: [PATCH 44/46] Replace an instance of "Github" with "GitHub" This is user-facing in the GitHub app, so it would be nice if it was correct. --- docs/divecloud | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/divecloud b/docs/divecloud index 29ad01fcd..3275eedbf 100644 --- a/docs/divecloud +++ b/docs/divecloud @@ -1,9 +1,9 @@ DiveCloud integrates Application Performance Testing into the Continuous Integration Cycle by allowing you to run a performance test after each successful deployment. -When Github receives notice that you have successfully deployed your application, it will initiate a performance test based on the test plan you created at https://divecloud.nouvola.com. +When GitHub receives notice that you have successfully deployed your application, it will initiate a performance test based on the test plan you created at https://divecloud.nouvola.com. -Please enter your API Key and the Plan ID for the plan that you would like to run on successful deployment of your application. +Please enter your API Key and the Plan ID for the plan that you would like to run on successful deployment of your application. -If you would like to add 'Think Time' to you test, select the 'Think Time' checkbox. +If you would like to add 'Think Time' to you test, select the 'Think Time' checkbox. -If your test plan includes credentials, include your credential password in the field below. +If your test plan includes credentials, include your credential password in the field below. From 307bfe12b00917b062b9d24faa912363d5e44511 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Wed, 23 Jan 2019 10:21:36 -0600 Subject: [PATCH 45/46] Update deprecation note --- lib/services/email.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/services/email.rb b/lib/services/email.rb index 692779b7f..2d4e8b587 100644 --- a/lib/services/email.rb +++ b/lib/services/email.rb @@ -194,9 +194,9 @@ def mail_body body << <<-NOTE - **NOTE:** This service has been marked for deprecation: https://developer.github.com/changes/2018-04-25-github-services-deprecation/ + **NOTE:** GitHub Services has been marked for deprecation: https://developer.github.com/changes/2018-04-25-github-services-deprecation/ - Functionality will be removed from GitHub.com on January 31st, 2019. + We will provide an alternative path for the email notifications by January 31st, 2019. NOTE end From 22f68bab1618b81a7ae45fab93e6dd32e998aeef Mon Sep 17 00:00:00 2001 From: Jane Sternbach Date: Wed, 30 Jan 2019 23:16:06 -0500 Subject: [PATCH 46/46] update readme with deprecation notice --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3b3ae6498..e6e708a00 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,13 @@ + +🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨 + +**_GitHub Services has been deprecated_. No more contributions will be accepted. Please see our [blog post](https://developer.github.com/changes/2018-04-25-github-services-deprecation/) for more information.** + +🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨 + GitHub Services =============== -**NOTE:** GitHub Services has been [marked for deprecation](https://developer.github.com/changes/2018-04-25-github-services-deprecation/). Functionality will be removed from GitHub.com on January 31st, 2019. - This repository contains code to integrate GitHub.com with third party services. See the [Contributing Guidelines](https://github.com/github/github-services/blob/master/.github/CONTRIBUTING.md) for instructions on contributing a service.