giblish 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 536fb7fa58df4bca2bfa5b73f68ebec0dd32bff797c3401cd20e6ccb20450db7
4
- data.tar.gz: 3f6f51691b25f64cf80da13d9467f5ea8f1ee296390efd7f77cd0ce49d7195c7
3
+ metadata.gz: 692017a96101341d60e2a0243d6b22441f75dab56904aa97a91f9c272e3c0630
4
+ data.tar.gz: f4e6e3bc7843484ee414b880ed562b8d94a49913f6637ee5a8c7233d56b99491
5
5
  SHA512:
6
- metadata.gz: 855851b721c005724dd76daeafeb43945bda104f0edc3628530efa4b1a87bece735547be67f9ac584fbae8b1b640f36b19cc98112864e22ff1edd775be23a9a6
7
- data.tar.gz: ef6c403e03b3abf628ddd896e935f3dbaf096a4368bb1702d665f269de1eddbccd2a2efeb2647e00dfa18888a7b82d47be711b39e4cddedcd7006ede4d96d471
6
+ metadata.gz: 32186232754bfc2362c1ac18465747de784c8ce950226223bd67f342c0145cac91af6b0c6364a0c3b211cfba11367bc0959d08a01faf191d9f021f695231239f
7
+ data.tar.gz: b89358a5bb1945492ea14d0e74a42f9364da494a378911b84b062f632353b0350424b709da7d637d9c16095a778d8aa95a7a90a419376b02cb50e634b4b8e2a4
@@ -17,9 +17,9 @@ jobs:
17
17
  sudo apt -y install binutils
18
18
  - name: Install needed packages
19
19
  run: |
20
- sudo apt-get -y install libpango1.0-dev graphviz
20
+ sudo apt-get -y install libpango1.0-dev graphviz libwebp-dev libzstd-dev
21
21
  - name: Checkout Giblish
22
- uses: actions/checkout@v2
22
+ uses: actions/checkout@v3
23
23
  - name: Set up Ruby
24
24
  uses: ruby/setup-ruby@v1
25
25
  with:
data/.gitignore CHANGED
@@ -9,7 +9,6 @@
9
9
  /test/tmp/
10
10
  /test/version_tmp/
11
11
  /tmp/
12
- /.vscode/
13
12
 
14
13
  # Used by dotenv library to load environment variables.
15
14
  # .env
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.1.2
1
+ 3.1.3
data/Changelog.adoc CHANGED
@@ -1,12 +1,27 @@
1
1
  = giblish changelog
2
2
  :docid: G-006
3
3
 
4
- == Not yet in place
4
+ == Some of the things Not yet in place
5
5
 
6
6
  * Investigate how to remove tmp/cache files and dirs during graph generation
7
7
  * Update docs for giblish.
8
8
  ** write instructions for github webhook triggered generation
9
9
  * Update the default css for giblish html generation.
10
+ * Implement a way for a user to customize the index page
11
+
12
+ == v2.1.0
13
+
14
+ Changes/New functionality::
15
+ * asciidoctor-diagram is required if it exists, this makes diagrams in documents render.
16
+ * giblish now complies with these precedence rules for document attributes:
17
+ .. An attribute passed to the API or CLI whose value does not end in @
18
+ .. (giblish specific) An attribute defined in an attribute provider for a specific source node
19
+ .. An attribute defined in the document
20
+ .. An attribute passed to the API or CLI whose value or name ends in @
21
+ .. (giblish specific) The default value set by giblish, if applicable
22
+ .. The default value set by asciidoctor, if applicable
23
+ +
24
+ this is an augumentation of the ones found here: https://docs.asciidoctor.org/asciidoc/latest/attributes/assignment-precedence/
10
25
 
11
26
  == v2.0.0
12
27
 
@@ -21,7 +36,7 @@ Breaking changes::
21
36
  This release includes a complete refactoring of almost the entire code base.
22
37
 
23
38
  Breaking changes::
24
- * The '-w' flag is removed
39
+ * The '-w' flag is removed
25
40
  * The text search parameters interface has changed completely. A written specification of this interface is included in the docs.
26
41
  * The '-r' flag will, for html generation, *copy everything* under the given directory to the target location.
27
42
  ** the previous restriction on folder names has been removed.
@@ -46,7 +61,7 @@ Changes/New functionality::
46
61
  ** the implementation of the server-side search tools are written completely in ruby and does no longer depend on an external 'grep' tool.
47
62
  ** almost all needed infrastructure for implementing a server-side search script has been implemented within the 'giblish' gem.
48
63
  * The asciidoctor toolchain dependencies are updated to the latest versions (at the time of release).
49
-
64
+
50
65
 
51
66
  == v0.8.0
52
67
 
