bmizerany-sinatra 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/ChangeLog +78 -0
  2. data/LICENSE +22 -0
  3. data/README.rdoc +523 -0
  4. data/Rakefile +162 -0
  5. data/images/404.png +0 -0
  6. data/images/500.png +0 -0
  7. data/lib/sinatra/test/methods.rb +76 -0
  8. data/lib/sinatra/test/rspec.rb +10 -0
  9. data/lib/sinatra/test/spec.rb +10 -0
  10. data/lib/sinatra/test/unit.rb +13 -0
  11. data/lib/sinatra.rb +1466 -0
  12. data/sinatra.gemspec +77 -0
  13. data/test/app_test.rb +299 -0
  14. data/test/application_test.rb +318 -0
  15. data/test/builder_test.rb +101 -0
  16. data/test/custom_error_test.rb +62 -0
  17. data/test/erb_test.rb +136 -0
  18. data/test/event_context_test.rb +15 -0
  19. data/test/events_test.rb +65 -0
  20. data/test/filter_test.rb +30 -0
  21. data/test/haml_test.rb +233 -0
  22. data/test/helper.rb +7 -0
  23. data/test/mapped_error_test.rb +72 -0
  24. data/test/pipeline_test.rb +66 -0
  25. data/test/public/foo.xml +1 -0
  26. data/test/sass_test.rb +57 -0
  27. data/test/sessions_test.rb +39 -0
  28. data/test/streaming_test.rb +118 -0
  29. data/test/sym_params_test.rb +19 -0
  30. data/test/template_test.rb +30 -0
  31. data/test/use_in_file_templates_test.rb +47 -0
  32. data/test/views/foo.builder +1 -0
  33. data/test/views/foo.erb +1 -0
  34. data/test/views/foo.haml +1 -0
  35. data/test/views/foo.sass +2 -0
  36. data/test/views/foo_layout.erb +2 -0
  37. data/test/views/foo_layout.haml +2 -0
  38. data/test/views/layout_test/foo.builder +1 -0
  39. data/test/views/layout_test/foo.erb +1 -0
  40. data/test/views/layout_test/foo.haml +1 -0
  41. data/test/views/layout_test/foo.sass +2 -0
  42. data/test/views/layout_test/layout.builder +3 -0
  43. data/test/views/layout_test/layout.erb +1 -0
  44. data/test/views/layout_test/layout.haml +1 -0
  45. data/test/views/layout_test/layout.sass +2 -0
  46. data/test/views/no_layout/no_layout.builder +1 -0
  47. data/test/views/no_layout/no_layout.haml +1 -0
  48. metadata +129 -0
