fourchette 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eb220257050dab90239666b5b564eb4fc8654709
4
- data.tar.gz: 72f3e73d160475e282b84f8e1fa28b5521f9d8c6
3
+ metadata.gz: e3d2dcc715d8a2c65fe34a0248a6089bcfb5762a
4
+ data.tar.gz: 74456ce01a2cff7e4939f04efc7b0c49891597a1
5
5
  SHA512:
6
- metadata.gz: c5df94511416b3f0357b151fadb2f18063a0f0eb6eabc9c493d1eda6db62f34cbb4aa3fa7a6ac6cc6f24827828798b40d04f96d4cfb39a149bc0256f53d0673a
7
- data.tar.gz: f152cd6b5390905874ef495bb3bc776f1d6dc681eefcc171a4e19daf0e75f44dc0022e6d1cefc6415616aa565066c11f1b2ec20b82a09490bb294f526c9f7a9f
6
+ metadata.gz: b8055c8a81b2dc7253139b50b42e5fbd7188c137246ff73a44a4e0ce9a15ea9539a12dacab07f7893f56d389a7bac072aa18688f7f51357617aac2971118e4e4
7
+ data.tar.gz: 69ba6c5cc5d1e26972a865ef438168e154f879cc9e419405d760c0c881a0e58897f98adf5a8d026cf1281776c9c4b78a54162b3f87c01330f545cac63234acb9
@@ -0,0 +1,5 @@
1
+ guard :rspec do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
@@ -31,5 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency 'foreman'
32
32
  spec.add_development_dependency 'pry-debugger'
33
33
  spec.add_development_dependency 'rspec', '~> 2.14.1'
34
+ spec.add_development_dependency 'guard-rspec'
35
+ spec.add_development_dependency 'terminal-notifier-guard'
34
36
  spec.add_development_dependency 'coveralls'
35
37
  end
@@ -40,4 +40,5 @@ require_relative 'fourchette/pull_request'
40
40
  require_relative 'fourchette/fork'
41
41
  require_relative 'fourchette/heroku'
42
42
  require_relative 'fourchette/pgbackups'
43
- require_relative 'fourchette/callbacks'
43
+ require_relative 'fourchette/callbacks'
44
+ require_relative 'fourchette/tarball'
@@ -9,10 +9,11 @@ class Fourchette::Fork
9
9
 
10
10
  def update
11
11
  create_unless_exists
12
-
12
+ tarball = Fourchette::Tarball.new
13
+ tarball_url = tarball.url(github_git_url, git_branch_name, ENV['FOURCHETTE_GITHUB_PROJECT'])
13
14
  options = {
14
15
  source_blob: {
15
- url: "https://github.com/#{ENV['FOURCHETTE_GITHUB_PROJECT']}/archive/#{branch_name}.tar.gz?token=#{ENV['FOURCHETTE_GITHUB_PERSONAL_TOKEN']}"
16
+ url: tarball_url
16
17
  }
17
18
  }
18
19
 
@@ -21,12 +22,15 @@ class Fourchette::Fork
21
22
  end
22
23
 
23
24
  def monitor_build build
25
+ logger.info "Start of the build process on Heroku..."
24
26
  build_info = @heroku.client.build.info(fork_name, build['id'])
25
- while build_info['status'] == 'pending'
26
- build_info = @heroku.client.build.info(fork_name, build['id'])
27
- sleep 5
27
+ # Let's just leave some time to Heroku to download the tarball and start
28
+ # the process. This is some random timing that seems to make sense at first.
29
+ sleep 30
30
+ if build_info['status'] == 'failed'
31
+ @github.comment_pr(pr_number, "The build failed on Herok. See the activity tab on Heroku.")
32
+ fail Fourchette::DeployException
28
33
  end
29
- fail Fourchette::DeployException if build_info['status'] == 'failed'
30
34
  end
31
35
 
32
36
  def create
@@ -62,4 +66,12 @@ class Fourchette::Fork
62
66
  @github.comment_pr(pr_number, "Test URL: #{@heroku.client.app.info(fork_name)['web_url']}")
63
67
  end
64
68
  end
