bookbindery 2.1.3 → 2.1.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 738c31dab5c4057b6f486aef21926f603615651c
4
- data.tar.gz: 3a149c514e408ff32ba77c6835dbd7b315646cd7
3
+ metadata.gz: e569c8b49b909c17b4b30acd65b3986b07ab304b
4
+ data.tar.gz: a55e74657a1f9e2e12c13de88fb9ae7e53d069d2
5
5
  SHA512:
6
- metadata.gz: b9f7024799d3f9318cdcc19d5a42653614a6f70bc1577d70cc796a8115ceae219ce29fef032f15c920581fbe9a35445e102ad436ce61c8fbbf5be6aecdbe1413
7
- data.tar.gz: e3cc42e4d350875b1115348fba6aaa1e12c9c8c41306f65991e03474edd1cb2966a2853ac8aa653830fc7ecd3c9c05979d2fcd74f3f2c374e5763c5964ac0ae6
6
+ metadata.gz: 19a3737931f428d599b991f09422bb307fb4749aa28729dcf8139a89e3b175c583497cafa28a0c68fcdd26baf0421318b05840d30d8dd16d4d29a9d7aab26b60
7
+ data.tar.gz: b3e5e09c41cf9db7dae8b231176b1ede5efa7a1e41c2472d01511ff54c44fb80be9a4540d6aee995df113151c944651577ca7d1c6c5e4363032738ba196f67fc
@@ -39,7 +39,7 @@ module Bookbinder
39
39
  begin
40
40
  command_runner.run command_name, command_arguments
41
41
 
42
- rescue Commands::Bind::VersionUnsupportedError => e
42
+ rescue Config::RemoteBindConfiguration::VersionUnsupportedError => e
43
43
  logger.error "config.yml at version '#{e.message}' has an unsupported API."
44
44
  1
45
45
  rescue Configuration::CredentialKeyError => e
@@ -58,7 +58,7 @@ module Bookbinder
58
58
  end
59
59
 
60
60
  private
61
-
61
+
62
62
  attr_reader :version_control_system
63
63
 
64
64
  end
@@ -1,5 +1,5 @@
1
1
  require_relative 'errors/cli_error'
2
- require_relative 'local_dita_to_html_converter'
2
+ require_relative 'dita_to_html_converter'
3
3
  require_relative 'sheller'
4
4
 
5
5
  module Bookbinder
@@ -1,24 +1,22 @@
1
+ require_relative '../dita_section_gatherer_factory'
1
2
  require_relative '../archive_menu_configuration'
2
- require_relative '../book'
3
+ require_relative '../values/output_locations'
4
+ require_relative '../values/dita_section'
3
5
  require_relative '../errors/cli_error'
4
- require_relative '../directory_helpers'
5
- require_relative '../publisher'
6
6
  require_relative '../values/section'
7
- require_relative '../values/dita_section'
8
- require_relative '../dita_section_gatherer'
9
- require_relative '../values/output_locations'
7
+ require_relative '../publisher'
8
+ require_relative '../book'
10
9
  require_relative 'naming'
11
10
 
12
11
  module Bookbinder
13
12
  module Commands
14
13
  class Bind
15
- VersionUnsupportedError = Class.new(RuntimeError)
16
-
17
14
  include Bookbinder::DirectoryHelperMethods
18
15
  include Commands::Naming
19
16
 
20
17
  def initialize(logger,
21
18
  config_fetcher,
19
+ config_factory,
22
20
  archive_menu_config,
23
21
  version_control_system,
24
22
  file_system_accessor,
@@ -28,9 +26,11 @@ module Bookbinder
28
26
  server_director,
29
27
  context_dir,
30
28
  dita_preprocessor,
31
- cloner_factory)
29
+ cloner_factory,
30
+ dita_section_gatherer_factory)
32
31
  @logger = logger
33
32
  @config_fetcher = config_fetcher
33
+ @config_factory = config_factory
34
34
  @archive_menu_config = archive_menu_config
35
35
  @version_control_system = version_control_system
36
36
  @file_system_accessor = file_system_accessor
@@ -41,6 +41,7 @@ module Bookbinder
41
41
  @context_dir = context_dir
42
42
  @dita_preprocessor = dita_preprocessor
43
43
  @cloner_factory = cloner_factory
44
+ @dita_section_gatherer_factory = dita_section_gatherer_factory
44
45
  end
45
46
 
46
47
  def usage
@@ -61,74 +62,39 @@ module Bookbinder
61
62
 
62
63
  @section_repository = Repositories::SectionRepository.new(logger)
63
64
  @gem_root = File.expand_path('../../../../', __FILE__)
64
- @publisher = Publisher.new(logger, sitemap_generator, static_site_generator, server_director, file_system_accessor)
65
+ publisher = Publisher.new(logger, sitemap_generator, static_site_generator, server_director, file_system_accessor)
65
66
 
66
67
  bind_source, *options = cli_arguments
67
68
 
68
- bind_config = bind_config(bind_source)
69
+ bind_config = config_factory.produce(bind_source)
70
+
69
71
  @versions = bind_config.fetch(:versions, [])
70
72
  @book_repo = bind_config[:book_repo]
71
73
 