data/Rakefile ADDED
@@ -0,0 +1,162 @@
1
+ require 'rubygems'
2
+ require 'rake/clean'
3
+ require 'fileutils'
4
+
5
+ task :default => :test
6
+
7
+ # SPECS ===============================================================
8
+
9
+ desc 'Run specs with story style output'
10
+ task :spec do
11
+ sh 'specrb --specdox -Ilib:test test/*_test.rb'
12
+ end
13
+
14
+ desc 'Run specs with unit test style output'
15
+ task :test => FileList['test/*_test.rb'] do |t|
16
+ suite = t.prerequisites.map{|f| "-r#{f.chomp('.rb')}"}.join(' ')
17
+ sh "ruby -Ilib:test #{suite} -e ''", :verbose => false
18
+ end
19
+
20
+ # PACKAGING ============================================================
21
+
22
+ # Load the gemspec using the same limitations as github
23
+ def spec
24
+ @spec ||=
25
+ begin
26
+ require 'rubygems/specification'
27
+ data = File.read('sinatra.gemspec')
28
+ spec = nil
29
+ Thread.new { spec = eval("$SAFE = 3\n#{data}") }.join
30
+ spec
31
+ end
32
+ end
33
+
34
+ def package(ext='')
35
+ "dist/sinatra-#{spec.version}" + ext
36
+ end
37
+
38
+ desc 'Build packages'
39
+ task :package => %w[.gem .tar.gz].map {|e| package(e)}
40
+
41
+ desc 'Build and install as local gem'
42
+ task :install => package('.gem') do
43
+ sh "gem install #{package('.gem')}"
44
+ end
45
+
46
+ directory 'dist/'
47
+
48
+ file package('.gem') => %w[dist/ sinatra.gemspec] + spec.files do |f|
49
+ sh "gem build sinatra.gemspec"
50
+ mv File.basename(f.name), f.name
51
+ end
52
+
53
+ file package('.tar.gz') => %w[dist/] + spec.files do |f|
54
+ sh "git archive --format=tar HEAD | gzip > #{f.name}"
55
+ end
56
+
57
+ # Rubyforge Release / Publish Tasks ==================================
58
+
59
+ desc 'Publish website to rubyforge'
60
+ task 'publish:doc' => 'doc/api/index.html' do
61
+ sh 'scp -rp doc/* rubyforge.org:/var/www/gforge-projects/sinatra/'
62
+ end
63
+
64
+ task 'publish:gem' => [package('.gem'), package('.tar.gz')] do |t|
65
+ sh <<-end
66
+ rubyforge add_release sinatra sinatra #{spec.version} #{package('.gem')} &&
67
+ rubyforge add_file sinatra sinatra #{spec.version} #{package('.tar.gz')}
68
+ end
69
+ end
70
+
71
+ # Website ============================================================
72
+ # Building docs requires HAML and the hanna gem:
73
+ # gem install mislav-hanna --source=http://gems.github.com
74
+
75
+ task 'doc' => ['doc:api','doc:site']
76
+
77
+ desc 'Generate Hanna RDoc under doc/api'
78
+ task 'doc:api' => ['doc/api/index.html']
79
+
80
+ file 'doc/api/index.html' => FileList['lib/**/*.rb','README.rdoc'] do |f|
81
+ rb_files = f.prerequisites
82
+ sh((<<-end).gsub(/\s+/, ' '))
83
+ hanna --charset utf8 \
84
+ --fmt html \
85
+ --inline-source \
86
+ --line-numbers \
87
+ --main README.rdoc \
88
+ --op doc/api \
89
+ --title 'Sinatra API Documentation' \
90
+ #{rb_files.join(' ')}
91
+ end
92
+ end
93
+ CLEAN.include 'doc/api'
94
+
95
+ def rdoc_to_html(file_name)
96
+ require 'rdoc/markup/to_html'
97
+ rdoc = RDoc::Markup::ToHtml.new
98
+ rdoc.convert(File.read(file_name))
99
+ end
100
+
101
+ def haml(locals={})
102
+ require 'haml'
103
+ template = File.read('doc/template.haml')
104
+ haml = Haml::Engine.new(template, :format => :html4, :attr_wrapper => '"')
105
+ haml.render(Object.new, locals)
106
+ end
107
+
108
+ desc 'Build website HTML and stuff'
109
+ task 'doc:site' => ['doc/index.html', 'doc/book.html']
110
+
111
+ file 'doc/index.html' => %w[README.rdoc doc/template.haml] do |file|
112
+ File.open(file.name, 'w') do |file|
113
+ file << haml(:title => 'Sinatra', :content => rdoc_to_html('README.rdoc'))
114
+ end
115
+ end
116
+ CLEAN.include 'doc/index.html'
117
+
118
+ file 'doc/book.html' => ['book/output/sinatra-book.html'] do |file|
119
+ File.open(file.name, 'w') do |file|
120
+ book_content = File.read('book/output/sinatra-book.html')
121
+ file << haml(:title => 'Sinatra Book', :content => book_content)
122
+ end
123
+ end
124
+ CLEAN.include 'doc/book.html'
125
+
126
+ file 'book/output/sinatra-book.html' => FileList['book/**'] do |f|
127
+ unless File.directory?('book')
128
+ sh 'git clone git://github.com/cschneid/sinatra-book.git book'
129
+ end
130
+ sh((<<-SH).strip.gsub(/\s+/, ' '))
131
+ cd book &&
132
+ git fetch origin &&
133
+ git rebase origin/master &&
134
+ thor book:build
135
+ SH
136
+ end
137
+ CLEAN.include 'book/output/sinatra-book.html'
138
+
139
+ desc 'Build the Sinatra book'
140
+ task 'doc:book' => ['book/output/sinatra-book.html']
141
+
142
+ # Gemspec Helpers ====================================================
143
+
144
+ file 'sinatra.gemspec' => FileList['{lib,test,images}/**','Rakefile'] do |f|
145
+ # read spec file and split out manifest section
146
+ spec = File.read(f.name)
147
+ parts = spec.split(" # = MANIFEST =\n")
148
+ fail 'bad spec' if parts.length != 3
149
+ # determine file list from git ls-files
150
+ files = `git ls-files`.
151
+ split("\n").
152
+ sort.
153
+ reject{ |file| file =~ /^\./ }.
154
+ reject { |file| file =~ /^doc/ }.
155
+ map{ |file| " #{file}" }.
156
+ join("\n")
157
+ # piece file back together and write...
158
+ parts[1] = " s.files = %w[\n#{files}\n ]\n"
159
+ spec = parts.join(" # = MANIFEST =\n")
160
+ File.open(f.name, 'w') { |io| io.write(spec) }
161
+ puts "updated #{f.name}"
162
+ end
data/images/404.png ADDED
Binary file
data/images/500.png ADDED
Binary file
@@ -0,0 +1,76 @@
1
+ module Sinatra
2
+
3
+ module Test
4
+
5
+ module Methods
6
+ include Rack::Utils
7
+
8
+ ENV_KEY_NAMES = {
9
+ :accept => "HTTP_ACCEPT",
10
+ :agent => "HTTP_USER_AGENT",
11
+ :host => "HTTP_HOST",
12
+ :session => "HTTP_COOKIE",
13
+ :cookies => "HTTP_COOKIE",
14
+ :content_type => "CONTENT_TYPE"
15
+ }
16
+
17
+ def session(data, key = 'rack.session')
18
+ data = data.from_params if data.respond_to?(:from_params)
19
+ "#{escape(key)}=#{[Marshal.dump(data)].pack("m*")}"
20
+ end
21
+
22
+ def normalize_rack_environment(env)
23
+ env.inject({}) do |hash,(k,v)|
24
+ hash[ENV_KEY_NAMES[k] || k] = v
25
+ hash
26
+ end
27
+ end
28
+
29
+ def hash_to_param_string(hash)
30
+ hash.map { |pair| pair.map{|v|escape(v)}.join('=') }.join('&')
31
+ end
32
+
33
+ %w(get head post put delete).each do |verb|
34
+ http_method = verb.upcase
35
+ define_method("#{verb}_it") do |path, *args|
36
+ @request = Rack::MockRequest.new(Sinatra.build_application)
37
+ opts, input =
38
+ case args.size
39
+ when 2 # input, env
40
+ input, env = args
41
+ [env, input]
42
+ when 1 # params
43
+ if (data = args.first).kind_of?(Hash)
44
+ env = (data.delete(:env) || {})
45
+ [env, hash_to_param_string(data)]
46
+ else
47
+ [{}, data]
48
+ end
49
+ when 0
50
+ [{}, '']
51
+ else
52
+ raise ArgumentError, "zero, one, or two arguments expected"
53
+ end
54
+ opts = normalize_rack_environment(opts)
55
+ opts[:input] ||= input
56
+ @response = @request.request(http_method, path, opts)
57
+ end
58
+ end
59
+
60
+ def follow!
61
+ get_it(@response.location)
62
+ end
63
+
64
+ def method_missing(name, *args)
65
+ if @response.respond_to?(name)
66
+ @response.send(name, *args)
67
+ else
68
+ super
69
+ end
70
+ end
71
+
72
+ end
73
+
74
+ end
75
+
76
+ end
@@ -0,0 +1,10 @@
1
+ require File.dirname(__FILE__) + '/unit'
2
+ require 'spec/interop/test'
3
+
4
+ class Test::Unit::TestCase
5
+
6
+ def should
7
+ @response.should
8
+ end
9
+
10
+ end
@@ -0,0 +1,10 @@
1
+ require File.dirname(__FILE__) + '/unit'
2
+ require 'test/spec'
3
+
4
+ class Test::Unit::TestCase
5
+
6
+ def should
7
+ @response.should
8
+ end
9
+
10
+ end
@@ -0,0 +1,13 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/methods'
3
+
4
+ Test::Unit::TestCase.send(:include, Sinatra::Test::Methods)
5
+
6
+ Sinatra::Application.default_options.merge!(
7
+ :env => :test,
8
+ :run => false,
9
+ :raise_errors => true,
10
+ :logging => false
11
+ )
12
+
13
+ Sinatra.application = nil