mint 0.7.3 → 0.8.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.
- checksums.yaml +7 -0
- data/Gemfile +23 -14
- data/LICENSE +22 -0
- data/README.md +82 -56
- data/bin/mint +47 -10
- data/bin/mint-epub +1 -4
- data/config/templates/base/style.css +187 -0
- data/config/templates/default/css/style.css +126 -79
- data/config/templates/default/layout.erb +10 -0
- data/config/templates/default/style.css +237 -0
- data/config/templates/garden/layout.erb +38 -0
- data/config/templates/garden/style.css +303 -0
- data/config/templates/newspaper/layout.erb +16 -0
- data/config/templates/nord/layout.erb +11 -0
- data/config/templates/nord/style.css +339 -0
- data/config/templates/nord-dark/layout.erb +11 -0
- data/config/templates/nord-dark/style.css +339 -0
- data/config/templates/protocol/layout.erb +9 -0
- data/config/templates/protocol/style.css +25 -0
- data/config/templates/zen/layout.erb +11 -0
- data/config/templates/zen/style.css +114 -0
- data/lib/mint/command_line.rb +253 -111
- data/lib/mint/css.rb +11 -4
- data/lib/mint/css_template.rb +37 -0
- data/lib/mint/document.rb +193 -43
- data/lib/mint/helpers.rb +50 -10
- data/lib/mint/layout.rb +2 -3
- data/lib/mint/markdown_template.rb +47 -0
- data/lib/mint/mint.rb +181 -114
- data/lib/mint/plugin.rb +3 -3
- data/lib/mint/plugins/epub.rb +1 -2
- data/lib/mint/resource.rb +19 -9
- data/lib/mint/style.rb +10 -14
- data/lib/mint/version.rb +1 -1
- data/lib/mint.rb +1 -0
- data/man/mint.1 +135 -0
- data/spec/cli/README.md +99 -0
- data/spec/cli/argument_parsing_spec.rb +207 -0
- data/spec/cli/bin_integration_spec.rb +348 -0
- data/spec/cli/configuration_management_spec.rb +363 -0
- data/spec/cli/full_workflow_integration_spec.rb +527 -0
- data/spec/cli/publish_workflow_spec.rb +368 -0
- data/spec/cli/template_management_spec.rb +300 -0
- data/spec/css_spec.rb +1 -1
- data/spec/document_spec.rb +105 -68
- data/spec/helpers_spec.rb +42 -42
- data/spec/mint_spec.rb +104 -80
- data/spec/plugin_spec.rb +86 -88
- data/spec/run_cli_tests.rb +95 -0
- data/spec/spec_helper.rb +8 -1
- data/spec/style_spec.rb +18 -16
- data/spec/support/cli_helpers.rb +169 -0
- data/spec/support/fixtures/content-2.md +16 -0
- data/spec/support/matchers.rb +1 -1
- metadata +145 -167
- data/config/syntax.yaml +0 -71
- data/config/templates/base/style.sass +0 -144
- data/config/templates/default/layout.haml +0 -8
- data/config/templates/default/style.sass +0 -36
- data/config/templates/protocol/layout.haml +0 -7
- data/config/templates/protocol/style.sass +0 -20
- data/config/templates/zen/css/style.css +0 -145
- data/config/templates/zen/layout.haml +0 -7
- data/config/templates/zen/style.sass +0 -24
- data/features/config.feature +0 -21
- data/features/plugins/epub.feature +0 -23
- data/features/publish.feature +0 -73
- data/features/support/env.rb +0 -15
- data/features/templates.feature +0 -79
- data/spec/command_line_spec.rb +0 -87
- data/spec/plugins/epub_spec.rb +0 -242
data/spec/plugin_spec.rb
CHANGED
@@ -9,11 +9,11 @@ describe Mint do
|
|
9
9
|
describe ".plugins" do
|
10
10
|
it "returns all registered plugins" do
|
11
11
|
plugin = Class.new(Mint::Plugin)
|
12
|
-
Mint.plugins.
|
12
|
+
expect(Mint.plugins).to eq([plugin])
|
13
13
|
end
|
14
14
|
|
15
15
|
it "returns an empty array if there are no registered plugins" do
|
16
|
-
Mint.plugins.
|
16
|
+
expect(Mint.plugins).to eq([])
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -22,13 +22,13 @@ describe Mint do
|
|
22
22
|
|
23
23
|
it "registers a plugin once" do
|
24
24
|
Mint.register_plugin! plugin
|
25
|
-
Mint.plugins.
|
25
|
+
expect(Mint.plugins).to eq([plugin])
|
26
26
|
end
|
27
27
|
|
28
28
|
it "does not register a plugin more than once" do
|
29
29
|
Mint.register_plugin! plugin
|
30
|
-
|
31
|
-
Mint.plugins.
|
30
|
+
expect { Mint.register_plugin! plugin }.not_to change { Mint.plugins }
|
31
|
+
expect(Mint.plugins).to eq([plugin])
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
@@ -37,13 +37,13 @@ describe Mint do
|
|
37
37
|
|
38
38
|
it "activates a plugin once" do
|
39
39
|
Mint.activate_plugin! plugin
|
40
|
-
Mint.activated_plugins.
|
40
|
+
expect(Mint.activated_plugins).to eq [plugin]
|
41
41
|
end
|
42
42
|
|
43
43
|
it "does not register a plugin more than once" do
|
44
44
|
Mint.activate_plugin! plugin
|
45
|
-
|
46
|
-
Mint.activated_plugins.
|
45
|
+
expect { Mint.activate_plugin! plugin }.not_to change { Mint.activated_plugins }
|
46
|
+
expect(Mint.activated_plugins).to eq [plugin]
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
@@ -51,17 +51,17 @@ describe Mint do
|
|
51
51
|
let(:plugin) { Class.new }
|
52
52
|
|
53
53
|
it "does nothing if no plugins are registered" do
|
54
|
-
|
54
|
+
expect { Mint.clear_plugins! }.not_to raise_error
|
55
55
|
end
|
56
56
|
|
57
57
|
it "removes all registered plugins" do
|
58
58
|
Mint.register_plugin! plugin
|
59
|
-
|
59
|
+
expect { Mint.clear_plugins! }.to change { Mint.plugins.length }.by(-1)
|
60
60
|
end
|
61
61
|
|
62
62
|
it "removes all activated plugins" do
|
63
63
|
Mint.activate_plugin! plugin
|
64
|
-
|
64
|
+
expect { Mint.clear_plugins! }.to change { Mint.activated_plugins.length }.by(-1)
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
@@ -69,9 +69,9 @@ describe Mint do
|
|
69
69
|
let(:plugin) { Class.new(Mint::Plugin) }
|
70
70
|
|
71
71
|
it "gives access to a directory where template files can be stored" do
|
72
|
-
plugin.
|
73
|
-
Mint.template_directory(plugin).
|
74
|
-
Mint
|
72
|
+
expect(plugin).to receive(:name).and_return("DocBook")
|
73
|
+
expect(Mint.template_directory(plugin)).to eq(
|
74
|
+
Mint::ROOT + "/plugins/templates/doc_book")
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
@@ -79,9 +79,9 @@ describe Mint do
|
|
79
79
|
let(:plugin) { Class.new(Mint::Plugin) }
|
80
80
|
|
81
81
|
it "gives access to a directory where template files can be stored" do
|
82
|
-
plugin.
|
83
|
-
Mint.config_directory(plugin).
|
84
|
-
Mint
|
82
|
+
expect(plugin).to receive(:name).and_return("DocBook")
|
83
|
+
expect(Mint.config_directory(plugin)).to eq(
|
84
|
+
Mint::ROOT + "/plugins/config/doc_book")
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
@@ -89,9 +89,9 @@ describe Mint do
|
|
89
89
|
let(:plugin) { Class.new(Mint::Plugin) }
|
90
90
|
|
91
91
|
it "gives access to a directory where template files can be stored" do
|
92
|
-
plugin.
|
93
|
-
Mint.commandline_options_file(plugin).
|
94
|
-
Mint
|
92
|
+
expect(plugin).to receive(:name).and_return("DocBook")
|
93
|
+
expect(Mint.commandline_options_file(plugin)).to eq(
|
94
|
+
Mint::ROOT + "/plugins/config/doc_book/syntax.yml")
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
@@ -103,40 +103,40 @@ describe Mint do
|
|
103
103
|
|
104
104
|
context "when plugins are specified" do
|
105
105
|
before do
|
106
|
-
first_plugin.
|
107
|
-
second_plugin.
|
108
|
-
third_plugin.
|
106
|
+
expect(first_plugin).to receive(callback).ordered.and_return("first")
|
107
|
+
expect(second_plugin).to receive(callback).ordered.and_return("second")
|
108
|
+
expect(third_plugin).to receive(callback).never
|
109
109
|
end
|
110
110
|
|
111
111
|
it "reduces .#{callback} across all specified plugins in order" do
|
112
112
|
plugins = [first_plugin, second_plugin]
|
113
|
-
Mint.send(callback, "text", :plugins => plugins).
|
113
|
+
expect(Mint.send(callback, "text", :plugins => plugins)).to eq("second")
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
117
117
|
context "when plugins are activated, but no plugins are specified" do
|
118
118
|
before do
|
119
|
-
first_plugin.
|
120
|
-
second_plugin.
|
121
|
-
third_plugin.
|
119
|
+
expect(first_plugin).to receive(callback).ordered.and_return("first")
|
120
|
+
expect(second_plugin).to receive(callback).ordered.and_return("second")
|
121
|
+
expect(third_plugin).to receive(callback).never
|
122
122
|
end
|
123
123
|
|
124
124
|
it "reduces .#{callback} across all activated plugins in order" do
|
125
125
|
Mint.activate_plugin! first_plugin
|
126
126
|
Mint.activate_plugin! second_plugin
|
127
|
-
Mint.send(callback, "text").
|
127
|
+
expect(Mint.send(callback, "text")).to eq("second")
|
128
128
|
end
|
129
129
|
end
|
130
130
|
|
131
131
|
context "when plugins are not specified" do
|
132
132
|
before do
|
133
|
-
first_plugin.
|
134
|
-
second_plugin.
|
135
|
-
third_plugin.
|
133
|
+
expect(first_plugin).to receive(callback).never
|
134
|
+
expect(second_plugin).to receive(callback).never
|
135
|
+
expect(third_plugin).to receive(callback).never
|
136
136
|
end
|
137
137
|
|
138
138
|
it "returns the parameter text" do
|
139
|
-
Mint.send(callback, "text").
|
139
|
+
expect(Mint.send(callback, "text")).to eq("text")
|
140
140
|
end
|
141
141
|
end
|
142
142
|
end
|
@@ -149,9 +149,9 @@ describe Mint do
|
|
149
149
|
|
150
150
|
context "when plugins are specified" do
|
151
151
|
before do
|
152
|
-
first_plugin.
|
153
|
-
second_plugin.
|
154
|
-
third_plugin.
|
152
|
+
expect(first_plugin).to receive(:after_publish).ordered
|
153
|
+
expect(second_plugin).to receive(:after_publish).ordered
|
154
|
+
expect(third_plugin).to receive(:after_publish).never
|
155
155
|
end
|
156
156
|
|
157
157
|
it "iterates across all specified plugins in order" do
|
@@ -162,9 +162,9 @@ describe Mint do
|
|
162
162
|
|
163
163
|
context "when plugins are activated, but no plugins are specified" do
|
164
164
|
before do
|
165
|
-
first_plugin.
|
166
|
-
second_plugin.
|
167
|
-
third_plugin.
|
165
|
+
expect(first_plugin).to receive(:after_publish).ordered
|
166
|
+
expect(second_plugin).to receive(:after_publish).ordered
|
167
|
+
expect(third_plugin).to receive(:after_publish).never
|
168
168
|
end
|
169
169
|
|
170
170
|
it "iterates across all activated plugins in order" do
|
@@ -176,9 +176,9 @@ describe Mint do
|
|
176
176
|
|
177
177
|
context "when plugins are not specified" do
|
178
178
|
before do
|
179
|
-
first_plugin.
|
180
|
-
second_plugin.
|
181
|
-
third_plugin.
|
179
|
+
expect(first_plugin).to receive(:after_publish).never
|
180
|
+
expect(second_plugin).to receive(:after_publish).never
|
181
|
+
expect(third_plugin).to receive(:after_publish).never
|
182
182
|
end
|
183
183
|
|
184
184
|
it "does not iterate over any plugins" do
|
@@ -220,29 +220,29 @@ describe Mint do
|
|
220
220
|
it "when anonymous, returns a random identifier"
|
221
221
|
|
222
222
|
it "when named, returns its name, underscored" do
|
223
|
-
plugin.
|
224
|
-
plugin.underscore.
|
223
|
+
expect(plugin).to receive(:name).and_return("EPub")
|
224
|
+
expect(plugin.underscore).to eq("epub")
|
225
225
|
end
|
226
226
|
end
|
227
227
|
|
228
228
|
describe ".inherited" do
|
229
229
|
it "registers the subclass with Mint as a plugin" do
|
230
|
-
|
230
|
+
expect do
|
231
231
|
Class.new(Mint::Plugin)
|
232
|
-
end.
|
232
|
+
end.to change { Mint.plugins.length }.by(1)
|
233
233
|
end
|
234
234
|
|
235
235
|
it "preserves the order of subclassing" do
|
236
|
-
Mint.plugins.
|
236
|
+
expect(Mint.plugins).to eq([@first_plugin, @second_plugin])
|
237
237
|
end
|
238
238
|
|
239
239
|
it "does not change the order of a plugin when it is monkey-patched" do
|
240
|
-
|
240
|
+
expect do
|
241
241
|
@first_plugin.instance_eval do
|
242
242
|
def monkey_patch
|
243
243
|
end
|
244
244
|
end
|
245
|
-
end.
|
245
|
+
end.not_to change { Mint.plugins }
|
246
246
|
end
|
247
247
|
end
|
248
248
|
|
@@ -269,7 +269,7 @@ describe Mint do
|
|
269
269
|
end
|
270
270
|
end
|
271
271
|
|
272
|
-
plugin.before_render("text").
|
272
|
+
expect(plugin.before_render("text")).to eq("base")
|
273
273
|
end
|
274
274
|
end
|
275
275
|
|
@@ -281,7 +281,7 @@ describe Mint do
|
|
281
281
|
end
|
282
282
|
end
|
283
283
|
|
284
|
-
plugin.after_render("<html></html>").
|
284
|
+
expect(plugin.after_render("<html></html>")).to eq("<!doctype html>")
|
285
285
|
end
|
286
286
|
end
|
287
287
|
|
@@ -289,20 +289,20 @@ describe Mint do
|
|
289
289
|
let(:document) { Mint::Document.new "content.md" }
|
290
290
|
|
291
291
|
it "allows changes to the document extension" do
|
292
|
-
plugin.
|
293
|
-
def after_publish(document)
|
292
|
+
plugin.class_eval do
|
293
|
+
def self.after_publish(document)
|
294
294
|
document.name.gsub! /html$/, "htm"
|
295
295
|
end
|
296
296
|
end
|
297
297
|
|
298
|
-
|
298
|
+
expect do
|
299
299
|
plugin.after_publish(document)
|
300
|
-
end.
|
300
|
+
end.to change { document.name.length }.by(-1)
|
301
301
|
end
|
302
302
|
|
303
303
|
it "allows splitting up the document into two, without garbage" do
|
304
|
-
plugin.
|
305
|
-
def after_publish(document)
|
304
|
+
plugin.class_eval do
|
305
|
+
def self.after_publish(document)
|
306
306
|
content = document.content
|
307
307
|
fake_splitting_point = content.length / 2
|
308
308
|
|
@@ -323,14 +323,14 @@ describe Mint do
|
|
323
323
|
|
324
324
|
document.publish! :plugins => [plugin]
|
325
325
|
|
326
|
-
File.exist?(document.destination_file).
|
327
|
-
File.exist?("first-half.html").
|
328
|
-
File.exist?("second-half.html").
|
326
|
+
expect(File.exist?(document.destination_file)).to be_falsy
|
327
|
+
expect(File.exist?("first-half.html")).to be_truthy
|
328
|
+
expect(File.exist?("second-half.html")).to be_truthy
|
329
329
|
end
|
330
330
|
|
331
331
|
it "allows changes to the style file" do
|
332
332
|
pending "figure out a better strategy for style manipulation"
|
333
|
-
document = Mint::Document.new "content.md", :
|
333
|
+
document = Mint::Document.new "content.md", style: "style.css"
|
334
334
|
|
335
335
|
plugin.instance_eval do
|
336
336
|
def after_publish(document)
|
@@ -363,18 +363,18 @@ describe Mint do
|
|
363
363
|
document.destination = "invalid"
|
364
364
|
end
|
365
365
|
|
366
|
-
|
366
|
+
expect do
|
367
367
|
document.publish! :plugins => [plugin]
|
368
|
-
end.
|
368
|
+
end.to raise_error(InvalidPluginAction)
|
369
369
|
end
|
370
370
|
end
|
371
371
|
end
|
372
372
|
|
373
373
|
context "when the output is a new directory" do
|
374
374
|
it "allows changes to the document directory" do
|
375
|
-
document = Mint::Document.new "content.md", :
|
376
|
-
plugin.
|
377
|
-
def after_publish(document)
|
375
|
+
document = Mint::Document.new "content.md", destination: "destination"
|
376
|
+
plugin.class_eval do
|
377
|
+
def self.after_publish(document)
|
378
378
|
original = document.destination_directory
|
379
379
|
new = File.expand_path "book"
|
380
380
|
FileUtils.mv original, new
|
@@ -383,22 +383,20 @@ describe Mint do
|
|
383
383
|
end
|
384
384
|
|
385
385
|
document.publish! :plugins => [plugin]
|
386
|
-
File.exist?("destination").
|
387
|
-
File.exist?("book").
|
388
|
-
document.destination_directory.
|
386
|
+
expect(File.exist?("destination")).to be_falsy
|
387
|
+
expect(File.exist?("book")).to be_truthy
|
388
|
+
expect(document.destination_directory).to eq(File.expand_path("book"))
|
389
389
|
end
|
390
390
|
|
391
391
|
it "allows compression of the final output" do
|
392
|
-
require "zip
|
393
|
-
require "zip/
|
394
|
-
|
395
|
-
document = Mint::Document.new "content.md", :
|
396
|
-
plugin.
|
397
|
-
def after_publish(document)
|
398
|
-
Zip::
|
399
|
-
|
400
|
-
# zos.puts "text/epub"
|
401
|
-
zos.put_next_entry("chapter-1", nil, nil, Zip::ZipEntry::DEFLATED)
|
392
|
+
require "zip"
|
393
|
+
require "zip/filesystem"
|
394
|
+
|
395
|
+
document = Mint::Document.new "content.md", destination: "destination"
|
396
|
+
plugin.class_eval do
|
397
|
+
def self.after_publish(document)
|
398
|
+
Zip::OutputStream.open("book.zip") do |zos|
|
399
|
+
zos.put_next_entry("chapter-1.html")
|
402
400
|
zos.puts File.read(document.destination_file)
|
403
401
|
end
|
404
402
|
|
@@ -408,9 +406,9 @@ describe Mint do
|
|
408
406
|
|
409
407
|
document.publish! :plugins => [plugin]
|
410
408
|
|
411
|
-
File.exist?("destination").
|
412
|
-
File.exist?("book.zip").
|
413
|
-
File.exist?("book.epub").
|
409
|
+
expect(File.exist?("destination")).to be_truthy
|
410
|
+
expect(File.exist?("book.zip")).to be_falsy
|
411
|
+
expect(File.exist?("book.epub")).to be_truthy
|
414
412
|
|
415
413
|
directory_size =
|
416
414
|
Dir["#{document.destination_directory}/**/*"].
|
@@ -418,15 +416,15 @@ describe Mint do
|
|
418
416
|
map {|file| File.stat(file).size }.
|
419
417
|
reduce(&:+)
|
420
418
|
compressed_size = File.stat("book.epub").size
|
421
|
-
directory_size.
|
419
|
+
expect(directory_size).to be > compressed_size
|
422
420
|
end
|
423
421
|
end
|
424
422
|
|
425
423
|
context "when the style output is a new directory" do
|
426
424
|
it "allows changes to the style directory" do
|
427
|
-
document = Mint::Document.new "content.md", :
|
428
|
-
plugin.
|
429
|
-
def after_publish(document)
|
425
|
+
document = Mint::Document.new "content.md", style_destination: "styles"
|
426
|
+
plugin.class_eval do
|
427
|
+
def self.after_publish(document)
|
430
428
|
original = document.style_destination_directory
|
431
429
|
new = File.expand_path "looks"
|
432
430
|
FileUtils.mv original, new
|
@@ -436,9 +434,9 @@ describe Mint do
|
|
436
434
|
|
437
435
|
document.publish! :plugins => [plugin]
|
438
436
|
|
439
|
-
File.exist?("styles").
|
440
|
-
File.exist?("looks").
|
441
|
-
document.style_destination_directory.
|
437
|
+
expect(File.exist?("styles")).to be_falsy
|
438
|
+
expect(File.exist?("looks")).to be_truthy
|
439
|
+
expect(document.style_destination_directory).to eq(File.expand_path("looks"))
|
442
440
|
end
|
443
441
|
|
444
442
|
after do
|
@@ -0,0 +1,95 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# CLI Test Runner for Mint
|
4
|
+
# Runs the comprehensive CLI test suite with better output formatting
|
5
|
+
|
6
|
+
require 'colorize'
|
7
|
+
require 'benchmark'
|
8
|
+
|
9
|
+
def run_test_suite(pattern, description)
|
10
|
+
puts "\n#{'=' * 60}".cyan
|
11
|
+
puts " #{description}".cyan.bold
|
12
|
+
puts "#{'=' * 60}".cyan
|
13
|
+
|
14
|
+
time = Benchmark.measure do
|
15
|
+
system("rspec #{pattern} --format documentation --color")
|
16
|
+
end
|
17
|
+
|
18
|
+
puts "\n⏱️ Time: #{time.real.round(2)}s".yellow
|
19
|
+
$?.success?
|
20
|
+
end
|
21
|
+
|
22
|
+
def main
|
23
|
+
puts "🧪 Mint CLI Test Suite".green.bold
|
24
|
+
puts "Running comprehensive CLI tests...\n"
|
25
|
+
|
26
|
+
test_suites = [
|
27
|
+
["spec/cli/argument_parsing_spec.rb", "CLI Argument Parsing"],
|
28
|
+
["spec/cli/template_management_spec.rb", "Template Management"],
|
29
|
+
["spec/cli/publish_workflow_spec.rb", "Publishing Workflows"],
|
30
|
+
["spec/cli/configuration_management_spec.rb", "Configuration Management"],
|
31
|
+
["spec/cli/bin_integration_spec.rb", "Binary Integration"],
|
32
|
+
["spec/cli/full_workflow_integration_spec.rb", "Full Workflow Integration"]
|
33
|
+
]
|
34
|
+
|
35
|
+
results = []
|
36
|
+
total_time = Benchmark.measure do
|
37
|
+
test_suites.each do |pattern, description|
|
38
|
+
if File.exist?(pattern)
|
39
|
+
success = run_test_suite(pattern, description)
|
40
|
+
results << { name: description, success: success }
|
41
|
+
else
|
42
|
+
puts "⚠️ Test file #{pattern} not found".yellow
|
43
|
+
results << { name: description, success: false }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Summary
|
49
|
+
puts "\n#{'=' * 60}".cyan
|
50
|
+
puts " TEST SUMMARY".cyan.bold
|
51
|
+
puts "#{'=' * 60}".cyan
|
52
|
+
|
53
|
+
results.each do |result|
|
54
|
+
status = result[:success] ? "✅ PASS".green : "❌ FAIL".red
|
55
|
+
puts "#{status} #{result[:name]}"
|
56
|
+
end
|
57
|
+
|
58
|
+
passed = results.count {|r| r[:success] }
|
59
|
+
total = results.size
|
60
|
+
|
61
|
+
puts "\n📊 Results: #{passed}/#{total} test suites passed".cyan
|
62
|
+
puts "⏱️ Total time: #{total_time.real.round(2)}s".yellow
|
63
|
+
|
64
|
+
if passed == total
|
65
|
+
puts "\n🎉 All CLI tests passed!".green.bold
|
66
|
+
exit 0
|
67
|
+
else
|
68
|
+
puts "\n❌ Some CLI tests failed".red.bold
|
69
|
+
exit 1
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Run individual test suite if specified
|
74
|
+
if ARGV.length > 0
|
75
|
+
test_name = ARGV[0]
|
76
|
+
pattern = "spec/cli/#{test_name}*_spec.rb"
|
77
|
+
|
78
|
+
matching_files = Dir.glob(pattern)
|
79
|
+
if matching_files.empty?
|
80
|
+
puts "❌ No test files found matching: #{pattern}".red
|
81
|
+
puts "\nAvailable test suites:".yellow
|
82
|
+
Dir.glob("spec/cli/*_spec.rb").each do |file|
|
83
|
+
basename = File.basename(file, "_spec.rb")
|
84
|
+
puts " - #{basename}"
|
85
|
+
end
|
86
|
+
exit 1
|
87
|
+
end
|
88
|
+
|
89
|
+
matching_files.each do |file|
|
90
|
+
description = File.basename(file, "_spec.rb").split('_').map(&:capitalize).join(' ')
|
91
|
+
run_test_suite(file, description)
|
92
|
+
end
|
93
|
+
else
|
94
|
+
main
|
95
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require "pathname"
|
2
2
|
require "mint"
|
3
|
+
require "rspec/its"
|
3
4
|
require_relative "support/matchers"
|
5
|
+
require_relative "support/cli_helpers"
|
4
6
|
|
5
7
|
RSpec.configure do |config|
|
6
8
|
config.before(:all) do
|
@@ -9,11 +11,16 @@ RSpec.configure do |config|
|
|
9
11
|
@tmp_dir = File.realpath "/tmp/mint-test"
|
10
12
|
|
11
13
|
@content_file = "content.md"
|
14
|
+
@content_file_2 = "content-2.md"
|
12
15
|
@layout_file = "layout.haml"
|
13
16
|
@static_style_file = "static.css"
|
14
17
|
@dynamic_style_file = "dynamic.sass"
|
15
18
|
|
16
|
-
["content.md",
|
19
|
+
["content.md",
|
20
|
+
"content-2.md",
|
21
|
+
"layout.haml",
|
22
|
+
"static.css",
|
23
|
+
"dynamic.sass"].each do |file|
|
17
24
|
FileUtils.cp "spec/support/fixtures/#{file}", @tmp_dir
|
18
25
|
end
|
19
26
|
|
data/spec/style_spec.rb
CHANGED
@@ -6,12 +6,12 @@ module Mint
|
|
6
6
|
let(:style) { Style.new @static_style_file }
|
7
7
|
subject { style }
|
8
8
|
|
9
|
-
its(:destination) {
|
10
|
-
its(:destination_file) {
|
9
|
+
its(:destination) { is_expected.to be_nil }
|
10
|
+
its(:destination_file) { is_expected.to eq("#{@tmp_dir}/static.css") }
|
11
11
|
|
12
|
-
it {
|
12
|
+
it { is_expected.to be_rendered }
|
13
13
|
it "'renders' itself verbatim" do
|
14
|
-
style.render.
|
14
|
+
expect(style.render).to eq(File.read(@static_style_file))
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
@@ -19,13 +19,13 @@ module Mint
|
|
19
19
|
let(:style) { Style.new @dynamic_style_file }
|
20
20
|
subject { style }
|
21
21
|
|
22
|
-
its(:destination) {
|
23
|
-
its(:destination_file) {
|
22
|
+
its(:destination) { is_expected.to be_nil }
|
23
|
+
its(:destination_file) { is_expected.to eq("#{@tmp_dir}/dynamic.css") }
|
24
24
|
|
25
|
-
it {
|
26
|
-
it "renders itself from a templating language to
|
27
|
-
style.render.gsub("\n", " ").
|
28
|
-
File.read(@static_style_file).gsub("\n", " ")
|
25
|
+
it { is_expected.to be_rendered }
|
26
|
+
it "renders itself from a templating language to CSS" do
|
27
|
+
expect(style.render.gsub("\n", " ").strip).to eq(
|
28
|
+
File.read(@static_style_file).gsub("\n", " ").strip)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -34,9 +34,9 @@ module Mint
|
|
34
34
|
:destination => "destination" }
|
35
35
|
subject { style }
|
36
36
|
|
37
|
-
its(:destination) {
|
37
|
+
its(:destination) { is_expected.to eq("destination") }
|
38
38
|
its(:destination_file) do
|
39
|
-
|
39
|
+
is_expected.to eq("#{@tmp_dir}/destination/static.css")
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
@@ -55,12 +55,14 @@ module Mint
|
|
55
55
|
# end
|
56
56
|
|
57
57
|
context "when it's created from a dynamic template file" do
|
58
|
-
let(:style) { Style.new(Mint.
|
58
|
+
let(:style) { Style.new(Mint.lookup_style("default")) }
|
59
59
|
subject { style }
|
60
60
|
|
61
|
-
|
62
|
-
|
63
|
-
|
61
|
+
it "has destination in user tmp directory" do
|
62
|
+
expect(style.destination).to match(/\.config\/mint\/tmp$/)
|
63
|
+
end
|
64
|
+
it "has destination file in user tmp directory" do
|
65
|
+
expect(style.destination_file).to match(/\.config\/mint\/tmp\/style\.css$/)
|
64
66
|
end
|
65
67
|
end
|
66
68
|
end
|