perkins 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -0
  3. data/.ruby-version +1 -0
  4. data/.vagrant/machines/default/virtualbox/action_provision +1 -0
  5. data/.vagrant/machines/default/virtualbox/action_set_name +1 -0
  6. data/.vagrant/machines/default/virtualbox/id +1 -0
  7. data/Gemfile +0 -1
  8. data/README.md +11 -4
  9. data/Rakefile +3 -2
  10. data/TODO.md +2 -2
  11. data/Vagrantfile +53 -0
  12. data/db/migrate/20150220143050_add_status_fields_to_repos.rb +11 -0
  13. data/db/schema.rb +3 -1
  14. data/examples/Gemfile +4 -0
  15. data/examples/Gemfile.lock +164 -0
  16. data/examples/Procfile +4 -0
  17. data/examples/boot.rb +15 -0
  18. data/examples/config.ru +22 -0
  19. data/examples/database.yml +2 -2
  20. data/examples/sidekiq.yml +9 -0
  21. data/lib/core_ext/string/color.rb +22 -0
  22. data/lib/perkins/application.rb +27 -3
  23. data/lib/perkins/assets/images/error.gif +0 -0
  24. data/lib/perkins/assets/images/working.gif +0 -0
  25. data/lib/perkins/assets/javascripts/app.js +17 -1
  26. data/lib/perkins/assets/javascripts/config.js.coffee +14 -0
  27. data/lib/perkins/assets/javascripts/log_view.js.coffee +1 -2
  28. data/lib/perkins/assets/javascripts/perkings.js.coffee +129 -20
  29. data/lib/perkins/assets/javascripts/perkins/helpers.js.coffee +21 -0
  30. data/lib/perkins/assets/javascripts/perkins/m/models.js.coffee +50 -0
  31. data/lib/perkins/assets/javascripts/perkins/router.js.coffee +10 -0
  32. data/lib/perkins/assets/javascripts/perkins/v/dashboard.js.coffee +17 -0
  33. data/lib/perkins/assets/javascripts/perkins/v/err.js.coffee +12 -0
  34. data/lib/perkins/assets/javascripts/perkins/v/menu.js.coffee +10 -0
  35. data/lib/perkins/assets/javascripts/perkins/v/my_repos.js.coffee +41 -0
  36. data/lib/perkins/assets/javascripts/perkins/v/orgs.js.coffee +39 -0
  37. data/lib/perkins/assets/javascripts/perkins/v/profile.js.coffee +20 -0
  38. data/lib/perkins/assets/javascripts/perkins/v/repo.js.coffee +192 -0
  39. data/lib/perkins/assets/javascripts/perkins/v/sidebar.js.coffee +33 -0
  40. data/lib/perkins/assets/javascripts/templates/dashboard.hamlc +11 -0
  41. data/lib/perkins/assets/javascripts/templates/error.hamlc +22 -0
  42. data/lib/perkins/assets/javascripts/templates/menu.hamlc +18 -0
  43. data/lib/perkins/assets/javascripts/templates/org.hamlc +77 -0
  44. data/lib/perkins/assets/javascripts/templates/profile.hamlc +28 -0
  45. data/lib/perkins/assets/javascripts/templates/repo.hamlc +37 -0
  46. data/lib/perkins/assets/javascripts/templates/repos/build_row.hamlc +19 -0
  47. data/lib/perkins/assets/javascripts/templates/repos/builds.hamlc +25 -0
  48. data/lib/perkins/assets/javascripts/templates/repos/config.hamlc +77 -0
  49. data/lib/perkins/assets/javascripts/templates/repos/gb_repo.hamlc +31 -0
  50. data/lib/perkins/assets/javascripts/templates/repos/github.hamlc +7 -0
  51. data/lib/perkins/assets/javascripts/templates/repos/menu.hamlc +17 -0
  52. data/lib/perkins/assets/javascripts/templates/repos/report_detail.hamlc +53 -0
  53. data/lib/perkins/assets/javascripts/templates/sidebar.hamlc +14 -0
  54. data/lib/perkins/assets/javascripts/templates/sidebar_repo.hamlc +4 -0
  55. data/lib/perkins/assets/javascripts/vendor/backbone-min.js +2 -0
  56. data/lib/perkins/assets/javascripts/vendor/backbone.marionette.js +2891 -0
  57. data/lib/perkins/assets/javascripts/vendor/hamlcoffee.js.coffee.erb +138 -0
  58. data/lib/perkins/assets/javascripts/vendor/livequery.jquery.js +8 -0
  59. data/lib/perkins/assets/javascripts/vendor/log.js +1 -1
  60. data/lib/perkins/assets/javascripts/vendor/md5.js +207 -0
  61. data/lib/perkins/assets/javascripts/vendor/nprogress.js +476 -0
  62. data/lib/perkins/assets/javascripts/vendor/underscore.js +6 -0
  63. data/lib/perkins/assets/stylesheets/app.css +3 -0
  64. data/lib/perkins/assets/stylesheets/bootstrap-overrides.css.scss +13 -0
  65. data/lib/perkins/assets/stylesheets/styles.css.scss +30 -3
  66. data/lib/perkins/assets/stylesheets/vendor/nprogress.css +74 -0
  67. data/lib/perkins/assets.rb +42 -0
  68. data/lib/perkins/build/script/ruby.rb +1 -1
  69. data/lib/perkins/build_report.rb +13 -0
  70. data/lib/perkins/{worker.rb → build_worker.rb} +9 -5
  71. data/lib/perkins/cli.rb +4 -2
  72. data/lib/perkins/commit.rb +8 -1
  73. data/lib/perkins/git_loader_worker.rb +29 -0
  74. data/lib/perkins/repo.rb +23 -9
  75. data/lib/perkins/runner.rb +16 -25
  76. data/lib/perkins/server.rb +121 -116
  77. data/lib/perkins/version.rb +1 -1
  78. data/lib/perkins/views/builds.haml +0 -3
  79. data/lib/perkins/views/layout.haml +25 -36
  80. data/lib/perkins/views/menu.haml +1 -1
  81. data/lib/perkins/views/repos/github.haml +0 -31
  82. data/lib/perkins/views/repos/repo.haml +1 -1
  83. data/lib/perkins.rb +4 -2
  84. data/perkins.gemspec +5 -2
  85. data/spec/lib/repo_spec.rb +27 -6
  86. data/spec/lib/runner_spec.rb +1 -0
  87. data/spec/lib/server_spec.rb +6 -23
  88. data/spec/spec_helper.rb +14 -3
  89. metadata +160 -70
  90. data/examples/config.rb +0 -12
  91. data/examples/mongo.yml +0 -13
  92. data/lib/perkins/listener.rb +0 -38
  93. data/spec/lib/listener_spec.rb +0 -30
@@ -9,48 +9,11 @@ require 'coffee_script'
9
9
  require "sass"
10
10
  require "rdiscount"
11
11
  require "perkins/auth/github"
12
+ require "perkins/assets"
13
+ require "eventmachine"
12
14
 
13
15
  module Perkins
14
16
 
15
- class Assets < Sinatra::Base
16
-
17
- configure do
18
- set :assets, (Sprockets::Environment.new { |env|
19
- env.append_path(settings.root + "/assets/images")
20
- env.append_path(settings.root + "/assets/javascripts")
21
- env.append_path(settings.root + "/assets/stylesheets")
22
- # compress everything in production
23
- if ENV["RACK_ENV"] == "production"
24
- env.js_compressor = YUI::JavaScriptCompressor.new
25
- env.css_compressor = YUI::CssCompressor.new
26
- end
27
- })
28
- end
29
-
30
- get "/assets/app.js" do
31
- content_type("application/javascript")
32
- settings.assets["app.js"]
33
- end
34
-
35
- get "/assets/app.css" do
36
- content_type("text/css")
37
- settings.assets["app.css"]
38
- end
39
-
40
- %w{jpg png}.each do |format|
41
- get "/assets/:image.#{format}" do |image|
42
- content_type("image/#{format}")
43
- settings.assets["#{image}.#{format}"]
44
- end
45
- end
46
-
47
- get "/assets/:image.svg" do |image|
48
- content_type("image/svg+xml")
49
- settings.assets["#{image}.svg"]
50
- end
51
-
52
- end
53
-
54
17
  class Server < Sinatra::Application
55
18
 
56
19
  attr_reader :app
@@ -61,12 +24,30 @@ module Perkins
61
24
  #set :environment, :production
62
25
  set :session_secret, '*&(^B234'
63
26
 
27
+ configure :development do
28
+ #register Sinatra::Reloader
29
+ end
30
+
64
31
  use Perkins::Assets
65
32
 
66
33
  register Perkins::Auth::Github
67
34
 
35
+ #authenticate all -
36
+ before do
37
+ unless %w[stream sse logout unauthenticated /auth/github/callback /repos/receiver badge].include? request.path_info.split('/')[1]
38
+ authenticate!
39
+ end
40
+ end
41
+
42
+ #render index if not ajax request!
43
+ before do
44
+ return if %w[stream sse logout unauthenticated /auth/github/callback /repos/receiver badge config].include? request.path_info.split('/')[1]
45
+ unless request.xhr?
46
+ halt 200, haml( :index , locals: default_data)
47
+ end
48
+ end
49
+
68
50
  get '/' do
69
- authenticate!
70
51
  haml :index , locals: default_data
71
52
  end
72
53
 
@@ -74,19 +55,23 @@ module Perkins
74
55
  settings.perkins_application.to_json
75
56
  end
76
57
 
77
- get '/repos/sync' do
78
- @github_repos = build_data
58
+ #get '/repos/sync' do
59
+ # @github_repos = build_data
60
+ #end
61
+
62
+ get '/repos' do
63
+ content_type :json
64
+ repos = Perkins::Repo.added.all
65
+ repos.to_json
79
66
  end
80
67
 
81
68
  post '/repos/receiver' do
82
69
  #NEEDS VALIDATIONS
83
70
  payload = JSON.parse request.body.read
84
71
  repo = Perkins::Repo.added.find_by(gb_id: payload["repository"]["id"])
85
- repo.load_git
86
-
72
+ #repo.load_git
87
73
  pushed_branch = payload["ref"].split('/').last
88
74
  repo.add_commit(payload["after"], pushed_branch)
89
- #binding.pry
90
75
  "received post #{payload}"
91
76
  end
92
77
 
@@ -96,42 +81,57 @@ module Perkins
96
81
  Repo.sync_github_repo(repo)
97
82
  r = Repo.add_from_github(params[:id])
98
83
  r.to_json
99
- redirect "/me"
100
84
  end
101
85
 
102
86
  get '/repos/:login/:name' do
87
+ content_type :json
103
88
  repo = find_repo(params)
104
- record = repo.build_reports.last
105
- haml :"repos/repo" , locals: {repo: repo, build: record }
89
+ #detects a recently added repo (no dir and no prev builds)
90
+ enqueue_git_clone(repo) if !repo.exists? && repo.last_report_id.blank?
91
+ repo.as_json(methods: [:last_report_id, :http_url]).to_json
92
+ end
93
+
94
+ get '/badge' do
95
+ content_type "image/svg+xml"
96
+ repo = Repo.find_by(name: params[:repo])
97
+ build = repo.build_reports.last
98
+ request_badge({status: build.status ? "passing" : "error" , color: build.status ? "green" : "red" })
106
99
  end
107
100
 
108
101
  get '/repos/:login/:name/builds' do
102
+ content_type :json
109
103
  repo = find_repo(params)
110
- haml :builds , locals: {repo: repo, builds: repo.build_reports }
104
+ #respond or delay git load
105
+ repo.exists? ? repo.build_reports.to_json : enqueue_git_clone(repo)
111
106
  end
112
107
 
113
108
  get '/repos/:login/:name/builds/:build_id' do
109
+ content_type :json
114
110
  repo = find_repo(params)
115
111
  record = repo.build_reports.find(params[:build_id])
116
-
117
- haml :"repos/repo" , locals: {repo: repo, build: record }
118
- end
119
-
120
- get '/repos/:login/:name/run_commit' do
121
- repo = find_repo(params)
122
- sha = repo.git.log.map(&:sha).first
123
- repo.add_commit(sha, "master")
124
- redirect "/repos/#{repo.name}"
112
+ #record.to_json
113
+ repo.exists? ? record.to_json : enqueue_git_clone(repo)
125
114
  end
126
115
 
127
116
  get '/repos/:login/:name/config' do
117
+ content_type :json
128
118
  repo = find_repo(params)
129
119
  #find by id
130
120
  hook = github_user.api.hooks("#{repo.name}").detect{|o| o[:name] == "web"}
121
+ hook.to_attrs.to_json
122
+ end
131
123
 
132
- haml :"repos/config" , locals: {repo: repo, hook: hook}
124
+ #TODO send this through bg job
125
+ get '/repos/:login/:name/run_commit' do
126
+ content_type :json
127
+ repo = find_repo(params)
128
+ repo.load_git
129
+ sha = repo.git.log.map(&:sha).first
130
+ repo.add_commit(sha, "master")
131
+ repo.to_json
133
132
  end
134
133
 
134
+ #TODO for json
135
135
  post '/repos/:login/:name/add_hook' do
136
136
  repo = find_repo(params)
137
137
  hook = github_user.api.hooks("#{repo.name}").detect{|o| o[:name] == "web"}
@@ -155,56 +155,52 @@ module Perkins
155
155
  end
156
156
 
157
157
  get '/repos/:login/:name/builds/:build_id/restart' do
158
+ content_type :json
158
159
  repo = find_repo(params)
160
+ #repo.load_git
159
161
  record = repo.build_reports.find(params[:build_id])
160
162
  repo.add_commit(record['sha'], record['branch'])
161
- redirect "/repos/#{repo.name}"
162
- end
163
-
164
- get '/stream', provides: 'text/event-stream' do
165
- stream :keep_open do |out|
166
- settings.connections << out
167
- out.callback { settings.connections.delete(out) }
168
- end
169
- end
170
-
171
- post '/sse' do
172
- settings.connections.each { |out| out << "data: #{params[:msg]}\n\n" }
173
- 204 # response without entity body
163
+ record.to_json
174
164
  end
175
165
 
176
166
  get '/me' do
177
- authenticate!
178
- #binding.pry
179
- #repos = github_repos
180
- haml :profile, locals: { user: github_user.api }
181
- #haml :"repos/github", locals: {repos: repos}
182
- #"Hello There, #{github_user.name}! You have access to the #{params['id']} organization."
183
- end
184
-
185
- get '/myrepos' do
186
- authenticate!
187
- repos = github_user.api.repos
188
- haml :"repos/github", locals: { user: github_user.api, repos: repos }
167
+ content_type :json
168
+ a = github_user.api
169
+ @user = a.user
170
+ @orgs = a.orgs.map(&:login)
171
+ @user.to_attrs.merge({orgs: @orgs}).to_json
189
172
  end
190
173
 
191
174
  get '/orgs/:id' do
175
+ content_type :json
192
176
  github_organization_authenticate!(params['id'])
193
- #"Hello There, #{github_user.name}! You have access to the #{params['id']} organization."
194
177
  org = github_user.api.organization(params['id'])
195
- orgs = github_user.api.orgs
196
- repos = github_user.api.org_repos(params["id"])
197
- haml :orgs, locals: { org: org, orgs: orgs, repos: repos }
178
+ #orgs = github_user.api.orgs
179
+ repos = github_user.api.org_repos(params["id"]).map(&:to_attrs)
180
+ org.to_attrs.merge({repos: repos}).to_json
198
181
  end
199
182
 
200
- get '/publicized_orgs/:id' do
201
- github_publicized_organization_authenticate!(params['id'])
202
- "Hello There, #{github_user.name}! You are publicly a member of the #{params['id']} organization."
183
+ #TODO for json
184
+ get '/myrepos' do
185
+ repos = github_user.api.repos.map(&:to_attrs)
186
+ github_user.api.user.to_attrs.merge({repos: repos}).to_json
203
187
  end
204
188
 
