zuk-picnic 0.7.999.20090212

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/CHANGELOG.txt +1 -0
  2. data/History.txt +68 -0
  3. data/LICENSE.txt +165 -0
  4. data/Manifest.txt +29 -0
  5. data/README.txt +31 -0
  6. data/Rakefile +62 -0
  7. data/lib/picnic/authentication.rb +218 -0
  8. data/lib/picnic/cli.rb +165 -0
  9. data/lib/picnic/conf.rb +135 -0
  10. data/lib/picnic/controllers.rb +4 -0
  11. data/lib/picnic/logger.rb +41 -0
  12. data/lib/picnic/server.rb +98 -0
  13. data/lib/picnic/service_control.rb +274 -0
  14. data/lib/picnic/version.rb +9 -0
  15. data/lib/picnic.rb +48 -0
  16. data/setup.rb +1585 -0
  17. data/test/picnic_test.rb +11 -0
  18. data/test/test_helper.rb +2 -0
  19. data/vendor/camping-2.0.20090212/CHANGELOG +118 -0
  20. data/vendor/camping-2.0.20090212/COPYING +18 -0
  21. data/vendor/camping-2.0.20090212/README +119 -0
  22. data/vendor/camping-2.0.20090212/Rakefile +174 -0
  23. data/vendor/camping-2.0.20090212/bin/camping +99 -0
  24. data/vendor/camping-2.0.20090212/doc/camping.1.gz +0 -0
  25. data/vendor/camping-2.0.20090212/examples/README +5 -0
  26. data/vendor/camping-2.0.20090212/examples/blog.rb +375 -0
  27. data/vendor/camping-2.0.20090212/examples/campsh.rb +629 -0
  28. data/vendor/camping-2.0.20090212/examples/tepee.rb +242 -0
  29. data/vendor/camping-2.0.20090212/extras/Camping.gif +0 -0
  30. data/vendor/camping-2.0.20090212/extras/flipbook_rdoc.rb +491 -0
  31. data/vendor/camping-2.0.20090212/extras/permalink.gif +0 -0
  32. data/vendor/camping-2.0.20090212/lib/camping/ar/session.rb +132 -0
  33. data/vendor/camping-2.0.20090212/lib/camping/ar.rb +78 -0
  34. data/vendor/camping-2.0.20090212/lib/camping/mab.rb +26 -0
  35. data/vendor/camping-2.0.20090212/lib/camping/reloader.rb +163 -0
  36. data/vendor/camping-2.0.20090212/lib/camping/server.rb +158 -0
  37. data/vendor/camping-2.0.20090212/lib/camping/session.rb +74 -0
  38. data/vendor/camping-2.0.20090212/lib/camping-unabridged.rb +638 -0
  39. data/vendor/camping-2.0.20090212/lib/camping.rb +54 -0
  40. data/vendor/camping-2.0.20090212/setup.rb +1551 -0
  41. data/vendor/camping-2.0.20090212/test/apps/env_debug.rb +65 -0
  42. data/vendor/camping-2.0.20090212/test/apps/forms.rb +95 -0
  43. data/vendor/camping-2.0.20090212/test/apps/misc.rb +86 -0
  44. data/vendor/camping-2.0.20090212/test/apps/sessions.rb +38 -0
  45. data/vendor/camping-2.0.20090212/test/test_camping.rb +54 -0
  46. metadata +128 -0
