octopus 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/.gitignore +22 -0
- data/LICENSE +20 -0
- data/README.rdoc +41 -0
- data/Rakefile +62 -0
- data/VERSION +1 -0
- data/bin/octopus +16 -0
- data/doc/octopus.zargo +0 -0
- data/lib/ext/array_ext.rb +8 -0
- data/lib/ext/partials.rb +27 -0
- data/lib/ext/reloader.rb +11 -0
- data/lib/init.rb +68 -0
- data/lib/octopus/config.ru +11 -0
- data/lib/octopus/grabbers/generic_http.rb +75 -0
- data/lib/octopus/models/net_resource.rb +68 -0
- data/lib/octopus/models/subscription.rb +35 -0
- data/lib/octopus/public/default.css +233 -0
- data/lib/octopus/public/images/bg01.jpg +0 -0
- data/lib/octopus/public/images/bg02.jpg +0 -0
- data/lib/octopus/public/images/bg03.jpg +0 -0
- data/lib/octopus/public/images/bg04.jpg +0 -0
- data/lib/octopus/public/images/img01.jpg +0 -0
- data/lib/octopus/public/images/img02.gif +0 -0
- data/lib/octopus/public/images/img03.gif +0 -0
- data/lib/octopus/public/images/img04.gif +0 -0
- data/lib/octopus/public/images/img05.gif +0 -0
- data/lib/octopus/public/images/img06.jpg +0 -0
- data/lib/octopus/public/images/spacer.gif +0 -0
- data/lib/octopus/views/edit.erb +29 -0
- data/lib/octopus/views/index.erb +21 -0
- data/lib/octopus/views/layout.erb +65 -0
- data/lib/octopus/views/new.erb +42 -0
- data/lib/octopus/views/resource_list_item.erb +9 -0
- data/lib/octopus.rb +81 -0
- data/octopus.gemspec +113 -0
- data/test/helper.rb +50 -0
- data/test/support/blueprints.rb +20 -0
- data/test/test_net_resource.rb +79 -0
- data/test/test_octopus.rb +153 -0
- data/test/test_subscription.rb +45 -0
- metadata +231 -0
@@ -0,0 +1,233 @@
|
|
1
|
+
/*
|
2
|
+
Design by Free CSS Templates
|
3
|
+
http://www.freecsstemplates.org
|
4
|
+
Released for free under a Creative Commons Attribution 2.5 License
|
5
|
+
*/
|
6
|
+
|
7
|
+
body {
|
8
|
+
margin: 0;
|
9
|
+
padding: 0;
|
10
|
+
background: #FFFFFF url(images/bg01.jpg) repeat-x top left;
|
11
|
+
font-size: 13px;
|
12
|
+
color: #7F7F7F;
|
13
|
+
}
|
14
|
+
|
15
|
+
body, th, td, input, textarea, select, option {
|
16
|
+
font-weight: normal;
|
17
|
+
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
|
18
|
+
}
|
19
|
+
|
20
|
+
h1, h2, h3 {
|
21
|
+
font-weight: normal;
|
22
|
+
color: #484848;
|
23
|
+
}
|
24
|
+
|
25
|
+
h1 {
|
26
|
+
text-transform: lowercase;
|
27
|
+
letter-spacing: -1px;
|
28
|
+
font-size: 24px;
|
29
|
+
}
|
30
|
+
|
31
|
+
h2 {
|
32
|
+
text-transform: lowercase;
|
33
|
+
letter-spacing: -1px;
|
34
|
+
font-size: 24px;
|
35
|
+
}
|
36
|
+
|
37
|
+
h3 {
|
38
|
+
font-size: 1em;
|
39
|
+
}
|
40
|
+
|
41
|
+
p, ul, ol {
|
42
|
+
line-height: 200%;
|
43
|
+
}
|
44
|
+
|
45
|
+
blockquote {
|
46
|
+
padding-left: 1em;
|
47
|
+
}
|
48
|
+
|
49
|
+
blockquote p, blockquote ul, blockquote ol {
|
50
|
+
line-height: normal;
|
51
|
+
font-style: italic;
|
52
|
+
}
|
53
|
+
|
54
|
+
a {
|
55
|
+
color: #7ACE11;
|
56
|
+
}
|
57
|
+
|
58
|
+
a:hover {
|
59
|
+
text-decoration: none;
|
60
|
+
color: #7ACE11;
|
61
|
+
}
|
62
|
+
|
63
|
+
/* Header */
|
64
|
+
|
65
|
+
#header {
|
66
|
+
width: 890px;
|
67
|
+
height: 190px;
|
68
|
+
margin: 0px auto;
|
69
|
+
}
|
70
|
+
|
71
|
+
/* Logo */
|
72
|
+
|
73
|
+
#logo {
|
74
|
+
float: left;
|
75
|
+
padding: 40px 0 0 0;
|
76
|
+
}
|
77
|
+
|
78
|
+
#logo h1 {
|
79
|
+
margin: 0;
|
80
|
+
text-transform: lowercase;
|
81
|
+
letter-spacing: -2px;
|
82
|
+
font-size: 3.6em;
|
83
|
+
font-weight: normal;
|
84
|
+
color: #FFFFFF;
|
85
|
+
}
|
86
|
+
|
87
|
+
#logo h1 a {
|
88
|
+
padding-right: 20px;
|
89
|
+
text-decoration: none;
|
90
|
+
color: #FFFFFF;
|
91
|
+
}
|
92
|
+
|
93
|
+
#logo p {
|
94
|
+
margin: -5px 0 0 0;
|
95
|
+
text-transform: uppercase;
|
96
|
+
font-size: 1.22em;
|
97
|
+
letter-spacing: -1px;
|
98
|
+
}
|
99
|
+
|
100
|
+
#logo a {
|
101
|
+
text-decoration: none;
|
102
|
+
color: #FFFFFF;
|
103
|
+
}
|
104
|
+
|
105
|
+
/* Menu */
|
106
|
+
|
107
|
+
#menu {
|
108
|
+
float: right;
|
109
|
+
}
|
110
|
+
|
111
|
+
#menu ul {
|
112
|
+
margin: 0px;
|
113
|
+
padding: 93px 0px 0px 0px;
|
114
|
+
list-style: none;
|
115
|
+
}
|
116
|
+
|
117
|
+
#menu li {
|
118
|
+
display: inline;
|
119
|
+
}
|
120
|
+
|
121
|
+
#menu a {
|
122
|
+
display: block;
|
123
|
+
float: left;
|
124
|
+
margin-left: 20px;
|
125
|
+
text-decoration: none;
|
126
|
+
text-transform: lowercase;
|
127
|
+
font-size: 1.36em;
|
128
|
+
color: #FFFFFF;
|
129
|
+
}
|
130
|
+
|
131
|
+
#menu a:hover, .active a {
|
132
|
+
border-bottom: 3px solid #FFFFFF;
|
133
|
+
}
|
134
|
+
|
135
|
+
|
136
|
+
/* Page */
|
137
|
+
|
138
|
+
#page {
|
139
|
+
width: 890px;
|
140
|
+
margin: 0 auto;
|
141
|
+
}
|
142
|
+
|
143
|
+
/* Content */
|
144
|
+
|
145
|
+
#content {
|
146
|
+
float: left;
|
147
|
+
width: 590px;
|
148
|
+
}
|
149
|
+
|
150
|
+
.post {
|
151
|
+
padding: 20px 20px;
|
152
|
+
background: url(images/bg04.jpg) no-repeat top left;
|
153
|
+
}
|
154
|
+
|
155
|
+
.title {
|
156
|
+
margin: 0;
|
157
|
+
border-bottom: 2px solid #484848;
|
158
|
+
color: #484848;
|
159
|
+
}
|
160
|
+
|
161
|
+
.byline {
|
162
|
+
margin: 0;
|
163
|
+
color: #D79B00;
|
164
|
+
}
|
165
|
+
|
166
|
+
.meta {
|
167
|
+
text-align: left;
|
168
|
+
color: #646464;
|
169
|
+
}
|
170
|
+
|
171
|
+
.meta .more {
|
172
|
+
padding-left: 20px;
|
173
|
+
background: url(images/img03.gif) no-repeat left center;
|
174
|
+
}
|
175
|
+
|
176
|
+
.meta .comments {
|
177
|
+
padding-left: 20px;
|
178
|
+
background: url(images/img04.gif) no-repeat left center;
|
179
|
+
}
|
180
|
+
|
181
|
+
/* Sidebar */
|
182
|
+
|
183
|
+
#sidebar {
|
184
|
+
float: right;
|
185
|
+
width: 240px;
|
186
|
+
}
|
187
|
+
|
188
|
+
#sidebar ul {
|
189
|
+
margin: 0;
|
190
|
+
padding: 0;
|
191
|
+
list-style: none;
|
192
|
+
}
|
193
|
+
|
194
|
+
#sidebar li {
|
195
|
+
}
|
196
|
+
|
197
|
+
#sidebar li ul {
|
198
|
+
padding: 15px 0;
|
199
|
+
}
|
200
|
+
|
201
|
+
#sidebar li li {
|
202
|
+
padding-left: 20px;
|
203
|
+
border-bottom: 1px dotted #7B9418;
|
204
|
+
}
|
205
|
+
|
206
|
+
#sidebar h2 {
|
207
|
+
margin: 0;
|
208
|
+
padding: 5px 0 0 20px;
|
209
|
+
background: url(images/img06.jpg) no-repeat left 80%;
|
210
|
+
}
|
211
|
+
|
212
|
+
#sidebar a {
|
213
|
+
text-decoration: none;
|
214
|
+
}
|
215
|
+
|
216
|
+
#sidebar a:hover {
|
217
|
+
}
|
218
|
+
|
219
|
+
/* Footer */
|
220
|
+
|
221
|
+
#footer {
|
222
|
+
clear: both;
|
223
|
+
margin: 0px;
|
224
|
+
height: 80px;
|
225
|
+
background: #F2F2F2 url(images/bg02.jpg) repeat-x left top;
|
226
|
+
}
|
227
|
+
|
228
|
+
#footer p {
|
229
|
+
padding: 20px 0;
|
230
|
+
text-align: center;
|
231
|
+
font-size: smaller;
|
232
|
+
color: #717171;
|
233
|
+
}
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<div class="post">
|
2
|
+
<h1 class="title">Edit resource</h1>
|
3
|
+
<div class="entry">
|
4
|
+
<% unless @resource.errors.empty? %>
|
5
|
+
<div class="errors">
|
6
|
+
<h2>Errors on NetResource</h2>
|
7
|
+
<ul>
|
8
|
+
<% @resource.errors.each do |error| %>
|
9
|
+
<li><%= error %></li>
|
10
|
+
<% end %>
|
11
|
+
</ul>
|
12
|
+
</div>
|
13
|
+
<% end %>
|
14
|
+
|
15
|
+
<form action="/update/<%= @resource.id %>" method="POST">
|
16
|
+
<input name="_method" value="PUT" type="hidden"/>
|
17
|
+
|
18
|
+
<p><strong>Resource url:</strong>
|
19
|
+
The url of the internet resource you want to watch for changes.
|
20
|
+
<input name="net_resource[url]" value="<%= @resource.url %>" id="net_resource_url" size="70"></input></p>
|
21
|
+
|
22
|
+
<p><strong>Update period:</strong>
|
23
|
+
The number of seconds between updates, defaults to 1200 seconds (20 minutes) if left blank.
|
24
|
+
<input name="net_resource[update_period]" value="<%= @resource.update_period %>"id="net_resource_update_period" size="4"></input></p>
|
25
|
+
|
26
|
+
<input type="submit" value="Save"/>
|
27
|
+
</form>
|
28
|
+
</div>
|
29
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<div class="post">
|
2
|
+
<h1 class="title">Welcome to your octopus</h1>
|
3
|
+
<div class="entry">
|
4
|
+
<p>It is watching <strong><%= @resource_count %> resources</strong> on the net,
|
5
|
+
and has a total of <strong><%= @subscription_count %> subscriptions</strong>.</p>
|
6
|
+
<form action="/new_or_edit" method="POST">
|
7
|
+
<p>Add, edit, or delete a resource by pasting its URL in here:<br/>
|
8
|
+
<input name="net_resource[url]" id="net_resource_url" size="70"/>
|
9
|
+
</p>
|
10
|
+
<input type="submit" value="Go!"/>
|
11
|
+
</form>
|
12
|
+
|
13
|
+
<% unless @resources.empty? %>
|
14
|
+
<p>Here are the next resources which will be checked for changes:</p>
|
15
|
+
<ul>
|
16
|
+
<%= partial :resource_list_item, :collection => @resources %>
|
17
|
+
</ul>
|
18
|
+
<% end %>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
|
@@ -0,0 +1,65 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
2
|
+
<!--
|
3
|
+
Design by Free CSS Templates
|
4
|
+
http://www.freecsstemplates.org
|
5
|
+
Released for free under a Creative Commons Attribution 2.5 License
|
6
|
+
|
7
|
+
Name : Unqualified
|
8
|
+
Description: A two-column, fixed-width design.
|
9
|
+
Version : 1.0
|
10
|
+
Released : 20071220
|
11
|
+
|
12
|
+
-->
|
13
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
14
|
+
<head>
|
15
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
16
|
+
<title>Octopus Admin</title>
|
17
|
+
<meta name="keywords" content="" />
|
18
|
+
<meta name="description" content="" />
|
19
|
+
<link href="/default.css" rel="stylesheet" type="text/css" media="screen" />
|
20
|
+
</head>
|
21
|
+
<body>
|
22
|
+
<!-- start header -->
|
23
|
+
<div id="header">
|
24
|
+
<div id="logo">
|
25
|
+
<h1><a href="/">Octopus</a></h1>
|
26
|
+
<p>Admin</p>
|
27
|
+
</div>
|
28
|
+
<div id="menu">
|
29
|
+
<ul>
|
30
|
+
<li <%= 'class="active"' if request.path_info == "/" %>><a href="/">Home</a></li>
|
31
|
+
<li <%= 'class="active"' if request.path_info == "/new" %>><a href="/new">New</a></li>
|
32
|
+
</ul>
|
33
|
+
</div>
|
34
|
+
</div>
|
35
|
+
<!-- end header -->
|
36
|
+
<!-- start page -->
|
37
|
+
<div id="page">
|
38
|
+
<!-- start content -->
|
39
|
+
<div id="content">
|
40
|
+
|
41
|
+
<%= yield %>
|
42
|
+
|
43
|
+
</div>
|
44
|
+
<!-- end content -->
|
45
|
+
<!-- start sidebar -->
|
46
|
+
<div id="sidebar">
|
47
|
+
<ul>
|
48
|
+
<li>
|
49
|
+
<h2>More about octopi</h2>
|
50
|
+
<ul>
|
51
|
+
<li><a href="http://octopile.net">Octopile</a></li>
|
52
|
+
</ul>
|
53
|
+
</li>
|
54
|
+
</div>
|
55
|
+
<!-- end sidebar -->
|
56
|
+
</div>
|
57
|
+
<!-- end page -->
|
58
|
+
|
59
|
+
|
60
|
+
<div id="footer">
|
61
|
+
<p>Design by <a href="http://www.freecsstemplates.org/">Free CSS Templates</a> • Icons by <a href="http://www.famfamfam.com/">FAMFAMFAM</a>.</p>
|
62
|
+
</div>
|
63
|
+
</body>
|
64
|
+
</html>
|
65
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
<div class="post">
|
2
|
+
<h1 class="title">Create a new resource</h1>
|
3
|
+
<div class="entry">
|
4
|
+
<% unless @resource.errors.empty? %>
|
5
|
+
<div class="errors">
|
6
|
+
<h2>Errors on NetResource</h2>
|
7
|
+
<ul>
|
8
|
+
<% @resource.errors.each do |error| %>
|
9
|
+
<li><%= error %></li>
|
10
|
+
<% end %>
|
11
|
+
</ul>
|
12
|
+
</div>
|
13
|
+
<% end %>
|
14
|
+
|
15
|
+
<% unless @subscription.errors.empty? %>
|
16
|
+
<div class="errors">
|
17
|
+
<h2>Errors on Subscription</h2>
|
18
|
+
<ul>
|
19
|
+
<% @subscription.errors.each do |error| %>
|
20
|
+
<li><%= error %></li>
|
21
|
+
<% end %>
|
22
|
+
</ul>
|
23
|
+
</div>
|
24
|
+
<% end %>
|
25
|
+
|
26
|
+
<form action="/create" method="POST">
|
27
|
+
<p><strong>Resource url:</strong>
|
28
|
+
The url of the internet resource you want to watch for changes.
|
29
|
+
<input name="net_resource[url]" id="net_resource_url" size="70"></input></p>
|
30
|
+
|
31
|
+
<p><strong>Update period:</strong>
|
32
|
+
The number of seconds between updates, defaults to 1200 seconds (20 minutes) if left blank.
|
33
|
+
<input name="net_resource[update_period]" id="net_resource_update_period" size="4"></input></p>
|
34
|
+
|
35
|
+
<h2 class="title">The Subscription</h2>
|
36
|
+
<p><strong>Notification url:</strong>
|
37
|
+
The url that should be hit when the resource changes.
|
38
|
+
<input name="subscription[url]" id="subscription_url" size="70"></input></p>
|
39
|
+
<input type="submit" value="Save"/>
|
40
|
+
</form>
|
41
|
+
</div>
|
42
|
+
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<li>
|
2
|
+
<%=h resource_list_item.url %><br/>
|
3
|
+
<%= resource_list_item.subscriptions.count %> subscriptions<br/>
|
4
|
+
Last updated at <%=h resource_list_item.last_updated.strftime("%m/%d/%Y at %H:%M:%S") unless resource_list_item.last_updated.nil? %><br/>
|
5
|
+
Last checked at <%=h resource_list_item.updated_at.strftime("%m/%d/%Y at %H:%M:%S") %><br/>
|
6
|
+
Next check will be at <%=h resource_list_item.next_update.strftime("%m/%d/%Y at %H:%M:%S") %><br/>
|
7
|
+
Checked every <%= h resource_list_item.update_period %> seconds.
|
8
|
+
</li>
|
9
|
+
|
data/lib/octopus.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/init'
|
2
|
+
|
3
|
+
# Shows an octopus status page.
|
4
|
+
#
|
5
|
+
get '/' do
|
6
|
+
@resources = NetResource.all(:limit => 50, :order => [:next_update.asc])
|
7
|
+
@resource_count = NetResource.count
|
8
|
+
@subscription_count = Subscription.count
|
9
|
+
erb :index
|
10
|
+
end
|
11
|
+
|
12
|
+
# Displays a form to create a new resource.
|
13
|
+
#
|
14
|
+
get '/new' do
|
15
|
+
@resource = NetResource.new
|
16
|
+
@subscription = Subscription.new
|
17
|
+
erb :new
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
# Displays an edit page for a resource.
|
22
|
+
#
|
23
|
+
get '/edit/:id' do
|
24
|
+
@resource = NetResource.get(params[:id])
|
25
|
+
erb :edit
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
# Creates a resource with an associated subscription. If the resource already
|
30
|
+
# exists, the subscription will be appended to it instead of creating a new one.
|
31
|
+
#
|
32
|
+
post '/create' do
|
33
|
+
@resource = NetResource.first(:url => params[:net_resource][:url])
|
34
|
+
@resource = NetResource.new(params[:net_resource]) if @resource.nil?
|
35
|
+
@subscription = Subscription.new(params[:subscription])
|
36
|
+
@resource.subscriptions << @subscription
|
37
|
+
if @resource.save
|
38
|
+
flash[:notice] = "Net resource created."
|
39
|
+
redirect '/'
|
40
|
+
else
|
41
|
+
erb :new
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
# Updates a resource.
|
47
|
+
#
|
48
|
+
put '/update/:id' do
|
49
|
+
@resource = NetResource.get(params[:id])
|
50
|
+
if @resource.update(params[:net_resource])
|
51
|
+
flash[:notice] = "Net resource updated."
|
52
|
+
redirect '/'
|
53
|
+
else
|
54
|
+
erb :edit
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
# Figures out whether it's getting a new resource to watch or is editing
|
60
|
+
# an existing resource and redirects the user appropriately.
|
61
|
+
#
|
62
|
+
post '/new_or_edit' do
|
63
|
+
resource = NetResource.first(:url => params[:net_resource][:url])
|
64
|
+
if resource.nil?
|
65
|
+
redirect '/new'
|
66
|
+
else
|
67
|
+
redirect "/edit/#{resource.id}"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
# Starts the octopus grabbing thread. The thread will be reabsorbed into the
|
73
|
+
# main Sinatra/thin thread once the periodic timer is added.
|
74
|
+
#
|
75
|
+
Thread.new do
|
76
|
+
until EM.reactor_running?
|
77
|
+
sleep 1
|
78
|
+
end
|
79
|
+
Grabbers::GenericHttp.new
|
80
|
+
end
|
81
|
+
|
data/octopus.gemspec
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{octopus}
|
8
|
+
s.version = "0.0.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["dave@boomer"]
|
12
|
+
s.date = %q{2010-05-13}
|
13
|
+
s.default_executable = %q{octopus}
|
14
|
+
s.description = %q{Grabs stuff off the net and notifies interested subscribers.}
|
15
|
+
s.email = %q{dave.hrycyszyn@headlondon.com}
|
16
|
+
s.executables = ["octopus"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE",
|
19
|
+
"README.rdoc"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".document",
|
23
|
+
".gitignore",
|
24
|
+
"LICENSE",
|
25
|
+
"README.rdoc",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"bin/octopus",
|
29
|
+
"doc/octopus.zargo",
|
30
|
+
"lib/ext/array_ext.rb",
|
31
|
+
"lib/ext/partials.rb",
|
32
|
+
"lib/ext/reloader.rb",
|
33
|
+
"lib/init.rb",
|
34
|
+
"lib/octopus.rb",
|
35
|
+
"lib/octopus/config.ru",
|
36
|
+
"lib/octopus/grabbers/generic_http.rb",
|
37
|
+
"lib/octopus/models/net_resource.rb",
|
38
|
+
"lib/octopus/models/subscription.rb",
|
39
|
+
"lib/octopus/public/default.css",
|
40
|
+
"lib/octopus/public/images/bg01.jpg",
|
41
|
+
"lib/octopus/public/images/bg02.jpg",
|
42
|
+
"lib/octopus/public/images/bg03.jpg",
|
43
|
+
"lib/octopus/public/images/bg04.jpg",
|
44
|
+
"lib/octopus/public/images/img01.jpg",
|
45
|
+
"lib/octopus/public/images/img02.gif",
|
46
|
+
"lib/octopus/public/images/img03.gif",
|
47
|
+
"lib/octopus/public/images/img04.gif",
|
48
|
+
"lib/octopus/public/images/img05.gif",
|
49
|
+
"lib/octopus/public/images/img06.jpg",
|
50
|
+
"lib/octopus/public/images/spacer.gif",
|
51
|
+
"lib/octopus/views/edit.erb",
|
52
|
+
"lib/octopus/views/index.erb",
|
53
|
+
"lib/octopus/views/layout.erb",
|
54
|
+
"lib/octopus/views/new.erb",
|
55
|
+
"lib/octopus/views/resource_list_item.erb",
|
56
|
+
"octopus.gemspec",
|
57
|
+
"test/helper.rb",
|
58
|
+
"test/support/blueprints.rb",
|
59
|
+
"test/test_net_resource.rb",
|
60
|
+
"test/test_octopus.rb",
|
61
|
+
"test/test_subscription.rb"
|
62
|
+
]
|
63
|
+
s.homepage = %q{http://github.com/futurechimp/octopus}
|
64
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
65
|
+
s.require_paths = ["lib"]
|
66
|
+
s.rubygems_version = %q{1.3.6}
|
67
|
+
s.summary = %q{An experimental octopus implementation.}
|
68
|
+
s.test_files = [
|
69
|
+
"test/support/blueprints.rb",
|
70
|
+
"test/test_subscription.rb",
|
71
|
+
"test/test_net_resource.rb",
|
72
|
+
"test/test_octopus.rb",
|
73
|
+
"test/helper.rb"
|
74
|
+
]
|
75
|
+
|
76
|
+
if s.respond_to? :specification_version then
|
77
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
78
|
+
s.specification_version = 3
|
79
|
+
|
80
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
81
|
+
s.add_runtime_dependency(%q<datamapper>, [">= 0.10.1"])
|
82
|
+
s.add_runtime_dependency(%q<do_sqlite3>, [">= 0.10.0"])
|
83
|
+
s.add_runtime_dependency(%q<sinatra>, [">= 0.9.4"])
|
84
|
+
s.add_runtime_dependency(%q<thin>, [">= 1.2.5"])
|
85
|
+
s.add_runtime_dependency(%q<rack-flash>, [">= 0.1.1"])
|
86
|
+
s.add_runtime_dependency(%q<rack>, [">= 1.0.1"])
|
87
|
+
s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 2.10.2"])
|
88
|
+
s.add_development_dependency(%q<rack-test>, [">= 0.5.2"])
|
89
|
+
s.add_development_dependency(%q<notahat-machinist>, [">= 1.0.3"])
|
90
|
+
else
|
91
|
+
s.add_dependency(%q<datamapper>, [">= 0.10.1"])
|
92
|
+
s.add_dependency(%q<do_sqlite3>, [">= 0.10.0"])
|
93
|
+
s.add_dependency(%q<sinatra>, [">= 0.9.4"])
|
94
|
+
s.add_dependency(%q<thin>, [">= 1.2.5"])
|
95
|
+
s.add_dependency(%q<rack-flash>, [">= 0.1.1"])
|
96
|
+
s.add_dependency(%q<rack>, [">= 1.0.1"])
|
97
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 2.10.2"])
|
98
|
+
s.add_dependency(%q<rack-test>, [">= 0.5.2"])
|
99
|
+
s.add_dependency(%q<notahat-machinist>, [">= 1.0.3"])
|
100
|
+
end
|
101
|
+
else
|
102
|
+
s.add_dependency(%q<datamapper>, [">= 0.10.1"])
|
103
|
+
s.add_dependency(%q<do_sqlite3>, [">= 0.10.0"])
|
104
|
+
s.add_dependency(%q<sinatra>, [">= 0.9.4"])
|
105
|
+
s.add_dependency(%q<thin>, [">= 1.2.5"])
|
106
|
+
s.add_dependency(%q<rack-flash>, [">= 0.1.1"])
|
107
|
+
s.add_dependency(%q<rack>, [">= 1.0.1"])
|
108
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 2.10.2"])
|
109
|
+
s.add_dependency(%q<rack-test>, [">= 0.5.2"])
|
110
|
+
s.add_dependency(%q<notahat-machinist>, [">= 1.0.3"])
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
data/test/helper.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'sinatra'
|
3
|
+
require 'rack/test'
|
4
|
+
require 'base64'
|
5
|
+
require 'machinist/data_mapper'
|
6
|
+
require 'faker'
|
7
|
+
require 'sham'
|
8
|
+
set :environment, :test
|
9
|
+
set :run, false
|
10
|
+
set :raise_errors, true
|
11
|
+
set :logging, false
|
12
|
+
require File.dirname(__FILE__) + '/../lib/init'
|
13
|
+
require File.dirname(__FILE__) + '/../lib/octopus'
|
14
|
+
require File.dirname(__FILE__) + '/support/blueprints'
|
15
|
+
|
16
|
+
|
17
|
+
module TestHelper
|
18
|
+
|
19
|
+
def app
|
20
|
+
# change to your app class if using the 'classy' style
|
21
|
+
Sinatra::Application.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def body
|
25
|
+
last_response.body
|
26
|
+
end
|
27
|
+
|
28
|
+
def status
|
29
|
+
last_response.status
|
30
|
+
end
|
31
|
+
|
32
|
+
include Rack::Test::Methods
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
require 'test/unit'
|
38
|
+
require 'shoulda'
|
39
|
+
|
40
|
+
|
41
|
+
Test::Unit::TestCase.send(:include, TestHelper)
|
42
|
+
|
43
|
+
def basic_auth_creds(username = 'admin', password = 'admin')
|
44
|
+
{'HTTP_AUTHORIZATION'=> encode_credentials(username, password)}
|
45
|
+
end
|
46
|
+
|
47
|
+
def encode_credentials(username, password)
|
48
|
+
"Basic " + Base64.encode64("#{username}:#{password}")
|
49
|
+
end
|
50
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
Sham.url { "http://" + Faker::Internet.domain_name }
|
2
|
+
Sham.last_modified_hash {"foo#{rand(100000).to_s}".hash}
|
3
|
+
Sham.body { Faker::Lorem.sentence }
|
4
|
+
|
5
|
+
NetResource.blueprint do
|
6
|
+
url
|
7
|
+
last_modified_hash
|
8
|
+
update_period { 30 }
|
9
|
+
next_update { DateTime.now + 30 }
|
10
|
+
body
|
11
|
+
created_at DateTime.now
|
12
|
+
updated_at DateTime.now
|
13
|
+
end
|
14
|
+
|
15
|
+
Subscription.blueprint do
|
16
|
+
url
|
17
|
+
created_at DateTime.now
|
18
|
+
updated_at DateTime.now
|
19
|
+
end
|
20
|
+
|