noumenon 0.2.2 → 0.2.3
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/CHANGELOG.md +15 -0
- data/features/applications/mounting_an_application.feature +42 -0
- data/features/asset_serving/from_a_repository.feature +1 -1
- data/features/generator/application_generator.feature +13 -0
- data/features/support/env.rb +1 -0
- data/features/template_rendering/static.feature +10 -0
- data/features/template_tags/template_attribute.feature +3 -0
- data/features/template_tags/textilize.feature +0 -1
- data/features/template_tags/theme_attribute.feature +28 -0
- data/generators/application/Rakefile +16 -0
- data/generators/application/application.gemspec +28 -0
- data/generators/application/application.rb +15 -0
- data/generators/application/features/example.feature +9 -0
- data/generators/application/features/support/content/assets/.gitkeep +0 -0
- data/generators/application/features/support/content/pages/index.yml +3 -0
- data/generators/application/features/support/env.rb +19 -0
- data/generators/application/features/support/theme/assets/style.css +1 -0
- data/generators/application/features/support/theme/layouts/default.nou.html +23 -0
- data/generators/application/features/support/theme/templates/default.nou.html +12 -0
- data/generators/application/features/support/theme/theme.yml +5 -0
- data/generators/application/load.rb +7 -0
- data/generators/application/version.rb +5 -0
- data/lib/noumenon.rb +17 -1
- data/lib/noumenon/cli.rb +52 -6
- data/lib/noumenon/core.rb +19 -29
- data/lib/noumenon/cucumber.rb +1 -0
- data/lib/noumenon/cucumber/application_steps.rb +9 -0
- data/{features/step_definitions → lib/noumenon/cucumber}/asset_steps.rb +0 -5
- data/{features/step_definitions → lib/noumenon/cucumber}/content_steps.rb +5 -0
- data/lib/noumenon/cucumber/generator_steps.rb +64 -0
- data/{features/step_definitions → lib/noumenon/cucumber}/liquid_steps.rb +0 -0
- data/{features/step_definitions → lib/noumenon/cucumber}/navigation_steps.rb +0 -0
- data/{features/step_definitions → lib/noumenon/cucumber}/request_steps.rb +4 -0
- data/{features/step_definitions → lib/noumenon/cucumber}/theme_steps.rb +6 -0
- data/lib/noumenon/spec/example_app.rb +8 -15
- data/lib/noumenon/template.rb +5 -5
- data/lib/noumenon/theme.rb +15 -1
- data/lib/noumenon/version.rb +1 -1
- data/noumenon.gemspec +1 -1
- data/spec/noumenon/template_spec.rb +19 -2
- data/spec/noumenon/theme_spec.rb +15 -0
- data/spec/noumenon_spec.rb +37 -0
- data/spec/spec_helper.rb +12 -2
- metadata +33 -19
- data/features/mounted_applications.feature +0 -30
- data/features/step_definitions/generator_steps.rb +0 -24
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
# 0.2.3
|
2
|
+
|
3
|
+
## New Features
|
4
|
+
|
5
|
+
* Applications are now mounted by using the `Noumenon.mount` method, so that users won't be able to
|
6
|
+
break mounted apps by deleting or changing their content items.
|
7
|
+
* The application API is slightly more stable now.
|
8
|
+
* Templates allow global variables to be registered using `Noumenon::Template.register_global "foo", "bar"`.
|
9
|
+
* All templates now have a `theme` object available to them which gives access to metadata.
|
10
|
+
|
11
|
+
## Bug Fixes
|
12
|
+
|
13
|
+
* Assets from the asset repository will now be served correctly. I'm not sure how that ever worked
|
14
|
+
previously.
|
15
|
+
|
1
16
|
# 0.2.2
|
2
17
|
|
3
18
|
## New Features
|
@@ -0,0 +1,42 @@
|
|
1
|
+
Feature: Mounting an Application
|
2
|
+
As a site developer
|
3
|
+
I want to mount an application on a specific URL
|
4
|
+
So that my users can have extra stuff
|
5
|
+
|
6
|
+
Scenario: ExampleApp mounted at /example
|
7
|
+
Given I have mounted "Noumenon::Spec::ExampleApp" at "/example"
|
8
|
+
When I view "/example"
|
9
|
+
Then the page should load
|
10
|
+
And the headline should be "This is a mounted application"
|
11
|
+
|
12
|
+
Scenario: Providing options
|
13
|
+
Given I have mounted "Noumenon::Spec::ExampleApp" at "/example" with these options:
|
14
|
+
| message | Hello, world! |
|
15
|
+
When I view "/example"
|
16
|
+
Then the page should load
|
17
|
+
And the headline should be "Hello, world!"
|
18
|
+
|
19
|
+
Scenario: Handling URLs below the mount point
|
20
|
+
Given I have mounted "Noumenon::Spec::ExampleApp" at "/example"
|
21
|
+
When I view "/example/sub"
|
22
|
+
Then the page should load
|
23
|
+
And the headline should be "This is a sub-page"
|
24
|
+
|
25
|
+
Scenario: Rendering a content item below a mounted application
|
26
|
+
Given I have mounted "Noumenon::Spec::ExampleApp" at "/example"
|
27
|
+
And this content item exists at "/example/templated"
|
28
|
+
| template | default |
|
29
|
+
| title | Template |
|
30
|
+
And this template exists at "default.nou.html"
|
31
|
+
"""
|
32
|
+
<h1>{{ title }}</h1>
|
33
|
+
"""
|
34
|
+
When I view "/example/templated"
|
35
|
+
Then the page should load
|
36
|
+
And the headline should be "Template"
|
37
|
+
|
38
|
+
Scenario: Mounting an application at the root
|
39
|
+
Given I have mounted "Noumenon::Spec::ExampleApp" at "/"
|
40
|
+
When I view "/"
|
41
|
+
Then the page should load
|
42
|
+
And the headline should be "This is a mounted application"
|
@@ -2,7 +2,7 @@ Feature: Serving assets from the asset repository
|
|
2
2
|
As a user
|
3
3
|
I want to be able to upload assets to my site
|
4
4
|
So that I can attach my own images to pages
|
5
|
-
|
5
|
+
|
6
6
|
Scenario: The asset has been added
|
7
7
|
Given I have uploaded this asset as "example.txt" to the asset repository
|
8
8
|
"""
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Feature: Generating an application
|
2
|
+
As an application developer
|
3
|
+
I want to create a skeleton application
|
4
|
+
So that I can provide custom functionality for my client
|
5
|
+
|
6
|
+
@wip
|
7
|
+
Scenario: Running the generator
|
8
|
+
When I run `bundle exec ../../bin/noumenon application contact_form_plus`
|
9
|
+
Then a directory named "contact_form_plus" should exist
|
10
|
+
And the directory "contact_form_plus" should contain a skeleton application
|
11
|
+
And the application in "contact_form_plus" should be named "ContactFormPlus"
|
12
|
+
And the gem in "contact_form_plus" should be named "noumenon-contact_form_plus"
|
13
|
+
And the application in "contact_form_plus" should be configured for Cucumber
|
data/features/support/env.rb
CHANGED
@@ -13,6 +13,7 @@ Feature: Rendering a static template
|
|
13
13
|
| template | static |
|
14
14
|
When I view "/static"
|
15
15
|
Then the page should load
|
16
|
+
And the "Content-Type" header should be "text/html;charset=utf-8"
|
16
17
|
And the headline should be "Static Template"
|
17
18
|
And the body text should be "This is a static template which does not have any fields."
|
18
19
|
|
@@ -22,6 +23,7 @@ Feature: Rendering a static template
|
|
22
23
|
| template | static |
|
23
24
|
When I view "/static"
|
24
25
|
Then the page should return a 500 error
|
26
|
+
And the "Content-Type" header should be "text/html;charset=utf-8"
|
25
27
|
And the headline should be "Missing Template"
|
26
28
|
And the body text should be "The template 'static' does not exist within the current theme."
|
27
29
|
|
@@ -34,10 +36,18 @@ Feature: Rendering a static template
|
|
34
36
|
| key | value |
|
35
37
|
When I view "/default"
|
36
38
|
Then the page should load
|
39
|
+
And the "Content-Type" header should be "text/html;charset=utf-8"
|
37
40
|
And the headline should be "Default Template"
|
38
41
|
|
39
42
|
Scenario: Content item does not exist
|
40
43
|
Given no content item exists at "/static"
|
41
44
|
When I view "/static"
|
42
45
|
Then the page should return a 404 error
|
46
|
+
And the "Content-Type" header should be "text/html;charset=utf-8"
|
47
|
+
And the headline should be "Page Not Found"
|
48
|
+
|
49
|
+
Scenario: No content repository was configured
|
50
|
+
Given no content repository has been configured
|
51
|
+
When I view "/static"
|
52
|
+
Then the page should return a 404 error
|
43
53
|
And the headline should be "Page Not Found"
|
@@ -0,0 +1,28 @@
|
|
1
|
+
Feature: The theme object
|
2
|
+
As a designer
|
3
|
+
I want to include attributes from my theme in template
|
4
|
+
So that it still contains copyright details when distributed
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given I am using this theme
|
8
|
+
| name | Theme Test |
|
9
|
+
| copyright | Jon Wood, 2011 |
|
10
|
+
| author | Jon Wood |
|
11
|
+
And this content item exists at "/theme_attribute"
|
12
|
+
| template | theme_example |
|
13
|
+
|
14
|
+
Scenario: A defined theme attribute
|
15
|
+
Given this template exists at "theme_example.nou.html"
|
16
|
+
"""
|
17
|
+
<h1>{{ theme.name }}</h1>
|
18
|
+
"""
|
19
|
+
When I view "/theme_attribute"
|
20
|
+
Then the headline should be "Theme Test"
|
21
|
+
|
22
|
+
Scenario: An undefined theme attribute
|
23
|
+
Given this template exists at "theme_example.nou.html"
|
24
|
+
"""
|
25
|
+
<h1>{{ theme.bob }}</h1>
|
26
|
+
"""
|
27
|
+
When I view "/theme_attribute"
|
28
|
+
Then the headline should be ""
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'cucumber/rake/task'
|
2
|
+
require 'bundler/gem_helper'
|
3
|
+
|
4
|
+
task :default => :cucumber
|
5
|
+
|
6
|
+
Cucumber::Rake::Task.new do |t|
|
7
|
+
t.cucumber_opts = %w(--format progress)
|
8
|
+
end
|
9
|
+
|
10
|
+
Cucumber::Rake::Task.new("cucumber:wip") do |t|
|
11
|
+
t.cucumber_opts = %w(--tags @wip:4 --wip)
|
12
|
+
end
|
13
|
+
|
14
|
+
namespace :gem do
|
15
|
+
Bundler::GemHelper.install_tasks
|
16
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "noumenon/<%= @name %>/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "noumenon-<%= @name %>"
|
7
|
+
s.version = Noumenon::<%= @name.split("_").collect(&:capitalize).join("") %>::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = [ "Jon Wood" ]
|
10
|
+
s.email = [ "jon@blankpad.net" ]
|
11
|
+
s.homepage = "https://github.com/Noumenon/<%= @name %>"
|
12
|
+
s.summary = %q{A <%= @name.gsub("_", " ") %> application for Noumenon.}
|
13
|
+
s.description = <<EOF
|
14
|
+
This is a description of your application. You should update it.
|
15
|
+
EOF
|
16
|
+
|
17
|
+
s.rubyforge_project = "noumenon-<%= @name %>"
|
18
|
+
|
19
|
+
s.files = `git ls-files`.split("\n")
|
20
|
+
s.test_files = `git ls-files -- {spec,features}/*`.split("\n")
|
21
|
+
s.require_paths = ["lib"]
|
22
|
+
|
23
|
+
s.add_dependency "noumenon"
|
24
|
+
|
25
|
+
s.add_development_dependency "cucumber", "~> 1.0.0"
|
26
|
+
s.add_development_dependency "capybara", "~> 1.0.0.rc1"
|
27
|
+
s.add_development_dependency "rspec", "~> 2.5"
|
28
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'noumenon'
|
2
|
+
|
3
|
+
module Noumenon
|
4
|
+
module <%= @name.split("_").collect(&:capitalize).join("") %>
|
5
|
+
class Application < Noumenon::Core
|
6
|
+
def default_options
|
7
|
+
{}
|
8
|
+
end
|
9
|
+
|
10
|
+
get "/" do
|
11
|
+
"<h1>Welcome to <%= @name.gsub("_", " ").capitalize %></h1>"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Feature: Loading the root
|
2
|
+
As a developer
|
3
|
+
I want to know that my features work
|
4
|
+
So that I can carry on work
|
5
|
+
|
6
|
+
Scenario: Loading the home page
|
7
|
+
When I view "/"
|
8
|
+
Then the page should load
|
9
|
+
And the headline should be "Welcome to <%= @name.gsub("_", " ").capitalize %>"
|
File without changes
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'noumenon'
|
2
|
+
require File.expand_path('../../../lib/noumenon/<%= @name %>', __FILE__)
|
3
|
+
|
4
|
+
require 'rspec'
|
5
|
+
require 'capybara/cucumber'
|
6
|
+
require 'noumenon/cucumber'
|
7
|
+
|
8
|
+
World do
|
9
|
+
include RSpec::Expectations
|
10
|
+
include RSpec::Matchers
|
11
|
+
|
12
|
+
Noumenon.mount '/', Noumenon::<%= @name.split("_").collect(&:capitalize).join("") %>::Application
|
13
|
+
|
14
|
+
Noumenon.theme = Noumenon::Theme.load(File.expand_path("../theme", __FILE__))
|
15
|
+
Noumenon.content_repository = Noumenon::ContentRepository::FileSystem.new(path: File.expand_path("../content/pages"))
|
16
|
+
Noumenon.asset_repository = Noumenon::AssetRepository::FileSystem.new(path: File.expand_path("../content/assets"))
|
17
|
+
|
18
|
+
Capybara.app = Noumenon.server
|
19
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
/* Your themes styles should go here. */
|
@@ -0,0 +1,23 @@
|
|
1
|
+
title:
|
2
|
+
type: string
|
3
|
+
description: The title to put in the browser's title bar.
|
4
|
+
required: false
|
5
|
+
|
6
|
+
content:
|
7
|
+
type: string
|
8
|
+
description: The content from the page template.
|
9
|
+
required: true
|
10
|
+
---
|
11
|
+
<!doctype html>
|
12
|
+
<html>
|
13
|
+
<head>
|
14
|
+
<title>{{ title }}</title>
|
15
|
+
<link rel="stylesheet" href="{% theme_asset style.css %}" />
|
16
|
+
</head>
|
17
|
+
|
18
|
+
<body>
|
19
|
+
<section id="content">
|
20
|
+
{{ content }}
|
21
|
+
</section>
|
22
|
+
</body>
|
23
|
+
</html>
|
data/lib/noumenon.rb
CHANGED
@@ -29,7 +29,10 @@ module Noumenon
|
|
29
29
|
def self.server
|
30
30
|
Rack::Builder.new do
|
31
31
|
use Noumenon::Theme::AssetsMiddleware
|
32
|
-
|
32
|
+
|
33
|
+
Noumenon.mounted_applications.each do |path, app|
|
34
|
+
map(path) { run app[:application].new(app[:options].merge(mount_point: path)) }
|
35
|
+
end
|
33
36
|
end
|
34
37
|
end
|
35
38
|
|
@@ -92,4 +95,17 @@ module Noumenon
|
|
92
95
|
|
93
96
|
@theme
|
94
97
|
end
|
98
|
+
|
99
|
+
def self.mounted_applications
|
100
|
+
@mounted_applications ||= {
|
101
|
+
"/" => { application: Noumenon::Core, options: {} }
|
102
|
+
}
|
103
|
+
end
|
104
|
+
|
105
|
+
def self.mount(path, application, options = {})
|
106
|
+
mounted_applications[path] = {
|
107
|
+
application: application,
|
108
|
+
options: options
|
109
|
+
}
|
110
|
+
end
|
95
111
|
end
|
data/lib/noumenon/cli.rb
CHANGED
@@ -7,21 +7,67 @@ class Noumenon::Cli < Thor
|
|
7
7
|
|
8
8
|
desc "site PATH", "Generate a new site at PATH"
|
9
9
|
def site(path)
|
10
|
-
|
11
|
-
directory "site", path
|
10
|
+
generate :site, path
|
12
11
|
invoke :theme, [ File.join(path, "theme") ]
|
13
12
|
invoke :repository, [ File.join(path, "content") ]
|
14
13
|
end
|
15
14
|
|
16
15
|
desc "theme PATH", "Generate a new theme at PATH"
|
17
16
|
def theme(path)
|
18
|
-
|
19
|
-
directory "theme", path
|
17
|
+
generate :theme, path
|
20
18
|
end
|
21
19
|
|
22
20
|
desc "repository PATH", "Generate a new content repository at PATH"
|
23
21
|
def repository(path)
|
24
|
-
|
25
|
-
|
22
|
+
generate :repository, path
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "application NAME", "Generate a new application at NAME"
|
26
|
+
def application(name)
|
27
|
+
@name = name
|
28
|
+
|
29
|
+
say_status :application, name
|
30
|
+
|
31
|
+
empty_directory name
|
32
|
+
|
33
|
+
inside name do
|
34
|
+
[ "lib", "lib/noumenon", "lib/noumenon", "lib/noumenon/#{name}", "templates", "assets", "features", "features/support", "features/step_definitions" ].each do |dir|
|
35
|
+
empty_directory dir
|
36
|
+
end
|
37
|
+
|
38
|
+
create_file("Gemfile") { "gemspec" }
|
39
|
+
end
|
40
|
+
|
41
|
+
template "application/application.gemspec", "#{name}/noumenon-#{name}.gemspec"
|
42
|
+
template "application/application.rb", "#{name}/lib/noumenon/#{name}/application.rb"
|
43
|
+
template "application/version.rb", "#{name}/lib/noumenon/#{name}/version.rb"
|
44
|
+
template "application/load.rb", "#{name}/lib/noumenon/#{name}.rb"
|
45
|
+
|
46
|
+
invoke :application_features, name
|
47
|
+
end
|
48
|
+
|
49
|
+
desc "application_features NAME", "Generate Cucumber configuration for the application at NAME"
|
50
|
+
def application_features(name)
|
51
|
+
@name = name
|
52
|
+
|
53
|
+
inside name do
|
54
|
+
[ "features", "features/support", "features/step_definitions" ].each do |dir|
|
55
|
+
empty_directory dir
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
template "application/Rakefile", "#{name}/Rakefile"
|
60
|
+
template "application/features/example.feature", "#{name}/features/example.feature"
|
61
|
+
template "application/features/support/env.rb", "#{name}/features/support/env.rb"
|
62
|
+
|
63
|
+
path = "#{name}/features/support"
|
64
|
+
invoke :theme, [ File.join(path, "theme") ]
|
65
|
+
invoke :repository, [ File.join(path, "content") ]
|
66
|
+
end
|
67
|
+
|
68
|
+
protected
|
69
|
+
def generate(thing, path)
|
70
|
+
say_status thing.to_sym, path
|
71
|
+
directory thing.to_s, path
|
26
72
|
end
|
27
73
|
end
|
data/lib/noumenon/core.rb
CHANGED
@@ -8,6 +8,17 @@ require 'rack/mime'
|
|
8
8
|
#
|
9
9
|
# @api public
|
10
10
|
class Noumenon::Core < Sinatra::Base
|
11
|
+
def default_options
|
12
|
+
{}
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(options = {})
|
16
|
+
@options = default_options.merge(options.symbolize_keys)
|
17
|
+
@options[:mount_point] ||= "/"
|
18
|
+
|
19
|
+
super nil
|
20
|
+
end
|
21
|
+
|
11
22
|
# Renders a content item within it's template and layout.
|
12
23
|
#
|
13
24
|
# If the template or layout is not specified then it will be set to "default".
|
@@ -46,44 +57,23 @@ class Noumenon::Core < Sinatra::Base
|
|
46
57
|
# sending it back out again. In the future asset repositories will be able to implement more sensible
|
47
58
|
# methods of sending content, such as redirecting to an S3 URL.
|
48
59
|
#
|
49
|
-
# TODO: Abstract /assets/ out to
|
60
|
+
# TODO: Abstract /assets/ out to an application which can be implemented by repositories which
|
50
61
|
# can't just provide a URL straight up (such as MongoDB).
|
51
62
|
get "/assets/*" do |path|
|
52
|
-
asset = Noumenon.asset_repository.
|
63
|
+
asset = Noumenon.asset_repository.get_asset_path(path)
|
53
64
|
halt 404, "Asset not found" unless asset
|
54
65
|
|
55
66
|
send_file asset
|
56
67
|
end
|
57
68
|
|
58
|
-
|
59
|
-
page = content.get(
|
60
|
-
|
61
|
-
unless page
|
62
|
-
# Search up the tree until we either hit the top, and 404, or find a mounted application.
|
63
|
-
path = path.split("/")
|
64
|
-
while path.size > 0
|
65
|
-
path.pop
|
66
|
-
page = content.get(path.join("/"))
|
67
|
-
break if page && page[:type] == "application"
|
68
|
-
end
|
69
|
-
|
70
|
-
halt 404, "<h1>Page Not Found</h1>" unless page
|
71
|
-
path = path.join("/")
|
72
|
-
end
|
73
|
-
|
74
|
-
case page[:type]
|
75
|
-
when "application"
|
76
|
-
app = page[:application].constantize
|
77
|
-
|
78
|
-
# Rewrite PATH_INFO so that the child application can listen to URLs assuming it's at the root.
|
79
|
-
env["PATH_INFO"].gsub!("#{path}", "")
|
80
|
-
env["PATH_INFO"] = "/" if env["PATH_INFO"] == ""
|
81
|
-
app.new(page).call(env)
|
82
|
-
else
|
69
|
+
def route_missing
|
70
|
+
if content && page = content.get(File.join(@options[:mount_point], @request.path_info))
|
83
71
|
render_page(page)
|
84
|
-
|
72
|
+
else
|
73
|
+
halt 404, "<h1>Page Not Found</h1>"
|
74
|
+
end
|
85
75
|
end
|
86
|
-
|
76
|
+
|
87
77
|
private
|
88
78
|
def wrap_with_layout(content, page)
|
89
79
|
begin
|
@@ -0,0 +1 @@
|
|
1
|
+
Dir.glob(File.expand_path("../cucumber/**/*.rb", __FILE__)).each { |f| require f }
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Given /^I have mounted "([^"]*)" at "([^"]*)" with these options:$/ do |application, path, options|
|
2
|
+
Noumenon.mount(path, application.constantize, options.rows_hash.symbolize_keys)
|
3
|
+
Capybara.app = Noumenon.server
|
4
|
+
end
|
5
|
+
|
6
|
+
Given /^I have mounted "([^"]*)" at "([^"]*)"$/ do |application, path|
|
7
|
+
Noumenon.mount(path, application.constantize)
|
8
|
+
Capybara.app = Noumenon.server
|
9
|
+
end
|
@@ -6,11 +6,6 @@ Given /^the asset "([^"]*)" exists within the theme with this content:$/ do |ass
|
|
6
6
|
File.open(File.join(Noumenon.theme.path, "assets", asset_name), "w") { |f| f.print content }
|
7
7
|
end
|
8
8
|
|
9
|
-
Given /^I have chosen to use a seperate asset repository$/ do
|
10
|
-
FileUtils.mkdir_p File.join(tmp_path, "assets")
|
11
|
-
Noumenon.asset_repository = Noumenon::ContentRepository::FileSystem.new(path: File.join(tmp_path, "assets"))
|
12
|
-
end
|
13
|
-
|
14
9
|
Given /^I have uploaded this asset as "([^"]*)" to the asset repository$/ do |path, string|
|
15
10
|
Noumenon.asset_repository.put(path, string)
|
16
11
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
def generator_file(generator, file)
|
2
|
+
File.read File.expand_path("../../../../generators/#{generator}/#{file}", __FILE__)
|
3
|
+
end
|
4
|
+
|
5
|
+
Then /^the directory "([^"]*)" should contain a Noumenon site$/ do |path|
|
6
|
+
steps %Q{
|
7
|
+
Then a file named "#{path}/Gemfile" should exist
|
8
|
+
Then a file named "#{path}/config.ru" should exist
|
9
|
+
}
|
10
|
+
check_exact_file_content "#{path}/config.ru", generator_file("site", "config.ru")
|
11
|
+
end
|
12
|
+
|
13
|
+
Then /^the directory "([^"]*)" should contain a theme$/ do |path|
|
14
|
+
check_exact_file_content "#{path}/theme.yml", generator_file("theme", "theme.yml")
|
15
|
+
check_exact_file_content "#{path}/layouts/default.nou.html", generator_file("theme", "layouts/default.nou.html")
|
16
|
+
check_exact_file_content "#{path}/templates/default.nou.html", generator_file("theme", "templates/default.nou.html")
|
17
|
+
check_exact_file_content "#{path}/assets/style.css", generator_file("theme", "assets/style.css")
|
18
|
+
end
|
19
|
+
|
20
|
+
Then /^the directory "([^"]*)" should contain a repository$/ do |path|
|
21
|
+
steps %Q{
|
22
|
+
Then a directory named "#{path}/pages" should exist
|
23
|
+
And a directory named "#{path}/assets" should exist
|
24
|
+
}
|
25
|
+
|
26
|
+
check_exact_file_content "#{path}/pages/index.yml", generator_file("repository/pages", "index.yml")
|
27
|
+
end
|
28
|
+
|
29
|
+
Then /^the directory "([^"]*)" should contain a skeleton application$/ do |path|
|
30
|
+
steps %Q{
|
31
|
+
Then a file named "#{path}/Gemfile" should exist
|
32
|
+
And a file named "#{path}/noumenon-#{path}.gemspec" should exist
|
33
|
+
And a file named "#{path}/lib/noumenon/#{path}.rb" should exist
|
34
|
+
And a directory named "#{path}/lib/noumenon/#{path}/" should exist
|
35
|
+
And a file named "#{path}/lib/noumenon/#{path}/version.rb" should exist
|
36
|
+
And a file named "#{path}/lib/noumenon/#{path}/application.rb" should exist
|
37
|
+
And a directory named "#{path}/templates/" should exist
|
38
|
+
And a directory named "#{path}/assets/" should exist
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
Then /^the application in "([^"]*)" should be configured for Cucumber$/ do |path|
|
43
|
+
steps %Q{
|
44
|
+
Then a file named "#{path}/Rakefile" should exist
|
45
|
+
And a directory named "#{path}/features" should exist
|
46
|
+
And a directory named "#{path}/features/support" should exist
|
47
|
+
And a file named "#{path}/features/support/env.rb" should exist
|
48
|
+
And the directory "#{path}/features/support/content" should contain a repository
|
49
|
+
And the directory "#{path}/features/support/theme" should contain a theme
|
50
|
+
And a directory named "#{path}/features/step_definitions" should exist
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
Then /^the application in "([^"]*)" should be named "([^"]*)"$/ do |path, name|
|
55
|
+
in_current_dir do
|
56
|
+
File.read("#{path}/lib/noumenon/#{path}.rb").should =~ /module #{name}/
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
Then /^the gem in "([^"]*)" should be named "([^"]*)"$/ do |path, name|
|
61
|
+
in_current_dir do
|
62
|
+
File.read("#{path}/#{name}.gemspec").should =~ /s\.name\s+= "#{name}"/
|
63
|
+
end
|
64
|
+
end
|
File without changes
|
File without changes
|
@@ -10,6 +10,10 @@ Then /^the page should return a (\d+) error$/ do |status|
|
|
10
10
|
page.status_code.should == status.to_i
|
11
11
|
end
|
12
12
|
|
13
|
+
Then /^the "([^"]*)" header should be "([^"]*)"$/ do |header, value|
|
14
|
+
page.response_headers[header].should == value
|
15
|
+
end
|
16
|
+
|
13
17
|
Then /^the page content should be:$/ do |content|
|
14
18
|
page.source.should == content
|
15
19
|
end
|
@@ -1,3 +1,9 @@
|
|
1
|
+
Given /^I am using this theme$/ do |attributes|
|
2
|
+
create_theme attributes.rows_hash
|
3
|
+
Noumenon.theme = Noumenon::Theme.load(theme_path)
|
4
|
+
Capybara.app = Noumenon.server
|
5
|
+
end
|
6
|
+
|
1
7
|
Given /^this template exists at "([^"]*)"$/ do |path, template|
|
2
8
|
File.open(File.join(Noumenon.theme.path, "templates", path), "w") do |f|
|
3
9
|
f.write(template)
|
@@ -1,22 +1,15 @@
|
|
1
1
|
require 'noumenon'
|
2
2
|
|
3
|
-
class Noumenon::Spec::ExampleApp
|
4
|
-
def
|
5
|
-
|
3
|
+
class Noumenon::Spec::ExampleApp < Noumenon::Core
|
4
|
+
def default_options
|
5
|
+
{ message: "This is a mounted application" }
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
when "/"
|
11
|
-
respond 200, "<h1>#{@options[:message]}</h1>"
|
12
|
-
when "/sub"
|
13
|
-
respond 200, "<h1>This is a sub-page</h1>"
|
14
|
-
else
|
15
|
-
respond 404, "Page Not Found"
|
16
|
-
end
|
8
|
+
get "/" do
|
9
|
+
"<h1>#{@options[:message]}</h1>"
|
17
10
|
end
|
18
|
-
|
19
|
-
|
20
|
-
|
11
|
+
|
12
|
+
get "/sub" do
|
13
|
+
"<h1>This is a sub-page</h1>"
|
21
14
|
end
|
22
15
|
end
|
data/lib/noumenon/template.rb
CHANGED
@@ -86,12 +86,12 @@ class Noumenon::Template
|
|
86
86
|
self.new(path, content, fields)
|
87
87
|
end
|
88
88
|
|
89
|
-
def self.
|
90
|
-
@
|
89
|
+
def self.globals
|
90
|
+
@globals ||= {}
|
91
91
|
end
|
92
92
|
|
93
|
-
def self.
|
94
|
-
|
93
|
+
def self.register_global(name, klass)
|
94
|
+
globals[name] = klass
|
95
95
|
end
|
96
96
|
|
97
97
|
# Creates a new Template instance.
|
@@ -132,7 +132,7 @@ class Noumenon::Template
|
|
132
132
|
|
133
133
|
raise MissingContentError.new("The following fields were missing from your content: #{missing_fields.sort.join(", ")}") unless missing_fields.empty?
|
134
134
|
|
135
|
-
Liquid::Template.parse(content).render(fields_from_page.merge(self.class.
|
135
|
+
Liquid::Template.parse(content).render(fields_from_page.merge(self.class.globals))
|
136
136
|
end
|
137
137
|
end
|
138
138
|
|
data/lib/noumenon/theme.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'noumenon'
|
2
2
|
require 'yaml'
|
3
|
+
require 'liquid/drop'
|
3
4
|
|
4
5
|
# Provides access to a theme and it's contents.
|
5
6
|
#
|
@@ -64,7 +65,7 @@ class Noumenon::Theme
|
|
64
65
|
# @api public
|
65
66
|
attr_accessor :license
|
66
67
|
|
67
|
-
# Create a new
|
68
|
+
# Create a new theme instance.
|
68
69
|
#
|
69
70
|
# @param [ String, #to_s ] path The path the theme was loaded from.
|
70
71
|
# @param [ Hash ] description Any metadata to attach to theme.
|
@@ -103,4 +104,17 @@ class Noumenon::Theme
|
|
103
104
|
def layout(name)
|
104
105
|
Noumenon::Template.from_file File.join(path, "layouts", name)
|
105
106
|
end
|
107
|
+
|
108
|
+
class Drop < ::Liquid::Drop
|
109
|
+
def before_method(method)
|
110
|
+
@theme ||= Noumenon.theme
|
111
|
+
@theme.to_liquid[method.to_sym]
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def to_liquid
|
116
|
+
{ name: name, author: author, email: email, copyright: copyright, license: license }
|
117
|
+
end
|
118
|
+
|
119
|
+
Noumenon::Template.register_global 'theme', Drop.new
|
106
120
|
end
|
data/lib/noumenon/version.rb
CHANGED
data/noumenon.gemspec
CHANGED
@@ -39,7 +39,7 @@ EOF
|
|
39
39
|
|
40
40
|
s.add_development_dependency "aruba", "~> 0.3"
|
41
41
|
s.add_development_dependency "capybara", "~> 1.0.0.beta1"
|
42
|
-
s.add_development_dependency "cucumber", "~> 0
|
42
|
+
s.add_development_dependency "cucumber", "~> 1.0"
|
43
43
|
s.add_development_dependency "rake", "~> 0.9"
|
44
44
|
s.add_development_dependency "rdiscount", "~> 1.6"
|
45
45
|
s.add_development_dependency "rspec", "~> 2.5"
|
@@ -71,7 +71,7 @@ describe Noumenon::Template do
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
end
|
74
|
-
|
74
|
+
|
75
75
|
describe "rendering a template" do
|
76
76
|
let(:template) { Noumenon::Template.from_file template_path("template_with_fields.html") }
|
77
77
|
|
@@ -94,7 +94,6 @@ describe Noumenon::Template do
|
|
94
94
|
context "when all required fields were provided" do
|
95
95
|
it "renders the template, replacing any fields" do
|
96
96
|
content = template.render("title" => "Example Page", "body" => "This is an example, isn't it lovely.", "author" => "Jon Wood")
|
97
|
-
|
98
97
|
content.should =~ %r{<h1>Example Page</h1>}
|
99
98
|
content.should =~ %r{<div id="content">This is an example, isn't it lovely.</div>}
|
100
99
|
content.should =~ %r{<p class="byline">Written by Jon Wood.</p>}
|
@@ -117,4 +116,22 @@ describe Noumenon::Template do
|
|
117
116
|
end
|
118
117
|
end
|
119
118
|
end
|
119
|
+
|
120
|
+
describe "registering global variables" do
|
121
|
+
subject { Noumenon::Template }
|
122
|
+
|
123
|
+
it { should respond_to :globals }
|
124
|
+
it { should respond_to :register_global }
|
125
|
+
|
126
|
+
it "adds the global to the list" do
|
127
|
+
Noumenon::Template.register_global "foo", "bar"
|
128
|
+
Noumenon::Template.globals["foo"].should == "bar"
|
129
|
+
end
|
130
|
+
|
131
|
+
it "includes the variable when rendering a template" do
|
132
|
+
Noumenon::Template.register_global "foo", "bar"
|
133
|
+
|
134
|
+
Noumenon::Template.new("#{__FILE__}: #{__LINE__}", "{{ foo }}").render.should == "bar"
|
135
|
+
end
|
136
|
+
end
|
120
137
|
end
|
data/spec/noumenon/theme_spec.rb
CHANGED
@@ -125,5 +125,20 @@ describe Noumenon::Theme do
|
|
125
125
|
end
|
126
126
|
end
|
127
127
|
end
|
128
|
+
|
129
|
+
describe "making themes available to a Liquid template" do
|
130
|
+
before(:each) { Noumenon.theme = theme }
|
131
|
+
subject { theme.to_liquid }
|
132
|
+
|
133
|
+
it { should be_instance_of Hash }
|
134
|
+
|
135
|
+
%w(name author email copyright license).each do |attribute|
|
136
|
+
specify { subject[attribute.to_sym].should == theme.send(attribute) }
|
137
|
+
end
|
138
|
+
|
139
|
+
it "registers the current theme as a global variable for templates" do
|
140
|
+
Noumenon::Template.globals["theme"].should be_instance_of Noumenon::Theme::Drop
|
141
|
+
end
|
142
|
+
end
|
128
143
|
end
|
129
144
|
end
|
data/spec/noumenon_spec.rb
CHANGED
@@ -66,4 +66,41 @@ describe Noumenon do
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
end
|
69
|
+
|
70
|
+
describe "mounting an application", capybara: true do
|
71
|
+
before do
|
72
|
+
Noumenon.mount "/app", Noumenon::Spec::ExampleApp
|
73
|
+
reload_server!
|
74
|
+
end
|
75
|
+
|
76
|
+
it "adds the application to the list of mounted apps" do
|
77
|
+
Noumenon.mounted_applications["/app"].should == {
|
78
|
+
application: Noumenon::Spec::ExampleApp,
|
79
|
+
options: {}
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
it "responds to requests on the path with the mounted application" do
|
84
|
+
visit '/app'
|
85
|
+
|
86
|
+
page.status_code.should == 200
|
87
|
+
page.should have_css "h1", text: "This is a mounted application"
|
88
|
+
end
|
89
|
+
|
90
|
+
it "passes any options through to the application" do
|
91
|
+
Noumenon.mount "/app", Noumenon::Spec::ExampleApp, message: "Hello, world!"
|
92
|
+
reload_server!
|
93
|
+
|
94
|
+
visit '/app'
|
95
|
+
|
96
|
+
page.status_code.should == 200
|
97
|
+
page.should have_css "h1", text: "Hello, world!"
|
98
|
+
end
|
99
|
+
|
100
|
+
it "allows sub-URLs to be handled by the application also" do
|
101
|
+
visit '/app/sub'
|
102
|
+
|
103
|
+
page.should have_css "h1", text: "This is a sub-page"
|
104
|
+
end
|
105
|
+
end
|
69
106
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,12 +1,22 @@
|
|
1
|
+
ENV["RACK_ENV"] ||= "test"
|
2
|
+
|
1
3
|
# Load anything in spec/support
|
2
4
|
Dir.glob(File.join(File.expand_path("..", __FILE__), "support", "**", "*.rb")).each { |f| require f }
|
3
5
|
|
4
6
|
require 'noumenon'
|
7
|
+
require 'capybara/dsl'
|
5
8
|
|
6
9
|
RSpec.configure do |spec|
|
7
10
|
include Noumenon::Spec::ThemeHelpers
|
11
|
+
|
12
|
+
# Capybara stuff only gets enabled when requested, otherwise Liquid breaks in obscure ways.
|
13
|
+
def reload_server!
|
14
|
+
Capybara.app = Noumenon.server
|
15
|
+
end
|
8
16
|
|
9
|
-
spec.
|
10
|
-
|
17
|
+
spec.include Capybara::DSL, capybara: true
|
18
|
+
|
19
|
+
spec.before(:each, capybara: true) do
|
20
|
+
reload_server!
|
11
21
|
end
|
12
22
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: noumenon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.2.
|
5
|
+
version: 0.2.3
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jon Wood
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-06-
|
13
|
+
date: 2011-06-22 00:00:00 +01:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -98,7 +98,7 @@ dependencies:
|
|
98
98
|
requirements:
|
99
99
|
- - ~>
|
100
100
|
- !ruby/object:Gem::Version
|
101
|
-
version: "0
|
101
|
+
version: "1.0"
|
102
102
|
type: :development
|
103
103
|
version_requirements: *id008
|
104
104
|
- !ruby/object:Gem::Dependency
|
@@ -176,17 +176,11 @@ files:
|
|
176
176
|
- README.md
|
177
177
|
- Rakefile
|
178
178
|
- bin/noumenon
|
179
|
+
- features/applications/mounting_an_application.feature
|
179
180
|
- features/asset_serving/from_a_repository.feature
|
180
181
|
- features/asset_serving/from_themes.feature
|
182
|
+
- features/generator/application_generator.feature
|
181
183
|
- features/generator/site_generator.feature
|
182
|
-
- features/mounted_applications.feature
|
183
|
-
- features/step_definitions/asset_steps.rb
|
184
|
-
- features/step_definitions/content_steps.rb
|
185
|
-
- features/step_definitions/generator_steps.rb
|
186
|
-
- features/step_definitions/liquid_steps.rb
|
187
|
-
- features/step_definitions/navigation_steps.rb
|
188
|
-
- features/step_definitions/request_steps.rb
|
189
|
-
- features/step_definitions/theme_steps.rb
|
190
184
|
- features/support/env.rb
|
191
185
|
- features/support/theme/theme.yml
|
192
186
|
- features/template_extensions.feature
|
@@ -196,7 +190,22 @@ files:
|
|
196
190
|
- features/template_tags/assign_to.feature
|
197
191
|
- features/template_tags/content_from.feature
|
198
192
|
- features/template_tags/nav_menu.feature
|
193
|
+
- features/template_tags/template_attribute.feature
|
199
194
|
- features/template_tags/textilize.feature
|
195
|
+
- features/template_tags/theme_attribute.feature
|
196
|
+
- generators/application/Rakefile
|
197
|
+
- generators/application/application.gemspec
|
198
|
+
- generators/application/application.rb
|
199
|
+
- generators/application/features/example.feature
|
200
|
+
- generators/application/features/support/content/assets/.gitkeep
|
201
|
+
- generators/application/features/support/content/pages/index.yml
|
202
|
+
- generators/application/features/support/env.rb
|
203
|
+
- generators/application/features/support/theme/assets/style.css
|
204
|
+
- generators/application/features/support/theme/layouts/default.nou.html
|
205
|
+
- generators/application/features/support/theme/templates/default.nou.html
|
206
|
+
- generators/application/features/support/theme/theme.yml
|
207
|
+
- generators/application/load.rb
|
208
|
+
- generators/application/version.rb
|
200
209
|
- generators/repository/assets/.gitkeep
|
201
210
|
- generators/repository/pages/index.yml
|
202
211
|
- generators/site/Gemfile
|
@@ -212,6 +221,15 @@ files:
|
|
212
221
|
- lib/noumenon/content_repository.rb
|
213
222
|
- lib/noumenon/content_repository/file_system.rb
|
214
223
|
- lib/noumenon/core.rb
|
224
|
+
- lib/noumenon/cucumber.rb
|
225
|
+
- lib/noumenon/cucumber/application_steps.rb
|
226
|
+
- lib/noumenon/cucumber/asset_steps.rb
|
227
|
+
- lib/noumenon/cucumber/content_steps.rb
|
228
|
+
- lib/noumenon/cucumber/generator_steps.rb
|
229
|
+
- lib/noumenon/cucumber/liquid_steps.rb
|
230
|
+
- lib/noumenon/cucumber/navigation_steps.rb
|
231
|
+
- lib/noumenon/cucumber/request_steps.rb
|
232
|
+
- lib/noumenon/cucumber/theme_steps.rb
|
215
233
|
- lib/noumenon/spec.rb
|
216
234
|
- lib/noumenon/spec/example_app.rb
|
217
235
|
- lib/noumenon/spec/example_tags.rb
|
@@ -264,17 +282,11 @@ signing_key:
|
|
264
282
|
specification_version: 3
|
265
283
|
summary: A flexible content management system.
|
266
284
|
test_files:
|
285
|
+
- features/applications/mounting_an_application.feature
|
267
286
|
- features/asset_serving/from_a_repository.feature
|
268
287
|
- features/asset_serving/from_themes.feature
|
288
|
+
- features/generator/application_generator.feature
|
269
289
|
- features/generator/site_generator.feature
|
270
|
-
- features/mounted_applications.feature
|
271
|
-
- features/step_definitions/asset_steps.rb
|
272
|
-
- features/step_definitions/content_steps.rb
|
273
|
-
- features/step_definitions/generator_steps.rb
|
274
|
-
- features/step_definitions/liquid_steps.rb
|
275
|
-
- features/step_definitions/navigation_steps.rb
|
276
|
-
- features/step_definitions/request_steps.rb
|
277
|
-
- features/step_definitions/theme_steps.rb
|
278
290
|
- features/support/env.rb
|
279
291
|
- features/support/theme/theme.yml
|
280
292
|
- features/template_extensions.feature
|
@@ -284,7 +296,9 @@ test_files:
|
|
284
296
|
- features/template_tags/assign_to.feature
|
285
297
|
- features/template_tags/content_from.feature
|
286
298
|
- features/template_tags/nav_menu.feature
|
299
|
+
- features/template_tags/template_attribute.feature
|
287
300
|
- features/template_tags/textilize.feature
|
301
|
+
- features/template_tags/theme_attribute.feature
|
288
302
|
- spec/noumenon/asset_repository/file_system_spec.rb
|
289
303
|
- spec/noumenon/asset_repository_spec.rb
|
290
304
|
- spec/noumenon/content_repository/file_system_spec.rb
|
@@ -1,30 +0,0 @@
|
|
1
|
-
Feature: Mounted Applications
|
2
|
-
As a developer
|
3
|
-
I want to mount an application at /app
|
4
|
-
So that I can provide extra functionality
|
5
|
-
In order to deliver the site my client wants
|
6
|
-
|
7
|
-
Scenario: An application has been mounted
|
8
|
-
Given this content item exists at "/app"
|
9
|
-
| type | application |
|
10
|
-
| application | Noumenon::Spec::ExampleApp |
|
11
|
-
When I view "/app"
|
12
|
-
Then the page should load
|
13
|
-
And the headline should be "This is a mounted application"
|
14
|
-
|
15
|
-
Scenario: Loading paths below the mounted application
|
16
|
-
Given this content item exists at "/app"
|
17
|
-
| type | application |
|
18
|
-
| application | Noumenon::Spec::ExampleApp |
|
19
|
-
When I view "/app/sub"
|
20
|
-
Then the page should load
|
21
|
-
And the headline should be "This is a sub-page"
|
22
|
-
|
23
|
-
Scenario: Passing configuration to an application
|
24
|
-
Given this content item exists at "/app"
|
25
|
-
| type | application |
|
26
|
-
| application | Noumenon::Spec::ExampleApp |
|
27
|
-
| message | Hello, world! |
|
28
|
-
When I view "/app"
|
29
|
-
Then the page should load
|
30
|
-
And the headline should be "Hello, world!"
|
@@ -1,24 +0,0 @@
|
|
1
|
-
def generator_file(generator, file)
|
2
|
-
File.read File.expand_path("../../../generators/#{generator}/#{file}", __FILE__)
|
3
|
-
end
|
4
|
-
|
5
|
-
Then /^the directory "([^"]*)" should contain a Noumenon site$/ do |path|
|
6
|
-
Then %Q{a file named "#{path}/Gemfile" should exist}
|
7
|
-
And %Q{a file named "#{path}/config.ru" should exist}
|
8
|
-
|
9
|
-
check_exact_file_content "#{path}/Gemfile", generator_file("site", "Gemfile")
|
10
|
-
check_exact_file_content "#{path}/config.ru", generator_file("site", "config.ru")
|
11
|
-
end
|
12
|
-
|
13
|
-
Then /^the directory "([^"]*)" should contain a theme$/ do |path|
|
14
|
-
check_exact_file_content "#{path}/theme.yml", generator_file("theme", "theme.yml")
|
15
|
-
check_exact_file_content "#{path}/layouts/default.nou.html", generator_file("theme", "layouts/default.nou.html")
|
16
|
-
check_exact_file_content "#{path}/templates/default.nou.html", generator_file("theme", "templates/default.nou.html")
|
17
|
-
check_exact_file_content "#{path}/assets/style.css", generator_file("theme", "assets/style.css")
|
18
|
-
end
|
19
|
-
|
20
|
-
Then /^the directory "([^"]*)" should contain a repository$/ do |path|
|
21
|
-
Then %Q{a directory named "#{path}/pages" should exist}
|
22
|
-
check_exact_file_content "#{path}/pages/index.yml", generator_file("repository/pages", "index.yml")
|
23
|
-
And %Q{a directory named "#{path}/assets" should exist}
|
24
|
-
end
|