72
- output_paths = output_directory_paths(bind_source)
73
- master_middleman_dir = output_paths.fetch(:master_middleman_dir)
74
- output_dir = output_paths.fetch(:output_dir)
75
- master_dir = File.join output_dir, 'master_middleman'
76
-
77
74
  output_locations = OutputLocations.new(
78
- workspace_dir = File.join(master_dir, 'source'),
79
- dita_home_dir = File.join(output_dir, 'dita'),
80
- cloned_dita_dir = File.join(dita_home_dir, 'dita_sections'),
81
- html_from_dita_dir = File.join(dita_home_dir, 'html_from_dita'),
82
- formatted_dir = File.join(dita_home_dir, 'site_generator_ready'),
83
- subnavs_for_layout_dir = File.join(workspace_dir, 'subnavs'),
84
- dita_subnav_template_path = File.join(workspace_dir, 'subnavs', '_dita_subnav_template.erb')
75
+ context_dir: context_dir,
76
+ final_app_dir: final_app_directory,
77
+ layout_repo_dir: layout_repo_path(generate_local_repo_dir(context_dir, bind_source)),
78
+ local_repo_dir: generate_local_repo_dir(context_dir, bind_source)
85
79
  )
86
80
 
87
- prepare_directories(final_app_directory,
88
- output_dir,
89
- workspace_dir,
90
- master_middleman_dir,
91
- master_dir,
92
- dita_home_dir)
93
-
94
- dita_section_config_hash = config.dita_sections || {}
95
- dita_sections = dita_section_config_hash.map do |dita_section_config|
96
- relative_path_to_dita_map = dita_section_config['ditamap_location']
97
- full_name = dita_section_config.fetch('repository', {}).fetch('name')
98
- target_ref = dita_section_config.fetch('repository', {})['ref']
99
- directory = dita_section_config['directory']
100
-
101
- DitaSection.new(nil, relative_path_to_dita_map, full_name, target_ref, directory, output_locations)
102
- end
103
-
104
- if bind_source == 'github'
105
- dita_section_gatherer = DitaSectionGatherer.new(version_control_system, output_locations, logger)
106
- gathered_dita_sections = dita_section_gatherer.gather(dita_sections, to: cloned_dita_dir)
107
- else
108
- gathered_dita_sections = dita_sections.map do |dita_section|
109
- relative_path_to_dita_map = dita_section.ditamap_location
110
- full_name = dita_section.full_name
111
- target_ref = dita_section.target_ref
112
- directory = dita_section.directory
81
+ prepare_directories(output_locations)
113
82
 
114
- path_to_local_copy = File.join output_paths[:local_repo_dir], directory
115
-
116
- DitaSection.new(path_to_local_copy, relative_path_to_dita_map, full_name, target_ref, directory, output_locations)
117
- end
118
- end
83
+ dita_gatherer = dita_section_gatherer_factory.produce(bind_source, output_locations)
84
+ gathered_dita_sections = dita_gatherer.gather(config.dita_sections)
119
85
 
120
86
  gathered_dita_sections.each do |dita_section|
121
87
  dita_preprocessor.preprocess(dita_section,
122
- subnavs_for_layout_dir,
123
- dita_subnav_template_path)
88
+ output_locations.subnavs_for_layout_dir,
89
+ output_locations.dita_subnav_template_path)
124
90
  end
125
91
 
126
92
  cloner = cloner_factory.produce(
127
93
  bind_source,
128
- output_paths[:local_repo_dir]
94
+ output_locations.local_repo_dir
129
95
  )
130
96
  sections = gather_sections(
131
- workspace_dir,
97
+ output_locations.source_for_site_generator,
132
98
  cloner,
133
99
  ('master' if options.include?('--ignore-section-refs'))
134
100
  )
@@ -138,7 +104,7 @@ module Bookbinder
138
104
  success = publisher.publish(
139
105
  subnavs,
140
106
  {verbose: cli_arguments.include?('--verbose')},
141
- output_paths,
107
+ output_locations,
142
108
  archive_menu_config.generate(bind_config, sections)
143
109
  )
144
110
 
@@ -147,9 +113,9 @@ module Bookbinder
147
113
 
148
114
  private
149
115
 
150
- attr_reader :publisher,
151
- :version_control_system,
116
+ attr_reader :version_control_system,
152
117
  :config_fetcher,
118
+ :config_factory,
153
119
  :archive_menu_config,
154
120
  :logger,
155
121
  :file_system_accessor,
@@ -159,7 +125,12 @@ module Bookbinder
159
125
  :server_director,
160
126
  :context_dir,
161
127
  :dita_preprocessor,
162
- :cloner_factory
128
+ :cloner_factory,
129
+ :dita_section_gatherer_factory
130
+
131
+ def generate_local_repo_dir(context_dir, bind_source)
132
+ File.expand_path('..', context_dir) if bind_source == 'local'
133
+ end
163
134
 
164
135
  def gather_sections(workspace, cloner, ref_override)
165
136
  config.sections.map do |attributes|
@@ -172,36 +143,24 @@ module Bookbinder
172
143
  ref: target_ref,
173
144
  parent_dir: workspace,
174
145
  dir_name: directory)
175
- @section_repository.get_instance(attributes,
176
- vcs_repo: vcs_repo,
177
- destination_dir: workspace,
178
- build: ->(*args) { Section.new(*args) })
146
+ @section_repository.get_instance(
147
+ attributes,
148
+ vcs_repo: vcs_repo,
149
+ destination_dir: workspace
150
+ ) { |*args| Section.new(*args) }
179
151
  end
180
152
  end
181
153
 
182
- def prepare_directories(final_app,
183
- output_dir,
184
- middleman_source,
185
- master_middleman_dir,
186
- middleman_dir,
187
- dita_processing_dir)
188
- forget_sections(output_dir)
189
- file_system_accessor.remove_directory File.join final_app, '.'
190
- file_system_accessor.remove_directory dita_processing_dir
191
-
192
- copy_directory_from_gem 'template_app', final_app
193
- copy_directory_from_gem 'master_middleman', middleman_dir
194
- file_system_accessor.copy File.join(master_middleman_dir, '.'), middleman_dir
195
-
196
- copy_version_master_middleman(middleman_source)
197
- end
154
+ def prepare_directories(locations)
155
+ forget_sections(locations.output_dir)
156
+ file_system_accessor.remove_directory(File.join(locations.final_app_dir, '.'))
157
+ file_system_accessor.remove_directory(locations.dita_home_dir)
198
158
 
199
- def forget_sections(middleman_scratch)
200
- file_system_accessor.remove_directory File.join middleman_scratch, '.'
201
- end
159
+ copy_directory_from_gem('template_app', locations.final_app_dir)
160
+ copy_directory_from_gem('master_middleman', locations.site_generator_home)
161
+ file_system_accessor.copy(File.join(locations.layout_repo_dir, '.'), locations.site_generator_home)
202
162
 
203
- def copy_directory_from_gem(dir, output_dir)
204
- file_system_accessor.copy File.join(@gem_root, "#{dir}/."), output_dir
163
+ copy_version_master_middleman(locations.source_for_site_generator)
205
164
  end
206
165
 
207
166
  # Copy the index file from each version into the version's directory. Because version
@@ -226,61 +185,18 @@ module Bookbinder
226
185
  end
227
186
  end
228
187
 
229
- def output_directory_paths(bind_source)
230
- local_repo_dir = (bind_source == 'local') ? File.expand_path('..', context_dir) : nil
231
-
232
- {
233
- final_app_dir: final_app_directory,
234
- local_repo_dir: local_repo_dir,
235
- output_dir: File.join(context_dir, output_dir_name),
236
- master_middleman_dir: layout_repo_path(local_repo_dir)
237
- }
188
+ def forget_sections(middleman_scratch)
189
+ file_system_accessor.remove_directory File.join middleman_scratch, '.'
238
190
  end
239
191
 
240
- def bind_config(bind_source)
241
- arguments = {
242
- sections: config.sections,
243
- book_repo: config.book_repo,
244
- host_for_sitemap: config.public_host,
245
- archive_menu: config.archive_menu
246
- }
247
-
248
- optional_arguments = {}
249
- optional_arguments.merge!(template_variables: config.template_variables) if config.respond_to?(:template_variables)
250
- if binding_from_github? bind_source
251
- config.versions.each { |version| arguments[:sections].concat sections_from version }
252
- optional_arguments.merge!(versions: config.versions)
253
- end
254
-
255
- arguments.merge! optional_arguments
192
+ def copy_directory_from_gem(dir, output_dir)
193
+ file_system_accessor.copy File.join(@gem_root, "#{dir}/."), output_dir
256
194
  end
257
195
 
258
196
  def config
259
197
  config_fetcher.fetch_config
260
198
  end
261
199
 
262
- def sections_from(version)
263
- Dir.mktmpdir('book_checkout') do |temp_workspace|
264
- book = Book.from_remote(logger: logger,
265
- full_name: config.book_repo,
266
- destination_dir: temp_workspace,
267
- ref: version,
268
- git_accessor: version_control_system,
269
- )
270
-
271
- book_checkout_value = File.join temp_workspace, book.directory
272
- config_file = File.join book_checkout_value, 'config.yml'
273
- attrs = YAML.load(File.read(config_file))['sections']
274
- raise VersionUnsupportedError.new(version) if attrs.nil?
275
-
276
- attrs.map do |section_hash|
277
- section_hash['repository']['ref'] = version
278
- section_hash['directory'] = File.join(version, section_hash['directory'])
279
- section_hash
280
- end
281
- end
282
- end
283
-
284
200
  def layout_repo_path(local_repo_dir)
285
201
  if config.has_option?('layout_repo')
286
202
  if local_repo_dir
