uptime_monitor 0.0.1
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/.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
|
+
[](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: []
|