data/giblish.gemspec CHANGED
@@ -49,7 +49,6 @@ Gem::Specification.new do |spec|
49
49
  spec.add_development_dependency "standard", "~> 1.16"
50
50
  spec.add_development_dependency "rake", "~> 13.0"
51
51
  spec.add_development_dependency "oga", "~> 3.3"
52
- # spec.add_development_dependency "thor", "~> 0.20.3"
53
52
  spec.add_development_dependency "thor", "~> 1.2"
54
53
  spec.add_development_dependency "asciidoctor-mathematical", "~> 0.3.5"
55
54
  # needed for the sinatra-based apps
@@ -61,6 +60,7 @@ Gem::Specification.new do |spec|
61
60
  # Run-time deps
62
61
  # 'matrix' needed because of incompatibilities between prawn v2.4
63
62
  # and ruby 3.1
63
+ # sorbet-runtime
64
64
  spec.add_runtime_dependency "matrix", "~>0.4"
65
65
  spec.add_runtime_dependency "warning", "~>1.2"
66
66
  spec.add_runtime_dependency "asciidoctor", "~>2.0", ">= 2.0.17"
@@ -5,54 +5,54 @@ require_relative "gitrepos/checkoutmanager"
5
5
 
6
6
  module Giblish
7
7
  # The app class for the giblish application
8
- class Application
9
- # returns on success, raises otherwise
10
- def run(args)
11
- # force immediate output
12
- $stdout.sync = true
13
-
14
- # setup logging
15
- Giblog.setup
16
- Giblog.logger.level = Logger::INFO
17
-
18
- # Parse cmd line
19
- cmdline = CmdLine.new.parse(args)
20
- Giblog.logger.level = cmdline.log_level
21
-
22
- Giblog.logger.debug { "cmd line args: #{cmdline.inspect}" }
23
-
24
- # build a tree of files matching user's regexp selection
25
- src_tree = PathTree.build_from_fs(cmdline.srcdir) do |p|
26
- if cmdline.exclude_regex&.match(p.to_s)
27
- false
28
- else
29
- (cmdline.include_regex =~ p.to_s)
30
- end
31
- end
32
- if src_tree.nil?
33
- Giblog.logger.warn { "Did not find any files to convert" }
34
- return
35
- end
36
-
37
- app = Configurator.new(cmdline, src_tree)
38
- app.tree_converter.run
39
-
40
- Giblog.logger.info { "Giblish is done!" }
41
- end
42
-
43
- # does not return, exits with status code
44
- def run_from_cmd_line
45
- begin
46
- run(ARGV)
47
- exit_code = 0
48
- rescue => exc
49
- Giblog.logger.error { exc.message }
50
- Giblog.logger.error { exc.backtrace }
51
- exit_code = 1
52
- end
53
- exit(exit_code)
54
- end
55
- end
8
+ # class Application
9
+ # # returns on success, raises otherwise
10
+ # def run(args)
11
+ # # force immediate output
12
+ # $stdout.sync = true
13
+
14
+ # # setup logging
15
+ # Giblog.setup
16
+ # Giblog.logger.level = Logger::INFO
17
+
18
+ # # Parse cmd line
19
+ # cmdline = CmdLine.new.parse(args)
20
+ # Giblog.logger.level = cmdline.log_level
21
+
22
+ # Giblog.logger.debug { "cmd line args: #{cmdline.inspect}" }
23
+
24
+ # # build a tree of files matching user's regexp selection
25
+ # src_tree = PathTree.build_from_fs(cmdline.srcdir) do |p|
26
+ # if cmdline.exclude_regex&.match(p.to_s)
27
+ # false
28
+ # else
29
+ # (cmdline.include_regex =~ p.to_s)
30
+ # end
31
+ # end
32
+ # if src_tree.nil?
33
+ # Giblog.logger.warn { "Did not find any files to convert" }
34
+ # return
35
+ # end
36
+
37
+ # app = Configurator.new(cmdline, src_tree)
38
+ # app.tree_converter.run
39
+
40
+ # Giblog.logger.info { "Giblish is done!" }
41
+ # end
42
+
43
+ # # does not return, exits with status code
44
+ # def run_from_cmd_line
45
+ # begin
46
+ # run(ARGV)
47
+ # exit_code = 0
48
+ # rescue => exc
49
+ # Giblog.logger.error { exc.message }
50
+ # Giblog.logger.error { exc.backtrace }
51
+ # exit_code = 1
52
+ # end
53
+ # exit(exit_code)
54
+ # end
55
+ # end
56
56
 
57
57
  class DirTreeConvert
58
58
  # This class provides a file as the source for the asciidoc info and
@@ -197,15 +197,20 @@ module Giblish
197
197
  Giblog.logger.level = Logger::INFO
198
198
 
199
199
  # Parse cmd line
