bottlerocket 0.0.5

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/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ require 'rspec/core/rake_task'
3
+ task :default => :spec
4
+
5
+ desc "Build Bottlerocket"
6
+ task :build do
7
+ system "gem build bottlerocket.gemspec"
8
+ end
9
+
10
+ desc "Run specs"
11
+ task :spec do
12
+ RSpec::Core::RakeTask.new do |t|
13
+ t.rspec_opts = %w(-fs --color --backtrace)
14
+ end
15
+ end
data/Readme.md ADDED
@@ -0,0 +1,54 @@
1
+ # Bottle Rocket #
2
+ ## *Note: This is a work in progress and currently is not working* ##
3
+ Bottlerocket is a Sinatra/Mongo based CMS which aims to ease development times on small sites. The overall aim is to be able quickly write create your content types in a YAML file and then deploy your site with very little configuration.
4
+
5
+ ## Features ##
6
+ - Mongo based content management system
7
+ - Fully speced
8
+ - Gem based
9
+ - Sinatra based
10
+ - Works with Heroku
11
+ - Beautiful user interface
12
+ - HTML 5/CSS 3 administration interface
13
+
14
+ ## Installation ##
15
+
16
+ gem install bottlerocket
17
+ bottlerocket my_project
18
+
19
+ Bottlerocket also requires you to have atleast Mongo 1.5.8 and Ruby 1.9.2.
20
+
21
+ ## How to Use ##
22
+
23
+ Once you get everything installed, you can define the types of Content you are going to use in your CMS by editing the _content_types.yaml_ file
24
+
25
+ -
26
+ name: pages
27
+ fields:
28
+ - title: string
29
+ - body: text
30
+ - image: file
31
+ - section:
32
+ - general
33
+ - life style
34
+ - cooking
35
+ - gaming
36
+ - rocket science
37
+ - active: boolean
38
+ -
39
+ name: stores
40
+ fields:
41
+ - name: string
42
+ - address: text
43
+
44
+ From here, you can call on a ContentType for use in your template(e.g.)
45
+
46
+ @page = ContentTypes.pages.find(:title => "title").first
47
+
48
+ ## Configuration ##
49
+
50
+ ### Heroku ###
51
+
52
+ ## Notes ##
53
+
54
+ - Note: content_type is reserved field.
File without changes
@@ -0,0 +1,102 @@
1
+ /*
2
+ html5doctor.com Reset Stylesheet
3
+ v1.6.1
4
+ Last Updated: 2010-09-17
5
+ Author: Richard Clark - http://richclarkdesign.com
6
+ Twitter: @rich_clark
7
+ */
8
+
9
+ html, body, div, span, object, iframe,
10
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
11
+ abbr, address, cite, code,
12
+ del, dfn, em, img, ins, kbd, q, samp,
13
+ small, strong, sub, sup, var,
14
+ b, i,
15
+ dl, dt, dd, ol, ul, li,
16
+ fieldset, form, label, legend,
17
+ table, caption, tbody, tfoot, thead, tr, th, td,
18
+ article, aside, canvas, details, figcaption, figure,
19
+ footer, header, hgroup, menu, nav, section, summary,
20
+ time, mark, audio, video {
21
+ margin:0;
22
+ padding:0;
23
+ border:0;
24
+ outline:0;
25
+ font-size:100%;
26
+ vertical-align:baseline;
27
+ background:transparent;
28
+ }
29
+
30
+ body {
31
+ line-height:1;
32
+ }
33
+
34
+ article,aside,details,figcaption,figure,
35
+ footer,header,hgroup,menu,nav,section {
36
+ display:block;
37
+ }
38
+
39
+ nav ul {
40
+ list-style:none;
41
+ }
42
+
43
+ blockquote, q {
44
+ quotes:none;
45
+ }
46
+
47
+ blockquote:before, blockquote:after,
48
+ q:before, q:after {
49
+ content:'';
50
+ content:none;
51
+ }
52
+
53
+ a {
54
+ margin:0;
55
+ padding:0;
56
+ font-size:100%;
57
+ vertical-align:baseline;
58
+ background:transparent;
59
+ }
60
+
61
+ /* change colours to suit your needs */
62
+ ins {
63
+ background-color:#ff9;
64
+ color:#000;
65
+ text-decoration:none;
66
+ }
67
+
68
+ /* change colours to suit your needs */
69
+ mark {
70
+ background-color:#ff9;
71
+ color:#000;
72
+ font-style:italic;
73
+ font-weight:bold;
74
+ }
75
+
76
+ del {
77
+ text-decoration: line-through;
78
+ }
79
+
80
+ abbr[title], dfn[title] {
81
+ border-bottom:1px dotted;
82
+ cursor:help;
83
+ }
84
+
85
+ table {
86
+ border-collapse:collapse;
87
+ border-spacing:0;
88
+ }
89
+
90
+ /* change border colour to suit your needs */
91
+ hr {
92
+ display:block;
93
+ height:1px;
94
+ border:0;
95
+ border-top:1px solid #cccccc;
96
+ margin:1em 0;
97
+ padding:0;
98
+ }
99
+
100
+ input, select {
101
+ vertical-align:middle;
102
+ }
@@ -0,0 +1,48 @@
1
+ body {}
2
+ label { font-weight: bold; }
3
+ fieldset { padding:0 1.4em 1.4em 1.4em; margin: 0 0 1.5em 0; border: 1px solid #ccc; }
4
+ legend { font-weight: bold; font-size:1.2em; margin-top:-0.2em; margin-bottom:1em; }
5
+
6
+ fieldset, #IE8#HACK { padding-top:1.4em; }
7
+ legend, #IE8#HACK { margin-top:0; margin-bottom:0; }
8
+ input[type=text], input[type=password], input[type=url], input[type=email],
9
+ input.text, input.title,
10
+ textarea {
11
+ background-color:#fff;
12
+ border:1px solid #bbb;
13
+ color:#000;
14
+ }
15
+ input[type=text]:focus, input[type=password]:focus, input[type=url]:focus, input[type=email]:focus,
16
+ input.text:focus, input.title:focus,
17
+ textarea:focus {
18
+ border-color:#666;
19
+ }
20
+ select { background-color:#fff; border-width:1px; border-style:solid; }
21
+
22
+ input[type=text], input[type=password], input[type=url], input[type=email],
23
+ input.text, input.title,
24
+ textarea, select {
25
+ margin:0.5em 0;
26
+ }
27
+
28
+ input.text,
29
+ input.title { width: 300px; padding:5px; }
30
+ input.title { font-size:1.5em; }
31
+ textarea { width: 390px; height: 250px; padding:5px; }
32
+ form.inline { line-height:3; }
33
+ form.inline p { margin-bottom:0; }
34
+
35
+ .error,
36
+ .alert,
37
+ .notice,
38
+ .success,
39
+ .info { padding: 0.8em; margin-bottom: 1em; border: 2px solid #ddd; }
40
+
41
+ .error, .alert { background: #fbe3e4; color: #8a1f11; border-color: #fbc2c4; }
42
+ .notice { background: #fff6bf; color: #514721; border-color: #ffd324; }
43
+ .success { background: #e6efc2; color: #264409; border-color: #c6d880; }
44
+ .info { background: #d5edf8; color: #205791; border-color: #92cae4; }
45
+ .error a, .alert a { color: #8a1f11; }
46
+ .notice a { color: #514721; }
47
+ .success a { color: #264409; }
48
+ .info a { color: #205791; }
@@ -0,0 +1,4 @@
1
+ %h2 Edit
2
+ %h3 Blah
3
+ - @entity.attributes.each do |key, value|
4
+ = key
@@ -0,0 +1,8 @@
1
+ %h1= @content_type.title
2
+ %ul
3
+ - @content_type.all.each do |entity|
4
+ %li
5
+ - entity.attributes.each do |label, value|
6
+ %label= label.humanize
7
+ %span.value
8
+ &= value
@@ -0,0 +1,11 @@
1
+ %h1= form_name
2
+ - form_tag(admin_path("#{@content_type.name}")) do
3
+ %ul
4
+ - @content_type.fields.each do |f|
5
+ - field, value = f.keys.first, f.values.first
6
+ %li
7
+ = label_tag field
8
+ = text_field_tag "entity[#{field}]", :value => @entity.attributes[field]
9
+ %li
10
+ = submit_tag "Save #{@content_type.title}"
11
+
@@ -0,0 +1,3 @@
1
+ %ul
2
+ - @content_types.each do |content_type|
3
+ %li= link_to content_type.title, admin_path(content_type.name)
@@ -0,0 +1,15 @@
1
+ !!!
2
+ %html{:lang => "en"}
3
+ %head
4
+ %meta{:charset => "utf-8"}
5
+
6
+ /[if IE]
7
+ %script{:src => " http://html5shiv.googlecode.com/svn/trunk/html5.js"}
8
+
9
+ %title Bottlerocket
10
+ %link{:rel => "stylesheet", :href => "/admin/stylesheets/screen.css"}
11
+
12
+ %body{:id => @page_id || ''}
13
+ %section#content
14
+ = yield
15
+
@@ -0,0 +1 @@
1
+ = @entity.title
data/bin/bottlerocket ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.dirname(__FILE__) + "/../lib"
4
+ require 'bottlerocket/generator'
5
+
6
+ if ARGV.empty?
7
+ STDERR.puts %{
8
+ example: bottlerocket my_shiny_new_site
9
+ }
10
+ else
11
+ generator = Generator.new(ARGV.first)
12
+ generator.copy_template
13
+ generator.dir_setup
14
+ end
@@ -0,0 +1,13 @@
1
+ require 'yaml'
2
+ require 'active_support'
3
+ require 'mongo'
4
+ require 'fileutils'
5
+ require File.dirname(__FILE__) + '/bottlerocket/simple_struct'
6
+ require File.dirname(__FILE__) + '/bottlerocket/models/configuration'
7
+ require File.dirname(__FILE__) + '/bottlerocket/models/content_types'
8
+ require File.dirname(__FILE__) + '/bottlerocket/models/content_type'
9
+ require File.dirname(__FILE__) + '/bottlerocket/models/entity'
10
+ require File.dirname(__FILE__) + '/bottlerocket/generator'
11
+ require File.dirname(__FILE__) + '/bottlerocket/bottlerocket_admin'
12
+
13
+ puts File.dirname(__FILE__) + '/bottlerocket/simple_struct'
@@ -0,0 +1,65 @@
1
+ require 'sinatra'
2
+ require 'sinatra_more/markup_plugin'
3
+
4
+ class BottlerocketAdmin < Sinatra::Application
5
+ register SinatraMore::MarkupPlugin
6
+
7
+ configure do
8
+ set :views => File.dirname(__FILE__) + "/../../admin/views"
9
+ set :public => File.dirname(__FILE__) + "/../../admin/public"
10
+ enable :static
11
+ set :haml, {:format => :html5}
12
+ end
13
+
14
+ helpers do
15
+ def admin_path(location)
16
+ "/admin/#{location}"
17
+ end
18
+ end
19
+
20
+ use Rack::Auth::Basic do |username, password|
21
+ Configuration.instance.users.keys.include?(username) && password == Configuration.instance.users[username]
22
+ end
23
+
24
+ get "/stylesheets/:file.css" do |file|
25
+ content_type 'text/css'
26
+ sass(:"stylesheets/#{file}", :load_paths => ([ File.join(File.dirname(__FILE__), 'views', 'stylesheets') ]))
27
+ end
28
+
29
+ get '/' do
30
+ @content_types = Configuration.instance.content_types.all
31
+ haml :index
32
+ end
33
+
34
+ get '/:handle' do |handle|
35
+ @content_type = Configuration.instance.content_types.find(handle)
36
+ haml :entities
37
+ end
38
+
39
+ get '/:handle/new' do |handle|
40
+ @content_type = Configuration.instance.content_types.find(handle)
41
+ @entity = SimpleStruct.new
42
+ haml :entity, :locals => {:form_name => "New Form"}
43
+ end
44
+
45
+ get '/:handle/:id/edit' do |handle, id|
46
+ @content_type = Configuration.instance.content_types.find(handle)
47
+ @entity = Configuration.instance.content_types.find(handle).find_by_id(id)
48
+ haml :entity, :locals => {:form_name => "Edit Form"}
49
+ end
50
+
51
+ get '/:handle/:id/delete' do |handle, id|
52
+ Configuration.instance.content_types.find(handle).remove(:_id => id)
53
+ redirect admin_path(handle)
54
+ end
55
+
56
+ get '/:handle/:id' do |handle, id|
57
+ @entity = Configuration.instance.content_types.find(handle).find_by_id(id)
58
+ haml :show
59
+ end
60
+
61
+ post '/:handle' do |handle|
62
+ Configuration.instance.content_types.find(handle).create params[:entity]
63
+ redirect admin_path(handle)
64
+ end
65
+ end
@@ -0,0 +1,21 @@
1
+ require 'fileutils'
2
+
3
+ class Generator
4
+ attr_accessor :dir
5
+ def initialize(dir)
6
+ self.dir = dir
7
+ end
8
+
9
+ def create_directory
10
+ FileUtils.mkdir_p dir
11
+ end
12
+
13
+ def copy_template
14
+ FileUtils.cp_r(File.dirname(__FILE__) + '/../../template', dir)
15
+ end
16
+
17
+ def dir_setup
18
+ FileUtils.mkdir_p [dir + "/public/css", dir + "/public/javascripts", dir + "/public/images", dir + "/views/stylesheets"]
19
+ end
20
+
21
+ end
@@ -0,0 +1,6 @@
1
+ module HasConnection
2
+ def db
3
+ @db = Mongo::Connection.new(Configuration.instance.development.database_host,
4
+ Configuration.instance.development.database_port).db(Configuration.instance.development.database_name)
5
+ end
6
+ end
@@ -0,0 +1,52 @@
1
+ require 'singleton'
2
+
3
+ class ConnectionHelper
4
+ attr_accessor :attrs
5
+
6
+ def initialize(attrs)
7
+ self.attrs = attrs
8
+ end
9
+
10
+ def method_missing(field, *args)
11
+ begin
12
+ attrs[field.to_s]
13
+ rescue
14
+ super(field, *args)
15
+ end
16
+ end
17
+
18
+ def connection
19
+ "mongodb://" + attrs['database_host'] + ":" + attrs['database_port'].to_s + "/" + attrs['database_name']
20
+ end
21
+ end
22
+
23
+ class Configuration
24
+ include Singleton
25
+
26
+ attr_accessor :config_file_location
27
+
28
+ def attrs
29
+ @attrs ||= YAML.load_file config_file_location
30
+ end
31
+
32
+ def environments
33
+ %w(development test staging production)
34
+ end
35
+
36
+ def content_types
37
+ @content_types ||= ContentTypes.load(content_types_file)
38
+ end
39
+
40
+ def method_missing(field, *args)
41
+ begin
42
+ if environments.include? field.to_s
43
+ ConnectionHelper.new attrs[field.to_s]
44
+ else
45
+ attrs[field.to_s]
46
+ end
47
+ rescue
48
+ super(field, *args)
49
+ end
50
+ end
51
+
52
+ end
@@ -0,0 +1,64 @@
1
+ require File.dirname(__FILE__) + '/../has_connection'
2
+
3
+ class ContentType < SimpleStruct
4
+ include HasConnection
5
+
6
+ def field_names
7
+ fields.collect { |hash| hash.keys.first }
8
+ end
9
+
10
+ def title
11
+ name.humanize
12
+ end
13
+
14
+ def single_title
15
+ name.singularize.humanize
16
+ end
17
+
18
+ def collection
19
+ db.collection name
20
+ end
21
+
22
+ def create(attrs)
23
+ find_by_id collection.insert(attrs)
24
+ end
25
+
26
+ def update(attrs)
27
+ a = attrs.dup
28
+ a.delete :content_type
29
+ collection.update({:_id => mongo_object_id(a[:_id])}, a)
30
+ end
31
+
32
+ def remove(attrs)
33
+ collection.remove(attrs)
34
+ end
35
+
36
+ def find_by_id(id)
37
+ find_one :_id => mongo_object_id(id)
38
+ end
39
+
40
+ def find_one(*args)
41
+ result = collection.find_one(*args)
42
+ result.merge!({:content_type => self}) if result.present?
43
+ if result.nil? or result.empty?
44
+ nil
45
+ else
46
+ Entity.new result
47
+ end
48
+ end
49
+
50
+ def find(*args)
51
+ collection.find(*args).collect { |attrs| Entity.new attrs.merge(:content_type => self) }
52
+ end
53
+
54
+ alias_method :all, :find
55
+
56
+ def mongo_object_id(id)
57
+ if id.is_a? String
58
+ BSON::ObjectId.from_string(id)
59
+ else
60
+ id
61
+ end
62
+ end
63
+
64
+ end
@@ -0,0 +1,31 @@
1
+ class ContentTypes
2
+ attr_accessor :content_types
3
+
4
+ def self.load(content_types_yaml)
5
+ ContentTypes.new content_types_yaml
6
+ end
7
+
8
+ def initialize(content_types_yaml)
9
+ self.content_types = YAML.load_file(content_types_yaml).collect { |attrs| ContentType.new(attrs) }
10
+ end
11
+
12
+ def all
13
+ content_types
14
+ end
15
+
16
+ def length
17
+ content_types.length
18
+ end
19
+
20
+ def find(name)
21
+ content_types.detect { |ct| ct.name == name }
22
+ end
23
+
24
+ def method_missing(field, *args)
25
+ if find field.to_s.end_with?('=')
26
+ field.to_s = args.first
27
+ else
28
+ find field.to_s
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,9 @@
1
+ class Entity < SimpleStruct
2
+ def update
3
+ content_type.update(self.attributes)
4
+ end
5
+
6
+ def delete
7
+ content_type.delete(self.attributes)
8
+ end
9
+ end
@@ -0,0 +1,24 @@
1
+ class SimpleStruct
2
+ attr_accessor :attributes
3
+
4
+ def initialize(attributes={})
5
+ self.attributes = attributes
6
+ end
7
+
8
+ def attributes=(attrs)
9
+ @attributes = HashWithIndifferentAccess.new attrs
10
+ end
11
+
12
+ def method_missing(field, *args)
13
+ begin
14
+ if field.to_s.end_with?('=')
15
+ field_name = field.to_s.sub '=', ''
16
+ @attributes[field_name] = args.first
17
+ else
18
+ @attributes[field]
19
+ end
20
+ rescue
21
+ super(field, *args)
22
+ end
23
+ end
24
+ end
data/template/Gemfile ADDED
@@ -0,0 +1 @@
1
+ gem "bottlerocket"
@@ -0,0 +1 @@
1
+ This is Bottlerocket 0.0.4
@@ -0,0 +1,4 @@
1
+ database_name: test
2
+ database_host: localhost
3
+ database_port: 27017
4
+ content_types_file: content_types.yaml
@@ -0,0 +1,24 @@
1
+ require 'rubygems'
2
+ require 'sinatra'
3
+ require 'bottlerocket'
4
+ require File.dirname(__FILE__) + '/site'
5
+
6
+ Configuration.instance.config_file_location = File.dirname(__FILE__) + '/bottlerocket.yaml'
7
+
8
+ set :run, false
9
+
10
+ app = Rack::Builder.new do
11
+ map '/admin' do
12
+ run BottlerocketAdmin
13
+ end
14
+
15
+ map '/' do
16
+ run Site
17
+ end
18
+ end.to_app
19
+
20
+ log = File.new("sinatra.log", "a")
21
+ STDOUT.reopen(log)
22
+ STDERR.reopen(log)
23
+
24
+ run app
@@ -0,0 +1,19 @@
1
+ -
2
+ name: pages
3
+ fields:
4
+ - title: string
5
+ - body: text
6
+ - image: file
7
+ - section:
8
+ - general
9
+ - life style
10
+ - cooking
11
+ - gaming
12
+ - rocket science
13
+ - active: boolean
14
+
15
+ -
16
+ name: stores
17
+ fields:
18
+ - name: string
19
+ - address: text
data/template/site.rb ADDED
@@ -0,0 +1,5 @@
1
+ class Site < Sinatra::Application
2
+ get '/' do
3
+ '<h1>Welcome to Bottlerocket</h1>'
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bottlerocket
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.5
6
+ platform: ruby
7
+ authors:
8
+ - Brett Goulder
9
+ - Carl Woodward
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+
14
+ date: 2011-05-05 00:00:00 -07:00
15
+ default_executable:
16
+ dependencies:
17
+ - !ruby/object:Gem::Dependency
18
+ name: activesupport
19
+ prerelease: false
20
+ requirement: &id001 !ruby/object:Gem::Requirement
21
+ none: false
22
+ requirements:
23
+ - - "="
24
+ - !ruby/object:Gem::Version
25
+ version: "3.0"
26
+ type: :runtime
27
+ version_requirements: *id001
28
+ - !ruby/object:Gem::Dependency
29
+ name: sinatra
30
+ prerelease: false
31
+ requirement: &id002 !ruby/object:Gem::Requirement
32
+ none: false
33
+ requirements:
34
+ - - "="
35
+ - !ruby/object:Gem::Version
36
+ version: "1.0"
37
+ type: :runtime
38
+ version_requirements: *id002
39
+ - !ruby/object:Gem::Dependency
40
+ name: mongo
41
+ prerelease: false
42
+ requirement: &id003 !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - "="
46
+ - !ruby/object:Gem::Version
47
+ version: 1.0.8
48
+ type: :runtime
49
+ version_requirements: *id003
50
+ - !ruby/object:Gem::Dependency
51
+ name: sinatra_more
52
+ prerelease: false
53
+ requirement: &id004 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - "="
57
+ - !ruby/object:Gem::Version
58
+ version: 0.3.40
59
+ type: :runtime
60
+ version_requirements: *id004
61
+ - !ruby/object:Gem::Dependency
62
+ name: haml
63
+ prerelease: false
64
+ requirement: &id005 !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - "="
68
+ - !ruby/object:Gem::Version
69
+ version: 3.0.25
70
+ type: :runtime
71
+ version_requirements: *id005
72
+ description: A nifty Sinatra/Mongo based CMS made by an American and an Australian guy with an afro
73
+ email: brett.goulder@gmail.com
74
+ executables:
75
+ - bottlerocket
76
+ extensions: []
77
+
78
+ extra_rdoc_files: []
79
+
80
+ files:
81
+ - Readme.md
82
+ - Rakefile
83
+ - admin/public/javascripts/site.js
84
+ - admin/public/stylesheets/reset.css
85
+ - admin/public/stylesheets/screen.css
86
+ - admin/views/edit.haml
87
+ - admin/views/entities.haml
88
+ - admin/views/entity.haml
89
+ - admin/views/index.haml
90
+ - admin/views/layout.haml
91
+ - admin/views/show.haml
92
+ - bin/bottlerocket
93
+ - lib/bottlerocket/bottlerocket_admin.rb
94
+ - lib/bottlerocket/generator.rb
95
+ - lib/bottlerocket/has_connection.rb
96
+ - lib/bottlerocket/models/configuration.rb
97
+ - lib/bottlerocket/models/content_type.rb
98
+ - lib/bottlerocket/models/content_types.rb
99
+ - lib/bottlerocket/models/entity.rb
100
+ - lib/bottlerocket/simple_struct.rb
101
+ - lib/bottlerocket.rb
102
+ - template/bottlerocket.yaml
103
+ - template/config.ru
104
+ - template/content_types.yaml
105
+ - template/Gemfile
106
+ - template/README.markdown
107
+ - template/site.rb
108
+ has_rdoc: true
109
+ homepage: http://github.com/brettgoulder/bottlerocket
110
+ licenses: []
111
+
112
+ post_install_message:
113
+ rdoc_options: []
114
+
115
+ require_paths:
116
+ - lib
117
+ required_ruby_version: !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: "0"
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: "0"
129
+ requirements: []
130
+
131
+ rubyforge_project:
132
+ rubygems_version: 1.6.2
133
+ signing_key:
134
+ specification_version: 3
135
+ summary: A nifty Sinatra/Mongo based CMS
136
+ test_files: []
137
+