hercules 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/.gitignore +10 -0
  2. data/Gemfile +11 -0
  3. data/Gemfile.lock +36 -0
  4. data/LICENSE +20 -0
  5. data/README.md +71 -0
  6. data/Rakefile +76 -0
  7. data/VERSION +1 -0
  8. data/bin/hercules +6 -0
  9. data/hdi/README.md +4 -0
  10. data/hdi/config.rb +7 -0
  11. data/hdi/site/index.html +267 -0
  12. data/hdi/site/stylesheets/style.css +1 -0
  13. data/hdi/src/configuration.rb +5 -0
  14. data/hdi/src/layouts/application.haml +12 -0
  15. data/hdi/src/pages/_hdi.haml +71 -0
  16. data/hdi/src/pages/_header.haml +8 -0
  17. data/hdi/src/pages/_jquery.haml +155 -0
  18. data/hdi/src/pages/index.haml +10 -0
  19. data/hdi/src/stylesheets/style.sass +173 -0
  20. data/hercules.gemspec +120 -0
  21. data/lib/command_runner.rb +73 -0
  22. data/lib/config.rb +82 -0
  23. data/lib/deployer.rb +95 -0
  24. data/lib/git_handler.rb +78 -0
  25. data/lib/hercules.rb +167 -0
  26. data/lib/http_handler.rb +41 -0
  27. data/lib/request_handler.rb +142 -0
  28. data/tests/command_runner_test.rb +35 -0
  29. data/tests/config_test.rb +39 -0
  30. data/tests/fixtures/Gemfile +1 -0
  31. data/tests/fixtures/Gemfile.lock +8 -0
  32. data/tests/fixtures/Gemfile.with_git_gem +2 -0
  33. data/tests/fixtures/Gemfile.with_git_gem.lock +10 -0
  34. data/tests/fixtures/bogus_config.yml +9 -0
  35. data/tests/fixtures/bogus_deployer.rb +2 -0
  36. data/tests/fixtures/config.yml +12 -0
  37. data/tests/fixtures/config_empty.yml +1 -0
  38. data/tests/fixtures/config_empty_branches.yml +8 -0
  39. data/tests/fixtures/config_empty_projects.yml +2 -0
  40. data/tests/fixtures/config_global.yml +14 -0
  41. data/tests/fixtures/config_partial_1.yml +7 -0
  42. data/tests/fixtures/config_partial_2.yml +7 -0
  43. data/tests/fixtures/config_partial_3.yml +7 -0
  44. data/tests/fixtures/deployer_branch.rb +11 -0
  45. data/tests/fixtures/deployer_exception.rb +11 -0
  46. data/tests/fixtures/deployer_false.rb +11 -0
  47. data/tests/fixtures/deployer_path.rb +11 -0
  48. data/tests/fixtures/deployer_true.rb +11 -0
  49. data/tests/fixtures/deployer_undefined_variable.rb +11 -0
  50. data/tests/fixtures/startup_checkout_config.yml +12 -0
  51. data/tests/fixtures/startup_checkout_error_config.yml +12 -0
  52. data/tests/git_handler_test.rb +95 -0
  53. data/tests/git_setup.rb +70 -0
  54. data/tests/hercules_test.rb +128 -0
  55. data/tests/http_handler_test.rb +88 -0
  56. data/tests/request_handler_test.rb +242 -0
  57. data/tests/startup.rb +36 -0
  58. metadata +251 -0
@@ -0,0 +1,88 @@
1
+ # coding: utf-8
2
+ require 'tests/startup'
3
+ require 'tests/git_setup'
4
+ require 'net/http'
5
+ require 'uri'
6
+ require 'test/unit'
7
+
8
+ class HttpHandlerTest < Test::Unit::TestCase
9
+ include Startup
10
+ include GitSetup
11
+
12
+ def setup
13
+ prepare_startup
14
+ git_setup
15
+ @json_request = %<
16
+ {
17
+ "before": "5aef35982fb2d34e9d9d4502f6ede1072793222d",
18
+ "repository": {
19
+ "url": "file:///tmp/hercules_test_repository",
20
+ "name": "test_project",
21
+ "description": "test repository",
22
+ "watchers": 5,
23
+ "forks": 2,
24
+ "private": 1,
25
+ "owner": {
26
+ "email": "diogob@gmail.com",
27
+ "name": "diogob"
28
+ }
29
+ },
30
+ "commits": [
31
+ {
32
+ "id": "41a212ee83ca127e3c8cf465891ab7216a705f59",
33
+ "url": "http://github.com/defunkt/github/commit/41a212ee83ca127e3c8cf465891ab7216a705f59",
34
+ "author": {
35
+ "email": "chris@ozmm.org",
36
+ "name": "Chris Wanstrath"
37
+ },
38
+ "message": "okay i give in",
39
+ "timestamp": "2008-02-15T14:57:17-08:00",
40
+ "added": ["filepath.rb"]
41
+ },
42
+ {
43
+ "id": "de8251ff97ee194a289832576287d6f8ad74e3d0",
44
+ "url": "http://github.com/defunkt/github/commit/de8251ff97ee194a289832576287d6f8ad74e3d0",
45
+ "author": {
46
+ "email": "chris@ozmm.org",
47
+ "name": "Chris Wanstrath"
48
+ },
49
+ "message": "update pricing a tad",
50
+ "timestamp": "2008-02-15T14:36:34-08:00"
51
+ }
52
+ ],
53
+ "after": "de8251ff97ee194a289832576287d6f8ad74e3d0",
54
+ "ref": "refs/heads/master"
55
+ }>
56
+ end
57
+
58
+ def post token
59
+ start_hercules do |pid,log|
60
+ res = Net::HTTP.post_form(URI.parse("http://127.0.0.1:8080/test_project/#{token}"), {'payload' => @json_request})
61
+ yield res, log
62
+ end
63
+ end
64
+
65
+ def get token
66
+ start_hercules do |pid,log|
67
+ res = Net::HTTP.get(URI.parse("http://127.0.0.1:8080/test_project/#{token}"))
68
+ yield res, log
69
+ end
70
+ end
71
+
72
+ def test_simple_post
73
+ post "abc" do |res, log|
74
+ log_content = log.read()
75
+ assert_match /Received POST/, log_content
76
+ assert_no_match /Repository .* not found/, log_content
77
+ assert_no_match /Invalid token/, log_content
78
+ assert_no_match /Repository .* not found/, res.body
79
+ assert_is_checkout @config['test_project']['target_directory'] + '/branches/master'
80
+ end
81
+ end
82
+
83
+ def test_get
84
+ get "abc" do |res,log|
85
+ assert_no_match /500: Error/, log.read
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,242 @@
1
+ # coding: utf-8
2
+ require 'tests/git_setup'
3
+ require 'lib/request_handler'
4
+ require 'lib/config'
5
+ require 'logger'
6
+ require 'json'
7
+ require 'test/unit'
8
+
9
+ class RequestHandlerTest < Test::Unit::TestCase
10
+ include GitSetup
11
+ def setup
12
+ git_setup
13
+ @config = ::Hercules::Config.new(File.dirname(__FILE__) + '/fixtures/config.yml')
14
+ @json_request = %<payload={
15
+ "before": "5aef35982fb2d34e9d9d4502f6ede1072793222d",
16
+ "repository": {
17
+ "url": "file:///tmp/hercules_test_repository",
18
+ "name": "test_project",
19
+ "description": "test repository",
20
+ "watchers": 5,
21
+ "forks": 2,
22
+ "private": 1,
23
+ "owner": {
24
+ "email": "diogob@gmail.com",
25
+ "name": "diogob"
26
+ }
27
+ },
28
+ "commits": [
29
+ {
30
+ "id": "41a212ee83ca127e3c8cf465891ab7216a705f59",
31
+ "url": "http://github.com/defunkt/github/commit/41a212ee83ca127e3c8cf465891ab7216a705f59",
32
+ "author": {
33
+ "email": "chris@ozmm.org",
34
+ "name": "Chris Wanstrath"
35
+ },
36
+ "message": "okay i give in",
37
+ "timestamp": "2008-02-15T14:57:17-08:00",
38
+ "added": ["filepath.rb"]
39
+ },
40
+ {
41
+ "id": "de8251ff97ee194a289832576287d6f8ad74e3d0",
42
+ "url": "http://github.com/defunkt/github/commit/de8251ff97ee194a289832576287d6f8ad74e3d0",
43
+ "author": {
44
+ "email": "chris@ozmm.org",
45
+ "name": "Chris Wanstrath"
46
+ },
47
+ "message": "update pricing a tad",
48
+ "timestamp": "2008-02-15T14:36:34-08:00"
49
+ }
50
+ ],
51
+ "after": "de8251ff97ee194a289832576287d6f8ad74e3d0",
52
+ "ref": "refs/heads/master"
53
+ }>
54
+ end
55
+
56
+ def post token
57
+ handler = Hercules::RequestHandler.new({:config => @config, :log => Logger.new("/dev/null"), :method => "POST", :path => "/github/#{token}", :query => "", :body => @json_request})
58
+ handler.status # just to ensure we process the request before any assert
59
+ handler
60
+ end
61
+
62
+ def get path
63
+ handler = Hercules::RequestHandler.new({:config => @config, :log => Logger.new("/dev/null"), :method => "GET", :path => "/#{path}", :query => "", :body => @json_request})
64
+ handler.status # just to ensure we process the request before any assert
65
+ handler
66
+ end
67
+
68
+ def test_read_repository_attributes
69
+ handler = Hercules::RequestHandler.new({:config => @config, :log => Logger.new("/dev/null"), :method => "POST", :path => "/github", :query => "", :body => @json_request})
70
+ assert_equal "test_project", handler.repository_name
71
+ assert_equal "file:///tmp/hercules_test_repository", handler.repository_url
72
+ assert_equal "master", handler.branch
73
+ end
74
+
75
+ def test_double_post
76
+ test_simple_post
77
+ test_simple_post
78
+ end
79
+
80
+ def test_could_not_install_gem
81
+ generate_bogus_gemfile
82
+ res = post "abc"
83
+ assert_match /Failed to run/, res.message
84
+ assert_equal 500, res.status
85
+ assert !File.exists?(@config['test_project']['target_directory'] + '/branches/master')
86
+ end
87
+
88
+ def test_could_install_gem
89
+ generate_gemfile_with_gem
90
+ res = post "abc"
91
+ assert_no_match /Failed to run/, res.message
92
+ assert_equal 200, res.status
93
+ assert_is_checkout @config['test_project']['target_directory'] + '/branches/master'
94
+ assert File.exists?(@config['test_project']['target_directory'] + '/bundles/master')
95
+ assert !File.exists?(@config['test_project']['target_directory'] + '/bundles/master/master')
96
+ assert File.exists?(@config['test_project']['target_directory'] + '/branches/master/vendor/bundle')
97
+ end
98
+
99
+ def test_request_hdi
100
+ res = get "test_project/abc"
101
+ assert_equal false, res.request_hdi?
102
+ res = get "test_project/abc/hdi"
103
+ assert_equal true, res.request_hdi?
104
+ res = post "abc/hdi"
105
+ assert_equal false, res.request_hdi?
106
+ end
107
+
108
+ def test_get_hdi
109
+ res = get "test_project/abc/hdi"
110
+ assert_equal 200, res.status
111
+ assert_match /<title>HDI/, res.message
112
+ end
113
+
114
+ def test_request_token
115
+ res = post "abc"
116
+ assert_equal "abc", res.request_token
117
+ res = get "test_project/abc"
118
+ assert_equal "abc", res.request_token
119
+ end
120
+
121
+ def test_simple_post
122
+ res = post "abc"
123
+ assert_no_match /Repository .* not found/, res.message
124
+ assert_equal 200, res.status
125
+ assert_is_checkout @config['test_project']['target_directory'] + '/branches/master'
126
+ end
127
+
128
+ def test_invalid_token
129
+ res = post "invalid_token"
130
+ assert_match /Invalid token/, res.message
131
+ assert_equal 403, res.status
132
+ assert !File.exists?(@config['test_project']['target_directory'] + '/branches/master')
133
+ end
134
+
135
+ def test_repository_not_found
136
+ @json_request = @json_request.gsub(/test_project/, "project_that_does_not_exist")
137
+ res = post "abc"
138
+ assert_equal 404, res.status
139
+ assert_match /Repository .* not found/, res.message
140
+ end
141
+
142
+ def test_branch_not_found
143
+ @json_request = @json_request.gsub(/master/, "branch_that_does_not_exist")
144
+ res = post "abc"
145
+ assert_equal 404, res.status
146
+ assert_match /Branch .* not found/, res.message
147
+ end
148
+
149
+ def test_deployer_false
150
+ generate_deployer "deployer_false"
151
+ res = post "abc"
152
+ assert_equal 500, res.status
153
+ assert_match /Error while deploying/, res.message
154
+ assert !File.exists?(@config['test_project']['target_directory'] + '/branches/master')
155
+ assert_equal 1, Dir.glob(@config['test_project']['target_directory'] + '/logs/master/*').size
156
+ end
157
+
158
+ def test_deployer_true
159
+ generate_deployer "deployer_true"
160
+ res = post "abc"
161
+ assert_equal 200, res.status
162
+ assert File.exists?(@config['test_project']['target_directory'] + '/branches/master')
163
+ assert File.exists?(@config['test_project']['target_directory'] + '/branches/master/after_deploy')
164
+ end
165
+
166
+ def test_bogus_deployer
167
+ generate_deployer "bogus_deployer"
168
+ res = post "abc"
169
+ assert_equal 200, res.status
170
+ assert File.exists?(@config['test_project']['target_directory'] + '/branches/master')
171
+ end
172
+
173
+ def test_deployer_path
174
+ generate_deployer "deployer_path"
175
+ res = post "abc"
176
+ assert_equal 200, res.status
177
+ assert File.exists?(@config['test_project']['target_directory'] + '/branches/master')
178
+ assert File.exists?(@config['test_project']['target_directory'] + '/branches/master/after_deploy')
179
+ end
180
+
181
+ def test_deployer_exception
182
+ generate_deployer "deployer_exception"
183
+ res = post "abc"
184
+ assert_equal 500, res.status
185
+ assert_match /Error while deploying/, res.message
186
+ assert !File.exists?(@config['test_project']['target_directory'] + '/branches/master')
187
+ end
188
+
189
+ def test_deployer_undefined_variable
190
+ generate_deployer "deployer_undefined_variable"
191
+ res = post "abc"
192
+ assert_equal 500, res.status
193
+ assert_match /Error while deploying/, res.message
194
+ assert !File.exists?(@config['test_project']['target_directory'] + '/branches/master')
195
+ end
196
+
197
+ def test_deployer_branch
198
+ generate_deployer "deployer_branch"
199
+ res = post "abc"
200
+ assert_equal 200, res.status
201
+ assert File.exists?(@config['test_project']['target_directory'] + '/branches/master')
202
+ assert File.exists?(@config['test_project']['target_directory'] + '/branches/master/branch_name_master')
203
+ end
204
+
205
+ def test_get_project_root_with_right_token
206
+ res = get "test_project/abc"
207
+ assert_equal 200, res.status
208
+ assert_equal({'master' => {'deployed' => false}, 'test' => {'deployed' => false}}, JSON.parse(res.message))
209
+ end
210
+
211
+ def test_get_project_root_with_wrong_token
212
+ res = get "test_project/wrong_token"
213
+ assert_equal 403, res.status
214
+ assert_match /Invalid token/, res.message
215
+ end
216
+
217
+ def test_get_project_root_with_right_token_after_deploy
218
+ res = post "abc"
219
+ assert_equal 200, res.status
220
+ res = get "test_project/abc"
221
+ assert_equal 200, res.status
222
+ log_path = Dir.glob(@config['test_project']['target_directory'] + '/logs/master/*').pop
223
+ checkout = log_path.split('/').pop.gsub(/\.log/, '')
224
+ output = ""
225
+ File.open(log_path){|f| output = f.read }
226
+ timestamp = File.mtime(@config['test_project']['target_directory'] + '/branches/master').strftime("%Y-%m-%d %H:%M:%S")
227
+ assert_equal({'master' => {'deployed' => true, 'checkouts' => [{'sha1' => checkout, 'timestamp' => timestamp, 'output' => output}]}, 'test' => {'deployed' => false}}, JSON.parse(res.message))
228
+ end
229
+
230
+ def test_get_should_not_return_error_upon_non_existent_log_file
231
+ res = post "abc"
232
+ assert_equal 200, res.status
233
+ log_path = Dir.glob(@config['test_project']['target_directory'] + '/logs/master/*').pop
234
+ FileUtils.rm_f(log_path)
235
+ res = get "test_project/abc"
236
+ assert_equal 200, res.status
237
+ checkout = log_path.split('/').pop.gsub(/\.log/, '')
238
+ timestamp = File.mtime(@config['test_project']['target_directory'] + '/branches/master').strftime("%Y-%m-%d %H:%M:%S")
239
+ assert_equal({'master' => {'deployed' => true, 'checkouts' => [{'sha1' => checkout, 'timestamp' => timestamp}]}, 'test' => {'deployed' => false}}, JSON.parse(res.message))
240
+ end
241
+ end
242
+
data/tests/startup.rb ADDED
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+
3
+ # Test mailer startup reading a YAML file and requesting config info
4
+ module Startup
5
+ def prepare_startup
6
+ @logfile = 'tmp/test.log'
7
+ @pidfile = 'hercules.pid'
8
+ end
9
+
10
+ def cleanup
11
+ File.unlink @logfile if File.exist?(@logfile)
12
+ File.unlink @pidfile if File.exist?(@pidfile)
13
+ end
14
+
15
+ def start_hercules config = 'tests/fixtures/config.yml'
16
+ verbose(false) do
17
+ Bundler.with_clean_env do
18
+ sh "bin/hercules -l tmp/test.log -V -c " + config
19
+ end
20
+ begin
21
+ sleep 1
22
+ pid = File.open(@pidfile, 'r').read()
23
+ log = File.open(@logfile, 'r')
24
+ yield(pid, log)
25
+ sh "kill -KILL #{pid} >/dev/null 2>&1" rescue nil
26
+ sleep 1
27
+ assert !File.exist?('tmp/hercules.pid'), "PID file still exists after daemon shutdown"
28
+ ensure
29
+ # just to make sure we always kill the test instances
30
+ sh "kill -KILL #{pid} >/dev/null 2>&1" rescue nil
31
+ cleanup
32
+ end
33
+ end
34
+ end
35
+ end
36
+
metadata ADDED
@@ -0,0 +1,251 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hercules
3
+ version: !ruby/object:Gem::Version
4
+ hash: 25
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 1
10
+ version: 0.1.1
11
+ platform: ruby
12
+ authors:
13
+ - Diogo Biazus
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-10-14 00:00:00 -03:00
19
+ default_executable: hercules
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: eventmachine
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - "="
28
+ - !ruby/object:Gem::Version
29
+ hash: 59
30
+ segments:
31
+ - 0
32
+ - 12
33
+ - 10
34
+ version: 0.12.10
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: eventmachine_httpserver
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - "="
44
+ - !ruby/object:Gem::Version
45
+ hash: 23
46
+ segments:
47
+ - 0
48
+ - 2
49
+ - 0
50
+ version: 0.2.0
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: git
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - "="
60
+ - !ruby/object:Gem::Version
61
+ hash: 21
62
+ segments:
63
+ - 1
64
+ - 2
65
+ - 5
66
+ version: 1.2.5
67
+ type: :runtime
68
+ version_requirements: *id003
69
+ - !ruby/object:Gem::Dependency
70
+ name: json
71
+ prerelease: false
72
+ requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - "="
76
+ - !ruby/object:Gem::Version
77
+ hash: 11
78
+ segments:
79
+ - 1
80
+ - 4
81
+ - 6
82
+ version: 1.4.6
83
+ type: :runtime
84
+ version_requirements: *id004
85
+ - !ruby/object:Gem::Dependency
86
+ name: bundler
87
+ prerelease: false
88
+ requirement: &id005 !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ hash: 23
94
+ segments:
95
+ - 1
96
+ - 0
97
+ - 0
98
+ version: 1.0.0
99
+ type: :runtime
100
+ version_requirements: *id005
101
+ - !ruby/object:Gem::Dependency
102
+ name: haml
103
+ prerelease: false
104
+ requirement: &id006 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - "="
108
+ - !ruby/object:Gem::Version
109
+ hash: 35
110
+ segments:
111
+ - 3
112
+ - 0
113
+ - 18
114
+ version: 3.0.18
115
+ type: :development
116
+ version_requirements: *id006
117
+ - !ruby/object:Gem::Dependency
118
+ name: compass
119
+ prerelease: false
120
+ requirement: &id007 !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - "="
124
+ - !ruby/object:Gem::Version
125
+ hash: 61
126
+ segments:
127
+ - 0
128
+ - 10
129
+ - 5
130
+ version: 0.10.5
131
+ type: :development
132
+ version_requirements: *id007
133
+ - !ruby/object:Gem::Dependency
134
+ name: staticmatic
135
+ prerelease: false
136
+ requirement: &id008 !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - "="
140
+ - !ruby/object:Gem::Version
141
+ hash: 39
142
+ segments:
143
+ - 0
144
+ - 10
145
+ - 8
146
+ version: 0.10.8
147
+ type: :development
148
+ version_requirements: *id008
149
+ description: Very simple deployment tool. It was made to deploy rails applications using github, bundler.
150
+ email: diogob@gmail.com
151
+ executables:
152
+ - hercules
153
+ extensions: []
154
+
155
+ extra_rdoc_files:
156
+ - LICENSE
157
+ - README.md
158
+ files:
159
+ - .gitignore
160
+ - Gemfile
161
+ - Gemfile.lock
162
+ - LICENSE
163
+ - README.md
164
+ - Rakefile
165
+ - VERSION
166
+ - bin/hercules
167
+ - hdi/README.md
168
+ - hdi/config.rb
169
+ - hdi/site/index.html
170
+ - hdi/site/stylesheets/style.css
171
+ - hdi/src/configuration.rb
172
+ - hdi/src/layouts/application.haml
173
+ - hdi/src/pages/_hdi.haml
174
+ - hdi/src/pages/_header.haml
175
+ - hdi/src/pages/_jquery.haml
176
+ - hdi/src/pages/index.haml
177
+ - hdi/src/stylesheets/style.sass
178
+ - hercules.gemspec
179
+ - lib/command_runner.rb
180
+ - lib/config.rb
181
+ - lib/deployer.rb
182
+ - lib/git_handler.rb
183
+ - lib/hercules.rb
184
+ - lib/http_handler.rb
185
+ - lib/request_handler.rb
186
+ - tests/command_runner_test.rb
187
+ - tests/config_test.rb
188
+ - tests/fixtures/Gemfile
189
+ - tests/fixtures/Gemfile.lock
190
+ - tests/fixtures/Gemfile.with_git_gem
191
+ - tests/fixtures/Gemfile.with_git_gem.lock
192
+ - tests/fixtures/bogus_config.yml
193
+ - tests/fixtures/bogus_deployer.rb
194
+ - tests/fixtures/config.yml
195
+ - tests/fixtures/config_empty.yml
196
+ - tests/fixtures/config_empty_branches.yml
197
+ - tests/fixtures/config_empty_projects.yml
198
+ - tests/fixtures/config_global.yml
199
+ - tests/fixtures/config_partial_1.yml
200
+ - tests/fixtures/config_partial_2.yml
201
+ - tests/fixtures/config_partial_3.yml
202
+ - tests/fixtures/deployer_branch.rb
203
+ - tests/fixtures/deployer_exception.rb
204
+ - tests/fixtures/deployer_false.rb
205
+ - tests/fixtures/deployer_path.rb
206
+ - tests/fixtures/deployer_true.rb
207
+ - tests/fixtures/deployer_undefined_variable.rb
208
+ - tests/fixtures/startup_checkout_config.yml
209
+ - tests/fixtures/startup_checkout_error_config.yml
210
+ - tests/git_handler_test.rb
211
+ - tests/git_setup.rb
212
+ - tests/hercules_test.rb
213
+ - tests/http_handler_test.rb
214
+ - tests/request_handler_test.rb
215
+ - tests/startup.rb
216
+ has_rdoc: true
217
+ homepage: http://github.com/diogob/hercules
218
+ licenses: []
219
+
220
+ post_install_message:
221
+ rdoc_options:
222
+ - --charset=UTF-8
223
+ require_paths:
224
+ - lib
225
+ required_ruby_version: !ruby/object:Gem::Requirement
226
+ none: false
227
+ requirements:
228
+ - - ">="
229
+ - !ruby/object:Gem::Version
230
+ hash: 3
231
+ segments:
232
+ - 0
233
+ version: "0"
234
+ required_rubygems_version: !ruby/object:Gem::Requirement
235
+ none: false
236
+ requirements:
237
+ - - ">="
238
+ - !ruby/object:Gem::Version
239
+ hash: 3
240
+ segments:
241
+ - 0
242
+ version: "0"
243
+ requirements: []
244
+
245
+ rubyforge_project:
246
+ rubygems_version: 1.3.7
247
+ signing_key:
248
+ specification_version: 3
249
+ summary: Simple deploy solution for ruby applications (using github+bundler).
250
+ test_files: []
251
+