200
- user_opts = CmdLine.new.parse(args)
201
- Giblog.logger.level = user_opts.log_level
202
- Giblog.logger.debug { "cmd line args: #{user_opts.inspect}" }
200
+ @user_opts = CmdLine.new.parse(args)
201
+ Giblog.logger.level = @user_opts.log_level
202
+ Giblog.logger.debug { "cmd line args: #{@user_opts.inspect}" }
203
203
 
204
204
  # Select the coversion instance to use
205
- @converter = select_conversion(user_opts)
205
+ @converter = select_conversion(@user_opts)
206
206
  end
207
207
 
208
208
  def run
209
+ begin
210
+ require "asciidoctor-diagram"
211
+ rescue LoadError
212
+ Giblog.logger.warn { "Did not find asciidoctor-diagram installed, diagrams will not be rendered." }
213
+ end
209
214
  # do the conversion
210
215
  @converter.run
211
216
  end
@@ -156,20 +156,20 @@ module Giblish
156
156
  }
157
157
 
158
158
  # see https://docs.asciidoctor.org/asciidoctor/latest/api/options/
159
- DEFAULT_ADOC_OPTS = {
160
- backend: "html5",
159
+ DEFAULT_ADOC_API_OPTS = {
160
+ # backend: "html5",
161
161
  # base_dir:
162
- catalog_assets: false,
162
+ # catalog_assets: false,
163
163
  # converter:
164
- doctype: "article",
164
+ # doctype: "article",
165
165
  # eruby:
166
166
  # ignore extention stuff
167
- header_only: false,
167
+ # header_only: false,
168
168
  # logger:
169
- mkdirs: false,
170
- parse: true,
169
+ # mkdirs: false,
170
+ # parse: true,
171
171
  safe: :unsafe,
172
- sourcemap: false,
172
+ # sourcemap: false,
173
173
  # template stuff TBD,
174
174
  # to_file:
175
175
  # to_dir:
@@ -192,12 +192,67 @@ module Giblish
192
192
  failure: ->(src, dst, dst_rel_path, ex, logstr) { TreeConverter.on_failure(src, dst, dst_rel_path, ex, logstr) }
193
193
  })
194
194
 
195
- # merge user's options with the default, giving preference
196
- # to the user
197
- @adoc_api_opts = DEFAULT_ADOC_OPTS.dup
198
- .merge!(opts.fetch(:adoc_api_opts, {}))
199
- @adoc_api_opts[:attributes] = DEFAULT_ADOC_DOC_ATTRIBS.dup
200
- .merge!(opts.fetch(:adoc_doc_attribs, {}))
195
+ # cache external configuration
196
+ @config_opts = opts.dup
197
+ end
198
+
199
+ # Resolve the document attributes according to the precedence.
200
+ #
201
+ # According to https://docs.asciidoctor.org/asciidoc/latest/attributes/assignment-precedence/
202
+ # The attribute precedence is:
203
+ # 1. An attribute passed to the API or CLI whose value does not end in @
204
+ # 2. An attribute defined in the document
205
+ # 3. An attribute passed to the API or CLI whose value or name ends in @
206
+ # 4. The default value of the attribute, if applicable
207
+ #
208
+ # giblish adds the following rules:
209
+ # 1.5 An attribute defined in an attribute provider for a specific source node
210
+ # 3.5 The default value set by giblish, if applicable
211
+ def resolve_doc_attributes(doc_src, node_attr)
212
+ # rule 3.5
213
+ doc_attr = DEFAULT_ADOC_DOC_ATTRIBS.dup
214
+
215
+ # sort attribs into soft and hard (rule 1 and 3)
216
+ soft_attr = {}
217
+ hard_attr = {}
218
+ @config_opts.fetch(:adoc_doc_attribs, {}).each do |k, v|
219
+ ks = k.to_s.strip
220
+ vs = v.to_s.strip
221
+
222
+ if ks.end_with?("@")
223
+ soft_attr[ks[0..]] = vs
224
+ next
225
+ end
226
+ if vs.end_with?("@")
227
+ soft_attr[ks] = vs[0..]
228
+ next
229
+ end
230
+ hard_attr[ks] = vs
231
+ end
232
+
233
+ # rule 3.
234
+ doc_attr.merge!(soft_attr)
235
+
236
+ # rule 2
237
+ Giblish.process_header_lines(doc_src.lines) do |line|
238
+ a = /^:(.+):(.*)$/.match(line)
239
+ next unless a
240
+ @logger.debug { "got header attr from doc: #{a[1]} : #{a[2]}" }
241
+ doc_attr[a[1].strip] = a[2].strip
242
+ end
243
+
244
+ @logger.debug { "idprefix before: #{doc_attr["idprefix"]}" }
245
+
246
+ # rule 1.5
247
+ doc_attr.merge!(node_attr)
248
+
249
+ # rule 1.
250
+ doc_attr.merge!(hard_attr)
251
+
252
+ @logger.debug { "idprefix after: #{doc_attr["idprefix"]}" }
253
+
254
+ # @logger&.debug { "Header attribs: #{doc_attr}" }
255
+ doc_attr
201
256
  end