@@ -0,0 +1,30 @@
1
+ require_relative 'local_bind_configuration'
2
+ require_relative 'remote_bind_configuration'
3
+
4
+ module Bookbinder
5
+ module Config
6
+ class BindConfigFactory
7
+ def initialize(logger, version_control_system, config_fetcher)
8
+ @logger = logger
9
+ @version_control_system = version_control_system
10
+ @config_fetcher = config_fetcher
11
+ end
12
+
13
+ def produce(bind_source)
14
+ if bind_source == 'github' && config.has_option?('versions')
15
+ RemoteBindConfiguration.new(logger, version_control_system, config).to_h
16
+ else
17
+ LocalBindConfiguration.new(config).to_h
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def config
24
+ config_fetcher.fetch_config
25
+ end
26
+
27
+ attr_reader :logger, :version_control_system, :config_fetcher
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,23 @@
1
+ module Bookbinder
2
+ module Config
3
+ class LocalBindConfiguration
4
+ def initialize(base_config)
5
+ @base_config = base_config
6
+ end
7
+
8
+ def to_h
9
+ {
10
+ sections: base_config.sections,
11
+ book_repo: base_config.book_repo,
12
+ host_for_sitemap: base_config.public_host,
13
+ archive_menu: base_config.archive_menu,
14
+ template_variables: base_config.template_variables
15
+ }
16
+ end
17
+
18
+ private
19
+
20
+ attr_reader :base_config
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,52 @@
1
+ module Bookbinder
2
+ module Config
3
+ class RemoteBindConfiguration
4
+ VersionUnsupportedError = Class.new(RuntimeError)
5
+
6
+ def initialize(logger, version_control_system, base_config)
7
+ @logger = logger
8
+ @version_control_system = version_control_system
9
+ @base_config = base_config
10
+ end
11
+
12
+ def to_h
13
+ sections = base_config.sections
14
+ base = {
15
+ sections: sections,
16
+ book_repo: base_config.book_repo,
17
+ host_for_sitemap: base_config.public_host,
18
+ archive_menu: base_config.archive_menu,
19
+ versions: base_config.versions,
20
+ template_variables: base_config.template_variables
21
+ }
22
+ base_config.versions.each { |version| sections.concat(sections_from(version)) }
23
+ base
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :logger, :version_control_system, :base_config
29
+
30
+ def sections_from(version)
31
+ Dir.mktmpdir('book_checkout') do |temp_workspace|
32
+ book = Book.from_remote(logger: logger,
33
+ full_name: base_config.book_repo,
34
+ destination_dir: temp_workspace,
35
+ ref: version,
36
+ git_accessor: version_control_system)
37
+
38
+ book_checkout_value = File.join temp_workspace, book.directory
39
+ config_file = File.join book_checkout_value, 'config.yml'
40
+ attrs = YAML.load(File.read(config_file))['sections']
41
+ raise VersionUnsupportedError.new(version) if attrs.nil?
42
+
43
+ attrs.map do |section_hash|
44
+ section_hash['repository']['ref'] = version
45
+ section_hash['directory'] = File.join(version, section_hash['directory'])
46
+ section_hash
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -132,7 +132,7 @@ module Bookbinder
132
132
  end
133
133
 
134
134
  CONFIG_REQUIRED_KEYS = %w(book_repo public_host)
135
- CONFIG_OPTIONAL_KEYS = %w(archive_menu dita_sections layout_repo versions pdf_index cred_repo pdf)
135
+ CONFIG_OPTIONAL_KEYS = %w(archive_menu layout_repo versions pdf_index cred_repo pdf)
136
136
 
137
137
  CONFIG_REQUIRED_KEYS.each do |method_name|
138
138
  define_method(method_name) do
@@ -150,6 +150,10 @@ module Bookbinder
150
150
  config.fetch('sections', [])
151
151
  end
152
152
 
153
+ def dita_sections
154
+ config.fetch('dita_sections', {})
155
+ end
156
+
153
157
  def has_option?(key)
154
158
  @config.has_key?(key)
155
159
  end
@@ -10,7 +10,7 @@ module Bookbinder
10
10
  end
11
11
 
12
12
  def format_html(src, dest)
13
- all_files_with_ext = file_system_accessor.find_files_with_ext('.html', src)
13
+ all_files_with_ext = file_system_accessor.find_files_with_ext('html', src)
14
14
 
15
15
  all_files_with_ext.map do |filepath|
16
16
  file_text = file_system_accessor.read filepath
@@ -0,0 +1,66 @@
1
+ require_relative 'values/subnav'
2
+
3
+ module Bookbinder
4
+ class DitaPreprocessor
5
+
6
+ ACCEPTED_IMAGE_FORMATS = %w(png jpeg jpg svg gif bmp tif tiff eps)
7
+
8
+ def initialize(dita_converter, dita_formatter, local_fs_accessor)
9
+ @dita_converter = dita_converter
10
+ @dita_formatter = dita_formatter
11
+ @local_fs_accessor = local_fs_accessor
12
+ end
13
+
14
+ def preprocess(dita_section,
15
+ subnavs_dir,
16
+ dita_subnav_template_path)
17
+ if dita_section.ditamap_location
18
+ dita_converter.convert_to_html dita_section, write_to: dita_section.html_from_dita_section_dir
19
+
20
+ generate_subnav(dita_section, dita_subnav_template_path, subnavs_dir)
21
+ end
22
+
23
+ dita_formatter.format_html dita_section.html_from_dita_section_dir, dita_section.formatted_section_dir
24
+
25
+ copy_images(dita_section)
26
+
27
+ local_fs_accessor.copy_contents(dita_section.formatted_section_dir,
28
+ dita_section.section_source_for_site_generator)
29
+ end
30
+
31
+ private
32
+
33
+ attr_reader :dita_converter, :dita_formatter, :local_fs_accessor
34
+
35
+ def generate_subnav(dita_section, dita_subnav_template_path, subnavs_dir)
36
+ dita_subnav_template_text = local_fs_accessor.read(dita_subnav_template_path)
37
+
38
+ tocjs_text = local_fs_accessor.read(File.join dita_section.html_from_dita_section_dir, 'index.html')
39
+ json_props_location = File.join('dita-subnav-props.json')
40
+ props_file_location = File.join(subnavs_dir, json_props_location)
41
+
42
+ subnav = dita_formatter.format_subnav(dita_section,
43
+ dita_subnav_template_text,
44
+ json_props_location,
45
+ tocjs_text)
46
+
47
+ local_fs_accessor.write text: subnav.json_links, to: props_file_location
48
+
49
+ local_fs_accessor.write text: subnav.text,
50
+ to: File.join(subnavs_dir, "dita_subnav.erb")
51
+ end
52
+
53
+ def copy_images(dita_section)
54
+ image_paths = ACCEPTED_IMAGE_FORMATS.map do |format|
55
+ local_fs_accessor.find_files_with_ext(format, dita_section.path_to_local_repo)
56
+ end.flatten
57
+
58
+ image_paths.each do |image_path|
59
+ local_fs_accessor.copy_including_intermediate_dirs(image_path,
60
+ dita_section.path_to_local_repo,
61
+ dita_section.section_source_for_site_generator)
62
+ end
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,23 @@
1
+ require_relative 'local_dita_section_gatherer'
2
+ require_relative 'remote_dita_section_gatherer'
3
+
4
+ module Bookbinder
5
+ class DitaSectionGathererFactory
6
+ def initialize(version_control_system, view_updater)
7
+ @version_control_system = version_control_system
8
+ @view_updater = view_updater
9
+ end
10
+
11
+ def produce(source_location, output_locations)
12
+ if source_location == 'github'
13
+ RemoteDitaSectionGatherer.new(version_control_system, view_updater, output_locations)
14
+ else
15
+ LocalDitaSectionGatherer.new(output_locations)
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :version_control_system, :view_updater
22
+ end
23
+ end
@@ -1,7 +1,7 @@
1
1
  require_relative '../bookbinder/values/dita_section'
