playgroundbook 0.5.0 → 0.6.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 (50) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +50 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +112 -0
  5. data/.ruby-version +1 -0
  6. data/Changelog.md +37 -0
  7. data/CodeOfConduct.md +50 -0
  8. data/Community.md +52 -0
  9. data/Gemfile +13 -0
  10. data/Gemfile.lock +102 -0
  11. data/Guardfile +14 -0
  12. data/README.md +7 -1
  13. data/Rakefile +8 -0
  14. data/lib/playgroundbook.rb +1 -0
  15. data/lib/renderer/playgroundbook_renderer.rb +11 -0
  16. data/lib/version.rb +1 -1
  17. data/playgroundbook.gemspec +21 -0
  18. data/spec/fixtures/Starter.playgroundbook/Contents/Chapters/Chapter1.playgroundchapter/Manifest.plist +15 -0
  19. data/spec/fixtures/Starter.playgroundbook/Contents/Chapters/Chapter1.playgroundchapter/Pages/Page1.playgroundpage/Contents.swift +8 -0
  20. data/spec/fixtures/Starter.playgroundbook/Contents/Chapters/Chapter1.playgroundchapter/Pages/Page1.playgroundpage/Manifest.plist +12 -0
  21. data/spec/fixtures/Starter.playgroundbook/Contents/Chapters/Chapter1.playgroundchapter/Pages/Page2.playgroundpage/Contents.swift +8 -0
  22. data/spec/fixtures/Starter.playgroundbook/Contents/Chapters/Chapter1.playgroundchapter/Pages/Page2.playgroundpage/Manifest.plist +12 -0
  23. data/spec/fixtures/Starter.playgroundbook/Contents/Manifest.plist +20 -0
  24. data/spec/fixtures/assets/file.jpeg +0 -0
  25. data/spec/fixtures/book.yml +6 -0
  26. data/spec/fixtures/test_chapter.playground/Contents.swift +17 -0
  27. data/spec/fixtures/test_chapter.playground/contents.xcplayground +4 -0
  28. data/spec/fixtures/wrapper/destination/swift_at_artsy_1.swift +200 -0
  29. data/spec/fixtures/wrapper/source/Swift-at-Artsy.playground/Contents.swift +199 -0
  30. data/spec/fixtures/wrapper/source/Swift-at-Artsy.playground/contents.xcplayground +4 -0
  31. data/spec/fixtures/wrapper/source/swift_at_artsy_1.md +183 -0
  32. data/spec/linter/chapter_linter_spec.rb +30 -0
  33. data/spec/linter/chapter_manifest_linter_spec.rb +40 -0
  34. data/spec/linter/contents_linter_spec.rb +18 -0
  35. data/spec/linter/cutscene_page_linter_spec.rb +14 -0
  36. data/spec/linter/cutscene_page_manifest_linter_spec.rb +63 -0
  37. data/spec/linter/manfiest_linter_spec.rb +71 -0
  38. data/spec/linter/page_linter_spec.rb +19 -0
  39. data/spec/linter/page_manifest_linter_spec.rb +43 -0
  40. data/spec/linter/playgroundbook_lint_spec.rb +38 -0
  41. data/spec/linter/root_manifest_linter_spec.rb +35 -0
  42. data/spec/renderer/chapter_collator_spec.rb +70 -0
  43. data/spec/renderer/contents_manfiest_generator_spec.rb +41 -0
  44. data/spec/renderer/glossary_generator_spec.rb +54 -0
  45. data/spec/renderer/page_processor_spec.rb +86 -0
  46. data/spec/renderer/page_writer_spec.rb +70 -0
  47. data/spec/renderer/playgroundbook_renderer_spec.rb +122 -0
  48. data/spec/spec_helper.rb +85 -0
  49. data/spec/wrapper/markdown_wrapper_spec.rb +90 -0
  50. metadata +46 -2
@@ -0,0 +1,122 @@
1
+ require File.expand_path("../../spec_helper", __FILE__)
2
+
3
+ module Playgroundbook
4
+ describe Renderer do
5
+ include FakeFS::SpecHelpers
6
+ let(:renderer) { Renderer.new(yaml_file_name, contents_manifest_generator, page_parser, chapter_collator, glossary_generator, test_ui) }
7
+ let(:yaml_file_name) { "book.yml" }
8
+ let(:contents_manifest_generator) { double(ContentsManifestGenerator) }
9
+ let(:page_parser) { double(PageParser) }
10
+ let(:chapter_collator) { double(ChapterCollator) }
11
+ let(:glossary_generator) { double(GlossaryGenerator) }
12
+ let(:test_ui) { Cork::Board.new(silent: true) }
13
+
14
+ before do
15
+ File.open(yaml_file_name, "w") do |file|
16
+ file.write(test_book_metadata.to_yaml)
17
+ end
18
+
19
+ allow(contents_manifest_generator).to receive(:generate)
20
+ allow(chapter_collator).to receive(:collate)
21
+ allow(glossary_generator).to receive(:generate)
22
+ end
23
+
24
+ it "initializes correctly" do
25
+ expect(renderer.yaml_file_name) == yaml_file_name
26
+ end
27
+
28
+ it "explodes when there is no playground" do
29
+ expect { renderer.render }.to raise_error
30
+ end
31
+
32
+ context "with a playground" do
33
+ before do
34
+ allow(page_parser).to receive(:parse_chapter_pages)
35
+ Dir.mkdir("assets")
36
+ FileUtils.touch("assets/file.png")
37
+ Dir.mkdir("test_chapter.playground/")
38
+ File.open("test_chapter.playground/Contents.swift", "w") do |file|
39
+ file.write("")
40
+ end
41
+ end
42
+
43
+ it "creates a directory with book name" do
44
+ renderer.render
45
+
46
+ expect(Dir.exist?("Testing Book.playgroundbook")).to be_truthy
47
+ end
48
+
49
+ it "creates a resources folder" do
50
+ renderer.render
51
+
52
+ expect(Dir.exist?("Testing Book.playgroundbook/Contents/Resources")).to be_truthy
53
+ end
54
+
55
+ it "copies a resources folder contents" do
56
+ renderer.render
57
+
58
+ expect(File.exist?("Testing Book.playgroundbook/Contents/Resources/file.png")).to be_truthy
59
+ end
60
+
61
+ context "within an existing playgroundbook directory" do
62
+ before do
63
+ Dir.mkdir("Testing Book.playgroundbook")
64
+ end
65
+
66
+ it "does not explode when the directory already exists" do
67
+ expect { renderer.render }.to_not raise_error
68
+ end
69
+
70
+ it "creates a Contents directory within the main bundle dir" do
71
+ renderer.render
72
+
73
+ expect(Dir.exist?("Testing Book.playgroundbook/Contents")).to be_truthy
74
+ end
75
+
76
+ context "within the Contents directory" do
77
+ before do
78
+ Dir.mkdir("Testing Book.playgroundbook/Contents")
79
+ end
80
+
81
+ it "does not explode when the Contents directory already exists" do
82
+ expect { renderer.render }.to_not raise_error
83
+ end
84
+
85
+ it "renders main manifest" do
86
+ expect(contents_manifest_generator).to receive(:generate)
87
+
88
+ renderer.render
89
+ end
90
+
91
+ it "creates a Chapters directory within the Contents dir" do
92
+ renderer.render
93
+
94
+ expect(Dir.exist?("Testing Book.playgroundbook/Contents/Chapters")).to be_truthy
95
+ end
96
+
97
+ context "within the Chapters directory" do
98
+ before do
99
+ Dir.mkdir("Testing Book.playgroundbook/Contents/Chapters")
100
+ end
101
+
102
+ it "does not explode when the Chapters directory already exists" do
103
+ expect { renderer.render }.to_not raise_error
104
+ end
105
+
106
+ it "generates each chapter" do
107
+ expect(chapter_collator).to receive(:collate)
108
+
109
+ renderer.render
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ it "generates a glossary" do
116
+ expect(glossary_generator).to receive(:generate)
117
+
118
+ renderer.render
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,85 @@
1
+ require "pathname"
2
+ require "cork"
3
+ require "rspec"
4
+ require "plist"
5
+ require "fileutils"
6
+ require "tmpdir"
7
+ require "fakefs/spec_helpers"
8
+
9
+ ROOT = Pathname.new(File.expand_path("../../", __FILE__))
10
+ $LOAD_PATH.unshift((ROOT + "lib").to_s)
11
+ $LOAD_PATH.unshift((ROOT + "spec").to_s)
12
+
13
+ require "playgroundbook"
14
+ require "linter/abstract_linter"
15
+ require "linter/chapter_linter"
16
+ require "linter/chapter_manifest_linter"
17
+ require "linter/contents_linter"
18
+ require "linter/manifest_linter"
19
+ require "linter/page_linter"
20
+ require "linter/page_manifest_linter"
21
+ require "linter/cutscene_page_linter"
22
+ require "linter/cutscene_page_manifest_linter"
23
+ require "linter/root_manifest_linter"
24
+
25
+ require "renderer/contents_manifest_generator"
26
+ require "renderer/chapter_collator"
27
+ require "renderer/page_writer"
28
+ require "renderer/page_parser"
29
+ require "renderer/glossary_generator"
30
+ require "renderer/page_processor"
31
+
32
+ RSpec.configure do |config|
33
+ config.color = true
34
+
35
+ config.order = :random
36
+ Kernel.srand config.seed
37
+ end
38
+ RSpec::Expectations.configuration.on_potential_false_positives = :nothing
39
+
40
+ Playgroundbook::AbstractLinter.ui = Cork::Board.new(silent: true)
41
+
42
+ def test_playground_book
43
+ "spec/fixtures/Starter.playgroundbook"
44
+ end
45
+
46
+ def test_book_metadata
47
+ {
48
+ "name" => "Testing Book",
49
+ "chapters" => [ "name" => "test_chapter"],
50
+ "identifier" => "com.ashfurrow.testing",
51
+ "resources" => "assets",
52
+ "cover" => "file.jpeg",
53
+ "glossary" => [
54
+ {
55
+ "term" => "definition"
56
+ }
57
+ ]
58
+ }
59
+ end
60
+
61
+ def get_manifest(file_name = Playgroundbook::ManifestFileName)
62
+ Plist.parse_xml(file_name)
63
+ end
64
+
65
+ def test_chapter_contents
66
+ <<-EOSwift
67
+ import UIKit
68
+
69
+ var str = "Hello, playground"
70
+
71
+ func sharedFunc() {
72
+ print("This should be accessible to all pages.")
73
+ }
74
+
75
+ //// Page 1
76
+
77
+ str = "Yo, it's page 1."
78
+ sharedFunc()
79
+
80
+ //// Page 2
81
+
82
+ str = "Page 2 awww yeah."
83
+ sharedFunc()
84
+ EOSwift
85
+ end
@@ -0,0 +1,90 @@
1
+ require File.expand_path("../../spec_helper", __FILE__)
2
+
3
+ module Playgroundbook
4
+ describe MarkdownWrapper do
5
+
6
+ it "creates a swift file from a markdown file" do
7
+ source = "spec/fixtures/wrapper/source/swift_at_artsy_1.md"
8
+ destination = "spec/fixtures/wrapper/destination/swift_at_artsy_1.swift"
9
+ subject = MarkdownWrapper.new(source, "Swift at Artsy")
10
+ contents = File.read(source)
11
+ expect(subject.swap_code_context(contents)).to eq(File.read(destination))
12
+ end
13
+
14
+ it "creates a playground around the file" do
15
+ source = "spec/fixtures/wrapper/source/swift_at_artsy_1.md"
16
+
17
+ Dir.mktmpdir do |dir|
18
+ new_source = File.join(dir, File.basename(source))
19
+ FileUtils.cp(source, new_source)
20
+ subject = MarkdownWrapper.new(new_source, "Swift at Artsy")
21
+
22
+ subject.generate
23
+
24
+ playground = File.join(dir, "Swift at Artsy.playground")
25
+ expect(Dir.exist?(playground)).to eq(true)
26
+ expect(File.exist?(File.join(playground, "Contents.swift"))).to eq(true)
27
+ expect(File.exist?(File.join(playground, "timeline.xctimeline"))).to eq(true)
28
+ expect(File.exist?(File.join(playground, "contents.xcplayground"))).to eq(true)
29
+ end
30
+ end
31
+
32
+ it "gets the image files inside the markdown doc" do
33
+ source = "spec/fixtures/wrapper/source/swift_at_artsy_1.md"
34
+ subject = MarkdownWrapper.new(source, "Swift at Artsy")
35
+ expect(subject.get_list_of_images(subject.playground_contents)).to eq(
36
+ ["img/welcome.png", "img/newplayground.png", "img/emptyplayground.png", "img/results.png"]
37
+ )
38
+ end
39
+
40
+ it "embeds the local images inside the resources folder" do
41
+ source = "spec/fixtures/wrapper/source/swift_at_artsy_1.md"
42
+
43
+ Dir.mktmpdir do |dir|
44
+ new_source = File.join(dir, File.basename(source))
45
+ FileUtils.cp(source, new_source)
46
+
47
+ # images need to be in the tmpdir relative for picking up
48
+ Dir.mkdir(File.join(dir, "img"))
49
+ FileUtils.cp(source, File.join(dir, "img", "welcome.png"))
50
+
51
+ subject = MarkdownWrapper.new(new_source, "Swift at Artsy")
52
+ subject.generate
53
+
54
+ embedded_img = File.join(dir, "Swift at Artsy.playground", "Resources", "img/welcome.png")
55
+ expect(File.exist?(embedded_img)).to eq(true)
56
+ end
57
+ end
58
+
59
+ it "embeds remote images inside the resources folder, and changes the MD content to match relative url" do
60
+ source = "spec/fixtures/wrapper/source/swift_at_artsy_1.md"
61
+
62
+ Dir.mktmpdir do |dir|
63
+ new_source = File.join(dir, File.basename(source))
64
+ FileUtils.cp(source, new_source)
65
+
66
+ subject = MarkdownWrapper.new(new_source, "Swift at Artsy")
67
+ # Switch out a relative link to a remote one
68
+ remote_image = "http://ortastuff.s3.amazonaws.com/site/images/twitter_black.png"
69
+ subject.playground_contents.gsub!("img/welcome.png", remote_image)
70
+
71
+ # Quacks like the value of `open`
72
+ class EmptyOpen
73
+ def read
74
+ ""
75
+ end
76
+ end
77
+
78
+ allow(subject).to receive(:open).and_return(EmptyOpen.new)
79
+ subject.generate
80
+
81
+ source_path = File.join(dir, "Swift at Artsy.playground", "Contents.swift")
82
+ expect(File.read(source_path)).to include("twitter_black.png")
83
+ expect(File.read(source_path)).to_not include(remote_image)
84
+
85
+ embedded_img = File.join(dir, "Swift at Artsy.playground", "Resources", "twitter_black.png")
86
+ expect(File.exist?(embedded_img)).to eq(true)
87
+ end
88
+ end
89
+ end
90
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: playgroundbook
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ash Furrow
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-18 00:00:00.000000000 Z
11
+ date: 2017-01-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: plist
@@ -59,8 +59,19 @@ executables:
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
+ - ".gitignore"
63
+ - ".rspec"
64
+ - ".rubocop.yml"
65
+ - ".ruby-version"
66
+ - Changelog.md
67
+ - CodeOfConduct.md
68
+ - Community.md
69
+ - Gemfile
70
+ - Gemfile.lock
71
+ - Guardfile
62
72
  - LICENSE
63
73
  - README.md
74
+ - Rakefile
64
75
  - bin/playgroundbook
65
76
  - lib/linter/abstract_linter.rb
66
77
  - lib/linter/chapter_linter.rb
@@ -83,6 +94,39 @@ files:
83
94
  - lib/renderer/playgroundbook_renderer.rb
84
95
  - lib/version.rb
85
96
  - lib/wrapper/markdown_wrapper.rb
97
+ - playgroundbook.gemspec
98
+ - spec/fixtures/Starter.playgroundbook/Contents/Chapters/Chapter1.playgroundchapter/Manifest.plist
99
+ - spec/fixtures/Starter.playgroundbook/Contents/Chapters/Chapter1.playgroundchapter/Pages/Page1.playgroundpage/Contents.swift
100
+ - spec/fixtures/Starter.playgroundbook/Contents/Chapters/Chapter1.playgroundchapter/Pages/Page1.playgroundpage/Manifest.plist
101
+ - spec/fixtures/Starter.playgroundbook/Contents/Chapters/Chapter1.playgroundchapter/Pages/Page2.playgroundpage/Contents.swift
102
+ - spec/fixtures/Starter.playgroundbook/Contents/Chapters/Chapter1.playgroundchapter/Pages/Page2.playgroundpage/Manifest.plist
103
+ - spec/fixtures/Starter.playgroundbook/Contents/Manifest.plist
104
+ - spec/fixtures/assets/file.jpeg
105
+ - spec/fixtures/book.yml
106
+ - spec/fixtures/test_chapter.playground/Contents.swift
107
+ - spec/fixtures/test_chapter.playground/contents.xcplayground
108
+ - spec/fixtures/wrapper/destination/swift_at_artsy_1.swift
109
+ - spec/fixtures/wrapper/source/Swift-at-Artsy.playground/Contents.swift
110
+ - spec/fixtures/wrapper/source/Swift-at-Artsy.playground/contents.xcplayground
111
+ - spec/fixtures/wrapper/source/swift_at_artsy_1.md
112
+ - spec/linter/chapter_linter_spec.rb
113
+ - spec/linter/chapter_manifest_linter_spec.rb
114
+ - spec/linter/contents_linter_spec.rb
115
+ - spec/linter/cutscene_page_linter_spec.rb
116
+ - spec/linter/cutscene_page_manifest_linter_spec.rb
117
+ - spec/linter/manfiest_linter_spec.rb
118
+ - spec/linter/page_linter_spec.rb
119
+ - spec/linter/page_manifest_linter_spec.rb
120
+ - spec/linter/playgroundbook_lint_spec.rb
121
+ - spec/linter/root_manifest_linter_spec.rb
122
+ - spec/renderer/chapter_collator_spec.rb
123
+ - spec/renderer/contents_manfiest_generator_spec.rb
124
+ - spec/renderer/glossary_generator_spec.rb
125
+ - spec/renderer/page_processor_spec.rb
126
+ - spec/renderer/page_writer_spec.rb
127
+ - spec/renderer/playgroundbook_renderer_spec.rb
128
+ - spec/spec_helper.rb
129
+ - spec/wrapper/markdown_wrapper_spec.rb
86
130
  homepage: https://github.com/ashfurrow/playground-book-lint
87
131
  licenses:
88
132
  - MIT