202
257
 
203
258
  # require the following methods to be available from the src node:
@@ -216,34 +271,44 @@ module Giblish
216
271
  @logger&.info { "Converting #{src_node.pathname} and store result under #{dst_node.parent.pathname}" }
217
272
 
218
273
  # merge the common api opts with node specific
219
- api_opts = @adoc_api_opts.dup
274
+ api_opts = DEFAULT_ADOC_API_OPTS.dup
275
+ api_opts.merge!(@config_opts.fetch(:adoc_api_opts, {}))
220
276
  api_opts.merge!(src_node.api_options(src_node, dst_node, dst_top)) if src_node.respond_to?(:api_options)
221
- api_opts[:attributes].merge!(src_node.document_attributes(src_node, dst_node, dst_top)) if src_node.respond_to?(:document_attributes)
222
277
 
223
278
  # use a new logger instance for each conversion
224
279
  adoc_logger = Giblish::AsciidoctorLogger.new(@logger, @adoc_log_level)
225
280
 
226
281
  begin
227
- # load the source to enable access to doc properties
282
+ doc_src = src_node.adoc_source(src_node, dst_node, dst_top)
283
+
284
+ node_attr = src_node.respond_to?(:document_attributes) ?
285
+ src_node.document_attributes(src_node, dst_node, dst_top) : {}
286
+ doc_attr = resolve_doc_attributes(doc_src, node_attr)
287
+ # piggy-back our own info on the doc attributes hash so that
288
+ # asciidoctor extensions can use this info later on
289
+ doc_attr["giblish-info"] = {
290
+ src_node: src_node,
291
+ dst_node: dst_node,
292
+ dst_top: dst_top
293
+ }
294
+
295
+ # load the source to enable access to doc attributes and properties
228
296
  #
229
- # NOTE: the 'parse: false' is needed to prevent preprocessor extensions to be run as part
297
+ # NOTE: 'parse' is set to false to prevent preprocessor extensions to be run as part
230
298
  # of loading the document. We want them to run during the 'convert' call later when
231
299
  # doc attribs have been amended.
232
- doc = Asciidoctor.load(src_node.adoc_source(src_node, dst_node, dst_top), api_opts.merge(
300
+ #
301
+ # NOTE2: by trial-and-error, it seems that some document attributes must be set when
302
+ # calling 'load' and not added after the call and before the 'convert' call to have
303
+ # the expected effect (e.g. idprefix).
304
+ doc = Asciidoctor.load(doc_src, api_opts.merge(
233
305
  {
306
+ attributes: doc_attr,
234
307
  parse: false,
235
308
  logger: adoc_logger
236
309
  }
237
310
  ))
238
311
 
239
- # piggy-back our own info on the doc attributes hash so that
240
- # asciidoctor extensions can use this info later on
241
- doc.attributes["giblish-info"] = {
242
- src_node: src_node,
243
- dst_node: dst_node,
244
- dst_top: dst_top
245
- }
246
-
247
312
  # update the destination node with the correct file suffix. This is dependent
248
313
  # on the type of conversion performed
249
314
  dst_node.name = dst_node.name.sub_ext(doc.attributes["outfilesuffix"])
@@ -252,11 +317,11 @@ module Giblish
252
317
  # make sure the dst dir exists
253
318
  d.dirname.mkpath
254
319
 
255
- # write the converted doc to the file
256
- output = doc.convert(api_opts.merge({logger: adoc_logger}))
320
+ # do the conversion and write the converted doc to file
321
+ output = doc.convert(api_opts)
257
322
  doc.write(output, d.to_s)
258
323
 
259
- # give user the opportunity to eg store the result of the conversion
324
+ # give the user the opportunity to eg store the result of the conversion
260
325
  # as data in the destination node
261
326
  @conv_cb[:success]&.call(src_node, dst_node, dst_top, doc, adoc_logger.in_mem_storage.string)
262
327
  true
@@ -1,3 +1,3 @@
1
1
  module Giblish
2
- VERSION = "2.0.0".freeze
2
+ VERSION = "2.0.1".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: giblish
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anders Rillbert
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-08-29 00:00:00.000000000 Z
11
+ date: 2023-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -383,7 +383,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
383
383
  - !ruby/object:Gem::Version
384
384
  version: '0'
385
385
  requirements: []
386
- rubygems_version: 3.3.7
386
+ rubygems_version: 3.3.26
387
387
  signing_key:
388
388
  specification_version: 4
389
389
  summary: A tool for publishing asciidoc docs stored in git repos