camping-abingo 1.0.3 → 1.0.5
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/doc/classes/ABingoCampingPlugin.html +16 -16
- data/doc/classes/ABingoCampingPlugin/Controllers.html +10 -10
- data/doc/classes/ABingoCampingPlugin/Filters.html +5 -5
- data/doc/classes/ABingoCampingPlugin/Helpers.html +65 -65
- data/doc/classes/ABingoCampingPlugin/Models.html +15 -15
- data/doc/classes/ABingoCampingPlugin/Models/Alternative.html +15 -15
- data/doc/classes/ABingoCampingPlugin/Models/Experiment.html +45 -45
- data/doc/classes/ABingoCampingPlugin/Views.html +15 -15
- data/doc/classes/ActiveSupport/Cache/MemoryStore.html +5 -5
- data/doc/classes/ActiveSupport/Cache/MemoryStore.src/M000001.html +18 -0
- data/doc/classes/CampingABingoTest.html +6 -6
- data/doc/classes/CampingABingoTest.src/M000002.html +24 -0
- data/doc/classes/CampingABingoTest/Controllers/Index.html +5 -5
- data/doc/classes/CampingABingoTest/Controllers/Index.src/M000009.html +18 -0
- data/doc/classes/CampingABingoTest/Controllers/Landing.html +5 -5
- data/doc/classes/CampingABingoTest/Controllers/Landing.src/M000011.html +18 -0
- data/doc/classes/CampingABingoTest/Controllers/SignIn.html +10 -10
- data/doc/classes/CampingABingoTest/Controllers/SignIn.src/M000015.html +18 -0
- data/doc/classes/CampingABingoTest/Controllers/SignIn.src/M000016.html +34 -0
- data/doc/classes/CampingABingoTest/Controllers/SignOut.html +5 -5
- data/doc/classes/CampingABingoTest/Controllers/SignOut.src/M000014.html +21 -0
- data/doc/classes/CampingABingoTest/Controllers/SignUp.html +10 -10
- data/doc/classes/CampingABingoTest/Controllers/SignUp.src/M000012.html +23 -0
- data/doc/classes/CampingABingoTest/Controllers/SignUp.src/M000013.html +33 -0
- data/doc/classes/CampingABingoTest/Controllers/Welcome.html +5 -5
- data/doc/classes/CampingABingoTest/Controllers/Welcome.src/M000010.html +18 -0
- data/doc/classes/CampingABingoTest/Helpers.html +1 -1
- data/doc/classes/CampingABingoTest/Models.html +1 -1
- data/doc/classes/CampingABingoTest/Models/CreateUserSchema.html +11 -11
- data/doc/classes/CampingABingoTest/Models/CreateUserSchema.src/M000017.html +26 -0
- data/doc/classes/CampingABingoTest/Models/CreateUserSchema.src/M000018.html +19 -0
- data/doc/classes/CampingABingoTest/Views.html +30 -30
- data/doc/classes/CampingABingoTest/Views.src/M000003.html +70 -0
- data/doc/classes/CampingABingoTest/Views.src/M000004.html +22 -0
- data/doc/classes/CampingABingoTest/Views.src/M000005.html +51 -0
- data/doc/classes/CampingABingoTest/Views.src/M000006.html +31 -0
- data/doc/classes/CampingABingoTest/Views.src/M000007.html +31 -0
- data/doc/classes/CampingABingoTest/Views.src/M000008.html +20 -0
- data/doc/created.rid +1 -1
- data/doc/files/examples/camping-abingo-test/camping-abingo-test_rb.html +1 -1
- data/doc/files/lib/camping-abingo_rb.html +3 -4
- data/doc/fr_class_index.html +0 -10
- data/doc/fr_file_index.html +0 -1
- data/doc/fr_method_index.html +18 -70
- data/examples/camping-abingo-test/camping-abingo-test-skeleton.rb +456 -0
- data/examples/camping-abingo-test/camping-abingo-test.rb +510 -0
- data/examples/camping-abingo-test/config.ru +26 -0
- data/examples/camping-abingo-test/config/database.yml +4 -0
- data/lib/camping-abingo.rb +1 -10
- metadata +50 -18
@@ -0,0 +1,510 @@
|
|
1
|
+
gem 'camping' , '>= 2.0'
|
2
|
+
gem 'filtering_camping' , '>= 1.0'
|
3
|
+
gem 'camping-abingo'
|
4
|
+
|
5
|
+
%w(rubygems active_record erb fileutils json markaby md5 redcloth
|
6
|
+
camping camping/session filtering_camping camping-abingo
|
7
|
+
).each { |lib| require lib }
|
8
|
+
|
9
|
+
Camping.goes :CampingABingoTest
|
10
|
+
|
11
|
+
module ActiveSupport::Cache
|
12
|
+
class MemoryStore < Store
|
13
|
+
def data
|
14
|
+
@data
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end # ActiveSupport::Cache
|
18
|
+
|
19
|
+
module CampingABingoTest
|
20
|
+
include Camping::Session
|
21
|
+
include CampingFilters
|
22
|
+
|
23
|
+
extend ABingoCampingPlugin
|
24
|
+
include ABingoCampingPlugin::Filters
|
25
|
+
|
26
|
+
app_logger = Logger.new(File.dirname(__FILE__) + '/camping-abingo-test.log')
|
27
|
+
app_logger.level = Logger::DEBUG
|
28
|
+
Camping::Models::Base.logger = app_logger
|
29
|
+
ABingoCampingPlugin.logger = app_logger
|
30
|
+
|
31
|
+
def CampingABingoTest.create
|
32
|
+
dbconfig = YAML.load(File.read('config/database.yml'))
|
33
|
+
Camping::Models::Base.establish_connection dbconfig['development']
|
34
|
+
|
35
|
+
ABingoCampingPlugin.create
|
36
|
+
Abingo.cache.logger = Camping::Models::Base.logger
|
37
|
+
Abingo.options[:abingo_administrator_user_id] = 1
|
38
|
+
CampingABingoTest::Models.create_schema :assume => (CampingABingoTest::Models::User.table_exists? ? 1.1 : 0.0)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
module CampingABingoTest::Models
|
43
|
+
include ABingoCampingPlugin::Models
|
44
|
+
|
45
|
+
class User < Base;
|
46
|
+
end
|
47
|
+
|
48
|
+
class CreateUserSchema < V 1.1
|
49
|
+
def self.up
|
50
|
+
create_table :CampingABingoTest_users, :force => true do |t|
|
51
|
+
t.integer :id, :null => false
|
52
|
+
t.string :username
|
53
|
+
t.string :password
|
54
|
+
end
|
55
|
+
|
56
|
+
User.create :username => 'admin', :password => 'camping'
|
57
|
+
|
58
|
+
ABingoCampingPlugin::Models.up
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.down
|
62
|
+
ABingoCampingPlugin::Models.down
|
63
|
+
drop_table :CampingABingoTest_users
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
module CampingABingoTest::Helpers
|
70
|
+
extend ABingoCampingPlugin::Helpers
|
71
|
+
include ABingoCampingPlugin::Helpers
|
72
|
+
end
|
73
|
+
|
74
|
+
module CampingABingoTest::Controllers
|
75
|
+
extend ABingoCampingPlugin::Controllers
|
76
|
+
|
77
|
+
class Index
|
78
|
+
def get
|
79
|
+
render :index
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
class Landing < R '/landing'
|
84
|
+
def get
|
85
|
+
render :landing
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
class SignIn < R '/signin'
|
90
|
+
def get
|
91
|
+
render :signin
|
92
|
+
end
|
93
|
+
|
94
|
+
def post
|
95
|
+
@user = User.find_by_username_and_password(input.username, input.password)
|
96
|
+
|
97
|
+
if @user
|
98
|
+
@state.user_id = @user.id
|
99
|
+
|
100
|
+
if @state.return_to.nil?
|
101
|
+
redirect R(Welcome)
|
102
|
+
else
|
103
|
+
return_to = @state.return_to
|
104
|
+
@state.return_to = nil
|
105
|
+
redirect(return_to)
|
106
|
+
end
|
107
|
+
else
|
108
|
+
@info = 'Wrong username or password.'
|
109
|
+
end
|
110
|
+
|
111
|
+
render :signin
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
class SignOut < R '/signout'
|
116
|
+
def get
|
117
|
+
@state.user_id = nil
|
118
|
+
@state.abingo_identity = Abingo.identity = rand(10 ** 10).to_i
|
119
|
+
|
120
|
+
render :index
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
class SignUp < R '/signup'
|
125
|
+
def get
|
126
|
+
if @input.special_promo
|
127
|
+
bingo! "special_promo"
|
128
|
+
end
|
129
|
+
bingo! "call_to_action"
|
130
|
+
|
131
|
+
render :signup
|
132
|
+
end
|
133
|
+
|
134
|
+
def post
|
135
|
+
@user = User.find_by_username(input.username)
|
136
|
+
if @user
|
137
|
+
@info = 'A user account already exist for this username.'
|
138
|
+
else
|
139
|
+
@user = User.new :username => input.username,
|
140
|
+
:password => input.password
|
141
|
+
@user.save
|
142
|
+
if @user
|
143
|
+
@state.user_id = @user.id
|
144
|
+
@state.abingo_identity = @user.id
|
145
|
+
redirect R(Welcome)
|
146
|
+
else
|
147
|
+
@info = @user.errors.full_messages unless @user.errors.empty?
|
148
|
+
end
|
149
|
+
end
|
150
|
+
render :signup
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
class Welcome < R '/welcome'
|
155
|
+
def get
|
156
|
+
render :welcome
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
include_abingo_controllers
|
161
|
+
end #Controllers
|
162
|
+
|
163
|
+
module CampingABingoTest::Views
|
164
|
+
extend ABingoCampingPlugin::Views
|
165
|
+
|
166
|
+
def layout
|
167
|
+
html do
|
168
|
+
|
169
|
+
head do
|
170
|
+
title "Ruby Camping ABingo Plugin Demo"
|
171
|
+
|
172
|
+
style :type => 'text/css' do
|
173
|
+
<<-STYLE
|
174
|
+
|
175
|
+
/* --- General Test App Styles --- */
|
176
|
+
|
177
|
+
body {
|
178
|
+
padding:0 0 0 0;
|
179
|
+
margin:5px;
|
180
|
+
font-family:'Lucida Grande','Lucida Sans Unicode',sans-serif;
|
181
|
+
font-size: 0.8em;
|
182
|
+
color:#303030;
|
183
|
+
background-color: #fbf9b5;
|
184
|
+
}
|
185
|
+
|
186
|
+
a {
|
187
|
+
color:#303030;
|
188
|
+
text-decoration:none;
|
189
|
+
border-bottom:1px dotted #505050;
|
190
|
+
}
|
191
|
+
|
192
|
+
a:hover {
|
193
|
+
color:#303030;
|
194
|
+
background: yellow;
|
195
|
+
text-decoration:none;
|
196
|
+
border-bottom:4px solid orange;
|
197
|
+
}
|
198
|
+
|
199
|
+
h1 {
|
200
|
+
font-size: 14px;
|
201
|
+
color: #cc3300;
|
202
|
+
}
|
203
|
+
|
204
|
+
table {
|
205
|
+
font-size:0.9em;
|
206
|
+
width: 1050px;
|
207
|
+
}
|
208
|
+
|
209
|
+
tr
|
210
|
+
{
|
211
|
+
background:lightgoldenRodYellow;
|
212
|
+
vertical-align:top;
|
213
|
+
}
|
214
|
+
|
215
|
+
th
|
216
|
+
{
|
217
|
+
font-size: 0.9em;
|
218
|
+
font-weight:bold;
|
219
|
+
background:lightBlue none repeat scroll 0 0;
|
220
|
+
|
221
|
+
text-align:left;
|
222
|
+
}
|
223
|
+
|
224
|
+
#header
|
225
|
+
{
|
226
|
+
width: 100%;
|
227
|
+
height: 30px;
|
228
|
+
border-bottom: 4px solid #ccc;
|
229
|
+
}
|
230
|
+
|
231
|
+
#header_title
|
232
|
+
{
|
233
|
+
float: left;
|
234
|
+
}
|
235
|
+
|
236
|
+
#top_nav
|
237
|
+
{
|
238
|
+
float: right;
|
239
|
+
}
|
240
|
+
|
241
|
+
#footer
|
242
|
+
{
|
243
|
+
width: 100%;
|
244
|
+
border-top: 4px solid #ccc;
|
245
|
+
}
|
246
|
+
|
247
|
+
|
248
|
+
#footer_notices
|
249
|
+
{
|
250
|
+
width: 100%;
|
251
|
+
border-top: 4px solid #ccc;
|
252
|
+
}
|
253
|
+
|
254
|
+
#home
|
255
|
+
{
|
256
|
+
background-color: #C9E3F5;
|
257
|
+
padding: 10px;
|
258
|
+
height: 300px;
|
259
|
+
}
|
260
|
+
|
261
|
+
#debug_panel
|
262
|
+
{
|
263
|
+
background-color: wheat;
|
264
|
+
padding: 10px;
|
265
|
+
}
|
266
|
+
|
267
|
+
.xyz
|
268
|
+
{
|
269
|
+
background-color: #D1F2A5;
|
270
|
+
padding: 10px;
|
271
|
+
height: 300px;
|
272
|
+
}
|
273
|
+
|
274
|
+
.xyz h1
|
275
|
+
{
|
276
|
+
color: #9D9F89;
|
277
|
+
}
|
278
|
+
|
279
|
+
#special_promo
|
280
|
+
{
|
281
|
+
margin: 20px;
|
282
|
+
}
|
283
|
+
|
284
|
+
#landing a:hover
|
285
|
+
{
|
286
|
+
background-color: #B2DE93;
|
287
|
+
border-bottom-color:green;
|
288
|
+
}
|
289
|
+
|
290
|
+
#marketing
|
291
|
+
{
|
292
|
+
width: 480px;
|
293
|
+
height: 100px;
|
294
|
+
margin: 20px;
|
295
|
+
}
|
296
|
+
|
297
|
+
#benefits
|
298
|
+
{
|
299
|
+
float: left;
|
300
|
+
width: 300px;
|
301
|
+
height: 100px;
|
302
|
+
font-size: 1.3em;
|
303
|
+
font-weight: bold;
|
304
|
+
color: green;
|
305
|
+
background-color: #B2DE93;
|
306
|
+
}
|
307
|
+
|
308
|
+
#actnow
|
309
|
+
{
|
310
|
+
float: right;
|
311
|
+
width: 180px;
|
312
|
+
height: 100px;
|
313
|
+
text-align: center;
|
314
|
+
background-color: #8BC59B;
|
315
|
+
}
|
316
|
+
|
317
|
+
#signup_btn
|
318
|
+
{
|
319
|
+
background-color:#91F1A0;
|
320
|
+
border:4px solid green;
|
321
|
+
font-size:1.5em;
|
322
|
+
font-weight:bold;
|
323
|
+
height:72px;
|
324
|
+
margin: 10px 20px 10px 22px;
|
325
|
+
width:130px;
|
326
|
+
}
|
327
|
+
|
328
|
+
#actnow a:hover #signup_btn
|
329
|
+
{
|
330
|
+
background-color: #69F17F;
|
331
|
+
color: #007300;
|
332
|
+
border: 4px solid #00AA00;
|
333
|
+
}
|
334
|
+
|
335
|
+
/* --- ABingo Dashboard Styles ---*/
|
336
|
+
|
337
|
+
#abingo_dashboard
|
338
|
+
{
|
339
|
+
background-color: white;
|
340
|
+
padding: 10px;
|
341
|
+
}
|
342
|
+
|
343
|
+
abingo_experiment_table
|
344
|
+
{
|
345
|
+
width: 100%;
|
346
|
+
}
|
347
|
+
|
348
|
+
.abingo_experiment_row
|
349
|
+
{
|
350
|
+
}
|
351
|
+
|
352
|
+
.abingo_alternative_row
|
353
|
+
{
|
354
|
+
color: red;
|
355
|
+
font-weight: bold;
|
356
|
+
}
|
357
|
+
|
358
|
+
.abingo_debug
|
359
|
+
{
|
360
|
+
display: block;
|
361
|
+
width: 100%;
|
362
|
+
}
|
363
|
+
|
364
|
+
.abingo_explain
|
365
|
+
{
|
366
|
+
color: #CCC;
|
367
|
+
font-style:italics;
|
368
|
+
}
|
369
|
+
|
370
|
+
|
371
|
+
STYLE
|
372
|
+
end
|
373
|
+
end #head
|
374
|
+
|
375
|
+
body do
|
376
|
+
div.header! do
|
377
|
+
div.header_title! "Ruby Camping ABingo Plugin Demo"
|
378
|
+
div.top_nav! do
|
379
|
+
a "Home", :href=>"/"
|
380
|
+
span " | "
|
381
|
+
if @state.nil? || @state.user_id.nil?
|
382
|
+
a "Sign-In", :href=>'/signin'
|
383
|
+
span " | "
|
384
|
+
a "Sign-Up", :href=>'/signup'
|
385
|
+
else
|
386
|
+
a "XYZ", :href=>"/welcome"
|
387
|
+
span " | "
|
388
|
+
a "Sign-Out", :href=>'/signout'
|
389
|
+
if @state.user_id == abingo_administrator_user_id
|
390
|
+
span " | "
|
391
|
+
a "ABingo Dashboard", :href=>"/abingo/dashboard"
|
392
|
+
end
|
393
|
+
end
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
self << yield
|
398
|
+
|
399
|
+
div.footer! do
|
400
|
+
div.debug_panel! do
|
401
|
+
h4 "Debugging Information:"
|
402
|
+
h5 "State:"
|
403
|
+
div "#{@state.inspect}"
|
404
|
+
|
405
|
+
h5 "Cache Data:"
|
406
|
+
if Abingo.cache && Abingo.cache.data
|
407
|
+
Abingo.cache.data.each do | k,v |
|
408
|
+
div.abingo_debug "#{k} => #{v.inspect}";
|
409
|
+
end
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
413
|
+
div.footer_notices! { "Copyright © 2010 - #{ a('Patrick McKenzie', :href => 'http://www.bingocardcreator.com/abingo') } and #{ a('Philippe Monnet', :href => 'http://blog.monnet-usa.com/') } " }
|
414
|
+
end
|
415
|
+
end
|
416
|
+
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
|
421
|
+
def index
|
422
|
+
div.home! do
|
423
|
+
h1 'My CampingABingoTest App'
|
424
|
+
|
425
|
+
a "XYZ SAAS Application Landing page variations", :href=>"/landing"; br;
|
426
|
+
end
|
427
|
+
end
|
428
|
+
|
429
|
+
def landing
|
430
|
+
div.xyz do
|
431
|
+
h1 'XYZ SAAS Application'
|
432
|
+
|
433
|
+
if ab_test("special_promo")
|
434
|
+
div.special_promo! do
|
435
|
+
div "Special offer for today only"
|
436
|
+
a "Sign-Up Now and get a month free!", :href=>"/signup?special_promo=1"
|
437
|
+
end
|
438
|
+
else
|
439
|
+
div.abingo_explain "The special promo was not selected for this user"
|
440
|
+
end
|
441
|
+
|
442
|
+
div.marketing! do
|
443
|
+
div.benefits! do
|
444
|
+
ul do
|
445
|
+
li "Save XYZ time in half"
|
446
|
+
li "Reduce XYZ cost by 25%"
|
447
|
+
li "Improve quality"
|
448
|
+
end
|
449
|
+
end
|
450
|
+
|
451
|
+
div.actnow! do
|
452
|
+
signup_text = ab_test("call_to_action",
|
453
|
+
[ "Sign-Up Now!",
|
454
|
+
"Try It For Free Now!",
|
455
|
+
"Start Your Free Trial Now!",
|
456
|
+
])
|
457
|
+
|
458
|
+
a :href=>"/signup" do
|
459
|
+
div.signup_btn! signup_text
|
460
|
+
end
|
461
|
+
end
|
462
|
+
end
|
463
|
+
end
|
464
|
+
end
|
465
|
+
|
466
|
+
def signin
|
467
|
+
div.xyz do
|
468
|
+
h1 'XYZ SAAS Application Sign-In'
|
469
|
+
div @info if @info
|
470
|
+
|
471
|
+
form :action => R(SignIn), :method => 'post' do
|
472
|
+
label 'Username', :for => 'username'; br
|
473
|
+
input :name => 'username', :type => 'text'; br
|
474
|
+
|
475
|
+
label 'Password', :for => 'password'; br
|
476
|
+
input :name => 'password', :type => 'text'; br
|
477
|
+
|
478
|
+
input :type => 'submit', :name => 'signin', :value => 'Sign-In'
|
479
|
+
end
|
480
|
+
end
|
481
|
+
end
|
482
|
+
|
483
|
+
def signup
|
484
|
+
div.xyz do
|
485
|
+
h1 'XYZ SAAS Application Sign-Up'
|
486
|
+
div @info if @info
|
487
|
+
|
488
|
+
form :action => R(SignUp), :method => 'post' do
|
489
|
+
label 'Username', :for => 'username'; br
|
490
|
+
input :name => 'username', :type => 'text'; br
|
491
|
+
|
492
|
+
label 'Password', :for => 'password'; br
|
493
|
+
input :name => 'password', :type => 'password'; br;br
|
494
|
+
|
495
|
+
input :type => 'submit', :name => 'signup', :value => 'Sign-Up'
|
496
|
+
end
|
497
|
+
end
|
498
|
+
end
|
499
|
+
|
500
|
+
def welcome
|
501
|
+
div.xyz do
|
502
|
+
h1 'Welcome'
|
503
|
+
end
|
504
|
+
end
|
505
|
+
|
506
|
+
include_abingo_views
|
507
|
+
end
|
508
|
+
|
509
|
+
CampingABingoTest.create
|
510
|
+
|