mosaic 0.0.1pre

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.
@@ -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: