noumenon 0.0.2 → 0.0.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.
@@ -0,0 +1,20 @@
1
+ Copyright 2011 Blank Pad Development
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -13,73 +13,178 @@ editors thats more likely to be a web interface.
13
13
 
14
14
  ## How it Works
15
15
 
16
- The URL structure and content of a Noumenon site is defined by a Git repository, similar to the structure below:
16
+ A Noumenon site has two fundamental components, a content repository, and a theme.
17
+
18
+ ### The Content Repository
19
+
20
+ The content repository is used to store items of content for the site. By default they're represented by YAML files
21
+ in a directory tree which should match the URL structure you want to use:
17
22
 
18
23
  /
19
- - /config.rb
20
- - /index.html
24
+ - index.yml
21
25
  - /about
22
- - /people.html
23
- - /company.html
26
+ - /index.yml
27
+ - /people.yml
28
+ - /company.yml
24
29
  - /contact
25
- - /config.rb
26
- - /blog
27
- - /config.rb
28
- - /posts/2011-04-18-an-example-post.md
29
- - /posts/2011-04-10-another-example.md
30
+ - /config.yml
30
31
 
31
- This git repository is then provided to Noumenon as it's data source. On startup it loads any file called "config.rb"
32
- and uses it to determine how that directory should behave:
32
+ In the example above visiting http://example.org/ will render the content in /index.yml, while visiting
33
+ http://example.org/about/people will render /about/people.yml
33
34
 
34
- # /config.rb
35
- domain "example.org"
36
- application "git://github.com/noumenon/apps-static"
37
- theme "git://github.com/noumenon/themes-example"
35
+ Each item of content has this format:
38
36
 
39
- That example configures Noumenon to use the "Noumenon::Static" application to serve any templates below that point as
40
- a static page.
37
+ template "page"
38
+ title: "People"
39
+ subtitle: "Our people are what makes us special"
40
+ body:
41
+ Here at Enormicorp we believe our people make us a great company.
41
42
 
42
- # /contact/config.rb
43
- application "git://github.com/noumenon/apps-contact"
44
- contact.email_address "info@example.org"
43
+ Or at least the ones who's title starts with C and ends in O. Everyone else is just a cog really.
45
44
 
46
- While the one in /contact specifies that "Noumenon::Contact" should be used to provide the URL tree below /contact, in this
47
- case a contact form which emails any responses to the specified address.
45
+ When requested a template with a matching name will be loaded from the current theme, and rendered with the fields
46
+ defined in the content item.
48
47
 
49
- Finally /blogs/config.rb might look something like this:
50
48
 
51
- application "git://github.com/noumenon/apps-blog"
52
- blog.comments true
49
+ ### Themes
53
50
 
54
- ## Hosting a Noumenon Site
51
+ Themes define how your content should be presented, and can provide templates and assets. A theme will usually come
52
+ in the form of a Rubygem, either published to rubygems.org, or from some other source which Bundler can access.
55
53
 
56
- *This won't work yet: I havn't implemented automatic check out of a content repository.*
54
+ For an example, take a look at http://github.com/Noumenon/example_theme
57
55
 
58
- To host a site you will need to have Ruby and an application server such as Passenger, Unicorn or Thin. Due it's interactions
59
- with git as a data store Heroku is not a supported platform for hosting, although I'm sure someone will find a way around that.
56
+ #### Assets
60
57
 
61
- Install Noumenon: `gem install noumenon`
58
+ Assets such as images, stylesheets, and javascripts are placed in the "assets" directory, and are accessible from your
59
+ application at http://example.org/themes/theme_name/asset.png. The URL structure directly matches the directory structure
60
+ of your assets directory.
62
61
 
63
- Create a directory, and put the following config.ru in it:
62
+ #### Templates
64
63
 
65
- require 'noumenon'
66
- Noumenon::Core.set :content_repository, "git@github.com:Noumenon/example.git"
67
-
68
- run Noumenon.boot
64
+ The core of a theme is the templates it provides. Each template can list the fields that it supports, and mark some or all
65
+ of them as being required. Templates also include a Liquid template which is used to transform the provided fields into a
66
+ web page.
67
+
68
+ Templates should be placed in a "templates" sub-directory within your theme, and end with the extension .html
69
+
70
+ title:
71
+ required: true
72
+ label: "Page title"
73
+
74
+ subtitle:
75
+ required: false
76
+
77
+ body:
78
+ required: true
79
+ type: "text"
80
+ ---
81
+ <h1>{{ title }}</h1>
82
+ {% if subtitile %}
83
+ <h2>{{ subtitle }}</h2>
84
+ {% endif %}
85
+ {{ body }}
86
+
87
+ Currently the "label" and "type" attributes on a field are only present for documentation purposes, but they will be used in
88
+ the future to automatically build the content management interface used by content editors to publish pages, so it's probably
89
+ worth taking the time to include them.
90
+
91
+ If not specified the type defaults to "string", the label to a capitalised version of the name, and required to false.
92
+
93
+ Any fields provided to a template which aren't specified will still be available in the Liquid template part.
94
+
95
+ ### Custom URL handlers
96
+
97
+ If part of your site requires something other then rendering a piece of content within a static template then you can use a
98
+ custom URL handler to provide that part of the site. In this example we'll provide a basic contact form.
99
+
100
+ #### Specifying the handler
101
+
102
+ Within your content repository create a directory with the same name as the URL you want to mount the application at, and add
103
+ a file called "config.yml" with the following content:
104
+
105
+ application: "Noumenon::Applications::ContactForm"
106
+
107
+ This specifies that instead of using the core Noumenon application you want to use the ContactForm application, an example implementation
108
+ is shown below - usually the application would be provided by a Rubygem or other source, and referenced in your Gemfile.
109
+
110
+ #### The ContactForm Handler
69
111
 
70
- And then set up your application server to provide that application. On startup it will first attempt to check out the content
71
- repository, then it will parse any configuration files, and install any required dependencies. Finally, it will start hosting
72
- the site.
112
+ class Noumenon::Applications::ContactForm < Noumenon::Core
113
+ get '/' do
114
+ render_template "templates/contact/form.html"
115
+ end
73
116
 
74
- To update the content repository restart your application server, which will cause it to update the repository, and any dependencies.
117
+ post '/send' do
118
+ require 'pony'
119
+ Pony.send :to => "contact@example.org", :body => params[:body], :from => params[:from]
75
120
 
76
- ### Hosting on Heroku
121
+ render_template "templates/contact/thanks.html", "body" => params[:body], "from" => params[:from]
122
+ end
123
+ end
77
124
 
78
- The someone who worked out the way around it was me it seems. This will only work if you're deploying an entirely static site,
79
- if you need the admin section to work then you'll have to host somewhere else, but otherwise, use a config.ru like this, and make
80
- sure you have Noumenon in your Gemfile:
125
+ #### Layouts
81
126
 
127
+ Layouts are used to wrap a piece of content with the overall look and feel of your website, and are provided with a single field
128
+ "body" containing the rendered content. Currently only one layout per theme is supported, and it should be called "layout.html".
129
+
130
+ body:
131
+ required: true
132
+ type: "text"
133
+ ---
134
+ <html>
135
+ <head>
136
+ <link rel="stylesheet" href="/themes/example_theme/styles.css">
137
+ <title>Enormicorp</title>
138
+ </head>
139
+
140
+ <body>
141
+ <h1>Enormicorp</h1>
142
+ <nav>
143
+ <ul>
144
+ <li><a href="/">Home</a></li>
145
+ <li><a href="/about">About</a></li>
146
+ <li><a href="/contact">Contact</a></li>
147
+ </ul>
148
+ </nav>
149
+
150
+ <section id="content">
151
+ {{ body }}
152
+ </section>
153
+
154
+ <footer>Copyright &copy; 2011, Enormicorp Plc.</footer>
155
+ </body>
156
+ </html>
157
+
158
+ ## Publishing Your Site
159
+
160
+ Currently the quickest way to get a Noumenon site on the internet is using Heroku. See http://github.com/Noumenon/example_site for
161
+ an example of how to get that working.
162
+
163
+ Note that once the admin backend is in place, Heroku may not be supported, and certainly won't be supported when using a filesystem
164
+ based backend for your content repository.
165
+
166
+ ### Example config.ru
167
+
168
+ If you want to host on your own hardware use a config.ru like this:
169
+
170
+ require 'bundler/setup'
82
171
  require 'noumenon'
83
- Noumenon::Core.set :content_repository_path, File.expand_path("..", __FILE__)
84
-
172
+
173
+ Noumenon.config do |c|
174
+ c.content_repository_path = "/path/to/content_repository"
175
+ c.theme = "noumenon-example_theme" # Requires you to have a reference to noumenon-example_theme in your Gemfile.
176
+ end
177
+
85
178
  run Noumenon.boot
179
+
180
+ ## Getting Help and Contributing
181
+
182
+ If you're using Noumenon I'd love to know about it, especially if you're having trouble, since my aim is to make creating a site based
183
+ on Noumenon as simple as possible. The best way to get in touch is to open an issue at http://github.com/Noumenon/noumenon/issues.
184
+
185
+ If you'd like to contribute fork this repository, and then submit a pull request when you're done. Please make sure to include some tests
186
+ so that your feature doesn't get broken in the future.
187
+
188
+ ## License
189
+
190
+ Noumenon is released under the MIT license by Blank Pad Development.
@@ -4,9 +4,29 @@ require 'noumenon/core'
4
4
 
5
5
  module Noumenon
6
6
  class TemplateNotFoundError < StandardError; end
7
+ class MissingApplicationError < StandardError; end
7
8
 
8
9
  class << self
9
10
  # Returns a configured Noumenon application. Intended for use in a Rack configuration:
11
+ #
12
+ # By default the following URL handlers are put in place:
13
+ #
14
+ # */themes/#{theme_name}/*
15
+ #
16
+ # The assets directory of all installed themes are made accessible so that themes can
17
+ # bundle stylesheets, javascripts, and other static assets.
18
+ #
19
+ # */*
20
+ #
21
+ # Anything below / is handled by Noumenon::Core, which will simply load a content item
22
+ # if it exists, and render it within the specified template.
23
+ #
24
+ # *Configuring Custom URL Handlers*
25
+ #
26
+ # By placing a file called "config.yml" in a directory you can change the URL handler for
27
+ # it. The "application" attribute sets the class that will handle that URL, for example:
28
+ #
29
+ # application: "Noumenon::Applications::ContactForm"
10
30
  #
11
31
  # Example:
12
32
  #
@@ -16,17 +36,41 @@ module Noumenon
16
36
  # run Noumenon.boot
17
37
  def boot
18
38
  Rack::Builder.new do
19
- Dir.glob(File.join(Noumenon.config.dependencies_path, "themes/*/assets")).each do |path|
20
- theme = path.split("/")[-2]
21
- url = "/themes/#{theme}"
22
-
23
- map(url) { run Rack::File.new(path) }
39
+ Noumenon.themes.each do |name, details|
40
+ map("/themes/#{name}") { run Rack::File.new(File.join(details[:path], "assets")) }
41
+ end
42
+
43
+ Dir.glob(File.join(Noumenon.config.content_repository_path, "**/config.yml")).each do |path|
44
+ config = YAML.load(File.read(path))
45
+
46
+ if config["application"]
47
+ begin
48
+ url = path.gsub(Noumenon.config.content_repository_path, "").split("/")[0..-2].join("/")
49
+ app = Noumenon.constantize(config["application"]).new
50
+
51
+ map(url) { run app }
52
+ rescue NameError => e
53
+ raise MissingApplicationError.new("The application #{config["application"]} has not been loaded.")
54
+ end
55
+ end
24
56
  end
25
57
 
26
58
  map("/") { run Core.new }
27
59
  end
28
60
  end
29
61
 
