mosaic 0.0.1pre

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .DS_STORE
@@ -0,0 +1,16 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.3
5
+ - rbx-18mode
6
+ - rbx-19mode
7
+ - ruby-head
8
+ env:
9
+ - "rake=0.8"
10
+ script: "bundle exec rspec"
11
+ matrix:
12
+ allow_failures:
13
+ - rvm: rbx-18mode
14
+ - rvm: rbx-19mode
15
+ notifications:
16
+ email: false
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in mosaic.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Adam Laycock (Arcath)
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,29 @@
1
+ # Mosaic
2
+
3
+ [![Status](https://secure.travis-ci.org/Arcath/mosaic.png?branch=master)](http://travis-ci.org/Arcath/mosaic)
4
+
5
+ A simple MOdular Sinatra ApplICation framework.
6
+
7
+ ## Installation
8
+
9
+ Install via rubygems using:
10
+
11
+ $ gem install mosaic
12
+
13
+ ## Usage
14
+
15
+ Create a new mosaic application using:
16
+
17
+ $ mosaic new NAME
18
+
19
+ where NAME is the name of your new application.
20
+
21
+ This gives you a very basic application with the basic folder structure required to make it work.
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ lib = File.expand_path('../../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ require "mosaic/bin"
6
+
7
+ Mosaic::Bin.new(ARGV)
@@ -0,0 +1,10 @@
1
+ source :rubygems
2
+
3
+ # Mosaic Gem
4
+ gem 'mosaic'
5
+
6
+ # Mosaic Required Gems
7
+ gem 'sinatra-static-assets', require: 'sinatra/static_assets'
8
+
9
+ # Your Gems
10
+ #gem 'sass' # Required for Mosaic::Modules::Sass
@@ -0,0 +1,7 @@
1
+ class ExampleModule < Mosaic::Module
2
+ respond_to :get, "/example"
3
+
4
+ def handle
5
+ @response.content = :'index.html'
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ require 'rubygems'
2
+ require "bundler"
3
+
4
+ Bundler.require
5
+ Mosaic.set_root File.dirname(__FILE__)
6
+
7
+ require './config/mosaic'
8
+
9
+ require 'mosaic/application'
10
+
11
+ run Mosaic::Application
@@ -0,0 +1,7 @@
1
+ # Moasic Provided Modules
2
+ require 'mosaic/modules/static' # Static Content Handling
3
+ require 'mosaic/modules/info' # Info Page (Comment out in production)
4
+ #require 'mosaic/modules/sass' # SASS Middleware (needs sass in your Gemfile)
5
+
6
+ # Require all modules in app/modules
7
+ Dir.glob(Mosaic.root + '/app/modules/*', &method(:require))
@@ -0,0 +1,3 @@
1
+ body{
2
+ font-family:helvetica, sans-serif;
3
+ }
@@ -0,0 +1,5 @@
1
+ <h1>Welcome to your new Mosaic Application</h1>
2
+ <h2><a href="/__mosaic__/info">Application Info</a></h2>
3
+ <h3>Where Next?</h3>
4
+ <p>Start by getting rid of the content in <i>/views/index.html.erb</i> you dont want this as a home page.</p>
5
+ <p>Head over to <a href="http://mosaic.arcath.net/">mosaic.arcath.net</a> and look at some of the modules listed there.</p>
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Mosaic</title>
5
+ <%= stylesheet_link_tag "/css/application.css" %>
6
+ </head>
7
+ <body>
8
+ <%= yield %>
9
+ </body>
10
+ </html>
@@ -0,0 +1,27 @@
1
+ # Main Mosaic Module, all code is contained within this Module
2
+ module Mosaic
3
+
4
+ # Sets the root path, used in the users application to set the root to the applications root
5
+ def self.set_root(path)
6
+ @root = path
7
+ end
8
+
9
+ # Returns the root path, used by Moasic::Application
10
+ def self.root
11
+ @root
12
+ end
13
+
14
+ # Data stores container
15
+ module Stores
16
+ end
17
+ end
18
+
19
+ # Sinatra
20
+ require 'sinatra'
21
+ # Version
22
+ require "mosaic/version"
23
+ # Classes
24
+ require "mosaic/module"
25
+ require "mosaic/response"
26
+ # Stores
27
+ require "mosaic/stores/yaml"
@@ -0,0 +1,30 @@
1
+ module Mosaic
2
+ # Sinatra Application
3
+ # Used in config.ru to create the application and run it
4
+ class Application < Sinatra::Base
5
+ set :sessions, true
6
+ set :root, Mosaic.root if Mosaic.root
7
+
8
+ # Provides rails like helper methods e.g. link_to
9
+ register Sinatra::StaticAssets
10
+
11
+ puts "Middleware load order:"
12
+
13
+ Mosaic.middleware.each do |middleware|
14
+ puts middleware.inspect
15
+ use middleware
16
+ end
17
+
18
+ puts "Route load order:"
19
+
20
+ Mosaic.responders.keys.sort.reverse.each do |key|
21
+ puts key
22
+ self.send(Mosaic.responders[key][1], key) do
23
+ @responder = Mosaic.responders[key][0].new(request, key)
24
+ @responder.handle
25
+ @params = request.params
26
+ self.send(@responder.response.view_format, @responder.response.content, :layout => @responder.response.layout)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,41 @@
1
+ module Mosaic
2
+ # The mosaic command class, used to create new applications
3
+ class Bin
4
+ def initialize(args)
5
+ @args = args
6
+ @root_path = File.expand_path("../../../", __FILE__)
7
+ handle_arguments
8
+ end
9
+
10
+ private
11
+
12
+ def handle_arguments
13
+ if @args.include?("new")
14
+ new_application
15
+ else
16
+ help_page
17
+ end
18
+ end
19
+
20
+ def help_page
21
+ puts "MOSAIC"
22
+ puts "MOdular Sinatra ApplICation"
23
+ puts ""
24
+ puts "Usage:"
25
+ puts "\tmosaic new [name]"
26
+ puts "\t\tcreates a new mosaic application with the supplied name"
27
+ end
28
+
29
+ def new_application
30
+ application_name = @args[@args.index("new") + 1]
31
+ copy_command = "cp -r #{@root_path}/lib/blank_app ./#{application_name}"
32
+ puts "Creating new application \"#{application_name}\""
33
+ system(copy_command)
34
+ puts "Empty app copied!"
35
+ puts "Running bundler"
36
+ system("cd #{application_name}; bundle install")
37
+ puts "Application Created!"
38
+ puts "cd to #{application_name} to begin"
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,71 @@
1
+ module Mosaic
2
+ # A hash of paths with response classes e.g.
3
+ # "/foo" => [FooHandler, :get]
4
+ def self.responders
5
+ @responders || {}
6
+ end
7
+
8
+ # An Array of middleware to be loaded by Mosaic::Application
9
+ def self.middleware
10
+ @middleware || []
11
+ end
12
+
13
+ # Adds a responder to the hash
14
+ def self.add_response(type, path, mod)
15
+ @responders ||= {}
16
+ @responders[path] = [mod, type]
17
+ end
18
+
19
+ # Adds a piece middleware to the array
20
+ def self.add_middleware(middleware)
21
+ @middleware ||= []
22
+ @middleware.push(middleware)
23
+ end
24
+
25
+ # The master class for all modules
26
+ # Should be inhertied by any class that gets used in Mosaic::Aplication
27
+ class Module
28
+ attr_reader :response, :params, :request
29
+
30
+ # Creates a new responder, called by Mosaic::Application for every request that uses a given module
31
+ # Takes the request object and the current path as input
32
+ def initialize(request, path)
33
+ @request = request
34
+ @response = Mosaic::Response.new(request)
35
+ @params = request.params
36
+ chunks = path.split("/").collect { |x| x if x =~ /:/ }
37
+ chunks.each do |chunk|
38
+ if chunk
39
+ key = chunk.gsub(/:/,'')
40
+ key.gsub!(/(.*?)\./,'')
41
+ key.gsub!(/\?/,'')
42
+ @params[key.to_sym] = @request.path_info.split("/")[path.split("/").index(chunk)]
43
+ end
44
+ end
45
+ end
46
+
47
+ # Class method for modules, if called the responder is declaring that it is capable of handling requests of the supplied type for the supplied path
48
+ # Called as:
49
+ # respond_to :get, "/foo"
50
+ def self.respond_to(type, path)
51
+ Mosaic.add_response(type, path, self)
52
+ end
53
+
54
+ # Class method for modules, adds the supplied class to the middleware array
55
+ # Called as:
56
+ # provide_middleware Foo:Middleware
57
+ def self.provide_middleware(middleware)
58
+ Mosaic.add_middleware(middleware)
59
+ end
60
+
61
+ private
62
+
63
+ def contained_view(file)
64
+ File.read(File.expand_path("../../../support/views/#{file}", __FILE__))
65
+ end
66
+ end
67
+
68
+ # Container for modules supplied with Mosaic
69
+ module Modules
70
+ end
71
+ end
@@ -0,0 +1,21 @@
1
+ module Mosaic
2
+ module Modules
3
+ # Info page for Mosaic
4
+ class Info < Mosaic::Module
5
+ respond_to :get, "/__mosaic__/info"
6
+
7
+ # Returns the contained view for the page
8
+ def handle
9
+ @response.layout = contained_view("info/layout.html.erb")
10
+ @response.content = contained_view("info/index.html.erb")
11
+ end
12
+
13
+ # A hash of info used by the info page
14
+ def info
15
+ {
16
+ root: File.expand_path("../../../../", __FILE__)
17
+ }
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,10 @@
1
+ require 'sass/plugin/rack'
2
+
3
+ module Mosaic
4
+ module Modules
5
+ # Loads the SASS middleware and includes it in the middleware array
6
+ class Sass < Mosaic::Module
7
+ provide_middleware ::Sass::Plugin::Rack
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,43 @@
1
+ module Mosaic
2
+ # Return the inbuilt 404 page
3
+ def self.error404
4
+ File.read(File.expand_path("../../../../support/views/errors/error404.html.erb", __FILE__))
5
+ end
6
+
7
+ module Modules
8
+ # Static view system.
9
+ # Allows requests to be made for files in the views folder
10
+ # Will always be at the bottom of the response list
11
+ class Static < Mosaic::Module
12
+ respond_to :get, '*'
13
+
14
+ # Set the response file to the requested view
15
+ def handle
16
+ @response.response_code = response_code
17
+ @response.content = view
18
+ @response.layout = set_layout
19
+ @response.output_format = @request.path_info.split(".").last
20
+ end
21
+
22
+ # Work out what view to serve
23
+ def file
24
+ "#{@request.path_info}.html".gsub(/\/\./, 'index.')
25
+ end
26
+
27
+ # Return the 404 view if needed
28
+ def view
29
+ response_code == 200 ? file.to_sym : Mosaic.error404
30
+ end
31
+
32
+ # Use no layout for 404
33
+ def set_layout
34
+ response_code == 200 ? :"layouts/application.#{@response.output_format}" : nil
35
+ end
36
+
37
+ # Work out the response code
38
+ def response_code
39
+ File.exists?("views/#{file}.erb") ? 200 : 404
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,15 @@
1
+ module Mosaic
2
+ # Used to build a response for sinatra to serve
3
+ class Response
4
+ attr_accessor :content, :layout, :response_code, :view_format, :output_format
5
+ attr_reader :request
6
+
7
+ def initialize(request)
8
+ @view_format = :erb
9
+ @output_format = :html
10
+ @layout = :'layouts/application'
11
+ @request = request
12
+ @response_code = 200
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,35 @@
1
+ require 'fileutils'
2
+
3
+ module Mosaic
4
+ module Stores
5
+ # Store data in yaml files
6
+ class Yaml
7
+ attr_reader :yaml
8
+
9
+ def initialize(name)
10
+ @store = name
11
+ @directory = "#{Mosaic.root}/app/stores"
12
+ begin
13
+ @yaml = YAML::load(File.open("#{@directory}/#{@store}.yml"))
14
+ rescue
15
+ create_file_and_folder
16
+ @yaml = YAML::load(File.open("#{@directory}/#{@store}.yml"))
17
+ end
18
+ end
19
+
20
+ # Create the files and folders if they are missing
21
+ def create_file_and_folder
22
+ begin
23
+ Dir::mkdir(@directory)
24
+ rescue Errno::EEXIST
25
+ end
26
+ FileUtils.touch "#{@directory}/#{@store}.yml"
27
+ end
28
+
29
+ # Write the hash back to the yaml file
30
+ def save(hash)
31
+ File.open("#{@directory}/#{@store}.yml", 'w+') {|f| f.write(hash.to_yaml) }
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,4 @@
1
+ module Mosaic
2
+ # Mosaics Version Number
3
+ VERSION = "0.0.1pre"
4
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mosaic/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "mosaic"
8
+ gem.version = Mosaic::VERSION
9
+ gem.authors = ["Adam \"Arcath\" Laycock"]
10
+ gem.email = ["gems@arcath.net"]
11
+ gem.description = %q{MOdular Sinatra ApplICation}
12
+ gem.summary = %q{Simple and extensible sinatra powered application framework}
13
+ gem.homepage = ""
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency "sinatra"
21
+
22
+ gem.add_development_dependency "rspec"
23
+ gem.add_development_dependency "yard"
24
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mosaic::Module do
4
+ it "should accept 2 inputs" do
5
+ Mosaic::Module.new(DummyRequest.new, "/foo/bar")
6
+ end
7
+
8
+ it "should put the path variable into params" do
9
+ responder = TestModule.new(DummyRequest.new("/foo/widget"), "/foo/:bar")
10
+ responder.params[:bar].should eq "widget"
11
+ end
12
+
13
+ it "should have a response" do
14
+ TestModule.new(DummyRequest.new("/foo/widget"), "/foo/:bar").response.should be_a Mosaic::Response
15
+ end
16
+
17
+ it "should have set respond to" do
18
+ # This should have been set when TestModule was declared
19
+ Mosaic.responders["/"].should be_a Array
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mosaic::Response do
4
+ it "should assume some values" do
5
+ response = Mosaic::Response.new(DummyRequest.new)
6
+ end
7
+
8
+ it "should use erb as the default view format" do
9
+ response = Mosaic::Response.new(DummyRequest.new)
10
+ response.view_format.should eq :erb
11
+ end
12
+ end
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require "bundler"
3
+
4
+ Bundler.require
5
+
6
+ class TestModule < Mosaic::Module
7
+ respond_to :get, "/"
8
+ respond_to :get, "/foo/:bar"
9
+ end
10
+
11
+ class DummyRequest
12
+ attr_reader :params, :path_info
13
+
14
+ def initialize(path_info = "")
15
+ @params = {}
16
+ @path_info = path_info
17
+ end
18
+ end
@@ -0,0 +1,28 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Error 404</title>
5
+ <style type="text/css">
6
+ body{
7
+ font-family:helvetica;
8
+ }
9
+ h1{
10
+ margin:auto;
11
+ width:300px;
12
+ text-align:center;
13
+ color:red;
14
+ border-bottom:dashed red 1px;
15
+ }
16
+ h2{
17
+ margin:auto;
18
+ margin-top:10px;
19
+ width:300px;
20
+ text-align:center;
21
+ }
22
+ </style>
23
+ </head>
24
+ <body>
25
+ <h1>Error 404</h1>
26
+ <h2><%= @request.path_info%></h2>
27
+ </body>
28
+ </html>
@@ -0,0 +1,17 @@
1
+ <h1>Mosaic</h1>
2
+
3
+ Application Root: <b><%= File.expand_path(Mosaic.root) %></b><br />
4
+ Mosaic Version: <b><%= Mosaic::VERSION %></b><br />
5
+ Sinatra Version: <b><%= Sinatra::VERSION %></b><br />
6
+ Responders:
7
+ <ul>
8
+ <% Mosaic.responders.keys.sort.reverse.each do |key|%>
9
+ <li><b><%= key %></b> - <%= Mosaic.responders[key].first.inspect %></li>
10
+ <% end %>
11
+ </ul>
12
+ Middleware:
13
+ <ul>
14
+ <% Mosaic.middleware.each do |middleware| %>
15
+ <li><b><%= middleware.inspect %></b></li>
16
+ <% end %>
17
+ </ul>
@@ -0,0 +1,24 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Mosaic Info</title>
5
+ <style type="text/css">
6
+ body{
7
+ font-family:helvetica;
8
+ background-color:#9bf;
9
+ color:#444;
10
+ }
11
+ .container{
12
+ background-color:#fff;
13
+ width:600px;
14
+ margin:auto;
15
+ padding:10px;
16
+ }
17
+ </style>
18
+ </head>
19
+ <body>
20
+ <div class="container">
21
+ <%= yield %>
22
+ </div>
23
+ </body>
24
+ </html>
metadata ADDED
@@ -0,0 +1,129 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mosaic
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1pre
5
+ prerelease: 5
6
+ platform: ruby
7
+ authors:
8
+ - Adam "Arcath" Laycock
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-03-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sinatra
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: yard
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: MOdular Sinatra ApplICation
63
+ email:
64
+ - gems@arcath.net
65
+ executables:
66
+ - mosaic
67
+ extensions: []
68
+ extra_rdoc_files: []
69
+ files:
70
+ - .gitignore
71
+ - .travis.yml
72
+ - Gemfile
73
+ - LICENSE.txt
74
+ - README.md
75
+ - Rakefile
76
+ - bin/mosaic
77
+ - lib/blank_app/Gemfile
78
+ - lib/blank_app/app/modules/example.rb
79
+ - lib/blank_app/config.ru
80
+ - lib/blank_app/config/mosaic.rb
81
+ - lib/blank_app/public/stylesheets/application.css
82
+ - lib/blank_app/views/index.html.erb
83
+ - lib/blank_app/views/layouts/application.html.erb
84
+ - lib/mosaic.rb
85
+ - lib/mosaic/application.rb
86
+ - lib/mosaic/bin.rb
87
+ - lib/mosaic/module.rb
88
+ - lib/mosaic/modules/info.rb
89
+ - lib/mosaic/modules/sass.rb
90
+ - lib/mosaic/modules/static.rb
91
+ - lib/mosaic/response.rb
92
+ - lib/mosaic/stores/yaml.rb
93
+ - lib/mosaic/version.rb
94
+ - mosaic.gemspec
95
+ - spec/module_spec.rb
96
+ - spec/response_spec.rb
97
+ - spec/spec_helper.rb
98
+ - support/views/errors/error404.html.erb
99
+ - support/views/info/index.html.erb
100
+ - support/views/info/layout.html.erb
101
+ homepage: ''
102
+ licenses: []
103
+ post_install_message:
104
+ rdoc_options: []
105
+ require_paths:
106
+ - lib
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ none: false
109
+ requirements:
110
+ - - ! '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ! '>'
117
+ - !ruby/object:Gem::Version
118
+ version: 1.3.1
119
+ requirements: []
120
+ rubyforge_project:
121
+ rubygems_version: 1.8.23
122
+ signing_key:
123
+ specification_version: 3
124
+ summary: Simple and extensible sinatra powered application framework
125
+ test_files:
126
+ - spec/module_spec.rb
127
+ - spec/response_spec.rb
128
+ - spec/spec_helper.rb
129
+ has_rdoc: