middleman 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. data/Rakefile +1 -0
  2. data/VERSION +1 -1
  3. data/middleman.gemspec +65 -6
  4. data/pkg/middleman-0.2.1.gem +0 -0
  5. data/rdoc/classes/Middleman.html +164 -0
  6. data/rdoc/created.rid +1 -0
  7. data/rdoc/files/README_rdoc.html +114 -0
  8. data/rdoc/files/lib/middleman_rb.html +111 -0
  9. data/rdoc/fr_class_index.html +27 -0
  10. data/rdoc/fr_file_index.html +28 -0
  11. data/rdoc/fr_method_index.html +27 -0
  12. data/rdoc/index.html +24 -0
  13. data/rdoc/rdoc-style.css +208 -0
  14. data/vendor/rack-test/History.txt +64 -0
  15. data/vendor/rack-test/MIT-LICENSE.txt +19 -0
  16. data/vendor/rack-test/README.rdoc +57 -0
  17. data/vendor/rack-test/Rakefile +62 -0
  18. data/vendor/rack-test/lib/rack/mock_session.rb +57 -0
  19. data/vendor/rack-test/lib/rack/test.rb +246 -0
  20. data/vendor/rack-test/lib/rack/test/cookie_jar.rb +169 -0
  21. data/vendor/rack-test/lib/rack/test/methods.rb +73 -0
  22. data/vendor/rack-test/lib/rack/test/mock_digest_request.rb +27 -0
  23. data/vendor/rack-test/lib/rack/test/uploaded_file.rb +36 -0
  24. data/vendor/rack-test/lib/rack/test/utils.rb +75 -0
  25. data/vendor/rack-test/spec/fixtures/config.ru +3 -0
  26. data/vendor/rack-test/spec/fixtures/fake_app.rb +109 -0
  27. data/vendor/rack-test/spec/fixtures/foo.txt +1 -0
  28. data/vendor/rack-test/spec/rack/test/cookie_spec.rb +176 -0
  29. data/vendor/rack-test/spec/rack/test/digest_auth_spec.rb +48 -0
  30. data/vendor/rack-test/spec/rack/test/multipart_spec.rb +85 -0
  31. data/vendor/rack-test/spec/rack/test/utils_spec.rb +44 -0
  32. data/vendor/rack-test/spec/rack/test_spec.rb +363 -0
  33. data/vendor/rack-test/spec/rcov.opts +1 -0
  34. data/vendor/rack-test/spec/spec.opts +1 -0
  35. data/vendor/rack-test/spec/spec_helper.rb +48 -0
  36. data/vendor/sinatra-markaby/CHANGES +7 -0
  37. data/vendor/sinatra-markaby/LICENSE +20 -0
  38. data/vendor/sinatra-markaby/README.rdoc +33 -0
  39. data/vendor/sinatra-markaby/Rakefile +45 -0
  40. data/vendor/sinatra-markaby/TODO +3 -0
  41. data/vendor/sinatra-markaby/VERSION.yml +4 -0
  42. data/vendor/sinatra-markaby/lib/sinatra/markaby.rb +31 -0
  43. data/vendor/sinatra-markaby/sinatra-markaby.gemspec +49 -0
  44. data/vendor/sinatra-markaby/test/sinatra_markaby_test.rb +72 -0
  45. data/vendor/sinatra-markaby/test/test_helper.rb +19 -0
  46. data/vendor/sinatra-markaby/test/views/hello.mab +1 -0
  47. data/vendor/sinatra-markaby/test/views/html.mab +4 -0
  48. data/vendor/sinatra-maruku/LICENSE +22 -0
  49. data/vendor/sinatra-maruku/README.markdown +85 -0
  50. data/vendor/sinatra-maruku/Rakefile +34 -0
  51. data/vendor/sinatra-maruku/VERSION.yml +4 -0
  52. data/vendor/sinatra-maruku/examples/app.rb +8 -0
  53. data/vendor/sinatra-maruku/examples/config.ru +4 -0
  54. data/vendor/sinatra-maruku/examples/mapp.rb +15 -0
  55. data/vendor/sinatra-maruku/examples/public/javascripts/application.js +0 -0
  56. data/vendor/sinatra-maruku/examples/public/stylesheets/application.css +23 -0
  57. data/vendor/sinatra-maruku/examples/public/stylesheets/print.css +0 -0
  58. data/vendor/sinatra-maruku/examples/views/index.maruku +32 -0
  59. data/vendor/sinatra-maruku/examples/views/layout.maruku +9 -0
  60. data/vendor/sinatra-maruku/lib/sinatra/maruku.rb +25 -0
  61. data/vendor/sinatra-maruku/sinatra-maruku.gemspec +70 -0
  62. data/vendor/sinatra-maruku/test/sinatra_maruku_test.rb +91 -0
  63. data/vendor/sinatra-maruku/test/test_helper.rb +21 -0
  64. data/vendor/sinatra-maruku/test/views/hello.maruku +1 -0
  65. data/vendor/sinatra-maruku/test/views/layout2.maruku +2 -0
  66. metadata +63 -4
  67. data/.document +0 -5
  68. data/.gitignore +0 -6
  69. data/.gitmodules +0 -9
