camping 1.4.2 → 1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -86,7 +86,7 @@ module Camping
86
86
  #
87
87
  # 1. <tt>require 'camping/session'</tt>
88
88
  # 2. Mixin the module: <tt>module YourApp; include Camping::Session end</tt>
89
- # 3. In your application's <tt>create</tt> method, add a call to <tt>Camping::Models::Schema.create_schema</tt>
89
+ # 3. In your application's <tt>create</tt> method, add a call to <tt>Camping::Models::Session.create_schema</tt>
90
90
  # 4. Throughout your application, use the <tt>@state</tt> var like a hash to store your application's data.
91
91
  #
92
92
  # If you are unfamiliar with the <tt>create</tt> method, see
@@ -1,20 +1,65 @@
1
+ # == About camping/webrick.rb
2
+ #
3
+ # For many who have Ruby installed, Camping and WEBrick is a great option.
4
+ # It's definitely the easiest configuration, however some performance is sacrificed.
5
+ # For better speed, check out Mongrel at http://mongrel.rubyforge.org/, which comes
6
+ # with Camping hooks and is supported by the Camping Tool.
1
7
  require 'camping'
2
8
  require 'webrick/httpservlet/abstract.rb'
3
9
 
4
- class WEBrick::CampingHandler < WEBrick::HTTPServlet::AbstractServlet
10
+ module WEBrick
11
+ # WEBrick::CampingHandler is a very simple handle for hosting Camping apps in
12
+ # a WEBrick server. It's used much like any other WEBrick handler.
13
+ #
14
+ # == Mounting a Camping App
15
+ #
16
+ # Assuming Camping.goes(:Blog), the Blog application can be mounted alongside
17
+ # other WEBrick mounts.
18
+ #
19
+ # s = WEBrick::HTTPServer.new(:BindAddress => host, :Port => port)
20
+ # s.mount "/blog", WEBrick::CampingHandler, Blog
21
+ # s.mount_proc("/") { ... }
22
+ #
23
+ # == How Does it Compare?
24
+ #
25
+ # Compared to other handlers, WEBrick is well-equipped in terms of features.
26
+ #
27
+ # * The <tt>X-Sendfile</tt> header is supported, along with etags and
28
+ # modification time headers for the file served. Since this handler
29
+ # is a subclass of WEBrick::HTTPServlet::DefaultFileHandler, all of its
30
+ # logic is used.
31
+ # * IO is streaming up and down. When you upload a file, it is streamed to
32
+ # the server's filesystem. When you download a file, it is streamed to
33
+ # your browser.
34
+ #
35
+ # While WEBrick is a bit slower than Mongrel and FastCGI options, it's
36
+ # a decent choice, for sure!
37
+ class CampingHandler < WEBrick::HTTPServlet::DefaultFileHandler
38
+ # Creates a CampingHandler, which answers for the application within +klass+.
5
39
  def initialize(server, klass)
6
40
  super(server, klass)
7
41
  @klass = klass
8
42
  end
9
- def do_GET(req, resp)
43
+ # Handler for WEBrick requests (also aliased as do_POST).
44
+ def service(req, resp)
10
45
  controller = @klass.run((req.body and StringIO.new(req.body)), req.meta_vars)
11
46
  resp.status = controller.status
47
+ @local_path = nil
12
48
  controller.headers.each do |k, v|
13
- [*v].each do |vi|
14
- resp[k] = vi
49
+ if k =~ /^X-SENDFILE$/i
50
+ @local_path = v
51
+ else
52
+ [*v].each do |vi|
53
+ resp[k] = vi
54
+ end
15
55
  end
16
56
  end
17
- resp.body = controller.body
57
+
58
+ if @local_path
59
+ do_GET(req, res)
60
+ else
61
+ resp.body = controller.body.to_s
62
+ end
18
63
  end
19
- alias_method :do_POST, :do_GET
64
+ end
20
65
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.11
2
+ rubygems_version: 0.9.0.1
3
3
  specification_version: 1
