benoit 0.2.2 → 0.4.0

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.
Files changed (53) hide show
  1. checksums.yaml +8 -8
  2. data/.gitignore +1 -2
  3. data/.rspec +1 -1
  4. data/Assetfile +19 -4
  5. data/Gemfile.lock +29 -5
  6. data/Guardfile +28 -0
  7. data/Rakefile +2 -0
  8. data/benoit.gemspec +5 -0
  9. data/bin/benoit +25 -7
  10. data/lib/benoit/cadenza.rb +2 -0
  11. data/lib/benoit/cadenza/blocks.rb +18 -0
  12. data/lib/benoit/compiler_error.rb +5 -1
  13. data/lib/benoit/filters/base_filter.rb +4 -5
  14. data/lib/benoit/filters/cadenza_filter.rb +19 -16
  15. data/lib/benoit/filters/markdown_filter.rb +36 -4
  16. data/lib/benoit/logger.rb +2 -2
  17. data/lib/benoit/pipeline_project.rb +23 -23
  18. data/lib/benoit/server.rb +47 -0
  19. data/lib/benoit/server/remote.rb +29 -0
  20. data/lib/benoit/utils/finds_layouts_for_template.rb +28 -30
  21. data/lib/benoit/version.rb +1 -1
  22. data/spec/features/build_command.feature +1 -1
  23. data/spec/features/frontmatter_metadata.feature +3 -21
  24. data/spec/features/javascript_files.feature +1 -0
  25. data/spec/features/markdown_files.feature +41 -0
  26. data/spec/features/output_filters.feature +2 -7
  27. data/spec/features/page_layouts.feature +4 -28
  28. data/spec/features/pagination.feature +1 -0
  29. data/spec/lib/filters/base_filter_spec.rb +4 -33
  30. data/spec/lib/filters/markdown_filter_spec.rb +31 -8
  31. data/spec/lib/filters/sass_filter_spec.rb +2 -2
  32. data/spec/lib/site_context_spec.rb +2 -2
  33. data/spec/steps/staticly_steps.rb +1 -1
  34. data/spec/support/spec_helpers/memory_file_wrapper.rb +2 -6
  35. data/vendor/rake-pipeline/GETTING_STARTED.md +11 -11
  36. data/vendor/rake-pipeline/bin/rakep +1 -1
  37. data/vendor/rake-pipeline/lib/rake-pipeline.rb +2 -49
  38. data/vendor/rake-pipeline/lib/rake-pipeline/cli.rb +0 -1
  39. data/vendor/rake-pipeline/lib/rake-pipeline/file_wrapper.rb +2 -9
  40. data/vendor/rake-pipeline/lib/rake-pipeline/filter.rb +1 -19
  41. data/vendor/rake-pipeline/lib/rake-pipeline/manifest.rb +4 -0
  42. data/vendor/rake-pipeline/lib/rake-pipeline/middleware.rb +1 -2
  43. data/vendor/rake-pipeline/lib/rake-pipeline/project.rb +3 -2
  44. data/vendor/rake-pipeline/rake-pipeline.gemspec +1 -1
  45. data/vendor/rake-pipeline/spec/cli_spec.rb +0 -2
  46. data/vendor/rake-pipeline/spec/concat_filter_spec.rb +4 -4
  47. data/vendor/rake-pipeline/spec/filter_spec.rb +0 -35
  48. data/vendor/rake-pipeline/spec/gsub_filter_spec.rb +5 -5
  49. data/vendor/rake-pipeline/spec/ordering_concat_filter_spec.rb +4 -4
  50. data/vendor/rake-pipeline/spec/rake_acceptance_spec.rb +18 -0
  51. data/vendor/rake-pipeline/spec/support/spec_helpers/filters.rb +1 -1
  52. data/vendor/rake-pipeline/spec/support/spec_helpers/memory_file_wrapper.rb +2 -6
  53. metadata +77 -2
@@ -16,6 +16,14 @@ describe Benoit::Filters::MarkdownFilter do
16
16
  EOS
17
17
  }
18
18
 
