txgh-server 1.0.0.beta1

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.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/lib/txgh-server/application.rb +141 -0
  3. data/lib/txgh-server/download_handler.rb +85 -0
  4. data/lib/txgh-server/github_request_auth.rb +28 -0
  5. data/lib/txgh-server/response.rb +15 -0
  6. data/lib/txgh-server/response_helpers.rb +26 -0
  7. data/lib/txgh-server/stream_response.rb +37 -0
  8. data/lib/txgh-server/tgz_stream_response.rb +39 -0
  9. data/lib/txgh-server/transifex_request_auth.rb +53 -0
  10. data/lib/txgh-server/triggers/handler.rb +50 -0
  11. data/lib/txgh-server/triggers/pull_handler.rb +18 -0
  12. data/lib/txgh-server/triggers/push_handler.rb +18 -0
  13. data/lib/txgh-server/triggers.rb +7 -0
  14. data/lib/txgh-server/version.rb +3 -0
  15. data/lib/txgh-server/webhooks/github/delete_handler.rb +37 -0
  16. data/lib/txgh-server/webhooks/github/handler.rb +20 -0
  17. data/lib/txgh-server/webhooks/github/ping_handler.rb +18 -0
  18. data/lib/txgh-server/webhooks/github/push_handler.rb +124 -0
  19. data/lib/txgh-server/webhooks/github/request_handler.rb +113 -0
  20. data/lib/txgh-server/webhooks/github.rb +11 -0
  21. data/lib/txgh-server/webhooks/transifex/hook_handler.rb +94 -0
  22. data/lib/txgh-server/webhooks/transifex/request_handler.rb +78 -0
  23. data/lib/txgh-server/webhooks/transifex.rb +8 -0
  24. data/lib/txgh-server/webhooks.rb +6 -0
  25. data/lib/txgh-server/zip_stream_response.rb +19 -0
  26. data/lib/txgh-server.rb +23 -0
  27. data/spec/application_spec.rb +347 -0
  28. data/spec/download_handler_spec.rb +91 -0
  29. data/spec/github_request_auth_spec.rb +39 -0
  30. data/spec/helpers/github_payload_builder.rb +141 -0
  31. data/spec/helpers/integration_setup.rb +47 -0
  32. data/spec/integration/cassettes/github_l10n_hook_endpoint.yml +536 -0
  33. data/spec/integration/cassettes/pull.yml +47 -0
  34. data/spec/integration/cassettes/push.yml +544 -0
  35. data/spec/integration/cassettes/transifex_hook_endpoint.yml +221 -0
  36. data/spec/integration/config/tx.config +10 -0
  37. data/spec/integration/hooks_spec.rb +159 -0
  38. data/spec/integration/payloads/github_postbody.json +161 -0
  39. data/spec/integration/payloads/github_postbody_l10n.json +136 -0
  40. data/spec/integration/payloads/github_postbody_release.json +136 -0
  41. data/spec/integration/triggers_spec.rb +45 -0
  42. data/spec/spec_helper.rb +26 -0
  43. data/spec/tgz_stream_response_spec.rb +59 -0
  44. data/spec/transifex_request_auth_spec.rb +39 -0
  45. data/spec/webhooks/github/delete_handler_spec.rb +38 -0
  46. data/spec/webhooks/github/ping_handler_spec.rb +16 -0
  47. data/spec/webhooks/github/push_handler_spec.rb +106 -0
  48. data/spec/webhooks/transifex/hook_handler_spec.rb +136 -0
  49. data/spec/zip_stream_response_spec.rb +58 -0
  50. data/txgh-server.gemspec +24 -0
  51. metadata +170 -0
