bookbindery 7.5.0 → 8.0.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 +4 -4
- data/bookbinder.gemspec +2 -2
- data/lib/bookbinder/commands/collection.rb +5 -7
- data/lib/bookbinder/commands/push_from_local.rb +9 -9
- data/lib/bookbinder/commands/run_publish_ci.rb +5 -5
- data/lib/bookbinder/config/cf_credentials.rb +5 -17
- data/lib/bookbinder/config/checkers/products_checker.rb +49 -0
- data/lib/bookbinder/config/checkers/{topics_checker.rb → subnav_topics_checker.rb} +7 -7
- data/lib/bookbinder/config/configuration.rb +8 -8
- data/lib/bookbinder/config/{subnav_config.rb → product_config.rb} +12 -7
- data/lib/bookbinder/config/section_config.rb +3 -2
- data/lib/bookbinder/config/validator.rb +4 -4
- data/lib/bookbinder/ingest/git_accessor.rb +1 -1
- data/lib/bookbinder/preprocessing/link_to_site_gen_dir.rb +2 -2
- data/lib/bookbinder/subnav/json_from_markdown_toc.rb +1 -1
- metadata +19 -19
- data/lib/bookbinder/config/checkers/subnavs_checker.rb +0 -49
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1a0d33f4425ffc7d20e10ef7d4db181383434597
|
4
|
+
data.tar.gz: 9e46a1a8c6a91b3c204b337c11db14b49b4297d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64b3f89db50a12afb1d050d5a993c630061a46c158113a318508546e825da51e1b66d0e96bf3da7c92f9276d781a2e69655f1b2adcad8cf61c98d638e50d9ccf
|
7
|
+
data.tar.gz: a62cd292cbaa71a015a02d39f6cc88cdeab30f5f3837c72e05e874720b87c38dbc7b8f972e784680ab1b111b635cb8df042ccb0648afca9528ee41751d1e802a
|
data/bookbinder.gemspec
CHANGED
@@ -2,7 +2,7 @@ require 'base64'
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'bookbindery'
|
5
|
-
s.version = '
|
5
|
+
s.version = '8.0.0'
|
6
6
|
s.summary = 'Markdown to Rackup application documentation generator'
|
7
7
|
s.description = 'A command line utility to be run in Book repositories to stitch together their constituent Markdown repos into a static-HTML-serving application'
|
8
8
|
s.authors = ['Mike Grafton', 'Lucas Marks', 'Gavin Morgan', 'Nikhil Gajwani', 'Dan Wendorf', 'Brenda Chan', 'Matthew Boedicker', 'Frank Kotsianas', 'Elena Sharma', 'Christa Hartsock', 'Michael Trestman']
|
@@ -29,11 +29,11 @@ Gem::Specification.new do |s|
|
|
29
29
|
s.add_runtime_dependency 'rack-rewrite'
|
30
30
|
s.add_runtime_dependency 'therubyracer'
|
31
31
|
s.add_runtime_dependency 'git', '~> 1.2.8'
|
32
|
-
s.add_runtime_dependency 'sendgrid-ruby'
|
33
32
|
s.add_runtime_dependency 'nokogiri', ['1.6.7.2']
|
34
33
|
|
35
34
|
s.add_development_dependency 'license_finder'
|
36
35
|
s.add_development_dependency 'pry-byebug'
|
37
36
|
s.add_development_dependency 'rake'
|
38
37
|
s.add_development_dependency 'rspec'
|
38
|
+
s.add_development_dependency 'sendgrid-ruby'
|
39
39
|
end
|
@@ -71,10 +71,9 @@ module Bookbinder
|
|
71
71
|
),
|
72
72
|
build_and_push_tarball,
|
73
73
|
bind,
|
74
|
-
|
75
|
-
push_local_to_staging,
|
74
|
+
push_local_to,
|
76
75
|
Commands::PushToProd.new(streams, logger, configuration_fetcher(Config::Configuration), Dir.mktmpdir),
|
77
|
-
Commands::RunPublishCI.new(bind,
|
76
|
+
Commands::RunPublishCI.new(bind, push_local_to, build_and_push_tarball),
|
78
77
|
Commands::Punch.new(streams, configuration_fetcher(Config::Configuration), version_control_system),
|
79
78
|
Commands::UpdateLocalDocRepos.new(
|
80
79
|
streams,
|
@@ -146,12 +145,11 @@ module Bookbinder
|
|
146
145
|
)
|
147
146
|
end
|
148
147
|
|
149
|
-
def
|
150
|
-
@
|
148
|
+
def push_local_to
|
149
|
+
@push_local_to ||= Commands::PushFromLocal.new(
|
151
150
|
streams,
|
152
151
|
logger,
|
153
|
-
configuration_fetcher(Config::Configuration)
|
154
|
-
'staging'
|
152
|
+
configuration_fetcher(Config::Configuration)
|
155
153
|
)
|
156
154
|
end
|
157
155
|
|
@@ -12,19 +12,19 @@ module Bookbinder
|
|
12
12
|
REQUIRED_AWS_KEYS = %w(access_key secret_key green_builds_bucket)
|
13
13
|
REQUIRED_CF_KEYS = %w(username password api_endpoint organization app_name)
|
14
14
|
|
15
|
-
def initialize(streams, logger, configuration_fetcher
|
15
|
+
def initialize(streams, logger, configuration_fetcher)
|
16
16
|
@streams = streams
|
17
17
|
@logger = logger
|
18
18
|
@configuration_fetcher = configuration_fetcher
|
19
|
-
@environment = environment
|
20
19
|
end
|
21
20
|
|
22
21
|
def usage
|
23
|
-
[
|
24
|
-
"Push the contents of final_app to the
|
22
|
+
["push_local_to <environment>",
|
23
|
+
"Push the contents of final_app to the specified environment using the credentials.yml"]
|
25
24
|
end
|
26
25
|
|
27
|
-
def run(
|
26
|
+
def run(cli_arguments)
|
27
|
+
@environment = cli_arguments.first
|
28
28
|
validate
|
29
29
|
deployment = Deploy::Deployment.new(
|
30
30
|
app_dir: './final_app',
|
@@ -50,6 +50,10 @@ module Bookbinder
|
|
50
50
|
|
51
51
|
attr_reader :configuration_fetcher, :environment, :streams
|
52
52
|
|
53
|
+
def command_name
|
54
|
+
'push_local_to'
|
55
|
+
end
|
56
|
+
|
53
57
|
def config
|
54
58
|
configuration_fetcher.fetch_config
|
55
59
|
end
|
@@ -58,10 +62,6 @@ module Bookbinder
|
|
58
62
|
configuration_fetcher.fetch_credentials(environment)
|
59
63
|
end
|
60
64
|
|
61
|
-
def command_name
|
62
|
-
"push_local_to_#{environment}"
|
63
|
-
end
|
64
|
-
|
65
65
|
def creds_error_message
|
66
66
|
<<-ERROR
|
67
67
|
Cannot locate a specific key in credentials.yml.
|
@@ -12,26 +12,26 @@ module Bookbinder
|
|
12
12
|
|
13
13
|
def usage
|
14
14
|
[command_name,
|
15
|
-
"Run publish,
|
15
|
+
"Run publish, push_local_to staging, and build_and_push_tarball for CI purposes"]
|
16
16
|
end
|
17
17
|
|
18
|
-
def initialize(publish_command,
|
18
|
+
def initialize(publish_command, push_local_to_command, build_and_push_tarball_command)
|
19
19
|
@publish_command = publish_command
|
20
|
-
@
|
20
|
+
@push_local_to_command = push_local_to_command
|
21
21
|
@build_and_push_tarball_command = build_and_push_tarball_command
|
22
22
|
end
|
23
23
|
|
24
24
|
def run(cli_args)
|
25
25
|
command_chain(
|
26
26
|
->{publish_command.run(['remote'] + cli_args)},
|
27
|
-
->{
|
27
|
+
->{push_local_to_command.run(['staging'])},
|
28
28
|
->{build_and_push_tarball_command.run([])}
|
29
29
|
)
|
30
30
|
end
|
31
31
|
|
32
32
|
private
|
33
33
|
|
34
|
-
attr_reader :publish_command, :
|
34
|
+
attr_reader :publish_command, :push_local_to_command, :build_and_push_tarball_command
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
@@ -23,7 +23,7 @@ module Bookbinder
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def routes
|
26
|
-
fetch(
|
26
|
+
fetch('host') if correctly_formatted_domain_and_routes?
|
27
27
|
end
|
28
28
|
|
29
29
|
def flat_routes
|
@@ -31,25 +31,21 @@ module Bookbinder
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def space
|
34
|
-
fetch(
|
34
|
+
fetch('space')
|
35
35
|
end
|
36
36
|
|
37
37
|
private
|
38
38
|
|
39
39
|
attr_reader :creds, :environment
|
40
40
|
|
41
|
-
def production?
|
42
|
-
environment == 'production'
|
43
|
-
end
|
44
|
-
|
45
41
|
def fetch(key)
|
46
|
-
creds.fetch(key)
|
42
|
+
creds.fetch('env').fetch(environment).fetch(key)
|
47
43
|
rescue KeyError => e
|
48
44
|
raise CredentialKeyError, e
|
49
45
|
end
|
50
46
|
|
51
|
-
def correctly_formatted_domain_and_routes?
|
52
|
-
routes_hash = fetch(
|
47
|
+
def correctly_formatted_domain_and_routes?
|
48
|
+
routes_hash = fetch('host')
|
53
49
|
domains = routes_hash.keys
|
54
50
|
domains.each { |domain| correctly_formatted_domain?(domain, routes_hash) }
|
55
51
|
end
|
@@ -61,14 +57,6 @@ module Bookbinder
|
|
61
57
|
raise "Hosts in credentials must be nested as an array under the desired domain #{domain}." unless routes_hash[domain].is_a? Array
|
62
58
|
raise "Did you mean to provide a hostname for the domain #{domain}? Check your credentials.yml." if routes_hash[domain].any?(&:nil?)
|
63
59
|
end
|
64
|
-
|
65
|
-
def host_key
|
66
|
-
"#{environment}_host"
|
67
|
-
end
|
68
|
-
|
69
|
-
def space_key
|
70
|
-
"#{environment}_space"
|
71
|
-
end
|
72
60
|
end
|
73
61
|
end
|
74
62
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Bookbinder
|
2
|
+
module Config
|
3
|
+
module Checkers
|
4
|
+
class ProductsChecker
|
5
|
+
MissingRequiredKeyError = Class.new(RuntimeError)
|
6
|
+
MissingProductsKeyError = Class.new(RuntimeError)
|
7
|
+
MissingProductIdError = Class.new(RuntimeError)
|
8
|
+
|
9
|
+
def check(config)
|
10
|
+
@config = config
|
11
|
+
|
12
|
+
if section_product_ids.count > 0
|
13
|
+
if config.products.empty?
|
14
|
+
MissingProductsKeyError.new('You must specify at least one product under the products key in config.yml')
|
15
|
+
elsif missing_products.count != 0
|
16
|
+
MissingProductIdError.new("Your config.yml is missing required product id under the products key. Required product ids are #{missing_products.join(", ")}.")
|
17
|
+
elsif invalid_products.any?
|
18
|
+
MissingRequiredKeyError.new("Your config.yml is missing required key(s) for products #{invalid_product_ids}. Required keys are #{required_product_keys.join(", ")}.")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_reader :config
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def invalid_products
|
28
|
+
config.products.map {|product_config| product_config unless product_config.valid? }
|
29
|
+
end
|
30
|
+
|
31
|
+
def invalid_product_ids
|
32
|
+
invalid_products.map(&:id).join(', ')
|
33
|
+
end
|
34
|
+
|
35
|
+
def missing_products
|
36
|
+
section_product_ids - config.products.map(&:id)
|
37
|
+
end
|
38
|
+
|
39
|
+
def required_product_keys
|
40
|
+
Bookbinder::Config::ProductConfig::CONFIG_REQUIRED_KEYS
|
41
|
+
end
|
42
|
+
|
43
|
+
def section_product_ids
|
44
|
+
config.sections.map(&:product_id).compact.uniq
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
module Bookbinder
|
2
2
|
module Config
|
3
3
|
module Checkers
|
4
|
-
class
|
4
|
+
class SubnavTopicsChecker
|
5
5
|
MissingRequiredKeyError = Class.new(RuntimeError)
|
6
6
|
|
7
7
|
def check(config)
|
8
8
|
@config = config
|
9
9
|
|
10
|
-
if
|
11
|
-
MissingRequiredKeyError.new("Your config.yml is missing required key(s) for
|
10
|
+
if invalid_products.any?
|
11
|
+
MissingRequiredKeyError.new("Your config.yml is missing required key(s) for subnav_topics in product id(s) #{invalid_product_ids}. Required keys are #{required_topic_keys.join(", ")}.")
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -16,16 +16,16 @@ module Bookbinder
|
|
16
16
|
|
17
17
|
private
|
18
18
|
|
19
|
-
def
|
20
|
-
config.
|
19
|
+
def invalid_products
|
20
|
+
config.products.select { |product_config| invalid_topics(product_config.subnav_topics).any? }
|
21
21
|
end
|
22
22
|
|
23
23
|
def invalid_topics(topics)
|
24
24
|
topics.map {|topic| topic unless topic.valid? }
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
28
|
-
|
27
|
+
def invalid_product_ids
|
28
|
+
invalid_products.map(&:id).join(', ')
|
29
29
|
end
|
30
30
|
|
31
31
|
def required_topic_keys
|
@@ -2,7 +2,7 @@ require_relative '../../../lib/bookbinder/config/dita_config_generator'
|
|
2
2
|
require_relative '../ingest/destination_directory'
|
3
3
|
require_relative '../ingest/repo_identifier'
|
4
4
|
require_relative 'section_config'
|
5
|
-
require_relative '
|
5
|
+
require_relative 'product_config'
|
6
6
|
|
7
7
|
module Bookbinder
|
8
8
|
module Config
|
@@ -53,7 +53,7 @@ module Bookbinder
|
|
53
53
|
|
54
54
|
def initialize(config)
|
55
55
|
@config = config
|
56
|
-
@
|
56
|
+
@products = assemble_products || []
|
57
57
|
end
|
58
58
|
|
59
59
|
CONFIG_REQUIRED_KEYS = %w(book_repo public_host)
|
@@ -97,15 +97,15 @@ module Bookbinder
|
|
97
97
|
|
98
98
|
alias_method :eql?, :==
|
99
99
|
|
100
|
-
attr_reader :
|
100
|
+
attr_reader :products
|
101
101
|
|
102
102
|
private
|
103
103
|
|
104
|
-
def
|
105
|
-
if config[:
|
106
|
-
config[:
|
107
|
-
|
108
|
-
Config::
|
104
|
+
def assemble_products
|
105
|
+
if config[:products]
|
106
|
+
config[:products].map do |product|
|
107
|
+
product.merge!({'subnav_exclusions' => subnav_exclusions})
|
108
|
+
Config::ProductConfig.new(product)
|
109
109
|
end
|
110
110
|
end
|
111
111
|
end
|
@@ -2,14 +2,14 @@ require_relative '../config/topic_config'
|
|
2
2
|
|
3
3
|
module Bookbinder
|
4
4
|
module Config
|
5
|
-
class
|
5
|
+
class ProductConfig
|
6
6
|
def initialize(config)
|
7
7
|
@config = config
|
8
|
-
@
|
8
|
+
@subnav_topics = assemble_topics || []
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
config['
|
11
|
+
def id
|
12
|
+
config['id']
|
13
13
|
end
|
14
14
|
|
15
15
|
def pdf_config
|
@@ -20,20 +20,25 @@ module Bookbinder
|
|
20
20
|
config['subnav_exclusions'] || []
|
21
21
|
end
|
22
22
|
|
23
|
+
def specifies_subnav?
|
24
|
+
!subnav_topics.empty?
|
25
|
+
end
|
26
|
+
|
23
27
|
def valid?
|
24
28
|
(CONFIG_REQUIRED_KEYS - config.keys).empty?
|
25
29
|
end
|
26
30
|
|
27
|
-
CONFIG_REQUIRED_KEYS = %w(
|
31
|
+
CONFIG_REQUIRED_KEYS = %w(id subnav_topics)
|
28
32
|
|
29
|
-
attr_reader :
|
33
|
+
attr_reader :subnav_topics
|
34
|
+
alias_method :subnav_name, :id
|
30
35
|
|
31
36
|
private
|
32
37
|
|
33
38
|
attr_reader :config
|
34
39
|
|
35
40
|
def assemble_topics
|
36
|
-
config['
|
41
|
+
config['subnav_topics'].map{|topic| Config::TopicConfig.new(topic)} if config['subnav_topics']
|
37
42
|
end
|
38
43
|
end
|
39
44
|
end
|
@@ -11,8 +11,8 @@ module Bookbinder
|
|
11
11
|
config['subnav_template']
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
15
|
-
config['
|
14
|
+
def product_id
|
15
|
+
config['product_id']
|
16
16
|
end
|
17
17
|
|
18
18
|
def desired_directory_name
|
@@ -60,6 +60,7 @@ module Bookbinder
|
|
60
60
|
def inspect
|
61
61
|
config.inspect
|
62
62
|
end
|
63
|
+
alias_method :subnav_name, :product_id
|
63
64
|
|
64
65
|
private
|
65
66
|
|
@@ -4,8 +4,8 @@ require_relative 'checkers/required_keys_checker'
|
|
4
4
|
require_relative 'checkers/repository_name_presence_checker'
|
5
5
|
require_relative 'checkers/ditamap_presence_checker'
|
6
6
|
require_relative 'checkers/section_presence_checker'
|
7
|
-
require_relative 'checkers/
|
8
|
-
require_relative 'checkers/
|
7
|
+
require_relative 'checkers/products_checker'
|
8
|
+
require_relative 'checkers/subnav_topics_checker'
|
9
9
|
|
10
10
|
module Bookbinder
|
11
11
|
module Config
|
@@ -22,8 +22,8 @@ module Bookbinder
|
|
22
22
|
Checkers::SectionPresenceChecker.new,
|
23
23
|
Checkers::DitamapPresenceChecker.new,
|
24
24
|
Checkers::ArchiveMenuChecker.new(@file_system_accessor),
|
25
|
-
Checkers::
|
26
|
-
Checkers::
|
25
|
+
Checkers::ProductsChecker.new,
|
26
|
+
Checkers::SubnavTopicsChecker.new
|
27
27
|
].map do |checker|
|
28
28
|
checker.check(config)
|
29
29
|
end
|
@@ -24,7 +24,7 @@ module Bookbinder
|
|
24
24
|
def get_links_and_headers
|
25
25
|
menu_items = []
|
26
26
|
|
27
|
-
config.
|
27
|
+
config.subnav_topics.map do |topic|
|
28
28
|
menu_items << { text: topic.title, title: true }
|
29
29
|
menu_items << { url: "/#{topic.toc_path}.html", text: topic.toc_nav_name }
|
30
30
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bookbindery
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 8.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Grafton
|
@@ -18,7 +18,7 @@ authors:
|
|
18
18
|
autorequire:
|
19
19
|
bindir: install_bin
|
20
20
|
cert_chain: []
|
21
|
-
date: 2016-02-
|
21
|
+
date: 2016-02-23 00:00:00.000000000 Z
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
24
24
|
name: fog-aws
|
@@ -216,20 +216,6 @@ dependencies:
|
|
216
216
|
- - "~>"
|
217
217
|
- !ruby/object:Gem::Version
|
218
218
|
version: 1.2.8
|
219
|
-
- !ruby/object:Gem::Dependency
|
220
|
-
name: sendgrid-ruby
|
221
|
-
requirement: !ruby/object:Gem::Requirement
|
222
|
-
requirements:
|
223
|
-
- - ">="
|
224
|
-
- !ruby/object:Gem::Version
|
225
|
-
version: '0'
|
226
|
-
type: :runtime
|
227
|
-
prerelease: false
|
228
|
-
version_requirements: !ruby/object:Gem::Requirement
|
229
|
-
requirements:
|
230
|
-
- - ">="
|
231
|
-
- !ruby/object:Gem::Version
|
232
|
-
version: '0'
|
233
219
|
- !ruby/object:Gem::Dependency
|
234
220
|
name: nokogiri
|
235
221
|
requirement: !ruby/object:Gem::Requirement
|
@@ -300,6 +286,20 @@ dependencies:
|
|
300
286
|
- - ">="
|
301
287
|
- !ruby/object:Gem::Version
|
302
288
|
version: '0'
|
289
|
+
- !ruby/object:Gem::Dependency
|
290
|
+
name: sendgrid-ruby
|
291
|
+
requirement: !ruby/object:Gem::Requirement
|
292
|
+
requirements:
|
293
|
+
- - ">="
|
294
|
+
- !ruby/object:Gem::Version
|
295
|
+
version: '0'
|
296
|
+
type: :development
|
297
|
+
prerelease: false
|
298
|
+
version_requirements: !ruby/object:Gem::Requirement
|
299
|
+
requirements:
|
300
|
+
- - ">="
|
301
|
+
- !ruby/object:Gem::Version
|
302
|
+
version: '0'
|
303
303
|
description: A command line utility to be run in Book repositories to stitch together
|
304
304
|
their constituent Markdown repos into a static-HTML-serving application
|
305
305
|
email: gmorgan@gopivotal.com
|
@@ -340,19 +340,19 @@ files:
|
|
340
340
|
- lib/bookbinder/config/checkers/archive_menu_checker.rb
|
341
341
|
- lib/bookbinder/config/checkers/ditamap_presence_checker.rb
|
342
342
|
- lib/bookbinder/config/checkers/duplicate_section_name_checker.rb
|
343
|
+
- lib/bookbinder/config/checkers/products_checker.rb
|
343
344
|
- lib/bookbinder/config/checkers/repository_name_presence_checker.rb
|
344
345
|
- lib/bookbinder/config/checkers/required_keys_checker.rb
|
345
346
|
- lib/bookbinder/config/checkers/section_presence_checker.rb
|
346
|
-
- lib/bookbinder/config/checkers/
|
347
|
-
- lib/bookbinder/config/checkers/topics_checker.rb
|
347
|
+
- lib/bookbinder/config/checkers/subnav_topics_checker.rb
|
348
348
|
- lib/bookbinder/config/configuration.rb
|
349
349
|
- lib/bookbinder/config/configuration_decorator.rb
|
350
350
|
- lib/bookbinder/config/dita_config_generator.rb
|
351
351
|
- lib/bookbinder/config/fetcher.rb
|
352
352
|
- lib/bookbinder/config/imprint/configuration.rb
|
353
|
+
- lib/bookbinder/config/product_config.rb
|
353
354
|
- lib/bookbinder/config/remote_yaml_credential_provider.rb
|
354
355
|
- lib/bookbinder/config/section_config.rb
|
355
|
-
- lib/bookbinder/config/subnav_config.rb
|
356
356
|
- lib/bookbinder/config/topic_config.rb
|
357
357
|
- lib/bookbinder/config/validator.rb
|
358
358
|
- lib/bookbinder/config/yaml_loader.rb
|
@@ -1,49 +0,0 @@
|
|
1
|
-
module Bookbinder
|
2
|
-
module Config
|
3
|
-
module Checkers
|
4
|
-
class SubnavsChecker
|
5
|
-
MissingRequiredKeyError = Class.new(RuntimeError)
|
6
|
-
MissingSubnavsKeyError = Class.new(RuntimeError)
|
7
|
-
MissingSubnavNameError = Class.new(RuntimeError)
|
8
|
-
|
9
|
-
def check(config)
|
10
|
-
@config = config
|
11
|
-
|
12
|
-
if section_subnav_names.count > 0
|
13
|
-
if config.subnavs.empty?
|
14
|
-
MissingSubnavsKeyError.new("You must specify at least one subnav under the subnavs key in config.yml")
|
15
|
-
elsif missing_subnavs.count != 0
|
16
|
-
MissingSubnavNameError.new("Your config.yml is missing required subnav names under the subnavs key. Required subnav names are #{missing_subnavs.join(", ")}.")
|
17
|
-
elsif invalid_subnavs.any?
|
18
|
-
MissingRequiredKeyError.new("Your config.yml is missing required key(s) for subnavs #{invalid_subnav_names}. Required keys are #{required_subnav_keys.join(", ")}.")
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
attr_reader :config
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def invalid_subnavs
|
28
|
-
config.subnavs.map {|subnav_config| subnav_config unless subnav_config.valid? }
|
29
|
-
end
|
30
|
-
|
31
|
-
def invalid_subnav_names
|
32
|
-
invalid_subnavs.map(&:subnav_name).join(", ")
|
33
|
-
end
|
34
|
-
|
35
|
-
def missing_subnavs
|
36
|
-
section_subnav_names - config.subnavs.map(&:subnav_name)
|
37
|
-
end
|
38
|
-
|
39
|
-
def required_subnav_keys
|
40
|
-
Bookbinder::Config::SubnavConfig::CONFIG_REQUIRED_KEYS
|
41
|
-
end
|
42
|
-
|
43
|
-
def section_subnav_names
|
44
|
-
config.sections.map(&:subnav_name).compact.uniq
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|