19
+ let(:markdown_extends_input) {
20
+ <<-EOS.unindent
21
+ {% extends "_layout.html" %}
22
+
23
+ [some link](http://www.example.com)
24
+ EOS
25
+ }
26
+
19
27
  let(:expected_output) {
20
28
  <<-EOS.unindent
21
29
  <p><a href="http://www.example.com">some link</a></p>
@@ -25,19 +33,27 @@ describe Benoit::Filters::MarkdownFilter do
25
33
  EOS
26
34
  }
27
35
 
36
+ let(:expected_extends_output) {
37
+ <<-EOS
38
+ {% extends "_layout.html" %}
39
+
40
+ <p><a href="http://www.example.com">some link</a></p>
41
+ EOS
42
+ }
43
+
28
44
  def input_file(name, content)
29
- MemoryFileWrapper.new("/path/to/input", name, "UTF-8", Set.new([]), content)
45
+ MemoryFileWrapper.new("/path/to/input", name, "UTF-8", content)
30
46
  end
31
47
 
32
48
  def output_file(name)
33
- MemoryFileWrapper.new("/path/to/output", name, "UTF-8", Set.new([]))
49
+ MemoryFileWrapper.new("/path/to/output", name, "UTF-8")
34
50
  end
35
51
 
36
- def setup_filter(filter, input_filename='page.markdown')
52
+ def setup_filter(filter, input_filename='page.markdown', content=markdown_input)
37
53
  filter.file_wrapper_class = MemoryFileWrapper
38
54
  filter.manifest = MemoryManifest.new
39
55
  filter.last_manifest = MemoryManifest.new
40
- filter.input_files = [input_file(input_filename, markdown_input)]
56
+ filter.input_files = [input_file(input_filename, content)]
41
57
  filter.output_root= "/path/to/output"
42
58
  filter.rake_application = Rake::Application.new
43
59
  filter
@@ -49,9 +65,6 @@ describe Benoit::Filters::MarkdownFilter do
49
65
  input_file = filter.input_files.first
50
66
  output_file = output_file("page.html")
51
67
 
52
- page = { "content" => markdown_input }
53
- filter.current_site = { input_file.path => page, output_file.path => page }
54
-
55
68
  expect(filter.output_files).to eq([output_file])
56
69
 
57
70
  tasks = filter.generate_rake_tasks
@@ -59,7 +72,17 @@ describe Benoit::Filters::MarkdownFilter do
59
72
 
60
73
  file = MemoryFileWrapper.files["/path/to/output/page.html"]
61
74
  expect(file.body).to eq(expected_output)
75
+ end
76
+
77
+ it "keeps extends tag in place" do
78
+ filter = setup_filter described_class.new, 'page.markdown', markdown_extends_input
79
+
80
+ input_file = filter.input_files.first
62
81
 
63
- expect(page["content"]).to eq(expected_output)
82
+ tasks = filter.generate_rake_tasks
83
+ tasks.each(&:invoke)
84
+
85
+ file = MemoryFileWrapper.files["/path/to/output/page.html"]
86
+ expect(file.body).to eq(expected_extends_output)
64
87
  end
65
88
  end
@@ -24,11 +24,11 @@ describe Benoit::Filters::SassFilter do
24
24
 
25
25
  def input_file
26
26
  path = scss_input_path
27
- FileWrapper.new(File.dirname(path), File.basename(path), "UTF-8", Set.new([]))
27
+ FileWrapper.new(File.dirname(path), File.basename(path), "UTF-8")
28
28
  end
29
29
 
30
30
  def output_file(name)
31
- MemoryFileWrapper.new("/path/to/output", name, "UTF-8", Set.new([]))
31
+ MemoryFileWrapper.new("/path/to/output", name, "UTF-8")
32
32
  end
33
33
 
34
34
  def setup_filter(filter)
@@ -61,8 +61,8 @@ describe SiteContext::ContextObject do
61
61
 
62
62
  describe "for non-existant collections" do
63
63
  subject { context.blah }
64
- it "raises an error" do
65
- expect(->{subject}).to raise_error(NoMethodError)
64
+ it "returns an empty array" do
65
+ expect(subject).to eq([])
66
66
  end
67
67
  end
68
68
 
@@ -90,7 +90,7 @@ module BenoitSteps
90
90
  end
91
91
 
92
92
  step "a cache directory should exist for that site" do
93
- path = File.expand_path(File.join("~", ".benoit", "tmpcache", @site.name))
93
+ path = File.expand_path(File.join("/tmp", ".benoit", "tmpcache", @site.name))
94
94
  step 'a directory named "%s" should exist' % path
95
95
  end
96
96
 
@@ -1,6 +1,6 @@
1
1
  class Rake::Pipeline
2
2
  module SpecHelpers
3
- class MemoryFileWrapper < Struct.new(:root, :path, :encoding, :original_inputs, :body)
3
+ class MemoryFileWrapper < Struct.new(:root, :path, :encoding, :body)
4
4
 
5
5
  @@files = {}
6
6
  @@data = {}
@@ -14,11 +14,7 @@ class Rake::Pipeline
14
14
  end
15
15
 
16
16
  def with_encoding(new_encoding)
17
- self.class.new(root, path, new_encoding, original_inputs, body)
18
- end
19
-
20
- def original_inputs
21
- Set.new([])
17
+ self.class.new(root, path, new_encoding, body)
22
18
  end
23
19
 
24
20
  def fullpath
@@ -36,6 +36,9 @@ and 2 files are outputs. The `source` directory is input and the output
36
36
  will go into `compiled`. Here's the `Assetfile` to do just that:
37
37
 
38
38
  ```ruby
39
+ # Set the Pipeline's output directory
40
+ output "compiled"
41
+
39
42
  # input defines operations on a set of files. All files processed in
40
43
  # this block go into the output directory
41
44
  input "source" do
@@ -53,9 +56,6 @@ input "source" do
53
56
  concat "application.js"
54
57
  end
55
58
  end
56
-
57
- # Set the Pipeline's output directory
58
- output "compiled"
59
59
  ```
60
60
 
61
61
  Now run `rakep build` from the project root to compile everything.
@@ -93,6 +93,9 @@ different location. In short, `concat` is aliased to `copy` as well.
93
93
  Here's the updated `Assetfile`:
94
94
 
95
95
  ```ruby
96
+ # Set the Pipeline's output directory
97
+ output "compiled"
98
+
96
99
  # input defines operations on a set of files. All files processed in
97
100
  # this block go into the output directory
98
101
  input "source" do
@@ -119,9 +122,6 @@ input "source" do
119
122
  copy
120
123
  end
121
124
  end
122
-
123
- # Set the Pipeline's output directory
124
- output "compiled"
125
125
  ```
126
126
 
127
127
  Now we can run `rakep server` inside the projects root. You'll see some
@@ -160,13 +160,13 @@ file. You can overide this or do much more fancy things. This is covered
160
160
  in a different file. We could use this filter like this:
161
161
 
162
162
  ```ruby
163
+ output "compiled"
164
+
163
165
  input "source" do
164
166
  match "**/*.coffee" do
165
167
  filter CoffeeScript
166
168
  end
167
169
  end
168
-
169
- output "compiled"
170
170
  ```
171
171
 
172
172
  Now this filter doesn't do anything at the moment besides copy the
@@ -205,7 +205,7 @@ require "coffee-script"
205
205
 
206
206
  class CoffeeScriptFilter < Rake::Pipeline::Filter
207
207
  def initialize(&block)
208
- &block ||= proc { |input| input.path.gsub(/\.coffee, ".js")
208
+ &block ||= proc { |input| input.path.gsub(/\.coffee/, ".js")
209
209
  super(&block)
210
210
  end
211
211
 
@@ -220,6 +220,8 @@ end
220
220
  Let's take a fresh look at the `Assetfile` now.
221
221
 
222
222
  ```ruby
223
+ output "compiled"
224
+
223
225
  input "source" do
224
226
  match "javascript/**/*.coffee" do
225
227
  # Compile all .coffee files into.js
@@ -239,8 +241,6 @@ input "source" do
239
241
  copy
240
242
  end
241
243
  end
242
-
243
- output "compiled"
244
244
  ```
245
245
 
246
246
  Calling the filter without a block uses the default block in the filter.
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "rake-pipeline/cli"
3
+ require "rake-pipeline"
4
4
  Rake::Pipeline::CLI.start
@@ -10,6 +10,7 @@ require "rake-pipeline/reject_matcher"
10
10
  require "rake-pipeline/sorted_pipeline"
11
11
  require "rake-pipeline/error"
12
12
  require "rake-pipeline/project"
13
+ require "rake-pipeline/cli"
13
14
  require "rake-pipeline/graph"
14
15
 
15
16
  if defined?(Rails::Railtie)
@@ -118,8 +119,6 @@ module Rake
118
119
  end
119
120
  end
120
121
 
121
- ALLOWED_HOOKS = [:before_pipeline, :before_filter, :before_task, :after_task, :after_filter, :after_pipeline, :filters_ready, :rake_tasks_ready]
122
-
123
122
  # @return [Hash[String, String]] the directory paths for the input files
124
123
  # and their matching globs.
125
124
  attr_accessor :inputs
@@ -147,9 +146,6 @@ module Rake
147
146
  # @return [Project] the Project that created this pipeline
148
147
  attr_accessor :project
149
148
 
150
- attr_accessor :before_invoke
151
- attr_accessor :after_invoke
152
-
153
149
  # @param [Hash] options
154
150
  # @option options [Hash] :inputs
155
151
  # set the pipeline's {#inputs}.
@@ -212,23 +208,6 @@ module Rake
212
208
  self
213
209
  end
214
210
 
215
- def call_hook(hook, *args)
216
- if self.hooks[hook].respond_to? :call
217
- args = [self].concat(args)
218
- self.hooks[hook].call(*args)
219
- end
220
- end
221
-
222
- def register_invocation_hook(name, hook=nil, &block)
223
- return unless ALLOWED_HOOKS.include? name
224
- self.hooks ||= {}
225
- self.hooks[name] = hook || block
226
- end
227
-
228
- def hooks
229
- @hooks ||= {}
230
- end
231
-
232
211
  # Copy the current pipeline's attributes over.
233
212
  #
234
213
  # @param [Class] target_class the class to create a new
@@ -346,32 +325,8 @@ module Rake
346
325
 
347
326
  setup
348
327
 
349
- self.call_hook(:before_pipeline)
350
- filters.each do |filter|
351
- invoke_filter_tasks(filter)
352
- end
353
- self.call_hook(:after_pipeline)
354
- end
355
- end
356
-
357
- def invoke_filter_tasks(filter)
358
- if filter.respond_to? :filters
359
- filter.filters.each do |filter|
360
- invoke_tasks(filter)
361
- end
362
- else
363
- invoke_tasks(filter)
364
- end
365
- end
366
-
367
- def invoke_tasks(filter)
368
- self.call_hook :before_filter, filter
369
- filter.rake_tasks.each do |task|
370
- self.call_hook(:before_task, task)
371
- task.invoke
372
- self.call_hook(:after_task, task)
328
+ @rake_tasks.each { |task| task.invoke }
373
329
  end
374
- self.call_hook :after_filter, filter
375
330
  end
376
331
 
377
332
  # Set up the filters and generate rake tasks. In general, this method
@@ -381,9 +336,7 @@ module Rake
381
336
  # @api private
382
337
  def setup
383
338
  setup_filters
384
- call_hook :filters_ready
385
339
  generate_rake_tasks
386
- call_hook :rake_tasks_ready
387
340
  record_input_files
388
341
  end
389
342
 
@@ -1,5 +1,4 @@
1
1
  require "thor"
2
- require "rake-pipeline"
3
2
 
4
3
  module Rake
5
4
  class Pipeline
@@ -23,16 +23,13 @@ module Rake
23
23
  # +BINARY+ if they are declared as processing binary data.
24
24
  attr_accessor :encoding
25
25
 
26
- attr_accessor :original_inputs
27
-
28
26
  # Create a new {FileWrapper}, passing in optional root, path, and
29
27
  # encoding. Any of the parameters can be ommitted and supplied later.
30
28
  #
31
29
  # @return [void]
32
- def initialize(root=nil, path=nil, encoding="UTF-8", original_inputs=nil)
30
+ def initialize(root=nil, path=nil, encoding="UTF-8")
33
31
  @root, @path, @encoding = root, path, encoding
34
32
  @created_file = nil
35
- @original_inputs = original_inputs
36
33
  end
37
34
 
38
35
  # Create a new {FileWrapper FileWrapper} with the same root and
@@ -42,11 +39,7 @@ module Rake
42
39
  # @param [String] encoding the encoding for the new object
43
40
  # @return [FileWrapper]
44
41
  def with_encoding(encoding)
45
- self.class.new(@root, @path, encoding, original_inputs)
46
- end
47
-
48
- def original_inputs
49
- @original_inputs ||= Set.new([self])
42
+ self.class.new(@root, @path, encoding)
50
43
  end
51
44
 
52
45
  # A {FileWrapper} is equal to another {FileWrapper} for hashing purposes
@@ -235,28 +235,10 @@ module Rake
235
235
 
236
236
  def output_wrappers(input)
237
237
  output_paths(input).map do |path|
238
- if collected_wrappers.key? path
239
- collected_wrappers[path].tap do |wrapper|
240
- original_inputs =
241
- if input.original_inputs.any?
242
- input.original_inputs
243
- else
244
- [input]
245
- end
246
- wrapper.original_inputs.merge original_inputs
247
- end
248
- else
249
- wrapper = file_wrapper_class.new(output_root, path, encoding,
250
- input.original_inputs)
251
- collected_wrappers[path] = wrapper
252
- end
238
+ file_wrapper_class.new(output_root, path, encoding)
253
239
  end
254
240
  end
255
241
 
256
- def collected_wrappers
257
- @collected_wrappers ||= {}
258
- end
259
-
260
242
  def output_paths(input)
261
243
  args = [ input.path ]
262
244
  args << input if output_name_generator.arity == 2
@@ -59,6 +59,10 @@ module Rake
59
59
  @entries[key] = value
60
60
  end
61
61
 
62
+ def clear
63
+ entries.clear
64
+ end
65
+
62
66
  def empty?
63
67
  entries.empty?
64
68
  end
@@ -65,8 +65,7 @@ module Rake
65
65
 
66
66
  def headers_for(path)
67
67
  mime = Rack::Mime.mime_type(File.extname(path), "text/plain")
68
- size = File.size(path)
69
- { "Content-Type" => mime, "Content-Length" => size }
68
+ { "Content-Type" => mime }
70
69
  end
71
70
  end
72
71
  end
@@ -133,6 +133,7 @@ module Rake
133
133
 
134
134
  # Remove the project's temporary and output files.
135
135
  def clean
136
+ last_manifest.clear
136
137
  files_to_clean.each { |file| FileUtils.rm_rf(file) }
137
138
  end
138
139
 
@@ -277,7 +278,7 @@ module Rake
277
278
  end
278
279
 
279
280
  def dirty?
280
- assetfile_dirty? || files_dirty? || files_deleted?
281
+ assetfile_dirty? || files_deleted? || files_dirty?
281
282
  end
282
283
 
283
284
  def assetfile_dirty?
@@ -311,7 +312,7 @@ module Rake
311
312
  end
312
313
 
313
314
  def files_deleted?
314
- manifest.files.each_key do |input_file|
315
+ last_manifest.files.each_key do |input_file|
315
316
  return true if !File.exists?(input_file)
316
317
  end
317
318
 
@@ -15,7 +15,7 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = Rake::Pipeline::VERSION
17
17
 
18
- gem.add_dependency "rake", "~> 0.9.0"
18
+ gem.add_dependency "rake", "~> 10.0.0"
19
19
  gem.add_dependency "thor"
20
20
  gem.add_dependency "json"
21
21
 
@@ -1,5 +1,3 @@
1
- require "rake-pipeline/cli"
2
-
3
1
  describe "Rake::Pipeline::CLI" do
4
2
  attr_reader :project, :pipeline
5
3
 
@@ -4,8 +4,8 @@ describe "ConcatFilter" do
4
4
 
5
5
  let(:input_files) {
6
6
  [
7
- MemoryFileWrapper.new("/path/to/input", "javascripts/jquery.js", "UTF-8", [], "jQuery = {};"),
8
- MemoryFileWrapper.new("/path/to/input", "javascripts/sproutcore.js", "UTF-8", [], "SC = {};")
7
+ MemoryFileWrapper.new("/path/to/input", "javascripts/jquery.js", "UTF-8", "jQuery = {};"),
8
+ MemoryFileWrapper.new("/path/to/input", "javascripts/sproutcore.js", "UTF-8", "SC = {};")
9
9
  ]
10
10
  }
11
11
 
@@ -17,7 +17,7 @@ describe "ConcatFilter" do
17
17
  filter.output_root = "/path/to/output"
18
18
  filter.input_files = input_files
19
19
 
20
- filter.output_files.should == [MemoryFileWrapper.new("/path/to/output", "application.js", "BINARY", [])]
20
+ filter.output_files.should == [MemoryFileWrapper.new("/path/to/output", "application.js", "BINARY")]
21
21
 
22
22
  tasks = filter.generate_rake_tasks
23
23
  tasks.each(&:invoke)
@@ -32,6 +32,6 @@ describe "ConcatFilter" do
32
32
  filter.file_wrapper_class = MemoryFileWrapper
33
33
  filter.output_root = "/path/to/output"
34
34
  filter.input_files = input_files
35
- filter.output_files.should == [MemoryFileWrapper.new("/path/to/output", "app.js", "BINARY", [])]
35
+ filter.output_files.should == [MemoryFileWrapper.new("/path/to/output", "app.js", "BINARY")]
36
36
  end
37
37
  end