playgroundbook 0.2.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/.gitignore +50 -0
- data/.rspec +2 -0
- data/.rubocop.yml +2 -0
- data/.ruby-version +1 -0
- data/Changelog.md +17 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +103 -0
- data/Guardfile +14 -0
- data/LICENSE +21 -0
- data/README.md +92 -0
- data/Rakefile +8 -0
- data/bin/playgroundbook +22 -0
- data/lib/playgroundbook.rb +9 -0
- data/lib/playgroundbook_lint/abstract_linter.rb +23 -0
- data/lib/playgroundbook_lint/chapter_linter.rb +34 -0
- data/lib/playgroundbook_lint/chapter_manifest_linter.rb +43 -0
- data/lib/playgroundbook_lint/contents_linter.rb +20 -0
- data/lib/playgroundbook_lint/cutscene_page_linter.rb +17 -0
- data/lib/playgroundbook_lint/cutscene_page_manifest_linter.rb +18 -0
- data/lib/playgroundbook_lint/manifest_linter.rb +39 -0
- data/lib/playgroundbook_lint/page_linter.rb +23 -0
- data/lib/playgroundbook_lint/page_manifest_linter.rb +18 -0
- data/lib/playgroundbook_lint/playgroundbook_lint.rb +31 -0
- data/lib/playgroundbook_lint/root_manifest_linter.rb +36 -0
- data/lib/playgroundbook_renderer/chapter_collator.rb +77 -0
- data/lib/playgroundbook_renderer/contents_manifest_generator.rb +33 -0
- data/lib/playgroundbook_renderer/page_writer.rb +34 -0
- data/lib/playgroundbook_renderer/playgroundbook_renderer.rb +75 -0
- data/lib/version.rb +3 -0
- data/playground_book_lint.gemspec +21 -0
- data/spec/fixtures/Starter.playgroundbook/Contents/Chapters/Chapter1.playgroundchapter/Manifest.plist +15 -0
- data/spec/fixtures/Starter.playgroundbook/Contents/Chapters/Chapter1.playgroundchapter/Pages/Page1.playgroundpage/Contents.swift +8 -0
- data/spec/fixtures/Starter.playgroundbook/Contents/Chapters/Chapter1.playgroundchapter/Pages/Page1.playgroundpage/Manifest.plist +12 -0
- data/spec/fixtures/Starter.playgroundbook/Contents/Chapters/Chapter1.playgroundchapter/Pages/Page2.playgroundpage/Contents.swift +8 -0
- data/spec/fixtures/Starter.playgroundbook/Contents/Chapters/Chapter1.playgroundchapter/Pages/Page2.playgroundpage/Manifest.plist +12 -0
- data/spec/fixtures/Starter.playgroundbook/Contents/Manifest.plist +20 -0
- data/spec/fixtures/assets/file.jpeg +0 -0
- data/spec/fixtures/book.yml +5 -0
- data/spec/fixtures/test_chapter.playground/Contents.swift +17 -0
- data/spec/fixtures/test_chapter.playground/contents.xcplayground +4 -0
- data/spec/playground_book_lint/chapter_linter_spec.rb +30 -0
- data/spec/playground_book_lint/chapter_manifest_linter_spec.rb +40 -0
- data/spec/playground_book_lint/contents_linter_spec.rb +18 -0
- data/spec/playground_book_lint/cutscene_page_linter_spec.rb +14 -0
- data/spec/playground_book_lint/cutscene_page_manifest_linter_spec.rb +63 -0
- data/spec/playground_book_lint/manfiest_linter_spec.rb +71 -0
- data/spec/playground_book_lint/page_linter_spec.rb +19 -0
- data/spec/playground_book_lint/page_manifest_linter_spec.rb +43 -0
- data/spec/playground_book_lint/playgroundbook_lint_spec.rb +38 -0
- data/spec/playground_book_lint/root_manifest_linter_spec.rb +35 -0
- data/spec/playgroundbook_renderer_spec/chapter_collator_spec.rb +70 -0
- data/spec/playgroundbook_renderer_spec/contents_manfiest_generator_spec.rb +37 -0
- data/spec/playgroundbook_renderer_spec/page_writer_spec.rb +57 -0
- data/spec/playgroundbook_renderer_spec/playgroundbook_renderer_spec.rb +112 -0
- data/spec/spec_helper.rb +75 -0
- metadata +141 -0
data/lib/version.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = 'playgroundbook'
|
8
|
+
s.version = Playgroundbook::VERSION
|
9
|
+
s.licenses = ['MIT']
|
10
|
+
s.summary = 'Lints/renders Swift Playground books.'
|
11
|
+
s.description = 'Tooks for Swift Playground books on iOS, a renderer and a linter.'
|
12
|
+
s.authors = ['Ash Furrow']
|
13
|
+
s.homepage = 'https://github.com/ashfurrow/playground-book-lint'
|
14
|
+
s.email = 'ash@ashfurrow.com'
|
15
|
+
s.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
16
|
+
s.require_paths = ['lib']
|
17
|
+
s.executables = ['playgroundbook']
|
18
|
+
s.add_runtime_dependency 'plist', '~> 3.2'
|
19
|
+
s.add_runtime_dependency 'colored', '~> 1.2'
|
20
|
+
s.add_runtime_dependency 'cork', '~> 0.1'
|
21
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>Version</key>
|
6
|
+
<string>1.0</string>
|
7
|
+
<key>Name</key>
|
8
|
+
<string>Sample Chapter</string>
|
9
|
+
<key>Pages</key>
|
10
|
+
<array>
|
11
|
+
<string>Page1.playgroundpage</string>
|
12
|
+
<string>Page2.playgroundpage</string>
|
13
|
+
</array>
|
14
|
+
</dict>
|
15
|
+
</plist>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>Version</key>
|
6
|
+
<string>1.0</string>
|
7
|
+
<key>Name</key>
|
8
|
+
<string>Example Page</string>
|
9
|
+
<key>LiveViewMode</key>
|
10
|
+
<string>HiddenByDefault</string>
|
11
|
+
</dict>
|
12
|
+
</plist>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>Version</key>
|
6
|
+
<string>1.0</string>
|
7
|
+
<key>Name</key>
|
8
|
+
<string>Second Example Page</string>
|
9
|
+
<key>LiveViewMode</key>
|
10
|
+
<string>HiddenByDefault</string>
|
11
|
+
</dict>
|
12
|
+
</plist>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>Version</key>
|
6
|
+
<string>1.0</string>
|
7
|
+
<key>ContentVersion</key>
|
8
|
+
<string>1.0</string>
|
9
|
+
<key>Name</key>
|
10
|
+
<string>Starter</string>
|
11
|
+
<key>ContentIdentifier</key>
|
12
|
+
<string>com.example.apple-samplecode.Starter</string>
|
13
|
+
<key>DeploymentTarget</key>
|
14
|
+
<string>ios10.0</string>
|
15
|
+
<key>Chapters</key>
|
16
|
+
<array>
|
17
|
+
<string>Chapter1.playgroundchapter</string>
|
18
|
+
</array>
|
19
|
+
</dict>
|
20
|
+
</plist>
|
Binary file
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import UIKit
|
2
|
+
|
3
|
+
public var str = "Hello, playground"
|
4
|
+
|
5
|
+
public func sharedFunc() {
|
6
|
+
print("This should be accessible to all pages.")
|
7
|
+
}
|
8
|
+
|
9
|
+
//// Page 1
|
10
|
+
|
11
|
+
str = "Yo, it's page 1."
|
12
|
+
sharedFunc()
|
13
|
+
|
14
|
+
//// Page 2
|
15
|
+
|
16
|
+
sharedFunc()
|
17
|
+
str = "Page 2 awww yeah."
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module Playgroundbook
|
4
|
+
describe RootManifestLinter do
|
5
|
+
include FakeFS::SpecHelpers
|
6
|
+
let(:chapter_linter) { ChapterLinter.new(chapter_manifest_linter) }
|
7
|
+
let(:chapter_manifest_linter) { double(ChapterManifestLinter) }
|
8
|
+
let!(:chapter_directory_name) { 'test_chapter' }
|
9
|
+
|
10
|
+
it 'fails when chapter directory does not exist' do
|
11
|
+
expect { chapter_linter.lint(chapter_directory_name) }.to raise_error(SystemExit)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'fails when Pages subdirectory of chapter dir does not exist' do
|
15
|
+
FakeFS do
|
16
|
+
Dir.mkdir(chapter_directory_name)
|
17
|
+
expect { chapter_linter.lint(chapter_directory_name) }.to raise_error(SystemExit)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'calls through to chapter manifest linter' do
|
22
|
+
FakeFS do
|
23
|
+
expect(chapter_manifest_linter).to receive(:lint)
|
24
|
+
FileUtils.mkdir_p("#{chapter_directory_name}/Pages")
|
25
|
+
|
26
|
+
expect { chapter_linter.lint(chapter_directory_name) }.to_not raise_error
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module Playgroundbook
|
4
|
+
describe ChapterManifestLinter do
|
5
|
+
include FakeFS::SpecHelpers
|
6
|
+
let(:chapter_manifest_linter) { ChapterManifestLinter.new(page_linter) }
|
7
|
+
let(:page_linter) { double(PageLinter) }
|
8
|
+
let!(:page_directory_name) { 'test.playgroundpage' }
|
9
|
+
|
10
|
+
it 'fails if no Pages defined in Manifest' do
|
11
|
+
FakeFS do
|
12
|
+
plist = { 'Name' => 'Test' }.to_plist
|
13
|
+
File.open('Manifest.plist', 'w') { |f| f.write(plist) }
|
14
|
+
|
15
|
+
expect { chapter_manifest_linter.lint }.to raise_error(SystemExit)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'fails if Pages dir specified in Manifest does not exist' do
|
20
|
+
FakeFS do
|
21
|
+
plist = { 'Name' => 'Test', 'Pages' => [page_directory_name] }.to_plist
|
22
|
+
File.open('Manifest.plist', 'w') { |f| f.write(plist) }
|
23
|
+
Dir.mkdir('Pages')
|
24
|
+
|
25
|
+
expect { chapter_manifest_linter.lint }.to raise_error(SystemExit)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'calls through to page linter' do
|
30
|
+
FakeFS do
|
31
|
+
expect(page_linter).to receive(:lint)
|
32
|
+
plist = { 'Name' => 'Test', 'Pages' => [page_directory_name] }.to_plist
|
33
|
+
File.open('Manifest.plist', 'w') { |f| f.write(plist) }
|
34
|
+
FileUtils.mkdir_p("Pages/#{page_directory_name}")
|
35
|
+
|
36
|
+
expect { chapter_manifest_linter.lint }.to_not raise_error
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module Playgroundbook
|
4
|
+
describe ContentsLinter do
|
5
|
+
include FakeFS::SpecHelpers
|
6
|
+
let(:contents_linter) { ContentsLinter.new(root_manifest_linter) }
|
7
|
+
let(:root_manifest_linter) { double(RootManifestLinter) }
|
8
|
+
|
9
|
+
it 'calls through to root manifest linter' do
|
10
|
+
expect(root_manifest_linter).to receive(:lint)
|
11
|
+
|
12
|
+
FakeFS do
|
13
|
+
Dir.mkdir 'Contents'
|
14
|
+
contents_linter.lint
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module Playgroundbook
|
4
|
+
describe CutscenePageLinter do
|
5
|
+
include FakeFS::SpecHelpers
|
6
|
+
let(:cutscene_page_linter) { CutscenePageLinter.new(cutscene_page_manifest_linter) }
|
7
|
+
let(:cutscene_page_manifest_linter) { double(CutscenePageManifestLinter) }
|
8
|
+
|
9
|
+
it 'passes through to cutscene_page_manifest_linter' do
|
10
|
+
expect(cutscene_page_manifest_linter).to receive(:lint)
|
11
|
+
expect { cutscene_page_linter.lint }.to_not raise_error
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module Playgroundbook
|
4
|
+
describe CutscenePageManifestLinter do
|
5
|
+
include FakeFS::SpecHelpers
|
6
|
+
let(:cutscene_page_manifest_linter) { CutscenePageManifestLinter.new }
|
7
|
+
|
8
|
+
it 'given a valid manifest does not fail' do
|
9
|
+
FakeFS do
|
10
|
+
cutscene_reference = 'RealFile.html'
|
11
|
+
plist = {
|
12
|
+
'Name' => 'Test Page',
|
13
|
+
'CutsceneReference' => cutscene_reference
|
14
|
+
}.to_plist
|
15
|
+
File.open('Manifest.plist', 'w') { |f| f.write(plist) }
|
16
|
+
File.open(cutscene_reference, 'w')
|
17
|
+
|
18
|
+
expect { cutscene_page_manifest_linter.lint }.not_to raise_error
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'given a cutscene path' do
|
23
|
+
it "fails if the key doesn't exist" do
|
24
|
+
FakeFS do
|
25
|
+
cutscene_reference = 'FakeFile.html'
|
26
|
+
plist = {
|
27
|
+
'Name' => 'Test Page',
|
28
|
+
}.to_plist
|
29
|
+
File.open('Manifest.plist', 'w') { |f| f.write(plist) }
|
30
|
+
|
31
|
+
expect { cutscene_page_manifest_linter.lint }.to raise_error(SystemExit)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it "fails if that file doesn't exist" do
|
36
|
+
FakeFS do
|
37
|
+
cutscene_reference = 'FakeFile.html'
|
38
|
+
plist = {
|
39
|
+
'Name' => 'Test Page',
|
40
|
+
'CutsceneReference' => cutscene_reference
|
41
|
+
}.to_plist
|
42
|
+
File.open('Manifest.plist', 'w') { |f| f.write(plist) }
|
43
|
+
|
44
|
+
expect { cutscene_page_manifest_linter.lint }.to raise_error(SystemExit)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'fails with a non-HTML file' do
|
49
|
+
FakeFS do
|
50
|
+
cutscene_reference = 'RealFile.xml'
|
51
|
+
plist = {
|
52
|
+
'Name' => 'Test Page',
|
53
|
+
'CutsceneReference' => cutscene_reference
|
54
|
+
}.to_plist
|
55
|
+
File.open('Manifest.plist', 'w') { |f| f.write(plist) }
|
56
|
+
File.open(cutscene_reference, 'w')
|
57
|
+
|
58
|
+
expect { cutscene_page_manifest_linter.lint }.to raise_error(SystemExit)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module Playgroundbook
|
4
|
+
describe RootManifestLinter do
|
5
|
+
include FakeFS::SpecHelpers
|
6
|
+
let(:manifest_linter) { ManifestLinter.new }
|
7
|
+
|
8
|
+
it 'fails if a Manifest.plist file does not exist' do
|
9
|
+
expect { manifest_linter.lint }.to raise_error(SystemExit)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'fails if the Manifest.plist file does not contain a Name value' do
|
13
|
+
FakeFS do
|
14
|
+
plist = {}.to_plist
|
15
|
+
File.open('Manifest.plist', 'w') { |f| f.write(plist) }
|
16
|
+
|
17
|
+
expect { manifest_linter.lint }.to raise_error(SystemExit)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'succeeds if the Manifest.plist file is well-formed' do
|
22
|
+
FakeFS do
|
23
|
+
plist = { 'Name' => 'My Test Name' }.to_plist
|
24
|
+
File.open('Manifest.plist', 'w') { |f| f.write(plist) }
|
25
|
+
|
26
|
+
expect { manifest_linter.lint }.to_not raise_error
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'extracts Manfiest.plist contents from pwd' do
|
31
|
+
FakeFS do
|
32
|
+
contents = { 'key' => 'value' }
|
33
|
+
File.open('Manifest.plist', 'w') { |f| f.write(contents.to_plist) }
|
34
|
+
|
35
|
+
expect(manifest_linter.manifest_plist_contents).to eq(contents)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe 'key-value checking' do
|
40
|
+
before do
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'checks for non-defined keys in manifest' do
|
44
|
+
FakeFS do
|
45
|
+
plist = {}.to_plist
|
46
|
+
File.open('Manifest.plist', 'w') { |f| f.write(plist) }
|
47
|
+
|
48
|
+
expect(manifest_linter.value_defined_in_manifest?('key')).to be_falsy
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'checks for nil keys in manifest' do
|
53
|
+
FakeFS do
|
54
|
+
plist = { 'key' => nil }.to_plist
|
55
|
+
File.open('Manifest.plist', 'w') { |f| f.write(plist) }
|
56
|
+
|
57
|
+
expect(manifest_linter.value_defined_in_manifest?('key')).to be_falsy
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'checks for empty keys in manifest' do
|
62
|
+
FakeFS do
|
63
|
+
plist = { 'key' => 'value' }.to_plist
|
64
|
+
File.open('Manifest.plist', 'w') { |f| f.write(plist) }
|
65
|
+
|
66
|
+
expect(manifest_linter.value_defined_in_manifest?('key')).to be_truthy
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module Playgroundbook
|
4
|
+
describe PageLinter do
|
5
|
+
include FakeFS::SpecHelpers
|
6
|
+
let(:page_linter) { PageLinter.new(page_manifest_linter) }
|
7
|
+
let(:page_manifest_linter) { double(PageManifestLinter) }
|
8
|
+
|
9
|
+
it 'fails if Contents.swift does not exist' do
|
10
|
+
expect { page_linter.lint }.to raise_error(SystemExit)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'passes through to page_manifest_linter' do
|
14
|
+
File.open(ContentsSwiftFileName, 'w') { |f| f.write('') }
|
15
|
+
expect(page_manifest_linter).to receive(:lint)
|
16
|
+
expect { page_linter.lint }.to_not raise_error
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module Playgroundbook
|
4
|
+
describe PageManifestLinter do
|
5
|
+
include FakeFS::SpecHelpers
|
6
|
+
let(:page_manifest_linter) { PageManifestLinter.new }
|
7
|
+
|
8
|
+
it 'given a valid manifest does not fail' do
|
9
|
+
# TODO: We're not checking optional values yet, more tests to come.
|
10
|
+
# See page_manifest_linter.rb and https://github.com/ashfurrow/playground-book-lint/issues/3 for details.
|
11
|
+
|
12
|
+
FakeFS do
|
13
|
+
plist = { 'Name' => 'Test Page' }.to_plist
|
14
|
+
File.open('Manifest.plist', 'w') { |f| f.write(plist) }
|
15
|
+
expect { page_manifest_linter.lint }.to_not raise_error
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe 'context given a live view mode' do
|
20
|
+
it 'succeeds with valid values' do
|
21
|
+
FakeFS do
|
22
|
+
plist = {
|
23
|
+
'Name' => 'Test Page',
|
24
|
+
'LiveViewMode' => 'HiddenByDefault'
|
25
|
+
}.to_plist
|
26
|
+
File.open('Manifest.plist', 'w') { |f| f.write(plist) }
|
27
|
+
expect { page_manifest_linter.lint }.to_not raise_error
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'fails with invalid values' do
|
32
|
+
FakeFS do
|
33
|
+
plist = {
|
34
|
+
'Name' => 'Test Page',
|
35
|
+
'LiveViewMode' => 'UnsupportedViewMode'
|
36
|
+
}.to_plist
|
37
|
+
File.open('Manifest.plist', 'w') { |f| f.write(plist) }
|
38
|
+
expect { page_manifest_linter.lint }.to raise_error(SystemExit)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|