chicago 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 Justin Knowlden, Gabriel Gironda, Dan Hodos, Thumble Monks
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,44 @@
1
+ # Chicago
2
+
3
+ It's my kind of town!
4
+ - Sinatra
5
+
6
+ Yeah, we're real clever. We're also from ["The city in mid-west best city in the whole wide wide world"](http://www.azlyrics.com/lyrics/lupefiasco/gogogadgetflow.html) ... which makes us double the clever.
7
+
8
+ ## What what?
9
+
10
+ ### Sinatra runtime app
11
+
12
+ In your Sinatra app, do this:
13
+
14
+ require 'chicago'
15
+
16
+ And you'll get some helpful Sinatra extensions and helpers.
17
+
18
+ If you're Sinatra app is considered modular - as in, you are not using the `Sinatra::Default` app - you will want to add the following in your app:
19
+
20
+ YourApp < Sinatra::Base
21
+ register Sinatra::Chicago # for some DSL helpers
22
+ helpers Sinatra::Chicago::Helpers # for standard helpers
23
+ helpers Sinatra::Chicago::Responders # for JSON assistance
24
+ end
25
+
26
+ You don't necessarily need all of them. You just need to "include" the statements that mix-in the functionality you want.
27
+
28
+ ### Sinatra testing
29
+
30
+ Assuming you have required 'rack/test', like so:
31
+
32
+ require 'rack/test'
33
+
34
+ This is because these macros use last_request defined by the Rack/Test library. If you're using [Protest](http://github.com/thumblemonks/protest) in your tests of your Sinatra app, do this:
35
+
36
+ require 'chicago/protest'
37
+
38
+ ... and you'll get a bunch of cool Protest macros for testing specific Sinatra stuff.
39
+
40
+ If you're using Shoulda in your tests of your Sinatra app, do this:
41
+
42
+ require 'chicago/shoulda'
43
+
44
+ ... and you'll get a bunch of cool Shoulda macros for testing specific Sinatra stuff.
@@ -0,0 +1,34 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+
5
+ desc 'Default task: run all tests'
6
+ task :default => [:test]
7
+
8
+ task(:set_test_env) { ENV['RACK_ENV'] ||= 'test' }
9
+
10
+ desc "Run all tests"
11
+ task :test => [:set_test_env] do
12
+ require 'protest'
13
+ $:.concat ['./lib', './test']
14
+ Dir.glob("./test/*_test.rb").each { |test| require test }
15
+ Protest.report
16
+ end
17
+
18
+ task "test:shoulda" => [:set_test_env]
19
+ desc "Run all Shoulda based tests"
20
+ Rake::TestTask.new("test:shoulda") do |t|
21
+ t.libs << "test/shoulda_tests"
22
+ t.test_files = FileList['test/shoulda_tests/*_test.rb']
23
+ t.verbose = true
24
+ end
25
+
26
+ # task :test => [:set_test_env] do
27
+ # $:.concat ['./lib', './test/shoulda_tests']
28
+ # Dir.glob("./test/shoulda_tests/*_test.rb").each { |test| require test }
29
+ # end
30
+
31
+ desc "Open an irb session preloaded with this library"
32
+ task :console do
33
+ exec "irb -rubygems"
34
+ end
@@ -0,0 +1,38 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "chicago"
3
+ s.version = "0.3.4"
4
+ s.date = "2009-10-02"
5
+ s.summary = "Sinatra runtime and testing extensions used commonly by Thumblemonks"
6
+ s.email = %w[gus@gusg.us gabriel.gironda@gmail.com]
7
+ s.homepage = "http://github.com/thumblemonks/chicago/tree/master"
8
+ s.description = "Sinatra runtime and testing extensions used commonly by Thumblemonks. For example, :json_response, which turns an object into JSON and sets the content-type appropriately."
9
+ s.authors = %w[Justin\ Knowlden Gabriel\ Gironda]
10
+
11
+ s.has_rdoc = false
12
+ s.rdoc_options = ["--main", "README.markdown"]
13
+ s.extra_rdoc_files = ["README.markdown"]
14
+
15
+ # run git ls-files to get an updated list
16
+ s.files = %w[
17
+ MIT-LICENSE
18
+ README.markdown
19
+ chicago.gemspec
20
+ lib/chicago.rb
21
+ lib/chicago/application.rb
22
+ lib/chicago/helpers.rb
23
+ lib/chicago/protest.rb
24
+ lib/chicago/protest/macros.rb
25
+ lib/chicago/responders.rb
26
+ lib/chicago/shoulda.rb
27
+ lib/chicago/shoulda/sinatra.rb
28
+ ]
29
+
30
+ s.test_files = %w[
31
+ Rakefile
32
+ test/application_test.rb
33
+ test/helpers_test.rb
34
+ test/protest_macros_test.rb
35
+ test/responders_test.rb
36
+ test/test_helper.rb
37
+ ]
38
+ end
@@ -0,0 +1,4 @@
1
+ require 'sinatra/base'
2
+ require 'chicago/application'
3
+ require 'chicago/responders'
4
+ require 'chicago/helpers'
@@ -0,0 +1,28 @@
1
+ module Sinatra
2
+ module Chicago
3
+
4
+ # Assumes all CSS is SASS and is referenced as being in a directory named stylesheets
5
+ # If SASS file is not defined, the route will passed on to - theoretically - the real
6
+ # CSS in the public directory.
7
+ def catch_all_css(path='/stylesheets')
8
+ get("#{path}/*.css") do
9
+ begin
10
+ content_type 'text/css'
11
+ sass params["splat"].first.to_sym
12
+ rescue Errno::ENOENT
13
+ pass
14
+ end
15
+ end
16
+ end
17
+
18
+ # When you don't want anything special, but to load a named view as HAML.
19
+ def get_obvious(name)
20
+ get "/#{name}" do
21
+ haml name.to_sym
22
+ end
23
+ end
24
+
25
+ end # Chicago
26
+
27
+ register Chicago
28
+ end # Sinatra
@@ -0,0 +1,77 @@
1
+ module Sinatra
2
+ module Chicago
3
+ module Helpers
4
+ # A basic anchor (link_to) tag
5
+ #
6
+ # Exmaples:
7
+ #
8
+ # anchor('GusGus', 'http://gusg.us')
9
+ # => <a href="http://gusg.us">GusG.us</a>
10
+ #
11
+ # anchor('GusGus', 'http://gusg.us', :title => 'You know who!')
12
+ # => <a href="http://gusg.us" title="You know who!">GusG.us</a>
13
+ def anchor(name, url, options={})
14
+ defaults = {:href => url}
15
+ options_str = hash_to_attributes(defaults.merge(options))
16
+ %Q[<a #{options_str}>#{name}</a>]
17
+ end
18
+
19
+ # A helper to include stylesheet links. Currently defaults everything to
20
+ # load from a /stylesheets directory.
21
+ #
22
+ # Exmaples:
23
+ #
24
+ # stylesheet_include('foo')
25
+ # => <link href="/stylsheets/foo.css" media="screen" rel="stylesheet" type="text/css" />
26
+ #
27
+ # stylesheet_include('foo/bar')
28
+ # => <link href="/stylsheets/foo/bar.css" media="screen" rel="stylesheet" type="text/css" />
29
+ #
30
+ # stylesheet_include('foo', :media => "print")
31
+ # => <link href="/stylsheets/foo.css" media="print" rel="stylesheet" type="text/css" />
32
+ #
33
+ # stylesheet_include('http://example.com/foo.css')
34
+ # => <link href="http://example.com/foo.css" media="print" rel="stylesheet" type="text/css" />
35
+ def stylesheet_include(name, options={})
36
+ name = "/stylesheets/#{name}.css" unless remote_asset?(name)
37
+ defaults = {:href => name, :media => "screen",
38
+ :rel => "stylesheet", :type => "text/css"}
39
+ options_str = hash_to_attributes(defaults.merge(options))
40
+ %Q[<link #{options_str}/>]
41
+ end
42
+
43
+ # A helper to include javascript source tags. Currently defaults everything
44
+ # to load from a /javascripts directory.
45
+ #
46
+ # Exmaples:
47
+ #
48
+ # javascript_include('foo')
49
+ # => <javascript src="/javascripts/foo.js" type="text/javascript"></script>
50
+ #
51
+ # javascript_include('foo/bar')
52
+ # => <javascript src="/javascripts/foo/bar.js" type="text/javascript"></script>
53
+ #
54
+ # javascript_include('foo', :something => "great")
55
+ # => <javascript src="/javascripts/foo.js" type="text/javascript" something="great"></script>
56
+ #
57
+ # javascript_include('http://example.com/foo.js')
58
+ # => <javascript src="http://example.com/foo.js" type="text/javascript"></script>
59
+ def javascript_include(name, options={})
60
+ name = "/javascripts/#{name}.js" unless remote_asset?(name)
61
+ defaults = {:src => name, :type => "text/javascript"}
62
+ options_str = hash_to_attributes(defaults.merge(options))
63
+ %Q[<script #{options_str}></script>]
64
+ end
65
+ private
66
+ def remote_asset?(uri)
67
+ uri =~ %r[^\w+://.+]
68
+ end
69
+
70
+ def hash_to_attributes(options)
71
+ options.map {|k,v| "#{k}=\"#{v}\""}.join(' ')
72
+ end
73
+ end # Helpers
74
+ end # Chicago
75
+
76
+ helpers Chicago::Helpers
77
+ end # Sinatra
@@ -0,0 +1 @@
1
+ require 'chicago/protest/macros'
@@ -0,0 +1,45 @@
1
+ require 'json'
2
+
3
+ module Chicago
4
+ module Protest
5
+ module Macros
6
+ def asserts_response_status(expected)
7
+ asserts("response status is #{expected}") { last_response.status }.equals(expected)
8
+ end
9
+
10
+ def asserts_content_type(expected)
11
+ asserts("content type is #{expected}") { last_response.headers['Content-type'] }.equals(expected)
12
+ end
13
+
14
+ def asserts_response_body(expected)
15
+ asserts("response body matches #{expected.inspect}") { last_response.body }.matches(expected)
16
+ end
17
+
18
+ def asserts_location(expected_path)
19
+ asserts("location matches #{expected_path}") do
20
+ last_response.headers["Location"]
21
+ end.matches(expected_path)
22
+ end
23
+
24
+ def asserts_json_response(json, &block)
25
+ asserts_content_type 'application/json'
26
+ asserts("response body has JSON") do
27
+ json = json.to_json unless json.instance_of?(String)
28
+ json
29
+ end.equals(situation.last_response.body)
30
+ # Calling situation is kind of yucky, but maybe not. The maybe not is because of how explicit it is
31
+ # to say "situation" (gus)
32
+ end
33
+
34
+ # Usage:
35
+ # assert_redirected_to '/foo/bar'
36
+ # assert_redirected_to %r[foo/bar]
37
+ def asserts_redirected_to(expected_path)
38
+ asserts_response_status 302
39
+ asserts_location expected_path
40
+ end
41
+ end # Macros
42
+ end # Protest
43
+ end # Chicago
44
+
45
+ Protest::Context.instance_eval { include Chicago::Protest::Macros }
@@ -0,0 +1,15 @@
1
+ module Sinatra
2
+ module Chicago
3
+ module Responders
4
+
5
+ # Returns a JSON response for an object. Will return an empty string if the provided object is nil.
6
+ def json_response(object)
7
+ content_type 'application/json'
8
+ object ? object.to_json : ""
9
+ end
10
+
11
+ end # Responders
12
+ end # Chicago
13
+
14
+ helpers Chicago::Responders
15
+ end # Sinatra
@@ -0,0 +1 @@
1
+ require 'chicago/shoulda/sinatra'
@@ -0,0 +1,83 @@
1
+ require 'json'
2
+ require 'ostruct'
3
+
4
+ module ThumbleMonks
5
+ module Chicago
6
+ module Shoulda
7
+
8
+ def self.included(klass)
9
+ klass.extend(Macros)
10
+ klass.send(:include, Helpers)
11
+ end
12
+
13
+ module Macros
14
+ def should_have_response_status(expected)
15
+ should("have response status") { assert_response expected }
16
+ end
17
+
18
+ def should_have_response_body(expected)
19
+ name = expected.is_a?(String) ? expected[0...15] : expected.to_s
20
+ should("have response body like #{name}") { assert_response_body expected }
21
+ end
22
+
23
+ def should_have_content_type(expected)
24
+ should("have content_type") { assert_content_type expected }
25
+ end
26
+
27
+ def should_have_json_response(json={}, &block)
28
+ should_have_content_type 'application/json'
29
+ should "have JSON response in the body" do
30
+ json = self.instance_eval(&block) if block_given?
31
+ json = json.to_json unless json.instance_of?(String) || json.instance_of?(Regexp)
32
+ assert_response_body json
33
+ end
34
+ end
35
+
36
+ # Checks to see if there is a redirect in play and the path the redirect goes to
37
+ #
38
+ # Example:
39
+ # should_be_redirected_to { "/users/@user.id" }
40
+ # should_be_redirected_to "/home"
41
+ def should_be_redirected_to(expected_path=nil, &block)
42
+ should "be redirected to #{expected_path || 'a url'}" do
43
+ expected_path = self.instance_eval(&block) if block_given?
44
+ assert_redirected_to expected_path
45
+ end
46
+ end
47
+ end # Macros
48
+
49
+ module Helpers
50
+ def deny(check, message=nil)
51
+ assert(!check, message)
52
+ end
53
+
54
+ def assert_response(status)
55
+ assert_equal status, last_response.status
56
+ end
57
+
58
+ def assert_response_body(body)
59
+ assert_match body, last_response.body
60
+ end
61
+
62
+ def assert_content_type(expected)
63
+ assert_equal expected, last_response.headers['Content-type']
64
+ end
65
+
66
+ # Usage:
67
+ #
68
+ # assert_redirected_to '/foo/bar'
69
+ # or
70
+ # assert_redirected_to %r[foo.bar]
71
+ def assert_redirected_to(expected_path)
72
+ yield if block_given?
73
+ assert_response 302
74
+ action = expected_path.kind_of?(Regexp) ? 'match' : 'equal'
75
+ send("assert_#{action}", expected_path, last_response.headers["Location"])
76
+ end
77
+ end # Helpers
78
+
79
+ end # Shoulda
80
+ end # Chicago
81
+ end # ThumbleMonks
82
+
83
+ Test::Unit::TestCase.instance_eval { include ThumbleMonks::Chicago::Shoulda }
@@ -0,0 +1,48 @@
1
+ require 'test_helper'
2
+
3
+ context "Application Test:" do
4
+
5
+ setup do
6
+ mock_app {
7
+ register Sinatra::Chicago
8
+
9
+ template(:foo) { ".bar\n :display none" }
10
+ template(:goo) { ".car\n :display some" }
11
+ template(:baz) { "Whatever man. That's just like, your opinion." }
12
+
13
+ catch_all_css
14
+ catch_all_css('/css')
15
+
16
+ get_obvious 'baz'
17
+ }
18
+ end
19
+
20
+ # TODO: change to namespace
21
+ context "catching all css" do
22
+ context "with default path" do
23
+ setup { get '/stylesheets/foo.css' }
24
+ asserts_response_status 200
25
+ asserts_content_type 'text/css'
26
+ asserts_response_body %r[.bar \{\s+display: none; \}\s]
27
+ end
28
+
29
+ context "with specified path" do
30
+ setup { get '/css/goo.css' }
31
+ asserts_response_status 200
32
+ asserts_content_type 'text/css'
33
+ asserts_response_body %r[.car \{\s+display: some; \}\s]
34
+ end
35
+
36
+ context "with path that's not a defined a sass file" do
37
+ setup { get '/stylesheets/zoo.css' }
38
+ asserts_response_status 404
39
+ asserts_content_type 'text/css'
40
+ end
41
+ end # catching all css
42
+
43
+ context "getting obvious views" do
44
+ setup { get '/baz' }
45
+ asserts_response_body "Whatever man. That's just like, your opinion."
46
+ end # getting obvious views
47
+
48
+ end
@@ -0,0 +1,125 @@
1
+ require 'test_helper'
2
+
3
+ context "Helpers Test:" do
4
+ setup do
5
+ mock_app {
6
+ helpers Sinatra::Chicago::Helpers
7
+ }
8
+ end
9
+
10
+ context "including stylesheet" do
11
+ context "for plain old foo" do
12
+ setup do
13
+ extend_mock_app {
14
+ template(:foo) { "= stylesheet_include('foo')" }
15
+ get('/foo') { haml :foo }
16
+ }
17
+ get '/foo'
18
+ end
19
+
20
+ asserts_response_body %r[^<link( \w+=".+"){4}/>$]
21
+ asserts_response_body %r[href="/stylesheets/foo\.css"]
22
+ asserts_response_body %r[media="screen"]
23
+ asserts_response_body %r[rel="stylesheet"]
24
+ asserts_response_body %r[type="text/css"]
25
+ end # for plain old foo
26
+
27
+ context "for bar with options" do
28
+ setup do
29
+ extend_mock_app {
30
+ template(:foo) { "= stylesheet_include('bar', :media => 'print', :baz => 'boo')" }
31
+ get('/foo') { haml :foo }
32
+ }
33
+ get '/foo'
34
+ end
35
+
36
+ asserts_response_body %r[^<link( \w+=".+"){5}/>$]
37
+ asserts_response_body %r[href="/stylesheets/bar\.css"]
38
+ asserts_response_body %r[media="print"]
39
+ asserts_response_body %r[rel="stylesheet"]
40
+ asserts_response_body %r[type="text/css"]
41
+ asserts_response_body %r[baz="boo"]
42
+ end # for bar with options
43
+
44
+ context "with a specific href" do
45
+ setup do
46
+ extend_mock_app {
47
+ template(:foo) { "= stylesheet_include('http://example.com')" }
48
+ get('/foo') { haml :foo }
49
+ }
50
+ get '/foo'
51
+ end
52
+ asserts_response_body %r[href="http://example.com"]
53
+ end # with a specific href
54
+ end # including stylesheets
55
+
56
+ context "including javascript" do
57
+ context "for plain old foo" do
58
+ setup do
59
+ extend_mock_app {
60
+ template(:foo) { "= javascript_include('foo')" }
61
+ get('/foo') { haml :foo }
62
+ }
63
+ get '/foo'
64
+ end
65
+
66
+ asserts_response_body %r[^<script( \w+=".+"){2}></script>$]
67
+ asserts_response_body %r[src="/javascripts/foo\.js"]
68
+ asserts_response_body %r[type="text/javascript"]
69
+ end # for plain old foo
70
+
71
+ context "for foo with options" do
72
+ setup do
73
+ extend_mock_app {
74
+ template(:foo) { "= javascript_include('foo', :type => 'text/blarg', :gus => 'nice')" }
75
+ get('/foo') { haml :foo }
76
+ }
77
+ get '/foo'
78
+ end
79
+
80
+ asserts_response_body %r[^<script( \w+=".+"){3}></script>$]
81
+ asserts_response_body %r[src="/javascripts/foo\.js"]
82
+ asserts_response_body %r[type="text/blarg"]
83
+ asserts_response_body %r[gus="nice"]
84
+ end # for foo with options
85
+
86
+ context "with a specific src" do
87
+ setup do
88
+ extend_mock_app {
89
+ template(:foo) { "= javascript_include('http://example.com')" }
90
+ get('/foo') { haml :foo }
91
+ }
92
+ get '/foo'
93
+ end
94
+ asserts_response_body %r[src="http://example.com"]
95
+ end # with a specific src
96
+ end # including javascript
97
+
98
+ context "using an anchor" do
99
+ context "for plain old foo" do
100
+ setup do
101
+ extend_mock_app {
102
+ template(:foo) { "= anchor('foo', '/bar')" }
103
+ get('/foo') { haml :foo }
104
+ }
105
+ get '/foo'
106
+ end
107
+
108
+ asserts_response_body %Q[<a href="/bar">foo</a>]
109
+ end # for plain old foo
110
+
111
+ context "with options" do
112
+ setup do
113
+ extend_mock_app {
114
+ template(:foo) { "= anchor('foo bear', '/bar/ler', :title => 'gus is nice')" }
115
+ get('/foo') { haml :foo }
116
+ }
117
+ get '/foo'
118
+ end
119
+
120
+ asserts_response_body %r[^<a( \w+=".+"){2}>foo bear</a>$]
121
+ asserts_response_body %r[href="/bar/ler"]
122
+ asserts_response_body %r[title="gus is nice"]
123
+ end # with options
124
+ end # using an anchor
125
+ end
@@ -0,0 +1,15 @@
1
+ require 'test_helper'
2
+
3
+ context "Protest Macros Test:" do
4
+ setup do
5
+ mock_app {
6
+ helpers Sinatra::Chicago::Responders
7
+ get("/redirecter") { redirect '/foo/bar' }
8
+ }
9
+ end
10
+
11
+ context "asserts redirected to" do
12
+ setup { get('/redirecter') }
13
+ asserts_redirected_to('/foo/bar')
14
+ end # asserts redirected to
15
+ end
@@ -0,0 +1,19 @@
1
+ require 'test_helper'
2
+
3
+ context "Responders Test:" do
4
+ setup do
5
+ mock_app {
6
+ helpers Sinatra::Chicago::Responders
7
+ get "/json_bait" do
8
+ status(201)
9
+ json_response({:foo => "bar"})
10
+ end
11
+ }
12
+ end
13
+
14
+ context "json response" do
15
+ setup { get "/json_bait" }
16
+ asserts_response_status 201
17
+ asserts_json_response({:foo => :bar})
18
+ end # json response
19
+ end
@@ -0,0 +1,25 @@
1
+ %w[ rubygems protest haml sass chicago rack/test chicago/protest ].each do |lib|
2
+ require lib
3
+ end
4
+
5
+ module Rack::Test::Methods
6
+ # Sets up a Sinatra::Base subclass defined with the block
7
+ # given. Used in setup or individual spec methods to establish
8
+ # the application.
9
+ def mock_app(base=Sinatra::Base, &block)
10
+ @app = Sinatra.new(base, &block)
11
+ end
12
+
13
+ def extend_mock_app(&block)
14
+ @_rack_test_session ||= Rack::Test::Session.new(app)
15
+ @app.instance_eval(&block)
16
+ end
17
+
18
+ def app
19
+ @app
20
+ end
21
+ end
22
+
23
+ class Protest::Situation
24
+ include Rack::Test::Methods
25
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: chicago
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.4
5
+ platform: ruby
6
+ authors:
7
+ - Justin Knowlden
8
+ - Gabriel Gironda
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2009-10-02 00:00:00 -05:00
14
+ default_executable:
15
+ dependencies: []
16
+
17
+ description: Sinatra runtime and testing extensions used commonly by Thumblemonks. For example, :json_response, which turns an object into JSON and sets the content-type appropriately.
18
+ email:
19
+ - gus@gusg.us
20
+ - gabriel.gironda@gmail.com
21
+ executables: []
22
+
23
+ extensions: []
24
+
25
+ extra_rdoc_files:
26
+ - README.markdown
27
+ files:
28
+ - MIT-LICENSE
29
+ - README.markdown
30
+ - chicago.gemspec
31
+ - lib/chicago.rb
32
+ - lib/chicago/application.rb
33
+ - lib/chicago/helpers.rb
34
+ - lib/chicago/protest.rb
35
+ - lib/chicago/protest/macros.rb
36
+ - lib/chicago/responders.rb
37
+ - lib/chicago/shoulda.rb
38
+ - lib/chicago/shoulda/sinatra.rb
39
+ has_rdoc: true
40
+ homepage: http://github.com/thumblemonks/chicago/tree/master
41
+ licenses: []
42
+
43
+ post_install_message:
44
+ rdoc_options:
45
+ - --main
46
+ - README.markdown
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: "0"
60
+ version:
61
+ requirements: []
62
+
63
+ rubyforge_project:
64
+ rubygems_version: 1.3.5
65
+ signing_key:
66
+ specification_version: 3
67
+ summary: Sinatra runtime and testing extensions used commonly by Thumblemonks
68
+ test_files:
69
+ - Rakefile
70
+ - test/application_test.rb
71
+ - test/helpers_test.rb
72
+ - test/protest_macros_test.rb
73
+ - test/responders_test.rb
74
+ - test/test_helper.rb