comfortable_mexican_sofa 1.4.20 → 1.4.21
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +1 -1
- data/VERSION +1 -1
- data/app/controllers/cms_admin/pages_controller.rb +3 -0
- data/comfortable_mexican_sofa.gemspec +8 -8
- data/lib/comfortable_mexican_sofa/form_builder.rb +2 -2
- data/lib/comfortable_mexican_sofa/tags/collection.rb +29 -15
- data/test/functional/cms_admin/pages_controller_test.rb +16 -4
- data/test/unit/tag_test.rb +6 -6
- data/test/unit/tags/collection_test.rb +44 -13
- metadata +10 -12
data/.travis.yml
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.4.
|
1
|
+
1.4.21
|
@@ -101,6 +101,9 @@ protected
|
|
101
101
|
def preview_cms_page
|
102
102
|
if params[:preview]
|
103
103
|
layout = @page.layout.app_layout.blank?? false : @page.layout.app_layout
|
104
|
+
@cms_site = @page.site
|
105
|
+
@cms_layout = @page.layout
|
106
|
+
@cms_page = @page
|
104
107
|
render :inline => @page.content(true), :layout => layout
|
105
108
|
end
|
106
109
|
end
|
@@ -4,14 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "1.4.
|
7
|
+
s.name = "comfortable_mexican_sofa"
|
8
|
+
s.version = "1.4.21"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Oleg Khabarov", "The Working Group Inc"]
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
12
|
+
s.date = "2011-09-26"
|
13
|
+
s.description = ""
|
14
|
+
s.email = "oleg@theworkinggroup.ca"
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
17
|
"README.md"
|
@@ -300,10 +300,10 @@ Gem::Specification.new do |s|
|
|
300
300
|
"test/unit/tags/snippet_test.rb",
|
301
301
|
"test/unit/view_methods_test.rb"
|
302
302
|
]
|
303
|
-
s.homepage =
|
303
|
+
s.homepage = "http://github.com/twg/comfortable-mexican-sofa"
|
304
304
|
s.require_paths = ["lib"]
|
305
|
-
s.rubygems_version =
|
306
|
-
s.summary =
|
305
|
+
s.rubygems_version = "1.8.10"
|
306
|
+
s.summary = "ComfortableMexicanSofa is a powerful CMS Engine for Ruby on Rails 3 applications"
|
307
307
|
|
308
308
|
if s.respond_to? :specification_version then
|
309
309
|
s.specification_version = 3
|
@@ -120,7 +120,7 @@ class ComfortableMexicanSofa::FormBuilder < ActionView::Helpers::FormBuilder
|
|
120
120
|
|
121
121
|
def collection(tag)
|
122
122
|
options = [["---- Select #{tag.collection_class.titleize} ----", nil]] +
|
123
|
-
tag.
|
123
|
+
tag.collection_objects.collect do |m|
|
124
124
|
[m.send(tag.collection_title), m.send(tag.collection_identifier)]
|
125
125
|
end
|
126
126
|
|
@@ -130,7 +130,7 @@ class ComfortableMexicanSofa::FormBuilder < ActionView::Helpers::FormBuilder
|
|
130
130
|
:id => nil
|
131
131
|
)
|
132
132
|
content << @template.hidden_field_tag('page[blocks_attributes][][label]', tag.label, :id => nil)
|
133
|
-
simple_field(tag.
|
133
|
+
simple_field(tag.label, content, :class => tag.class.to_s.demodulize.underscore )
|
134
134
|
end
|
135
135
|
|
136
136
|
end
|
@@ -1,36 +1,50 @@
|
|
1
1
|
class ComfortableMexicanSofa::Tag::Collection
|
2
2
|
include ComfortableMexicanSofa::Tag
|
3
3
|
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# {{ cms:collection:Album:albums/show:title:slug:param_a:param_b }}
|
4
|
+
# Here's a full tag signature:
|
5
|
+
# {{ cms:collection:label:collection_class:collection_partial:collection_title:collection_identifier:collection_params }}
|
6
|
+
# Most minimal tag can look like this:
|
7
|
+
# {{ cms:collection:album:foo/my_album }}
|
8
|
+
# A more complete example of the above:
|
9
|
+
# {{ cms:collection:album:foo/my_album:albums/show:title:slug:param_a:param_b }}
|
11
10
|
def self.regex_tag_signature(label = nil)
|
12
11
|
label ||= /[\w\/\-]+/
|
13
|
-
/\{\{\s*cms:collection:(#{label}):(
|
12
|
+
/\{\{\s*cms:collection:(#{label}):(.*?)\s*\}\}/
|
14
13
|
end
|
15
14
|
|
16
|
-
|
17
|
-
|
15
|
+
# Class definitition. It's basically `Herp::DerpityDerp.undescore` so an example
|
16
|
+
# of valid definition is: `herp/derpity_derp`
|
17
|
+
def collection_class
|
18
|
+
self.params[0].classify
|
18
19
|
end
|
19
20
|
|
20
|
-
|
21
|
-
|
21
|
+
# Path to the partial. Example: `path/to/partial`
|
22
|
+
def collection_partial
|
23
|
+
self.params[1] || self.collection_class.underscore.pluralize
|
22
24
|
end
|
23
25
|
|
26
|
+
# Title method for the Collection objects. Default is `label`
|
24
27
|
def collection_title
|
25
|
-
self.params[
|
28
|
+
self.params[2] || 'label'
|
26
29
|
end
|
27
30
|
|
31
|
+
# Identifier that will be used to find selected collection object. Defaults to `id`
|
28
32
|
def collection_identifier
|
29
|
-
self.params[
|
33
|
+
self.params[3] || 'id'
|
30
34
|
end
|
31
35
|
|
36
|
+
# Extra params that will be passed to the partial AND ALSO will be passed as parameters
|
37
|
+
# for the `cms_collection` scope you can define for your Collection object
|
32
38
|
def collection_params
|
33
|
-
self.params[
|
39
|
+
self.params[4..-1] || []
|
40
|
+
end
|
41
|
+
|
42
|
+
# Array of objects used in the collection
|
43
|
+
# You may set up a scope on the model `scope :cms_collection, lambda|*args| do ... end `
|
44
|
+
# `args` will be the set of `collection_params`
|
45
|
+
def collection_objects
|
46
|
+
klass = self.collection_class.constantize
|
47
|
+
klass.respond_to?(:cms_collection) ? klass.cms_collection(*collection_params).all : klass.all
|
34
48
|
end
|
35
49
|
|
36
50
|
def content=(value)
|
@@ -104,13 +104,13 @@ class CmsAdmin::PagesControllerTest < ActionController::TestCase
|
|
104
104
|
|
105
105
|
def test_get_new_with_collection
|
106
106
|
snippet = cms_snippets(:default)
|
107
|
-
cms_layouts(:default).update_attribute(:content, '{{cms:collection:cms/snippet
|
107
|
+
cms_layouts(:default).update_attribute(:content, '{{cms:collection:snippet:cms/snippet}}')
|
108
108
|
get :new, :site_id => cms_sites(:default)
|
109
109
|
assert_select "select[name='page[blocks_attributes][][content]']" do
|
110
110
|
assert_select "option[value='']", :html => '---- Select Cms/Snippet ----'
|
111
111
|
assert_select "option[value='#{snippet.id}']", :html => snippet.label
|
112
112
|
end
|
113
|
-
assert_select "input[type='hidden'][name='page[blocks_attributes][][label]'][value='
|
113
|
+
assert_select "input[type='hidden'][name='page[blocks_attributes][][label]'][value='snippet']"
|
114
114
|
end
|
115
115
|
|
116
116
|
def test_get_new_with_rich_page_text
|
@@ -280,12 +280,15 @@ class CmsAdmin::PagesControllerTest < ActionController::TestCase
|
|
280
280
|
end
|
281
281
|
|
282
282
|
def test_creation_preview
|
283
|
+
site = cms_sites(:default)
|
284
|
+
layout = cms_layouts(:default)
|
285
|
+
|
283
286
|
assert_no_difference 'Cms::Page.count' do
|
284
|
-
post :create, :site_id =>
|
287
|
+
post :create, :site_id => site, :preview => 'Preview', :page => {
|
285
288
|
:label => 'Test Page',
|
286
289
|
:slug => 'test-page',
|
287
290
|
:parent_id => cms_pages(:default).id,
|
288
|
-
:layout_id =>
|
291
|
+
:layout_id => layout.id,
|
289
292
|
:blocks_attributes => [
|
290
293
|
{ :label => 'default_page_text',
|
291
294
|
:content => 'preview content' }
|
@@ -293,6 +296,11 @@ class CmsAdmin::PagesControllerTest < ActionController::TestCase
|
|
293
296
|
}
|
294
297
|
assert_response :success
|
295
298
|
assert_match /preview content/, response.body
|
299
|
+
|
300
|
+
assert_equal site, assigns(:cms_site)
|
301
|
+
assert_equal layout, assigns(:cms_layout)
|
302
|
+
assert assigns(:cms_page)
|
303
|
+
assert assigns(:cms_page).new_record?
|
296
304
|
end
|
297
305
|
end
|
298
306
|
|
@@ -311,6 +319,10 @@ class CmsAdmin::PagesControllerTest < ActionController::TestCase
|
|
311
319
|
assert_match /preview content/, response.body
|
312
320
|
page.reload
|
313
321
|
assert_not_equal 'Updated Label', page.label
|
322
|
+
|
323
|
+
assert_equal page.site, assigns(:cms_site)
|
324
|
+
assert_equal page.layout, assigns(:cms_layout)
|
325
|
+
assert_equal page, assigns(:cms_page)
|
314
326
|
end
|
315
327
|
end
|
316
328
|
|
data/test/unit/tag_test.rb
CHANGED
@@ -226,7 +226,7 @@ class TagTest < ActiveSupport::TestCase
|
|
226
226
|
site = cms_sites(:default)
|
227
227
|
layout = site.layouts.create!(
|
228
228
|
:slug => 'no-irb-layout',
|
229
|
-
:content => '<% 1 + 1 %> {{cms:page:content}} {{cms:collection:cms/snippet
|
229
|
+
:content => '<% 1 + 1 %> {{cms:page:content}} {{cms:collection:snippet:cms/snippet}} <%= 1 + 1 %>'
|
230
230
|
)
|
231
231
|
snippet = site.snippets.create!(
|
232
232
|
:slug => 'no-irb-snippet',
|
@@ -239,11 +239,11 @@ class TagTest < ActiveSupport::TestCase
|
|
239
239
|
:blocks_attributes => [
|
240
240
|
{ :label => 'content',
|
241
241
|
:content => 'text {{ cms:snippet:no-irb-snippet }} {{ cms:partial:path/to }} {{ cms:helper:method }} text' },
|
242
|
-
{ :label => '
|
242
|
+
{ :label => 'snippet',
|
243
243
|
:content => snippet.id }
|
244
244
|
]
|
245
245
|
)
|
246
|
-
assert_equal "<% 1 + 1 %> text <% 2 + 2 %> snippet <%= 2 + 2 %> <%= render :partial => 'path/to' %> <%= method() %> text <%= render :partial => 'snippets
|
246
|
+
assert_equal "<% 1 + 1 %> text <% 2 + 2 %> snippet <%= 2 + 2 %> <%= render :partial => 'path/to' %> <%= method() %> text <%= render :partial => 'cms/snippets', :locals => {:model => 'Cms::Snippet', :identifier => '#{snippet.id}'} %> <%= 1 + 1 %>", page.content
|
247
247
|
end
|
248
248
|
|
249
249
|
def test_content_with_irb_enabled
|
@@ -252,7 +252,7 @@ class TagTest < ActiveSupport::TestCase
|
|
252
252
|
site = cms_sites(:default)
|
253
253
|
layout = site.layouts.create!(
|
254
254
|
:slug => 'irb-layout',
|
255
|
-
:content => '<% 1 + 1 %> {{cms:page:content}} {{cms:collection:cms/snippet
|
255
|
+
:content => '<% 1 + 1 %> {{cms:page:content}} {{cms:collection:snippet:cms/snippet}} <%= 1 + 1 %>'
|
256
256
|
)
|
257
257
|
snippet = site.snippets.create!(
|
258
258
|
:slug => 'irb-snippet',
|
@@ -265,11 +265,11 @@ class TagTest < ActiveSupport::TestCase
|
|
265
265
|
:blocks_attributes => [
|
266
266
|
{ :label => 'content',
|
267
267
|
:content => 'text {{ cms:snippet:irb-snippet }} {{ cms:partial:path/to }} {{ cms:helper:method }} text' },
|
268
|
-
{ :label => '
|
268
|
+
{ :label => 'snippet',
|
269
269
|
:content => snippet.id }
|
270
270
|
]
|
271
271
|
)
|
272
|
-
assert_equal "<% 1 + 1 %> text <% 2 + 2 %> snippet <%= 2 + 2 %> <%= render :partial => 'path/to' %> <%= method() %> text <%= render :partial => 'snippets
|
272
|
+
assert_equal "<% 1 + 1 %> text <% 2 + 2 %> snippet <%= 2 + 2 %> <%= render :partial => 'path/to' %> <%= method() %> text <%= render :partial => 'cms/snippets', :locals => {:model => 'Cms::Snippet', :identifier => '#{snippet.id}'} %> <%= 1 + 1 %>", page.content
|
273
273
|
end
|
274
274
|
|
275
275
|
end
|
@@ -2,13 +2,20 @@ require File.expand_path('../../test_helper', File.dirname(__FILE__))
|
|
2
2
|
|
3
3
|
class CollectionTagTest < ActiveSupport::TestCase
|
4
4
|
|
5
|
+
module TestCollectionScope
|
6
|
+
def self.included(base)
|
7
|
+
base.scope :cms_collection, lambda{|*args| base.where(:slug => args.first) if args.first }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
Cms::Snippet.send(:include, TestCollectionScope)
|
11
|
+
|
5
12
|
def test_initialize_tag
|
6
13
|
assert tag = ComfortableMexicanSofa::Tag::Collection.initialize_tag(
|
7
|
-
cms_pages(:default), '{{ cms:collection:cms/snippet
|
14
|
+
cms_pages(:default), '{{ cms:collection:snippet:cms/snippet }}'
|
8
15
|
)
|
9
|
-
assert_equal '
|
16
|
+
assert_equal 'snippet', tag.label
|
10
17
|
assert_equal 'Cms::Snippet', tag.collection_class
|
11
|
-
assert_equal '
|
18
|
+
assert_equal 'cms/snippets', tag.collection_partial
|
12
19
|
assert_equal 'label', tag.collection_title
|
13
20
|
assert_equal 'id', tag.collection_identifier
|
14
21
|
assert_equal [], tag.collection_params
|
@@ -16,9 +23,9 @@ class CollectionTagTest < ActiveSupport::TestCase
|
|
16
23
|
|
17
24
|
def test_initialize_tag_detailed
|
18
25
|
assert tag = ComfortableMexicanSofa::Tag::Collection.initialize_tag(
|
19
|
-
cms_pages(:default), '{{ cms:collection:cms/snippet:path/to/partial:title:slug:param_a:param_b }}'
|
26
|
+
cms_pages(:default), '{{ cms:collection:snippet:cms/snippet:path/to/partial:title:slug:param_a:param_b }}'
|
20
27
|
)
|
21
|
-
assert_equal '
|
28
|
+
assert_equal 'snippet', tag.label
|
22
29
|
assert_equal 'Cms::Snippet', tag.collection_class
|
23
30
|
assert_equal 'path/to/partial', tag.collection_partial
|
24
31
|
assert_equal 'title', tag.collection_title
|
@@ -30,7 +37,7 @@ class CollectionTagTest < ActiveSupport::TestCase
|
|
30
37
|
[
|
31
38
|
'{{cms:collection}}',
|
32
39
|
'{{cms:collection:label}}',
|
33
|
-
'{{cms:not_collection:label:partial}}',
|
40
|
+
'{{cms:not_collection:label:class:partial}}',
|
34
41
|
'{not_a_tag}'
|
35
42
|
].each do |tag_signature|
|
36
43
|
assert_nil ComfortableMexicanSofa::Tag::Collection.initialize_tag(
|
@@ -39,9 +46,33 @@ class CollectionTagTest < ActiveSupport::TestCase
|
|
39
46
|
end
|
40
47
|
end
|
41
48
|
|
49
|
+
def test_collection_objects
|
50
|
+
assert tag = ComfortableMexicanSofa::Tag::Collection.initialize_tag(
|
51
|
+
cms_pages(:default), '{{ cms:collection:snippet:cms/snippet }}'
|
52
|
+
)
|
53
|
+
assert snippets = tag.collection_objects
|
54
|
+
assert_equal 1, snippets.count
|
55
|
+
assert snippets.first.is_a?(Cms::Snippet)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_collection_objects_with_scope
|
59
|
+
assert tag = ComfortableMexicanSofa::Tag::Collection.initialize_tag(
|
60
|
+
cms_pages(:default), "{{ cms:collection:snippet:cms/snippet:path/to/partial:label:slug:#{cms_snippets(:default).slug} }}"
|
61
|
+
)
|
62
|
+
assert snippets = tag.collection_objects
|
63
|
+
assert_equal 1, snippets.count
|
64
|
+
assert snippets.first.is_a?(Cms::Snippet)
|
65
|
+
|
66
|
+
assert tag = ComfortableMexicanSofa::Tag::Collection.initialize_tag(
|
67
|
+
cms_pages(:default), "{{ cms:collection:snippet:cms/snippet:path/to/partial:label:slug:invalid }}"
|
68
|
+
)
|
69
|
+
assert snippets = tag.collection_objects
|
70
|
+
assert_equal 0, snippets.count
|
71
|
+
end
|
72
|
+
|
42
73
|
def test_content_and_render
|
43
|
-
tag = ComfortableMexicanSofa::Tag::Collection.initialize_tag(
|
44
|
-
cms_pages(:default), '{{ cms:collection:cms/snippet
|
74
|
+
assert tag = ComfortableMexicanSofa::Tag::Collection.initialize_tag(
|
75
|
+
cms_pages(:default), '{{ cms:collection:snippet:cms/snippet }}'
|
45
76
|
)
|
46
77
|
assert tag.content.blank?
|
47
78
|
|
@@ -49,12 +80,12 @@ class CollectionTagTest < ActiveSupport::TestCase
|
|
49
80
|
tag.content = snippet.id
|
50
81
|
assert_equal snippet.id, tag.block.content
|
51
82
|
assert_equal snippet.id, tag.content
|
52
|
-
assert_equal "<%= render :partial => '
|
83
|
+
assert_equal "<%= render :partial => 'cms/snippets', :locals => {:model => 'Cms::Snippet', :identifier => '#{snippet.id}'} %>", tag.render
|
53
84
|
end
|
54
85
|
|
55
86
|
def test_content_and_render_detailed
|
56
|
-
tag = ComfortableMexicanSofa::Tag::Collection.initialize_tag(
|
57
|
-
cms_pages(:default), '{{ cms:collection:cms/snippet:path/to/partial:label:slug:param_a:param_b }}'
|
87
|
+
assert tag = ComfortableMexicanSofa::Tag::Collection.initialize_tag(
|
88
|
+
cms_pages(:default), '{{ cms:collection:snippet:cms/snippet:path/to/partial:label:slug:param_a:param_b }}'
|
58
89
|
)
|
59
90
|
assert tag.content.blank?
|
60
91
|
|
@@ -66,8 +97,8 @@ class CollectionTagTest < ActiveSupport::TestCase
|
|
66
97
|
end
|
67
98
|
|
68
99
|
def test_content_and_render_with_no_content
|
69
|
-
tag = ComfortableMexicanSofa::Tag::Collection.initialize_tag(
|
70
|
-
cms_pages(:default), '{{ cms:collection:cms/snippet:path/to/partial }}'
|
100
|
+
assert tag = ComfortableMexicanSofa::Tag::Collection.initialize_tag(
|
101
|
+
cms_pages(:default), '{{ cms:collection:snippet:cms/snippet:path/to/partial }}'
|
71
102
|
)
|
72
103
|
assert tag.content.blank?
|
73
104
|
assert_equal '', tag.render
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: comfortable_mexican_sofa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.21
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,12 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2011-09-
|
14
|
-
default_executable:
|
13
|
+
date: 2011-09-26 00:00:00.000000000Z
|
15
14
|
dependencies:
|
16
15
|
- !ruby/object:Gem::Dependency
|
17
16
|
name: rails
|
18
|
-
requirement: &
|
17
|
+
requirement: &70347786828380 !ruby/object:Gem::Requirement
|
19
18
|
none: false
|
20
19
|
requirements:
|
21
20
|
- - ! '>='
|
@@ -23,10 +22,10 @@ dependencies:
|
|
23
22
|
version: 3.0.0
|
24
23
|
type: :runtime
|
25
24
|
prerelease: false
|
26
|
-
version_requirements: *
|
25
|
+
version_requirements: *70347786828380
|
27
26
|
- !ruby/object:Gem::Dependency
|
28
27
|
name: active_link_to
|
29
|
-
requirement: &
|
28
|
+
requirement: &70347786827600 !ruby/object:Gem::Requirement
|
30
29
|
none: false
|
31
30
|
requirements:
|
32
31
|
- - ! '>='
|
@@ -34,10 +33,10 @@ dependencies:
|
|
34
33
|
version: 1.0.0
|
35
34
|
type: :runtime
|
36
35
|
prerelease: false
|
37
|
-
version_requirements: *
|
36
|
+
version_requirements: *70347786827600
|
38
37
|
- !ruby/object:Gem::Dependency
|
39
38
|
name: paperclip
|
40
|
-
requirement: &
|
39
|
+
requirement: &70347786826860 !ruby/object:Gem::Requirement
|
41
40
|
none: false
|
42
41
|
requirements:
|
43
42
|
- - ! '>='
|
@@ -45,7 +44,7 @@ dependencies:
|
|
45
44
|
version: 2.3.14
|
46
45
|
type: :runtime
|
47
46
|
prerelease: false
|
48
|
-
version_requirements: *
|
47
|
+
version_requirements: *70347786826860
|
49
48
|
description: ''
|
50
49
|
email: oleg@theworkinggroup.ca
|
51
50
|
executables: []
|
@@ -336,7 +335,6 @@ files:
|
|
336
335
|
- test/unit/tags/partial_test.rb
|
337
336
|
- test/unit/tags/snippet_test.rb
|
338
337
|
- test/unit/view_methods_test.rb
|
339
|
-
has_rdoc: true
|
340
338
|
homepage: http://github.com/twg/comfortable-mexican-sofa
|
341
339
|
licenses: []
|
342
340
|
post_install_message:
|
@@ -351,7 +349,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
351
349
|
version: '0'
|
352
350
|
segments:
|
353
351
|
- 0
|
354
|
-
hash: -
|
352
|
+
hash: -4146543032644537540
|
355
353
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
356
354
|
none: false
|
357
355
|
requirements:
|
@@ -360,7 +358,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
360
358
|
version: '0'
|
361
359
|
requirements: []
|
362
360
|
rubyforge_project:
|
363
|
-
rubygems_version: 1.
|
361
|
+
rubygems_version: 1.8.10
|
364
362
|
signing_key:
|
365
363
|
specification_version: 3
|
366
364
|
summary: ComfortableMexicanSofa is a powerful CMS Engine for Ruby on Rails 3 applications
|