benoit 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/.gitmodules +3 -0
- data/.rspec +1 -0
- data/.rspec-turnip +1 -0
- data/.ruby-version +1 -0
- data/Assetfile +44 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +110 -0
- data/Rakefile +9 -0
- data/benoit.gemspec +50 -0
- data/bin/benoit +121 -0
- data/bin/bundle-development +1 -0
- data/bin/bundle-sandbox +1 -0
- data/lib/benoit.rb +36 -0
- data/lib/benoit/cadenza.rb +11 -0
- data/lib/benoit/cadenza/output_filters.rb +21 -0
- data/lib/benoit/cleaner.rb +10 -0
- data/lib/benoit/compiler_error.rb +49 -0
- data/lib/benoit/configuration.rb +24 -0
- data/lib/benoit/current_site.rb +12 -0
- data/lib/benoit/file_wrapper_extensions.rb +13 -0
- data/lib/benoit/filters.rb +15 -0
- data/lib/benoit/filters/base_filter.rb +44 -0
- data/lib/benoit/filters/blacklist_filter.rb +18 -0
- data/lib/benoit/filters/cadenza_filter.rb +75 -0
- data/lib/benoit/filters/content_page_filter.rb +45 -0
- data/lib/benoit/filters/markdown_filter.rb +19 -0
- data/lib/benoit/filters/metadata_cleaner.rb +30 -0
- data/lib/benoit/filters/move_to_root_filter.rb +22 -0
- data/lib/benoit/filters/pagination_filter.rb +23 -0
- data/lib/benoit/filters/pass_thru_filter.rb +22 -0
- data/lib/benoit/filters/sass_filter.rb +74 -0
- data/lib/benoit/filters/set_metadata_filter.rb +15 -0
- data/lib/benoit/logger.rb +69 -0
- data/lib/benoit/page.rb +88 -0
- data/lib/benoit/page_metadata.rb +8 -0
- data/lib/benoit/page_metadata/container.rb +74 -0
- data/lib/benoit/page_metadata/json_converter.rb +28 -0
- data/lib/benoit/page_metadata/parser.rb +38 -0
- data/lib/benoit/page_metadata/store.rb +75 -0
- data/lib/benoit/pipeline.rb +1 -0
- data/lib/benoit/pipeline/dsl_extensions.rb +8 -0
- data/lib/benoit/pipeline/pagination_matcher.rb +53 -0
- data/lib/benoit/pipeline_project.rb +81 -0
- data/lib/benoit/site_context.rb +123 -0
- data/lib/benoit/utils/finds_layouts_for_template.rb +77 -0
- data/lib/benoit/utils/normalizes_path_to_template.rb +43 -0
- data/lib/benoit/utils/paginated_list.rb +102 -0
- data/lib/benoit/version.rb +3 -0
- data/lib/build_notifiers/file_built_notifier.rb +20 -0
- data/lib/build_notifiers/progress_notifier.rb +57 -0
- data/lib/cli.rb +39 -0
- data/spec/.rbenv-gemsets +1 -0
- data/spec/Gemfile +9 -0
- data/spec/Gemfile.lock +57 -0
- data/spec/bin/autospec +16 -0
- data/spec/bin/cucumber +16 -0
- data/spec/bin/htmldiff +16 -0
- data/spec/bin/ldiff +16 -0
- data/spec/bin/rspec +16 -0
- data/spec/features/build_command.feature +46 -0
- data/spec/features/frontmatter_metadata.feature +99 -0
- data/spec/features/javascript_files.feature +35 -0
- data/spec/features/output_filters.feature +20 -0
- data/spec/features/page_layouts.feature +72 -0
- data/spec/features/pagination.feature +58 -0
- data/spec/features/sass_files.feature +30 -0
- data/spec/features/version.feature +5 -0
- data/spec/lib/filters/base_filter_spec.rb +141 -0
- data/spec/lib/filters/markdown_filter_spec.rb +65 -0
- data/spec/lib/filters/sass_filter_spec.rb +73 -0
- data/spec/lib/metadata_json_converter_spec.rb +65 -0
- data/spec/lib/metadata_store_spec.rb +148 -0
- data/spec/lib/page_spec.rb +19 -0
- data/spec/lib/site_context_spec.rb +106 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/steps/output_file_steps.rb +45 -0
- data/spec/steps/run_steps.rb +71 -0
- data/spec/steps/staticly_steps.rb +194 -0
- data/spec/support/aruba/rspec.rb +66 -0
- data/spec/support/files/img.png +0 -0
- data/spec/support/files/input.css.scss +7 -0
- data/spec/support/files/input.scss +7 -0
- data/spec/support/spec_helpers/file_helpers.rb +8 -0
- data/spec/support/spec_helpers/memory_file_wrapper.rb +43 -0
- data/spec/support/spec_helpers/memory_manifest.rb +19 -0
- data/spec/turnip_helper.rb +19 -0
- data/vendor/frontmatter/frontmatter.gemspec +24 -0
- data/vendor/frontmatter/lib/frontmatter.rb +92 -0
- data/vendor/frontmatter/lib/frontmatter/version.rb +3 -0
- data/vendor/rake-pipeline/.gitignore +18 -0
- data/vendor/rake-pipeline/.rspec +1 -0
- data/vendor/rake-pipeline/.travis.yml +12 -0
- data/vendor/rake-pipeline/.yardopts +2 -0
- data/vendor/rake-pipeline/GETTING_STARTED.md +268 -0
- data/vendor/rake-pipeline/Gemfile +14 -0
- data/vendor/rake-pipeline/LICENSE +20 -0
- data/vendor/rake-pipeline/README.markdown +11 -0
- data/vendor/rake-pipeline/README.yard +178 -0
- data/vendor/rake-pipeline/Rakefile +21 -0
- data/vendor/rake-pipeline/bin/rakep +4 -0
- data/vendor/rake-pipeline/examples/copying_files.md +12 -0
- data/vendor/rake-pipeline/examples/minifying_files.md +37 -0
- data/vendor/rake-pipeline/examples/modifying_pipelines.md +67 -0
- data/vendor/rake-pipeline/examples/multiple_pipelines.md +77 -0
- data/vendor/rake-pipeline/lib/generators/rake/pipeline/install/install_generator.rb +70 -0
- data/vendor/rake-pipeline/lib/rake-pipeline.rb +509 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/cli.rb +57 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/dsl.rb +9 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/dsl/pipeline_dsl.rb +246 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/dsl/project_dsl.rb +108 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/dynamic_file_task.rb +194 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/error.rb +17 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/file_wrapper.rb +195 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/filter.rb +267 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/filters.rb +4 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/filters/concat_filter.rb +63 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/filters/gsub_filter.rb +56 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/filters/ordering_concat_filter.rb +38 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/filters/pipeline_finalizing_filter.rb +21 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/graph.rb +178 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/manifest.rb +82 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/manifest_entry.rb +34 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/matcher.rb +141 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/middleware.rb +73 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/precompile.rake +8 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/project.rb +338 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/rails_plugin.rb +10 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/railtie.rb +34 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/reject_matcher.rb +29 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/server.rb +15 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/sorted_pipeline.rb +19 -0
- data/vendor/rake-pipeline/lib/rake-pipeline/version.rb +6 -0
- data/vendor/rake-pipeline/rails/init.rb +2 -0
- data/vendor/rake-pipeline/rake-pipeline.gemspec +24 -0
- data/vendor/rake-pipeline/spec/cli_spec.rb +73 -0
- data/vendor/rake-pipeline/spec/concat_filter_spec.rb +37 -0
- data/vendor/rake-pipeline/spec/dsl/pipeline_dsl_spec.rb +165 -0
- data/vendor/rake-pipeline/spec/dsl/project_dsl_spec.rb +41 -0
- data/vendor/rake-pipeline/spec/dynamic_file_task_spec.rb +119 -0
- data/vendor/rake-pipeline/spec/encoding_spec.rb +106 -0
- data/vendor/rake-pipeline/spec/file_wrapper_spec.rb +132 -0
- data/vendor/rake-pipeline/spec/filter_spec.rb +367 -0
- data/vendor/rake-pipeline/spec/graph_spec.rb +56 -0
- data/vendor/rake-pipeline/spec/gsub_filter_spec.rb +87 -0
- data/vendor/rake-pipeline/spec/manifest_entry_spec.rb +46 -0
- data/vendor/rake-pipeline/spec/manifest_spec.rb +67 -0
- data/vendor/rake-pipeline/spec/matcher_spec.rb +141 -0
- data/vendor/rake-pipeline/spec/middleware_spec.rb +199 -0
- data/vendor/rake-pipeline/spec/ordering_concat_filter_spec.rb +42 -0
- data/vendor/rake-pipeline/spec/pipeline_spec.rb +232 -0
- data/vendor/rake-pipeline/spec/project_spec.rb +295 -0
- data/vendor/rake-pipeline/spec/rake_acceptance_spec.rb +720 -0
- data/vendor/rake-pipeline/spec/rake_tasks_spec.rb +21 -0
- data/vendor/rake-pipeline/spec/reject_matcher_spec.rb +31 -0
- data/vendor/rake-pipeline/spec/sorted_pipeline_spec.rb +27 -0
- data/vendor/rake-pipeline/spec/spec_helper.rb +38 -0
- data/vendor/rake-pipeline/spec/support/spec_helpers/file_utils.rb +35 -0
- data/vendor/rake-pipeline/spec/support/spec_helpers/filters.rb +37 -0
- data/vendor/rake-pipeline/spec/support/spec_helpers/input_helpers.rb +23 -0
- data/vendor/rake-pipeline/spec/support/spec_helpers/memory_file_wrapper.rb +35 -0
- data/vendor/rake-pipeline/spec/support/spec_helpers/memory_manifest.rb +19 -0
- data/vendor/rake-pipeline/tools/perfs +101 -0
- metadata +497 -0
@@ -0,0 +1,194 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
class TestSite
|
3
|
+
include Aruba::Api
|
4
|
+
attr_reader :name
|
5
|
+
attr_reader :pages
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@pages = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_page(page)
|
12
|
+
@pages << page
|
13
|
+
end
|
14
|
+
|
15
|
+
def delete_page(page)
|
16
|
+
@pages = @pages.reject { |p| p.name == page.name }
|
17
|
+
end
|
18
|
+
|
19
|
+
def generate_name
|
20
|
+
@name = "site_#{Time.now.to_i}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Page
|
25
|
+
attr_reader :metadata, :name
|
26
|
+
attr_accessor :content
|
27
|
+
|
28
|
+
def initialize(name=nil)
|
29
|
+
@name = name
|
30
|
+
@metadata = {}
|
31
|
+
end
|
32
|
+
|
33
|
+
def add_metadata(yaml)
|
34
|
+
YAML.load(yaml).tap do |m|
|
35
|
+
@metadata.merge! m
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def generate_name(extname)
|
40
|
+
num = 1_000_000 + Random.rand(10_000_000 - 1_000_000)
|
41
|
+
@name = "page_#{num}#{extname}"
|
42
|
+
end
|
43
|
+
|
44
|
+
def frontmatter(hash)
|
45
|
+
unless hash.empty?
|
46
|
+
%{#{hash.to_yaml}
|
47
|
+
---}.gsub(/^\s+/, "")
|
48
|
+
end.to_s
|
49
|
+
end
|
50
|
+
|
51
|
+
def full_content
|
52
|
+
%{#{frontmatter(metadata)}
|
53
|
+
|
54
|
+
#{@content}}.gsub(/^\s+/, "")
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
module BenoitSteps
|
60
|
+
extend Turnip::DSL
|
61
|
+
|
62
|
+
def create_file_for_page(page, include_metadata=true)
|
63
|
+
content = if include_metadata
|
64
|
+
page.full_content
|
65
|
+
else
|
66
|
+
page.content
|
67
|
+
end
|
68
|
+
step "a file named \"#{page.name}\" with content:", content
|
69
|
+
end
|
70
|
+
|
71
|
+
def delete_file_for_page(page)
|
72
|
+
step 'I remove the file "%s"' % page.name
|
73
|
+
end
|
74
|
+
|
75
|
+
step "I see the current Benoit version" do
|
76
|
+
require_relative "../../lib/benoit/version"
|
77
|
+
assert_partial_output(Benoit::VERSION, all_output)
|
78
|
+
end
|
79
|
+
|
80
|
+
step "a site" do
|
81
|
+
@site = TestSite.new
|
82
|
+
@site.generate_name
|
83
|
+
step "a site named #{@site.name}"
|
84
|
+
end
|
85
|
+
|
86
|
+
step "a site named :site" do |site|
|
87
|
+
create_dir site
|
88
|
+
step 'I cd to "%s"' % site
|
89
|
+
step 'an empty file named "index.html"'
|
90
|
+
end
|
91
|
+
|
92
|
+
step "a cache directory should exist for that site" do
|
93
|
+
path = File.expand_path(File.join("~", ".benoit", "tmpcache", @site.name))
|
94
|
+
step 'a directory named "%s" should exist' % path
|
95
|
+
end
|
96
|
+
|
97
|
+
step ":file_name should not exist in the output site" do |file_name|
|
98
|
+
file_name = File.join("_build", file_name)
|
99
|
+
step 'a file named "%s" should not exist' % file_name
|
100
|
+
end
|
101
|
+
|
102
|
+
step "I build the site" do
|
103
|
+
step "I successfully run `benoit build`"
|
104
|
+
end
|
105
|
+
|
106
|
+
step "I build the site with the flag :flag" do |flag|
|
107
|
+
step "I successfully run `benoit build #{flag}`"
|
108
|
+
end
|
109
|
+
|
110
|
+
step ":n files containing metadata:" do |n, yaml_snippet|
|
111
|
+
n.to_i.times do |i|
|
112
|
+
yaml = yaml_snippet + "\npage_num: #{i}"
|
113
|
+
step 'a file with an extension of ".html" containing metadata:', yaml
|
114
|
+
step 'that file has content:', i.to_s
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
step "a file" do
|
119
|
+
step 'a file with an extension of ".html"'
|
120
|
+
end
|
121
|
+
|
122
|
+
step "a file with an extension of :extname" do |extname|
|
123
|
+
@page = Page.new
|
124
|
+
@page.generate_name(extname)
|
125
|
+
@site.add_page @page
|
126
|
+
create_file_for_page @page
|
127
|
+
end
|
128
|
+
|
129
|
+
step "a file containing metadata:" do |yaml_snippet|
|
130
|
+
step 'a file with an extension of ".html" containing metadata:', yaml_snippet
|
131
|
+
end
|
132
|
+
|
133
|
+
step "a file named :file_name containing metadata:" do |file_name,yaml_snippet|
|
134
|
+
@page = Page.new(file_name)
|
135
|
+
@site.add_page @page
|
136
|
+
@page.add_metadata yaml_snippet
|
137
|
+
create_file_for_page @page
|
138
|
+
end
|
139
|
+
|
140
|
+
step "a file with an extension of :extname containing metadata:" do |extname, yaml_snippet|
|
141
|
+
@page = Page.new
|
142
|
+
@page.generate_name(extname)
|
143
|
+
@site.add_page @page
|
144
|
+
@page.add_metadata yaml_snippet
|
145
|
+
create_file_for_page @page
|
146
|
+
end
|
147
|
+
|
148
|
+
step "a file wih an extension of :extname with content:" do |extname, content|
|
149
|
+
@page = Page.new
|
150
|
+
@page.generate_name(extname)
|
151
|
+
@site.add_page @page
|
152
|
+
@page.content = content
|
153
|
+
create_file_for_page @page, false
|
154
|
+
end
|
155
|
+
|
156
|
+
step "that file has content:" do |content|
|
157
|
+
@page.content = content
|
158
|
+
create_file_for_page @page
|
159
|
+
end
|
160
|
+
|
161
|
+
step "a layout named :name with content:" do |name, content|
|
162
|
+
name = "_layouts/" + name + ".html" unless File.extname(name) == ".html"
|
163
|
+
@layout = Page.new(name)
|
164
|
+
@layout.content = content
|
165
|
+
@site.add_page @layout
|
166
|
+
create_file_for_page @layout
|
167
|
+
end
|
168
|
+
|
169
|
+
step "I delete the file" do
|
170
|
+
@site.delete_page @page
|
171
|
+
delete_file_for_page @page
|
172
|
+
end
|
173
|
+
|
174
|
+
step "the site has a file that is an image" do
|
175
|
+
@image_path = "spec/support/files/img.png"
|
176
|
+
img_content = File.read(@image_path)
|
177
|
+
write_file("img.png", img_content)
|
178
|
+
end
|
179
|
+
|
180
|
+
step "that file should not exist in the output site" do
|
181
|
+
path = File.join("_build", @page.name)
|
182
|
+
step 'a file named "%s" should not exist' % path
|
183
|
+
end
|
184
|
+
|
185
|
+
step "that file should exist in the output site" do
|
186
|
+
path = File.join("_build", @page.name)
|
187
|
+
step 'a file named "%s" should exist' % path
|
188
|
+
end
|
189
|
+
|
190
|
+
step "the image should exist in the output site" do
|
191
|
+
step 'a file named "%s" should exist' % ["_build/img.png"]
|
192
|
+
end
|
193
|
+
|
194
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'aruba'
|
2
|
+
require 'aruba/api'
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
config.include Aruba::Api
|
6
|
+
|
7
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
8
|
+
|
9
|
+
config.before :each, :"disable-bundler" do
|
10
|
+
unset_bundler_env_vars
|
11
|
+
end
|
12
|
+
|
13
|
+
config.before :each do
|
14
|
+
@__aruba_original_paths = (ENV['PATH'] || '').split(File::PATH_SEPARATOR)
|
15
|
+
ENV['PATH'] = ([File.expand_path('bin')] + @__aruba_original_paths).join(File::PATH_SEPARATOR)
|
16
|
+
end
|
17
|
+
|
18
|
+
config.after :each do
|
19
|
+
ENV['PATH'] = @__aruba_original_paths.join(File::PATH_SEPARATOR)
|
20
|
+
end
|
21
|
+
|
22
|
+
config.before :each do
|
23
|
+
FileUtils.rm_rf(current_dir) unless example.metadata[:"no-clobber"]
|
24
|
+
end
|
25
|
+
|
26
|
+
config.before :each, :puts do
|
27
|
+
@puts = true
|
28
|
+
end
|
29
|
+
|
30
|
+
config.before :each, :"announce-cmd" do
|
31
|
+
@announce_cmd = true
|
32
|
+
end
|
33
|
+
|
34
|
+
config.before :each, :"announce-dir" do
|
35
|
+
@announce_dir = true
|
36
|
+
end
|
37
|
+
|
38
|
+
config.before :each, :"announce-stdout" do
|
39
|
+
@announce_stdout = true
|
40
|
+
end
|
41
|
+
|
42
|
+
config.before :each, :"announce-stderr" do
|
43
|
+
@announce_stderr = true
|
44
|
+
end
|
45
|
+
|
46
|
+
config.before :each, :"announce-env" do
|
47
|
+
@announce_end = true
|
48
|
+
end
|
49
|
+
|
50
|
+
config.before :each, :announce do
|
51
|
+
@announce_stdout = true
|
52
|
+
@announce_stderr = true
|
53
|
+
@announce_cmd = true
|
54
|
+
@announce_dir = true
|
55
|
+
@announce_env = true
|
56
|
+
end
|
57
|
+
|
58
|
+
config.before :each, :ansi do
|
59
|
+
@aruba_keep_ansi = true
|
60
|
+
end
|
61
|
+
|
62
|
+
config.after :each do
|
63
|
+
restore_env
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
Binary file
|
@@ -0,0 +1,43 @@
|
|
1
|
+
class Rake::Pipeline
|
2
|
+
module SpecHelpers
|
3
|
+
class MemoryFileWrapper < Struct.new(:root, :path, :encoding, :original_inputs, :body)
|
4
|
+
|
5
|
+
@@files = {}
|
6
|
+
@@data = {}
|
7
|
+
|
8
|
+
def self.files
|
9
|
+
@@files
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.data
|
13
|
+
@@data
|
14
|
+
end
|
15
|
+
|
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([])
|
22
|
+
end
|
23
|
+
|
24
|
+
def fullpath
|
25
|
+
File.join(root, path)
|
26
|
+
end
|
27
|
+
|
28
|
+
def create
|
29
|
+
@@files[fullpath] = self
|
30
|
+
self.body = ""
|
31
|
+
yield
|
32
|
+
end
|
33
|
+
|
34
|
+
def read
|
35
|
+
body || @@data[fullpath] || ""
|
36
|
+
end
|
37
|
+
|
38
|
+
def write(contents)
|
39
|
+
self.body << contents
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Rake::Pipeline
|
2
|
+
module SpecHelpers
|
3
|
+
class MemoryManifest
|
4
|
+
def initialize
|
5
|
+
@entries = {}
|
6
|
+
end
|
7
|
+
|
8
|
+
# Look up an entry by filename.
|
9
|
+
def [](key)
|
10
|
+
@entries[key]
|
11
|
+
end
|
12
|
+
|
13
|
+
# Set an entry
|
14
|
+
def []=(key, value)
|
15
|
+
@entries[key] = value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'aruba/rspec' # loaded from spec/support
|
2
|
+
require 'turnip/kanban'
|
3
|
+
|
4
|
+
module Benoit
|
5
|
+
end
|
6
|
+
|
7
|
+
Dir["spec/steps/**/*.rb"].each do |step_file|
|
8
|
+
load step_file
|
9
|
+
end
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.include RunSteps
|
13
|
+
config.include BenoitSteps
|
14
|
+
|
15
|
+
config.before :each do
|
16
|
+
@aruba_timeout_seconds = 10
|
17
|
+
FileUtils.rm_rf File.expand_path("~/.benoit/tmpcache")
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "frontmatter/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "frontmatter"
|
7
|
+
s.version = Frontmatter::VERSION
|
8
|
+
s.authors = ["docunext"]
|
9
|
+
s.email = ["albert.lash@docunext.com"]
|
10
|
+
s.homepage = "http://www.docunext.com/wiki/YAML"
|
11
|
+
s.summary = %q{A gem to handle front matter}
|
12
|
+
s.description = %q{This gem is all about frontmatter.}
|
13
|
+
|
14
|
+
s.rubyforge_project = "frontmatter"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
s.add_development_dependency "cucumber"
|
23
|
+
# s.add_runtime_dependency "rest-client"
|
24
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module FrontMatter
|
2
|
+
|
3
|
+
REGEX = /^(?<metadata>---\s*\n.*?\n?)^(---\s*$\n?)/m
|
4
|
+
INSPECT = 13
|
5
|
+
PARSER = Psych
|
6
|
+
REQUIRED = [:title, :date, :content]
|
7
|
+
OPTIONAL = [:author, :categories, :tags, :id, :layout, :template, :permalink, :published, :publish_path]
|
8
|
+
|
9
|
+
# Quick check to discover if a file might have frontmatter in it.
|
10
|
+
# Only checks if the first line starts with "---"
|
11
|
+
#
|
12
|
+
# path_to_file - the canonical path the the file
|
13
|
+
#
|
14
|
+
# Returns boolean
|
15
|
+
def self.file_might_have_frontmatter?(path_to_file)
|
16
|
+
File.open(path_to_file){|f| f.readline}[0..2] == '---'
|
17
|
+
end
|
18
|
+
|
19
|
+
# A more definitive check to find if a file has frontmatter in it.
|
20
|
+
# Since we are reading the file, we want to be prudent with with
|
21
|
+
# memory and only check LINES_TO_INSPECT
|
22
|
+
#
|
23
|
+
# path_to_file - the canonical path to the file
|
24
|
+
#
|
25
|
+
# Returns boolean
|
26
|
+
def self.file_has_frontmatter?(path_to_file)
|
27
|
+
IO.readlines(path_to_file,INSPECT).join =~ REGEX ? true : false
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
# Checks a string to find if it has valid frontmatter
|
32
|
+
#
|
33
|
+
# text - string containing frontmatter
|
34
|
+
#
|
35
|
+
# Returns boolean
|
36
|
+
def self.has_valid_frontmatter?(text)
|
37
|
+
front_matter = self.parse(text)
|
38
|
+
self.valid_frontmatter?(front_matter)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Checks a hash to find if it has valid frontmatter
|
42
|
+
#
|
43
|
+
# front_matter - the frontmatter hash
|
44
|
+
#
|
45
|
+
# Returns boolean
|
46
|
+
def self.valid_frontmatter?(front_matter)
|
47
|
+
allkeys = REQUIRED
|
48
|
+
allkeys.concat(OPTIONAL)
|
49
|
+
REQUIRED.each {|key| front_matter.has_key?(key) }.all? &&
|
50
|
+
front_matter.keys.each{|key| allkeys.include?(key) }.all?
|
51
|
+
end
|
52
|
+
|
53
|
+
# Check if the text has front matter
|
54
|
+
#
|
55
|
+
# text - the string to check
|
56
|
+
#
|
57
|
+
# Returns boolean
|
58
|
+
def self.has_frontmatter?(text)
|
59
|
+
text =~ REGEX ? true : false
|
60
|
+
end
|
61
|
+
|
62
|
+
# Load a file and parse the frontmatter
|
63
|
+
#
|
64
|
+
# path_to_file
|
65
|
+
#
|
66
|
+
# Returns a hash.
|
67
|
+
def self.file_parse(path_to_file)
|
68
|
+
text = File.open(path_to_file){|f| f.read}
|
69
|
+
front_matter = self.parse(text)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Parse the YAML frontmatter.
|
73
|
+
#
|
74
|
+
# text - The String path to the frontmatter and the content.
|
75
|
+
#
|
76
|
+
# Returns a hash containing the parsed frontmatter data and the content.
|
77
|
+
def self.parse(text)
|
78
|
+
|
79
|
+
front_matter = Hash.new
|
80
|
+
|
81
|
+
if md = text.match(REGEX)
|
82
|
+
front_matter['content'] = md.post_match
|
83
|
+
front_matter.merge!(PARSER.load(md[:metadata]))
|
84
|
+
end
|
85
|
+
|
86
|
+
front_matter
|
87
|
+
|
88
|
+
rescue => e
|
89
|
+
puts "YAML Exception reading #{name}: #{e.message}"
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|