205
- get '/teams/:id' do
206
- github_team_authenticate!(params['id'])
207
- "Hello There, #{github_user.name}! You have access to the #{params['id']} team."
189
+
190
+ get '/stream', provides: 'text/event-stream' do
191
+ stream :keep_open do |out|
192
+ #EM.run {
193
+ # EventMachine::PeriodicTimer.new(20) { out << "data: \n\n" } # added
194
+ #}
195
+ settings.connections << out
196
+ out.callback { settings.connections.delete(out) }
197
+ end
198
+ end
199
+
200
+ post '/sse' do
201
+ puts "connections #{settings.connections.size}".yellow
202
+ settings.connections.each { |out| out << "data: #{params[:msg]}\n\n" }
203
+ 204 # response without entity body
208
204
  end
209
205
 
210
206
  get '/logout' do
@@ -212,11 +208,17 @@ module Perkins
212
208
  redirect 'https://github.com'
213
209
  end
214
210
 
215
- def initialize(*args)
211
+ def initialize(args={})
216
212
  super
217
- puts "Start Perkins server"
218
- #check_project
219
- #@app = Perkin.new(options.project_path)
213
+ return if args.blank?
214
+ puts "PerkinsCI environment loaded on #{args[:host]}:#{args[:port]}".green
215
+ app = Perkins::Application.instance
216
+ self.class.set :perkins_application, app
217
+ self.class.set :github_options, {
218
+ :scopes => "admin:repo_hook,repo,user:email",
219
+ :secret => app.github_client_secret,
220
+ :client_id => app.github_client_id,
221
+ }
220
222
  end
221
223
 
222
224
  def github_repos
@@ -235,26 +237,32 @@ module Perkins
235
237
  def find_repo(params)
236
238
  id = "#{params[:login]}/#{params[:name]}"
237
239
  repo = Repo.find_by(name: id)
238
- repo.load_git
240
+ #repo.load_git #it seems that we dont need this here
239
241
  repo
240
242
  end
241
243
 
242
- def self.start(config_file, options)
244
+ def enqueue_git_clone(repo)
245
+ GitLoaderWorker.perform_async(repo.id )
246
+ end
247
+
248
+ def request_badge(opts={})
249
+ begin
250
+ url = URI.parse("https://img.shields.io/badge/build-#{opts[:status]}-#{opts[:color]}.svg?style=flat-square")
251
+ result = Net::HTTP.get(url)
252
+ rescue => e
253
+ e
254
+ end
255
+ end
243
256
 
257
+ ####################################
258
+ #TODO: deprecate this
259
+ def self.start(app, options)
244
260
  options = options.dup
245
261
  ENV['RACK_ENV'] = options.delete("e")
246
262
 
247
- app = eval(File.open(config_file).read)
248
- self.start_listener(app)
249
-
250
- set :perkins_application, app
251
- set :github_options, {
252
- :scopes => "admin:repo_hook,repo,user:email",
253
- :secret => app.github_client_secret,
254
- :client_id => app.github_client_id,
255
- }
256
-
257
263
  register Sinatra::ActiveRecordExtension
264
+ app = app.is_a?(String) ? eval(File.open(app).read) : app
265
+ self.start_listener(app)
258
266
 
259
267
  configure :development do
260
268
  #register Sinatra::Reloader
@@ -269,7 +277,8 @@ module Perkins
269
277
  #set :database, 'sqlite:///db/test.sqlite3'
270
278
  end
271
279
 
272
- Perkins::Server.run! options
280
+ #::Perkins::Server.run!(options)
281
+
273
282
  end
274
283
 
275
284
  def self.start_listener(app_config)
@@ -279,11 +288,8 @@ module Perkins
279
288
  listener.run!
280
289
  end
281
290
  end
291
+ ####################################
282
292
 
283
- ##use in rack
284
- ##And a corresponding config.ru:
285
- #require './app'
286
- #run Sinatra::Application
287
293
  def default_data
288
294
  {author: "miguel michelson", year: Time.now.year, app: @app}
289
295
  end
@@ -299,7 +305,6 @@ module Perkins
299
305
  status ? "glyphicon glyphicon-ok" : "glyphicon glyphicon-remove"
