noodall 0.0.4 → 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/lib/noodall/generator.rb +10 -0
- data/lib/noodall/templates/Gemfile +14 -6
- data/lib/noodall/templates/app/views/layouts/application.html.erb.tt +5 -0
- data/lib/noodall/templates/config/initializers/noodall.rb +9 -1
- data/lib/noodall/templates/config/routes.rb +1 -0
- data/lib/noodall/templates/config/sitemap.yml +24 -0
- data/lib/noodall/templates/db/seeds.rb +3 -2
- data/lib/noodall/templates/features/component_slots.feature +29 -6
- data/lib/noodall/templates/features/content_templates.feature +9 -4
- data/lib/noodall/templates/features/step_definitions/cms_node_steps.rb +22 -5
- data/lib/noodall/templates/features/step_definitions/component_steps.rb +55 -1
- data/lib/noodall/templates/lib/tasks/populate.rake +10 -0
- data/lib/noodall/version.rb +1 -1
- metadata +8 -6
data/lib/noodall/generator.rb
CHANGED
@@ -22,6 +22,16 @@ module Noodall
|
|
22
22
|
copy_file "config/cucumber.yml"
|
23
23
|
end
|
24
24
|
|
25
|
+
def lib
|
26
|
+
super
|
27
|
+
copy_file "lib/tasks/populate.rake"
|
28
|
+
end
|
29
|
+
|
30
|
+
def config
|
31
|
+
super
|
32
|
+
copy_file "config/sitemap.yml"
|
33
|
+
end
|
34
|
+
|
25
35
|
end
|
26
36
|
|
27
37
|
class AppGenerator < Rails::Generators::AppGenerator
|
@@ -1,23 +1,31 @@
|
|
1
1
|
source 'http://rubygems.org'
|
2
|
+
source 'http://gems.github.com'
|
2
3
|
|
3
4
|
gem 'rails', '3.0.3'
|
4
|
-
gem '
|
5
|
+
gem 'mm-multi-parameter-attributes', :git => 'git://github.com/kernow/mm-multi-parameter-attributes.git'
|
6
|
+
gem 'noodall-ui', '~> 0.1.9'
|
5
7
|
gem 'noodall-devise'
|
6
|
-
gem 'bson_ext', '~> 1.0
|
8
|
+
gem 'bson_ext', '~> 1.2.0'
|
7
9
|
gem 'rmagick', :require => 'RMagick'
|
8
|
-
gem 'dragonfly', '~> 0.
|
10
|
+
gem 'dragonfly', '~> 0.8.1'
|
11
|
+
gem 'factory_girl_rails'
|
12
|
+
gem 'fakerama'
|
9
13
|
|
14
|
+
group :production, :staging do
|
15
|
+
gem 'dalli'
|
16
|
+
gem 'rack-cache', '~> 1.0.0', :require => 'rack/cache'
|
17
|
+
gem 'rack-contrib', :require => 'rack/contrib'
|
18
|
+
end
|
10
19
|
|
11
20
|
group :development, :test do
|
12
21
|
gem 'capybara'
|
13
22
|
gem 'database_cleaner'
|
14
23
|
gem 'cucumber-rails'
|
15
24
|
gem 'cucumber'
|
16
|
-
gem 'rspec-rails', "~> 2.0.0
|
25
|
+
gem 'rspec-rails', "~> 2.0.0"
|
17
26
|
gem 'spork'
|
18
27
|
gem 'launchy' # So you can do Then show me the page
|
19
|
-
gem 'jeweler', '~> 1.4.0'
|
20
28
|
gem 'factory_girl_rails'
|
21
|
-
gem "faker", "~> 0.3.1"
|
22
29
|
gem "haml"
|
23
30
|
end
|
31
|
+
|
@@ -11,6 +11,11 @@
|
|
11
11
|
<%%= csrf_meta_tag %>
|
12
12
|
</head>
|
13
13
|
<body>
|
14
|
+
<%%= form_tag(noodall_search_path, :method => :get, :class => 'search') do %>
|
15
|
+
<%%= text_field_tag :q, params[:q] || 'Enter keyword(s) here' %>
|
16
|
+
<%%= submit_tag 'Search' %>
|
17
|
+
<%% end %>
|
18
|
+
|
14
19
|
<%%= flash_messages %>
|
15
20
|
|
16
21
|
<%%= yield %>
|
@@ -1,3 +1,11 @@
|
|
1
|
+
# Use Noodall's default dragonfly setup for assets
|
1
2
|
require 'noodall/dragonfly'
|
2
|
-
|
3
|
+
|
4
|
+
# Set the slots that are avaiable to put components in
|
5
|
+
Noodall::Node.slots :main, :large, :small
|
6
|
+
|
7
|
+
# Set the mongo collection name for nodes
|
3
8
|
Noodall::Node.set_collection_name 'nodes'
|
9
|
+
|
10
|
+
# Reset global update time on startup
|
11
|
+
Noodall::GlobalUpdateTime::Stamp.update!
|
@@ -0,0 +1,24 @@
|
|
1
|
+
home:
|
2
|
+
title: Welcome
|
3
|
+
type: Home
|
4
|
+
#about:
|
5
|
+
# title: About Us
|
6
|
+
# type: ContentPage
|
7
|
+
# children:
|
8
|
+
# 1st Service:
|
9
|
+
# type: content_page
|
10
|
+
# 2nd Service:
|
11
|
+
# type: content_page
|
12
|
+
# children:
|
13
|
+
# Subber:
|
14
|
+
# type: content_page
|
15
|
+
#contact-us:
|
16
|
+
# title: Contact Us
|
17
|
+
# type: ContentPage
|
18
|
+
#privacy-policy:
|
19
|
+
# title: Privacy Policy
|
20
|
+
# type: ContentPage
|
21
|
+
#terms-conditions:
|
22
|
+
# title: Terms Conditions
|
23
|
+
# type: ContentPage
|
24
|
+
|
@@ -6,5 +6,6 @@
|
|
6
6
|
# cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }])
|
7
7
|
# Mayor.create(:name => 'Daley', :city => cities.first)
|
8
8
|
#
|
9
|
-
|
10
|
-
|
9
|
+
Noodall::Node.create_indexes!
|
10
|
+
Noodall::Site.build!
|
11
|
+
User.create(:name => "Mr Admin", :email => "hello@wearebeef.co.uk", :password => "passw0rd", :password_confirmation => "passw0rd", :groups => ['admin'])
|
@@ -1,15 +1,38 @@
|
|
1
|
+
# http://www.pivotaltracker.com/story/show/8969343
|
1
2
|
Feature: Component Slots
|
2
3
|
In order that web site editors can add functionality and information to content they will be able to fill slots with components
|
3
4
|
|
5
|
+
Background:
|
6
|
+
Given I am signed in as a website editor
|
7
|
+
|
4
8
|
Scenario Outline: Component Slots
|
5
9
|
Given a <Template Name> exists
|
6
|
-
And I am signed in as a website editor
|
7
10
|
When I am editing the <Template Name>
|
8
|
-
Then I should be able to place components in <Hero
|
9
|
-
And I should be able to place components in <
|
10
|
-
And I should be able to place components in <Small
|
11
|
+
Then I should be able to place components in <Hero> hero slots
|
12
|
+
And I should be able to place components in <Large> large slots
|
13
|
+
And I should be able to place components in <Small> small slots
|
14
|
+
And I should be able to place components in <Call> call slots
|
15
|
+
And I should be able to place components in <Promo> promo slots
|
16
|
+
|
17
|
+
Examples:
|
18
|
+
| Template Name | Hero | Large | Small | Call | Promo |
|
19
|
+
| Home | 1 | 0 | 2 | 4 | 4 |
|
20
|
+
| Landing Page | 1 | 0 | 10 | 0 | 0 |
|
21
|
+
| Content Page | 0 | 3 | 10 | 0 | 0 |
|
22
|
+
| Sign Up Form | 0 | 0 | 0 | 0 | 0 |
|
23
|
+
| Article List | 0 | 0 | 5 | 0 | 0 |
|
24
|
+
| Article | 0 | 3 | 5 | 0 | 0 |
|
25
|
+
|
26
|
+
@javascript
|
27
|
+
Scenario Outline: Available Slots
|
28
|
+
Given I am placing a component in a <Slot Name> slot
|
29
|
+
Then I should be able choose from the components <Avaiable Components>
|
11
30
|
|
12
31
|
Examples:
|
13
|
-
|
|
14
|
-
|
|
32
|
+
| Slot Name | Avaiable Components |
|
33
|
+
| Hero | Carousel |
|
34
|
+
| Large | Call To Action, General Content, Quote, Gallery, Logo Ticker, Twitter, Latest Articles, Asset Download |
|
35
|
+
| Small | Call To Action, Call To Action Image, General Content, Quote, Gallery, Logo Ticker, Twitter, Latest Articles, Asset Download |
|
36
|
+
| Call | Call To Action, Call To Action Image |
|
37
|
+
| Promo | General Content |
|
15
38
|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# http://www.pivotaltracker.com/story/show/8969347
|
1
2
|
Feature: Content Templates
|
2
3
|
In order to change how the content looks and acts on the website a website editor will be able to select from predetermined templates
|
3
4
|
|
@@ -9,14 +10,18 @@ Feature: Content Templates
|
|
9
10
|
Then I should be able select a template from the following:
|
10
11
|
| Template |
|
11
12
|
| Landing Page |
|
13
|
+
| Article List |
|
12
14
|
|
13
15
|
Scenario Outline: Create Child Content
|
14
16
|
Given I create a new child under a <Parent Template Name>
|
15
17
|
Then I should be able select a template from "<Allowed Templates>"
|
16
18
|
|
17
19
|
Examples:
|
18
|
-
| Parent Template Name | Allowed Templates
|
19
|
-
| Home |
|
20
|
-
|
21
|
-
|
20
|
+
| Parent Template Name | Allowed Templates |
|
21
|
+
| Home | none |
|
22
|
+
| Landing Page | Landing Page, Content Page, Sign Up Form, Article List |
|
23
|
+
| Content Page | Landing Page, Content Page, Sign Up Form |
|
24
|
+
| Sign Up Form | Content Page |
|
25
|
+
| Article List | Article |
|
26
|
+
| Article | none |
|
22
27
|
|
@@ -18,7 +18,11 @@ When /^I am editing the (.*)$/ do |model|
|
|
18
18
|
end
|
19
19
|
|
20
20
|
Then /^I should be able to place components in (\d+) (.*) slots$/ do |number, slot_type|
|
21
|
-
|
21
|
+
if number.to_i == 0
|
22
|
+
page.should_not have_css("#slot-list .#{slot_type}-slot")
|
23
|
+
else
|
24
|
+
page.should have_css("#slot-list .#{slot_type}-slot", :count => number.to_i)
|
25
|
+
end
|
22
26
|
end
|
23
27
|
|
24
28
|
When /^I create a new root$/ do
|
@@ -30,8 +34,7 @@ When /^I create a new child under a (.*)$/ do |template_title|
|
|
30
34
|
#create the ancester
|
31
35
|
parent = Factory(template.to_sym)
|
32
36
|
|
33
|
-
visit
|
34
|
-
click_link 'New'
|
37
|
+
visit new_noodall_admin_node_node_path(parent)
|
35
38
|
end
|
36
39
|
|
37
40
|
|
@@ -42,8 +45,12 @@ Then /^I should be able select a template from the following:$/ do |table|
|
|
42
45
|
end
|
43
46
|
|
44
47
|
Then /^I should be able select a template from "([^\"]*)"$/ do |templates|
|
45
|
-
templates
|
46
|
-
|
48
|
+
if templates == 'none'
|
49
|
+
page.should_not have_css('.template input')
|
50
|
+
else
|
51
|
+
templates.split(',').map(&:strip).each do |template|
|
52
|
+
choose(template)
|
53
|
+
end
|
47
54
|
end
|
48
55
|
end
|
49
56
|
|
@@ -82,3 +89,13 @@ Given /^each child has (\d+) children$/ do |count|
|
|
82
89
|
end
|
83
90
|
end
|
84
91
|
end
|
92
|
+
|
93
|
+
Given /^the (.*) titled "([^"]*)" has the following children:$/ do |template, title, table|
|
94
|
+
@_content = dehumanize(template).find_by_title(title)
|
95
|
+
table.map_headers! {|header| header.parameterize('_').to_sym }
|
96
|
+
table.hashes.each do |attributes|
|
97
|
+
factory_type = attributes.delete(:type).parameterize('_')
|
98
|
+
Factory(factory_type, attributes.merge(:parent => @_content, :publish => true))
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
@@ -19,6 +19,27 @@ When /^(?:|I )fill in the following within the component:$/ do |fields|
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
Given /^I am placing a component in a (.*) slot$/ do |slot|
|
23
|
+
begin
|
24
|
+
Home.send("#{slot.downcase}_slots", 1)
|
25
|
+
rescue Exception => e
|
26
|
+
# Hides validation errors if the slot already exists
|
27
|
+
end
|
28
|
+
|
29
|
+
node = Home.create!(:title => "Test Node")
|
30
|
+
|
31
|
+
visit noodall_admin_node_path(node)
|
32
|
+
within('ol#slot-list') do
|
33
|
+
click_link "#{slot} Slot"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
Then /^I should be able choose from the components (.*)$/ do |components|
|
38
|
+
components.split(',').map(&:strip).each do |component|
|
39
|
+
Then %{I select the "#{component}" component}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
22
43
|
Then /^I add some images from the asset library$/ do
|
23
44
|
5.times do |i|
|
24
45
|
Factory(:asset, :title => "Image #{i}")
|
@@ -30,18 +51,51 @@ Then /^I add some images from the asset library$/ do
|
|
30
51
|
end
|
31
52
|
end
|
32
53
|
page.find(:css, 'li.action a').click
|
54
|
+
sleep 2
|
55
|
+
end
|
56
|
+
|
57
|
+
Then /^I add some assets to from the asset library$/ do
|
58
|
+
2.times do |i|
|
59
|
+
Factory(:txt_asset, :title => "Text Asset #{i}")
|
60
|
+
end
|
61
|
+
3.times do |i|
|
62
|
+
Factory(:zip_asset, :title => "Zip Asset #{i}")
|
63
|
+
end
|
64
|
+
page.find(:css, 'span.add-multi-asset').click
|
65
|
+
sleep 1
|
66
|
+
within "#asset-browser" do
|
67
|
+
within "#browser-list li[title='Text Asset 0']" do
|
68
|
+
click_link "Add"
|
69
|
+
end
|
70
|
+
within "#browser-list li[title='Zip Asset 1']" do
|
71
|
+
click_link "Add"
|
72
|
+
end
|
73
|
+
within "#browser-list li[title='Zip Asset 2']" do
|
74
|
+
click_link "Add"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
page.find(:css, 'li.action a').click
|
78
|
+
sleep 2
|
79
|
+
end
|
80
|
+
|
81
|
+
Then /^should see a list of the files I selected$/ do
|
82
|
+
page.should have_css(".downloads li a", :count => 3)
|
83
|
+
page.should have_css(".downloads li a[href$='.txt']", :count => 1)
|
84
|
+
page.should have_css(".downloads li a[href$='.zip']", :count => 2)
|
33
85
|
end
|
34
86
|
|
87
|
+
|
35
88
|
When /^(?:|I )press "([^"]*)" within the component$/ do |button|
|
36
89
|
within "#fancybox-inner" do
|
37
90
|
click_button(button)
|
38
91
|
end
|
39
|
-
sleep
|
92
|
+
sleep 2
|
40
93
|
end
|
41
94
|
|
42
95
|
When /^(?:|I )select an image from the asset library$/ do
|
43
96
|
asset = Factory(:asset, :title => "My Image")
|
44
97
|
page.find(:css, 'span.select-file').click
|
98
|
+
sleep 1
|
45
99
|
click_link "Add"
|
46
100
|
sleep 5
|
47
101
|
end
|
data/lib/noodall/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: noodall
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 21
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 5
|
10
|
+
version: 0.0.5
|
11
11
|
platform: ruby
|
12
12
|
authors: []
|
13
13
|
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-02-16 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -125,6 +125,7 @@ files:
|
|
125
125
|
- lib/noodall/templates/config/locales/devise.en.yml
|
126
126
|
- lib/noodall/templates/config/locales/en.yml
|
127
127
|
- lib/noodall/templates/config/routes.rb
|
128
|
+
- lib/noodall/templates/config/sitemap.yml
|
128
129
|
- lib/noodall/templates/db/seeds.rb
|
129
130
|
- lib/noodall/templates/doc/README_FOR_APP
|
130
131
|
- lib/noodall/templates/features/component_slots.feature
|
@@ -137,6 +138,7 @@ files:
|
|
137
138
|
- lib/noodall/templates/features/support/home_page.rb
|
138
139
|
- lib/noodall/templates/features/support/paths.rb
|
139
140
|
- lib/noodall/templates/gitignore
|
141
|
+
- lib/noodall/templates/lib/tasks/populate.rake
|
140
142
|
- lib/noodall/templates/public/404.html
|
141
143
|
- lib/noodall/templates/public/422.html
|
142
144
|
- lib/noodall/templates/public/500.html
|
@@ -190,7 +192,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
190
192
|
requirements: []
|
191
193
|
|
192
194
|
rubyforge_project:
|
193
|
-
rubygems_version: 1.
|
195
|
+
rubygems_version: 1.4.1
|
194
196
|
signing_key:
|
195
197
|
specification_version: 3
|
196
198
|
summary: Noodall meta-gem that depends on the other components
|