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,65 @@
1
+ require "benoit/page_metadata/store"
2
+ require "benoit/page_metadata/json_converter"
3
+
4
+ RSpec::Matchers.define :contain_page do |expected|
5
+ match do |actual|
6
+ page_name = expected
7
+ page_name.sub! /\./, "_"
8
+ expect(actual).to have_page(page_name)
9
+ value = actual[InputWrapper.new(page_name)]
10
+ expect(value).to eq(@metadata) if @metadata
11
+ end
12
+ chain :with_metadata do |metadata|
13
+ @metadata = metadata
14
+ end
15
+ end
16
+
17
+ include Benoit::PageMetadata
18
+ describe Benoit::PageMetadata do
19
+
20
+ let(:index_html_metadata) do
21
+ { "title" => "blah", "attr1" => "val1" }
22
+ end
23
+
24
+ let(:about_html_metadata) do
25
+ { "title" => "about", "attr2" => "val2" }
26
+ end
27
+
28
+ let(:existing_metadata) do
29
+ {
30
+ "__index_html_metadata" => index_html_metadata,
31
+ "__about_html_metadata" => about_html_metadata
32
+ }
33
+ end
34
+
35
+ describe JsonConverter do
36
+
37
+ let(:json) { existing_metadata.to_json }
38
+
39
+ it "loads all metadata into cache" do
40
+ JsonConverter.import!(json)
41
+ store = Benoit::PageMetadata::Store.current
42
+ expect(store).to contain_page("index.html").with_metadata(index_html_metadata)
43
+ expect(store).to contain_page("about.html").with_metadata(about_html_metadata)
44
+ end
45
+
46
+ it "exports all metadata currently in the cache" do
47
+ JsonConverter.import!(json)
48
+ new_json = JsonConverter.export
49
+ expect(new_json).to eq(json)
50
+ end
51
+
52
+ end
53
+
54
+
55
+ describe SiteContextConverter do
56
+
57
+ it "exports a hash with site paths instead of metadata keys" do
58
+ JsonConverter.import!(existing_metadata.to_json)
59
+ exported = SiteContextConverter.export
60
+ expect(exported.keys).to eq(["index_html", "about_html"])
61
+ end
62
+ end
63
+
64
+ end
65
+
@@ -0,0 +1,148 @@
1
+ require "json"
2
+ require "spec_helper"
3
+ require "spec_helpers/file_helpers"
4
+ require "benoit/page_metadata/store"
5
+ require "benoit/page_metadata/container"
6
+ require "benoit/page_metadata/parser"
7
+
8
+ class InputWrapper < Struct.new(:path, :read)
9
+ end
10
+
11
+ RSpec::Matchers.define :have_metadata do |expected|
12
+ match do |actual|
13
+ expect(actual).to have_key(expected)
14
+ expect(actual.fetch(expected)).to eq(@value) if @value
15
+ end
16
+ chain :with_value do |actual|
17
+ @value = actual
18
+ end
19
+ end
20
+
21
+ describe Benoit::PageMetadata::Store do
22
+ include FileHelpers
23
+
24
+ let(:content) do
25
+ <<-EOF.unindent
26
+ ---
27
+ title: blah
28
+ attr1: val1
29
+ attr2: val2
30
+ ---
31
+
32
+ THE CONTENT
33
+ EOF
34
+ end
35
+
36
+ let(:new_content) do
37
+ <<-EOF.unindent
38
+ ---
39
+ key1: blah1
40
+ key2: blah2
41
+ ---
42
+
43
+ THE CONTENT
44
+ EOF
45
+ end
46
+
47
+ let(:write_page) { write_file(input.path, input.read) }
48
+ let(:write_new_page) { write_file(input.path, new_content) }
49
+
50
+ let(:input) { InputWrapper.new("tmp/index.html", content) }
51
+
52
+ let(:store) { described_class.current }
53
+
54
+ before(:each) do
55
+ store.expire!
56
+ end
57
+
58
+ describe "the metadata hash" do
59
+
60
+ subject { write_page; store.import_from_page(input) }
61
+
62
+ it "contains the original content" do
63
+ expect(subject).to have_metadata("content").with_value("THE CONTENT\n")
64
+ end
65
+
66
+ it "contains additional attributes" do
67
+ expect(subject).to have_metadata("title").with_value("blah")
68
+ expect(subject).to have_metadata("attr1").with_value("val1")
69
+ expect(subject).to have_metadata("attr2").with_value("val2")
70
+ end
71
+
72
+ end
73
+
74
+ describe "without metadata" do
75
+
76
+
77
+ let(:content) { "THE CONTENT" }
78
+
79
+ subject { write_page; store.import_from_page(input) }
80
+
81
+
82
+ it "returns only original path" do
83
+ expect(subject).to eq({"_original_path" => input.path})
84
+ end
85
+
86
+ end
87
+
88
+ describe "memoizing" do
89
+
90
+ subject { write_page; store.import_from_page(input) }
91
+
92
+ it "keeps it from parsing again" do
93
+ write_new_page
94
+ new_input = InputWrapper.new("tmp/index.html", new_content)
95
+ new_metadata = store.import_from_page(new_input)
96
+ expect(new_metadata).to eq(subject)
97
+ end
98
+
99
+ it "always returns the same hash" do
100
+ write_new_page
101
+ new_input = InputWrapper.new("tmp/index.html", new_content)
102
+ new_metadata = store.import_from_page(new_input)
103
+ expect(new_metadata.object_id).to eq(subject.object_id)
104
+ end
105
+
106
+ end
107
+
108
+ describe "expiring the entire collection" do
109
+
110
+ subject { write_page; store.import_from_page(input) }
111
+
112
+ it "clears memoized keys, allowing new keys to be written" do
113
+ subject
114
+ store.expire!
115
+ write_new_page
116
+ new_input = InputWrapper.new("tmp/index.html", new_content)
117
+ new_metadata = store.import_from_page(new_input)
118
+ expect(new_metadata).to have_metadata("key1").with_value("blah1")
119
+ expect(new_metadata).to have_metadata("key2").with_value("blah2")
120
+ end
121
+
122
+ end
123
+
124
+ describe "accessing using [] notation" do
125
+
126
+ let(:input_no_metadata) { InputWrapper.new("tmp/blah.html", "") }
127
+ let(:default_hash) {
128
+ { "_original_path" => input_no_metadata.path }
129
+ }
130
+
131
+ it "caches on the first access" do
132
+ write_page
133
+ metadata = store[input]
134
+ new_metadata = store[input]
135
+ expect(metadata).to_not be_nil
136
+ expect(metadata.object_id).to eq(new_metadata.object_id)
137
+ end
138
+
139
+ it "returns default hash for empty pages" do
140
+ write_file input_no_metadata.path, input_no_metadata.read
141
+ no_metadata = store[input_no_metadata]
142
+ expect(no_metadata).to eq(default_hash)
143
+ end
144
+
145
+ end
146
+
147
+ end
148
+
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+ require 'benoit/page'
3
+
4
+ describe Benoit::Page do
5
+
6
+ let(:metadata) { { "blah" => "diddy" } }
7
+ subject { described_class.new(metadata) }
8
+
9
+ describe "page metadata" do
10
+ it "is accessible via []" do
11
+ expect(subject["blah"]).to eq("diddy")
12
+ end
13
+ it "allows changing attributes via []" do
14
+ subject["blah"] = "doo"
15
+ expect(subject["blah"]).to eq("doo")
16
+ end
17
+ end
18
+
19
+ end
@@ -0,0 +1,106 @@
1
+ require 'spec_helper'
2
+ require 'benoit/page'
3
+ require 'benoit/site_context'
4
+ require 'benoit/utils/paginated_list'
5
+
6
+ include Benoit
7
+
8
+ describe SiteContext do
9
+
10
+ subject { described_class.new(pages) }
11
+
12
+ describe "looking up pages" do
13
+ let(:output_page) { Page.new("_original_path" => output_path) }
14
+ let(:pages) { [output_page] }
15
+ let(:output_path) { "blah" }
16
+
17
+ it "uses paths map to normalize input paths to output paths" do
18
+ subject.paths_map = { "input" => output_path }
19
+ expect(subject["input"]).to eq(output_page)
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+
26
+ RSpec::Matchers.define :be_pointing_at_first_page do
27
+ match do |expected|
28
+ expected.peek == [pages.first]
29
+ end
30
+ end
31
+
32
+ describe SiteContext::ContextObject do
33
+
34
+ let(:type) { "post" }
35
+ let(:page) { {"_type" => type} }
36
+ let(:num_pages) { 2 }
37
+ let(:site) { SiteContext.new(pages) }
38
+ let(:context) { site.to_context }
39
+ let(:pages) do
40
+ (1..num_pages).map do |i|
41
+ page.merge("page" => i)
42
+ end
43
+ end
44
+
45
+ subject { context.posts }
46
+
47
+ after do
48
+ SiteContext.clear_paginated_collections!
49
+ end
50
+
51
+ it "returns posts from content collection via method call" do
52
+ expect(subject).to eq(pages)
53
+ end
54
+
55
+ describe "returns other types of content" do
56
+ let(:type) { "comic" }
57
+ subject { context.comics }
58
+
59
+ it { should eq(pages) }
60
+ end
61
+
62
+ describe "for non-existant collections" do
63
+ subject { context.blah }
64
+ it "raises an error" do
65
+ expect(->{subject}).to raise_error(NoMethodError)
66
+ end
67
+ end
68
+
69
+ describe "pagination" do
70
+ let(:num_pages) { 3 }
71
+ subject { context.paginated_posts }
72
+
73
+ before do
74
+ SiteContext.paginate_collection("posts", 1)
75
+ pages << {"posts_per_page" => 1}
76
+ end
77
+
78
+ it "collects resource names with per_page count" do
79
+ expect(site.paginated_collections["posts"]).to eq([1])
80
+ end
81
+
82
+ it "returns the collection sliced by page" do
83
+ collection = subject.each
84
+ expect(collection.next.first).to eq(pages.first)
85
+ expect(collection.next.first).to eq(pages[1])
86
+ expect(collection.next.first).to eq(pages[2])
87
+ end
88
+
89
+ it "returns the existing list if already set" do
90
+ list = context.paginated_collection("posts")
91
+ expect(context.paginated_collection("posts")).to eq(list)
92
+ end
93
+
94
+ it "rewinds the list if it is at the end" do
95
+ # Fast-forward list to end
96
+ 1.upto(num_pages) do
97
+ subject.each{|p|}
98
+ end
99
+ new_list = context.paginated_posts
100
+ expect{new_list.peek}.to_not raise_error(StopIteration)
101
+ expect(new_list).to be_pointing_at_first_page
102
+ end
103
+
104
+ end
105
+
106
+ end
@@ -0,0 +1,16 @@
1
+ require "bundler/setup"
2
+ require 'rake'
3
+
4
+ require "pry"
5
+ require "pry-nav"
6
+
7
+ require "spec_helpers/memory_file_wrapper"
8
+ require "spec_helpers/memory_manifest"
9
+
10
+
11
+ class String
12
+ def unindent
13
+ gsub(/^#{scan(/^\s*/).min_by{|l|l.length}}/, "")
14
+ end
15
+ end
16
+
@@ -0,0 +1,45 @@
1
+ module OutputFileSteps
2
+ extend Turnip::DSL
3
+
4
+ step "the output file should have content:" do |content|
5
+ step 'the output file "%s" should have content:' % @page.name, content
6
+ end
7
+
8
+ step "the output file should only have content:" do |content|
9
+ step 'the output file "%s" should only have content:' % @page.name, content
10
+ end
11
+
12
+ step "the output file :file_name should only contain the :ordinal :num :type" do |file_name,ordinal,num,type|
13
+ pages =
14
+ case ordinal
15
+ when "first"
16
+ @site.pages[0, num.to_i]
17
+ when "last"
18
+ @site.pages[-1 * num.to_i, num.to_i]
19
+ end
20
+ content = pages.map(&:content).join("\n") + "\n"
21
+ step 'the output file "%s" should only have content:' % file_name, content
22
+ end
23
+
24
+ step "the output file :file_name should exist" do |file_name|
25
+ file_name = File.join("_build", file_name)
26
+ step 'a file named "%s" should exist' % file_name
27
+ end
28
+
29
+ step "the output file :file_name should have content:" do |file_name, content|
30
+ file_name = File.join("_build", file_name)
31
+ step 'the file "%s" should contain:' % file_name, content
32
+ end
33
+
34
+ step "the output file :file_name should only have content:" do |file_name, content|
35
+ file_name = File.join("_build", file_name)
36
+ step 'the file "%s" should contain exactly:' % file_name, content
37
+ end
38
+
39
+ step "the output file :file_name should match :pattern" do |file_name, pattern|
40
+ file_name = File.join("_build", file_name)
41
+ step 'the file "%s" should match /%s/' % [file_name, pattern]
42
+ end
43
+
44
+
45
+ end
@@ -0,0 +1,71 @@
1
+ module RunSteps
2
+ extend ::Turnip::DSL
3
+
4
+ step "I run :cmd" do |cmd|
5
+ run_simple(unescape(cmd), false)
6
+ end
7
+
8
+ step "I successfully run :cmd" do |cmd|
9
+ run_simple(unescape(cmd))
10
+ end
11
+
12
+ step "a directory named :directory should exist" do |directory|
13
+ if directory =~ /^~/
14
+ directory = File.expand_path(directory)
15
+ end
16
+ check_directory_presence([directory], true)
17
+ end
18
+
19
+ step "an empty file named :file_name" do |file_name|
20
+ write_file(file_name, "")
21
+ end
22
+
23
+ step "a file named :file_name with content:" do |file_name, content|
24
+ write_file(file_name, content)
25
+ end
26
+
27
+ step "the file :file_name should contain exactly:" do |file_name, partial_content|
28
+ check_exact_file_content(file_name, partial_content)
29
+ end
30
+
31
+ step "the file :file_name should contain:" do |file_name, partial_content|
32
+ check_file_content(file_name, partial_content, true)
33
+ end
34
+
35
+ step "the file :file_name should match :pattern" do |file_name, pattern|
36
+ check_file_content(file_name, /#{pattern}/, true)
37
+ end
38
+
39
+ step "I cd to :directory" do |directory|
40
+ cd directory
41
+ end
42
+
43
+ step "I remove the file :file_name" do |file_name|
44
+ remove_file(file_name)
45
+ end
46
+
47
+ step "a :size byte file named :file_name should exist" do |file_size, file_name|
48
+ check_file_size([[file_name, file_size.to_i]])
49
+ end
50
+
51
+ step "a file named :file_name should exist" do |file_name|
52
+ check_file_presence([file_name], true)
53
+ end
54
+
55
+ step "a file named :file_name should not exist" do |file_name|
56
+ check_file_presence([file_name], false)
57
+ end
58
+
59
+ placeholder :cmd do
60
+ match /`([^`]*)`/ do |cmd|
61
+ cmd
62
+ end
63
+ end
64
+
65
+ placeholder :pattern do
66
+ match /\/([^\/]*)\/$/ do |pattern|
67
+ pattern
68
+ end
69
+ end
70
+
71
+ end