txgh-server 2.1.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/txgh-server/application.rb +0 -17
- data/lib/txgh-server/version.rb +1 -1
- data/lib/txgh-server/webhooks/github/blank_attributes.rb +20 -0
- data/lib/txgh-server/webhooks/github/request_handler.rb +20 -23
- data/lib/txgh-server/webhooks/github.rb +1 -0
- data/lib/txgh-server/webhooks/transifex/request_handler.rb +10 -9
- data/lib/txgh-server.rb +0 -8
- data/spec/helpers/test_request.rb +10 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/webhooks/github/request_handler_spec.rb +75 -0
- data/spec/webhooks/transifex/request_handler_spec.rb +35 -0
- metadata +6 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0ed650a35c78fd2a4a616a5e106aceea35eae654
|
|
4
|
+
data.tar.gz: a8df5a3a0ab04c9e30c86444dd06c49bf5127768
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ece1db6aa35c8d561d6e8c1f8335190e23e0dc97d32ed90d4f1a83e38fdeaceef90bf86ceb46aab83c6ab13d760b999e726362df45a6a4568f619b4f5a59b403
|
|
7
|
+
data.tar.gz: f9bdf5680ac0306ffa52564e7b8d31733d7e60e7bac5ae250086520ab3266e4e22325bb230bf0c42b7bd063d451fd6c9806dd1f824b30b5e66175a1a691e2b61
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
require 'sinatra'
|
|
2
2
|
require 'sinatra/json'
|
|
3
|
-
require 'sinatra/reloader'
|
|
4
3
|
require 'sinatra/streaming'
|
|
5
4
|
|
|
6
5
|
module TxghServer
|
|
@@ -37,10 +36,6 @@ module TxghServer
|
|
|
37
36
|
set :logger, logger
|
|
38
37
|
end
|
|
39
38
|
|
|
40
|
-
def initialize(app = nil)
|
|
41
|
-
super(app)
|
|
42
|
-
end
|
|
43
|
-
|
|
44
39
|
get '/health_check' do
|
|
45
40
|
respond_with(
|
|
46
41
|
Response.new(200, {})
|
|
@@ -89,14 +84,6 @@ module TxghServer
|
|
|
89
84
|
set :logger, logger
|
|
90
85
|
end
|
|
91
86
|
|
|
92
|
-
configure :development do
|
|
93
|
-
register Sinatra::Reloader
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def initialize(app = nil)
|
|
97
|
-
super(app)
|
|
98
|
-
end
|
|
99
|
-
|
|
100
87
|
post '/transifex' do
|
|
101
88
|
respond_with(
|
|
102
89
|
Transifex::RequestHandler.handle_request(request, settings.logger)
|
|
@@ -121,10 +108,6 @@ module TxghServer
|
|
|
121
108
|
set :logger, logger
|
|
122
109
|
end
|
|
123
110
|
|
|
124
|
-
configure :development do
|
|
125
|
-
register Sinatra::Reloader
|
|
126
|
-
end
|
|
127
|
-
|
|
128
111
|
patch '/push' do
|
|
129
112
|
respond_with(
|
|
130
113
|
PushHandler.handle_request(request, settings.logger)
|
data/lib/txgh-server/version.rb
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module TxghServer
|
|
2
|
+
module Webhooks
|
|
3
|
+
module Github
|
|
4
|
+
class BlankAttributes
|
|
5
|
+
class << self
|
|
6
|
+
def from_webhook_payload(payload)
|
|
7
|
+
new
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def initialize(options = {})
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def to_h
|
|
15
|
+
{}
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -21,21 +21,32 @@ module TxghServer
|
|
|
21
21
|
|
|
22
22
|
def handle_request
|
|
23
23
|
handle_safely do
|
|
24
|
-
case
|
|
24
|
+
case github_event
|
|
25
25
|
when 'push'
|
|
26
|
-
|
|
26
|
+
PushHandler.new(project, repo, logger, attributes).execute
|
|
27
27
|
when 'delete'
|
|
28
|
-
|
|
28
|
+
DeleteHandler.new(project, repo, logger, attributes).execute
|
|
29
29
|
when 'ping'
|
|
30
|
-
|
|
30
|
+
PingHandler.new(logger).execute
|
|
31
31
|
else
|
|
32
|
-
|
|
32
|
+
respond_with_error(400, 'Unexpected event type')
|
|
33
33
|
end
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
private
|
|
38
38
|
|
|
39
|
+
def attributes
|
|
40
|
+
case github_event
|
|
41
|
+
when 'push'
|
|
42
|
+
PushAttributes.from_webhook_payload(payload)
|
|
43
|
+
when 'delete'
|
|
44
|
+
DeleteAttributes.from_webhook_payload(payload)
|
|
45
|
+
else
|
|
46
|
+
BlankAttributes.from_webhook_payload(payload)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
39
50
|
def handle_safely
|
|
40
51
|
if authentic_request?
|
|
41
52
|
yield
|
|
@@ -46,24 +57,6 @@ module TxghServer
|
|
|
46
57
|
respond_with_error(500, "Internal server error: #{e.message}", e)
|
|
47
58
|
end
|
|
48
59
|
|
|
49
|
-
def handle_push
|
|
50
|
-
attributes = PushAttributes.from_webhook_payload(payload)
|
|
51
|
-
PushHandler.new(project, repo, logger, attributes).execute
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def handle_delete
|
|
55
|
-
attributes = DeleteAttributes.from_webhook_payload(payload)
|
|
56
|
-
DeleteHandler.new(project, repo, logger, attributes).execute
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def handle_ping
|
|
60
|
-
PingHandler.new(logger).execute
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def handle_unexpected
|
|
64
|
-
respond_with_error(400, 'Unexpected event type')
|
|
65
|
-
end
|
|
66
|
-
|
|
67
60
|
def payload
|
|
68
61
|
@payload ||= begin
|
|
69
62
|
if request.params[:payload]
|
|
@@ -76,6 +69,10 @@ module TxghServer
|
|
|
76
69
|
end
|
|
77
70
|
end
|
|
78
71
|
|
|
72
|
+
def github_event
|
|
73
|
+
request.env['HTTP_X_GITHUB_EVENT']
|
|
74
|
+
end
|
|
75
|
+
|
|
79
76
|
def github_repo_name
|
|
80
77
|
payload.fetch('repository', {})['full_name']
|
|
81
78
|
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
module TxghServer
|
|
2
2
|
module Webhooks
|
|
3
3
|
module Github
|
|
4
|
+
autoload :BlankAttributes, 'txgh-server/webhooks/github/blank_attributes'
|
|
4
5
|
autoload :DeleteAttributes, 'txgh-server/webhooks/github/delete_attributes'
|
|
5
6
|
autoload :DeleteHandler, 'txgh-server/webhooks/github/delete_handler'
|
|
6
7
|
autoload :Handler, 'txgh-server/webhooks/github/handler'
|
|
@@ -5,11 +5,9 @@ module TxghServer
|
|
|
5
5
|
module Transifex
|
|
6
6
|
class RequestHandler
|
|
7
7
|
class << self
|
|
8
|
-
|
|
9
8
|
def handle_request(request, logger)
|
|
10
|
-
new(request, logger).
|
|
9
|
+
new(request, logger).handle_request
|
|
11
10
|
end
|
|
12
|
-
|
|
13
11
|
end
|
|
14
12
|
|
|
15
13
|
include ResponseHelpers
|
|
@@ -21,13 +19,13 @@ module TxghServer
|
|
|
21
19
|
@logger = logger
|
|
22
20
|
end
|
|
23
21
|
|
|
24
|
-
def
|
|
22
|
+
def handle_request
|
|
25
23
|
handle_safely do
|
|
26
|
-
handler =
|
|
24
|
+
handler = TxghServer::Webhooks::Transifex::HookHandler.new(
|
|
27
25
|
project: config.transifex_project,
|
|
28
26
|
repo: config.github_repo,
|
|
29
|
-
resource_slug: payload[
|
|
30
|
-
language: payload[
|
|
27
|
+
resource_slug: payload[:resource],
|
|
28
|
+
language: payload[:language],
|
|
31
29
|
logger: logger
|
|
32
30
|
)
|
|
33
31
|
|
|
@@ -62,13 +60,16 @@ module TxghServer
|
|
|
62
60
|
end
|
|
63
61
|
|
|
64
62
|
def config
|
|
65
|
-
@config ||= Txgh::Config::KeyManager.config_from_project(payload[
|
|
63
|
+
@config ||= Txgh::Config::KeyManager.config_from_project(payload[:project])
|
|
66
64
|
end
|
|
67
65
|
|
|
68
66
|
def payload
|
|
69
67
|
@payload ||= begin
|
|
70
68
|
request.body.rewind
|
|
71
|
-
|
|
69
|
+
|
|
70
|
+
Txgh::Utils.deep_symbolize_keys(
|
|
71
|
+
Hash[URI.decode_www_form(request.body.read)]
|
|
72
|
+
)
|
|
72
73
|
end
|
|
73
74
|
end
|
|
74
75
|
|
data/lib/txgh-server.rb
CHANGED
|
@@ -3,20 +3,12 @@ require 'txgh'
|
|
|
3
3
|
module TxghServer
|
|
4
4
|
autoload :Application, 'txgh-server/application'
|
|
5
5
|
autoload :DownloadHandler, 'txgh-server/download_handler'
|
|
6
|
-
|
|
7
|
-
# @TODO: refactor/remove
|
|
8
|
-
autoload :WebhookEndpoints, 'txgh-server/application'
|
|
9
|
-
|
|
10
6
|
autoload :GithubRequestAuth, 'txgh-server/github_request_auth'
|
|
11
7
|
autoload :Response, 'txgh-server/response'
|
|
12
8
|
autoload :ResponseHelpers, 'txgh-server/response_helpers'
|
|
13
9
|
autoload :StreamResponse, 'txgh-server/stream_response'
|
|
14
10
|
autoload :TgzStreamResponse, 'txgh-server/tgz_stream_response'
|
|
15
11
|
autoload :TransifexRequestAuth, 'txgh-server/transifex_request_auth'
|
|
16
|
-
|
|
17
|
-
# @TODO: refactor/remove
|
|
18
|
-
autoload :TriggerEndpoints, 'txgh-server/application'
|
|
19
|
-
|
|
20
12
|
autoload :Triggers, 'txgh-server/triggers'
|
|
21
13
|
autoload :Webhooks, 'txgh-server/webhooks'
|
|
22
14
|
autoload :ZipStreamResponse, 'txgh-server/zip_stream_response'
|
data/spec/spec_helper.rb
CHANGED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'helpers/github_payload_builder'
|
|
3
|
+
require 'helpers/nil_logger'
|
|
4
|
+
require 'helpers/standard_txgh_setup'
|
|
5
|
+
require 'helpers/test_request'
|
|
6
|
+
|
|
7
|
+
include TxghServer::Webhooks
|
|
8
|
+
|
|
9
|
+
describe Github::RequestHandler do
|
|
10
|
+
include StandardTxghSetup
|
|
11
|
+
|
|
12
|
+
let(:logger) { NilLogger.new }
|
|
13
|
+
let(:ref) { 'heads/my_ref' }
|
|
14
|
+
let(:headers) { { 'HTTP_X_GITHUB_EVENT' => event } }
|
|
15
|
+
let(:body) { payload.to_json }
|
|
16
|
+
let(:request) { TestRequest.new(body: body, headers: headers) }
|
|
17
|
+
let(:handler) { described_class.new(request, logger) }
|
|
18
|
+
|
|
19
|
+
describe '#handle_request' do
|
|
20
|
+
context 'push event' do
|
|
21
|
+
let(:event) { 'push' }
|
|
22
|
+
let(:payload) { GithubPayloadBuilder.push_payload(repo_name, ref).tap { |p| p.add_commit } }
|
|
23
|
+
|
|
24
|
+
it 'does not execute if unauthorized' do
|
|
25
|
+
expect_any_instance_of(Github::PushHandler).to_not receive(:execute)
|
|
26
|
+
response = handler.handle_request
|
|
27
|
+
expect(response.status).to eq(401)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context 'with an authentic request' do
|
|
31
|
+
before(:each) do
|
|
32
|
+
allow(handler).to receive(:authentic_request?).and_return(true)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it 'handles the request with the push handler' do
|
|
36
|
+
expect_any_instance_of(Github::PushHandler).to receive(:execute).and_return(:response)
|
|
37
|
+
expect(handler.handle_request).to eq(:response)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
context 'delete event' do
|
|
43
|
+
let(:event) { 'delete' }
|
|
44
|
+
let(:payload) { GithubPayloadBuilder.delete_payload(repo_name, ref) }
|
|
45
|
+
|
|
46
|
+
it 'does not execute if unauthorized' do
|
|
47
|
+
expect_any_instance_of(Github::DeleteHandler).to_not receive(:execute)
|
|
48
|
+
response = handler.handle_request
|
|
49
|
+
expect(response.status).to eq(401)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
context 'with an authentic request' do
|
|
53
|
+
before(:each) do
|
|
54
|
+
allow(handler).to receive(:authentic_request?).and_return(true)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it 'handles the request with the delete handler' do
|
|
58
|
+
expect_any_instance_of(Github::DeleteHandler).to receive(:execute).and_return(:response)
|
|
59
|
+
expect(handler.handle_request).to eq(:response)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
context 'unrecognized event' do
|
|
65
|
+
let(:event) { 'foo' }
|
|
66
|
+
let(:payload) { { repository: { full_name: repo_name } } }
|
|
67
|
+
|
|
68
|
+
it 'responds with a 400' do
|
|
69
|
+
allow(handler).to receive(:authentic_request?).and_return(true)
|
|
70
|
+
response = handler.handle_request
|
|
71
|
+
expect(response.status).to eq(400)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'helpers/nil_logger'
|
|
3
|
+
require 'helpers/standard_txgh_setup'
|
|
4
|
+
require 'helpers/test_request'
|
|
5
|
+
|
|
6
|
+
include TxghServer::Webhooks
|
|
7
|
+
|
|
8
|
+
describe Transifex::RequestHandler do
|
|
9
|
+
include StandardTxghSetup
|
|
10
|
+
|
|
11
|
+
let(:logger) { NilLogger.new }
|
|
12
|
+
let(:body) { URI.encode_www_form(payload.to_a) }
|
|
13
|
+
let(:request) { TestRequest.new(body: body) }
|
|
14
|
+
let(:handler) { described_class.new(request, logger) }
|
|
15
|
+
let(:payload) { { 'project' => project_name, 'resource' => resource_slug, 'language' => 'pt' } }
|
|
16
|
+
|
|
17
|
+
describe '#handle_request' do
|
|
18
|
+
it 'does not execute if unauthorized' do
|
|
19
|
+
expect_any_instance_of(Transifex::HookHandler).to_not receive(:execute)
|
|
20
|
+
response = handler.handle_request
|
|
21
|
+
expect(response.status).to eq(401)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
context 'with an authentic request' do
|
|
25
|
+
before(:each) do
|
|
26
|
+
allow(handler).to receive(:authentic_request?).and_return(true)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'handles the request with the hook handler' do
|
|
30
|
+
expect_any_instance_of(Transifex::HookHandler).to receive(:execute).and_return(:response)
|
|
31
|
+
expect(handler.handle_request).to eq(:response)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: txgh-server
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Matthew Jackowski
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2016-10-
|
|
12
|
+
date: 2016-10-14 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: mime-types
|
|
@@ -112,6 +112,7 @@ files:
|
|
|
112
112
|
- lib/txgh-server/version.rb
|
|
113
113
|
- lib/txgh-server/webhooks.rb
|
|
114
114
|
- lib/txgh-server/webhooks/github.rb
|
|
115
|
+
- lib/txgh-server/webhooks/github/blank_attributes.rb
|
|
115
116
|
- lib/txgh-server/webhooks/github/delete_attributes.rb
|
|
116
117
|
- lib/txgh-server/webhooks/github/delete_handler.rb
|
|
117
118
|
- lib/txgh-server/webhooks/github/ping_handler.rb
|
|
@@ -127,6 +128,7 @@ files:
|
|
|
127
128
|
- spec/github_request_auth_spec.rb
|
|
128
129
|
- spec/helpers/github_payload_builder.rb
|
|
129
130
|
- spec/helpers/integration_setup.rb
|
|
131
|
+
- spec/helpers/test_request.rb
|
|
130
132
|
- spec/integration/cassettes/pull.yml
|
|
131
133
|
- spec/integration/cassettes/push.yml
|
|
132
134
|
- spec/integration/cassettes/transifex_hook_endpoint.yml
|
|
@@ -144,7 +146,9 @@ files:
|
|
|
144
146
|
- spec/webhooks/github/ping_handler_spec.rb
|
|
145
147
|
- spec/webhooks/github/push_attributes_spec.rb
|
|
146
148
|
- spec/webhooks/github/push_handler_spec.rb
|
|
149
|
+
- spec/webhooks/github/request_handler_spec.rb
|
|
147
150
|
- spec/webhooks/transifex/hook_handler_spec.rb
|
|
151
|
+
- spec/webhooks/transifex/request_handler_spec.rb
|
|
148
152
|
- spec/zip_stream_response_spec.rb
|
|
149
153
|
- txgh-server.gemspec
|
|
150
154
|
homepage: https://github.com/lumoslabs/txgh
|