benoit 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. data/.gitignore +4 -0
  2. data/.gitmodules +3 -0
  3. data/.rspec +1 -0
  4. data/.rspec-turnip +1 -0
  5. data/.ruby-version +1 -0
  6. data/Assetfile +44 -0
  7. data/Gemfile +5 -0
  8. data/Gemfile.lock +110 -0
  9. data/Rakefile +9 -0
  10. data/benoit.gemspec +50 -0
  11. data/bin/benoit +121 -0
  12. data/bin/bundle-development +1 -0
  13. data/bin/bundle-sandbox +1 -0
  14. data/lib/benoit.rb +36 -0
  15. data/lib/benoit/cadenza.rb +11 -0
  16. data/lib/benoit/cadenza/output_filters.rb +21 -0
  17. data/lib/benoit/cleaner.rb +10 -0
  18. data/lib/benoit/compiler_error.rb +49 -0
  19. data/lib/benoit/configuration.rb +24 -0
  20. data/lib/benoit/current_site.rb +12 -0
  21. data/lib/benoit/file_wrapper_extensions.rb +13 -0
  22. data/lib/benoit/filters.rb +15 -0
  23. data/lib/benoit/filters/base_filter.rb +44 -0
  24. data/lib/benoit/filters/blacklist_filter.rb +18 -0
  25. data/lib/benoit/filters/cadenza_filter.rb +75 -0
  26. data/lib/benoit/filters/content_page_filter.rb +45 -0
  27. data/lib/benoit/filters/markdown_filter.rb +19 -0
  28. data/lib/benoit/filters/metadata_cleaner.rb +30 -0
  29. data/lib/benoit/filters/move_to_root_filter.rb +22 -0
  30. data/lib/benoit/filters/pagination_filter.rb +23 -0
  31. data/lib/benoit/filters/pass_thru_filter.rb +22 -0
  32. data/lib/benoit/filters/sass_filter.rb +74 -0
  33. data/lib/benoit/filters/set_metadata_filter.rb +15 -0
  34. data/lib/benoit/logger.rb +69 -0
  35. data/lib/benoit/page.rb +88 -0
  36. data/lib/benoit/page_metadata.rb +8 -0
  37. data/lib/benoit/page_metadata/container.rb +74 -0
  38. data/lib/benoit/page_metadata/json_converter.rb +28 -0
  39. data/lib/benoit/page_metadata/parser.rb +38 -0
  40. data/lib/benoit/page_metadata/store.rb +75 -0
  41. data/lib/benoit/pipeline.rb +1 -0
  42. data/lib/benoit/pipeline/dsl_extensions.rb +8 -0
  43. data/lib/benoit/pipeline/pagination_matcher.rb +53 -0
  44. data/lib/benoit/pipeline_project.rb +81 -0
  45. data/lib/benoit/site_context.rb +123 -0
  46. data/lib/benoit/utils/finds_layouts_for_template.rb +77 -0
  47. data/lib/benoit/utils/normalizes_path_to_template.rb +43 -0
  48. data/lib/benoit/utils/paginated_list.rb +102 -0
  49. data/lib/benoit/version.rb +3 -0
  50. data/lib/build_notifiers/file_built_notifier.rb +20 -0
  51. data/lib/build_notifiers/progress_notifier.rb +57 -0
  52. data/lib/cli.rb +39 -0
  53. data/spec/.rbenv-gemsets +1 -0
  54. data/spec/Gemfile +9 -0
  55. data/spec/Gemfile.lock +57 -0
  56. data/spec/bin/autospec +16 -0
  57. data/spec/bin/cucumber +16 -0
  58. data/spec/bin/htmldiff +16 -0
  59. data/spec/bin/ldiff +16 -0
  60. data/spec/bin/rspec +16 -0
  61. data/spec/features/build_command.feature +46 -0
  62. data/spec/features/frontmatter_metadata.feature +99 -0
  63. data/spec/features/javascript_files.feature +35 -0
  64. data/spec/features/output_filters.feature +20 -0
  65. data/spec/features/page_layouts.feature +72 -0
  66. data/spec/features/pagination.feature +58 -0
  67. data/spec/features/sass_files.feature +30 -0
  68. data/spec/features/version.feature +5 -0
  69. data/spec/lib/filters/base_filter_spec.rb +141 -0
  70. data/spec/lib/filters/markdown_filter_spec.rb +65 -0
  71. data/spec/lib/filters/sass_filter_spec.rb +73 -0
  72. data/spec/lib/metadata_json_converter_spec.rb +65 -0
  73. data/spec/lib/metadata_store_spec.rb +148 -0
  74. data/spec/lib/page_spec.rb +19 -0
  75. data/spec/lib/site_context_spec.rb +106 -0
  76. data/spec/spec_helper.rb +16 -0
  77. data/spec/steps/output_file_steps.rb +45 -0
  78. data/spec/steps/run_steps.rb +71 -0
  79. data/spec/steps/staticly_steps.rb +194 -0
  80. data/spec/support/aruba/rspec.rb +66 -0
  81. data/spec/support/files/img.png +0 -0
  82. data/spec/support/files/input.css.scss +7 -0
  83. data/spec/support/files/input.scss +7 -0
  84. data/spec/support/spec_helpers/file_helpers.rb +8 -0
  85. data/spec/support/spec_helpers/memory_file_wrapper.rb +43 -0
  86. data/spec/support/spec_helpers/memory_manifest.rb +19 -0
  87. data/spec/turnip_helper.rb +19 -0
  88. data/vendor/frontmatter/frontmatter.gemspec +24 -0
  89. data/vendor/frontmatter/lib/frontmatter.rb +92 -0
  90. data/vendor/frontmatter/lib/frontmatter/version.rb +3 -0
  91. data/vendor/rake-pipeline/.gitignore +18 -0
  92. data/vendor/rake-pipeline/.rspec +1 -0
  93. data/vendor/rake-pipeline/.travis.yml +12 -0
  94. data/vendor/rake-pipeline/.yardopts +2 -0
  95. data/vendor/rake-pipeline/GETTING_STARTED.md +268 -0
  96. data/vendor/rake-pipeline/Gemfile +14 -0
  97. data/vendor/rake-pipeline/LICENSE +20 -0
  98. data/vendor/rake-pipeline/README.markdown +11 -0
  99. data/vendor/rake-pipeline/README.yard +178 -0
  100. data/vendor/rake-pipeline/Rakefile +21 -0
  101. data/vendor/rake-pipeline/bin/rakep +4 -0
  102. data/vendor/rake-pipeline/examples/copying_files.md +12 -0
  103. data/vendor/rake-pipeline/examples/minifying_files.md +37 -0
  104. data/vendor/rake-pipeline/examples/modifying_pipelines.md +67 -0
  105. data/vendor/rake-pipeline/examples/multiple_pipelines.md +77 -0
  106. data/vendor/rake-pipeline/lib/generators/rake/pipeline/install/install_generator.rb +70 -0
  107. data/vendor/rake-pipeline/lib/rake-pipeline.rb +509 -0
  108. data/vendor/rake-pipeline/lib/rake-pipeline/cli.rb +57 -0
  109. data/vendor/rake-pipeline/lib/rake-pipeline/dsl.rb +9 -0
  110. data/vendor/rake-pipeline/lib/rake-pipeline/dsl/pipeline_dsl.rb +246 -0
  111. data/vendor/rake-pipeline/lib/rake-pipeline/dsl/project_dsl.rb +108 -0
  112. data/vendor/rake-pipeline/lib/rake-pipeline/dynamic_file_task.rb +194 -0
  113. data/vendor/rake-pipeline/lib/rake-pipeline/error.rb +17 -0
  114. data/vendor/rake-pipeline/lib/rake-pipeline/file_wrapper.rb +195 -0
  115. data/vendor/rake-pipeline/lib/rake-pipeline/filter.rb +267 -0
  116. data/vendor/rake-pipeline/lib/rake-pipeline/filters.rb +4 -0
  117. data/vendor/rake-pipeline/lib/rake-pipeline/filters/concat_filter.rb +63 -0
  118. data/vendor/rake-pipeline/lib/rake-pipeline/filters/gsub_filter.rb +56 -0
  119. data/vendor/rake-pipeline/lib/rake-pipeline/filters/ordering_concat_filter.rb +38 -0
  120. data/vendor/rake-pipeline/lib/rake-pipeline/filters/pipeline_finalizing_filter.rb +21 -0
  121. data/vendor/rake-pipeline/lib/rake-pipeline/graph.rb +178 -0
  122. data/vendor/rake-pipeline/lib/rake-pipeline/manifest.rb +82 -0
  123. data/vendor/rake-pipeline/lib/rake-pipeline/manifest_entry.rb +34 -0
  124. data/vendor/rake-pipeline/lib/rake-pipeline/matcher.rb +141 -0
  125. data/vendor/rake-pipeline/lib/rake-pipeline/middleware.rb +73 -0
  126. data/vendor/rake-pipeline/lib/rake-pipeline/precompile.rake +8 -0
  127. data/vendor/rake-pipeline/lib/rake-pipeline/project.rb +338 -0
  128. data/vendor/rake-pipeline/lib/rake-pipeline/rails_plugin.rb +10 -0
  129. data/vendor/rake-pipeline/lib/rake-pipeline/railtie.rb +34 -0
  130. data/vendor/rake-pipeline/lib/rake-pipeline/reject_matcher.rb +29 -0
  131. data/vendor/rake-pipeline/lib/rake-pipeline/server.rb +15 -0
  132. data/vendor/rake-pipeline/lib/rake-pipeline/sorted_pipeline.rb +19 -0
  133. data/vendor/rake-pipeline/lib/rake-pipeline/version.rb +6 -0
  134. data/vendor/rake-pipeline/rails/init.rb +2 -0
  135. data/vendor/rake-pipeline/rake-pipeline.gemspec +24 -0
  136. data/vendor/rake-pipeline/spec/cli_spec.rb +73 -0
  137. data/vendor/rake-pipeline/spec/concat_filter_spec.rb +37 -0
  138. data/vendor/rake-pipeline/spec/dsl/pipeline_dsl_spec.rb +165 -0
  139. data/vendor/rake-pipeline/spec/dsl/project_dsl_spec.rb +41 -0
  140. data/vendor/rake-pipeline/spec/dynamic_file_task_spec.rb +119 -0
  141. data/vendor/rake-pipeline/spec/encoding_spec.rb +106 -0
  142. data/vendor/rake-pipeline/spec/file_wrapper_spec.rb +132 -0
  143. data/vendor/rake-pipeline/spec/filter_spec.rb +367 -0
  144. data/vendor/rake-pipeline/spec/graph_spec.rb +56 -0
  145. data/vendor/rake-pipeline/spec/gsub_filter_spec.rb +87 -0
  146. data/vendor/rake-pipeline/spec/manifest_entry_spec.rb +46 -0
  147. data/vendor/rake-pipeline/spec/manifest_spec.rb +67 -0
  148. data/vendor/rake-pipeline/spec/matcher_spec.rb +141 -0
  149. data/vendor/rake-pipeline/spec/middleware_spec.rb +199 -0
  150. data/vendor/rake-pipeline/spec/ordering_concat_filter_spec.rb +42 -0
  151. data/vendor/rake-pipeline/spec/pipeline_spec.rb +232 -0
  152. data/vendor/rake-pipeline/spec/project_spec.rb +295 -0
  153. data/vendor/rake-pipeline/spec/rake_acceptance_spec.rb +720 -0
  154. data/vendor/rake-pipeline/spec/rake_tasks_spec.rb +21 -0
  155. data/vendor/rake-pipeline/spec/reject_matcher_spec.rb +31 -0
  156. data/vendor/rake-pipeline/spec/sorted_pipeline_spec.rb +27 -0
  157. data/vendor/rake-pipeline/spec/spec_helper.rb +38 -0
  158. data/vendor/rake-pipeline/spec/support/spec_helpers/file_utils.rb +35 -0
  159. data/vendor/rake-pipeline/spec/support/spec_helpers/filters.rb +37 -0
  160. data/vendor/rake-pipeline/spec/support/spec_helpers/input_helpers.rb +23 -0
  161. data/vendor/rake-pipeline/spec/support/spec_helpers/memory_file_wrapper.rb +35 -0
  162. data/vendor/rake-pipeline/spec/support/spec_helpers/memory_manifest.rb +19 -0
  163. data/vendor/rake-pipeline/tools/perfs +101 -0
  164. metadata +497 -0