2
2
 
3
3
  module Bookbinder
4
- class LocalDitaToHtmlConverter
4
+ class DitaToHtmlConverter
5
5
  DitaToHtmlLibraryFailure = Class.new(RuntimeError)
6
6
 
7
7
  def initialize(sheller, path_to_dita_ot_library)
@@ -10,7 +10,6 @@ module Bookbinder
10
10
  end
11
11
 
12
12
  def convert_to_html(dita_section, write_to: nil)
13
- absolute_path_to_ditamap = File.join dita_section.path_to_local_repo, dita_section.ditamap_location
14
13
  classpath = "#{path_to_dita_ot_library}/lib/xercesImpl.jar:" +
15
14
  "#{path_to_dita_ot_library}/lib/xml-apis.jar:" +
16
15
  "#{path_to_dita_ot_library}/lib/resolver.jar:" +
@@ -27,7 +26,12 @@ module Bookbinder
27
26
  "-Doutput.dir=#{write_to} " +
28
27
  "-Dtranstype='tocjs' " +
29
28
  "-Ddita.temp.dir='/tmp/bookbinder_dita' " +
30
- "-Dargs.input=#{absolute_path_to_ditamap} "
29
+ "-Dgenerate.copy.outer='2' " +
30
+ "-Dargs.input=#{dita_section.absolute_path_to_ditamap} "
31
+
32
+ if dita_section.absolute_path_to_ditaval
33
+ command += "-Dargs.filter=#{dita_section.absolute_path_to_ditaval} "
34
+ end
31
35
 
32
36
  begin
33
37
  sheller.run_command(command)
@@ -0,0 +1,31 @@
1
+ module Bookbinder
2
+ class LocalDitaSectionGatherer
3
+ def initialize(output_locations)
4
+ @output_locations = output_locations
5
+ end
6
+
7
+ def gather(dita_section_config_hash)
8
+ dita_section_config_hash.map do |dita_section_config|
9
+ relative_path_to_dita_map = dita_section_config['ditamap_location']
10
+ relative_path_to_dita_val = dita_section_config['ditaval_location']
11
+ full_name = dita_section_config.fetch('repository', {}).fetch('name')
12
+ target_ref = dita_section_config.fetch('repository', {})['ref']
13
+ directory = dita_section_config['directory']
14
+ path_to_local_copy = output_locations.local_repo_dir.join(directory)
15
+
16
+ DitaSection.new(path_to_local_copy,
17
+ relative_path_to_dita_map,
18
+ relative_path_to_dita_val,
19
+ full_name,
20
+ target_ref,
21
+ directory,
22
+ output_locations)
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :output_locations
29
+
30
+ end
31
+ end
@@ -40,20 +40,20 @@ module Bookbinder
40
40
  end
41
41
 
42
42
  def copy_contents(src, dest)
43
- contents = Dir.glob File.join(src, '**')
43
+ unless File.directory?(dest)
44
+ FileUtils.mkdir_p(dest)
45
+ end
46
+
47
+ contents = Dir.glob File.join(src, '**/*')
44
48
  contents.each do |dir|
45
49
  FileUtils.cp_r dir, dest
46
50
  end
47
51
  end
48
52
 
49
- def copy_named_directory_with_path(dir_name, src, dest)
50
- contents = Dir.glob File.join(src, "**/#{dir_name}")
51
- contents.each do |dir|
52
- relative_path_to_dir = relative_path_from(src, dir)
53
- extended_dest = File.join dest, relative_path_to_dir
54
- FileUtils.mkdir_p extended_dest
55
- copy_contents dir, extended_dest
56
- end
53
+ def copy_including_intermediate_dirs(file, root, dest)
54
+ path_within_destination = relative_path_from(root, file)
55
+ extended_dest = File.dirname(File.join dest, path_within_destination)
56
+ copy file, extended_dest
57
57
  end
58
58
 
59
59
  def rename_file(path, new_name)
@@ -62,7 +62,7 @@ module Bookbinder
62
62
  end
63
63
 
64
64
  def find_files_with_ext(ext, path)
65
- Dir[File.join path, '**/*'].select { |file| File.basename(file).match(ext) }
65
+ Dir[File.join path, '**/*'].select { |file| File.basename(file).include?(".#{ext}") }
66
66
  end
67
67
 
68
68
  def relative_path_from(src, target)
@@ -22,7 +22,7 @@ module Bookbinder
22
22
 
23
23
  command = <<-CMD
24
24
  wkhtmltopdf \