@@ -0,0 +1,136 @@
1
+ require 'spec_helper'
2
+ require 'helpers/nil_logger'
3
+ require 'helpers/standard_txgh_setup'
4
+
5
+ include TxghServer
6
+ include TxghServer::Webhooks::Transifex
7
+
8
+ describe HookHandler do
9
+ include StandardTxghSetup
10
+
11
+ let(:requested_resource_slug) do
12
+ resource_slug
13
+ end
14
+
15
+ let(:handler) do
16
+ HookHandler.new(
17
+ project: transifex_project,
18
+ repo: github_repo,
19
+ resource_slug: requested_resource_slug,
20
+ language: language,
21
+ logger: logger
22
+ )
23
+ end
24
+
25
+ let(:downloader) do
26
+ instance_double(Txgh::ResourceDownloader)
27
+ end
28
+
29
+ let(:file_name) do
30
+ "translations/#{language}/sample.yml"
31
+ end
32
+
33
+ before(:each) do
34
+ allow(Txgh::ResourceDownloader).to receive(:new).and_return(downloader)
35
+ allow(downloader).to(receive(:first)).and_return([
36
+ "translations/#{language}/sample.yml", translations
37
+ ])
38
+
39
+ allow(github_api).to receive(:get_ref).and_return(
40
+ object: { sha: '123abcshashasha' }
41
+ )
42
+ end
43
+
44
+ it 'downloads translations and pushes them to the correct branch (head)' do
45
+ expect(github_api).to(
46
+ receive(:update_contents).with(
47
+ repo_name, "heads/#{branch}",
48
+ { "translations/#{language}/sample.yml" => translations },
49
+ "Updating #{language} translations in #{file_name}"
50
+ )
51
+ )
52
+
53
+ response = handler.execute
54
+ expect(response.status).to eq(200)
55
+ expect(response.body).to eq(true)
56
+ end
57
+
58
+ it "responds with an error if the config can't be found" do
59
+ expect(handler).to receive(:tx_config).and_return(nil)
60
+ response = handler.execute
61
+ expect(response.status).to eq(404)
62
+ expect(response.body).to eq([
63
+ { error: "Could not find configuration for branch 'heads/#{branch}'" }
64
+ ])
65
+ end
66
+
67
+ context 'with a non-existent resource' do
68
+ let(:requested_resource_slug) { 'foobarbazboo' }
69
+
70
+ it "responds with an error if the resource can't be found" do
71
+ response = handler.execute
72
+ expect(response.status).to eq(404)
73
+ expect(response.body).to eq(
74
+ [{ error: "Could not find resource '#{requested_resource_slug}' in config" }]
75
+ )
76
+ end
77
+ end
78
+
79
+ context 'when asked to process all branches' do
80
+ let(:branch) { 'all' }
81
+ let(:ref) { 'heads/my_branch' }
82
+
83
+ let(:requested_resource_slug) do
84
+ 'my_resource-heads_my_branch'
85
+ end
86
+
87
+ it 'pushes to the individual branch' do
88
+ expect(transifex_api).to receive(:get_resource) do
89
+ { 'categories' => ["branch:#{ref}"] }
90
+ end
91
+
92
+ expect(github_api).to(
93
+ receive(:update_contents).with(
94
+ repo_name, ref,
95
+ { "translations/#{language}/sample.yml" => translations },
96
+ "Updating #{language} translations in #{file_name}"
97
+ )
98
+ )
99
+
100
+ response = handler.execute
101
+ expect(response.status).to eq(200)
102
+ expect(response.body).to eq(true)
103
+ end
104
+ end
105
+
106
+ context 'with a tag instead of a branch' do
107
+ let(:branch) { 'tags/my_tag' }
108
+
109
+ it 'downloads translations and pushes them to the tag' do
110
+ expect(github_api).to(
111
+ receive(:update_contents).with(
112
+ repo_name, "tags/my_tag",
113
+ { "translations/#{language}/sample.yml" => translations },
114
+ "Updating #{language} translations in #{file_name}"
115
+ )
116
+ )
117
+
118
+ response = handler.execute
119
+ expect(response.status).to eq(200)
120
+ expect(response.body).to eq(true)
121
+ end
122
+ end
123
+
124
+ context 'with an unsupported language' do
125
+ let(:language) { 'pt' }
126
+ let(:supported_languages) { ['ja'] }
127
+
128
+ it "doesn't make a commit" do
129
+ expect(github_api).to_not receive(:update_contents)
130
+
131
+ response = handler.execute
132
+ expect(response.status).to eq(304)
133
+ expect(response.body).to eq(true)
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+ require 'tempfile'
3
+
4
+ include TxghServer
5
+
6
+ describe ZipStreamResponse do
7
+ def read_zip_from(file)
8
+ contents = {}
9
+
10
+ Zip::File.open(file) do |zipfile|
11
+ zipfile.each do |entry|
12
+ contents[entry.name] = entry.get_input_stream.read
13
+ end
14
+ end
15
+
16
+ contents
17
+ end
18
+
19
+ let(:attachment) { 'abc123' }
20
+
21
+ let(:enum) do
22
+ {
23
+ 'first_file.yml' => "first\nfile\ncontents\n",
24
+ 'second_file.yml' => "wowowow\nanother file!\n"
25
+ }
26
+ end
27
+
28
+ let(:response) do
29
+ ZipStreamResponse.new(attachment, enum)
30
+ end
31
+
32
+ describe '#write_to' do
33
+ it 'writes a zip file with the correct entries to the stream' do
34
+ # this does NOT WORK with a StringIO - zip contents MUST be written to a file
35
+ io = Tempfile.new('testzip')
36
+ response.write_to(io)
37
+ contents = read_zip_from(io.path)
38
+ expect(contents).to eq(enum)
39
+ io.close
40
+ io.unlink
41
+ end
42
+ end
43
+
44
+ describe '#headers' do
45
+ it 'includes the correct content type and disposition headers' do
46
+ expect(response.headers).to eq({
47
+ 'Content-Disposition' => "attachment; filename=\"#{attachment}.zip\"",
48
+ 'Content-Type' => 'application/zip'
49
+ })
50
+ end
51
+ end
52
+
53
+ describe '#streaming?' do
54
+ it 'returns true' do
55
+ expect(response).to be_streaming
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,24 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), 'lib')
2
+ require 'txgh-server/version'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = 'txgh-server'
6
+ s.version = ::TxghServer::VERSION
7
+ s.authors = ['Matthew Jackowski', 'Cameron Dutro']
8
+ s.email = ['mattjjacko@gmail.com', 'camertron@gmail.com']
9
+ s.homepage = 'https://github.com/lumoslabs/txgh-server'
10
+
11
+ s.description = s.summary = 'An HTTP server for interacting with txgh.'
12
+
13
+ s.platform = Gem::Platform::RUBY
14
+ s.has_rdoc = true
15
+
16
+ s.add_dependency 'mime-types', '~> 2.0'
17
+ s.add_dependency 'sinatra', '~> 1.4'
18
+ s.add_dependency 'sinatra-contrib', '~> 1.4'
19
+ s.add_dependency 'rubyzip', '>= 1.0', '<= 1.1.2'
20
+ s.add_dependency 'txgh', '~> 5.0'
21
+
22
+ s.require_path = 'lib'
23
+ s.files = Dir['{lib,spec}/**/*', 'README.md', 'txgh-server.gemspec', 'LICENSE']
24
+ end
metadata ADDED
@@ -0,0 +1,170 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: txgh-server
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.beta1
5
+ platform: ruby
6
+ authors:
7
+ - Matthew Jackowski
8
+ - Cameron Dutro
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2016-08-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: mime-types
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '2.0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '2.0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: sinatra
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.4'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.4'
42
+ - !ruby/object:Gem::Dependency
43
+ name: sinatra-contrib
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '1.4'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '1.4'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rubyzip
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '1.0'
63
+ - - "<="
64
+ - !ruby/object:Gem::Version
65
+ version: 1.1.2
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: '1.0'
73
+ - - "<="
74
+ - !ruby/object:Gem::Version
75
+ version: 1.1.2
76
+ - !ruby/object:Gem::Dependency
77
+ name: txgh
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '5.0'
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '5.0'
90
+ description: An HTTP server for interacting with txgh.
91
+ email:
92
+ - mattjjacko@gmail.com
93
+ - camertron@gmail.com
94
+ executables: []
95
+ extensions: []
96
+ extra_rdoc_files: []
97
+ files:
98
+ - lib/txgh-server.rb
99
+ - lib/txgh-server/application.rb
100
+ - lib/txgh-server/download_handler.rb
101
+ - lib/txgh-server/github_request_auth.rb
102
+ - lib/txgh-server/response.rb
103
+ - lib/txgh-server/response_helpers.rb
104
+ - lib/txgh-server/stream_response.rb
105
+ - lib/txgh-server/tgz_stream_response.rb
106
+ - lib/txgh-server/transifex_request_auth.rb
107
+ - lib/txgh-server/triggers.rb
108
+ - lib/txgh-server/triggers/handler.rb
109
+ - lib/txgh-server/triggers/pull_handler.rb
110
+ - lib/txgh-server/triggers/push_handler.rb
111
+ - lib/txgh-server/version.rb
112
+ - lib/txgh-server/webhooks.rb
113
+ - lib/txgh-server/webhooks/github.rb
114
+ - lib/txgh-server/webhooks/github/delete_handler.rb
115
+ - lib/txgh-server/webhooks/github/handler.rb
116
+ - lib/txgh-server/webhooks/github/ping_handler.rb
117
+ - lib/txgh-server/webhooks/github/push_handler.rb
118
+ - lib/txgh-server/webhooks/github/request_handler.rb
119
+ - lib/txgh-server/webhooks/transifex.rb
120
+ - lib/txgh-server/webhooks/transifex/hook_handler.rb
121
+ - lib/txgh-server/webhooks/transifex/request_handler.rb
122
+ - lib/txgh-server/zip_stream_response.rb
123
+ - spec/application_spec.rb
124
+ - spec/download_handler_spec.rb
125
+ - spec/github_request_auth_spec.rb
126
+ - spec/helpers/github_payload_builder.rb
127
+ - spec/helpers/integration_setup.rb
128
+ - spec/integration/cassettes/github_l10n_hook_endpoint.yml
129
+ - spec/integration/cassettes/pull.yml
130
+ - spec/integration/cassettes/push.yml
131
+ - spec/integration/cassettes/transifex_hook_endpoint.yml
132
+ - spec/integration/config/tx.config
133
+ - spec/integration/hooks_spec.rb
134
+ - spec/integration/payloads/github_postbody.json
135
+ - spec/integration/payloads/github_postbody_l10n.json
136
+ - spec/integration/payloads/github_postbody_release.json
137
+ - spec/integration/triggers_spec.rb
138
+ - spec/spec_helper.rb
139
+ - spec/tgz_stream_response_spec.rb
140
+ - spec/transifex_request_auth_spec.rb
141
+ - spec/webhooks/github/delete_handler_spec.rb
142
+ - spec/webhooks/github/ping_handler_spec.rb
143
+ - spec/webhooks/github/push_handler_spec.rb
144
+ - spec/webhooks/transifex/hook_handler_spec.rb
145
+ - spec/zip_stream_response_spec.rb
146
+ - txgh-server.gemspec
147
+ homepage: https://github.com/lumoslabs/txgh-server
148
+ licenses: []
149
+ metadata: {}
150
+ post_install_message:
151
+ rdoc_options: []
152
+ require_paths:
153
+ - lib
154
+ required_ruby_version: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ required_rubygems_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">"
162
+ - !ruby/object:Gem::Version
163
+ version: 1.3.1
164
+ requirements: []
165
+ rubyforge_project:
166
+ rubygems_version: 2.2.3
167
+ signing_key:
168
+ specification_version: 4
169
+ summary: An HTTP server for interacting with txgh.
170
+ test_files: []