@@ -0,0 +1,81 @@
1
+ require 'rake-pipeline'
2
+
3
+ module Rake
4
+ class Pipeline
5
+ class FileWrapper
6
+ include Benoit::FileWrapperExtensions
7
+
8
+ end
9
+ end
10
+ end
11
+
12
+ module Benoit
13
+ class PipelineProject
14
+ attr_reader :assetfile_path, :output_dir, :tmp_cache_dir, :project
15
+
16
+ def initialize(assetfile_path, output_dir=nil, tmp_cache_dir=nil)
17
+ @assetfile_path = assetfile_path
18
+ @output_dir = output_dir || default_output_dir
19
+ @tmp_cache_dir = tmp_cache_dir || default_cache_dir
20
+ @project = build_project!
21
+ end
22
+
23
+ def invoke
24
+ if Benoit.config.clean_before_build?
25
+ Benoit::Cleaner.run
26
+ end
27
+ project.pipelines.each do |pipeline|
28
+ pipeline.register_invocation_hook :after_task, BuildNotifiers::FileBuiltNotifier
29
+ pipeline.register_invocation_hook :before_filter, BuildNotifiers::ProgressNotifier
30
+ pipeline.register_invocation_hook :filters_ready, ->(pipeline){
31
+ require 'ostruct'
32
+ paths_map = {}
33
+ pipeline.output_files.each do |output|
34
+ input = output.original_inputs.first
35
+
36
+ wrapper = OpenStruct.new(path: output.path, read: input.read, fullpath: input.fullpath)
37
+
38
+ paths_map[input.path] = output.path
39
+
40
+ PageMetadata::Store.current[wrapper]
41
+
42
+ end
43
+
44
+ current_site = CurrentSite.load
45
+
46
+ current_site.paths_map = paths_map
47
+
48
+ # Load ALL filters (including filters within filters)
49
+ filters = recursively_load_filters_from_pipeline(pipeline)
50
+ filters.each do |filter|
51
+ if filter.respond_to? :current_site=
52
+ filter.current_site = current_site
53
+ end
54
+ end
55
+ }
56
+ end
57
+ project.invoke
58
+ end
59
+
60
+ private
61
+
62
+ def recursively_load_filters_from_pipeline(pipeline)
63
+ pipeline.filters.map do |filter|
64
+ if filter.respond_to? :filters
65
+ recursively_load_filters_from_pipeline(filter)
66
+ else
67
+ filter
68
+ end
69
+ end.flatten
70
+ end
71
+
72
+ def build_project!
73
+ output, tmp = [output_dir, tmp_cache_dir]
74
+ Rake::Pipeline::Project.new(@assetfile_path) do
75
+ output output
76
+ tmpdir tmp if tmp
77
+ end
78
+ end
79
+
80
+ end
81
+ end
@@ -0,0 +1,123 @@
1
+ #
2
+ # LoadsSiteContent.rb
3
+ # Benoit
4
+ #
5
+ # Created by Joseph Fiorini on 10/22/12.
6
+ # Copyright 2012 densitypop. All rights reserved.
7
+ #
8
+
9
+ require 'json'
10
+ require 'inflecto'
11
+ require 'cadenza/context_object'
12
+
13
+ module Benoit
14
+ class SiteContext
15
+
16
+ class ContextObject < ::Cadenza::ContextObject
17
+ def initialize(site)
18
+ @site = site
19
+ @pages = site.pages
20
+ end
21
+
22
+ def lookup_resource_collection(name)
23
+ singular_name = Inflecto.singularize(name)
24
+ collection = @pages.select do |page|
25
+ page["_type"] == singular_name
26
+ end
27
+
28
+ collection.map!(&:to_hash)
29
+ end
30
+
31
+ def paginated_collection(name)
32
+ potential_collection = @site.paginated_collections[name].last
33
+ if potential_collection.respond_to? :at_end?
34
+ potential_collection.rewind_list! if potential_collection.at_end?
35
+ return potential_collection
36
+ end
37
+
38
+ per_page = @site.paginated_collections[name].first
39
+ collection = lookup_resource_collection(name)
40
+
41
+ collection.paginate(per_page).tap do |coll|
42
+ @site.paginated_collections[name] << coll
43
+ end
44
+ end
45
+
46
+ def resource_collection(name)
47
+ lookup_resource_collection(name)
48
+ end
49
+
50
+ def method_missing(msg,*args)
51
+ name = msg.to_s
52
+ parsed_name = Inflecto.singularize(name).sub(/paginated_/, "")
53
+
54
+ valid_page = @pages.any? { |page| page.has_value?(parsed_name) }
55
+
56
+ if valid_page and name.start_with? "paginated_"
57
+ return paginated_collection(parsed_name)
58
+ elsif valid_page
59
+ return resource_collection(name)
60
+ else
61
+ super
62
+ end
63
+
64
+ end
65
+ alias_method :missing_context_method, :method_missing
66
+
67
+ end
68
+
69
+ def self.from_hash(context_attrs)
70
+ page_contexts = context_attrs.values.map do |context|
71
+ Page.from_hash(context)
72
+ end
73
+ new(page_contexts)
74
+ end
75
+
76
+ attr_reader :pages
77
+
78
+ attr_accessor :paths_map
79
+
80
+ def initialize(pages)
81
+ @pages = pages
82
+ end
83
+
84
+ def [](key)
85
+ key = paths_map[key] if paths_map.key?(key)
86
+ page_with_path(key)
87
+ end
88
+
89
+ def page_with_path(path)
90
+ @pages.find do |page|
91
+ page.permalink == "/#{path}"
92
+ end
93
+ end
94
+
95
+ def to_context
96
+ @context ||= ContextObject.new(self)
97
+ end
98
+
99
+ def paginated_collections
100
+ self.class.paginated_collections
101
+ end
102
+
103
+ def paginated_collection?(key)
104
+ unless self.class.paginated_collections.nil?
105
+ self.class.paginated_collections.key?(key)
106
+ end
107
+ end
108
+
109
+ def self.paginate_collection(collection, per_page)
110
+ @paginated_collections ||= Hash.new([])
111
+ @paginated_collections[collection] << per_page
112
+ end
113
+
114
+ def self.paginated_collections
115
+ @paginated_collections
116
+ end
117
+
118
+ def self.clear_paginated_collections!
119
+ @paginated_collections.clear if @paginated_collections
120
+ end
121
+
122
+ end
123
+ end
@@ -0,0 +1,77 @@
1
+ #
2
+ # TemplateLayoutLookup.rb
3
+ # Benoit
4
+ #
5
+ # Created by Joseph Fiorini on 10/29/12.
6
+ # Copyright 2012 densitypop. All rights reserved.
7
+ #
8
+
9
+ def FindsLayoutsForTemplate(input, options={})
10
+ Benoit::Utils::FindsLayoutsForTemplate.new(input, options).lookup_layouts
11
+ end
12
+
13
+ module Benoit::Utils
14
+
15
+
16
+ class FindsLayoutsForTemplate
17
+
18
+
19
+ FrontMatterLookupStrategy = ->(input) {
20
+ input =
21
+ if input.respond_to? :final_output and input.final_output
22
+ input.final_output
23
+ else
24
+ input
25
+ end
26
+ metadata = Benoit::PageMetadata::Store.current[input]
27
+ return unless metadata
28
+ metadata["layout"] || metadata["template"]
29
+ }
30
+
31
+ CadenzaInheritanceLookupStrategy = ->(input) {
32
+ extends_pattern = /\{% extends "([\.\w_-]+)" %\}/
33
+ return unless File.exist?(input.path)
34
+ match_data = File.read(input.path).match(extends_pattern)
35
+ return unless match_data
36
+ match_data.captures[0]
37
+ }
38
+
39
+ attr_reader :root, :template_path, :load_paths, :input
40
+
41
+ def initialize(input, options)
42
+ @load_paths = options.delete(:load_paths) || [""]
43
+ @root = options.delete(:root)
44
+ @template_path = input
45
+ @input = input
46
+ end
47
+
48
+ def lookup_layouts
49
+ recursively_lookup_layouts_for_file(input)
50
+ end
51
+
52
+ private
53
+
54
+ def recursively_lookup_layouts_for_file(input, template_list=[])
55
+
56
+ parent_template = call_strategy_for_file input, root
57
+
58
+ if parent_template
59
+ normalized_path = NormalizesPathToTemplate(parent_template, load_paths)
60
+ template_list << normalized_path
61
+ input = Rake::Pipeline::FileWrapper.new(Dir.pwd, normalized_path)
62
+ # TODO: Not a fan of Dir.pwd here, but it will always work. Is there a better way to get the correct input root?
63
+ recursively_lookup_layouts_for_file(input, template_list)
64
+ end
65
+
66
+ template_list
67
+ end
68
+
69
+ def call_strategy_for_file(input, root)
70
+ strategies = [FrontMatterLookupStrategy]
71
+ strategies.inject(nil) do |parent_template,strategy|
72
+ strategy.call(input) || parent_template
73
+ end
74
+ end
75
+
76
+ end
77
+ end
@@ -0,0 +1,43 @@
1
+ #
2
+ # NormalizesPathToTemplate.rb
3
+ # Benoit
4
+ #
5
+ # Created by Joseph Fiorini on 10/29/12.
6
+ # Copyright 2012 densitypop. All rights reserved.
7
+ #
8
+
9
+ def NormalizesPathToTemplate(template, load_paths)
10
+ Benoit::Utils::NormalizesPathToTemplate.new(template, load_paths).
11
+ normalize_path
12
+ end
13
+
14
+ module Benoit
15
+ module Utils
16
+ class NormalizesPathToTemplate
17
+ attr_accessor :template_path, :load_paths
18
+
19
+ def initialize(template_path, load_paths)
20
+ @template_path = template_path
21
+ @load_paths = load_paths
22
+ end
23
+
24
+ def normalize_path
25
+ return template_path if File.exist?(template_path) # Already normalized, just return it
26
+ load_paths.inject(template_path) do |actual_path,load_path|
27
+ path_to_try = actual_path
28
+ if not File.basename(path_to_try).start_with? "_"
29
+ path_to_try = File.join(File.dirname(path_to_try), "_#{File.basename(path_to_try)}")
30
+ end
31
+ path_to_try += ".html" unless File.extname(path_to_try) == ".html"
32
+ return path_to_try if File.exist?(path_to_try)
33
+ path_to_try = File.join(load_path, path_to_try)
34
+ if File.exist?(path_to_try)
35
+ path_to_try
36
+ else
37
+ actual_path
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,102 @@
1
+ module Enumerable
2
+ def paginate(per_page)
3
+ Benoit::Utils::PaginatedList.new(self, per_page)
4
+ end
5
+ end
6
+
7
+ module Benoit
8
+ module Utils
9
+ class PaginatedList
10
+ include Enumerable
11
+
12
+ attr_reader :per_page, :ops, :source, :enum
13
+
14
+ def initialize(list, per_page=nil, &block)
15
+ @ops = []
16
+ @list = list
17
+ @per_page = per_page
18
+ end
19
+
20
+
21
+ def each(&block)
22
+ run_queued_operations!
23
+ return paginate! && @enum unless block_given?
24
+ paginated.each do |page|
25
+ block.call(page)
26
+ end
27
+ end
28
+
29
+ def each_with_index(&block)
30
+ run_queued_operations!
31
+ paginated.each_with_index do |p,i|
32
+ block.call(p, i)
33
+ end
34
+ end
35
+
36
+ def paginate!
37
+ @enum ||= @list.each_slice(@per_page)
38
+ end
39
+
40
+ def paginated
41
+ paginate!
42
+ @enum.next
43
+ end
44
+
45
+ def sort_by(&block)
46
+ @ops << ->(list){
47
+ list.sort_by(&block)
48
+ }
49
+ self
50
+ end
51
+
52
+ def map(&block)
53
+ @ops << ->(list){
54
+ list.map(&block)
55
+ }
56
+ self
57
+ end
58
+
59
+ def take(n)
60
+ return self if @enum
61
+ @ops << ->(list){
62
+ list.take(n)
63
+ }
64
+ self
65
+ end
66
+
67
+ def reverse
68
+ return self if @enum
69
+ @ops << ->(list){
70
+ list.reverse
71
+ }
72
+ self
73
+ end
74
+
75
+ def peek
76
+ @enum.peek if @enum
77
+ end
78
+
79
+ def at_end?
80
+ return false if @enum.nil?
81
+ @enum.peek
82
+ false
83
+ rescue StopIteration
84
+ true
85
+ end
86
+
87
+ def rewind_list!
88
+ @enum.rewind
89
+ end
90
+
91
+ private
92
+
93
+ def run_queued_operations!
94
+ @list =
95
+ @ops.inject(@list) do |l,op|
96
+ op.call l
97
+ end
98
+ end
99
+
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,3 @@
1
+ module Benoit
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,20 @@
1
+ module BuildNotifiers
2
+ module FileBuiltNotifier
3
+
4
+ def self.call(pipeline,task)
5
+ if ProgressNotifier.finalizing?
6
+ path = task.name.sub(pipeline.output_root + "/", "")
7
+ notify_built(path, "success")
8
+ end
9
+ end
10
+
11
+ def self.notify_built(path, status="built")
12
+ if Benoit.config.output_mode == :app
13
+ puts({ type: status, path: path }.to_json)
14
+ else
15
+ puts "Built: #{path}"
16
+ end
17
+ end
18
+
19
+ end
20
+ end