playgroundbook 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +110 -0
- data/Changelog.md +4 -0
- data/Gemfile +10 -9
- data/Gemfile.lock +4 -2
- data/Guardfile +2 -2
- data/Rakefile +3 -3
- data/bin/playgroundbook +9 -7
- data/lib/{playgroundbook_lint → linter}/abstract_linter.rb +2 -2
- data/lib/{playgroundbook_lint → linter}/chapter_linter.rb +4 -4
- data/lib/{playgroundbook_lint → linter}/chapter_manifest_linter.rb +5 -5
- data/lib/{playgroundbook_lint → linter}/contents_linter.rb +3 -3
- data/lib/{playgroundbook_lint → linter}/cutscene_page_linter.rb +2 -2
- data/lib/{playgroundbook_lint → linter}/cutscene_page_manifest_linter.rb +2 -2
- data/lib/{playgroundbook_lint → linter}/manifest_linter.rb +5 -5
- data/lib/{playgroundbook_lint → linter}/page_linter.rb +2 -2
- data/lib/{playgroundbook_lint → linter}/page_manifest_linter.rb +3 -3
- data/lib/{playgroundbook_lint → linter}/playgroundbook_lint.rb +6 -6
- data/lib/{playgroundbook_lint → linter}/root_manifest_linter.rb +9 -9
- data/lib/playgroundbook.rb +8 -7
- data/lib/{playgroundbook_renderer → renderer}/chapter_collator.rb +18 -18
- data/lib/renderer/contents_manifest_generator.rb +35 -0
- data/lib/{playgroundbook_renderer → renderer}/glossary_generator.rb +13 -16
- data/lib/{playgroundbook_renderer → renderer}/page_parser.rb +4 -3
- data/lib/{playgroundbook_renderer → renderer}/page_processor.rb +0 -0
- data/lib/{playgroundbook_renderer → renderer}/page_writer.rb +11 -11
- data/lib/{playgroundbook_renderer → renderer}/playgroundbook_renderer.rb +29 -29
- data/lib/version.rb +1 -1
- data/lib/wrapper/markdown_wrapper.rb +58 -0
- data/playground_book_lint.gemspec +14 -14
- data/spec/fixtures/wrapper/destination/swift_at_artsy_1.swift +199 -0
- data/spec/fixtures/wrapper/source/Swift-at-Artsy.playground/Contents.swift +199 -0
- data/spec/fixtures/wrapper/source/Swift-at-Artsy.playground/contents.xcplayground +4 -0
- data/spec/fixtures/wrapper/source/swift_at_artsy_1.md +183 -0
- data/spec/{playground_book_lint → linter}/chapter_linter_spec.rb +5 -5
- data/spec/{playground_book_lint → linter}/chapter_manifest_linter_spec.rb +12 -12
- data/spec/{playground_book_lint → linter}/contents_linter_spec.rb +3 -3
- data/spec/{playground_book_lint → linter}/cutscene_page_linter_spec.rb +2 -2
- data/spec/linter/cutscene_page_manifest_linter_spec.rb +63 -0
- data/spec/linter/manfiest_linter_spec.rb +71 -0
- data/spec/{playground_book_lint → linter}/page_linter_spec.rb +4 -4
- data/spec/{playground_book_lint → linter}/page_manifest_linter_spec.rb +13 -13
- data/spec/{playground_book_lint → linter}/playgroundbook_lint_spec.rb +6 -6
- data/spec/linter/root_manifest_linter_spec.rb +35 -0
- data/spec/renderer/chapter_collator_spec.rb +70 -0
- data/spec/renderer/contents_manfiest_generator_spec.rb +41 -0
- data/spec/renderer/glossary_generator_spec.rb +54 -0
- data/spec/{playgroundbook_renderer_spec → renderer}/page_processor_spec.rb +12 -12
- data/spec/{playgroundbook_renderer_spec → renderer}/page_writer_spec.rb +19 -19
- data/spec/renderer/playgroundbook_renderer_spec.rb +122 -0
- data/spec/spec_helper.rb +38 -38
- data/spec/wrapper/markdown_wrapper_spec.rb +33 -0
- metadata +43 -37
- data/lib/playgroundbook_renderer/contents_manifest_generator.rb +0 -35
- data/spec/playground_book_lint/cutscene_page_manifest_linter_spec.rb +0 -63
- data/spec/playground_book_lint/manfiest_linter_spec.rb +0 -71
- data/spec/playground_book_lint/root_manifest_linter_spec.rb +0 -35
- data/spec/playgroundbook_renderer_spec/chapter_collator_spec.rb +0 -70
- data/spec/playgroundbook_renderer_spec/contents_manfiest_generator_spec.rb +0 -41
- data/spec/playgroundbook_renderer_spec/glossary_generator_spec.rb +0 -52
- data/spec/playgroundbook_renderer_spec/playgroundbook_renderer_spec.rb +0 -122
data/lib/playgroundbook.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "linter/playgroundbook_lint"
|
2
|
+
require "renderer/playgroundbook_renderer"
|
3
|
+
require "wrapper/markdown_wrapper"
|
3
4
|
|
4
5
|
module Playgroundbook
|
5
|
-
ManifestFileName =
|
6
|
-
ContentsSwiftFileName =
|
7
|
-
ResourcesDirectoryName =
|
8
|
-
PagesDirectoryName =
|
9
|
-
end
|
6
|
+
ManifestFileName = "Manifest.plist".freeze
|
7
|
+
ContentsSwiftFileName = "Contents.swift".freeze
|
8
|
+
ResourcesDirectoryName = "Resources".freeze
|
9
|
+
PagesDirectoryName = "Pages".freeze
|
10
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "plist"
|
2
|
+
require "renderer/page_writer"
|
3
3
|
|
4
4
|
module Playgroundbook
|
5
|
-
SharedSourcesDirectoryName =
|
6
|
-
PreambleFileName =
|
5
|
+
SharedSourcesDirectoryName = "Sources".freeze
|
6
|
+
PreambleFileName = "Preamble.swift".freeze
|
7
7
|
|
8
8
|
class ChapterCollator
|
9
9
|
def initialize(page_writer = PageWriter.new, ui = Cork::Board.new)
|
@@ -11,12 +11,12 @@ module Playgroundbook
|
|
11
11
|
@ui = ui
|
12
12
|
end
|
13
13
|
|
14
|
-
def collate
|
14
|
+
def collate(chapter_name, parsed_chapter, imports)
|
15
15
|
@ui.puts "Processing #{chapter_name.green}."
|
16
16
|
|
17
17
|
chapter_directory_name = "#{chapter_name}.playgroundchapter"
|
18
18
|
Dir.mkdir(chapter_directory_name) unless Dir.exist?(chapter_directory_name)
|
19
|
-
Dir.chdir(chapter_directory_name) do
|
19
|
+
Dir.chdir(chapter_directory_name) do
|
20
20
|
Dir.mkdir(PagesDirectoryName) unless Dir.exist?(PagesDirectoryName)
|
21
21
|
Dir.chdir(PagesDirectoryName) do
|
22
22
|
parsed_chapter[:page_names].each_with_index do |page_name, index|
|
@@ -25,35 +25,35 @@ module Playgroundbook
|
|
25
25
|
page_contents = parsed_chapter[:page_contents][index]
|
26
26
|
page_dir_name = parsed_chapter[:page_dir_names][index]
|
27
27
|
|
28
|
-
@page_writer.write_page
|
28
|
+
@page_writer.write_page(page_name, page_dir_name, imports, page_contents)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
write_chapter_manifest
|
33
|
-
write_preamble
|
32
|
+
write_chapter_manifest(chapter_name, parsed_chapter[:page_dir_names])
|
33
|
+
write_preamble(parsed_chapter[:preamble])
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
def write_chapter_manifest
|
37
|
+
def write_chapter_manifest(chapter_name, page_dir_names)
|
38
38
|
manifest_contents = {
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
39
|
+
"Name" => chapter_name,
|
40
|
+
"Pages" => page_dir_names,
|
41
|
+
"Version" => "1.0",
|
42
|
+
"ContentVersion" => "1.0"
|
43
43
|
}
|
44
|
-
File.open(ManifestFileName,
|
44
|
+
File.open(ManifestFileName, "w") do |file|
|
45
45
|
file.write(manifest_contents.to_plist)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
def write_preamble
|
49
|
+
def write_preamble(preamble)
|
50
50
|
Dir.mkdir(SharedSourcesDirectoryName) unless Dir.exist?(SharedSourcesDirectoryName)
|
51
51
|
|
52
52
|
Dir.chdir(SharedSourcesDirectoryName) do
|
53
|
-
File.open(PreambleFileName,
|
53
|
+
File.open(PreambleFileName, "w") do |file|
|
54
54
|
file.write(preamble)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
59
|
-
end
|
59
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "plist"
|
2
|
+
|
3
|
+
module Playgroundbook
|
4
|
+
class ContentsManifestGenerator
|
5
|
+
def initialize(ui = Cork::Board.new)
|
6
|
+
@ui = ui
|
7
|
+
end
|
8
|
+
|
9
|
+
def generate(book_metadata)
|
10
|
+
@ui.puts "Generating main manifest file."
|
11
|
+
write_manifest_file(book_metadata)
|
12
|
+
@ui.puts "Manifest file generated."
|
13
|
+
end
|
14
|
+
|
15
|
+
def write_manifest_file(book_metadata)
|
16
|
+
File.open(ManifestFileName, "w") do |file|
|
17
|
+
file.write(manifest_contents(book_metadata).to_plist)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def manifest_contents(book_metadata)
|
22
|
+
chapters = book_metadata["chapters"].map { |c| "#{c}.playgroundchapter" }
|
23
|
+
manifest_contents = {
|
24
|
+
"Name" => book_metadata["name"],
|
25
|
+
"ContentIdentifier" => book_metadata["identifier"],
|
26
|
+
"DeploymentTarget" => book_metadata["deployment_target"] || "ios10.0",
|
27
|
+
"Chapters" => chapters,
|
28
|
+
"Version" => "1.0",
|
29
|
+
"ContentVersion" => "1.0"
|
30
|
+
}
|
31
|
+
manifest_contents["ImageReference"] = book_metadata["cover"] unless book_metadata["cover"].nil?
|
32
|
+
manifest_contents
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -1,16 +1,16 @@
|
|
1
|
-
require
|
1
|
+
require "uri"
|
2
2
|
|
3
3
|
module Playgroundbook
|
4
|
-
GlossaryFileName =
|
4
|
+
GlossaryFileName = "Glossary.plist".freeze
|
5
5
|
|
6
6
|
class GlossaryGenerator
|
7
|
-
def generate
|
7
|
+
def generate(parsed_chapters, chapter_names, glossary)
|
8
8
|
glossary_plist = {
|
9
|
-
|
9
|
+
"Terms" => {}
|
10
10
|
}
|
11
11
|
|
12
12
|
glossary.each do |term, definition|
|
13
|
-
glossary_plist[
|
13
|
+
glossary_plist["Terms"][term] = { "Definition" => definition }
|
14
14
|
escaped_term = URI.escape(term)
|
15
15
|
parsed_chapters.each_with_index do |chapter, i|
|
16
16
|
pages = chapter[:page_contents]
|
@@ -19,23 +19,20 @@ module Playgroundbook
|
|
19
19
|
|
20
20
|
pages.each_with_index do |page, j|
|
21
21
|
page_name = URI.escape(page_names[j])
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
})
|
29
|
-
break
|
30
|
-
end
|
22
|
+
next if page.scan("](glossary://#{escaped_term})").empty?
|
23
|
+
glossary_plist["Terms"][term]["FirstUse"] = {
|
24
|
+
"Title" => page_names[j],
|
25
|
+
"PageReference" => "#{chapter_name}/#{page_name}"
|
26
|
+
}
|
27
|
+
break
|
31
28
|
end
|
32
29
|
|
33
30
|
# Break if we found the first user.
|
34
|
-
break unless glossary_plist[
|
31
|
+
break unless glossary_plist["Terms"][term]["FirstUse"].empty?
|
35
32
|
end
|
36
33
|
end
|
37
34
|
|
38
|
-
File.open(glossary_file_name,
|
35
|
+
File.open(glossary_file_name, "w") do |file|
|
39
36
|
file.write(glossary_plist.to_plist)
|
40
37
|
end
|
41
38
|
end
|
@@ -1,18 +1,19 @@
|
|
1
1
|
module Playgroundbook
|
2
2
|
class PageParser
|
3
3
|
def parse_chapter_pages(chapter_contents)
|
4
|
-
|
4
|
+
# Looks for //// PageName separators.
|
5
|
+
page_names = chapter_contents.scan(/\/\/\/\/.*$/).map { |p| p.gsub("////", "").strip }
|
5
6
|
page_dir_names = page_names.map { |p| "#{p}.playgroundpage" }
|
6
7
|
|
7
8
|
split_file = chapter_contents.split(/\/\/\/\/.*$/)
|
8
|
-
page_contents = split_file.drop(1).map
|
9
|
+
page_contents = split_file.drop(1).map(&:strip)
|
9
10
|
preamble = split_file.first.strip
|
10
11
|
|
11
12
|
{
|
12
13
|
page_dir_names: page_dir_names,
|
13
14
|
page_names: page_names,
|
14
15
|
page_contents: page_contents,
|
15
|
-
preamble: preamble
|
16
|
+
preamble: preamble
|
16
17
|
}
|
17
18
|
end
|
18
19
|
end
|
File without changes
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "plist"
|
2
|
+
require "renderer/page_processor"
|
3
3
|
|
4
4
|
module Playgroundbook
|
5
5
|
class PageWriter
|
@@ -8,7 +8,7 @@ module Playgroundbook
|
|
8
8
|
@ui = ui
|
9
9
|
end
|
10
10
|
|
11
|
-
def write_page
|
11
|
+
def write_page(page_name, page_dir_name, imports, page_contents)
|
12
12
|
Dir.mkdir(page_dir_name) unless Dir.exist?(page_dir_name)
|
13
13
|
|
14
14
|
contents_with_import = "//#-hidden-code\n"
|
@@ -17,19 +17,19 @@ module Playgroundbook
|
|
17
17
|
contents_with_import += @page_processor.strip_extraneous_newlines(page_contents)
|
18
18
|
|
19
19
|
Dir.chdir(page_dir_name) do
|
20
|
-
File.open(ContentsSwiftFileName,
|
20
|
+
File.open(ContentsSwiftFileName, "w") do |file|
|
21
21
|
file.write(contents_with_import)
|
22
22
|
end
|
23
23
|
|
24
|
-
File.open(MANIFEST_FILE_NAME,
|
25
|
-
file.write
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
24
|
+
File.open(MANIFEST_FILE_NAME, "w") do |file|
|
25
|
+
file.write({
|
26
|
+
"Name" => page_name,
|
27
|
+
"LiveViewMode" => "HiddenByDefault",
|
28
|
+
"Version" => "1.0",
|
29
|
+
"ContentVersion" => "1.0"
|
30
30
|
}.to_plist)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
35
|
-
end
|
35
|
+
end
|
@@ -1,15 +1,15 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
1
|
+
require "colored"
|
2
|
+
require "pathname"
|
3
|
+
require "yaml"
|
4
|
+
require "fileutils"
|
5
|
+
require "renderer/contents_manifest_generator"
|
6
|
+
require "renderer/chapter_collator"
|
7
|
+
require "renderer/page_parser"
|
8
|
+
require "renderer/glossary_generator"
|
9
9
|
|
10
10
|
module Playgroundbook
|
11
|
-
ContentsDirectoryName =
|
12
|
-
ChaptersDirName =
|
11
|
+
ContentsDirectoryName = "Contents".freeze
|
12
|
+
ChaptersDirName = "Chapters".freeze
|
13
13
|
|
14
14
|
# A renderer for playground books.
|
15
15
|
class Renderer < AbstractLinter
|
@@ -20,12 +20,12 @@ module Playgroundbook
|
|
20
20
|
attr_accessor :glossary_generator
|
21
21
|
attr_accessor :ui
|
22
22
|
|
23
|
-
def initialize(yaml_file_name,
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
def initialize(yaml_file_name,
|
24
|
+
contents_manifest_generator = ContentsManifestGenerator.new,
|
25
|
+
page_parser = PageParser.new,
|
26
|
+
chapter_collator = ChapterCollator.new,
|
27
|
+
glossary_generator = GlossaryGenerator.new,
|
28
|
+
ui = Cork::Board.new)
|
29
29
|
@yaml_file_name = yaml_file_name
|
30
30
|
@contents_manifest_generator = contents_manifest_generator
|
31
31
|
@page_parser = page_parser
|
@@ -34,19 +34,19 @@ module Playgroundbook
|
|
34
34
|
@ui = ui
|
35
35
|
end
|
36
36
|
|
37
|
-
def render
|
37
|
+
def render
|
38
38
|
ui.puts "Rendering #{yaml_file_name.green}..."
|
39
|
-
|
39
|
+
|
40
40
|
book = yaml_contents
|
41
41
|
book_dir_name = "#{book['name']}.playgroundbook"
|
42
42
|
book_chapter_contents = []
|
43
43
|
# TODO: Validate YAML contents?
|
44
44
|
begin
|
45
|
-
book_chapter_contents = book[
|
45
|
+
book_chapter_contents = book["chapters"].map do |chapter|
|
46
46
|
File.read("#{chapter}.playground/Contents.swift")
|
47
47
|
end
|
48
48
|
rescue => e
|
49
|
-
ui.puts
|
49
|
+
ui.puts "Failed to open playground Contents.swift file."
|
50
50
|
raise e
|
51
51
|
end
|
52
52
|
parsed_chapters = book_chapter_contents.map { |c| page_parser.parse_chapter_pages(c) }
|
@@ -56,29 +56,29 @@ module Playgroundbook
|
|
56
56
|
Dir.mkdir(ContentsDirectoryName) unless Dir.exist?(ContentsDirectoryName)
|
57
57
|
Dir.chdir(ContentsDirectoryName) do
|
58
58
|
Dir.mkdir(ResourcesDirectoryName) unless Dir.exist?(ResourcesDirectoryName) # Always create a Resources dir, even if empty.
|
59
|
-
resources_dir = book[
|
60
|
-
|
59
|
+
resources_dir = book["resources"]
|
60
|
+
unless resources_dir.nil? || resources_dir.empty?
|
61
61
|
@ui.puts "Copying resource directory (#{resources_dir.green}) contents."
|
62
62
|
Dir.glob("../../#{resources_dir}/*").each do |file|
|
63
63
|
FileUtils.cp(file, ResourcesDirectoryName)
|
64
64
|
end
|
65
65
|
end
|
66
|
-
@contents_manifest_generator.generate
|
66
|
+
@contents_manifest_generator.generate(book)
|
67
67
|
|
68
68
|
Dir.mkdir(ChaptersDirName) unless Dir.exist?(ChaptersDirName)
|
69
69
|
Dir.chdir(ChaptersDirName) do
|
70
70
|
# Chapter file name becomes chapter name in playground book.
|
71
|
-
book[
|
71
|
+
book["chapters"].each_with_index do |chapter_file_name, index|
|
72
72
|
parsed_chapter = parsed_chapters[index]
|
73
|
-
@chapter_collator.collate
|
73
|
+
@chapter_collator.collate(chapter_file_name, parsed_chapter, book["imports"] || ["UIKit"])
|
74
74
|
end
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
|
-
unless book[
|
79
|
-
@ui.puts
|
80
|
-
@glossary_generator.generate
|
81
|
-
end
|
78
|
+
unless book["glossary"].nil?
|
79
|
+
@ui.puts "Generating glossary."
|
80
|
+
@glossary_generator.generate(parsed_chapters, book["chapters"], book["glossary"])
|
81
|
+
end
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
data/lib/version.rb
CHANGED
@@ -0,0 +1,58 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
|
3
|
+
module Playgroundbook
|
4
|
+
# Converts a Markdown file into a Swift Playground
|
5
|
+
# Needs to:
|
6
|
+
# - Switch out code from being in a block to being a root element
|
7
|
+
# - Comment out non-code comments
|
8
|
+
# - Embed images inside the Resources Dir
|
9
|
+
#
|
10
|
+
class MarkdownWrapper
|
11
|
+
attr_accessor :source, :name, :playground_contents
|
12
|
+
|
13
|
+
def initialize(source, name)
|
14
|
+
self.source = source
|
15
|
+
self.name = name
|
16
|
+
self.playground_contents = File.read(source)
|
17
|
+
end
|
18
|
+
|
19
|
+
def generate
|
20
|
+
contents = swap_code_context(playground_contents)
|
21
|
+
create_a_playground_wrapper(contents)
|
22
|
+
end
|
23
|
+
|
24
|
+
def swap_code_context(file_content)
|
25
|
+
prefix = "/*:\n"
|
26
|
+
suffix = "*/"
|
27
|
+
content = file_content.gsub("```swift", "*/\n").gsub("```", "/*:")
|
28
|
+
prefix + content + suffix
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_a_playground_wrapper(file_content)
|
32
|
+
folder = File.dirname(source)
|
33
|
+
playground = File.join(folder, name + ".playground")
|
34
|
+
|
35
|
+
FileUtils.rm_r(playground) if Dir.exist?(playground)
|
36
|
+
Dir.mkdir(playground)
|
37
|
+
|
38
|
+
xcplayground = <<-XML
|
39
|
+
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
|
40
|
+
<playground version='5.0' target-platform='osx' display-mode='rendered'>
|
41
|
+
<timeline fileName='timeline.xctimeline'/>
|
42
|
+
</playground>
|
43
|
+
XML
|
44
|
+
|
45
|
+
timeline = <<-XML
|
46
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
47
|
+
<Timeline
|
48
|
+
version = "3.0">
|
49
|
+
<TimelineItems>
|
50
|
+
</TimelineItems>
|
51
|
+
</Timeline>
|
52
|
+
XML
|
53
|
+
File.write(File.join(playground, "contents.xcplayground"), xcplayground)
|
54
|
+
File.write(File.join(playground, "timeline.xctimeline"), timeline)
|
55
|
+
File.write(File.join(playground, "Contents.swift"), file_content)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -1,21 +1,21 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
lib = File.expand_path(
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
4
|
+
require "version"
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
7
|
+
s.name = "playgroundbook"
|
8
8
|
s.version = Playgroundbook::VERSION
|
9
|
-
s.licenses = [
|
10
|
-
s.summary =
|
11
|
-
s.description =
|
12
|
-
s.authors = [
|
13
|
-
s.homepage =
|
14
|
-
s.email =
|
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
15
|
s.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
16
|
-
s.require_paths = [
|
17
|
-
s.executables = [
|
18
|
-
s.add_runtime_dependency
|
19
|
-
s.add_runtime_dependency
|
20
|
-
s.add_runtime_dependency
|
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
21
|
end
|