uptime_monitor 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.travis.yml +7 -0
- data/Gemfile +19 -0
- data/Gemfile.lock +102 -0
- data/LICENSE +20 -0
- data/README.md +110 -0
- data/Rakefile +61 -0
- data/VERSION +1 -0
- data/lib/uptime_monitor.rb +13 -0
- data/lib/uptime_monitor/browser.rb +144 -0
- data/lib/uptime_monitor/browser_reader.rb +41 -0
- data/lib/uptime_monitor/uptime_monitor.rb +62 -0
- data/spec/browser_reader_spec.rb +40 -0
- data/spec/browser_spec.rb +170 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/uptime_monitor_spec.rb +69 -0
- metadata +210 -0
data/.document
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
# Add dependencies required to use your gem here.
|
3
|
+
# Example:
|
4
|
+
# gem "activesupport", ">= 2.3.5"
|
5
|
+
gem 'headless'
|
6
|
+
gem 'watir-webdriver'
|
7
|
+
gem 'watir-webdriver-performance'
|
8
|
+
gem 'activesupport'
|
9
|
+
|
10
|
+
# Add dependencies to develop your gem here.
|
11
|
+
# Include everything needed to run rake, tests, features, etc.
|
12
|
+
group :development do
|
13
|
+
gem "rspec"
|
14
|
+
gem "rdoc", "~> 3.12"
|
15
|
+
gem "bundler", "~> 1.0"
|
16
|
+
gem "jeweler", "~> 1.8.7"
|
17
|
+
#gem "rcov", ">= 0"
|
18
|
+
gem "pry"
|
19
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
activesupport (4.0.2)
|
5
|
+
i18n (~> 0.6, >= 0.6.4)
|
6
|
+
minitest (~> 4.2)
|
7
|
+
multi_json (~> 1.3)
|
8
|
+
thread_safe (~> 0.1)
|
9
|
+
tzinfo (~> 0.3.37)
|
10
|
+
addressable (2.3.5)
|
11
|
+
atomic (1.1.14)
|
12
|
+
builder (3.2.2)
|
13
|
+
childprocess (0.4.0)
|
14
|
+
ffi (~> 1.0, >= 1.0.11)
|
15
|
+
coderay (1.1.0)
|
16
|
+
diff-lcs (1.2.4)
|
17
|
+
faraday (0.8.8)
|
18
|
+
multipart-post (~> 1.2.0)
|
19
|
+
ffi (1.9.3)
|
20
|
+
git (1.2.6)
|
21
|
+
github_api (0.10.1)
|
22
|
+
addressable
|
23
|
+
faraday (~> 0.8.1)
|
24
|
+
hashie (>= 1.2)
|
25
|
+
multi_json (~> 1.4)
|
26
|
+
nokogiri (~> 1.5.2)
|
27
|
+
oauth2
|
28
|
+
hashie (2.0.5)
|
29
|
+
headless (1.0.1)
|
30
|
+
highline (1.6.20)
|
31
|
+
httpauth (0.2.0)
|
32
|
+
i18n (0.6.9)
|
33
|
+
jeweler (1.8.8)
|
34
|
+
builder
|
35
|
+
bundler (~> 1.0)
|
36
|
+
git (>= 1.2.5)
|
37
|
+
github_api (= 0.10.1)
|
38
|
+
highline (>= 1.6.15)
|
39
|
+
nokogiri (= 1.5.10)
|
40
|
+
rake
|
41
|
+
rdoc
|
42
|
+
json (1.8.1)
|
43
|
+
jwt (0.1.8)
|
44
|
+
multi_json (>= 1.5)
|
45
|
+
method_source (0.8.2)
|
46
|
+
minitest (4.7.5)
|
47
|
+
multi_json (1.8.2)
|
48
|
+
multi_xml (0.5.5)
|
49
|
+
multipart-post (1.2.0)
|
50
|
+
nokogiri (1.5.10)
|
51
|
+
oauth2 (0.9.2)
|
52
|
+
faraday (~> 0.8)
|
53
|
+
httpauth (~> 0.2)
|
54
|
+
jwt (~> 0.1.4)
|
55
|
+
multi_json (~> 1.0)
|
56
|
+
multi_xml (~> 0.5)
|
57
|
+
rack (~> 1.2)
|
58
|
+
pry (0.9.12.4)
|
59
|
+
coderay (~> 1.0)
|
60
|
+
method_source (~> 0.8)
|
61
|
+
slop (~> 3.4)
|
62
|
+
rack (1.5.2)
|
63
|
+
rake (10.1.0)
|
64
|
+
rdoc (3.12.2)
|
65
|
+
json (~> 1.4)
|
66
|
+
rspec (2.14.1)
|
67
|
+
rspec-core (~> 2.14.0)
|
68
|
+
rspec-expectations (~> 2.14.0)
|
69
|
+
rspec-mocks (~> 2.14.0)
|
70
|
+
rspec-core (2.14.6)
|
71
|
+
rspec-expectations (2.14.3)
|
72
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
73
|
+
rspec-mocks (2.14.4)
|
74
|
+
rubyzip (1.1.0)
|
75
|
+
selenium-webdriver (2.39.0)
|
76
|
+
childprocess (>= 0.2.5)
|
77
|
+
multi_json (~> 1.0)
|
78
|
+
rubyzip (~> 1.0)
|
79
|
+
websocket (~> 1.0.4)
|
80
|
+
slop (3.4.7)
|
81
|
+
thread_safe (0.1.3)
|
82
|
+
atomic
|
83
|
+
tzinfo (0.3.38)
|
84
|
+
watir-webdriver (0.6.6)
|
85
|
+
selenium-webdriver (>= 2.18.0)
|
86
|
+
watir-webdriver-performance (0.2.3)
|
87
|
+
watir-webdriver
|
88
|
+
websocket (1.0.7)
|
89
|
+
|
90
|
+
PLATFORMS
|
91
|
+
ruby
|
92
|
+
|
93
|
+
DEPENDENCIES
|
94
|
+
activesupport
|
95
|
+
bundler (~> 1.0)
|
96
|
+
headless
|
97
|
+
jeweler (~> 1.8.7)
|
98
|
+
pry
|
99
|
+
rdoc (~> 3.12)
|
100
|
+
rspec
|
101
|
+
watir-webdriver
|
102
|
+
watir-webdriver-performance
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2014 Obi Akubue
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
7
|
+
the Software without restriction, including without limitation the rights to
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
uptime_monitor (Hercules)
|
2
|
+
==========================
|
3
|
+
[![Build Status](https://travis-ci.org/obi-a/uptime_monitor.png?branch=master)](https://travis-ci.org/obi-a/uptime_monitor)
|
4
|
+
|
5
|
+
Using a real web browser, this plugin checks pages of a website at the specified time intervals, to ensure that the specified elements of the pages and features of the site are still working correctly.
|
6
|
+
|
7
|
+
##Specification:
|
8
|
+
|
9
|
+
<pre lang="ruby">
|
10
|
+
monitor = {monitor: "My Website",
|
11
|
+
url: "http://mysite.com",
|
12
|
+
every: "5m",
|
13
|
+
contact: "admin@mail.com",
|
14
|
+
via: "email_notifier",
|
15
|
+
plugin: "uptime_monitor",
|
16
|
+
exists?: [
|
17
|
+
[:title, [text: "Welcome to my site"]],
|
18
|
+
[{div: {id:"test", class: "test-section"}}, [text: "this is a test"]],
|
19
|
+
[a: {href: "/aboutus" }],
|
20
|
+
[:h1],
|
21
|
+
[:h2,[text: "Login"]],
|
22
|
+
[form: {action: "/signup", method: "get"}],
|
23
|
+
[{element: {css: "#submit-button"}}, [:click]],
|
24
|
+
[{text_field: {id: "username"}}, [set: "admin"]],
|
25
|
+
[{text_field: {id: "password"}}, [set: "pass"]],
|
26
|
+
[link: {text: "Contact Us"}],
|
27
|
+
[wait_until_exists?: [div: {id:"open-section"}]]
|
28
|
+
],
|
29
|
+
browser: ["firefox", headless: true]
|
30
|
+
}
|
31
|
+
ragios.add [monitor]
|
32
|
+
</pre>
|
33
|
+
|
34
|
+
###Monitor login process of a real site
|
35
|
+
<pre lang="ruby">
|
36
|
+
login_process = [
|
37
|
+
[:title, [text: "Website Uptime Monitoring | SouthMunn.com"]],
|
38
|
+
[{link: {text:"Login"}}, [:click]],
|
39
|
+
[:title, [text: "Sign in - Website Uptime Monitoring | SouthMunn.com"]],
|
40
|
+
[{text_field: {id: "username"}}, [set: "admin"]],
|
41
|
+
[{text_field: {id: "password"}}, [set: "pass"]],
|
42
|
+
[:button, [:click]],
|
43
|
+
[:title, [text: "Dashboard - Website Uptime Monitoring | SouthMunn.com"]]
|
44
|
+
]
|
45
|
+
|
46
|
+
monitor = {monitor: "My Website",
|
47
|
+
url: "https:/southmunn.com",
|
48
|
+
every: "5m",
|
49
|
+
contact: "admin@mail.com",
|
50
|
+
via: "email_notifier",
|
51
|
+
plugin: "uptime_monitor",
|
52
|
+
exists?: login_process,
|
53
|
+
browser: ["firefox", headless: true]
|
54
|
+
}
|
55
|
+
ragios.add [monitor]
|
56
|
+
</pre>
|
57
|
+
|
58
|
+
###Real site test:
|
59
|
+
<pre lang="ruby">
|
60
|
+
monitor = {monitor: "About Us page",
|
61
|
+
url: "https://www.southmunn.com/aboutus",
|
62
|
+
browser: ["firefox", headless: false],
|
63
|
+
exists?: [
|
64
|
+
[{div: {class: "box_content"}}, [includes_text: "SouthMunn is a Website Uptime Monitoring SASS created and maintained by"]],
|
65
|
+
[img: {src: "https://fc03.deviantart.net/fs14/f/2007/047/f/2/Street_Addiction_by_gizmodus.jpg"}],
|
66
|
+
],
|
67
|
+
}
|
68
|
+
|
69
|
+
u = Ragios::Plugin::UptimeMonitor.new
|
70
|
+
u.init monitor
|
71
|
+
u.test_command?
|
72
|
+
#=> true
|
73
|
+
u.test_result
|
74
|
+
#=> {[{:div=>{:class=>"box_content"}},
|
75
|
+
# [{:includes_text=>
|
76
|
+
# "SouthMunn is a Website Uptime Monitoring SASS created and maintained by"}]]=>
|
77
|
+
# :exists_as_expected,
|
78
|
+
# [{:img=>
|
79
|
+
# {:src=>
|
80
|
+
# "https://fc03.deviantart.net/fs14/f/2007/047/f/2/Street_Addiction_by_gizmodus.jpg"}}]=>
|
81
|
+
# :exists_as_expected}
|
82
|
+
|
83
|
+
|
84
|
+
#test result during downtime
|
85
|
+
u.test_command?
|
86
|
+
#=> false
|
87
|
+
u.test_result
|
88
|
+
#=> {[{:div=>{:class=>"box_content"}},
|
89
|
+
# [{:includes_text=>
|
90
|
+
# "SouthMunn is a Website Uptime Monitoring SASS created and maintained by"}]]=>
|
91
|
+
# :does_not_exist_as_expected,
|
92
|
+
# [{:img=>
|
93
|
+
# {:src=>
|
94
|
+
# "https://fc03.deviantart.net/fs14/f/2007/047/f/2/Street_Addiction_by_gizmodus.jpg"}}]=>
|
95
|
+
# :does_not_exist_as_expected}
|
96
|
+
</pre>
|
97
|
+
|
98
|
+
###Supported browsers:
|
99
|
+
Firefox, Chrome, Safari, Phantomjs
|
100
|
+
|
101
|
+
### Browser Format:
|
102
|
+
<pre lang="ruby">
|
103
|
+
browser: ["firefox", headless: true]
|
104
|
+
browser: ["firefox", headless: false]
|
105
|
+
browser: ["firefox"]
|
106
|
+
browser: ["chrome"]
|
107
|
+
</pre>
|
108
|
+
Running a browser headless requires xvfb installed.
|
109
|
+
|
110
|
+
###More details coming soon
|
data/Rakefile
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
begin
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
rescue Bundler::BundlerError => e
|
8
|
+
$stderr.puts e.message
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
+
exit e.status_code
|
11
|
+
end
|
12
|
+
require 'rake'
|
13
|
+
|
14
|
+
require 'jeweler'
|
15
|
+
Jeweler::Tasks.new do |gem|
|
16
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
+
gem.name = "uptime_monitor"
|
18
|
+
gem.homepage = "http://github.com/obi-a/uptime_monitor"
|
19
|
+
gem.license = "MIT"
|
20
|
+
gem.summary = %Q{Real browser website uptime monitoring plugin for Ragios}
|
21
|
+
gem.description = %Q{Uses a real web browser to monitor a web app for uptime}
|
22
|
+
gem.email = "obioraakubue@yahoo.com"
|
23
|
+
gem.authors = ["obi-a"]
|
24
|
+
# dependencies defined in Gemfile
|
25
|
+
end
|
26
|
+
Jeweler::RubygemsDotOrgTasks.new
|
27
|
+
|
28
|
+
require 'rake/testtask'
|
29
|
+
Rake::TestTask.new(:test) do |test|
|
30
|
+
test.libs << 'lib' << 'test'
|
31
|
+
test.pattern = 'test/**/test_*.rb'
|
32
|
+
test.verbose = true
|
33
|
+
end
|
34
|
+
|
35
|
+
#require 'rcov/rcovtask'
|
36
|
+
#Rcov::RcovTask.new do |test|
|
37
|
+
# test.libs << 'test'
|
38
|
+
# test.pattern = 'test/**/test_*.rb'
|
39
|
+
# test.verbose = true
|
40
|
+
# test.rcov_opts << '--exclude "gems/*"'
|
41
|
+
#end
|
42
|
+
|
43
|
+
task :repl do
|
44
|
+
uptime_monitor_file = File.expand_path(File.join(File.dirname(__FILE__), '..', 'uptime_monitor/lib/uptime_monitor'))
|
45
|
+
irb = "bundle exec pry -r #{uptime_monitor_file}"
|
46
|
+
sh irb
|
47
|
+
end
|
48
|
+
|
49
|
+
task :r => :repl
|
50
|
+
|
51
|
+
task :default => :test
|
52
|
+
|
53
|
+
require 'rdoc/task'
|
54
|
+
Rake::RDocTask.new do |rdoc|
|
55
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
56
|
+
|
57
|
+
rdoc.rdoc_dir = 'rdoc'
|
58
|
+
rdoc.title = "uptime_monitor #{version}"
|
59
|
+
rdoc.rdoc_files.include('README*')
|
60
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
61
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'headless'
|
2
|
+
require 'watir-webdriver'
|
3
|
+
require 'watir-webdriver-performance'
|
4
|
+
require 'ostruct'
|
5
|
+
require 'active_support'
|
6
|
+
|
7
|
+
def require_all(path)
|
8
|
+
Dir.glob(File.dirname(__FILE__) + path + '/*.rb') do |file|
|
9
|
+
require File.dirname(__FILE__) + path + '/' + File.basename(file, File.extname(file))
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
require_all '/uptime_monitor'
|
@@ -0,0 +1,144 @@
|
|
1
|
+
module Hercules
|
2
|
+
module UptimeMonitor
|
3
|
+
class Browser
|
4
|
+
def initialize(url, browser_name = "firefox", is_headless = false)
|
5
|
+
start_headless if is_headless
|
6
|
+
goto(url,browser_name)
|
7
|
+
end
|
8
|
+
def close
|
9
|
+
@browser.close
|
10
|
+
@headless.destroy if @headless
|
11
|
+
end
|
12
|
+
def rest(page_element)
|
13
|
+
page_element[1..-1]
|
14
|
+
end
|
15
|
+
def exists?(page_element)
|
16
|
+
message = "Invalid page element format: #{page_element.inspect}"
|
17
|
+
raise(Hercules::UptimeMonitor::InvalidPageElementForm.new(error: message), message) unless page_element.is_a?(Array)
|
18
|
+
is_wait_until?(page_element.first) ? apply_wait_until?(page_element.first[:wait_until_exists?]) : page_element_exists?(page_element)
|
19
|
+
end
|
20
|
+
def page_element_exists?(page_element)
|
21
|
+
element = get_element(page_element.first)
|
22
|
+
begin
|
23
|
+
first_exists = element.exists?
|
24
|
+
rescue Exception => e
|
25
|
+
message = "Cannot find page element in this form: #{page_element.first.inspect}, you may use a css query form"
|
26
|
+
raise(Hercules::UptimeMonitor::UnknownPageElement.new(error: message), message)
|
27
|
+
end
|
28
|
+
if first_exists && !rest(page_element).empty?
|
29
|
+
rest_exists?(element, rest(page_element))
|
30
|
+
else
|
31
|
+
first_exists
|
32
|
+
end
|
33
|
+
end
|
34
|
+
def get_element(first)
|
35
|
+
if first.is_a? Symbol
|
36
|
+
@browser.send(first)
|
37
|
+
elsif first.is_a? Hash
|
38
|
+
key, value = first.first
|
39
|
+
@browser.send(key, value)
|
40
|
+
else
|
41
|
+
message = "Invalid page element #{first.inspect}"
|
42
|
+
raise(Hercules::UptimeMonitor::InvalidPageElement.new(error: message), message)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
def rest_exists?(element, array)
|
46
|
+
results = array.map { |e| apply_rest?(element, e) }
|
47
|
+
results.include?(false) ? false : true
|
48
|
+
end
|
49
|
+
def apply_rest?(element, array)
|
50
|
+
if is_a_text?(array)
|
51
|
+
apply_text?(element.text, array.first)
|
52
|
+
elsif is_an_action?(array)
|
53
|
+
apply_action?(element, array.first)
|
54
|
+
else
|
55
|
+
message = "Invalid options: #{array.inspect}"
|
56
|
+
raise(Hercules::UptimeMonitor::InvalidRest.new(error: message), message)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
def is_a_text?(text_array)
|
60
|
+
if text_array.is_a? Array
|
61
|
+
if text_array.first.is_a? Hash
|
62
|
+
text_hash = text_array.first
|
63
|
+
key, value = text_hash.first
|
64
|
+
if (([:text, :includes_text].include?(key)) && (value.is_a? String))
|
65
|
+
return true
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
return false
|
70
|
+
end
|
71
|
+
def is_an_action?(array)
|
72
|
+
if array.is_a? Array
|
73
|
+
if array.first.is_a?(Symbol) || array.first.is_a?(Hash)
|
74
|
+
return true
|
75
|
+
end
|
76
|
+
end
|
77
|
+
return false
|
78
|
+
end
|
79
|
+
def is_wait_until?(hash)
|
80
|
+
return false unless hash.is_a? Hash
|
81
|
+
key, value = hash.first
|
82
|
+
key == :wait_until_exists?
|
83
|
+
end
|
84
|
+
def apply_text?(assert_eq_text, text_hash)
|
85
|
+
if text_hash[:text]
|
86
|
+
text_hash[:text] == assert_eq_text
|
87
|
+
elsif text_hash[:includes_text]
|
88
|
+
assert_eq_text.include? text_hash[:includes_text]
|
89
|
+
else
|
90
|
+
message = "Could not evaluate page_element text: #{text_hash.inspect}"
|
91
|
+
raise(Hercules::UptimeMonitor::InvalidText.new(error: message), message)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
def apply_action?(element, action)
|
95
|
+
if action.is_a? Symbol
|
96
|
+
element.send(action)
|
97
|
+
elsif action.is_a? Hash
|
98
|
+
key, value = action.first
|
99
|
+
element.send(key, value)
|
100
|
+
else
|
101
|
+
message = "Cannot apply action: #{action.inspect}"
|
102
|
+
raise(Hercules::UptimeMonitor::InvalidAction.new(error: message), message)
|
103
|
+
end
|
104
|
+
true
|
105
|
+
end
|
106
|
+
def apply_wait_until?(page_element)
|
107
|
+
Watir::Wait.until { page_element_exists?(page_element) }
|
108
|
+
true
|
109
|
+
rescue Watir::Wait::TimeoutError
|
110
|
+
false
|
111
|
+
end
|
112
|
+
private
|
113
|
+
def goto(url, browser_name)
|
114
|
+
@browser = Watir::Browser.new browser_name
|
115
|
+
@browser.goto url
|
116
|
+
end
|
117
|
+
def start_headless
|
118
|
+
@headless = Headless.new
|
119
|
+
@headless.start
|
120
|
+
@headless
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
class String
|
127
|
+
def exists?
|
128
|
+
true
|
129
|
+
end
|
130
|
+
def text
|
131
|
+
self
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
module Hercules
|
136
|
+
module UptimeMonitor
|
137
|
+
class InvalidAction < StandardError; end
|
138
|
+
class InvalidText < StandardError; end
|
139
|
+
class InvalidRest < StandardError; end
|
140
|
+
class InvalidPageElement < StandardError; end
|
141
|
+
class UnknownPageElement < StandardError; end
|
142
|
+
class InvalidPageElementForm < StandardError; end
|
143
|
+
end
|
144
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Hercules
|
2
|
+
module UptimeMonitor
|
3
|
+
class BrowserReader
|
4
|
+
attr_reader :browser
|
5
|
+
attr_reader :browser_name
|
6
|
+
def initialize(browser)
|
7
|
+
@browser = browser
|
8
|
+
@browser_name = eval
|
9
|
+
end
|
10
|
+
def headless
|
11
|
+
@browser[1] ? @browser[1][:headless] : false
|
12
|
+
end
|
13
|
+
private
|
14
|
+
#browser form
|
15
|
+
#["firefox", headless: true]
|
16
|
+
#["firefox", headless: false]
|
17
|
+
#["firefox"]
|
18
|
+
def read
|
19
|
+
message = "Invalid Browser: #{@browser.inspect}"
|
20
|
+
raise(Hercules::UptimeMonitor::InvalidBrowserForm.new(error: message), message) unless @browser.is_a? Array
|
21
|
+
raise(Hercules::UptimeMonitor::InvalidBrowserForm.new(error: message), message) unless @browser.first.is_a? String
|
22
|
+
if browser.length > 1
|
23
|
+
error_message = "Invalid setting for headless browser in #{@browser.inspect}"
|
24
|
+
raise(Hercules::UptimeMonitor::InvalidHeadlessForm.new(error: message), message) unless @browser[1].is_a? Hash
|
25
|
+
raise(Hercules::UptimeMonitor::InvalidHeadlessForm.new(error: message), message) unless [TrueClass, FalseClass].include? @browser[1][:headless].class
|
26
|
+
end
|
27
|
+
end
|
28
|
+
def eval
|
29
|
+
read
|
30
|
+
@browser.first
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module Hercules
|
37
|
+
module UptimeMonitor
|
38
|
+
class InvalidBrowserForm < StandardError; end
|
39
|
+
class InvalidHeadlessForm < StandardError; end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Ragios
|
2
|
+
module Plugin
|
3
|
+
class UptimeMonitor
|
4
|
+
attr_reader :monitor
|
5
|
+
attr_reader :test_result
|
6
|
+
attr_reader :success
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@test_result = ActiveSupport::OrderedHash.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def init(monitor)
|
13
|
+
@monitor = OpenStruct.new(monitor)
|
14
|
+
message = "A url must be provided for uptime_monitor: #{@monitor.monitor}"
|
15
|
+
raise(Hercules::UptimeMonitor::NoUrlProvided.new(error: message), message) if @monitor.url.nil?
|
16
|
+
message = "A browser must be provided for uptime_monitor: #{@monitor.monitor}"
|
17
|
+
raise(Hercules::UptimeMonitor::NoBrowserProvided.new(error: message), message) if @monitor.browser.nil?
|
18
|
+
message = "A validation (exists?) must be provided for uptime_monitor: #{@monitor.monitor}"
|
19
|
+
raise(Hercules::UptimeMonitor::NoValidationProvided.new(error: message), message) if @monitor.exists?.nil?
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_command?
|
23
|
+
@success = true
|
24
|
+
browser_reader = Hercules::UptimeMonitor::BrowserReader.new(@monitor.browser)
|
25
|
+
start_browser(@monitor.url, browser_reader.browser_name, browser_reader.headless)
|
26
|
+
exists(@monitor.exists?)
|
27
|
+
close_browser
|
28
|
+
@success
|
29
|
+
rescue Exception => e
|
30
|
+
close_browser
|
31
|
+
raise e
|
32
|
+
end
|
33
|
+
|
34
|
+
def close_browser
|
35
|
+
@browser.close
|
36
|
+
end
|
37
|
+
|
38
|
+
def start_browser(url, browser_name, headless)
|
39
|
+
@browser = Hercules::UptimeMonitor::Browser.new(url, browser_name, headless)
|
40
|
+
end
|
41
|
+
|
42
|
+
def exists(page_elements)
|
43
|
+
page_elements.each do |page_element|
|
44
|
+
@browser.exists?(page_element) ? result!(page_element, true) : result!(page_element, false)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def result!(page_element, state)
|
49
|
+
@success = state
|
50
|
+
result = state ? {page_element => :exists_as_expected} : {page_element => :does_not_exist_as_expected}
|
51
|
+
@test_result.merge!(result)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
module Hercules
|
57
|
+
module UptimeMonitor
|
58
|
+
class NoUrlProvided < StandardError; end
|
59
|
+
class NoValidationProvided < StandardError; end
|
60
|
+
class NoBrowserProvided < StandardError; end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hercules::UptimeMonitor::BrowserReader do
|
4
|
+
before(:each) do
|
5
|
+
@browser = "safari"
|
6
|
+
end
|
7
|
+
it "reads a browser with no headless option" do
|
8
|
+
reader = Hercules::UptimeMonitor::BrowserReader.new([@browser])
|
9
|
+
reader.browser_name.should == @browser
|
10
|
+
reader.headless.should == false
|
11
|
+
end
|
12
|
+
it "reads a browser with headless false" do
|
13
|
+
browser = [@browser, headless: false]
|
14
|
+
reader = Hercules::UptimeMonitor::BrowserReader.new(browser)
|
15
|
+
reader.browser_name.should == @browser
|
16
|
+
reader.headless.should == false
|
17
|
+
end
|
18
|
+
it "reads a browser with headless true" do
|
19
|
+
browser = [@browser, headless: true]
|
20
|
+
reader = Hercules::UptimeMonitor::BrowserReader.new(browser)
|
21
|
+
reader.browser_name.should == @browser
|
22
|
+
reader.headless.should == true
|
23
|
+
end
|
24
|
+
it "cannot read a browser in wrong form" do
|
25
|
+
browser = 1
|
26
|
+
expect{Hercules::UptimeMonitor::BrowserReader.new(browser)}.to raise_error(Hercules::UptimeMonitor::InvalidBrowserForm)
|
27
|
+
browser = [1]
|
28
|
+
expect{Hercules::UptimeMonitor::BrowserReader.new(browser)}.to raise_error(Hercules::UptimeMonitor::InvalidBrowserForm)
|
29
|
+
browser = [@browser, 1]
|
30
|
+
expect{Hercules::UptimeMonitor::BrowserReader.new(browser)}.to raise_error(Hercules::UptimeMonitor::InvalidHeadlessForm)
|
31
|
+
browser = [@browser, something: :wrong]
|
32
|
+
expect{Hercules::UptimeMonitor::BrowserReader.new(browser)}.to raise_error(Hercules::UptimeMonitor::InvalidHeadlessForm)
|
33
|
+
browser = [@browser, something: true]
|
34
|
+
expect{Hercules::UptimeMonitor::BrowserReader.new(browser)}.to raise_error(Hercules::UptimeMonitor::InvalidHeadlessForm)
|
35
|
+
browser = [@browser, headless: "true"]
|
36
|
+
expect{Hercules::UptimeMonitor::BrowserReader.new(browser)}.to raise_error(Hercules::UptimeMonitor::InvalidHeadlessForm)
|
37
|
+
browser = [@browser, "headless" => true]
|
38
|
+
expect{Hercules::UptimeMonitor::BrowserReader.new(browser)}.to raise_error(Hercules::UptimeMonitor::InvalidHeadlessForm)
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hercules::UptimeMonitor::Browser do
|
4
|
+
before(:all) do
|
5
|
+
url= "http://obi-akubue.org"
|
6
|
+
headless = true
|
7
|
+
browser_name = "firefox"
|
8
|
+
@browser = Hercules::UptimeMonitor::Browser.new(url, browser_name, headless)
|
9
|
+
end
|
10
|
+
it "can wait until a page element exists" do
|
11
|
+
@browser.apply_wait_until?([:title]).should == true
|
12
|
+
end
|
13
|
+
it "times out if the page element never exists after 30 secs" do
|
14
|
+
@browser.apply_wait_until?([{text_field: {id: "abc_dont_exist"}}]).should == false
|
15
|
+
end
|
16
|
+
|
17
|
+
it "can apply an action" do
|
18
|
+
element = @browser.get_element({text_field: {id: "s"}})
|
19
|
+
element.exists?.should == true
|
20
|
+
@browser.apply_action?(element, {set: "github"}).should == true
|
21
|
+
element = @browser.get_element({button: {id: "searchsubmit"}})
|
22
|
+
element.exists?.should == true
|
23
|
+
@browser.apply_action?(element, :click).should == true
|
24
|
+
element = @browser.get_element({link: {text:"Obi Akubue"}})
|
25
|
+
element.exists?.should == true
|
26
|
+
@browser.apply_action?(element, :click).should == true
|
27
|
+
end
|
28
|
+
it "cannot apply an action with unknown element" do
|
29
|
+
element = @browser.get_element({text_field: {id: "abc_dont_exist"}})
|
30
|
+
expect{@browser.apply_action?(element, {set: "github"})}.to raise_error(Watir::Exception::UnknownObjectException)
|
31
|
+
end
|
32
|
+
it "cannot apply an action on element that can't respond to it " do
|
33
|
+
element = @browser.get_element({button: {id: "searchsubmit"}})
|
34
|
+
element.exists?.should == true
|
35
|
+
expect{@browser.apply_action?(element, {set: "github"})}.to raise_error
|
36
|
+
end
|
37
|
+
it "cannot apply action in wrong form" do
|
38
|
+
element = @browser.get_element({text_field: {id: "s"}})
|
39
|
+
element.exists?.should == true
|
40
|
+
expect{@browser.apply_action?(element, "wrong form action")}.to raise_error(Hercules::UptimeMonitor::InvalidAction)
|
41
|
+
end
|
42
|
+
it "returns true for matching text form" do
|
43
|
+
@browser.apply_text?("hello world", {text: "hello world"}).should == true
|
44
|
+
end
|
45
|
+
it "returns false for non-matching text form" do
|
46
|
+
@browser.apply_text?("hello world", {text: "something else"}).should == false
|
47
|
+
end
|
48
|
+
it "returns true for matching includes_text form" do
|
49
|
+
@browser.apply_text?("hello world", {includes_text: "hello"}).should == true
|
50
|
+
end
|
51
|
+
it "returns false for non-matching includes_text form" do
|
52
|
+
@browser.apply_text?("hello world", {includes_text: "something else"}).should == false
|
53
|
+
end
|
54
|
+
it "cannot match unknown text form" do
|
55
|
+
expect{@browser.apply_text?("hello world", {something_else: "something else"})}.to raise_error(Hercules::UptimeMonitor::InvalidText)
|
56
|
+
end
|
57
|
+
it "can detect correct wait_until form" do
|
58
|
+
@browser.is_wait_until?({wait_until_exists?: :anything}).should == true
|
59
|
+
end
|
60
|
+
it "can detect incorrect wait_until form" do
|
61
|
+
@browser.is_wait_until?({something_else: :anything}).should == false
|
62
|
+
@browser.is_wait_until?("something_else").should == false
|
63
|
+
end
|
64
|
+
it "can detect a valid action form" do
|
65
|
+
@browser.is_an_action?([set: "admin"]).should == true
|
66
|
+
@browser.is_an_action?([:click]).should == true
|
67
|
+
end
|
68
|
+
it "can detect invalid action form" do
|
69
|
+
@browser.is_an_action?("something_else").should == false
|
70
|
+
@browser.is_an_action?(["something_else"]).should == false
|
71
|
+
end
|
72
|
+
it "can detect valid text form" do
|
73
|
+
@browser.is_a_text?([{text: "hello world"}]).should == true
|
74
|
+
@browser.is_a_text?([{includes_text: "hello world"}]).should == true
|
75
|
+
end
|
76
|
+
it "can detect invalid text form" do
|
77
|
+
@browser.is_a_text?("something_else").should == false
|
78
|
+
@browser.is_a_text?(["something_else"]).should == false
|
79
|
+
@browser.is_a_text?([{"something_else"=> :anything}]).should == false
|
80
|
+
@browser.is_a_text?([{something_else: :anything}]).should == false
|
81
|
+
@browser.is_a_text?([{text: :anything}]).should == false
|
82
|
+
end
|
83
|
+
it "can apply rest to text form" do
|
84
|
+
@browser.apply_rest?("hello world",[{text: "hello world"}]).should == true
|
85
|
+
end
|
86
|
+
it "can apply rest to action form" do
|
87
|
+
element = @browser.get_element({text_field: {id: "s"}})
|
88
|
+
element.exists?.should == true
|
89
|
+
@browser.apply_rest?(element,[{set: "github"}]).should == true
|
90
|
+
end
|
91
|
+
it "cannot apply rest for unknown form" do
|
92
|
+
expect{@browser.apply_rest?(:element,:something_else)}.to raise_error(Hercules::UptimeMonitor::InvalidRest)
|
93
|
+
end
|
94
|
+
it "returns true when all expressions are true for rest exists" do
|
95
|
+
element = @browser.get_element(:title)
|
96
|
+
element.exists?.should == true
|
97
|
+
@browser.rest_exists?(element, [[{text: "Obi Akubue"}],[{includes_text: "Akubue"}]]).should == true
|
98
|
+
end
|
99
|
+
it "returns false when any expression is false for rest exists" do
|
100
|
+
element = @browser.get_element(:title)
|
101
|
+
element.exists?.should == true
|
102
|
+
@browser.rest_exists?(element, [[{text: "Obi Akubue"}],[{includes_text: "something_else"}]]).should == false
|
103
|
+
end
|
104
|
+
it "returns an element from symbol" do
|
105
|
+
element = @browser.get_element(:div)
|
106
|
+
element.exists?.should == true
|
107
|
+
end
|
108
|
+
it "returns an element from hash with element and attributes" do
|
109
|
+
element = @browser.get_element({a: {href:"http://obi-akubue.org/?feed=rss", id: "rss-link"}})
|
110
|
+
element.exists?.should == true
|
111
|
+
end
|
112
|
+
it "returns false for an element doesn't exist" do
|
113
|
+
element = @browser.get_element({div: {class: "something_else", id: "something_else"}})
|
114
|
+
element.exists?.should == false
|
115
|
+
end
|
116
|
+
it "cannot check an element exists using unusual attributes unless its a css query" do
|
117
|
+
element = @browser.get_element({div: {unusual_attribute: "something_else", id: "something_else"}})
|
118
|
+
expect{element.exists?}.to raise_error(Watir::Exception::MissingWayOfFindingObjectException)
|
119
|
+
end
|
120
|
+
it "can check an element exists using unusual attributes with css query" do
|
121
|
+
element = @browser.get_element({element: {css: '[data-name="message"]'}})
|
122
|
+
element.exists?.should == false
|
123
|
+
element = @browser.get_element({element: {css: '[something_else="something_else"]'}})
|
124
|
+
element.exists?.should == false
|
125
|
+
end
|
126
|
+
it "can use css query to check an element exists" do
|
127
|
+
element = @browser.get_element({element: {css: '#rss-link'}})
|
128
|
+
element.exists?.should == true
|
129
|
+
end
|
130
|
+
it "cannot check if an element exists if element has incorrect form" do
|
131
|
+
expect{@browser.get_element("something_else")}.to raise_error(Hercules::UptimeMonitor::InvalidPageElement)
|
132
|
+
end
|
133
|
+
it "can check if a symbol form page element exists" do
|
134
|
+
@browser.page_element_exists?([:title]).should == true
|
135
|
+
end
|
136
|
+
it "can check if an array form page element exists" do
|
137
|
+
@browser.page_element_exists?([{a: {href:"http://obi-akubue.org/?feed=rss", id: "rss-link"}}]).should == true
|
138
|
+
end
|
139
|
+
it "can check if element exists with rest options in text and/or action form and applies any action form" do
|
140
|
+
element = {link: {text:"Obi Akubue"}}, [:click], [text: "Obi Akubue"], [includes_text: "Obi"], [:click]
|
141
|
+
@browser.page_element_exists?(element).should == true
|
142
|
+
element = {link: {text:"something_else"}}, [:click], [text: "Obi Akubue"], [includes_text: "Obi"], [:click]
|
143
|
+
@browser.page_element_exists?(element).should == false
|
144
|
+
element = {link: {text:"Obi Akubue"}}, [text: "something_else"], [includes_text: "Obi"], [:click]
|
145
|
+
@browser.page_element_exists?(element).should == false
|
146
|
+
element = {link: {text:"Obi Akubue"}}, [:click], [text: "Obi Akubue"], [includes_text: "something_else"], [:click]
|
147
|
+
@browser.page_element_exists?(element).should == false
|
148
|
+
end
|
149
|
+
it "cannot check if page_element_exists if first is in wrong form" do
|
150
|
+
element = [{div: {unusual_attribute: "something_else", id: "something_else"}}]
|
151
|
+
expect{@browser.page_element_exists?(element)}.to raise_error(Hercules::UptimeMonitor::UnknownPageElement)
|
152
|
+
end
|
153
|
+
it "can check if page_element_exists" do
|
154
|
+
@browser.exists?([{text_field: {id: "s"}}]).should == true
|
155
|
+
@browser.exists?([{wait_until_exists?: [{text_field: {id: "s"}}]}]).should == true
|
156
|
+
@browser.exists?([{text_field: {id: "something_else"}}]).should == false
|
157
|
+
#returns false if element doesn't exist after waiting for 30 seconds
|
158
|
+
@browser.exists?([{wait_until_exists?: [{text_field: {id: "something_else"}}]}]).should == false
|
159
|
+
end
|
160
|
+
it "cannot check if page_element_exists when in a wrong form" do
|
161
|
+
expect{@browser.exists?("something_else")}.to raise_error(Hercules::UptimeMonitor::InvalidPageElementForm)
|
162
|
+
end
|
163
|
+
it "returns the cdr of an array" do
|
164
|
+
@browser.rest((1..5).to_a).should == (2..5).to_a
|
165
|
+
end
|
166
|
+
|
167
|
+
after(:all) do
|
168
|
+
@browser.close
|
169
|
+
end
|
170
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ragios::Plugin::UptimeMonitor do
|
4
|
+
before(:each) do
|
5
|
+
@uptime_monitor = Ragios::Plugin::UptimeMonitor.new
|
6
|
+
end
|
7
|
+
it "sets the correct test result for success" do
|
8
|
+
@uptime_monitor.result!("page_element", state = true)
|
9
|
+
@uptime_monitor.test_result.should == {"page_element" => :exists_as_expected}
|
10
|
+
@uptime_monitor.success.should == true
|
11
|
+
end
|
12
|
+
it "sets the correct test result for failure" do
|
13
|
+
@uptime_monitor.result!(:page_element, state = false)
|
14
|
+
@uptime_monitor.test_result.should == {:page_element => :does_not_exist_as_expected}
|
15
|
+
@uptime_monitor.success.should == false
|
16
|
+
end
|
17
|
+
it "must include a url" do
|
18
|
+
monitor = {exists?: :exists, browser: :browser}
|
19
|
+
expect{@uptime_monitor.init(monitor)}.to raise_error(Hercules::UptimeMonitor::NoUrlProvided)
|
20
|
+
end
|
21
|
+
it "must include a browser" do
|
22
|
+
monitor = {exists?: :exists, url: :url}
|
23
|
+
expect{@uptime_monitor.init(monitor)}.to raise_error(Hercules::UptimeMonitor::NoBrowserProvided)
|
24
|
+
end
|
25
|
+
it "must include a validation" do
|
26
|
+
monitor = {browser: :browser, url: :url}
|
27
|
+
expect{@uptime_monitor.init(monitor)}.to raise_error(Hercules::UptimeMonitor::NoValidationProvided)
|
28
|
+
end
|
29
|
+
it "returns true if page element exists" do
|
30
|
+
monitor = {browser: :browser, exists?: :exists, url: :url}
|
31
|
+
@uptime_monitor.init(monitor)
|
32
|
+
@uptime_monitor.start_browser("http://obi-akubue.org","firefox", headless = true)
|
33
|
+
page_element = [:title]
|
34
|
+
@uptime_monitor.exists([page_element])
|
35
|
+
@uptime_monitor.test_result.should == {page_element => :exists_as_expected}
|
36
|
+
@uptime_monitor.success.should == true
|
37
|
+
@uptime_monitor.close_browser
|
38
|
+
end
|
39
|
+
it "returns false if page element don't exists" do
|
40
|
+
monitor = {browser: :browser, exists?: :exists, url: :url}
|
41
|
+
@uptime_monitor.init(monitor)
|
42
|
+
@uptime_monitor.start_browser("http://obi-akubue.org","firefox", headless = true)
|
43
|
+
page_element = [:title, [text: "dont_exist"]]
|
44
|
+
@uptime_monitor.exists([page_element])
|
45
|
+
@uptime_monitor.test_result.should == {page_element => :does_not_exist_as_expected}
|
46
|
+
@uptime_monitor.success.should == false
|
47
|
+
@uptime_monitor.close_browser
|
48
|
+
end
|
49
|
+
it "runs a test that passes" do
|
50
|
+
page_element = [:title]
|
51
|
+
monitor = {url: "http://obi-akubue.org",
|
52
|
+
browser: ["firefox", headless: true],
|
53
|
+
exists?: [page_element]
|
54
|
+
}
|
55
|
+
@uptime_monitor.init(monitor)
|
56
|
+
@uptime_monitor.test_command?.should == true
|
57
|
+
@uptime_monitor.test_result.should == {page_element => :exists_as_expected}
|
58
|
+
end
|
59
|
+
it "runs a test that fails" do
|
60
|
+
page_element = [:title, [text: "dont_exist"]]
|
61
|
+
monitor = {url: "http://obi-akubue.org",
|
62
|
+
browser: ["firefox", headless: true],
|
63
|
+
exists?: [page_element]
|
64
|
+
}
|
65
|
+
@uptime_monitor.init(monitor)
|
66
|
+
@uptime_monitor.test_command?.should == false
|
67
|
+
@uptime_monitor.test_result.should == {page_element => :does_not_exist_as_expected}
|
68
|
+
end
|
69
|
+
end
|
metadata
ADDED
@@ -0,0 +1,210 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: uptime_monitor
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- obi-a
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-03-22 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: headless
|
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'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: watir-webdriver
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: watir-webdriver-performance
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: activesupport
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
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: rspec
|
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'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: rdoc
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '3.12'
|
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: '3.12'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: bundler
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.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: '1.0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: jeweler
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ~>
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 1.8.7
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 1.8.7
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: pry
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
type: :development
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
description: Uses a real web browser to monitor a web app for uptime
|
159
|
+
email: obioraakubue@yahoo.com
|
160
|
+
executables: []
|
161
|
+
extensions: []
|
162
|
+
extra_rdoc_files:
|
163
|
+
- LICENSE
|
164
|
+
- README.md
|
165
|
+
files:
|
166
|
+
- .document
|
167
|
+
- .travis.yml
|
168
|
+
- Gemfile
|
169
|
+
- Gemfile.lock
|
170
|
+
- LICENSE
|
171
|
+
- README.md
|
172
|
+
- Rakefile
|
173
|
+
- VERSION
|
174
|
+
- lib/uptime_monitor.rb
|
175
|
+
- lib/uptime_monitor/browser.rb
|
176
|
+
- lib/uptime_monitor/browser_reader.rb
|
177
|
+
- lib/uptime_monitor/uptime_monitor.rb
|
178
|
+
- spec/browser_reader_spec.rb
|
179
|
+
- spec/browser_spec.rb
|
180
|
+
- spec/spec_helper.rb
|
181
|
+
- spec/uptime_monitor_spec.rb
|
182
|
+
homepage: http://github.com/obi-a/uptime_monitor
|
183
|
+
licenses:
|
184
|
+
- MIT
|
185
|
+
post_install_message:
|
186
|
+
rdoc_options: []
|
187
|
+
require_paths:
|
188
|
+
- lib
|
189
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
190
|
+
none: false
|
191
|
+
requirements:
|
192
|
+
- - ! '>='
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
segments:
|
196
|
+
- 0
|
197
|
+
hash: -845472848363939348
|
198
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
199
|
+
none: false
|
200
|
+
requirements:
|
201
|
+
- - ! '>='
|
202
|
+
- !ruby/object:Gem::Version
|
203
|
+
version: '0'
|
204
|
+
requirements: []
|
205
|
+
rubyforge_project:
|
206
|
+
rubygems_version: 1.8.24
|
207
|
+
signing_key:
|
208
|
+
specification_version: 3
|
209
|
+
summary: Real browser website uptime monitoring plugin for Ragios
|
210
|
+
test_files: []
|