@@ -0,0 +1,62 @@
1
+ require "rubygems"
2
+ require "rake/rdoctask"
3
+ require "rake/gempackagetask"
4
+ require "rake/clean"
5
+ require "spec/rake/spectask"
6
+ require File.expand_path("./lib/rack/test")
7
+
8
+ Spec::Rake::SpecTask.new do |t|
9
+ t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
10
+ end
11
+
12
+ desc "Run all specs in spec directory with RCov"
13
+ Spec::Rake::SpecTask.new(:rcov) do |t|
14
+ t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
15
+ t.rcov = true
16
+ t.rcov_opts = lambda do
17
+ IO.readlines(File.dirname(__FILE__) + "/spec/rcov.opts").map {|l| l.chomp.split " "}.flatten
18
+ end
19
+ end
20
+
21
+ desc "Run the specs"
22
+ task :default => :spec
23
+
24
+ spec = Gem::Specification.new do |s|
25
+ s.name = "rack-test"
26
+ s.version = Rack::Test::VERSION
27
+ s.author = "Bryan Helmkamp"
28
+ s.email = "bryan" + "@" + "brynary.com"
29
+ s.homepage = "http://github.com/brynary/rack-test"
30
+ s.summary = "Simple testing API built on Rack"
31
+ s.description = s.summary
32
+ s.files = %w[History.txt Rakefile README.rdoc] + Dir["lib/**/*"]
33
+
34
+ # rdoc
35
+ s.has_rdoc = true
36
+ s.extra_rdoc_files = %w(README.rdoc MIT-LICENSE.txt)
37
+ end
38
+
39
+ Rake::GemPackageTask.new(spec) do |package|
40
+ package.gem_spec = spec
41
+ end
42
+
43
+ desc "Delete generated RDoc"
44
+ task :clobber_docs do
45
+ FileUtils.rm_rf("doc")
46
+ end
47
+
48
+ desc "Generate RDoc"
49
+ task :docs => :clobber_docs do
50
+ system "hanna --title 'Rack::Test #{Rack::Test::VERSION} API Documentation'"
51
+ end
52
+
53
+ desc 'Install the package as a gem.'
54
+ task :install => [:clean, :package] do
55
+ gem = Dir['pkg/*.gem'].first
56
+ sh "sudo gem install --no-rdoc --no-ri --local #{gem}"
57
+ end
58
+
59
+ desc 'Removes trailing whitespace'
60
+ task :whitespace do
61
+ sh %{find . -name '*.rb' -exec sed -i '' 's/ *$//g' {} \\;}
62
+ end
@@ -0,0 +1,57 @@
1
+ module Rack
2
+
3
+ class MockSession
4
+ attr_writer :cookie_jar
5
+ attr_reader :last_response
6
+ attr_reader :default_host
7
+
8
+ def initialize(app, default_host = Rack::Test::DEFAULT_HOST)
9
+ @app = app
10
+ @after_request = []
11
+ @default_host = default_host
12
+ end
13
+
14
+ def after_request(&block)
15
+ @after_request << block
16
+ end
17
+
18
+ def clear_cookies
19
+ @cookie_jar = Rack::Test::CookieJar.new([], @default_host)
20
+ end
21
+
22
+ def set_cookie(cookie, uri = nil)
23
+ cookie_jar.merge(cookie, uri)
24
+ end
25
+
26
+ def request(uri, env)
27
+ env["HTTP_COOKIE"] ||= cookie_jar.for(uri)
28
+ @last_request = Rack::Request.new(env)
29
+ status, headers, body = @app.call(@last_request.env)
30
+ @last_response = MockResponse.new(status, headers, body, env["rack.errors"].flush)
31
+ cookie_jar.merge(last_response.headers["Set-Cookie"], uri)
32
+
33
+ @after_request.each { |hook| hook.call }
34
+ @last_response
35
+ end
36
+
37
+ # Return the last request issued in the session. Raises an error if no
38
+ # requests have been sent yet.
39
+ def last_request
40
+ raise Rack::Test::Error.new("No request yet. Request a page first.") unless @last_request
41
+ @last_request
42
+ end
43
+
44
+ # Return the last response received in the session. Raises an error if
45
+ # no requests have been sent yet.
46
+ def last_response
47
+ raise Rack::Test::Error.new("No response yet. Request a page first.") unless @last_response
48
+ @last_response
49
+ end
50
+
51
+ def cookie_jar
52
+ @cookie_jar ||= Rack::Test::CookieJar.new([], @default_host)
53
+ end
54
+
55
+ end
56
+
57
+ end
@@ -0,0 +1,246 @@
1
+ unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__) + "/.."))
2
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/.."))
3
+ end
4
+
5
+ require "uri"
6
+ require "rack"
7
+ require "rack/mock_session"
8
+ require "rack/test/cookie_jar"
9
+ require "rack/test/mock_digest_request"
10
+ require "rack/test/utils"
11
+ require "rack/test/methods"
12
+ require "rack/test/uploaded_file"
13
+
14
+ module Rack
15
+ module Test
16
+
17
+ VERSION = "0.4.0"
18
+
19
+ DEFAULT_HOST = "example.org"
20
+ MULTIPART_BOUNDARY = "----------XnJLe9ZIbbGUYtzPQJ16u1"
21
+
22
+ # The common base class for exceptions raised by Rack::Test
23
+ class Error < StandardError; end
24
+
25
+ class Session
26
+ extend Forwardable
27
+ include Rack::Test::Utils
28
+
29
+ def_delegators :@rack_mock_session, :clear_cookies, :set_cookie, :last_response, :last_request
30
+
31
+ # Initialize a new session for the given Rack app
32
+ def initialize(mock_session)
33
+ @headers = {}
34
+
35
+ if mock_session.is_a?(MockSession)
36
+ @rack_mock_session = mock_session
37
+ else
38
+ @rack_mock_session = MockSession.new(mock_session)
39
+ end
40
+
41
+ @default_host = @rack_mock_session.default_host
42
+ end
43
+
44
+ # Issue a GET request for the given URI with the given params and Rack
45
+ # environment. Stores the issues request object in #last_request and
46
+ # the app's response in #last_response. Yield #last_response to a block
47
+ # if given.
48
+ #
49
+ # Example:
50
+ # get "/"
51
+ def get(uri, params = {}, env = {}, &block)
52
+ env = env_for(uri, env.merge(:method => "GET", :params => params))
53
+ process_request(uri, env, &block)
54
+ end
55
+
56
+ # Issue a POST request for the given URI. See #get
57
+ #
58
+ # Example:
59
+ # post "/signup", "name" => "Bryan"
60
+ def post(uri, params = {}, env = {}, &block)
61
+ env = env_for(uri, env.merge(:method => "POST", :params => params))
62
+ process_request(uri, env, &block)
63
+ end
64
+
65
+ # Issue a PUT request for the given URI. See #get
66
+ #
67
+ # Example:
68
+ # put "/"
69
+ def put(uri, params = {}, env = {}, &block)
70
+ env = env_for(uri, env.merge(:method => "PUT", :params => params))
71
+ process_request(uri, env, &block)
72
+ end
73
+
74
+ # Issue a DELETE request for the given URI. See #get
75
+ #
76
+ # Example:
77
+ # delete "/"
78
+ def delete(uri, params = {}, env = {}, &block)
79
+ env = env_for(uri, env.merge(:method => "DELETE", :params => params))
80
+ process_request(uri, env, &block)
81
+ end
82
+
83
+ # Issue a HEAD request for the given URI. See #get
84
+ #
85
+ # Example:
86
+ # head "/"
87
+ def head(uri, params = {}, env = {}, &block)
88
+ env = env_for(uri, env.merge(:method => "HEAD", :params => params))
89
+ process_request(uri, env, &block)
90
+ end
91
+
92
+ # Issue a request to the Rack app for the given URI and optional Rack
93
+ # environment. Stores the issues request object in #last_request and
94
+ # the app's response in #last_response. Yield #last_response to a block
95
+ # if given.
96
+ #
97
+ # Example:
98
+ # request "/"
99
+ def request(uri, env = {}, &block)
100
+ env = env_for(uri, env)
101
+ process_request(uri, env, &block)
102
+ end
103
+
104
+ # Set a header to be included on all subsequent requests through the
105
+ # session. Use a value of nil to remove a previously configured header.
106
+ #
107
+ # Example:
108
+ # header "User-Agent", "Firefox"
109
+ def header(name, value)
110
+ if value.nil?
111
+ @headers.delete(name)
112
+ else
113
+ @headers[name] = value
114
+ end
115
+ end
116
+
117
+ # Set the username and password for HTTP Basic authorization, to be
118
+ # included in subsequent requests in the HTTP_AUTHORIZATION header.
119
+ #
120
+ # Example:
121
+ # basic_authorize "bryan", "secret"
122
+ def basic_authorize(username, password)
123
+ encoded_login = ["#{username}:#{password}"].pack("m*")
124
+ header('HTTP_AUTHORIZATION', "Basic #{encoded_login}")
125
+ end
126
+
127
+ alias_method :authorize, :basic_authorize
128
+
129
+ def digest_authorize(username, password)
130
+ @digest_username = username
131
+ @digest_password = password
132
+ end
133
+
134
+ # Rack::Test will not follow any redirects automatically. This method
135
+ # will follow the redirect returned in the last response. If the last
136
+ # response was not a redirect, an error will be raised.
137
+ def follow_redirect!
138
+ unless last_response.redirect?
139
+ raise Error.new("Last response was not a redirect. Cannot follow_redirect!")
140
+ end
141
+
142
+ get(last_response["Location"])
143
+ end
144
+
145
+ private
146
+
147
+ def env_for(path, env)
148
+ uri = URI.parse(path)
149
+ uri.host ||= @default_host
150
+
151
+ env = default_env.merge(env)
152
+
153
+ env.update("HTTPS" => "on") if URI::HTTPS === uri
154
+ env["X-Requested-With"] = "XMLHttpRequest" if env[:xhr]
155
+
156
+ if (env[:method] == "POST" || env["REQUEST_METHOD"] == "POST" ||
157
+ env[:method] == "PUT" || env["REQUEST_METHOD"] == "PUT") && !env.has_key?(:input)
158
+ env["CONTENT_TYPE"] ||= "application/x-www-form-urlencoded"
159
+
160
+ multipart = (Hash === env[:params]) &&
161
+ env[:params].any? { |_, v| UploadedFile === v }
162
+
163
+ if multipart
164
+ env[:input] = multipart_body(env.delete(:params))
165
+ env["CONTENT_LENGTH"] ||= env[:input].length.to_s
166
+ env["CONTENT_TYPE"] = "multipart/form-data; boundary=#{MULTIPART_BOUNDARY}"
167
+ else
168
+ env[:input] = params_to_string(env.delete(:params))
169
+ end
170
+ end
171
+
172
+ params = env[:params] || {}
173
+ params.update(parse_query(uri.query))
174
+
175
+ uri.query = requestify(params)
176
+
177
+ if env.has_key?(:cookie)
178
+ set_cookie(env.delete(:cookie), uri)
179
+ end
180
+
181
+ Rack::MockRequest.env_for(uri.to_s, env)
182
+ end
183
+
184
+ def process_request(uri, env)
185
+ uri = URI.parse(uri)
186
+ uri.host ||= @default_host
187
+
188
+ @rack_mock_session.request(uri, env)
189
+
190
+ if retry_with_digest_auth?(env)
191
+ auth_env = env.merge({
192
+ "HTTP_AUTHORIZATION" => digest_auth_header,
193
+ "rack-test.digest_auth_retry" => true
194
+ })
195
+ auth_env.delete('rack.request')
196
+ process_request(uri.path, auth_env)
197
+ else
198
+ yield last_response if block_given?
199
+
200
+ last_response
201
+ end
202
+ end
203
+
204
+ def digest_auth_header
205
+ challenge = last_response["WWW-Authenticate"].split(" ", 2).last
206
+ params = Rack::Auth::Digest::Params.parse(challenge)
207
+
208
+ params.merge!({
209
+ "username" => @digest_username,
210
+ "nc" => "00000001",
211
+ "cnonce" => "nonsensenonce",
212
+ "uri" => last_request.path_info,
213
+ "method" => last_request.env["REQUEST_METHOD"],
214
+ })
215
+
216
+ params["response"] = MockDigestRequest.new(params).response(@digest_password)
217
+
218
+ "Digest #{params}"
219
+ end
220
+
221
+ def retry_with_digest_auth?(env)
222
+ last_response.status == 401 &&
223
+ digest_auth_configured? &&
224
+ !env["rack-test.digest_auth_retry"]
225
+ end
226
+
227
+ def digest_auth_configured?
228
+ @digest_username
229
+ end
230
+
231
+ def default_env
232
+ { "rack.test" => true, "REMOTE_ADDR" => "127.0.0.1" }.merge(@headers)
233
+ end
234
+
235
+ def params_to_string(params)
236
+ case params
237
+ when Hash then requestify(params)
238
+ when nil then ""
239
+ else params
240
+ end
241
+ end
242
+
243
+ end
244
+
245
+ end
246
+ end
@@ -0,0 +1,169 @@
1
+ require "uri"
2
+ module Rack
3
+ module Test
4
+
5
+ class Cookie
6
+ include Rack::Utils
7
+
8
+ # :api: private
9
+ attr_reader :name, :value
10
+
11
+ # :api: private
12
+ def initialize(raw, uri = nil, default_host = DEFAULT_HOST)
13
+ @default_host = default_host
14
+ uri ||= default_uri
15
+
16
+ # separate the name / value pair from the cookie options
17
+ @name_value_raw, options = raw.split(/[;,] */n, 2)
18
+
19
+ @name, @value = parse_query(@name_value_raw, ';').to_a.first
20
+ @options = parse_query(options, ';')
21
+
22
+ @options["domain"] ||= (uri.host || default_host)
23
+ @options["path"] ||= uri.path.sub(/\/[^\/]*\Z/, "")
24
+ end
25
+
26
+ def replaces?(other)
27
+ [name.downcase, domain, path] == [other.name.downcase, other.domain, other.path]
28
+ end
29
+
30
+ # :api: private
31
+ def raw
32
+ @name_value_raw
33
+ end
34
+
35
+ # :api: private
36
+ def empty?
37
+ @value.nil? || @value.empty?
38
+ end
39
+
40
+ # :api: private
41
+ def domain
42
+ @options["domain"]
43
+ end
44
+
45
+ def secure?
46
+ @options.has_key?("secure")
47
+ end
48
+
49
+ # :api: private
50
+ def path
51
+ @options["path"].strip || "/"
52
+ end
53
+
54
+ # :api: private
55
+ def expires
56
+ Time.parse(@options["expires"]) if @options["expires"]
57
+ end
58
+
59
+ # :api: private
60
+ def expired?
61
+ expires && expires < Time.now
62
+ end
63
+
64
+ # :api: private
65
+ def valid?(uri)
66
+ uri ||= default_uri
67
+
68
+ if uri.host.nil?
69
+ uri.host = @default_host
70
+ end
71
+
72
+ (!secure? || (secure? && uri.scheme == "https")) &&
73
+ uri.host =~ Regexp.new("#{Regexp.escape(domain)}$", Regexp::IGNORECASE) &&
74
+ uri.path =~ Regexp.new("^#{Regexp.escape(path)}")
75
+ end
76
+
77
+ # :api: private
78
+ def matches?(uri)
79
+ ! expired? && valid?(uri)
80
+ end
81
+
82
+ # :api: private
83
+ def <=>(other)
84
+ # Orders the cookies from least specific to most
85
+ [name, path, domain.reverse] <=> [other.name, other.path, other.domain.reverse]
86
+ end
87
+
88
+ protected
89
+
90
+ def default_uri
91
+ URI.parse("//" + @default_host + "/")
92
+ end
93
+
94
+ end
95
+
96
+ class CookieJar
97
+
98
+ # :api: private
99
+ def initialize(cookies = [], default_host = DEFAULT_HOST)
100
+ @default_host = default_host
101
+ @cookies = cookies
102
+ @cookies.sort!
103
+ end
104
+
105
+ def [](name)
106
+ cookies = hash_for(nil)
107
+ # TODO: Should be case insensitive
108
+ cookies[name] && cookies[name].value
109
+ end
110
+
111
+ def []=(name, value)
112
+ # TODO: needs proper escaping
113
+ merge("#{name}=#{value}")
114
+ end
115
+
116
+ def merge(raw_cookies, uri = nil)
117
+ return unless raw_cookies
118
+
119
+ Array(raw_cookies).join("\n").split("\n").each do |raw_cookie|
120
+ cookie = Cookie.new(raw_cookie, uri, @default_host)
121
+ self << cookie if cookie.valid?(uri)
122
+ end
123
+ end
124
+
125
+ def <<(new_cookie)
126
+ @cookies.reject! do |existing_cookie|
127
+ new_cookie.replaces?(existing_cookie)
128
+ end
129
+
130
+ @cookies << new_cookie
131
+ @cookies.sort!
132
+ end
133
+
134
+ # :api: private
135
+ def for(uri)
136
+ hash_for(uri).values.map { |c| c.raw }.join(';')
137
+ end
138
+
139
+ def to_hash
140
+ cookies = {}
141
+
142
+ hash_for(nil).each do |name, cookie|
143
+ cookies[name] = cookie.value
144
+ end
145
+
146
+ return cookies
147
+ end
148
+
149
+ protected
150
+
151
+ def hash_for(uri = nil)
152
+ cookies = {}
153
+
154
+ # The cookies are sorted by most specific first. So, we loop through
155
+ # all the cookies in order and add it to a hash by cookie name if
156
+ # the cookie can be sent to the current URI. It's added to the hash
157
+ # so that when we are done, the cookies will be unique by name and
158
+ # we'll have grabbed the most specific to the URI.
159
+ @cookies.each do |cookie|
160
+ cookies[cookie.name] = cookie if cookie.matches?(uri)
161
+ end
162
+
163
+ return cookies
164
+ end
165
+
166
+ end
167
+
168
+ end
169
+ end