62
+ # Attempts to convert a string into a constant.
63
+ #
64
+ # If the constant could not be found then NameError will be raised.
65
+ def constantize(name)
66
+ mod = Module
67
+ name.split("::").each do |mod_name|
68
+ mod = mod.const_get(mod_name.to_sym)
69
+ end
70
+
71
+ mod
72
+ end
73
+
30
74
  # Provides access to the configuration of this application.
31
75
  #
32
76
  # If passed a block then the current configuration will be yielded in the form
@@ -49,5 +93,17 @@ module Noumenon
49
93
  def config=(config)
50
94
  @config = config
51
95
  end
96
+
97
+ # Returns details of any registered themes.
98
+ def themes
99
+ @themes ||= {}
100
+ end
101
+
102
+ # Registers a theme for use by Noumenon.
103
+ #
104
+ # Any files in the assets/ directory below the path provided will be accessible from /themes/theme_name.
105
+ def register_theme(name, path)
106
+ themes[name] = { :path => path }
107
+ end
52
108
  end
53
109
  end
@@ -6,9 +6,6 @@ module Noumenon
6
6
  # The path to load content from.
7
7
  attr_accessor :content_repository_path
8
8
 
9
- # The path to load any depdencies such as themes and applications from.
10
- attr_accessor :dependencies_path
11
-
12
9
  # The theme to use.
13
10
  attr_accessor :theme
14
11
 
@@ -16,8 +13,13 @@ module Noumenon
16
13
  #
17
14
  # If the theme could not be found under dependencies_path then a ThemeNotFoundError will be raised.
18
15
  def theme=(value)
19
- unless File.exist?(File.join(dependencies_path, "themes", value))
20
- raise ThemeNotFoundError.new("The theme #{value} could not be found in #{dependencies_path}/themes.")
16
+ begin
17
+ require value.gsub("-", "/")
18
+ rescue LoadError => e
19
+ end
20
+
21
+ unless Noumenon.themes.key?(value)
22
+ raise ThemeNotFoundError.new("The theme #{value} has not been registered.")
21
23
  end
22
24
 
23
25
  @theme = value
@@ -26,7 +26,7 @@ module Noumenon
26
26
 
27
27
  # Get the path to a file provided by the current theme.
28
28
  def theme_path(path)
29
- File.join(config.dependencies_path, "themes", config.theme, path)
29
+ File.join(Noumenon.themes[config.theme][:path], path)
30
30
  end
31
31
 
32
32
  # Render a template, surrounding it with the theme layout if a theme has been set, and
@@ -47,7 +47,7 @@ module Noumenon
47
47
 
48
48
  if options[:layout]
49
49
  begin
50
- body = render_template(theme_path("#{options[:layout]}.html"), { 'body' => body }, :layout => false)
50
+ body = render_template(theme_path("templates/#{options[:layout]}.html"), { 'body' => body }, :layout => false)
51
51
  rescue Noumenon::Template::NotFoundError => ignore_missing_layouts
52
52
  end
53
53
  end
@@ -63,7 +63,7 @@ module Noumenon
63
63
  content = File.read(content_path(path))
64
64
  item = YAML.load( content )
65
65
 
66
- [ 200, render_template( theme_path("#{item["template"]}.html"), item ) ]
66
+ [ 200, render_template( theme_path("templates/#{item["template"]}.html"), item ) ]
67
67
  end
68
68
 
69
69
  # Locate a piece of content in the content repository based on the URL it is being accessed from.
@@ -1,4 +1,5 @@
1
1
  require 'noumenon/spec/fixtures'
2
+ require 'noumenon/spec/example_app'
2
3
 
3
4
  module Noumenon
4
5
  # Spec helpers used while testing Noumenon, and Noumenon applications.