4
4
  name: camping
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.4.2
7
- date: 2006-05-18 00:00:00 -06:00
6
+ version: "1.5"
7
+ date: 2006-10-03 00:00:00 -06:00
8
8
  summary: minature rails for stay-at-home moms
9
9
  require_paths:
10
- - lib
10
+ - lib
11
11
  email: why@ruby-lang.org
12
12
  homepage: http://code.whytheluckystiff.net/camping/
13
13
  rubyforge_project:
@@ -18,87 +18,88 @@ bindir: bin
18
18
  has_rdoc: true
19
19
  required_ruby_version: !ruby/object:Gem::Version::Requirement
20
20
  requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 1.8.2
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.8.2
24
24
  version:
25
25
  platform: ruby
26
26
  signing_key:
27
27
  cert_chain:
28
+ post_install_message:
28
29
  authors:
29
- - why the lucky stiff
30
+ - why the lucky stiff
30
31
  files:
31
- - COPYING
32
- - README
33
- - Rakefile
34
- - bin/camping
35
- - lib/camping
36
- - lib/camping.rb
37
- - lib/camping-unabridged.rb
38
- - lib/camping/session.rb
39
- - lib/camping/webrick.rb
40
- - extras/permalink.gif
41
- - extras/Camping.gif
42
- - extras/flipbook_rdoc.rb
43
- - examples/tepee/tepee.rb
44
- - examples/blog/blog.rb
45
- - examples/charts/charts.rb
46
- - examples/charts/pie.rb
47
- - examples/campsh/campsh.rb
48
- - CHANGELOG
32
+ - COPYING
33
+ - README
34
+ - Rakefile
35
+ - bin/camping
36
+ - doc/camping.1.gz
37
+ - lib/camping
38
+ - lib/camping.rb
39
+ - lib/camping-unabridged.rb
40
+ - lib/camping/reloader.rb
41
+ - lib/camping/fastcgi.rb
42
+ - lib/camping/session.rb
43
+ - lib/camping/db.rb
44
+ - lib/camping/webrick.rb
45
+ - extras/permalink.gif
46
+ - extras/Camping.gif
47
+ - extras/flipbook_rdoc.rb
48
+ - examples/tepee.rb
49
+ - examples/blog.rb
50
+ - examples/campsh.rb
51
+ - CHANGELOG
49
52
  test_files: []
50
53
 
51
54
  rdoc_options:
52
- - --quiet
53
- - --title
54
- - Camping, the Documentation
55
- - --template
56
- - extras/flipbook_rdoc.rb
57
- - --opname
58
- - index.html
59
- - --line-numbers
60
- - --main
61
- - README
62
- - --inline-source
63
- - --exclude
64
- - ^(examples|extras)\/
65
- - --exclude
66
- - lib/camping.rb
55
+ - --quiet
56
+ - --title
57
+ - Camping, the Documentation
58
+ - --opname
59
+ - index.html
60
+ - --line-numbers
61
+ - --main
62
+ - README
63
+ - --inline-source
64
+ - --exclude
65
+ - ^(examples|extras)\/
66
+ - --exclude
67
+ - lib/camping.rb
67
68
  extra_rdoc_files:
68
- - README
69
- - CHANGELOG
70
- - COPYING
69
+ - README
70
+ - CHANGELOG
71
+ - COPYING
71
72
  executables:
72
- - camping
73
+ - camping
73
74
  extensions: []
74
75
 
75
76
  requirements: []
76
77
 
77
78
  dependencies:
78
- - !ruby/object:Gem::Dependency
79
- name: activerecord
80
- version_requirement:
81
- version_requirements: !ruby/object:Gem::Version::Requirement
82
- requirements:
83
- - - ">="
84
- - !ruby/object:Gem::Version
85
- version: 1.14.2
86
- version:
87
- - !ruby/object:Gem::Dependency
88
- name: markaby
89
- version_requirement:
90
- version_requirements: !ruby/object:Gem::Version::Requirement
91
- requirements:
92
- - - ">="
93
- - !ruby/object:Gem::Version
94
- version: "0.4"
95
- version:
96
- - !ruby/object:Gem::Dependency
97
- name: metaid
98
- version_requirement:
99
- version_requirements: !ruby/object:Gem::Version::Requirement
100
- requirements:
101
- - - ">"
102
- - !ruby/object:Gem::Version
103
- version: 0.0.0
104
- version:
79
+ - !ruby/object:Gem::Dependency
80
+ name: activesupport
81
+ version_requirement:
82
+ version_requirements: !ruby/object:Gem::Version::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: 1.3.1
87
+ version:
88
+ - !ruby/object:Gem::Dependency
89
+ name: markaby
90
+ version_requirement:
91
+ version_requirements: !ruby/object:Gem::Version::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: "0.5"
96
+ version:
97
+ - !ruby/object:Gem::Dependency
98
+ name: metaid
99
+ version_requirement:
100
+ version_requirements: !ruby/object:Gem::Version::Requirement
101
+ requirements:
102
+ - - ">"
103
+ - !ruby/object:Gem::Version
104
+ version: 0.0.0
105
+ version:
@@ -1,89 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- $:.unshift File.dirname(__FILE__) + "/../../lib"
4
- $:.unshift File.dirname(__FILE__)
5
- require 'rubygems'
6
- require 'fileutils'
7
- require 'camping'
8
- require 'rvg/rvg'
9
- require 'pie'
10
-
11
- Camping.goes :Charts
12
-
13
- module Charts::Controllers
14
- class Index < R '/'
15
- def get
16
- # find all charts
17
- @charts = Dir.glob("charts/*.gif").sort_by{|f|f.match(/(\d+)/)[1].to_i}.reverse
18
-
19
- # keep only ten charts
20
- (@charts[10..-1] || []).each{|f|FileUtils.rm(f,:force => true)}
21
- @charts = @charts[0..9]
22
-
23
- render :index
24
- end
25
- end
26
-
27
- class Create < R '/create'
28
- def post
29
- # get our data
30
- slices = input.data.split(',')
31
- slices.reject!{|slice| slice !~ /\d+/}
32
- slices.map!{|slice| slice.match(/(\d+)/)[1].to_i}
33
- slices = [100] if slices.empty?
34
-
35
- data = slices.map{|slice| {:value => slice, :style => "rgb(#{rand(255)},#{rand(255)},#{rand(255)})"}}
36
-
37
- # save our chart
38
- chart = Pie.new(data)
39
- i = Dir.glob("charts/*.gif").map{|f|f.match(/(\d+)/)[1].to_i + 1}.max || 1
40
- chart.draw(25).write("charts/#{i}.gif")
41
-
42
- redirect Index
43
- end
44
- end
45
-
46
- class Chart < R '/charts/(.+\.gif)'
47
- def get filename
48
- @headers["Content-Type"] = "image/gif"
49
-
50
- @body = File.read("charts/#{filename}")
51
- end
52
- end
53
- end
54
-
55
- module Charts::Views
56
-
57
- def layout
58
- html do
59
- head do
60
- title 'Charts!'
61
- end
62
- body do
63
- div.content do
64
- self << yield
65
- end
66
- end
67
- end
68
- end
69
-
70
- def index
71
- form(:method => 'post', :action => '/create') do
72
- label do
73
- input :name => 'data', :type => 'text', :value => '10,20,30'
74
- end
75
- input :type => 'submit', :value => 'Prepare a chart'
76
- end
77
-
78
- div.charts do
79
- @charts.each do |src|
80
- img :src => src
81
- end
82
- end
83
- end
84
-
85
- end
86
-
87
- if __FILE__ == $0
88
- Charts.run
89
- end
@@ -1,70 +0,0 @@
1
- class Pie
2
-
3
- RADIANS = Math::PI/180
4
- MIN_PERCENT = (0.1 / 360.0) * 100
5
- MAX_PERCENT = 100 - MIN_PERCENT
6
-
7
- def initialize(data)
8
- @data = data
9
- end
10
-
11
- def draw(size)
12
- position = size / 2
13
- offset = (size < 20 ? 1 : size / 20)
14
- offset = 5 if offset > 5
15
- radius = position - offset
16
-
17
- total = @data.inject(0){|sum, item| sum + item[:value].to_f}
18
- percent_scale = 100.0 / total
19
-
20
- full_circle = false
21
- angles = [12.5 * 3.6 * RADIANS]
22
- slices = []
23
-
24
- @data.each do |item|
25
- percent = percent_scale * item[:value].to_f
26
- percent = MIN_PERCENT if percent < MIN_PERCENT
27
- if percent > MAX_PERCENT
28
- full_circle = item
29
- else
30
- prev_angle = angles.last
31
- angles << prev_angle + (percent * 3.6 * RADIANS)
32
- slices << {:start => angles[-2], :end => angles[-1], :style => item[:style]}
33
- end
34
- end
35
-
36
- rvg = Magick::RVG.new(size,size) do |canvas|
37
- canvas.background_fill = 'white'
38
-
39
- # is there a full circle here? then draw it
40
- canvas.circle(radius,position,position).styles(:fill => full_circle[:style]) if full_circle
41
-
42
- # draw the fills of the slices
43
- slices.each do |slice|
44
- canvas.path(slice_path(position,position,radius,slice[:start],slice[:end])).styles(:fill => slice[:style])
45
- end
46
-
47
- # outline the graph
48
- canvas.circle(radius,position,position).styles(:stroke => 'black', :stroke_width => 0.7, :fill => 'transparent')
49
-
50
- # draw lines between each slice
51
- angles[0..-2].each do |a|
52
- canvas.line(position, position, position+(Math.sin(a)*radius), position-(Math.cos(a)*radius)).styles(:stroke => 'black', :stroke_width => 0.7, :fill => 'transparent')
53
- end
54
- end
55
-
56
- rvg.draw
57
-
58
- end
59
-
60
- protected
61
-
62
- def slice_path(x, y, size, start_angle, end_angle)
63
- x_start = x+(Math.sin(start_angle) * size)
64
- y_start = y-(Math.cos(start_angle) * size)
65
- x_end = x+(Math.sin(end_angle) * size)
66
- y_end = y-(Math.cos(end_angle) * size)
67
- "M#{x},#{y} L#{x_start},#{y_start} A#{size},#{size} 0, #{end_angle - start_angle >= 50 * 3.6 * RADIANS ? '1' : '0'},1, #{x_end} #{y_end} Z"
68
- end
69
-
70
- end
@@ -1,149 +0,0 @@
1
- #!/usr/bin/ruby
2
- $:.unshift File.dirname(__FILE__) + "/../../lib"
3
- %w(rubygems redcloth camping acts_as_versioned).each { |lib| require lib }
4
-
5
- Camping.goes :Tepee
6
-
7
- module Tepee::Models
8
- def self.schema(&block)
9
- @@schema = block if block_given?
10
- @@schema
11
- end
12
-
13
- class Page < Base
14
- PAGE_LINK = /\[\[([^\]|]*)[|]?([^\]]*)\]\]/
15
- validates_uniqueness_of :title
16
- before_save { |r| r.title = r.title.underscore }
17
- acts_as_versioned
18
- end
19
- end
20
-
21
- Tepee::Models.schema do
22
- create_table :tepee_pages, :force => true do |t|
23
- t.column :title, :string, :limit => 255
24
- t.column :body, :text
25
- end
26
- Tepee::Models::Page.create_versioned_table
27
- end
28
-
29
- module Tepee::Controllers
30
- class Index < R '/'
31
- def get
32
- redirect Show, 'home_page'
33
- end
34
- end
35
-
36
- class List < R '/list'
37
- def get
38
- @pages = Page.find :all, :order => 'title'
39
- render :list
40
- end
41
- end
42
-
43
- class Show < R '/s/(\w+)', '/s/(\w+)/(\d+)'
44
- def get page_name, version = nil
45
- redirect(Edit, page_name, 1) and return unless @page = Page.find_by_title(page_name)
46
- @version = (version.nil? or version == @page.version.to_s) ? @page : @page.versions.find_by_version(version)
47
- render :show
48
- end
49
- end
50
-
51
- class Edit < R '/e/(\w+)/(\d+)', '/e/(\w+)'
52
- def get page_name, version = nil
53
- @page = Page.find_or_create_by_title(page_name)
54
- @page = @page.versions.find_by_version(version) unless version.nil? or version == @page.version.to_s
55
- render :edit
56
- end
57
-
58
- def post page_name
59
- Page.find_or_create_by_title(page_name).update_attributes :body => input.post_body and redirect Show, page_name
60
- end
61
- end
62
- end
63
-
64
- module Tepee::Views
65
- def layout
66
- html do
67
- head do
68
- title 'test'
69
- end
70
- body do
71
- p do
72
- small do
73
- span "welcome to " ; a 'tepee', :href => "http://code.whytheluckystiff.net/svn/camping/trunk/examples/tepee/"
74
- span '. go ' ; a 'home', :href => R(Show, 'home_page')
75
- span '. list all ' ; a 'pages', :href => R(List)
76
- end
77
- end
78
- div.content do
79
- self << yield
80
- end
81
- end
82
- end
83
- end
84
-
85
- def show
86
- h1 @page.title
87
- div { _markup @version.body }
88
- p do
89
- a 'edit', :href => R(Edit, @version.title, @version.version)
90
- a 'back', :href => R(Show, @version.title, @version.version-1) unless @version.version == 1
91
- a 'next', :href => R(Show, @version.title, @version.version+1) unless @version.version == @page.version
92
- a 'current', :href => R(Show, @version.title) unless @version.version == @page.version
93
- end
94
- end
95
-
96
- def edit
97
- form :method => 'post', :action => R(Edit, @page.title) do
98
- p do
99
- label 'Body' ; br
100
- textarea @page.body, :name => 'post_body', :rows => 50, :cols => 100
101
- end
102
-
103
- p do
104
- input :type => 'submit'
105
- a 'cancel', :href => R(Show, @page.title, @page.version)
106
- end
107
- end
108
- end
109
-
110
- def list
111
- h1 'all pages'
112
- ul { @pages.each { |p| li { a p.title, :href => R(Show, p.title) } } }
113
- end
114
-
115
- def _markup body
116
- return '' if body.blank?
117
- body.gsub!(Tepee::Models::Page::PAGE_LINK) do
118
- page = title = $1
119
- title = $2 unless $2.empty?
120
- page = page.gsub /\W/, '_'
121
- if Tepee::Models::Page.find(:all, :select => 'title').collect { |p| p.title }.include?(page)
122
- %Q{<a href="#{self/R(Show, page)}">#{title}</a>}
123
- else
124
- %Q{<span>#{title}<a href="#{self/R(Edit, page, 1)}">?</a></span>}
125
- end
126
- end
127
- RedCloth.new(body, [ :hard_breaks ]).to_html
128
- end
129
- end
130
-
131
- def Tepee.create
132
- unless Tepee::Models::Page.table_exists?
133
- ActiveRecord::Schema.define(&Tepee::Models.schema)
134
- Tepee::Models::Page.reset_column_information
135
- end
136
- end
137
-
138
- if __FILE__ == $0
139
- require 'mongrel/camping'
140
-
141
- Tepee::Models::Base.establish_connection :adapter => 'sqlite3', :database => 'tepee.db'
142
- Tepee::Models::Base.logger = Logger.new('camping.log')
143
- Tepee::Models::Base.threaded_connections=false
144
- Tepee.create
145
-
146
- server = Mongrel::Camping::start("0.0.0.0",3001,"/tepee",Tepee)
147
- puts "** Tepee example is running at http://localhost:3000/tepee"
148
- server.join
149
- end