300
306
  end
301
307
 
302
-
303
308
  def avatar_url(email, size)
304
309
  gravatar_id = Digest::MD5.hexdigest(email.downcase)
305
310
  "http://gravatar.com/avatar/#{gravatar_id}.png?s=#{size}"
@@ -1,3 +1,3 @@
1
1
  module Perkins
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -41,6 +41,3 @@
41
41
  = "#{build.duration.to_i.round(2)} secs"
42
42
  %td
43
43
  %abbr.timeago{title:build.build_time}
44
-
45
-
46
-
@@ -15,39 +15,28 @@
15
15
  minispade.require('log')
16
16
 
17
17
  %body
18
- = haml :menu
19
-
20
- .container
21
- #content
22
- #left-wrap.col-sm-3
23
-
24
- #sidebar.affix
25
- #sidebar-header
26
- .pull-right
27
- %a.btn{href: "/me", title: "Add new repository"}
28
- %span.glyphicon.glyphicon-plus
29
-
30
- %h4.title Repos
31
-
32
- %ul.nav.nav-stacked{style: "overflow:scroll;height:100%"}
33
- - Perkins::Repo.added.all.each do |repo|
34
- %li
35
- %a{:href => "/repos/#{repo.name}"}
36
- = repo.name
37
- = haml :"repos/spinner", locals: {repo: repo}
38
-
39
- #main-content.col-sm-9
40
- = yield
41
-
42
- #inner
43
-
44
- .clearfix
45
- #footer
46
- -#= render 'footer'
47
- .pull-right
48
- Copyright © #{Time.now.year} Perkins
49
- %strong
50
- Redis connection:
51
- %span
52
- = $redis.client.host
53
- = $redis.client.port
18
+ #perkins-layout
19
+ %nav#main-menu.navbar.navbar-fixed-top{role:"navigation"}
20
+
21
+ -#= haml :menu
22
+
23
+ .container
24
+ #content
25
+ #left-wrap.col-sm-3
26
+ #sidebar.affix.col-sm-3
27
+
28
+ #main-content.col-sm-9
29
+ -#= yield
30
+
31
+ #inner
32
+
33
+ .clearfix
34
+ #footer
35
+ -#= render 'footer'
36
+ .pull-right
37
+ Copyright © #{Time.now.year} Perkins
38
+ %strong
39
+ Redis connection:
40
+ %span
41
+ = $redis.client.host
42
+ = $redis.client.port
@@ -1,4 +1,4 @@
1
- %nav.navbar.navbar-fixed-top{role:"navigation"}
1
+ %nav#main-menu.navbar.navbar-fixed-top{role:"navigation"}
2
2
  .container
3
3
  .navbar-header
4
4
  %button.navbar-toggle{"data-target" => ".nav-collapse", "data-toggle" => "collapse", :type => "button"}
@@ -6,37 +6,6 @@
6
6
  %span.glyphicon.glyphicon-refresh
7
7
  SYNC
8
8
 
9
- -#
10
- - repos.each do |repo|
11
- %ul.list-group
12
- %li.list-group-item
13
-
14
- .pull-right
15
- %a.btn{href: "/repos/add/#{repo.gb_id}"}
16
- ADD REPO
17
- %span.btn.glyphicon.glyphicon-plus-sign
18
-
19
- .row
20
- %span.col-sm-1
21
- %a{src: repo.github_data["owner"]["url"] }
22
- %img{ src: repo.github_data["owner"]["avatar_url"], width: 66 }
23
- %span.col-sm-8
24
- %h4= repo.name
25
- %a{href: repo.url}
26
- view on github
27
- %p
28
- .clearfix
29
- .well
30
- %p= repo.github_data["description"]
31
- -#
32
- %p
33
- clone url:
34
- = repo.github_data["clone_url"]
35
-
36
- %span
37
- = repo.github_data["fork"]
38
- = repo.github_data["private"]
39
-
40
9
  - if repos.any?
41
10
  %h2 Repositories:
42
11
 
@@ -29,7 +29,7 @@
29
29
  %abbr.timeago{title:build.build_time}
30
30
  %br
31
31
  duration:
32
- %strong= build.duration.to_i.round(2)
32
+ %strong= Perkins.Helpers.round(build.duration.to_i)
33
33
 
34
34
 
35
35
  .col-sm-12
data/lib/perkins.rb CHANGED
@@ -7,12 +7,14 @@ require 'redis'
7
7
  require 'redis-namespace'
8
8
  require "travis/yaml"
9
9
  require "active_record"
10
+ require "sidekiq"
10
11
 
11
12
  require 'dotenv'
12
13
  Dotenv.load
13
14
  require 'octokit'
14
15
  Octokit.auto_paginate = true
15
16
  #require 'core_ext/hash/deep_symbolize_keys'
17
+ require 'core_ext/string/color'
16
18
 
17
19
  module Perkins
18
20
  autoload :VERSION, 'perkins/version.rb'
@@ -22,8 +24,8 @@ module Perkins
22
24
  autoload :Build, 'perkins/build.rb'
23
25
  autoload :Commit, 'perkins/commit.rb'
24
26
  autoload :Server, 'perkins/server.rb'
25
- autoload :Worker, 'perkins/worker.rb'
26
- autoload :Listener, 'perkins/listener.rb'
27
+ autoload :BuildWorker, 'perkins/build_worker.rb'
28
+ autoload :GitLoaderWorker, 'perkins/git_loader_worker.rb'
27
29
  autoload :ThorUtils, 'perkins/thor_utils.rb'
28
30
  autoload :Logger, 'perkins/logger.rb'
29
31
  autoload :Application, 'perkins/application.rb'
data/perkins.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Perkins::VERSION
9
9
  spec.authors = ["miguel michelson"]
10
10
  spec.email = ["miguelmichelson@gmail.com"]
11
- spec.summary = "Thin CI"
12
- spec.description = "Minimal CI"
11
+ spec.summary = "A travis compatible standalone CI solution for ruby"
12
+ spec.description = "Continous integration solution compatible with travis.ci"
13
13
  spec.homepage = ""
14
14
  spec.license = "MIT"
15
15
 
@@ -33,11 +33,14 @@ Gem::Specification.new do |spec|
33
33
  spec.add_runtime_dependency("sinatra")
34
34
  spec.add_runtime_dependency("haml")
35
35
  spec.add_runtime_dependency("sprockets")
36
+ spec.add_runtime_dependency("haml_coffee_assets")
36
37
  spec.add_runtime_dependency("yui-compressor")
37
38
  spec.add_runtime_dependency("rdiscount")
38
39
  spec.add_runtime_dependency("travis-yaml")
39
40
  spec.add_runtime_dependency("redis-namespace")
40
41
  spec.add_runtime_dependency("thin")
42
+ spec.add_runtime_dependency("sidekiq")
43
+ spec.add_runtime_dependency("dotenv-rails")
41
44
 
42
45
  spec.add_dependency "warden-github", "~>1.0"
43
46
 
@@ -47,6 +47,22 @@ describe "Repo" do
47
47
  #expect(r.local_path).to_not be_blank
48
48
  end
49
49
 
50
+ context "load git" do
51
+ before :each do
52
+ @repo = Perkins::Repo.first
53
+ end
54
+
55
+ it "will not be downloaded" do
56
+ expect(@repo.download_status).to be_blank
57
+ expect(@repo.downloaded?).to be == false
58
+ end
59
+
60
+ it "will be downloaded after load_git" do
61
+ @repo.load_git
62
+ expect(@repo.downloaded?).to be == true
63
+ end
64
+ end
65
+
50
66
  context "loaded repo" do
51
67
  before :each do
52
68
  @repo = Perkins::Repo.first
@@ -56,7 +72,7 @@ describe "Repo" do
56
72
  end
57
73
 
58
74
  it "should download repo" do
59
- expect(File.exists?(@path)).to be_present
75
+ expect(File.exist?(@path)).to be_present
60
76
  end
61
77
 
62
78
  it "should have a default runner" do
@@ -82,11 +98,15 @@ describe "Repo" do
82
98
  expect(@repo.runner).to be_instance_of(Perkins::Runner)