@@ -0,0 +1,9 @@
1
+ module Noumenon
2
+ module Spec
3
+ class ExampleApp < Noumenon::Core
4
+ get '/' do
5
+ [ 200, "This was served by Noumenon::Spec::ExampleApp" ]
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,3 +1,3 @@
1
1
  module Noumenon
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -0,0 +1 @@
1
+ application: "NonExistantApplication"
@@ -0,0 +1 @@
1
+ application: "Noumenon::Spec::ExampleApp"
@@ -0,0 +1 @@
1
+ This is example.txt in the external_theme theme.
@@ -0,0 +1 @@
1
+ Noumenon.register_theme "unregistered", File.expand_path("../..", __FILE__)
@@ -6,24 +6,24 @@ describe Noumenon::Configuration do
6
6
  it { should respond_to(:content_repository_path) }
7
7
  it { should respond_to(:content_repository_path=) }
8
8
 
9
- it { should respond_to(:dependencies_path) }
10
- it { should respond_to(:dependencies_path=) }
11
-
12
9
  it { should respond_to(:theme) }
13
10
  it { should respond_to(:theme=) }
14
11
 
15
12
  describe "setting the theme" do
16
- before(:each) do
17
- subject.dependencies_path = fixture_path("static_example_dependencies")
18
- end
19
-
20
13
  it "succeeds if the theme exists" do
21
14
  subject.theme = "example"
22
15
  subject.theme.should == "example"
23
16
  end
24
17
 
25
- it "raises an exception if the theme could not be found" do
18
+ it "raises an exception if the theme has not been registered" do
26
19
  lambda { subject.theme = "none_existant" }.should raise_error Noumenon::Configuration::ThemeNotFoundError
27
20
  end
21
+
22
+ it "automatically requires a theme if it can be found" do
23
+ $: << fixture_path("themes/unregistered/lib")
24
+
25
+ subject.theme = "unregistered"
26
+ subject.theme.should == "unregistered"
27
+ end
28
28
  end
29
29
  end
@@ -22,7 +22,7 @@ describe Noumenon::Core do
22
22
  it { should respond_to(:theme_path) }
23
23
 
24
24
  it "can locate a path in the theme directory" do
25
- app.theme_path("file").should == "#{app.config.dependencies_path}/themes/example/file"
25
+ app.theme_path("file").should == fixture_path("themes/example/file")
26
26
  end
27
27
  end
28
28
 
@@ -63,7 +63,7 @@ describe Noumenon::Core do
63
63
  get "/directory_with_index"
64
64
 
65
65
  last_response.should be_ok
66
- last_response.body.should == File.read(app.theme_path("basic_template.html"))
66
+ last_response.body.should == File.read(app.theme_path("templates/basic_template.html"))
67
67
  end
68
68
  end
69
69
 
@@ -91,7 +91,7 @@ describe Noumenon::Core do
91
91
  get "/templates/basic_example"
92
92
 
93
93
  last_response.should be_ok
94
- last_response.body.should == File.read(app.theme_path("basic_template.html"))
94
+ last_response.body.should == File.read(app.theme_path("templates/basic_template.html"))
95
95
  end
96
96
 
97
97
  it "makes substitutions as specified in the template" do
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe Noumenon::Spec::ExampleApp do
4
+ it { should_not be_nil }
5
+
6
+ def app
7
+ Noumenon::Spec::ExampleApp.new
8
+ end
9
+
10
+ it "returns a simple message on a GET to /" do
11
+ get "/"
12
+ last_response.body.should == "This was served by Noumenon::Spec::ExampleApp"
13
+ end
14
+ end
@@ -4,7 +4,7 @@ describe Noumenon::Template do
4
4
  it { should_not be_nil }
5
5
 
6
6
  def template_path(name)
7
- Noumenon::Core.new.theme_path(name)
7
+ Noumenon::Core.new.theme_path("templates/#{name}")
8
8
  end
9
9
 
10
10
  before(:each) do
@@ -1,31 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Noumenon do
4
- before(:each) do
5
- Noumenon.config.dependencies_path = fixture_path("static_example_dependencies")
6
- end
7
-
8
4
  specify { Noumenon.should respond_to(:boot) }
9
5
 
10
6
  def app
11
7
  Noumenon.boot
12
8
  end
13
9
 