25
- --disable-external-links \
25
+ --enable-external-links \
26
26
  --disable-javascript \
27
27
  --load-error-handling ignore \
28
28
  --margin-top 26mm \
@@ -17,8 +17,8 @@ module Bookbinder
17
17
  end
18
18
 
19
19
  def publish(subnavs, cli_options, output_paths, publish_config)
20
- intermediate_directory = output_paths.fetch(:output_dir)
21
- final_app_dir = output_paths.fetch(:final_app_dir)
20
+ intermediate_directory = output_paths.output_dir
21
+ final_app_dir = output_paths.final_app_dir
22
22
  master_dir = File.join intermediate_directory, 'master_middleman'
23
23
  workspace_dir = File.join master_dir, 'source'
24
24
  build_directory = File.join master_dir, 'build/.'
@@ -50,7 +50,7 @@ module Bookbinder
50
50
  @static_site_generator.run(middleman_dir,
51
51
  workspace_dir,
52
52
  publish_config.fetch(:template_variables, {}),
53
- output_paths[:local_repo_dir],
53
+ output_paths.local_repo_dir,
54
54
  cli_options[:verbose],
55
55
  subnavs,
56
56
  publish_config[:host_for_sitemap],
@@ -0,0 +1,35 @@
1
+ require_relative '../../lib/bookbinder/deprecated_logger'
2
+ require_relative '../../lib/bookbinder/values/dita_section'
3
+
4
+ module Bookbinder
5
+ class RemoteDitaSectionGatherer
6
+ def initialize(version_control_system, view_updater, output_locations)
7
+ @version_control_system = version_control_system
8
+ @view_updater = view_updater
9
+ @cloned_dita_dir = output_locations.cloned_dita_dir
10
+ @output_locations = output_locations
11
+ end
12
+
13
+ def gather(dita_section_config_hash)
14
+ dita_section_config_hash.map do |dita_section_config|
15
+ view_updater.log "Gathering " + "#{dita_section_config.fetch('repository', {}).fetch('name')}".cyan
16
+ version_control_system.clone("git@github.com:#{dita_section_config.fetch('repository', {}).fetch('name')}",
17
+ dita_section_config['directory'],
18
+ path: cloned_dita_dir)
19
+
20
+ DitaSection.new(cloned_dita_dir.join(dita_section_config['directory']),
21
+ dita_section_config['ditamap_location'],
22
+ dita_section_config['ditaval_location'],
23
+ dita_section_config.fetch('repository', {}).fetch('name'),
24
+ dita_section_config.fetch('repository', {})['ref'],
25
+ dita_section_config['directory'],
26
+ output_locations)
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :version_control_system, :view_updater, :cloned_dita_dir, :output_locations
33
+
34
+ end
35
+ end
@@ -4,15 +4,16 @@ end
4
4
  require_relative '../configuration_fetcher'
5
5
  require_relative '../configuration_validator'
6
6
  require_relative '../dita_html_to_middleman_formatter'
7
+ require_relative '../dita_preprocessor'
7
8
  require_relative '../html_document_manipulator'
8
9
  require_relative '../ingest/cloner_factory'
9
- require_relative '../local_dita_preprocessor'
10
- require_relative '../local_dita_to_html_converter'
10
+ require_relative '../dita_to_html_converter'
11
11
  require_relative '../local_file_system_accessor'
12
12
  require_relative '../middleman_runner'
13
13
  require_relative '../spider'
14
14
  require_relative '../subnav_formatter'
15
15
  require_relative '../yaml_loader'
16
+ require_relative '../config/bind_config_factory'
16
17
 
17
18
  module Bookbinder
18
19
  module Repositories
@@ -69,6 +70,7 @@ module Bookbinder
69
70
  @bind ||= Commands::Bind.new(
70
71
  logger,
71
72
  configuration_fetcher,
73
+ bind_config_factory,
72
74
  ArchiveMenuConfiguration.new(
73
75
  loader: config_loader,
74
76
  config_filename: 'bookbinder.yml'
@@ -81,7 +83,8 @@ module Bookbinder
81
83
  server_director,
82
84
  File.absolute_path('.'),
83
85
  dita_preprocessor,
84
- Ingest::ClonerFactory.new(logger, version_control_system)
86
+ Ingest::ClonerFactory.new(logger, version_control_system),
87
+ DitaSectionGathererFactory.new(version_control_system, logger)
85
88
  )
86
89
  end
87
90
 
@@ -135,14 +138,14 @@ module Bookbinder
135
138
 
136
139
  def dita_preprocessor
137
140
  @dita_preprocessor ||=
138
- LocalDitaPreprocessor.new(local_dita_processor,
141
+ DitaPreprocessor.new(local_dita_processor,
139
142
  dita_html_to_middleman_formatter,
140
143
  local_file_system_accessor)
141
144
  end
142
145
 
143
146
  def local_dita_processor
144
147
  @local_dita_processor ||=
145
- LocalDitaToHtmlConverter.new(Sheller.new(logger),
148
+ DitaToHtmlConverter.new(Sheller.new(logger),
146
149
  ENV['PATH_TO_DITA_OT_LIBRARY'])
147
150
  end
148
151
 
@@ -163,6 +166,10 @@ module Bookbinder
163
166
  def local_file_system_accessor
164
167
  @local_file_system_accessor ||= LocalFileSystemAccessor.new
165
168
  end
169
+
170
+ def bind_config_factory
171
+ @bind_config_factory ||= Config::BindConfigFactory.new(logger, version_control_system, configuration_fetcher)
172
+ end
166
173
  end
167
174
  end
168
175
  end
@@ -10,7 +10,7 @@ module Bookbinder
10
10
  def get_instance(attributes,
11
11
  vcs_repo: nil,
12
12
  destination_dir: Dir.mktmpdir,
13
- build: nil)
13
+ &build)
14
14
  repository_config = attributes['repository']
15
15
  raise "section repository '#{repository_config}' is not a hash" unless repository_config.is_a?(Hash)
16
16
  raise "section repository '#{repository_config}' missing name key" unless repository_config['name']
@@ -1,13 +1,14 @@
1
1
  module Bookbinder
2
2
  DitaSection = Struct.new(:path_to_local_repo,
3
3
  :ditamap_location,
4
+ :ditaval_location,
4
5
  :full_name,
5
6
  :target_ref,
6
7
  :directory,
7
8
  :output_locations) do
8
9
  def subnav
9
10
  namespace = directory.gsub('/', '_')
10
- template = "#{directory}_subnav"
11
+ template = "dita_subnav"
11
12
  {namespace => template}
12
13
  end
13
14
 
@@ -22,5 +23,13 @@ module Bookbinder
22
23
  def section_source_for_site_generator
23
24
  File.join(output_locations.source_for_site_generator, directory)
24
25
  end
26
+
27
+ def absolute_path_to_ditamap
28
+ ditamap_location ? File.join(path_to_local_repo, ditamap_location) : nil
29
+ end
30
+
31
+ def absolute_path_to_ditaval
32
+ ditaval_location ? File.join(path_to_local_repo, ditaval_location) : nil
33
+ end
25
34
  end
26
35
  end
@@ -1,11 +1,62 @@
1
+ require_relative '../directory_helpers'
2
+
1
3
  module Bookbinder
2
- OutputLocations = Struct.new(
3
- :source_for_site_generator,
4
- :dita_home_dir,
5
- :cloned_dita_dir,
6
- :html_from_dita_dir,
7
- :formatted_dir,
8
- :subnavs_for_layout_dir,
9
- :dita_subnav_template_path
10
- )
11
- end
4
+ class OutputLocations
5
+ attr_reader :final_app_dir, :layout_repo_dir
6
+
7
+ include DirectoryHelperMethods
8
+
9
+ def initialize(final_app_dir: nil, layout_repo_dir: nil, context_dir: nil, local_repo_dir: nil)
10
+ @final_app_dir = final_app_dir
11
+ @layout_repo_dir = layout_repo_dir
12
+ @context_dir = context_dir
13
+ @local_repo_dir = local_repo_dir
14
+ end
15
+
16
+ def output_dir
17
+ context_dir.join(output_dir_name)
18
+ end
19
+
20
+ def local_repo_dir
21
+ Pathname(@local_repo_dir) if @local_repo_dir
22
+ end
23
+
24
+ def dita_home_dir
25
+ output_dir.join('dita')
26
+ end
27
+
28
+ def cloned_dita_dir
29
+ dita_home_dir.join('dita_sections')
30
+ end
31
+
32
+ def html_from_dita_dir
33
+ dita_home_dir.join('html_from_dita')
34
+ end
35
+
36
+ def formatted_dir
37
+ dita_home_dir.join('site_generator_ready')
38
+ end
39
+
40
+ def site_generator_home
41
+ output_dir.join('master_middleman')
42
+ end
43
+
44
+ def source_for_site_generator
45
+ site_generator_home.join('source')
46
+ end
47
+
48
+ def subnavs_for_layout_dir
49
+ source_for_site_generator.join('subnavs')
50
+ end
51
+
52
+ def dita_subnav_template_path
53
+ source_for_site_generator.join('subnavs', '_dita_subnav_template.erb')
54
+ end
55
+
56
+ private
57
+
58
+ def context_dir
59
+ Pathname(@context_dir)
60
+ end
61
+ end
62
+ end
@@ -30,26 +30,16 @@ module Bookbinder
30
30
  attributes,
31
31
  local_repo_dir,
32
32
  git_accessor).
33
- tap { |repo| repo.copy_from_local(workspace) }
33
+ tap { |repo| repo.copy_from_local(workspace) }
34
34
  else
35
35
  GitHubRepository.
36
36
  build_from_remote(bookbinder_logger, attributes, git_accessor).
37
37
  tap { |repo| repo.copy_from_remote(workspace, 'master') }
38
38
  end
39
- example = code_example_repo.get_instance(attributes,
40
- vcs_repo: vcs_repo,
41
- build: ->(path_to_repository,
42
- full_name,
43
- copied,
44
- _,
45
- destination_dir,
46
- directory_name) {
47
- CodeExample.new(path_to_repository,
48
- full_name,
49
- copied,
50
- destination_dir,
51
- directory_name)
52
- })
39
+ example = code_example_repo.get_instance(attributes, vcs_repo: vcs_repo) {
40
+ |path, name, copied, _, dest, directory|
41
+ CodeExample.new(path, name, copied, dest, directory)
42
+ }
53
43
  snippet, language = code_example_reader.get_snippet_and_language_at(at,
54
44
  example.path_to_repository,
55
45
  example.copied,
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: 2.1.3
4
+ version: 2.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Grafton
@@ -15,7 +15,7 @@ authors:
15
15
  autorequire:
16
16
  bindir: install_bin
17
17
  cert_chain: []
18
- date: 2015-03-11 00:00:00.000000000 Z
18
+ date: 2015-03-16 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: fog-aws
@@ -329,6 +329,9 @@ files:
329
329
  - lib/bookbinder/commands/tag.rb
330
330
  - lib/bookbinder/commands/update_local_doc_repos.rb
331
331
  - lib/bookbinder/commands/version.rb
332
+ - lib/bookbinder/config/bind_config_factory.rb
333
+ - lib/bookbinder/config/local_bind_configuration.rb
334
+ - lib/bookbinder/config/remote_bind_configuration.rb
332
335
  - lib/bookbinder/configuration.rb
333
336
  - lib/bookbinder/configuration_fetcher.rb
334
337
  - lib/bookbinder/configuration_validator.rb
@@ -337,7 +340,9 @@ files:
337
340
  - lib/bookbinder/directory_helpers.rb
338
341
  - lib/bookbinder/distributor.rb
339
342
  - lib/bookbinder/dita_html_to_middleman_formatter.rb
340
- - lib/bookbinder/dita_section_gatherer.rb
343
+ - lib/bookbinder/dita_preprocessor.rb
344
+ - lib/bookbinder/dita_section_gatherer_factory.rb
345
+ - lib/bookbinder/dita_to_html_converter.rb
341
346
  - lib/bookbinder/errors/cli_error.rb
342
347
  - lib/bookbinder/git_accessor.rb
343
348
  - lib/bookbinder/git_client.rb
@@ -346,13 +351,13 @@ files:
346
351
  - lib/bookbinder/ingest/cloner_factory.rb
347
352
  - lib/bookbinder/ingest/git_hub_repository_cloner.rb
348
353
  - lib/bookbinder/ingest/local_filesystem_cloner.rb
349
- - lib/bookbinder/local_dita_preprocessor.rb
350
- - lib/bookbinder/local_dita_to_html_converter.rb
354
+ - lib/bookbinder/local_dita_section_gatherer.rb
351
355
  - lib/bookbinder/local_file_system_accessor.rb
352
356
  - lib/bookbinder/middleman_runner.rb
353
357
  - lib/bookbinder/pdf_generator.rb
354
358
  - lib/bookbinder/publisher.rb
355
359
  - lib/bookbinder/pusher.rb
360
+ - lib/bookbinder/remote_dita_section_gatherer.rb
356
361
  - lib/bookbinder/remote_yaml_credential_provider.rb
357
362
  - lib/bookbinder/repositories/command_repository.rb
358
363
  - lib/bookbinder/repositories/section_repository.rb
@@ -1,30 +0,0 @@
1
- module Bookbinder
2
- class DitaSectionGatherer
3
- def initialize(version_control_system, output_locations, view_updater)
4
- @version_control_system = version_control_system
5
- @output_locations = output_locations
6
- @view_updater = view_updater
7
- end
8
-
9
- def gather(dita_sections, to: nil)
10
- dita_sections.map do |dita_section|
11
- view_updater.log "Gathering " + "#{dita_section.full_name}".cyan
12
- version_control_system.clone("git@github.com:#{dita_section.full_name}",
13
- dita_section.directory,
14
- path: to)
15
-
16
- DitaSection.new(File.join(to, dita_section.directory),
17
- dita_section.ditamap_location,
18
- dita_section.full_name,
19
- dita_section.target_ref,
20
- dita_section.directory,
21
- output_locations)
22
- end
23
- end
24
-
25
- private
26
-
27
- attr_reader :version_control_system, :view_updater, :output_locations
28
-
29
- end
30
- end
@@ -1,50 +0,0 @@
1
- require_relative 'values/subnav'
2
-
3
- module Bookbinder
4
- class LocalDitaPreprocessor
5
-
6
- def initialize(dita_converter, dita_formatter, local_file_system_accessor)
7
- @dita_converter = dita_converter
8
- @dita_formatter = dita_formatter
9
- @local_file_system_accessor = local_file_system_accessor
10
- end
11
-
12
- def preprocess(dita_section,
13
- subnavs_dir,
14
- dita_subnav_template_path)
15
- dita_converter.convert_to_html dita_section, write_to: dita_section.html_from_dita_section_dir
16
-
17
- dita_formatter.format_html dita_section.html_from_dita_section_dir, dita_section.formatted_section_dir
18
-
19
- dita_subnav_template_text = local_file_system_accessor.read(dita_subnav_template_path)
20
- tocjs_text = local_file_system_accessor.read(File.join dita_section.html_from_dita_section_dir, 'index.html')
21
-
22
- json_props_location = File.join(dita_section.directory + '-props.json')
23
- props_file_location = File.join(subnavs_dir, json_props_location)
24
-
25
- subnav = dita_formatter.format_subnav(dita_section,
26
- dita_subnav_template_text,
27
- json_props_location,
28
- tocjs_text)
29
-
30
- local_file_system_accessor.write text: subnav.json_links, to: props_file_location
31
-
32
- local_file_system_accessor.write text: subnav.text,
33
- to: File.join(subnavs_dir,
34
- filename="#{dita_section.directory}_subnav.erb")
35
-
36
- local_file_system_accessor.copy_named_directory_with_path('images',
37
- dita_section.html_from_dita_section_dir,
38
- dita_section.section_source_for_site_generator)
39
-
40
- local_file_system_accessor.copy_contents(dita_section.formatted_section_dir,
41
- dita_section.section_source_for_site_generator)
42
- end
43
-
44
-
45
- private
46
-
47
- attr_reader :dita_converter, :dita_formatter, :local_file_system_accessor
48
-
49
- end
50
- end