camping 1.4.2 → 1.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.
@@ -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