14
- describe "serving theme assets" do
15
- it "serves the asset specified at /themes/theme_name/example.txt if the file exists" do
16
- get '/themes/example/example.txt'
17
-
18
- last_response.status.should == 200
19
- last_response.body.should == fixture("static_example_dependencies/themes/example/assets/example.txt")
20
- end
21
-
22
- it "returns a status of 404 if the file does not exist" do
23
- get '/themes/example/not_found.png'
24
-
25
- last_response.status.should == 404
26
- end
27
- end
28
-
29
10
  describe "setting configuration" do
30
11
  before(:each) do
31
12
  Noumenon.config = nil
@@ -58,4 +39,62 @@ describe Noumenon do
58
39
  yielded.should be_true
59
40
  end
60
41
  end
42
+
43
+ describe "mounting apps in sub-directories" do
44
+ context "a config.yml file is present in a sub-directory" do
45
+ context "and the specified application exists" do
46
+ it "uses that application to respond to requests at the specified directory" do
47
+ get "/mounted_app"
48
+
49
+ last_response.status.should == 200
50
+ last_response.body.should == "This was served by Noumenon::Spec::ExampleApp"
51
+ end
52
+ end
53
+
54
+ context "and the specified application does not exist" do
55
+ it "raises a MissingApplicationError" do
56
+ Noumenon.config.content_repository_path = fixture_path("missing_application")
57
+
58
+ raised = false
59
+ begin
60
+ app
61
+ rescue Noumenon::MissingApplicationError => e
62
+ raised = true
63
+ e.to_s.should == "The application NonExistantApplication has not been loaded."
64
+ end
65
+
66
+ raised.should be_true
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ describe "themes" do
73
+ before(:each) do
74
+ Noumenon.instance_eval { @themes = nil }
75
+ end
76
+
77
+ specify { Noumenon.should respond_to(:register_theme) }
78
+ specify { Noumenon.should respond_to(:themes) }
79
+
80
+ it "defaults the theme list to an empty hash" do
81
+ Noumenon.themes.should == {}
82
+ end
83
+
84
+ describe "registering a theme" do
85
+ before(:each) { Noumenon.register_theme("external_theme", fixture_path("themes/external_theme")) }
86
+
87
+ it "adds the registered theme to the list of available themes" do
88
+ Noumenon.themes.should == {
89
+ "external_theme" => { :path => fixture_path("themes/external_theme") }
90
+ }
91
+ end
92
+
93
+ it "should allow access to the theme's assets from /themes/theme_name/asset_name" do
94
+ get "/themes/external_theme/example.txt"
95
+
96
+ last_response.body.should == fixture("themes/external_theme/assets/example.txt")
97
+ end
98
+ end
99
+ end
61
100
  end
@@ -10,9 +10,11 @@ RSpec.configure do |spec|
10
10
  Noumenon::Core.set :environment, :test
11
11
 
12
12
  spec.before(:each) do
13
+ Noumenon.register_theme "example", fixture_path("themes/example")
14
+ Noumenon.register_theme "example_without_layout", fixture_path("themes/example_without_layout")
15
+
13
16
  Noumenon.configure do |c|
14
17
  c.content_repository_path = fixture_path("static_example")
15
- c.dependencies_path = fixture_path("static_example_dependencies")
16
18
  c.theme = "example"
17
19
  end
18
20
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: noumenon
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.2
5
+ version: 0.0.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-04-19 00:00:00 +01:00
13
+ date: 2011-04-20 00:00:00 +01:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -85,30 +85,37 @@ files:
85
85
  - .gitignore
86
86
  - .travis.yml
87
87
  - Gemfile
88
+ - MIT-LICENSE
88
89
  - README.md
89
90
  - Rakefile
90
91
  - lib/noumenon.rb
91
92
  - lib/noumenon/configuration.rb
92
93
  - lib/noumenon/core.rb
93
94
  - lib/noumenon/spec.rb
95
+ - lib/noumenon/spec/example_app.rb
94
96
  - lib/noumenon/spec/fixtures.rb
95
97
  - lib/noumenon/template.rb
96
98
  - lib/noumenon/version.rb
97
99
  - noumenon.gemspec