83
99
  end
84
100
 
85
- it "run run run" do
101
+ it "runner true" do
86
102
  sha = @repo.git.log.map(&:sha).first
87
- @repo.runner.run(sha)
88
- #expect(@repo.runner.status).to be == true
89
- #expect(@repo.runner.response).to_not be_blank
103
+ allow_any_instance_of(Perkins::Runner).to receive(:run_script).and_return("stubbed")
104
+ allow_any_instance_of(Perkins::Runner).to receive(:successful_command?).and_return(true)
105
+ runner = @repo.runner
106
+ runner.run(sha)
107
+ expect(runner.response).to be == "stubbed"
108
+ expect(runner.status).to be == true
109
+ expect(@repo.build_status).to be == "stopped"
90
110
  end
91
111
  end
92
112
 
@@ -99,10 +119,11 @@ describe "Repo" do
99
119
  @path = @repo.git.dir.path
100
120
  end
101
121
 
102
- it "receive commit" do
122
+ it "will increment Worker jobs when receive commit " do
103
123
  sha = @repo.git.log.map(&:sha).first
104
124
  @repo.add_commit(sha, "master")
105
125
  expect(@repo.new_commit).to be_instance_of(Perkins::Commit)
126
+ expect(Perkins::Worker.jobs.size).to be > 0
106
127
  end
107
128
 
108
129
  end
@@ -20,6 +20,7 @@ describe "Runner" do
20
20
 
21
21
  before(:each) do
22
22
  perkins_app
23
+
23
24
  Perkins::Repo.delete_all
24
25
  allow_any_instance_of(Warden::GitHub::User).to receive(:api).and_return(user_api)
25
26
  @user = Warden::GitHub::User.new
@@ -55,36 +55,18 @@ describe 'Server App' do
55
55
  it "profile" do
56
56
  allow_any_instance_of(Warden::GitHub::User).to receive(:api).and_return(user_api)
57
57
  get "/me"
58
- #puts last_response.body
59
58
  expect(last_response).to be_ok
60
59
  end
61
60
 
62
61
  describe "github" do
63
62
 
64
- it "sync" do
65
-
66
- allow_any_instance_of(Warden::GitHub::User).to receive(:api).and_return(user_api)
67
-
68
- get "/repos/sync"
69
-
70
- follow_redirect!
71
-
72
- expect("http://example.org/me").to be == last_request.url
73
-
74
- expect(last_response).to be_ok
75
-
76
- expect(Perkins::Repo.synced_records).to be_any
77
- end
78
-
79
63
  it "add repo" do
80
64
  allow_any_instance_of(Warden::GitHub::User).to receive(:api).and_return(user_api)
81
65
  a = Warden::GitHub::User.new
82
66
  Perkins::Repo.sync_github_repos(a)
83
67
  repo = Perkins::Repo.synced_records.first
84
- get "/repos/add/#{repo.gb_id}"
85
- follow_redirect!
86
- expect("http://example.org/me").to be == last_request.url
87
- expect(last_response).to be_ok
68
+ xhr("/repos/add/#{repo.gb_id}")
69
+ expect(last_response.body).to be == "true"
88
70
  expect(Perkins::Repo.find(repo.id).github_data).to_not be_blank
89
71
  end
90
72
 
@@ -92,9 +74,10 @@ describe 'Server App' do
92
74
  allow_any_instance_of(Warden::GitHub::User).to receive(:api).and_return(user_api)
93
75
  a = Warden::GitHub::User.new
94
76
  Perkins::Repo.sync_github_repos(a)
95
- allow_any_instance_of(Perkins::Repo).to receive(:check_config_existence).and_return(file)
96
- get "/repos/#{Perkins::Repo.last.github_data["full_name"]}"
97
- expect(last_response.body).to include(Perkins::Repo.last.name)
77
+ repo = Perkins::Repo.synced_records.first
78
+ allow_any_instance_of(Perkins::Server).to receive(:find_repo).and_return(repo)
79
+ xhr "/repos/name/any_repo"
80
+ expect(last_response.body).to include(repo.name)
98
81
  end
99
82
 
100
83
  it "receive hook" do