69
+
70
+ def git_branch_name
71
+ "remotes/origin/#{branch_name}"
72
+ end
73
+
74
+ def github_git_url
75
+ @params['pull_request']['head']['repo']['clone_url'].gsub("//github.com", "//#{ENV['FOURCHETTE_GITHUB_USERNAME']}:#{ENV['FOURCHETTE_GITHUB_PERSONAL_TOKEN']}@github.com")
76
+ end
65
77
  end
@@ -0,0 +1,43 @@
1
+ require 'securerandom'
2
+ class Fourchette::Tarball
3
+ include Fourchette::Logger
4
+
5
+ def url(github_git_url, branch_name, github_repo)
6
+ filepath = prepare_tarball(github_git_url, branch_name)
7
+ tarball_to_url(filepath, github_repo)
8
+ end
9
+
10
+ def filepath(uuid, expiration)
11
+ "tmp/#{uuid}/#{expiration}.tar.gz"
12
+ end
13
+
14
+ private
15
+ def prepare_tarball(github_git_url, branch_name)
16
+ clone_path = "tmp/#{SecureRandom.uuid}"
17
+ clone(github_git_url, branch_name, clone_path)
18
+ tar(clone_path)
19
+ end
20
+
21
+ def clone(github_git_url,branch_name, clone_path)
22
+ logger.info "Cloning repository..."
23
+ repo = Git.clone(github_git_url, clone_path, recursive: true)
24
+ repo.checkout(branch_name)
25
+ end
26
+
27
+ def tar(path)
28
+ logger.info "Preparing tarball..."
29
+ filepath = "#{path}/#{expiration_timestamp}.tar.gz"
30
+ system("tar -zcvf #{filepath} -C #{path} .")
31
+ filepath
32
+ end
33
+
34
+ def expiration_timestamp
35
+ Time.now.to_i + 300
36
+ end
37
+
38
+ def tarball_to_url(filepath, github_repo)
39
+ logger.info "Tarball to URL as a service in progress..."
40
+ cleaned_path = filepath.gsub('tmp/', '').gsub('.tar.gz', '')
41
+ "#{ENV['FOURCHETTE_APP_URL']}/#{github_repo}/#{cleaned_path}"
42
+ end
43
+ end
@@ -1,3 +1,3 @@
1
1
  module Fourchette
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -1 +1,2 @@
1
- require_relative 'web/hooks'
1
+ require_relative 'web/hooks'
2
+ require_relative 'web/tarball'
@@ -0,0 +1,10 @@
1
+ get '/:github_user/:github_repo/:uuid/:expiration_timestamp' do
2
+ if params['expiration_timestamp'].to_i < Time.now.to_i
3
+ status 404
4
+ 'Oops...'
5
+ else
6
+ logger.info('Serving a tarball!')
7
+ filepath = Fourchette::Tarball.new.filepath(params['uuid'], params['expiration_timestamp'])
8
+ send_file filepath, :type => 'application/x-tgz'
9
+ end
10
+ end
@@ -0,0 +1 @@
1
+ some content...
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fourchette::Tarball do
4
+ subject { described_class.new }
5
+
6
+ describe '#url' do
7
+ let(:git_repo_url) { 'git://github.com/jipiboily/fourchette.git' }
8
+ let(:github_repo) { 'jipiboily/fourchette' }
9
+ let(:branch_name) { 'feature/something-new' }
10
+
11
+ before do
12
+ subject.stub(:expiration_timestamp).and_return('123')
13
+ subject.stub(:clone)
14
+ subject.stub(:tar).and_return('tmp/1234567/123.tar.gz')
15
+ subject.stub(:system)
16
+ stub_const('ENV', {'FOURCHETTE_APP_URL' => 'http://example.com'})
17
+ SecureRandom.stub(:uuid).and_return('1234567')
18
+ end
19
+
20
+ it {
21
+ expect(
22
+ subject.url(git_repo_url, branch_name, github_repo)
23
+ ).to eq "http://example.com/jipiboily/fourchette/1234567/123"
24
+ }
25
+
26
+ it 'clones the repo and checkout the branch' do
27
+ subject.unstub(:clone)
28
+ git_instance = double
29
+ Git.should_receive(:clone).with(git_repo_url, "tmp/1234567", recursive: true).and_return(git_instance)
30
+ git_instance.should_receive(:checkout).with(branch_name)
31
+ subject.url(git_repo_url, branch_name, github_repo)
32
+ end
33
+
34
+ it 'creates the tarball' do
35
+ subject.unstub(:tar)
36
+ subject.should_receive(:system).with 'tar -zcvf tmp/1234567/123.tar.gz -C tmp/1234567 .'
37
+ subject.url(git_repo_url, branch_name, github_repo)
38
+ end
39
+ end
40
+
41
+ describe '#filepath' do
42
+ it { expect(subject.filepath('1234567', '123')).to eq 'tmp/1234567/123.tar.gz' }
43
+ end
44
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+ require 'rack/test'
3
+
4
+ describe 'web tarball serving' do
5
+ include Rack::Test::Methods
6
+
7
+ def app
8
+ Sinatra::Application
9
+ end
10
+
11
+ context 'valid and not expired URL' do
12
+ it "returns the file" do
13
+ expire_in_2_secs = Time.now.to_i + 2
14
+ Fourchette::Tarball.any_instance
15
+ .should_receive(:filepath)
16
+ .with('1234567', expire_in_2_secs.to_s)
17
+ .and_return { "#{Dir.pwd}/spec/factories/fake_file" }
18
+
19
+ get "/jipiboily/fourchette/1234567/#{expire_in_2_secs}"
20
+ expect(last_response.headers['Content-Type']).to eq "application/x-tgz"
21
+ expect(last_response.body).to eq 'some content...'
22
+ end
23
+ end
24
+
25
+ context 'expired URL' do
26
+ it "does NOT returns the file if it is expired" do
27
+ expired_one_sec_ago = Time.now.to_i - 1
28
+ get "/jipiboily/fourchette/1234567/#{expired_one_sec_ago}"
29
+ expect(last_response).not_to be_ok
30
+ expect(last_response.body).not_to eq('Hello World')
31
+ expect(last_response.status).to eq(404)
32
+ subject.should_not_receive(:send_file)
33
+ end
34
+ end
35
+ end
@@ -1,5 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'coveralls'
3
+ require 'rack/test'
3
4
  Coveralls.wear!
