nanoc-oo 0.0.1
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/.gitignore +17 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +31 -0
- data/Rakefile +1 -0
- data/bin/nanoc-oo +17 -0
- data/cucumber.yml +8 -0
- data/data/nanoc-oo/wrapper/Rules +115 -0
- data/data/nanoc-oo/wrapper/lib/classes/1_page.rb +198 -0
- data/data/nanoc-oo/wrapper/lib/fake_dir.rb +27 -0
- data/data/nanoc-oo/wrapper/lib/fake_item.rb +39 -0
- data/data/nanoc-oo/wrapper/lib/fake_items.rb +22 -0
- data/data/nanoc-oo/wrapper/lib/filter_for.rb +14 -0
- data/data/nanoc-oo/wrapper/lib/item_class.rb +22 -0
- data/features/_related_tests.feature +32 -0
- data/features/composite_file.example +82 -0
- data/features/move_children.example +43 -0
- data/features/paginate_article.example +86 -0
- data/features/step_definitions/complex_steps.rb +23 -0
- data/features/step_definitions/nanoc-oo_steps.rb +9 -0
- data/features/step_definitions/nanoc_steps.rb +22 -0
- data/features/step_definitions/steps.rb +1 -0
- data/features/support/env.rb +25 -0
- data/features/support/my_extension.rb +16 -0
- data/features/support/nice_steps.rb +14 -0
- data/lib/nanoc-oo/version.rb +3 -0
- data/lib/nanoc-oo.rb +25 -0
- data/nanoc-oo.gemspec +32 -0
- data/old-README.md +72 -0
- data/spec/add_item_spec.rb +97 -0
- data/spec/cli/all_spec.rb +57 -0
- data/spec/item_children_and_comiling_spec.rb +97 -0
- data/spec/items_configuration_spec.rb +239 -0
- data/spec/layouts_spec.rb +50 -0
- data/spec/rspec/compiler_spec.rb +8 -0
- data/spec/rspec/nanoc_spec.rb +13 -0
- data/spec/rspec/wrapper_spec.rb +15 -0
- data/spec/support/0_coverage.rb +18 -0
- data/spec/support/1_config.rb +27 -0
- data/spec/support/2_nanoc.rb +27 -0
- data/spec/support/3_wrapper.rb +17 -0
- data/spec/support/4_compiler.rb +16 -0
- data/spec/support/5_temp_files.rb +51 -0
- data/spec/support/6_temp_helpers.rb +98 -0
- data/spec/support/all.rb +22 -0
- data/spec/unit/fake_dir_spec.rb +45 -0
- data/spec/unit/fake_item_spec.rb +62 -0
- data/spec/unit/fake_items_spec.rb +38 -0
- data/spec/unit/filter_for_spec.rb +12 -0
- data/spec/unit/item_class_spec.rb +42 -0
- data/spec/unit/page_spec.rb +96 -0
- data/spec/unit/temp_files_spec.rb +107 -0
- metadata +278 -0
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color --format documentation
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 TODO: Write your name
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# NanocOO
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
TODO: Write a gem description
|
5
|
+
TODO: Write a gem description
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'nanoc-oo'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install nanoc-oo
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
TODO: Write usage instructions here
|
24
|
+
|
25
|
+
## Contributing
|
26
|
+
|
27
|
+
1. Fork it
|
28
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
29
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
30
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
31
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/nanoc-oo
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'nanoc-oo'
|
3
|
+
require 'thor/group'
|
4
|
+
|
5
|
+
class CLI < Thor::Group
|
6
|
+
argument :name, type: :string, desc: 'directory name for new site'
|
7
|
+
class_option :blank, type: :boolean, default: false, desc: 'without content files'
|
8
|
+
desc 'creates nanoc site with object-oriented wrapper'
|
9
|
+
|
10
|
+
def create_it
|
11
|
+
NanocOO.create_site name, options[:blank]
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.banner; super.sub('cli ','') end
|
15
|
+
end
|
16
|
+
|
17
|
+
ARGV.empty?? CLI.usage : CLI.start
|
data/cucumber.yml
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
<%
|
2
|
+
rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
|
3
|
+
rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
|
4
|
+
std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} --strict --tags ~@wip"
|
5
|
+
%>
|
6
|
+
default: <%= std_opts %> features
|
7
|
+
wip: --tags @wip:3 --wip features
|
8
|
+
rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip
|
@@ -0,0 +1,115 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
|
4
|
+
###############
|
5
|
+
# Odd #
|
6
|
+
###############
|
7
|
+
|
8
|
+
class Nanoc::Item
|
9
|
+
def +@
|
10
|
+
self[:object]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
#compile('/'){ layout 'default' }; route('/'){'/index.html'}
|
15
|
+
#compile('/stylesheet/'){}; route('/stylesheet/'){'/style.css'}
|
16
|
+
|
17
|
+
@file = '../log.txt'
|
18
|
+
def log?
|
19
|
+
File.exist?(@file) ? File.read(@file) : ''
|
20
|
+
end
|
21
|
+
def log data
|
22
|
+
File.write @file, log? + "\n#{ data }"
|
23
|
+
end
|
24
|
+
|
25
|
+
module Preprocessor # one .preprocess per item!
|
26
|
+
|
27
|
+
def self.preprocess! context, classes
|
28
|
+
|
29
|
+
while item = context.items.find { |item| !(+item) || !(+item).processed? }
|
30
|
+
prepare item, classes
|
31
|
+
(+item).do_preprocess context
|
32
|
+
end
|
33
|
+
|
34
|
+
fix_children context # after preprocessing finished
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.prepare item, classes
|
38
|
+
item[:object] = classes[item].new(item) unless +item
|
39
|
+
item
|
40
|
+
end
|
41
|
+
def self.fix_children context
|
42
|
+
context.items.each do |item|
|
43
|
+
(+item).fix_children context
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
module ::Builder
|
49
|
+
|
50
|
+
def self.build! item, context, items_context
|
51
|
+
|
52
|
+
unless item.is_a? FakeDir
|
53
|
+
|
54
|
+
context.compile (+item).identifier do
|
55
|
+
(+item).compile self
|
56
|
+
end
|
57
|
+
|
58
|
+
context.route (+item).identifier do
|
59
|
+
(+item).route
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
(+item).compile_children context, items_context
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def root items, classes
|
68
|
+
items.find { |item| item.identifier == '/' } or Preprocessor.prepare Nanoc::Item.new('', { hidden: true }, '/'), classes
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
#################
|
73
|
+
# Layouts #
|
74
|
+
#################
|
75
|
+
#
|
76
|
+
# The first matching rule is used:
|
77
|
+
# layout '*', :erb
|
78
|
+
# layout '/default/', :slim
|
79
|
+
# layout '/default/', :haml, format: :html5
|
80
|
+
# layout %r{^/_.+/$}, :erb
|
81
|
+
# /default/ may be layouts/default.with-any-extension
|
82
|
+
# all unmatched layouts will be compiled using filter determined by extension:
|
83
|
+
#
|
84
|
+
|
85
|
+
FakeItems.new('layouts').items.each do |item|
|
86
|
+
layout item.identifier, FilterFor[item.file]
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
#################
|
91
|
+
# Items #
|
92
|
+
#################
|
93
|
+
|
94
|
+
fake = FakeItems.new('content')
|
95
|
+
classes = ItemClass.new
|
96
|
+
|
97
|
+
|
98
|
+
##################
|
99
|
+
# Preprocess #
|
100
|
+
##################
|
101
|
+
|
102
|
+
Preprocessor.preprocess! fake, classes
|
103
|
+
|
104
|
+
preprocess do
|
105
|
+
Preprocessor.preprocess! self, classes
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
###################
|
110
|
+
# Compile/Route #
|
111
|
+
###################
|
112
|
+
#
|
113
|
+
# FIXME "if" just for specs, to prevent crashes
|
114
|
+
#
|
115
|
+
Builder.build! root(fake.items, classes), self, fake if fake.items.count > 0
|
@@ -0,0 +1,198 @@
|
|
1
|
+
def is_binary_file? file
|
2
|
+
require 'ptools'
|
3
|
+
File.binary? file
|
4
|
+
end
|
5
|
+
|
6
|
+
# module Hidable
|
7
|
+
# def route *a
|
8
|
+
# return nil if hidden?
|
9
|
+
# super
|
10
|
+
# end
|
11
|
+
|
12
|
+
# # def compile *a
|
13
|
+
# # return nil if hidden?
|
14
|
+
# # super
|
15
|
+
# # end
|
16
|
+
|
17
|
+
# private
|
18
|
+
# def hidden?
|
19
|
+
# # item[:hidden] == true
|
20
|
+
# end
|
21
|
+
# end
|
22
|
+
|
23
|
+
module PageDefaults
|
24
|
+
def route
|
25
|
+
return nil if self.class::ROUTE == false
|
26
|
+
self.class::ROUTE or identifier.chop + (html?? '/index.html' : ".#{extension}")
|
27
|
+
end
|
28
|
+
|
29
|
+
#def item_path
|
30
|
+
# identifier[%r|(/.*/).*?/|]
|
31
|
+
#end
|
32
|
+
#def item_name
|
33
|
+
# identifier[%r|/.*(/.*?/)|]
|
34
|
+
#end
|
35
|
+
|
36
|
+
def compile_children context, items_context
|
37
|
+
children(items_context).each do |child|
|
38
|
+
::Builder.build! child, context, items_context
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def children context=nil
|
43
|
+
return @fixed_children if @fixed_children
|
44
|
+
raise 'context is needed to get children before preprocessing is finished!' unless context
|
45
|
+
direct_children context
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
def fix_children context
|
50
|
+
@fixed_children = children context
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
def direct_children context
|
55
|
+
context.items.select { |items| items.identifier =~ %r|^#{ Regexp.escape identifier }[^/]+/$| }
|
56
|
+
end
|
57
|
+
|
58
|
+
def compile context
|
59
|
+
apply_filter context
|
60
|
+
apply_layout context
|
61
|
+
after_compile context
|
62
|
+
end
|
63
|
+
|
64
|
+
def apply_filter context
|
65
|
+
context.filter filter if filter
|
66
|
+
end
|
67
|
+
def filter
|
68
|
+
return self.class::FILTER if self.class::FILTER
|
69
|
+
return @@filters[last_extension] if @@filters[last_extension]
|
70
|
+
end
|
71
|
+
def apply_layout context
|
72
|
+
context.layout layout if layout
|
73
|
+
end
|
74
|
+
def layout
|
75
|
+
self.class::LAYOUT if defined? self.class::LAYOUT
|
76
|
+
end
|
77
|
+
def after_compile context
|
78
|
+
context.filter :relativize_paths, type: kind if kind
|
79
|
+
end
|
80
|
+
|
81
|
+
def kind
|
82
|
+
case
|
83
|
+
when html? then :html
|
84
|
+
when css? then :css
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
def css?
|
90
|
+
really_css?
|
91
|
+
end
|
92
|
+
|
93
|
+
def really_css?
|
94
|
+
extension.split('.').find { |ext| ext =~ /^(#{ CSS_EXTENSIONS })$/ } ? true : false
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
# uses FakeItem#file or NanocItem#[:binary]
|
100
|
+
#
|
101
|
+
def binary?
|
102
|
+
item.respond_to?(:file) ? is_binary_file?(item.file) : item[:binary]
|
103
|
+
end
|
104
|
+
|
105
|
+
def html?
|
106
|
+
really_html?
|
107
|
+
end
|
108
|
+
|
109
|
+
def really_html?
|
110
|
+
extension.split('.').find { |ext| ext =~ /^(#{ HTML_EXTENSIONS })$/ } ? true : false
|
111
|
+
end
|
112
|
+
|
113
|
+
def extension
|
114
|
+
self.class::EXT or item[:extension] or ''
|
115
|
+
end
|
116
|
+
|
117
|
+
def last_extension
|
118
|
+
extension[/[.](.+?)$/, 1] or extension
|
119
|
+
end
|
120
|
+
|
121
|
+
FILTER = nil
|
122
|
+
ROUTE = nil
|
123
|
+
EXT = nil
|
124
|
+
CSS_EXTENSIONS = 'css|sass|scss'
|
125
|
+
HTML_EXTENSIONS = 'html|htm|slim|haml|md'
|
126
|
+
PRIORITY = 0
|
127
|
+
@@filters = {'md' => :kramdown, 'slim' => :slim, 'erb' => :erb}
|
128
|
+
end
|
129
|
+
|
130
|
+
class Page
|
131
|
+
include PageDefaults
|
132
|
+
# include Hidable
|
133
|
+
attr_reader :item
|
134
|
+
|
135
|
+
def initialize item
|
136
|
+
@item = item
|
137
|
+
end
|
138
|
+
|
139
|
+
def self.create context, *params
|
140
|
+
context.items << item = Nanoc::Item.new(*params)
|
141
|
+
item[:object] = self.new item
|
142
|
+
end
|
143
|
+
|
144
|
+
def preprocess context
|
145
|
+
end
|
146
|
+
|
147
|
+
def do_preprocess context
|
148
|
+
preprocess context
|
149
|
+
ensure
|
150
|
+
@processed = true
|
151
|
+
end
|
152
|
+
|
153
|
+
def processed?
|
154
|
+
@processed
|
155
|
+
end
|
156
|
+
|
157
|
+
def identifier
|
158
|
+
item.identifier
|
159
|
+
end
|
160
|
+
def identifier= value
|
161
|
+
item.identifier = value
|
162
|
+
end
|
163
|
+
|
164
|
+
def self.accept? identifier
|
165
|
+
return false unless mask = good_id
|
166
|
+
identifier =~ mask ? true : false
|
167
|
+
end
|
168
|
+
|
169
|
+
def self.good_id
|
170
|
+
id = self::GOOD_ID
|
171
|
+
case id
|
172
|
+
when String
|
173
|
+
id.gsub!('**','.+') # any level
|
174
|
+
id.gsub!('*','[^/]+') # one level
|
175
|
+
id = "/#{id}" unless id[0] == '/'
|
176
|
+
id = "#{id}/" unless id[-1] == '/'
|
177
|
+
/^#{id}$/
|
178
|
+
else
|
179
|
+
id
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def representation
|
184
|
+
rep
|
185
|
+
end
|
186
|
+
def rep
|
187
|
+
:default
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
class UndefinedPage < Page
|
192
|
+
PRIORITY = fixnum_min = -(2**(0.size * 8 -2))
|
193
|
+
def self.accept? *a; true end
|
194
|
+
|
195
|
+
def route *a; end
|
196
|
+
def compile *a; end
|
197
|
+
def preprocess *a; end
|
198
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class FakeDir
|
2
|
+
attr_reader :file
|
3
|
+
attr_accessor :identifier
|
4
|
+
|
5
|
+
def initialize file
|
6
|
+
@file = file
|
7
|
+
@values = {}
|
8
|
+
@identifier = get_identifier
|
9
|
+
end
|
10
|
+
|
11
|
+
def +@
|
12
|
+
@values[:object]
|
13
|
+
end
|
14
|
+
def []= key, value
|
15
|
+
@values[key] = value
|
16
|
+
end
|
17
|
+
def [] key
|
18
|
+
@values[key]
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def get_identifier
|
23
|
+
dir = @file.sub(/.+?\//, '/')
|
24
|
+
dir << '/' if dir[-1] != '/'
|
25
|
+
dir
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class FakeItem
|
2
|
+
attr_reader :file
|
3
|
+
attr_accessor :identifier
|
4
|
+
|
5
|
+
def initialize file
|
6
|
+
@file = file
|
7
|
+
@identifier = get_identifier
|
8
|
+
@values = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def binary?
|
12
|
+
require 'ptools'
|
13
|
+
File.binary?(file)
|
14
|
+
end
|
15
|
+
|
16
|
+
def raw_content
|
17
|
+
File.read file
|
18
|
+
end
|
19
|
+
|
20
|
+
def +@
|
21
|
+
@values[:object]
|
22
|
+
end
|
23
|
+
def []= key, value
|
24
|
+
@values[key] = value
|
25
|
+
end
|
26
|
+
def [] key
|
27
|
+
return extension if key == :extension
|
28
|
+
@values[key]
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
def get_identifier
|
33
|
+
(@file.sub(/.+?\//, '/').sub(/\.[^\/]+/, '') + '/').sub(%r[/index/$], '/')
|
34
|
+
end
|
35
|
+
|
36
|
+
def extension
|
37
|
+
@file[/\.([^\/]+)$/, 1].to_s
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class FakeItems
|
2
|
+
attr_reader :items
|
3
|
+
|
4
|
+
def initialize where, params={nanoc:false}
|
5
|
+
@params = params
|
6
|
+
all = Dir["#{where}/**/*"]
|
7
|
+
files = all.reject { |those| File.directory? those }.map { |item| create item } # FakeItem.new item }
|
8
|
+
dirs = all.select { |those| File.directory? those }.map { |item| FakeDir.new item }
|
9
|
+
dirs.reject! { |dir| files.find { |file| file.identifier == dir.identifier } }
|
10
|
+
@items = files + dirs
|
11
|
+
end
|
12
|
+
|
13
|
+
def create item
|
14
|
+
fake = FakeItem.new item
|
15
|
+
if @params[:nanoc] && defined? Nanoc
|
16
|
+
content = fake.binary?? fake.file : File.read(fake.file)
|
17
|
+
Nanoc::Item.new content, {}, fake.identifier
|
18
|
+
else
|
19
|
+
fake
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class Class
|
2
|
+
def subclasses
|
3
|
+
ObjectSpace.each_object(Class).select { |klass| klass < self }
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
class ItemClass
|
8
|
+
attr_reader :classes
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@classes = find_classes
|
12
|
+
end
|
13
|
+
|
14
|
+
def [] item
|
15
|
+
@classes.find { |that| that.accept? item.identifier }
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def find_classes
|
20
|
+
Page.subclasses.sort_by { |x| x::PRIORITY }.reverse
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
Feature: related tests
|
2
|
+
|
3
|
+
Scenario Outline: nanoc is ok
|
4
|
+
When I successfully run `ruby -S nanoc <command>`
|
5
|
+
Then the output should contain "<success>"
|
6
|
+
|
7
|
+
Examples:
|
8
|
+
| command | success |
|
9
|
+
| -v | 2007 |
|
10
|
+
| cs temp | Enjoy! |
|
11
|
+
|
12
|
+
|
13
|
+
Scenario: wrapper is ok
|
14
|
+
Given I have a blank wrapped nanoc site
|
15
|
+
And a directory named "lib/classes" should exist
|
16
|
+
And a file named "lib/classes/hide_all.rb" with:
|
17
|
+
"""
|
18
|
+
class HideAll < Page
|
19
|
+
GOOD_ID = // # any
|
20
|
+
def route; nil end
|
21
|
+
end
|
22
|
+
"""
|
23
|
+
When I successfully compile it
|
24
|
+
Then the file "output/index.html" should not exist
|
25
|
+
Then the file "output/style.css" should not exist
|
26
|
+
|
27
|
+
|
28
|
+
Scenario: steps are ok
|
29
|
+
Given I have a default nanoc site
|
30
|
+
When I successfully compile it
|
31
|
+
Then a file named "output/index.html" should exist
|
32
|
+
Then a file named "output/style.css" should exist
|
@@ -0,0 +1,82 @@
|
|
1
|
+
Feature: composite file example
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I have a blank wrapped nanoc site
|
5
|
+
And the folowing are input files:
|
6
|
+
"""
|
7
|
+
content/style/one.sass
|
8
|
+
content/style/two.sass
|
9
|
+
content/style/three.sass
|
10
|
+
content/style/index.erb
|
11
|
+
"""
|
12
|
+
And the folowing are expected output files:
|
13
|
+
"""
|
14
|
+
output/style.css
|
15
|
+
"""
|
16
|
+
|
17
|
+
Scenario:
|
18
|
+
Given a file named "lib/classes/style.rb" with:
|
19
|
+
"""
|
20
|
+
# different items with same routes???
|
21
|
+
# INDEX = ...
|
22
|
+
# create item?
|
23
|
+
# compile_ext / route_ext ???
|
24
|
+
# EXT = 'css' filter an route
|
25
|
+
# NAME = 'style.css' # used by routing and ext ??
|
26
|
+
# INDEX = ...
|
27
|
+
# LAYOUT = ...
|
28
|
+
#%r|^/style/.| # '/style/.'
|
29
|
+
# '*/style' < 1 level deep
|
30
|
+
# '**/style' < n levels deep
|
31
|
+
|
32
|
+
#%r|^/style/.| # <<<<<<<<<<< get rid of regexp! '*/style/*'
|
33
|
+
|
34
|
+
|
35
|
+
class Style < Page
|
36
|
+
GOOD_ID = '/style/'
|
37
|
+
ROUTE = '/style.css'
|
38
|
+
end
|
39
|
+
|
40
|
+
class SubStyle < Page
|
41
|
+
GOOD_ID = 'style/**' # == '/style/**/' (boundary slashes are optional: se == /se == se/ == /se/ )
|
42
|
+
ROUTE = false # nil - default action, false - dont create output file
|
43
|
+
FILTER = :sass # or @@filters['sass'] = :sass # filter by ext
|
44
|
+
end
|
45
|
+
"""
|
46
|
+
And a file named "content/style/index.erb" with:
|
47
|
+
"""
|
48
|
+
<%= (+item).children.map(&:compiled_content).join "\n" %>
|
49
|
+
"""
|
50
|
+
And a file named "content/style/one.sass" with:
|
51
|
+
"""
|
52
|
+
html
|
53
|
+
color: red
|
54
|
+
"""
|
55
|
+
And a file named "content/style/two.sass" with:
|
56
|
+
"""
|
57
|
+
html
|
58
|
+
color: green
|
59
|
+
"""
|
60
|
+
And a file named "content/style/three.sass" with:
|
61
|
+
"""
|
62
|
+
html
|
63
|
+
color: blue
|
64
|
+
"""
|
65
|
+
When I successfully compile it
|
66
|
+
Then input are the only files in "content" directory
|
67
|
+
And expected output are the only files in "output" directory
|
68
|
+
Then the file "output/style.css" should contain:
|
69
|
+
"""
|
70
|
+
html {
|
71
|
+
color: red; }
|
72
|
+
"""
|
73
|
+
Then the file "output/style.css" should contain:
|
74
|
+
"""
|
75
|
+
html {
|
76
|
+
color: green; }
|
77
|
+
"""
|
78
|
+
Then the file "output/style.css" should contain:
|
79
|
+
"""
|
80
|
+
html {
|
81
|
+
color: blue; }
|
82
|
+
"""
|