benoit 0.1.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 (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