@@ -0,0 +1,375 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.dirname(__FILE__) + '/../lib'
4
+ require 'camping'
5
+ require 'camping/ar'
6
+ require 'camping/session'
7
+ require 'redcloth'
8
+
9
+ Camping.goes :Blog
10
+
11
+ module Blog
12
+ include Camping::Session
13
+
14
+ module Models
15
+ class Post < Base
16
+ belongs_to :user
17
+
18
+ before_save do |record|
19
+ cloth = RedCloth.new(record.body)
20
+ cloth.hard_breaks = false
21
+ record.html_body = cloth.to_html
22
+ end
23
+ end
24
+
25
+ class Comment < Base; belongs_to :user; end
26
+ class User < Base; end
27
+
28
+ class BasicFields < V 1.1
29
+ def self.up
30
+ create_table :blog_posts, :force => true do |t|
31
+ t.integer :user_id, :null => false
32
+ t.string :title, :limit => 255
33
+ t.text :body, :html_body
34
+ t.timestamps
35
+ end
36
+ create_table :blog_users, :force => true do |t|
37
+ t.string :username, :password
38
+ end
39
+ create_table :blog_comments, :force => true do |t|
40
+ t.integer :post_id, :null => false
41
+ t.string :username
42
+ t.text :body, :html_body
43
+ t.timestamps
44
+ end
45
+ User.create :username => 'admin', :password => 'camping'
46
+ end
47
+ def self.down
48
+ drop_table :blog_posts
49
+ drop_table :blog_users
50
+ drop_table :blog_comments
51
+ end
52
+ end
53
+ end
54
+
55
+ module Controllers
56
+ class Index
57
+ def get
58
+ @posts = Post.all(:order => 'updated_at DESC')
59
+ render :index
60
+ end
61
+ end
62
+
63
+ class PostNew
64
+ def get
65
+ require_login!
66
+ @post = Post.new
67
+ render :add
68
+ end
69
+
70
+ def post
71
+ require_login!
72
+ post = Post.create(:title => input.post_title, :body => input.post_body,
73
+ :user_id => @state.user_id)
74
+ redirect PostN, post
75
+ end
76
+ end
77
+
78
+ class PostN
79
+ def get(post_id)
80
+ @post = Post.find(post_id)
81
+ render :view
82
+ end
83
+ end
84
+
85
+ class Edit < R '/post/(\d+)/edit'
86
+ def get(post_id)
87
+ require_login!
88
+ @post = Post.find(post_id)
89
+ render :edit
90
+ end
91
+
92
+ def post(post_id)
93
+ require_login!
94
+ @post = Post.find(post_id)
95
+ @post.update_attributes :title => input.post_title, :body => input.post_body
96
+ redirect PostN, @post
97
+ end
98
+ end
99
+
100
+ class Login
101
+ def get
102
+ @to = input.to
103
+ render :login
104
+ end
105
+
106
+ def post
107
+ @user = User.find_by_username_and_password(input.username, input.password)
108
+ @to = input.to
109
+
110
+ if @user
111
+ @state.user_id = @user.id
112
+ if @to
113
+ redirect @to
114
+ else
115
+ redirect R(Index)
116
+ end
117
+ else
118
+ @info = 'Wrong username or password'
119
+ end
120
+ render :login
121
+ end
122
+ end
123
+
124
+ class Logout
125
+ def get
126
+ @state.user_id = nil
127
+ redirect Index
128
+ end
129
+ end
130
+
131
+ class Style < R '/styles\.css'
132
+ STYLE = File.read(__FILE__).gsub(/.*__END__/m, '')
133
+
134
+ def get
135
+ @headers['Content-Type'] = 'text/css; charset=utf-8'
136
+ STYLE
137
+ end
138
+ end
139
+ end
140
+
141
+ module Helpers
142
+ def logged_in?
143
+ !!@state.user_id
144
+ end
145
+
146
+ def require_login!
147
+ unless logged_in?
148
+ redirect X::Login, :to => @env.REQUEST_URI
149
+ throw :halt
150
+ end
151
+ end
152
+ end
153
+
154
+ module Views
155
+ def layout
156
+ html do
157
+ head do
158
+ title 'My Blog'
159
+ link :rel => 'stylesheet', :type => 'text/css',
160
+ :href => '/styles.css', :media => 'screen'
161
+ end
162
+ body do
163
+ h1 { a 'My Blog', :href => R(Index) }
164
+
165
+ div.wrapper! do
166
+ text yield
167
+ end
168
+
169
+ hr
170
+
171
+ p.footer! do
172
+ if logged_in?
173
+ _admin_menu
174
+ else
175
+ a 'Login', :href => R(Login, :to => @env.REQUEST_URI)
176
+ text ' to the adminpanel'
177
+ end
178
+ text ' &ndash; Powered by '
179
+ a 'Camping', :href => 'http://code.whytheluckystiff.net/camping'
180
+ end
181
+ end
182
+ end
183
+ end
184
+
185
+ def index
186
+ if @posts.empty?
187
+ h2 'No posts'
188
+ p do
189
+ text 'Could not find any posts. Feel free to '
190
+ a 'add one', :href => R(PostNew)
191
+ text ' yourself'
192
+ end
193
+ else
194
+ @posts.each do |post|
195
+ _post(post)
196
+ end
197
+ end
198
+ end
199
+
200
+ def login
201
+ h2 'Login'
202
+ p.info @info if @info
203
+
204
+ form :action => R(Login), :method => 'post' do
205
+ input :name => 'to', :type => 'hidden', :value => @to if @to
206
+
207
+ label 'Username', :for => 'username'
208
+ input :name => 'username', :id => 'username', :type => 'text'
209
+
210
+ label 'Password', :for => 'password'
211
+ input :name => 'password', :id => 'password', :type => 'password'
212
+
213
+ input :type => 'submit', :class => 'submit', :value => 'Login'
214
+ end
215
+ end
216
+
217
+ def add
218
+ _form(@post, :action => R(PostNew))
219
+ end
220
+
221
+ def edit
222
+ _form(@post, :action => R(Edit, @post))
223
+ end
224
+
225
+ def view
226
+ _post(@post)
227
+ end
228
+
229
+ # partials
230
+ def _admin_menu
231
+ text [['Log out', R(Logout)], ['New', R(PostNew)]].map { |name, to|
232
+ capture { a name, :href => to}
233
+ }.join(' &ndash; ')
234
+ end
235
+
236
+ def _post(post)
237
+ h2 post.title
238
+ p.info do
239
+ text "Written by <strong>#{post.user.username}</strong> "
240
+ text post.updated_at.strftime('%B %M, %Y @ %H:%M ')
241
+ _post_menu(post)
242
+ end
243
+ text post.html_body
244
+ end
245
+
246
+ def _post_menu(post)
247
+ text '('
248
+ a 'view', :href => R(PostN, post)
249
+ if logged_in?
250
+ text ', '
251
+ a 'edit', :href => R(Edit, post)
252
+ end
253
+ text ')'
254
+ end
255
+
256
+ def _form(post, opts)
257
+ form({:method => 'post'}.merge(opts)) do
258
+ label 'Title', :for => 'post_title'
259
+ input :name => 'post_title', :id => 'post_title', :type => 'text',
260
+ :value => post.title
261
+
262
+ label 'Body', :for => 'post_body'
263
+ textarea post.body, :name => 'post_body', :id => 'post_body'
264
+
265
+ input :type => 'hidden', :name => 'post_id', :value => post.id
266
+ input :type => 'submit', :class => 'submit', :value => 'Submit'
267
+ end
268
+ end
269
+ end
270
+ end
271
+
272
+ def Blog.create
273
+ Blog::Models.create_schema :assume => (Blog::Models::Post.table_exists? ? 1.0 : 0.0)
274
+ end
275
+
276
+ __END__
277
+ * {
278
+ margin: 0;
279
+ padding: 0;
280
+ }
281
+
282
+ body {
283
+ font: normal 14px Arial, 'Bitstream Vera Sans', Helvetica, sans-serif;
284
+ line-height: 1.5;
285
+ }
286
+
287
+ h1, h2, h3, h4 {
288
+ font-family: Georgia, serif;
289
+ font-weight: normal;
290
+ }
291
+
292
+ h1 {
293
+ background-color: #EEE;
294
+ border-bottom: 5px solid #6F812D;
295
+ outline: 5px solid #9CB441;
296
+ font-weight: normal;
297
+ font-size: 3em;
298
+ padding: 0.5em 0;
299
+ text-align: center;
300
+ }
301
+
302
+ h1 a { color: #143D55; text-decoration: none }
303
+ h1 a:hover { color: #143D55; text-decoration: underline }
304
+
305
+ h2 {
306
+ font-size: 2em;
307
+ color: #287AA9;
308
+ }
309
+
310
+ #wrapper {
311
+ margin: 3em auto;
312
+ width: 700px;
313
+ }
314
+
315
+ p {
316
+ margin-bottom: 1em;
317
+ }
318
+
319
+ p.info, p#footer {
320
+ color: #999;
321
+ margin-left: 1em;
322
+ }
323
+
324
+ p.info a, p#footer a {
325
+ color: #999;
326
+ }
327
+
328
+ p.info a:hover, p#footer a:hover {
329
+ text-decoration: none;
330
+ }
331
+
332
+ a {
333
+ color: #6F812D;
334
+ }
335
+
336
+ a:hover {
337
+ color: #9CB441;
338
+ }
339
+
340
+ hr {
341
+ border-width: 5px 0;
342
+ border-style: solid;
343
+ border-color: #9CB441;
344
+ border-bottom-color: #6F812D;
345
+ height: 0;
346
+ }
347
+
348
+ p#footer {
349
+ font-size: 0.9em;
350
+ margin: 0;
351
+ padding: 1em;
352
+ text-align: center;
353
+ }
354
+
355
+ label {
356
+ display: inline-block;
357
+ width: 100%;
358
+ }
359
+
360
+ input, textarea {
361
+ margin-bottom: 1em;
362
+ width: 200px;
363
+ }
364
+
365
+ input.submit {
366
+ float: left;
367
+ width: auto;
368
+ }
369
+
370
+ textarea {
371
+ font: normal 14px Arial, 'Bitstream Vera Sans', Helvetica, sans-serif;
372
+ height: 300px;
373
+ width: 400px;
374
+ }
375
+