98
100
  - spec/fixtures/fixture_specs/test
101
+ - spec/fixtures/missing_application/mounted_app/config.yml
99
102
  - spec/fixtures/static_example/directory_with_index/index.yml
100
103
  - spec/fixtures/static_example/found.html
101
104
  - spec/fixtures/static_example/liquid_example.html
105
+ - spec/fixtures/static_example/mounted_app/config.yml
102
106
  - spec/fixtures/static_example/template_with_substitutions.html
103
107
  - spec/fixtures/static_example/templates/basic_example.yml
104
108
  - spec/fixtures/static_example/templates/with_fields.yml
105
- - spec/fixtures/static_example_dependencies/themes/example/assets/example.txt
106
- - spec/fixtures/static_example_dependencies/themes/example/layout.html
107
- - spec/fixtures/static_example_dependencies/themes/example_without_layout/basic_template.html
108
- - spec/fixtures/static_example_dependencies/themes/example_without_layout/fields.html
109
- - spec/fixtures/static_example_dependencies/themes/example_without_layout/template_with_fields.html
109
+ - spec/fixtures/themes/example/assets/example.txt
110
+ - spec/fixtures/themes/example/templates/layout.html
111
+ - spec/fixtures/themes/example_without_layout/templates/basic_template.html
112
+ - spec/fixtures/themes/example_without_layout/templates/fields.html
113
+ - spec/fixtures/themes/example_without_layout/templates/template_with_fields.html
114
+ - spec/fixtures/themes/external_theme/assets/example.txt
115
+ - spec/fixtures/themes/unregistered/lib/unregistered.rb
110
116
  - spec/noumenon/config_spec.rb
111
117
  - spec/noumenon/core_spec.rb
118
+ - spec/noumenon/spec/example_app_spec.rb
112
119
  - spec/noumenon/spec/fixtures_spec.rb
113
120
  - spec/noumenon/spec_spec.rb
114
121
  - spec/noumenon/template_spec.rb
@@ -145,19 +152,24 @@ specification_version: 3
145
152
  summary: An content management system backed by Git
146
153
  test_files:
147
154
  - spec/fixtures/fixture_specs/test
155
+ - spec/fixtures/missing_application/mounted_app/config.yml
148
156
  - spec/fixtures/static_example/directory_with_index/index.yml
149
157
  - spec/fixtures/static_example/found.html
150
158
  - spec/fixtures/static_example/liquid_example.html
159
+ - spec/fixtures/static_example/mounted_app/config.yml
151
160
  - spec/fixtures/static_example/template_with_substitutions.html
152
161
  - spec/fixtures/static_example/templates/basic_example.yml
153
162
  - spec/fixtures/static_example/templates/with_fields.yml
154
- - spec/fixtures/static_example_dependencies/themes/example/assets/example.txt
155
- - spec/fixtures/static_example_dependencies/themes/example/layout.html
156
- - spec/fixtures/static_example_dependencies/themes/example_without_layout/basic_template.html
157
- - spec/fixtures/static_example_dependencies/themes/example_without_layout/fields.html
158
- - spec/fixtures/static_example_dependencies/themes/example_without_layout/template_with_fields.html
163
+ - spec/fixtures/themes/example/assets/example.txt
164
+ - spec/fixtures/themes/example/templates/layout.html
165
+ - spec/fixtures/themes/example_without_layout/templates/basic_template.html
166
+ - spec/fixtures/themes/example_without_layout/templates/fields.html
167
+ - spec/fixtures/themes/example_without_layout/templates/template_with_fields.html
168
+ - spec/fixtures/themes/external_theme/assets/example.txt
169
+ - spec/fixtures/themes/unregistered/lib/unregistered.rb
159
170
  - spec/noumenon/config_spec.rb
160
171
  - spec/noumenon/core_spec.rb
172
+ - spec/noumenon/spec/example_app_spec.rb
161
173
  - spec/noumenon/spec/fixtures_spec.rb
162
174
  - spec/noumenon/spec_spec.rb
163
175
  - spec/noumenon/template_spec.rb