4
5
 
5
6
  require_relative '../lib/fourchette'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fourchette
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean-Philippe Boily
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-30 00:00:00.000000000 Z
11
+ date: 2014-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -178,6 +178,34 @@ dependencies:
178
178
  - - "~>"
179
179
  - !ruby/object:Gem::Version
180
180
  version: 2.14.1
181
+ - !ruby/object:Gem::Dependency
182
+ name: guard-rspec
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: terminal-notifier-guard
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
181
209
  - !ruby/object:Gem::Dependency
182
210
  name: coveralls
183
211
  requirement: !ruby/object:Gem::Requirement
@@ -207,6 +235,7 @@ files:
207
235
  - ".gitignore"
208
236
  - ".travis.yml"
209
237
  - Gemfile
238
+ - Guardfile
210
239
  - LICENSE.txt
211
240
  - Procfile
212
241
  - README.md
@@ -223,11 +252,16 @@ files:
223
252
  - lib/fourchette/pgbackups.rb
224
253
  - lib/fourchette/pull_request.rb
225
254
  - lib/fourchette/rake_tasks.rb
255
+ - lib/fourchette/tarball.rb
226
256
  - lib/fourchette/version.rb
227
257
  - lib/fourchette/web.rb
228
258
  - lib/fourchette/web/hooks.rb
259
+ - lib/fourchette/web/tarball.rb
260
+ - spec/factories/fake_file
229
261
  - spec/lib/fourchette/heroku_spec.rb
230
262
  - spec/lib/fourchette/pull_request_spec.rb
263
+ - spec/lib/fourchette/tarball_spec.rb
264
+ - spec/lib/web/tarball_spec.rb
231
265
  - spec/spec_helper.rb
232
266
  - spec/support/silent-logger.rb
233
267
  - templates/Gemfile
@@ -261,7 +295,10 @@ signing_key:
261
295
  specification_version: 4
262
296
  summary: Your new best friend for isolated testing environments on Heroku.
263
297
  test_files:
298
+ - spec/factories/fake_file
264
299
  - spec/lib/fourchette/heroku_spec.rb
265
300
  - spec/lib/fourchette/pull_request_spec.rb
301
+ - spec/lib/fourchette/tarball_spec.rb
302
+ - spec/lib/web/tarball_spec.rb
266
303
  - spec/spec_helper.rb
267
304
  - spec/support/silent-logger.rb