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.
- data/.gitignore +18 -0
- data/.travis.yml +16 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/bin/mosaic +7 -0
- data/lib/blank_app/Gemfile +10 -0
- data/lib/blank_app/app/modules/example.rb +7 -0
- data/lib/blank_app/config.ru +11 -0
- data/lib/blank_app/config/mosaic.rb +7 -0
- data/lib/blank_app/public/stylesheets/application.css +3 -0
- data/lib/blank_app/views/index.html.erb +5 -0
- data/lib/blank_app/views/layouts/application.html.erb +10 -0
- data/lib/mosaic.rb +27 -0
- data/lib/mosaic/application.rb +30 -0
- data/lib/mosaic/bin.rb +41 -0
- data/lib/mosaic/module.rb +71 -0
- data/lib/mosaic/modules/info.rb +21 -0
- data/lib/mosaic/modules/sass.rb +10 -0
- data/lib/mosaic/modules/static.rb +43 -0
- data/lib/mosaic/response.rb +15 -0
- data/lib/mosaic/stores/yaml.rb +35 -0
- data/lib/mosaic/version.rb +4 -0
- data/mosaic.gemspec +24 -0
- data/spec/module_spec.rb +21 -0
- data/spec/response_spec.rb +12 -0
- data/spec/spec_helper.rb +18 -0
- data/support/views/errors/error404.html.erb +28 -0
- data/support/views/info/index.html.erb +17 -0
- data/support/views/info/layout.html.erb +24 -0
- metadata +129 -0
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -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.
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Mosaic
|
2
|
+
|
3
|
+
[](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
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/mosaic
ADDED
@@ -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,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>
|
data/lib/mosaic.rb
ADDED
@@ -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
|
data/lib/mosaic/bin.rb
ADDED
@@ -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,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
|
data/mosaic.gemspec
ADDED
@@ -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
|
data/spec/module_spec.rb
ADDED
@@ -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
|
data/spec/spec_helper.rb
ADDED
@@ -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:
|