chicanery 0.0.7 → 0.0.8
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.
- data/Gemfile.lock +6 -2
- data/README.md +6 -2
- data/chicanery.gemspec +2 -0
- data/examples/baby_steps.rb +3 -1
- data/examples/blinky.rb +14 -0
- data/examples/chicanery.rb +5 -2
- data/fixtures/vcr_cassettes/broken.yml +54 -0
- data/fixtures/vcr_cassettes/idle.yml +54 -0
- data/fixtures/vcr_cassettes/no_projects.yml +52 -0
- data/fixtures/vcr_cassettes/redirect.yml +52 -0
- data/fixtures/vcr_cassettes/running.yml +54 -0
- data/lib/chicanery.rb +10 -13
- data/lib/chicanery/cctray.rb +46 -33
- data/lib/chicanery/git.rb +1 -1
- data/lib/chicanery/persistence.rb +8 -3
- data/spec/chicanery/cctray_spec.rb +68 -0
- data/spec/chicanery/persistence_spec.rb +17 -3
- data/spec/chicanery_spec.rb +11 -4
- data/spec/embedded_chicanery_spec.rb +9 -20
- metadata +44 -4
data/Gemfile.lock
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
chicanery (0.0.
|
4
|
+
chicanery (0.0.8)
|
5
5
|
nokogiri (~> 1)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
10
|
diff-lcs (1.1.3)
|
11
|
+
fakeweb (1.3.0)
|
11
12
|
multi_json (1.3.7)
|
12
|
-
nokogiri (1.5.
|
13
|
+
nokogiri (1.5.6)
|
13
14
|
rake (0.9.2.2)
|
14
15
|
rspec (2.11.0)
|
15
16
|
rspec-core (~> 2.11.0)
|
@@ -25,13 +26,16 @@ GEM
|
|
25
26
|
simplecov-gem-adapter (1.0.1)
|
26
27
|
simplecov
|
27
28
|
simplecov-html (0.7.1)
|
29
|
+
vcr (2.3.0)
|
28
30
|
|
29
31
|
PLATFORMS
|
30
32
|
ruby
|
31
33
|
|
32
34
|
DEPENDENCIES
|
33
35
|
chicanery!
|
36
|
+
fakeweb
|
34
37
|
rake (~> 0)
|
35
38
|
rspec (~> 2)
|
36
39
|
simplecov
|
37
40
|
simplecov-gem-adapter
|
41
|
+
vcr
|
data/README.md
CHANGED
@@ -56,12 +56,16 @@ Now you can schedule the following command with cron:
|
|
56
56
|
|
57
57
|
chicanery myconfiguration
|
58
58
|
|
59
|
-
Or continuously poll every 10 seconds:
|
59
|
+
Or to continuously poll every 10 seconds, add the following line to the configuration:
|
60
60
|
|
61
|
-
|
61
|
+
poll_period 10
|
62
62
|
|
63
63
|
You'll notice a file called 'state' is created which represents the state at the last execution. This is then restored during the next execution to detect events such as a new build succeeding/failing.
|
64
64
|
|
65
|
+
If you want to specify an alternate location for this state file, add the following line to your configuration file:
|
66
|
+
|
67
|
+
persist_state_to '/tmp/build_state'
|
68
|
+
|
65
69
|
## Supported CI servers
|
66
70
|
|
67
71
|
Currently only ci servers that can provide [cctray reporting format](http://confluence.public.thoughtworks.org/display/CI/Multiple+Project+Summary+Reporting+Standard) are supported.
|
data/chicanery.gemspec
CHANGED
@@ -23,4 +23,6 @@ Gem::Specification.new do |gem|
|
|
23
23
|
gem.add_development_dependency 'rspec', '~>2'
|
24
24
|
gem.add_development_dependency 'simplecov'
|
25
25
|
gem.add_development_dependency 'simplecov-gem-adapter'
|
26
|
+
gem.add_development_dependency 'vcr'
|
27
|
+
gem.add_development_dependency 'fakeweb'
|
26
28
|
end
|
data/examples/baby_steps.rb
CHANGED
data/examples/blinky.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'blinky'
|
2
|
+
require 'chicanery/cctray'
|
3
|
+
|
4
|
+
include Chicanery::Cctray
|
5
|
+
|
6
|
+
cctray 'travis', 'https://api.travis-ci.org/repositories/markryall/chicanery/cc.xml'
|
7
|
+
|
8
|
+
when_run do |state|
|
9
|
+
if state.has_failure?
|
10
|
+
Blinky.new.light.failure!
|
11
|
+
else
|
12
|
+
Blinky.new.light.success!
|
13
|
+
end
|
14
|
+
end
|
data/examples/chicanery.rb
CHANGED
@@ -2,12 +2,15 @@ require 'chicanery/cctray'
|
|
2
2
|
require 'chicanery/git'
|
3
3
|
|
4
4
|
include Chicanery::Git
|
5
|
+
include Chicanery::Cctray
|
5
6
|
|
6
|
-
|
7
|
+
git 'chicanery', '.', branches: [:master], remotes: {
|
7
8
|
github: { url: 'git://github.com/markryall/chicanery.git' }
|
8
9
|
}
|
9
10
|
|
10
|
-
|
11
|
+
cctray 'travis', 'https://api.travis-ci.org/repositories/markryall/chicanery/cc.xml'
|
12
|
+
|
13
|
+
poll_period 10
|
11
14
|
|
12
15
|
def growlnotify message
|
13
16
|
`growlnotify -t "some new chicanery ..." --image ~/icons/chicanery.png -m \"#{message}\"`
|
@@ -0,0 +1,54 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.travis-ci.org/repositories/markryall/chicanery/cc.xml
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
accept:
|
11
|
+
- ! '*/*'
|
12
|
+
user-agent:
|
13
|
+
- Ruby
|
14
|
+
response:
|
15
|
+
status:
|
16
|
+
code: 200
|
17
|
+
message: OK
|
18
|
+
headers:
|
19
|
+
access-control-allow-credentials:
|
20
|
+
- 'true'
|
21
|
+
access-control-allow-origin:
|
22
|
+
- ! '*'
|
23
|
+
access-control-expose-headers:
|
24
|
+
- Content-Type, Cache-Control, Expires, Etag, Last-Modified
|
25
|
+
cache-control:
|
26
|
+
- no-cache
|
27
|
+
content-type:
|
28
|
+
- application/json;charset=utf-8
|
29
|
+
date:
|
30
|
+
- Sat, 15 Dec 2012 02:41:37 GMT
|
31
|
+
etag:
|
32
|
+
- ! '"715c01a97e6124876f63088110deeafd"'
|
33
|
+
status:
|
34
|
+
- 200 OK
|
35
|
+
strict-transport-security:
|
36
|
+
- max-age=31536000
|
37
|
+
vary:
|
38
|
+
- Accept,Accept-Encoding
|
39
|
+
x-accepted-oauth-scopes:
|
40
|
+
- public
|
41
|
+
x-oauth-scopes:
|
42
|
+
- public
|
43
|
+
content-length:
|
44
|
+
- '245'
|
45
|
+
connection:
|
46
|
+
- keep-alive
|
47
|
+
body:
|
48
|
+
encoding: US-ASCII
|
49
|
+
string: ! "<Projects>\n <Project\n name=\"markryall/chicanery\"\n activity=\"Sleeping\"\n
|
50
|
+
\ lastBuildStatus=\"Failure\"\n lastBuildLabel=\"50\"\n lastBuildTime=\"2012-12-15T02:41:20.000+0000\"\n
|
51
|
+
\ webUrl=\"api.travis-ci.org/markryall/chicanery\" />\n</Projects>"
|
52
|
+
http_version: '1.1'
|
53
|
+
recorded_at: Sat, 15 Dec 2012 02:41:42 GMT
|
54
|
+
recorded_with: VCR 2.3.0
|
@@ -0,0 +1,54 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.travis-ci.org/repositories/markryall/chicanery/cc.xml
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
accept:
|
11
|
+
- ! '*/*'
|
12
|
+
user-agent:
|
13
|
+
- Ruby
|
14
|
+
response:
|
15
|
+
status:
|
16
|
+
code: 200
|
17
|
+
message: OK
|
18
|
+
headers:
|
19
|
+
access-control-allow-credentials:
|
20
|
+
- 'true'
|
21
|
+
access-control-allow-origin:
|
22
|
+
- ! '*'
|
23
|
+
access-control-expose-headers:
|
24
|
+
- Content-Type, Cache-Control, Expires, Etag, Last-Modified
|
25
|
+
cache-control:
|
26
|
+
- no-cache
|
27
|
+
content-type:
|
28
|
+
- application/json;charset=utf-8
|
29
|
+
date:
|
30
|
+
- Sat, 15 Dec 2012 02:36:15 GMT
|
31
|
+
etag:
|
32
|
+
- ! '"0bb76c5892b2ce7a7efafc2b41bc2512"'
|
33
|
+
status:
|
34
|
+
- 200 OK
|
35
|
+
strict-transport-security:
|
36
|
+
- max-age=31536000
|
37
|
+
vary:
|
38
|
+
- Accept,Accept-Encoding
|
39
|
+
x-accepted-oauth-scopes:
|
40
|
+
- public
|
41
|
+
x-oauth-scopes:
|
42
|
+
- public
|
43
|
+
content-length:
|
44
|
+
- '245'
|
45
|
+
connection:
|
46
|
+
- keep-alive
|
47
|
+
body:
|
48
|
+
encoding: US-ASCII
|
49
|
+
string: ! "<Projects>\n <Project\n name=\"markryall/chicanery\"\n activity=\"Sleeping\"\n
|
50
|
+
\ lastBuildStatus=\"Success\"\n lastBuildLabel=\"48\"\n lastBuildTime=\"2012-12-15T02:18:28.000+0000\"\n
|
51
|
+
\ webUrl=\"api.travis-ci.org/markryall/chicanery\" />\n</Projects>"
|
52
|
+
http_version: '1.1'
|
53
|
+
recorded_at: Sat, 15 Dec 2012 02:36:20 GMT
|
54
|
+
recorded_with: VCR 2.3.0
|
@@ -0,0 +1,52 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.travis-ci.org/repositories/markryall/chicanery/cc.xml
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
accept:
|
11
|
+
- ! '*/*'
|
12
|
+
user-agent:
|
13
|
+
- Ruby
|
14
|
+
response:
|
15
|
+
status:
|
16
|
+
code: 200
|
17
|
+
message: OK
|
18
|
+
headers:
|
19
|
+
access-control-allow-credentials:
|
20
|
+
- 'true'
|
21
|
+
access-control-allow-origin:
|
22
|
+
- ! '*'
|
23
|
+
access-control-expose-headers:
|
24
|
+
- Content-Type, Cache-Control, Expires, Etag, Last-Modified
|
25
|
+
cache-control:
|
26
|
+
- no-cache
|
27
|
+
content-type:
|
28
|
+
- application/json;charset=utf-8
|
29
|
+
date:
|
30
|
+
- Sat, 15 Dec 2012 02:39:04 GMT
|
31
|
+
etag:
|
32
|
+
- ! '"aa451983b94cbec99aa94346f358b5b0"'
|
33
|
+
status:
|
34
|
+
- 200 OK
|
35
|
+
strict-transport-security:
|
36
|
+
- max-age=31536000
|
37
|
+
vary:
|
38
|
+
- Accept,Accept-Encoding
|
39
|
+
x-accepted-oauth-scopes:
|
40
|
+
- public
|
41
|
+
x-oauth-scopes:
|
42
|
+
- public
|
43
|
+
content-length:
|
44
|
+
- '217'
|
45
|
+
connection:
|
46
|
+
- keep-alive
|
47
|
+
body:
|
48
|
+
encoding: US-ASCII
|
49
|
+
string: ! "Nothing here but us chickens"
|
50
|
+
http_version: '1.1'
|
51
|
+
recorded_at: Sat, 15 Dec 2012 02:39:09 GMT
|
52
|
+
recorded_with: VCR 2.3.0
|
@@ -0,0 +1,52 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.travis-ci.org/repositories/markryall/chicanery/cc.xml
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
accept:
|
11
|
+
- ! '*/*'
|
12
|
+
user-agent:
|
13
|
+
- Ruby
|
14
|
+
response:
|
15
|
+
status:
|
16
|
+
code: 301
|
17
|
+
message: Redirect
|
18
|
+
headers:
|
19
|
+
access-control-allow-credentials:
|
20
|
+
- 'true'
|
21
|
+
access-control-allow-origin:
|
22
|
+
- ! '*'
|
23
|
+
access-control-expose-headers:
|
24
|
+
- Content-Type, Cache-Control, Expires, Etag, Last-Modified
|
25
|
+
cache-control:
|
26
|
+
- no-cache
|
27
|
+
content-type:
|
28
|
+
- application/json;charset=utf-8
|
29
|
+
date:
|
30
|
+
- Sat, 15 Dec 2012 02:39:04 GMT
|
31
|
+
etag:
|
32
|
+
- ! '"aa451983b94cbec99aa94346f358b5b0"'
|
33
|
+
status:
|
34
|
+
- 200 OK
|
35
|
+
strict-transport-security:
|
36
|
+
- max-age=31536000
|
37
|
+
vary:
|
38
|
+
- Accept,Accept-Encoding
|
39
|
+
x-accepted-oauth-scopes:
|
40
|
+
- public
|
41
|
+
x-oauth-scopes:
|
42
|
+
- public
|
43
|
+
content-length:
|
44
|
+
- '217'
|
45
|
+
connection:
|
46
|
+
- keep-alive
|
47
|
+
body:
|
48
|
+
encoding: US-ASCII
|
49
|
+
string: ! "hhh"
|
50
|
+
http_version: '1.1'
|
51
|
+
recorded_at: Sat, 15 Dec 2012 02:39:09 GMT
|
52
|
+
recorded_with: VCR 2.3.0
|
@@ -0,0 +1,54 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.travis-ci.org/repositories/markryall/chicanery/cc.xml
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
accept:
|
11
|
+
- ! '*/*'
|
12
|
+
user-agent:
|
13
|
+
- Ruby
|
14
|
+
response:
|
15
|
+
status:
|
16
|
+
code: 200
|
17
|
+
message: OK
|
18
|
+
headers:
|
19
|
+
access-control-allow-credentials:
|
20
|
+
- 'true'
|
21
|
+
access-control-allow-origin:
|
22
|
+
- ! '*'
|
23
|
+
access-control-expose-headers:
|
24
|
+
- Content-Type, Cache-Control, Expires, Etag, Last-Modified
|
25
|
+
cache-control:
|
26
|
+
- no-cache
|
27
|
+
content-type:
|
28
|
+
- application/json;charset=utf-8
|
29
|
+
date:
|
30
|
+
- Sat, 15 Dec 2012 02:39:04 GMT
|
31
|
+
etag:
|
32
|
+
- ! '"aa451983b94cbec99aa94346f358b5b0"'
|
33
|
+
status:
|
34
|
+
- 200 OK
|
35
|
+
strict-transport-security:
|
36
|
+
- max-age=31536000
|
37
|
+
vary:
|
38
|
+
- Accept,Accept-Encoding
|
39
|
+
x-accepted-oauth-scopes:
|
40
|
+
- public
|
41
|
+
x-oauth-scopes:
|
42
|
+
- public
|
43
|
+
content-length:
|
44
|
+
- '217'
|
45
|
+
connection:
|
46
|
+
- keep-alive
|
47
|
+
body:
|
48
|
+
encoding: US-ASCII
|
49
|
+
string: ! "<Projects>\n <Project\n name=\"markryall/chicanery\"\n activity=\"Building\"\n
|
50
|
+
\ lastBuildStatus=\"Unknown\"\n lastBuildLabel=\"49\"\n lastBuildTime=\"\"\n
|
51
|
+
\ webUrl=\"api.travis-ci.org/markryall/chicanery\" />\n</Projects>"
|
52
|
+
http_version: '1.1'
|
53
|
+
recorded_at: Sat, 15 Dec 2012 02:39:09 GMT
|
54
|
+
recorded_with: VCR 2.3.0
|
data/lib/chicanery.rb
CHANGED
@@ -16,29 +16,26 @@ module Chicanery
|
|
16
16
|
include Handlers
|
17
17
|
include StateComparison
|
18
18
|
|
19
|
-
VERSION = "0.0.
|
19
|
+
VERSION = "0.0.8"
|
20
20
|
|
21
|
-
def
|
22
|
-
|
23
|
-
poll_period
|
24
|
-
if poll_period
|
25
|
-
run_every poll_period.to_i
|
26
|
-
else
|
27
|
-
run
|
28
|
-
end
|
21
|
+
def poll_period seconds=nil
|
22
|
+
@poll_period = seconds if seconds
|
23
|
+
@poll_period
|
29
24
|
end
|
30
25
|
|
31
|
-
def
|
26
|
+
def execute args
|
27
|
+
load args.shift
|
32
28
|
begin
|
33
29
|
loop do
|
34
30
|
run
|
31
|
+
break unless poll_period
|
35
32
|
sleep poll_period
|
36
33
|
end
|
37
34
|
rescue Interrupt
|
38
35
|
end
|
39
36
|
end
|
40
37
|
|
41
|
-
def run
|
38
|
+
def run
|
42
39
|
previous_state = restore
|
43
40
|
current_state = {
|
44
41
|
servers: {},
|
@@ -55,8 +52,8 @@ module Chicanery
|
|
55
52
|
current_state[:servers][server.name] = current_jobs
|
56
53
|
end
|
57
54
|
current_state.extend Chicanery::Summary
|
58
|
-
run_handlers.each {|handler| handler.call current_state }
|
59
|
-
persist current_state
|
55
|
+
run_handlers.each {|handler| handler.call current_state, previous_state }
|
56
|
+
persist current_state
|
60
57
|
end
|
61
58
|
|
62
59
|
end
|
data/lib/chicanery/cctray.rb
CHANGED
@@ -3,48 +3,61 @@ require 'nokogiri'
|
|
3
3
|
require 'date'
|
4
4
|
|
5
5
|
module Chicanery
|
6
|
-
|
7
|
-
|
6
|
+
module Cctray
|
7
|
+
def self.new *args
|
8
|
+
Cctray::Server.new *args
|
9
|
+
end
|
8
10
|
|
9
|
-
def
|
10
|
-
|
11
|
+
def cctray *args
|
12
|
+
server Cctray::Server.new *args
|
11
13
|
end
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
class Server
|
16
|
+
attr_reader :name, :uri, :options
|
17
|
+
|
18
|
+
def initialize name, url, options={}
|
19
|
+
@name, @uri, @options = name, URI(url), options
|
18
20
|
end
|
19
|
-
res.body
|
20
|
-
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
last_label: project[:lastBuildLabel]
|
31
|
-
}
|
32
|
-
jobs[project[:name]] = job unless filtered project[:name]
|
22
|
+
def get
|
23
|
+
req = Net::HTTP::Get.new(uri.path)
|
24
|
+
req.basic_auth user, password if options[:user] and options[:password]
|
25
|
+
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https', verify_mode: OpenSSL::SSL::VERIFY_NONE) do |https|
|
26
|
+
https.request(req)
|
27
|
+
end
|
28
|
+
res.value #check for success via a spectactulalry poorly named method
|
29
|
+
res.body
|
33
30
|
end
|
34
|
-
jobs
|
35
|
-
end
|
36
31
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
32
|
+
def jobs
|
33
|
+
jobs = {}
|
34
|
+
response_body = get
|
35
|
+
Nokogiri::XML(response_body).css("Project").each do |project|
|
36
|
+
job = {
|
37
|
+
activity: project[:activity] == 'Sleeping' ? :sleeping : :building,
|
38
|
+
last_build_status: parse_build_status(project[:lastBuildStatus]),
|
39
|
+
last_build_time: project[:lastBuildTime].empty? ? nil : DateTime.parse(project[:lastBuildTime]).to_time.to_i,
|
40
|
+
url: project[:webUrl],
|
41
|
+
last_label: project[:lastBuildLabel]
|
42
|
+
}
|
43
|
+
jobs[project[:name]] = job unless filtered project[:name]
|
44
|
+
end
|
45
|
+
raise "could not find any jobs in response: [#{response_body}]" if jobs.empty?
|
46
|
+
jobs
|
47
|
+
end
|
48
|
+
|
49
|
+
def parse_build_status status
|
50
|
+
case status
|
51
|
+
when /^Success/ then :success
|
52
|
+
when /^Unknown/ then :unknown
|
53
|
+
else :failure
|
54
|
+
end
|
42
55
|
end
|
43
|
-
end
|
44
56
|
|
45
|
-
|
46
|
-
|
47
|
-
|
57
|
+
def filtered name
|
58
|
+
return false unless options[:include]
|
59
|
+
!options[:include].match(name)
|
60
|
+
end
|
48
61
|
end
|
49
62
|
end
|
50
63
|
end
|
data/lib/chicanery/git.rb
CHANGED
@@ -3,14 +3,19 @@ require 'yaml'
|
|
3
3
|
module Chicanery
|
4
4
|
module Persistence
|
5
5
|
def persist state
|
6
|
-
File.open
|
6
|
+
File.open persist_state_to, 'w' do |file|
|
7
7
|
file.puts state.to_yaml
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
11
|
def restore
|
12
|
-
return {} unless File.exist?
|
13
|
-
YAML.load_file
|
12
|
+
return {} unless File.exist? persist_state_to
|
13
|
+
YAML.load_file persist_state_to
|
14
|
+
end
|
15
|
+
|
16
|
+
def persist_state_to path=nil
|
17
|
+
@state = path if path
|
18
|
+
@state || 'state'
|
14
19
|
end
|
15
20
|
end
|
16
21
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'chicanery/cctray'
|
2
|
+
require 'vcr'
|
3
|
+
|
4
|
+
VCR.configure do |c|
|
5
|
+
c.cassette_library_dir = 'fixtures/vcr_cassettes'
|
6
|
+
c.hook_into :fakeweb
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Chicanery::Cctray do
|
10
|
+
let(:server) do
|
11
|
+
Chicanery::Cctray.new 'chicanery', 'https://api.travis-ci.org/repositories/markryall/chicanery/cc.xml'
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should detect idle build' do
|
15
|
+
VCR.use_cassette('idle') do
|
16
|
+
server.jobs.should == {
|
17
|
+
"markryall/chicanery" => {
|
18
|
+
activity: :sleeping,
|
19
|
+
last_build_status: :success,
|
20
|
+
last_build_time: 1355537908,
|
21
|
+
url: "api.travis-ci.org/markryall/chicanery",
|
22
|
+
last_label: "48"
|
23
|
+
}
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should detect running build' do
|
29
|
+
VCR.use_cassette('running') do
|
30
|
+
server.jobs.should == {
|
31
|
+
"markryall/chicanery" => {
|
32
|
+
activity: :building,
|
33
|
+
last_build_status: :unknown,
|
34
|
+
last_build_time: nil,
|
35
|
+
url: "api.travis-ci.org/markryall/chicanery",
|
36
|
+
last_label: "49"
|
37
|
+
}
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should detect failed build' do
|
43
|
+
VCR.use_cassette('broken') do
|
44
|
+
server.jobs.should == {
|
45
|
+
"markryall/chicanery" => {
|
46
|
+
activity: :sleeping,
|
47
|
+
last_build_status: :failure,
|
48
|
+
last_build_time: 1355539280,
|
49
|
+
url: "api.travis-ci.org/markryall/chicanery",
|
50
|
+
last_label: "50"
|
51
|
+
}
|
52
|
+
}
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should complain if there are no jobs in response' do
|
57
|
+
VCR.use_cassette('no_projects') do
|
58
|
+
expect{server.jobs}.to raise_error "could not find any jobs in response: [Nothing here but us chickens]"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should complain if it gets a non 2xx response' do
|
63
|
+
VCR.use_cassette('redirect') do
|
64
|
+
expect{server.jobs}.to raise_error Net::HTTPRetriableError
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
@@ -1,14 +1,22 @@
|
|
1
1
|
describe Chicanery::Persistence do
|
2
2
|
include Chicanery::Persistence
|
3
3
|
|
4
|
+
let(:file) { stub 'file' }
|
5
|
+
let(:state) { stub 'state', to_yaml: :yaml }
|
6
|
+
|
4
7
|
describe '#persist' do
|
5
8
|
it 'should write state to disk as yaml' do
|
6
|
-
file = stub 'file'
|
7
|
-
state = stub 'state', to_yaml: :yaml
|
8
9
|
File.should_receive(:open).with('state', 'w').and_yield file
|
9
10
|
file.should_receive(:puts).with :yaml
|
10
11
|
persist state
|
11
12
|
end
|
13
|
+
|
14
|
+
it 'should persist state to where it is told' do
|
15
|
+
persist_state_to 'foo'
|
16
|
+
File.should_receive(:open).with('foo', 'w').and_yield file
|
17
|
+
file.should_receive(:puts).with :yaml
|
18
|
+
persist state
|
19
|
+
end
|
12
20
|
end
|
13
21
|
|
14
22
|
describe '#restore' do
|
@@ -18,10 +26,16 @@ describe Chicanery::Persistence do
|
|
18
26
|
end
|
19
27
|
|
20
28
|
it 'should read yaml from disk' do
|
21
|
-
state = stub 'state'
|
22
29
|
File.should_receive(:exist?).with('state').and_return true
|
23
30
|
YAML.should_receive(:load_file).with('state').and_return state
|
24
31
|
restore.should == state
|
25
32
|
end
|
33
|
+
|
34
|
+
it 'should read yaml from another location if it is told to do so' do
|
35
|
+
persist_state_to 'foo'
|
36
|
+
File.should_receive(:exist?).with('foo').and_return true
|
37
|
+
YAML.should_receive(:load_file).with('foo').and_return state
|
38
|
+
restore.should == state
|
39
|
+
end
|
26
40
|
end
|
27
41
|
end
|
data/spec/chicanery_spec.rb
CHANGED
@@ -4,14 +4,14 @@ describe Chicanery do
|
|
4
4
|
describe '#execute' do
|
5
5
|
before { %w{load restore persist}.each {|m| stub! m } }
|
6
6
|
|
7
|
+
after { execute ['configuration'] }
|
8
|
+
|
7
9
|
it 'should load configuration and exit immediately when nothing is configured no poll period is provided' do
|
8
10
|
should_receive(:load).with 'configuration'
|
9
|
-
execute %w{configuration}
|
10
11
|
end
|
11
12
|
|
12
13
|
it 'should restore previous state' do
|
13
14
|
should_receive(:restore)
|
14
|
-
execute %w{configuration}
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'should persist new state' do
|
@@ -19,12 +19,19 @@ describe Chicanery do
|
|
19
19
|
servers: {},
|
20
20
|
repos: {}
|
21
21
|
})
|
22
|
-
execute %w{configuration}
|
23
22
|
end
|
24
23
|
|
25
24
|
it 'should sleep for specified time when poll period is provided' do
|
26
25
|
should_receive(:sleep).with(10).and_raise Interrupt
|
27
|
-
|
26
|
+
poll_period 10
|
27
|
+
end
|
28
|
+
|
29
|
+
it "polls with a specified period" do
|
30
|
+
should_receive(:run).exactly(3).times
|
31
|
+
should_receive(:sleep).with(10).ordered
|
32
|
+
should_receive(:sleep).with(10).ordered
|
33
|
+
should_receive(:sleep).with(10).ordered.and_raise Interrupt
|
34
|
+
poll_period 10
|
28
35
|
end
|
29
36
|
end
|
30
37
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
describe Chicanery do
|
2
2
|
include Chicanery
|
3
|
-
|
3
|
+
|
4
4
|
describe '#run' do
|
5
|
-
|
5
|
+
|
6
6
|
before do
|
7
7
|
server double("Server A", :name => "A", :jobs => "A jobs")
|
8
8
|
server double("Server B", :name => "B", :jobs => "B jobs")
|
@@ -13,37 +13,26 @@ describe Chicanery do
|
|
13
13
|
end
|
14
14
|
@current_state = nil
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
before { stub!("restore").and_return({})}
|
18
18
|
before { %w{persist}.each {|m| stub! m } }
|
19
|
-
|
19
|
+
|
20
20
|
it "notifies when_run listeners of the current state of the servers jobs" do
|
21
|
-
run
|
21
|
+
run
|
22
22
|
@current_state[:servers]["A"].should == "A jobs"
|
23
23
|
@current_state[:servers]["B"].should == "B jobs"
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
it "notifies when_run listeners of the current state of the repos" do
|
27
|
-
run
|
27
|
+
run
|
28
28
|
@current_state[:repos]["X"].should == "X state"
|
29
29
|
@current_state[:repos]["Y"].should == "Y state"
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
#TESTS TODO
|
33
33
|
# it restores previous state and records current state
|
34
34
|
# it compares current state and previous state for each server
|
35
35
|
# it compares current state and previous state for each server
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
describe '#run_every' do
|
40
|
-
it "polls with a specified period" do
|
41
|
-
should_receive(:run).exactly(3).times
|
42
|
-
should_receive(:sleep).with(10).ordered
|
43
|
-
should_receive(:sleep).with(10).ordered
|
44
|
-
should_receive(:sleep).with(10).ordered.and_raise Interrupt
|
45
|
-
run_every 10
|
46
|
-
end
|
36
|
+
|
47
37
|
end
|
48
|
-
|
49
38
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chicanery
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
@@ -91,6 +91,38 @@ dependencies:
|
|
91
91
|
- - ! '>='
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: vcr
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: fakeweb
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
94
126
|
description: trigger various events related to a continuous integration environment
|
95
127
|
email:
|
96
128
|
- mark@ryall.name
|
@@ -109,7 +141,13 @@ files:
|
|
109
141
|
- bin/chicanery
|
110
142
|
- chicanery.gemspec
|
111
143
|
- examples/baby_steps.rb
|
144
|
+
- examples/blinky.rb
|
112
145
|
- examples/chicanery.rb
|
146
|
+
- fixtures/vcr_cassettes/broken.yml
|
147
|
+
- fixtures/vcr_cassettes/idle.yml
|
148
|
+
- fixtures/vcr_cassettes/no_projects.yml
|
149
|
+
- fixtures/vcr_cassettes/redirect.yml
|
150
|
+
- fixtures/vcr_cassettes/running.yml
|
113
151
|
- lib/chicanery.rb
|
114
152
|
- lib/chicanery/cctray.rb
|
115
153
|
- lib/chicanery/collections.rb
|
@@ -118,6 +156,7 @@ files:
|
|
118
156
|
- lib/chicanery/persistence.rb
|
119
157
|
- lib/chicanery/state_comparison.rb
|
120
158
|
- lib/chicanery/summary.rb
|
159
|
+
- spec/chicanery/cctray_spec.rb
|
121
160
|
- spec/chicanery/collections_spec.rb
|
122
161
|
- spec/chicanery/persistence_spec.rb
|
123
162
|
- spec/chicanery/state_comparison_spec.rb
|
@@ -138,7 +177,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
138
177
|
version: '0'
|
139
178
|
segments:
|
140
179
|
- 0
|
141
|
-
hash:
|
180
|
+
hash: 3689538563081558467
|
142
181
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
143
182
|
none: false
|
144
183
|
requirements:
|
@@ -147,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
147
186
|
version: '0'
|
148
187
|
segments:
|
149
188
|
- 0
|
150
|
-
hash:
|
189
|
+
hash: 3689538563081558467
|
151
190
|
requirements: []
|
152
191
|
rubyforge_project:
|
153
192
|
rubygems_version: 1.8.23
|
@@ -155,6 +194,7 @@ signing_key:
|
|
155
194
|
specification_version: 3
|
156
195
|
summary: polls various resources related to a ci environment and performs custom notifications
|
157
196
|
test_files:
|
197
|
+
- spec/chicanery/cctray_spec.rb
|
158
198
|
- spec/chicanery/collections_spec.rb
|
159
199
|
- spec/chicanery/persistence_spec.rb
|
160
200
|
- spec/chicanery/state_comparison_spec.rb
|