snooze 0.2.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +22 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +30 -3
- data/Guardfile +14 -0
- data/LICENSE +62 -20
- data/README.rdoc +33 -3
- data/bin/snooze +38 -2
- data/lib/snooze.rb +9 -2
- data/lib/snooze/button.rb +53 -0
- data/lib/snooze/connection_error.rb +2 -0
- data/lib/snooze/post.rb +58 -0
- data/snooze.gemspec +8 -4
- data/spec/spec_helper.rb +8 -0
- data/spec/unit/button_spec.rb +44 -0
- data/spec/unit/post_spec.rb +102 -0
- metadata +66 -3
data/.travis.yml
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- 2.0.0
|
4
|
+
- 1.9.3
|
5
|
+
- 1.9.2
|
6
|
+
- jruby-head
|
7
|
+
- jruby-18mode
|
8
|
+
- jruby-19mode
|
9
|
+
- rbx-18mode
|
10
|
+
- rbx-19mode
|
11
|
+
- ruby-head
|
12
|
+
- 1.8.7
|
13
|
+
- ree
|
14
|
+
matrix:
|
15
|
+
allow_failures:
|
16
|
+
- rvm: jruby-19mode
|
17
|
+
- rvm: rbx-19mode
|
18
|
+
- rvm: jruby-head
|
19
|
+
- rvm: ruby-head
|
20
|
+
notifications:
|
21
|
+
email:
|
22
|
+
- contact@snooze.io
|
data/Gemfile
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
gemspec
|
data/Gemfile.lock
CHANGED
@@ -1,13 +1,35 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
|
4
|
+
snooze (1.0.0)
|
5
|
+
faraday
|
5
6
|
|
6
7
|
GEM
|
7
|
-
remote:
|
8
|
+
remote: https://rubygems.org/
|
8
9
|
specs:
|
10
|
+
coderay (1.0.8)
|
9
11
|
diff-lcs (1.2.1)
|
12
|
+
faraday (0.8.7)
|
13
|
+
multipart-post (~> 1.1)
|
14
|
+
guard (1.6.2)
|
15
|
+
listen (>= 0.6.0)
|
16
|
+
lumberjack (>= 1.0.2)
|
17
|
+
pry (>= 0.9.10)
|
18
|
+
terminal-table (>= 1.4.3)
|
19
|
+
thor (>= 0.14.6)
|
20
|
+
guard-rspec (2.4.0)
|
21
|
+
guard (>= 1.1)
|
22
|
+
rspec (~> 2.11)
|
23
|
+
listen (0.7.2)
|
24
|
+
lumberjack (1.0.2)
|
25
|
+
method_source (0.8.1)
|
26
|
+
multipart-post (1.2.0)
|
27
|
+
pry (0.9.12)
|
28
|
+
coderay (~> 1.0.5)
|
29
|
+
method_source (~> 0.8)
|
30
|
+
slop (~> 3.4)
|
10
31
|
rake (10.0.3)
|
32
|
+
rb-fsevent (0.9.3)
|
11
33
|
rspec (2.13.0)
|
12
34
|
rspec-core (~> 2.13.0)
|
13
35
|
rspec-expectations (~> 2.13.0)
|
@@ -16,11 +38,16 @@ GEM
|
|
16
38
|
rspec-expectations (2.13.0)
|
17
39
|
diff-lcs (>= 1.1.3, < 2.0)
|
18
40
|
rspec-mocks (2.13.0)
|
41
|
+
slop (3.4.3)
|
42
|
+
terminal-table (1.4.5)
|
43
|
+
thor (0.17.0)
|
19
44
|
|
20
45
|
PLATFORMS
|
21
46
|
ruby
|
22
47
|
|
23
48
|
DEPENDENCIES
|
24
|
-
|
49
|
+
guard-rspec
|
25
50
|
rake
|
51
|
+
rb-fsevent
|
26
52
|
rspec (~> 2.8)
|
53
|
+
snooze!
|
data/Guardfile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'rspec' do
|
5
|
+
# Files that affect global scope -> run all specs when they change
|
6
|
+
watch(%r{^lib/snooze.rb$}) { 'spec' }
|
7
|
+
watch('spec/spec_helper.rb') { 'spec' }
|
8
|
+
watch('.rspec') { 'spec' }
|
9
|
+
watch('Guardfile.lock') { 'spec' }
|
10
|
+
|
11
|
+
# Specific files -> only run the associated spec file when they change
|
12
|
+
watch(%r{^spec/.+_spec\.rb$})
|
13
|
+
watch(%r{^lib/snooze/(.+)\.rb$}) { |m| "spec/unit/#{m[1]}_spec.rb" }
|
14
|
+
end
|
data/LICENSE
CHANGED
@@ -1,20 +1,62 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
the
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
1
|
+
This product depends on Faraday written by Rick Olson and Zack Hobson
|
2
|
+
and distributed under an MIT license.
|
3
|
+
See https://github.com/lostisland/faraday/blob/master/LICENSE.md
|
4
|
+
Copyright (c) 2009-2013 Rick Olson, Zack Hobson
|
5
|
+
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
7
|
+
a copy of this software and associated documentation files
|
8
|
+
(the "Software"), to deal in the Software without restriction, including
|
9
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
10
|
+
distribute, sublicense, and/or sell copies of the Software, and to permit
|
11
|
+
persons to whom the Software is furnished to do so, subject to the
|
12
|
+
following conditions:
|
13
|
+
|
14
|
+
The above copyright notice and this permission notice shall be included in
|
15
|
+
all copies or substantial portions of the Software.
|
16
|
+
|
17
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
22
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
23
|
+
DEALINGS IN THE SOFTWARE.
|
24
|
+
|
25
|
+
All other components of this product are copyright (c) 2013-2014 Bart ten
|
26
|
+
Brinke - Retrosync. All rights reserved.
|
27
|
+
|
28
|
+
Certain inventions disclosed in this file may be claimed within
|
29
|
+
patents owned or patent applications filed by Retrosync, or third
|
30
|
+
parties.
|
31
|
+
|
32
|
+
Subject to the terms of this notice, Retrosync grants you a
|
33
|
+
nonexclusive, nontransferable license, without the right to
|
34
|
+
sublicense, to (a) install and execute one copy of these files on any
|
35
|
+
number of workstations owned or controlled by you and (b) distribute
|
36
|
+
verbatim copies of these files to third parties. As a condition to the
|
37
|
+
foregoing grant, you must provide this notice along with each copy you
|
38
|
+
distribute and you must not remove, alter, or obscure this notice. All
|
39
|
+
other use, reproduction, modification, distribution, or other
|
40
|
+
exploitation of these files is strictly prohibited, except as may be set
|
41
|
+
forth in a separate written license agreement between you and New
|
42
|
+
Relic. The terms of any such license agreement will control over this
|
43
|
+
notice. The license stated above will be automatically terminated and
|
44
|
+
revoked if you exceed its scope or violate any of the terms of this
|
45
|
+
notice.
|
46
|
+
|
47
|
+
This License does not grant permission to use the trade names,
|
48
|
+
trademarks, service marks, or product names of Retrosync, except as
|
49
|
+
required for reasonable and customary use in describing the origin of
|
50
|
+
this file and reproducing the content of this notice. You may not
|
51
|
+
mark or brand this file with any trade name, trademarks, service
|
52
|
+
marks, or product names other than the original brand (if any)
|
53
|
+
provided by Retrosync.
|
54
|
+
|
55
|
+
Unless otherwise expressly agreed by Retrosync in a separate written
|
56
|
+
license agreement, these files are provided AS IS, WITHOUT WARRANTY OF
|
57
|
+
ANY KIND, including without any implied warranties of MERCHANTABILITY,
|
58
|
+
FITNESS FOR A PARTICULAR PURPOSE, TITLE, or NON-INFRINGEMENT. As a
|
59
|
+
condition to your use of these files, you are solely responsible for
|
60
|
+
such use. Retrosync will have no liability to you for direct,
|
61
|
+
indirect, consequential, incidental, special, or punitive damages or
|
62
|
+
for lost profits or data.
|
data/README.rdoc
CHANGED
@@ -4,20 +4,50 @@ For devops who run recurring jobs like rake tasks or bas scripts,
|
|
4
4
|
Snooze.io is a notification service that tells you when something is wrong.
|
5
5
|
Unlike just alerting when a job breaks, Snooze also alerts when a job did not run at all.
|
6
6
|
|
7
|
+
* Simple heartbeat monitoring for all your tasks / scripts
|
8
|
+
* Runs on all rubies {<img src="https://travis-ci.org/retrosync/snooze.png?branch=master" alt="Build Status" />}[https://travis-ci.org/retrosync/snooze]
|
9
|
+
* Runs from bash
|
10
|
+
|
7
11
|
== Installation & basic usage
|
8
12
|
|
9
13
|
Log in to http://www.snooze.io and create your account
|
10
14
|
|
11
|
-
Install Snooze
|
15
|
+
Install the Snooze gem:
|
12
16
|
|
13
17
|
$ gem install snooze
|
14
18
|
|
15
|
-
|
19
|
+
Call the Snooze gem from the command line with your clock id to Snooze a clock:
|
20
|
+
|
21
|
+
$ snooze 1234-1234-abcd-abcd
|
22
|
+
|
23
|
+
== Advanced usage
|
24
|
+
Test the Snoozing of a clock and the connection to Snooze.io:
|
25
|
+
|
26
|
+
$ snooze --dry-run 1234-1234-abcd-abcd
|
27
|
+
|
28
|
+
Get more debug output while Snoozing of a clock:
|
29
|
+
|
30
|
+
$ snooze --verbose 1234-1234-abcd-abcd
|
31
|
+
|
32
|
+
Snoozing a clock from Ruby / Rake task:
|
33
|
+
|
34
|
+
require 'snooze'
|
35
|
+
snooze_instance = Snooze::Button.new('1234-1234-abcd-abcd')
|
36
|
+
snooze_instance.snooze!
|
37
|
+
|
38
|
+
Catching exceptions in your Ruby application. If your code does not throw an exception,
|
39
|
+
your clock will automatically be Snoozed.
|
40
|
+
|
41
|
+
require 'snooze'
|
42
|
+
snooze_instance = Snooze::Button.new('1234-1234-abcd-abcd')
|
43
|
+
snooze_instance.with_backtrace do
|
44
|
+
puts 'your code goes here'
|
45
|
+
end
|
16
46
|
|
17
47
|
== Additional information
|
18
48
|
|
19
49
|
Snooze was designed and built by Bart ten Brinke from Retrosync.
|
20
|
-
If you have any issues, the fastest way to contact me is either through github or via email
|
50
|
+
If you have any issues, the fastest way to contact me is either through github or via email: contact@snooze.io
|
21
51
|
|
22
52
|
* Snooze homepage: http://www.snooze.io
|
23
53
|
* Retrosync homepage: http://www.retrosync.com
|
data/bin/snooze
CHANGED
@@ -3,6 +3,42 @@
|
|
3
3
|
|
4
4
|
$:.unshift(File.expand_path('../lib', File.dirname(__FILE__)))
|
5
5
|
require 'snooze'
|
6
|
+
require 'optparse'
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
## Variables
|
9
|
+
allowed_actions = ['snooze', 'backtrace', 'ping']
|
10
|
+
options = {}
|
11
|
+
|
12
|
+
optparse = OptionParser.new do |opts|
|
13
|
+
# Set a banner, displayed at the top
|
14
|
+
# of the help screen.
|
15
|
+
opts.banner = "Snooze gem, by Bart ten Brinke - version #{Snooze::VERSION}\nWebsite: http://snooze.io\n\n:Usage: snooze [options] clock_id\n\n"
|
16
|
+
|
17
|
+
# Define the options, and what they do
|
18
|
+
options[:verbose] = false
|
19
|
+
opts.on( '-v', '--verbose', 'Output more information' ) do
|
20
|
+
options[:verbose] = true
|
21
|
+
end
|
22
|
+
|
23
|
+
options[:dry_run] = false
|
24
|
+
opts.on( '-d', '--dry-run', 'Go through all the normal steps, but not actually Snooze anything.' ) do
|
25
|
+
options[:dry_run] = true
|
26
|
+
end
|
27
|
+
|
28
|
+
opts.on( '-h', '--help', 'Display this screen' ) do
|
29
|
+
puts opts
|
30
|
+
exit
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
optparse.parse!
|
35
|
+
if ARGV.empty? || ARGV.length != 1
|
36
|
+
puts optparse
|
37
|
+
exit(-1)
|
38
|
+
end
|
39
|
+
|
40
|
+
clock_id = ARGV[0]
|
41
|
+
|
42
|
+
require 'snooze'
|
43
|
+
snooze_instance = Snooze::Button.new(clock_id, options)
|
44
|
+
exit(snooze_instance.snooze!)
|
data/lib/snooze.rb
CHANGED
@@ -1,7 +1,14 @@
|
|
1
1
|
module Snooze
|
2
2
|
# The current version of snooze.
|
3
3
|
# Do not change the value by hand; it will be updated automatically by the gem release script.
|
4
|
-
VERSION = "0.
|
4
|
+
VERSION = "1.0.0"
|
5
|
+
|
6
|
+
API_HOST = 'https://api.snooze.io'
|
7
|
+
API_PATH = 'api'
|
5
8
|
end
|
6
9
|
|
7
|
-
|
10
|
+
require 'faraday'
|
11
|
+
require 'uri'
|
12
|
+
require 'snooze/connection_error'
|
13
|
+
require 'snooze/button'
|
14
|
+
require 'snooze/post'
|
@@ -0,0 +1,53 @@
|
|
1
|
+
class Snooze::Button
|
2
|
+
|
3
|
+
attr_reader :dry_run, :clock_id, :method, :verbose
|
4
|
+
|
5
|
+
def initialize(clock_id, options = {})
|
6
|
+
@clock_id = clock_id
|
7
|
+
@dry_run = options[:dry_run] || false
|
8
|
+
@method = :snooze!
|
9
|
+
@verbose = options[:verbose] || false
|
10
|
+
|
11
|
+
if @dry_run
|
12
|
+
@method = :ping!
|
13
|
+
@verbose = true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Send snooze! or ping! to Snooze
|
18
|
+
def snooze!
|
19
|
+
log "Sending #{@method} to Snooze.io"
|
20
|
+
handle_post_response { Snooze::Post.send(@method, @clock_id) }
|
21
|
+
end
|
22
|
+
|
23
|
+
# With backtrace capturing do
|
24
|
+
def with_backtrace(&block)
|
25
|
+
begin
|
26
|
+
log "Yielding backtrace block"
|
27
|
+
yield if block_given?
|
28
|
+
Snooze::Post.snooze!
|
29
|
+
rescue Exception => detail
|
30
|
+
handle_post_response { Snooze::Post.exception!(@clock_id, detail.backtrace.join("\n ")) }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
# Handle a post response
|
36
|
+
# The block given should be a Snooze::Post class function.
|
37
|
+
def handle_post_response(&block)
|
38
|
+
exit_code = 1
|
39
|
+
begin
|
40
|
+
response = yield
|
41
|
+
exit_code = 0 if response.success?
|
42
|
+
log "Error: Snooze returned status error #{response.status}" unless response.success?
|
43
|
+
log "Snooze returned status message: #{response.body}" if @verbose
|
44
|
+
rescue Snooze::ConnectionError
|
45
|
+
log "Error: Snooze server is unreachable"
|
46
|
+
end
|
47
|
+
exit_code
|
48
|
+
end
|
49
|
+
|
50
|
+
def log(msg)
|
51
|
+
puts msg if @verbose
|
52
|
+
end
|
53
|
+
end
|
data/lib/snooze/post.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
class Snooze::Post
|
2
|
+
|
3
|
+
# Setup the api host URI for the given action
|
4
|
+
def self.generate_uri_from_action(action)
|
5
|
+
URI.parse("#{Snooze::API_HOST}/#{Snooze::API_PATH}/#{action}")
|
6
|
+
end
|
7
|
+
|
8
|
+
# Setup the connection
|
9
|
+
def self.setup_connection(uri)
|
10
|
+
::Faraday.new(:url => uri)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Execute an HTTP post
|
14
|
+
def self.execute!(action, post_body, retries = 4)
|
15
|
+
uri = self.generate_uri_from_action(action)
|
16
|
+
response = nil
|
17
|
+
|
18
|
+
begin
|
19
|
+
connection = self.setup_connection(uri)
|
20
|
+
|
21
|
+
response = connection.post uri.path do |request|
|
22
|
+
request.headers['Content-Type'] = 'application/json'
|
23
|
+
request.options[:timeout] = 5
|
24
|
+
request.options[:open_timeout] = 2
|
25
|
+
request.body = post_body
|
26
|
+
end
|
27
|
+
|
28
|
+
raise Faraday::Error::ConnectionFailed.new('') if response.status == 500
|
29
|
+
rescue Faraday::Error::TimeoutError, Faraday::Error::ConnectionFailed, Faraday::Error::ClientError, Faraday::Error => e
|
30
|
+
raise Snooze::ConnectionError if retries <= 0
|
31
|
+
sleep_for_a_while(5 - retries)
|
32
|
+
response = self.execute!(action, post_body, retries-1)
|
33
|
+
end
|
34
|
+
|
35
|
+
response
|
36
|
+
end
|
37
|
+
|
38
|
+
# Ping Snooze
|
39
|
+
def self.ping!(clock_id)
|
40
|
+
self.execute!('ping', "{ \"id\":\"#{clock_id}\" }" )
|
41
|
+
end
|
42
|
+
|
43
|
+
# Snooze an alarm
|
44
|
+
def self.snooze!(clock_id)
|
45
|
+
self.execute!('snooze', "{ \"id\":\"#{clock_id}\" }")
|
46
|
+
end
|
47
|
+
|
48
|
+
# Pass an exception backtrace to Snooze
|
49
|
+
def self.exception!(clock_id, backtrace="")
|
50
|
+
self.execute!('exception', "{ \"id\":\"#{clock_id}\", \"backtrace\":\"#{backtrace}\" }")
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
def self.sleep_for_a_while(seconds)
|
55
|
+
sleep(seconds)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
data/snooze.gemspec
CHANGED
@@ -2,8 +2,8 @@ Gem::Specification.new do |s|
|
|
2
2
|
s.name = "snooze"
|
3
3
|
|
4
4
|
# Do not set the version and date field manually, this is done by the release script
|
5
|
-
s.version = "0.
|
6
|
-
s.date = "2013-03
|
5
|
+
s.version = "1.0.0"
|
6
|
+
s.date = "2013-05-03"
|
7
7
|
|
8
8
|
s.bindir = 'bin'
|
9
9
|
s.executables = ['snooze']
|
@@ -19,8 +19,12 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.rdoc_options << '--title' << s.name << '--main' << 'README.rdoc' << '--line-numbers' << '--inline-source'
|
20
20
|
s.extra_rdoc_files = ['README.rdoc']
|
21
21
|
|
22
|
+
s.add_dependency('faraday')
|
23
|
+
|
22
24
|
s.add_development_dependency('rake')
|
23
25
|
s.add_development_dependency('rspec', '~> 2.8')
|
26
|
+
s.add_development_dependency('guard-rspec')
|
27
|
+
s.add_development_dependency('rb-fsevent')
|
24
28
|
|
25
29
|
s.authors = ['Bart ten Brinke']
|
26
30
|
s.email = ['contact@snooze.io']
|
@@ -28,6 +32,6 @@ Gem::Specification.new do |s|
|
|
28
32
|
|
29
33
|
# The files and test_files directives are set automatically by the release script.
|
30
34
|
# Do not change them by hand, but make sure to add the files to the git repository.
|
31
|
-
s.files = %w(.gitignore Gemfile Gemfile.lock LICENSE README.rdoc Rakefile bin/snooze lib/snooze.rb snooze.gemspec spec/spec_helper.rb tasks/github-gem.rake)
|
32
|
-
s.test_files = %w()
|
35
|
+
s.files = %w(.gitignore .travis.yml Gemfile Gemfile.lock Guardfile LICENSE README.rdoc Rakefile bin/snooze lib/snooze.rb lib/snooze/button.rb lib/snooze/connection_error.rb lib/snooze/post.rb snooze.gemspec spec/spec_helper.rb spec/unit/button_spec.rb spec/unit/post_spec.rb tasks/github-gem.rake)
|
36
|
+
s.test_files = %w(spec/unit/button_spec.rb spec/unit/post_spec.rb)
|
33
37
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -7,4 +7,12 @@ require 'snooze'
|
|
7
7
|
# Include all files in the spec_helper directory
|
8
8
|
Dir[File.dirname(__FILE__) + "/lib/**/*.rb"].each do |file|
|
9
9
|
require file
|
10
|
+
end
|
11
|
+
|
12
|
+
RSpec.configure do |config|
|
13
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
14
|
+
config.run_all_when_everything_filtered = true
|
15
|
+
config.color_enabled = true
|
16
|
+
config.filter_run :focus
|
17
|
+
config.order = 'random'
|
10
18
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Snooze::Button, 'button' do
|
4
|
+
let (:button) { Snooze::Button.new('8765-1234') }
|
5
|
+
let (:response) { Faraday::Response.new(:status => 200)}
|
6
|
+
|
7
|
+
it "should initialize a dry run correctly" do
|
8
|
+
dry_button = Snooze::Button.new('8765-1234', :dry_run => true)
|
9
|
+
dry_button.dry_run.should == true
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should capture the clock id" do
|
13
|
+
button.clock_id.should == '8765-1234'
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should call ping! if dry run" do
|
17
|
+
button = Snooze::Button.new('8765-1234', :dry_run => true)
|
18
|
+
Snooze::Post.should_receive(:ping!).once.and_return(response)
|
19
|
+
button.snooze!
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should support with_backtrace_do" do
|
23
|
+
Snooze::Post.should_receive(:exception!).once.and_return(response)
|
24
|
+
button.with_backtrace do
|
25
|
+
raise 'terrible exception!'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "snooze! status code handling" do
|
30
|
+
it "should support 200" do
|
31
|
+
Snooze::Post.should_receive(:snooze!).once.and_return(response)
|
32
|
+
button.snooze!.should == 0
|
33
|
+
end
|
34
|
+
|
35
|
+
[500,404,403,100].each do |status_code|
|
36
|
+
it "should support #{status_code}" do
|
37
|
+
Snooze::Post.should_receive(:snooze!).once.and_return( Faraday::Response.new(:status => status_code) )
|
38
|
+
button.snooze!.should == 1
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Snooze::Post do
|
4
|
+
let (:test_connection) {
|
5
|
+
Faraday.new do |builder|
|
6
|
+
builder.adapter :test do |stub|
|
7
|
+
stub.post('api/action') { [200, {}, ''] }
|
8
|
+
stub.post('api/ping') { [200, {:id=>"1234-5678"}, ''] }
|
9
|
+
stub.post('api/snooze') { [200, {:id=>"1234-5678"}, ''] }
|
10
|
+
stub.post('api/exception') { [200, {:id=>"1234-5678", :backtrace => "error\nwith\newlines"}, ''] }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
}
|
14
|
+
|
15
|
+
it "should generate the correct path" do
|
16
|
+
Snooze::Post.generate_uri_from_action('test').to_s.should == 'https://api.snooze.io/api/test'
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should setup a faraday connection" do
|
20
|
+
connection = Snooze::Post.setup_connection('http://www.example.com/')
|
21
|
+
connection.is_a?(::Faraday::Connection).should be_true
|
22
|
+
connection.url_prefix.to_s.should == 'http://www.example.com/'
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should post to an action URL" do
|
26
|
+
Snooze::Post.stub!(:setup_connection).and_return(test_connection)
|
27
|
+
|
28
|
+
response = Snooze::Post.execute!('action', {:test_data => true})
|
29
|
+
response.status.should == 200
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'ping' do
|
33
|
+
it "should post to the ping URL" do
|
34
|
+
Snooze::Post.stub!(:setup_connection).and_return(test_connection)
|
35
|
+
response = Snooze::Post.ping!('1234-5678')
|
36
|
+
response.status.should == 200
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should handle unkown clock_ids" do
|
40
|
+
test_connection = Faraday.new do |builder|
|
41
|
+
builder.adapter :test do |stub|
|
42
|
+
stub.post('api/ping') { [404, {:id=>"1234-5679"}, ''] }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
Snooze::Post.stub!(:setup_connection).and_return(test_connection)
|
47
|
+
response = Snooze::Post.ping!('1234-5679')
|
48
|
+
response.status.should == 404
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe 'snooze' do
|
53
|
+
it "should post to the snooze URL" do
|
54
|
+
Snooze::Post.stub!(:setup_connection).and_return(test_connection)
|
55
|
+
response = Snooze::Post.snooze!('1234-5678')
|
56
|
+
response.status.should == 200
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should handle unkown clock_ids" do
|
60
|
+
test_connection = Faraday.new do |builder|
|
61
|
+
builder.adapter :test do |stub|
|
62
|
+
stub.post('api/snooze') { [404, {:id=>"1234-5679"}, ''] }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
Snooze::Post.stub!(:setup_connection).and_return(test_connection)
|
67
|
+
response = Snooze::Post.snooze!('1234-5679')
|
68
|
+
response.status.should == 404
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe 'exception' do
|
73
|
+
it "should post a backtrace to the snooze URL" do
|
74
|
+
Snooze::Post.stub!(:setup_connection).and_return(test_connection)
|
75
|
+
response = Snooze::Post.exception!('1234-5678', "error\nwith\newlines")
|
76
|
+
response.status.should == 200
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should handle unkown clock_ids" do
|
80
|
+
test_connection = Faraday.new do |builder|
|
81
|
+
builder.adapter :test do |stub|
|
82
|
+
stub.post('api/exception') { [404, {:id=>"1234-5679", :backtrace => "error\nwith\newlines"}, ''] }
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
Snooze::Post.stub!(:setup_connection).and_return(test_connection)
|
87
|
+
response = Snooze::Post.exception!('1234-5679', "error\nwith\newlines")
|
88
|
+
response.status.should == 404
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe 'execute!' do
|
93
|
+
it "should retry five times" do
|
94
|
+
exception = Faraday::Error::TimeoutError.new('')
|
95
|
+
Snooze::Post.stub!(:setup_connection).and_raise(exception)
|
96
|
+
Snooze::Post.stub!(:sleep_for_a_while).and_return(true)
|
97
|
+
Snooze::Post.should_receive(:execute!).exactly(5).times.and_call_original
|
98
|
+
expect { Snooze::Post.execute!('noop', {:a => 'b'}) }.to raise_error(Snooze::ConnectionError)
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: snooze
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03
|
12
|
+
date: 2013-05-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: faraday
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
14
30
|
- !ruby/object:Gem::Dependency
|
15
31
|
name: rake
|
16
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -43,6 +59,38 @@ dependencies:
|
|
43
59
|
- - ~>
|
44
60
|
- !ruby/object:Gem::Version
|
45
61
|
version: '2.8'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: guard-rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rb-fsevent
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
46
94
|
description: ! " For devops who run recurring jobs like rake tasks or bas scripts,\n
|
47
95
|
\ Snooze.io is a notification service that tells you when something is wrong.\n
|
48
96
|
\ Unlike just alerting when a job breaks, Snooze also alerts when a job did not
|
@@ -56,15 +104,22 @@ extra_rdoc_files:
|
|
56
104
|
- README.rdoc
|
57
105
|
files:
|
58
106
|
- .gitignore
|
107
|
+
- .travis.yml
|
59
108
|
- Gemfile
|
60
109
|
- Gemfile.lock
|
110
|
+
- Guardfile
|
61
111
|
- LICENSE
|
62
112
|
- README.rdoc
|
63
113
|
- Rakefile
|
64
114
|
- bin/snooze
|
65
115
|
- lib/snooze.rb
|
116
|
+
- lib/snooze/button.rb
|
117
|
+
- lib/snooze/connection_error.rb
|
118
|
+
- lib/snooze/post.rb
|
66
119
|
- snooze.gemspec
|
67
120
|
- spec/spec_helper.rb
|
121
|
+
- spec/unit/button_spec.rb
|
122
|
+
- spec/unit/post_spec.rb
|
68
123
|
- tasks/github-gem.rake
|
69
124
|
homepage: http://snooze.io
|
70
125
|
licenses: []
|
@@ -84,12 +139,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
84
139
|
- - ! '>='
|
85
140
|
- !ruby/object:Gem::Version
|
86
141
|
version: '0'
|
142
|
+
segments:
|
143
|
+
- 0
|
144
|
+
hash: 2415208834990755493
|
87
145
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
146
|
none: false
|
89
147
|
requirements:
|
90
148
|
- - ! '>='
|
91
149
|
- !ruby/object:Gem::Version
|
92
150
|
version: '0'
|
151
|
+
segments:
|
152
|
+
- 0
|
153
|
+
hash: 2415208834990755493
|
93
154
|
requirements: []
|
94
155
|
rubyforge_project:
|
95
156
|
rubygems_version: 1.8.24
|
@@ -97,4 +158,6 @@ signing_key:
|
|
97
158
|
specification_version: 3
|
98
159
|
summary: A command line tool to inform the webservice at snooze.io that a job has
|
99
160
|
run.
|
100
|
-
test_files:
|
161
|
+
test_files:
|
162
|
+
- spec/unit/button_spec.rb
|
163
|
+
- spec/unit/post_spec.rb
|