bookbindery 2.0.1 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/bookbinder.rb +2 -2
- data/lib/bookbinder/app_fetcher.rb +2 -6
- data/lib/bookbinder/archive.rb +1 -1
- data/lib/bookbinder/book.rb +7 -2
- data/lib/bookbinder/cli.rb +4 -5
- data/lib/bookbinder/code_example_reader.rb +1 -1
- data/lib/bookbinder/command_validator.rb +30 -10
- data/lib/bookbinder/commands/bind.rb +58 -53
- data/lib/bookbinder/commands/help.rb +4 -4
- data/lib/bookbinder/commands/naming.rb +14 -4
- data/lib/bookbinder/commands/push_from_local.rb +51 -0
- data/lib/bookbinder/commands/push_to_prod.rb +1 -2
- data/lib/bookbinder/commands/run_publish_ci.rb +1 -1
- data/lib/bookbinder/commands/tag.rb +1 -1
- data/lib/bookbinder/commands/version.rb +5 -4
- data/lib/bookbinder/configuration.rb +49 -28
- data/lib/bookbinder/configuration_fetcher.rb +1 -1
- data/lib/bookbinder/configuration_validator.rb +40 -37
- data/lib/bookbinder/{bookbinder_logger.rb → deprecated_logger.rb} +1 -1
- data/lib/bookbinder/distributor.rb +16 -9
- data/lib/bookbinder/dita_html_to_middleman_formatter.rb +26 -8
- data/lib/bookbinder/dita_section.rb +8 -2
- data/lib/bookbinder/git_hub_repository.rb +7 -20
- data/lib/bookbinder/html_document_manipulator.rb +21 -0
- data/lib/bookbinder/ingest/cloner_factory.rb +25 -0
- data/lib/bookbinder/ingest/git_hub_repository_cloner_facade.rb +26 -0
- data/lib/bookbinder/ingest/local_filesystem_cloner_facade.rb +28 -0
- data/lib/bookbinder/local_dita_preprocessor.rb +33 -5
- data/lib/bookbinder/local_dita_to_html_converter.rb +26 -28
- data/lib/bookbinder/local_file_system_accessor.rb +0 -5
- data/lib/bookbinder/publisher.rb +1 -1
- data/lib/bookbinder/remote_yaml_credential_provider.rb +1 -1
- data/lib/bookbinder/repositories/command_repository.rb +21 -5
- data/lib/bookbinder/section.rb +12 -1
- data/lib/bookbinder/subnav.rb +4 -0
- data/lib/bookbinder/subnav_formatter.rb +37 -0
- data/lib/bookbinder/user_message.rb +10 -1
- data/master_middleman/bookbinder_helpers.rb +3 -3
- metadata +46 -40
- data/lib/bookbinder/commands/push_local_to_staging.rb +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: abe74d9727cc4ccb6456bb2c8e6b5474a99951b7
|
4
|
+
data.tar.gz: 80e90cd7e5c6f7582eb2c41683c75e0b7df2f10c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e16a8861042949b496d942efa08fb59441ca789f7f73bfaa244a1b5b1c9cf266b267d3333b389e4f1f88c565bb9c622fbb3879b7f7c5ce5348247f04d0d0c8b
|
7
|
+
data.tar.gz: 6a12e088c5ec3ca21f2f229b92235eec8644fc18cc4c86e71eb5a7beb9e60a8f97dca26e9ee72072e2082f32007b3c34bcfaa300556e252d9923bd68ff847b74
|
data/lib/bookbinder.rb
CHANGED
@@ -11,7 +11,7 @@ require 'vienna'
|
|
11
11
|
require 'popen4'
|
12
12
|
require 'puma'
|
13
13
|
|
14
|
-
require_relative 'bookbinder/
|
14
|
+
require_relative 'bookbinder/deprecated_logger'
|
15
15
|
require_relative 'bookbinder/git_client'
|
16
16
|
require_relative 'bookbinder/section'
|
17
17
|
require_relative 'bookbinder/book'
|
@@ -39,7 +39,7 @@ require_relative 'bookbinder/distributor'
|
|
39
39
|
require_relative 'bookbinder/commands/bookbinder_command'
|
40
40
|
require_relative 'bookbinder/commands/build_and_push_tarball'
|
41
41
|
require_relative 'bookbinder/commands/bind'
|
42
|
-
require_relative 'bookbinder/commands/
|
42
|
+
require_relative 'bookbinder/commands/push_from_local'
|
43
43
|
require_relative 'bookbinder/commands/push_to_prod'
|
44
44
|
require_relative 'bookbinder/commands/run_publish_ci'
|
45
45
|
require_relative 'bookbinder/commands/update_local_doc_repos'
|
@@ -17,12 +17,8 @@ module Bookbinder
|
|
17
17
|
cf_routes.apps_by_host_and_domain.has_key?([host, domain])
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
existing_hosts.map { |domain, host| apps_for_host(cf_routes, domain, host) }
|
23
|
-
else
|
24
|
-
raise "cannot find currently deployed app."
|
25
|
-
end
|
20
|
+
return nil if existing_hosts.empty?
|
21
|
+
app_groups = existing_hosts.map { |domain, host| apps_for_host(cf_routes, domain, host) }
|
26
22
|
apps_for_existing_routes = app_groups.first
|
27
23
|
apps_for_existing_routes.first
|
28
24
|
end
|
data/lib/bookbinder/archive.rb
CHANGED
data/lib/bookbinder/book.rb
CHANGED
@@ -23,9 +23,10 @@ module Bookbinder
|
|
23
23
|
git_accessor: git_accessor)
|
24
24
|
end
|
25
25
|
|
26
|
+
@target_ref = target_ref || 'master'
|
27
|
+
|
26
28
|
@repository = GitHubRepository.new(logger: logger,
|
27
29
|
full_name: full_name,
|
28
|
-
target_ref: target_ref,
|
29
30
|
github_token: github_token,
|
30
31
|
git_accessor: git_accessor)
|
31
32
|
@git_accessor = git_accessor
|
@@ -44,11 +45,15 @@ module Bookbinder
|
|
44
45
|
end
|
45
46
|
|
46
47
|
def copy_from_remote(destination_dir)
|
47
|
-
@repository.copy_from_remote(destination_dir)
|
48
|
+
@repository.copy_from_remote(destination_dir, target_ref)
|
48
49
|
end
|
49
50
|
|
50
51
|
def tag_self_and_sections_with(tag)
|
51
52
|
(@section_vcs_repos + [@repository]).each { |repo| repo.tag_with tag }
|
52
53
|
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
attr_reader :target_ref
|
53
58
|
end
|
54
59
|
end
|
data/lib/bookbinder/cli.rb
CHANGED
@@ -9,10 +9,9 @@ require_relative 'user_message_presenter'
|
|
9
9
|
module Bookbinder
|
10
10
|
class Cli
|
11
11
|
def run(args)
|
12
|
-
command_name = args
|
13
|
-
command_arguments = args[1..-1]
|
12
|
+
command_name, *command_arguments = args
|
14
13
|
|
15
|
-
logger =
|
14
|
+
logger = DeprecatedLogger.new
|
16
15
|
commands = Repositories::CommandRepository.new(logger)
|
17
16
|
|
18
17
|
command_validator = CommandValidator.new(commands, commands.help.usage_message)
|
@@ -24,11 +23,11 @@ module Bookbinder
|
|
24
23
|
terminal = Terminal.new
|
25
24
|
|
26
25
|
user_message = command_validator.validate(command_name)
|
27
|
-
if user_message.
|
26
|
+
if user_message.error?
|
28
27
|
error_message = user_message_presenter.get_error(user_message)
|
29
28
|
terminal.update(error_message)
|
30
29
|
return 1
|
31
|
-
elsif user_message.
|
30
|
+
elsif user_message.warn?
|
32
31
|
warning_message = user_message_presenter.get_warning(user_message)
|
33
32
|
terminal.update(warning_message)
|
34
33
|
end
|
@@ -1,5 +1,6 @@
|
|
1
|
-
require_relative 'cli_error'
|
2
1
|
require 'ostruct'
|
2
|
+
require_relative 'cli_error'
|
3
|
+
require_relative 'commands/naming'
|
3
4
|
require_relative 'user_message'
|
4
5
|
|
5
6
|
module Bookbinder
|
@@ -9,20 +10,39 @@ module Bookbinder
|
|
9
10
|
@usage_text = usage_text
|
10
11
|
end
|
11
12
|
|
12
|
-
def validate
|
13
|
-
|
14
|
-
if
|
15
|
-
UserMessage.new
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
13
|
+
def validate(command_name)
|
14
|
+
candidate = Candidate.new(command_name, commands)
|
15
|
+
if candidate.unrecognized?
|
16
|
+
UserMessage.new(
|
17
|
+
"Unrecognized #{candidate.command_type} '#{command_name}'\n#{usage_text}",
|
18
|
+
EscalationType.error
|
19
|
+
)
|
20
|
+
elsif candidate.deprecated_match
|
21
|
+
UserMessage.new(
|
22
|
+
"Use of #{command_name} is deprecated. " +
|
23
|
+
"The preferred usage is below: \n#{candidate.deprecated_match.usage}",
|
24
|
+
EscalationType.warn
|
25
|
+
)
|
21
26
|
else
|
22
27
|
UserMessage.new "Success", EscalationType.success
|
23
28
|
end
|
24
29
|
end
|
25
30
|
|
31
|
+
Candidate = Struct.new(:command_name, :commands) do
|
32
|
+
include Bookbinder::Commands::Naming
|
33
|
+
|
34
|
+
def unrecognized?
|
35
|
+
commands.none? { |command| command.command_for?(command_name) }
|
36
|
+
end
|
37
|
+
|
38
|
+
def deprecated_match
|
39
|
+
@deprecated_match ||= commands.find { |command|
|
40
|
+
command.respond_to?(:deprecated_command_for?) &&
|
41
|
+
command.deprecated_command_for?(command_name)
|
42
|
+
}
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
26
46
|
private
|
27
47
|
|
28
48
|
attr_reader :commands, :usage_text
|
@@ -26,7 +26,8 @@ module Bookbinder
|
|
26
26
|
final_app_directory,
|
27
27
|
server_director,
|
28
28
|
context_dir,
|
29
|
-
dita_preprocessor
|
29
|
+
dita_preprocessor,
|
30
|
+
cloner_factory)
|
30
31
|
@logger = logger
|
31
32
|
@config_fetcher = config_fetcher
|
32
33
|
@archive_menu_config = archive_menu_config
|
@@ -38,6 +39,7 @@ module Bookbinder
|
|
38
39
|
@server_director = server_director
|
39
40
|
@context_dir = context_dir
|
40
41
|
@dita_preprocessor = dita_preprocessor
|
42
|
+
@cloner_factory = cloner_factory
|
41
43
|
end
|
42
44
|
|
43
45
|
def usage
|
@@ -60,23 +62,27 @@ module Bookbinder
|
|
60
62
|
|
61
63
|
@publisher = Publisher.new(logger, sitemap_generator, static_site_generator, server_director, file_system_accessor)
|
62
64
|
|
63
|
-
|
65
|
+
bind_source, *options = cli_arguments
|
64
66
|
|
65
|
-
output_paths = output_directory_paths(
|
66
|
-
|
67
|
-
|
68
|
-
@
|
67
|
+
output_paths = output_directory_paths(bind_source)
|
68
|
+
|
69
|
+
bind_config = bind_config(bind_source)
|
70
|
+
@versions = bind_config.fetch(:versions, [])
|
71
|
+
@book_repo = bind_config[:book_repo]
|
69
72
|
|
70
73
|
master_middleman_dir = output_paths.fetch(:master_middleman_dir)
|
71
74
|
output_dir = output_paths.fetch(:output_dir)
|
72
75
|
|
76
|
+
master_dir = File.join output_dir, 'master_middleman'
|
77
|
+
workspace_dir = File.join master_dir, 'source'
|
78
|
+
|
73
79
|
dita_processing_dir = File.join output_dir, 'dita'
|
74
80
|
dita_section_dir = File.join dita_processing_dir, 'dita_sections'
|
75
81
|
dita_processed_dir = File.join dita_processing_dir, 'html_from_dita'
|
82
|
+
subnavs_dir = File.join workspace_dir, 'subnavs'
|
83
|
+
dita_subnav_template_path = File.join workspace_dir, 'subnavs', '_dita_subnav_template.erb'
|
76
84
|
formatted_dir = File.join dita_processing_dir, 'site_generator_ready'
|
77
85
|
|
78
|
-
master_dir = File.join output_dir, 'master_middleman'
|
79
|
-
workspace_dir = File.join master_dir, 'source'
|
80
86
|
prepare_directories(final_app_directory,
|
81
87
|
output_dir,
|
82
88
|
workspace_dir,
|
@@ -95,11 +101,11 @@ module Bookbinder
|
|
95
101
|
DitaSection.new(nil, relative_path_to_dita_map, full_name, target_ref, directory)
|
96
102
|
end
|
97
103
|
|
98
|
-
if
|
104
|
+
if bind_source == 'github'
|
99
105
|
dita_section_gatherer = DitaSectionGatherer.new(version_control_system, logger)
|
100
|
-
|
106
|
+
gathered_dita_sections = dita_section_gatherer.gather(dita_sections, to: dita_section_dir)
|
101
107
|
else
|
102
|
-
|
108
|
+
gathered_dita_sections = dita_sections.map do |dita_section|
|
103
109
|
relative_path_to_dita_map = dita_section.ditamap_location
|
104
110
|
full_name = dita_section.full_name
|
105
111
|
target_ref = dita_section.target_ref
|
@@ -111,17 +117,32 @@ module Bookbinder
|
|
111
117
|
end
|
112
118
|
end
|
113
119
|
|
114
|
-
|
120
|
+
gathered_dita_sections.each do |dita_section|
|
121
|
+
dita_preprocessor.preprocess(dita_section,
|
122
|
+
dita_processed_dir,
|
123
|
+
formatted_dir,
|
124
|
+
workspace_dir,
|
125
|
+
subnavs_dir,
|
126
|
+
dita_subnav_template_path)
|
127
|
+
end
|
115
128
|
|
116
|
-
|
129
|
+
cloner = cloner_factory.produce(
|
130
|
+
bind_source,
|
131
|
+
output_paths[:local_repo_dir]
|
132
|
+
)
|
133
|
+
sections = gather_sections(
|
134
|
+
workspace_dir,
|
135
|
+
cloner,
|
136
|
+
('master' if options.include?('--ignore-section-refs'))
|
137
|
+
)
|
117
138
|
|
118
|
-
subnavs =
|
139
|
+
subnavs = (sections + gathered_dita_sections).map(&:subnav).reduce(&:merge)
|
119
140
|
|
120
141
|
success = publisher.publish(
|
121
142
|
subnavs,
|
122
143
|
{verbose: cli_arguments.include?('--verbose')},
|
123
144
|
output_paths,
|
124
|
-
archive_menu_config.generate(
|
145
|
+
archive_menu_config.generate(bind_config, sections)
|
125
146
|
)
|
126
147
|
|
127
148
|
success ? 0 : 1
|
@@ -140,23 +161,20 @@ module Bookbinder
|
|
140
161
|
:sitemap_generator,
|
141
162
|
:server_director,
|
142
163
|
:context_dir,
|
143
|
-
:dita_preprocessor
|
164
|
+
:dita_preprocessor,
|
165
|
+
:cloner_factory
|
144
166
|
|
145
|
-
def gather_sections(workspace,
|
167
|
+
def gather_sections(workspace, cloner, ref_override)
|
146
168
|
config.sections.map do |attributes|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
build_from_remote(logger, attributes, nil, version_control_system).
|
157
|
-
tap { |repo| repo.copy_from_remote(workspace) }
|
158
|
-
end
|
159
|
-
|
169
|
+
target_ref = ref_override ||
|
170
|
+
attributes.fetch('repository', {})['ref'] ||
|
171
|
+
'master'
|
172
|
+
repo_name = attributes.fetch('repository').fetch('name')
|
173
|
+
directory = attributes['directory']
|
174
|
+
vcs_repo = cloner.call(from: repo_name,
|
175
|
+
ref: target_ref,
|
176
|
+
parent_dir: workspace,
|
177
|
+
dir_name: directory)
|
160
178
|
@section_repository.get_instance(attributes,
|
161
179
|
vcs_repo: vcs_repo,
|
162
180
|
destination_dir: workspace,
|
@@ -217,8 +235,8 @@ module Bookbinder
|
|
217
235
|
end
|
218
236
|
end
|
219
237
|
|
220
|
-
def output_directory_paths(
|
221
|
-
local_repo_dir = (
|
238
|
+
def output_directory_paths(bind_source)
|
239
|
+
local_repo_dir = (bind_source == 'local') ? File.expand_path('..', context_dir) : nil
|
222
240
|
|
223
241
|
{
|
224
242
|
final_app_dir: final_app_directory,
|
@@ -228,7 +246,7 @@ module Bookbinder
|
|
228
246
|
}
|
229
247
|
end
|
230
248
|
|
231
|
-
def
|
249
|
+
def bind_config(bind_source)
|
232
250
|
arguments = {
|
233
251
|
sections: config.sections,
|
234
252
|
book_repo: config.book_repo,
|
@@ -238,7 +256,7 @@ module Bookbinder
|
|
238
256
|
|
239
257
|
optional_arguments = {}
|
240
258
|
optional_arguments.merge!(template_variables: config.template_variables) if config.respond_to?(:template_variables)
|
241
|
-
if
|
259
|
+
if binding_from_github? bind_source
|
242
260
|
config.versions.each { |version| arguments[:sections].concat sections_from version }
|
243
261
|
optional_arguments.merge!(versions: config.versions)
|
244
262
|
end
|
@@ -281,9 +299,8 @@ module Bookbinder
|
|
281
299
|
destination_dir = Dir.mktmpdir
|
282
300
|
repository = GitHubRepository.build_from_remote(logger,
|
283
301
|
section,
|
284
|
-
'master',
|
285
302
|
version_control_system)
|
286
|
-
repository.copy_from_remote(destination_dir)
|
303
|
+
repository.copy_from_remote(destination_dir, 'master')
|
287
304
|
if repository
|
288
305
|
File.join(destination_dir, repository.directory)
|
289
306
|
else
|
@@ -296,25 +313,13 @@ module Bookbinder
|
|
296
313
|
end
|
297
314
|
|
298
315
|
def arguments_are_valid?(arguments)
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
nothing_special = arguments[1..-1].empty?
|
303
|
-
|
304
|
-
%w(local github).include?(arguments[0]) && (tag_provided || verbose || nothing_special)
|
316
|
+
bind_source, *options = arguments
|
317
|
+
valid_options = %w(--verbose --ignore-section-refs).to_set
|
318
|
+
%w(local github).include?(bind_source) && options.to_set.subset?(valid_options)
|
305
319
|
end
|
306
320
|
|
307
|
-
def
|
308
|
-
config.has_option?('versions') &&
|
309
|
-
end
|
310
|
-
|
311
|
-
def subnavs_by_dir_name(sections)
|
312
|
-
sections.reduce({}) do |subnavs, section|
|
313
|
-
namespace = section.directory.gsub('/', '_')
|
314
|
-
template = section.subnav_template || 'default'
|
315
|
-
|
316
|
-
subnavs.merge(namespace => template)
|
317
|
-
end
|
321
|
+
def binding_from_github?(bind_location)
|
322
|
+
config.has_option?('versions') && bind_location != 'local'
|
318
323
|
end
|
319
324
|
end
|
320
325
|
end
|
@@ -10,10 +10,6 @@ module Bookbinder
|
|
10
10
|
@other_commands = other_commands
|
11
11
|
end
|
12
12
|
|
13
|
-
def command_name
|
14
|
-
'--help'
|
15
|
-
end
|
16
|
-
|
17
13
|
def usage
|
18
14
|
[command_name, "Print this message"]
|
19
15
|
end
|
@@ -29,6 +25,10 @@ module Bookbinder
|
|
29
25
|
|
30
26
|
private
|
31
27
|
|
28
|
+
def command_name
|
29
|
+
'--help'
|
30
|
+
end
|
31
|
+
|
32
32
|
def command_usage_messages
|
33
33
|
(flags + standard_commands).reduce('') { |message, command|
|
34
34
|
"#{message}#{usage_indent}#{formatted_usage(command)}\n"
|
@@ -3,10 +3,6 @@ require 'active_support/inflector'
|
|
3
3
|
module Bookbinder
|
4
4
|
module Commands
|
5
5
|
module Naming
|
6
|
-
def command_name
|
7
|
-
self.class.name.demodulize.underscore
|
8
|
-
end
|
9
|
-
|
10
6
|
def command_for?(test_command_name)
|
11
7
|
command_name == test_command_name
|
12
8
|
end
|
@@ -14,6 +10,20 @@ module Bookbinder
|
|
14
10
|
def flag?
|
15
11
|
command_name.match(/^--/)
|
16
12
|
end
|
13
|
+
|
14
|
+
def command_type
|
15
|
+
if flag?
|
16
|
+
'flag'
|
17
|
+
else
|
18
|
+
'command'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def command_name
|
25
|
+
self.class.name.demodulize.underscore
|
26
|
+
end
|
17
27
|
end
|
18
28
|
end
|
19
29
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require_relative '../distributor'
|
2
|
+
require_relative 'bookbinder_command'
|
3
|
+
require_relative 'naming'
|
4
|
+
|
5
|
+
module Bookbinder
|
6
|
+
module Commands
|
7
|
+
class PushFromLocal
|
8
|
+
include Commands::Naming
|
9
|
+
|
10
|
+
def initialize(logger, configuration_fetcher, environment)
|
11
|
+
@logger = logger
|
12
|
+
@configuration_fetcher = configuration_fetcher
|
13
|
+
@environment = environment
|
14
|
+
end
|
15
|
+
|
16
|
+
def usage
|
17
|
+
[command_name,
|
18
|
+
"Push the contents of final_app to the #{environment} host specified in credentials.yml"]
|
19
|
+
end
|
20
|
+
|
21
|
+
def run(_)
|
22
|
+
Distributor.build(@logger, options).distribute
|
23
|
+
0
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
attr_reader :configuration_fetcher, :environment
|
29
|
+
|
30
|
+
def config
|
31
|
+
@config ||= configuration_fetcher.fetch_config
|
32
|
+
end
|
33
|
+
|
34
|
+
def command_name
|
35
|
+
"push_local_to_#{environment}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def options
|
39
|
+
{
|
40
|
+
app_dir: './final_app',
|
41
|
+
build_number: ENV['BUILD_NUMBER'],
|
42
|
+
|
43
|
+
aws_credentials: config.aws_credentials,
|
44
|
+
cf_credentials: config.cf_credentials(environment),
|
45
|
+
|
46
|
+
book_repo: config.book_repo,
|
47
|
+
}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|