giblish 2.2.2 → 3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b12e8fae50fe3b91c7a9f62946e346baf68464dacdbc8b1552837c5c0be5f530
4
- data.tar.gz: 6ef06ac7fbe2e803a96c212e13ffcc0490733e177895c2ee118755c669c9caf3
3
+ metadata.gz: 7ec2fb091e00a933c081217c3a82f6b7002f3bffee15f5263ec9dc1f4f6ab128
4
+ data.tar.gz: 138dee38cd08e1efe6627635ef6fa110af3e5fa3f9ac96137afcbdf4296aa7e0
5
5
  SHA512:
6
- metadata.gz: 10aad9daaae9551faa3913c268d8e8554ca7a52b9dddb532fd0ebbaba07dedffc549a05dfc30f96ac1e9e0a754b79b1e13784331acdd377199f809ebfd048a7f
7
- data.tar.gz: 2475c49a5c37d6ced38562a0c9425863ba7ba83239375026aa8ca2a75d611b00dee9a938e6ecb55e9d311eb995b5c02bfaed4d4c45d30f8b186447442f56e3ef
6
+ metadata.gz: 7a29d740604e700c77222b570df47119dcafa1c8f074f818d81ea9ce16c13736b9332ade2a04f1a151258b5043fe56e0883537a303438426599e039b526a2eb5
7
+ data.tar.gz: 414ac99ae8eed148a2b72453ae092fa5a0721917b5ca5d9cd8de8c0fc2b8c1edb65e92abe3f975f35562bf07e86492eb7781b9e856f0b0b88e2d77afe0d0947f
data/.gitignore CHANGED
@@ -1,56 +1,23 @@
1
+ # IDE and editor files
2
+ .vscode/
3
+ *.swp
4
+ *.swo
5
+ *~
6
+
7
+ # Asciidoctor cache and generated files
8
+ .asciidoctor/
9
+
10
+ # Test artifacts
11
+ test/tmp/
12
+ test/output/
13
+ coverage/
14
+
15
+ # Build and packaging
16
+ pkg/
1
17
  *.gem
2
- *.rbc
3
- /.config
4
- /coverage/
5
- /InstalledFiles
6
- /pkg/
7
- /spec/reports/
8
- /spec/examples.txt
9
- /test/tmp/
10
- /test/version_tmp/
11
- /tmp/
12
18
 
13
- # Used by dotenv library to load environment variables.
14
- # .env
19
+ # Logs
20
+ *.log
15
21
 
16
- ## Specific to RubyMotion:
17
- .dat*
18
- .repl_history
19
- build/
20
- *.bridgesupport
21
- build-iPhoneOS/
22
- build-iPhoneSimulator/
23
-
24
- ## Specific to RubyMotion (use of CocoaPods):
25
- #
26
- # We recommend against adding the Pods directory to your .gitignore. However
27
- # you should judge for yourself, the pros and cons are mentioned at:
28
- # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
29
- #
30
- # vendor/Pods/
31
-
32
- ## Documentation cache and generated files:
33
- /.yardoc/
34
- /_yardoc/
35
- /doc/
36
- /rdoc/
37
-
38
- ## Environment normalization:
39
- /.bundle/
40
- /vendor/bundle
41
- /lib/bundler/man/
42
-
43
- # for a library or gem, you might want to ignore these files since the code is
44
- # intended to run in multiple environments; otherwise, check them in:
45
- Gemfile.lock
46
- .ruby-version
47
- .ruby-gemset
48
-
49
- # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
50
- .rvmrc
51
-
52
- # RubyMine idea files
53
- /.idea/
54
-
55
- # Local playground
56
- sandbox.rb
22
+ # Temporary files
23
+ tmp/
data/.solargraph.yml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ include:
3
+ - "**/*.rb"
4
+ exclude:
5
+ - spec/**/*
6
+ - test/**/*
7
+ - vendor/**/*
8
+ - ".bundle/**/*"
9
+ require: []
10
+ domains: []
11
+ reporters:
12
+ - require_not_found
13
+ require_paths: []
14
+ plugins: []
15
+ max_files: 5000
data/Changelog.adoc CHANGED
@@ -7,6 +7,11 @@
7
7
  ** write instructions for github webhook triggered generation
8
8
  * Update the default css for giblish html generation.
9
9
 
10
+ == v2.2.2
11
+
12
+ * [BUGFIX] - fix a possible null ref when generating pdfs
13
+ * set the 'sourcemap' attribute to true by default
14
+
10
15
  == v2.2.1
11
16
 
12
17
  * bump dependencies to latest versions of the asciidoctor ecosystem
data/README.adoc CHANGED
@@ -206,7 +206,7 @@ Pull requests must meet the following to be considered for merging:
206
206
 
207
207
  To develop on giblish, you:
208
208
 
209
- . Install ruby on your local machine (rbenv is a good choice for handling ruby installations)
209
+ . Install ruby on your local machine (rbenv could be a good choice for handling ruby installations)
210
210
  . Install necessary dependencies to install the ruby 'mathematica' gem, see eg https://github.com/gjtorikian/mathematical/blob/47041d5492cc7c5f04105031430fb44119406f49/script/install_linux_deps
211
211
  . Install graphviz
212
212
  . Clone or fork the repository
Binary file
data/giblish.gemspec CHANGED
@@ -6,6 +6,7 @@ end
6
6
 
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = "giblish"
9
+ spec.required_ruby_version = ">= 3.3"
9
10
  spec.version = Giblish::VERSION
10
11
  spec.summary = "A tool for publishing asciidoc docs stored in git repos"
11
12
  spec.description = <<~EOF
@@ -44,30 +45,17 @@ Gem::Specification.new do |spec|
44
45
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
45
46
  spec.require_paths = ["lib"]
46
47
 
47
- # Development deps
48
- spec.add_development_dependency "ruby-lsp", "~> 0.11"
49
- spec.add_development_dependency "minitest", "~> 5.16"
50
- spec.add_development_dependency "standard", "~> 1.24.3"
51
- spec.add_development_dependency "rake", "~> 13.0"
52
- spec.add_development_dependency "oga", "~> 3.3"
53
- spec.add_development_dependency "thor", "~> 1.2"
54
- spec.add_development_dependency "asciidoctor-mathematical", "~> 0.3.5"
55
- # needed for the sinatra-based apps
56
- spec.add_development_dependency "sinatra", "~>2.1"
57
- spec.add_development_dependency "thin", "~>1.8"
58
- spec.add_development_dependency "rack", "2.2.3"
59
- spec.add_development_dependency "rack-test", "1.1"
60
-
61
48
  # Run-time deps
62
49
  # 'matrix' needed because of incompatibilities between prawn v2.4
63
50
  # and ruby 3.1
64
51
  # sorbet-runtime
65
- spec.add_runtime_dependency "matrix", "~>0.4"
66
- spec.add_runtime_dependency "warning", "~>1.2"
67
- spec.add_runtime_dependency "asciidoctor", "~>2.0", ">= 2.0.20"
68
- spec.add_runtime_dependency "asciidoctor-diagram", ["~> 2.2"]
69
- spec.add_runtime_dependency "asciidoctor-pdf", ["~> 2.3"]
70
- spec.add_runtime_dependency "git", "~> 1.12"
71
- spec.add_runtime_dependency "rouge", "~> 3.30"
72
- spec.add_runtime_dependency "prawn-svg", "~> 0.32.0"
52
+ spec.add_runtime_dependency "gran", "~> 0.1"
53
+ # spec.add_runtime_dependency "matrix", "~>0.4"
54
+ spec.add_runtime_dependency "warning", "~>1.0"
55
+ spec.add_runtime_dependency "asciidoctor", "~>2.0", ">= 2.0.25"
56
+ spec.add_runtime_dependency "asciidoctor-diagram", ["~> 3.0"]
57
+ spec.add_runtime_dependency "asciidoctor-pdf", "~> 2.3"
58
+ spec.add_runtime_dependency "git", "~> 4.0"
59
+ spec.add_runtime_dependency "rouge", "~> 4.6"
60
+ spec.add_runtime_dependency "prawn-svg", "~> 0.34"
73
61
  end
@@ -1,59 +1,12 @@
1
+ require "gran"
2
+ require_relative "adocsrc_providers"
1
3
  require_relative "cmdline"
2
4
  require_relative "configurator"
5
+ require_relative "node_data_provider"
3
6
  require_relative "treeconverter"
4
7
  require_relative "gitrepos/checkoutmanager"
5
8
 
6
9
  module Giblish
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
56
-
57
10
  class DirTreeConvert
58
11
  # This class provides a file as the source for the asciidoc info and
59
12
  # sets the document attributes required by Asciidoctor to resolve
@@ -96,7 +49,7 @@ module Giblish
96
49
 
97
50
  # build a tree of files matching user's regexp selection
98
51
  def build_src_tree(srcdir, include_regex, exclude_regex)
99
- pt = PathTree.build_from_fs(srcdir) do |p|
52
+ pt = Gran::PathTree.build_from_fs(srcdir) do |p|
100
53
  if exclude_regex&.match(p.to_s)
101
54
  false
102
55
  else
@@ -113,8 +66,8 @@ module Giblish
113
66
  def setup_converter(src_tree, adoc_src_provider, configurator)
114
67
  # compose the doc attribute provider.
115
68
  configurator.doc_attr.add_doc_attr_providers(adoc_src_provider)
116
- # NOTE: The order in the line below is important!
117
- data_provider = DataDelegator.new(configurator.doc_attr, adoc_src_provider)
69
+ # compose the data provider for the source nodes
70
+ data_provider = NodeDataProvider.new(configurator.doc_attr, adoc_src_provider)
118
71
 
119
72
  # associate the data providers with each source node in the tree
120
73
  src_tree.traverse_preorder do |level, node|
@@ -178,15 +131,16 @@ module Giblish
178
131
  conf = Configurator.new(@user_opts)
179
132
  s = @gm.summary_provider
180
133
  s.index_basename = conf.config_opts.index_basename
181
- data_provider = DataDelegator.new(
182
- SrcFromString.new(s.source),
183
- conf.doc_attr
134
+ data_provider = NodeDataProvider.new(
135
+ conf.doc_attr,
136
+ SrcFromString.new(s.source)
184
137
  )
185
- srctree = PathTree.new("/" + conf.config_opts.index_basename + ".adoc", data_provider)
138
+ srctree = Gran::PathTree.new("/" + conf.config_opts.index_basename + ".adoc", data_provider)
186
139
  TreeConverter.new(srctree, @dst_topdir, conf.build_options).run
187
140
  end
188
141
  end
189
142
 
143
+ # The main entry point to the giblish application
190
144
  class EntryPoint
191
145
  def initialize(args, logger = nil)
192
146
  # force immediate output
@@ -0,0 +1,84 @@
1
+ require_relative "../docid/docid"
2
+ require_relative "../indexbuilders/depgraphbuilder"
3
+
4
+ module Giblish
5
+ # AIDEV-NOTE: Immutable value object for DocId configuration
6
+ class DocIdConfig
7
+ # @return [Array<DocIdExtension::DocidPreBuilder>] Pre-build processors
8
+ attr_reader :pre_builders
9
+
10
+ # @return [Array<DocIdExtension::DocidProcessor>] Asciidoctor preprocessors
11
+ attr_reader :preprocessors
12
+
13
+ # @return [Array<DependencyGraphPostBuilder>] Post-build processors
14
+ attr_reader :post_builders
15
+
16
+ # Creates immutable DocId configuration.
17
+ #
18
+ # @param pre_builders [Array<DocIdExtension::DocidPreBuilder>]
19
+ # @param preprocessors [Array<DocIdExtension::DocidProcessor>]
20
+ # @param post_builders [Array<DependencyGraphPostBuilder>]
21
+ def initialize(pre_builders:, preprocessors:, post_builders:)
22
+ @pre_builders = pre_builders.freeze
23
+ @preprocessors = preprocessors.freeze
24
+ @post_builders = post_builders.freeze
25
+ freeze
26
+ end
27
+ end
28
+
29
+ # AIDEV-NOTE: Builder for DocId configuration following established provider pattern
30
+ class DocIdConfigBuilder
31
+ # Builds complete DocId configuration based on user options.
32
+ # Returns a null configuration if DocId resolution is disabled.
33
+ #
34
+ # @param config_opts [CmdLine::Options] User configuration with resolve_docid flag
35
+ # @return [DocIdConfig] Configuration with pre-builders, preprocessors, and post-builders
36
+ def self.build(config_opts)
37
+ return null_config unless config_opts.resolve_docid
38
+
39
+ docid_prebuilder = DocIdExtension::DocidPreBuilder.new
40
+ docid_processor = DocIdExtension::DocidProcessor.new({id_2_node: docid_prebuilder.id_2_node})
41
+
42
+ post_builders = build_post_builders(config_opts, docid_processor)
43
+
44
+ DocIdConfig.new(
45
+ pre_builders: [docid_prebuilder],
46
+ preprocessors: [docid_processor],
47
+ post_builders: post_builders
48
+ )
49
+ end
50
+
51
+ # @param config_opts [CmdLine::Options]
52
+ # @param docid_processor [DocIdExtension::DocidProcessor]
53
+ # @return [Array<DependencyGraphPostBuilder>]
54
+ def self.build_post_builders(config_opts, docid_processor)
55
+ builders = []
56
+
57
+ # Add dependency graph if not disabled and graphviz is available
58
+ unless config_opts.no_index
59
+ if DependencyGraphPostBuilder.dot_supported
60
+ builders << DependencyGraphPostBuilder.new(
61
+ docid_processor.node_2_ids,
62
+ nil,
63
+ nil,
64
+ nil,
65
+ config_opts.graph_basename
66
+ )
67
+ end
68
+ end
69
+
70
+ builders
71
+ end
72
+
73
+ # @return [DocIdConfig]
74
+ def self.null_config
75
+ DocIdConfig.new(
76
+ pre_builders: [],
77
+ preprocessors: [],
78
+ post_builders: []
79
+ )
80
+ end
81
+
82
+ private_class_method :build_post_builders, :null_config
83
+ end
84
+ end
@@ -0,0 +1,37 @@
1
+ require_relative "index_config_builder"
2
+ require_relative "../gitrepos/history_pb"
3
+ require_relative "../indexbuilders/subtree_indices"
4
+
5
+ module Giblish
6
+ # AIDEV-NOTE: Builder for git-specific Index configuration with history support
7
+ class GitIndexConfigBuilder
8
+ # Builds complete Index configuration with git history support.
9
+ # Returns a null configuration if index generation is disabled.
10
+ #
11
+ # @param config_opts [CmdLine::Options] User configuration with no_index flag
12
+ # @param resource_paths [ResourcePaths] Resolved paths for templates
13
+ # @param doc_attr [DocAttrBuilder] Document attribute builder
14
+ # @param git_repo_dir [Pathname] Path to git repository root
15
+ # @return [IndexConfig] Configuration with index generation and git history support
16
+ def self.build(config_opts, resource_paths, doc_attr, git_repo_dir)
17
+ return IndexConfigBuilder.null_config if config_opts.no_index
18
+
19
+ post_builders = []
20
+ post_builders << AddHistoryPostBuilder.new(git_repo_dir)
21
+
22
+ adoc_src_provider = SubtreeIndexGit.new(
23
+ {erb_template_path: resource_paths.idx_erb_template_abs}
24
+ )
25
+
26
+ idx = SubtreeInfoBuilder.new(
27
+ doc_attr,
28
+ nil,
29
+ adoc_src_provider,
30
+ config_opts.index_basename
31
+ )
32
+ post_builders << idx
33
+
34
+ IndexConfig.new(post_builders: post_builders)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,53 @@
1
+ require_relative "../subtreeinfobuilder"
2
+ require_relative "../indexbuilders/subtree_indices"
3
+
4
+ module Giblish
5
+ # AIDEV-NOTE: Immutable value object for Index configuration
6
+ class IndexConfig
7
+ # @return [Array<SubtreeInfoBuilder>] Post-build processors for index generation
8
+ attr_reader :post_builders
9
+
10
+ # Creates immutable Index configuration.
11
+ #
12
+ # @param post_builders [Array<SubtreeInfoBuilder>]
13
+ def initialize(post_builders:)
14
+ @post_builders = post_builders.freeze
15
+ freeze
16
+ end
17
+ end
18
+
19
+ # AIDEV-NOTE: Builder for Index configuration following established provider pattern
20
+ class IndexConfigBuilder
21
+ # Builds complete Index configuration with index generation support.
22
+ # Returns a null configuration if index generation is disabled.
23
+ #
24
+ # @param config_opts [CmdLine::Options] User configuration with no_index flag
25
+ # @param resource_paths [ResourcePaths] Resolved paths for templates
26
+ # @param doc_attr [DocAttrBuilder] Document attribute builder
27
+ # @param adoc_src_provider_class [Class] Class for generating index source (defaults to SubtreeIndexBase)
28
+ # @return [IndexConfig] Configuration with index generation post-builders
29
+ def self.build(config_opts, resource_paths, doc_attr, adoc_src_provider_class = SubtreeIndexBase)
30
+ return null_config if config_opts.no_index
31
+
32
+ adoc_src_provider = adoc_src_provider_class.new(
33
+ {erb_template_path: resource_paths.idx_erb_template_abs}
34
+ )
35
+
36
+ idx = SubtreeInfoBuilder.new(
37
+ doc_attr,
38
+ nil,
39
+ adoc_src_provider,
40
+ config_opts.index_basename
41
+ )
42
+
43
+ IndexConfig.new(post_builders: [idx])
44
+ end
45
+
46
+ # @return [IndexConfig]
47
+ def self.null_config
48
+ IndexConfig.new(post_builders: [])
49
+ end
50
+
51
+ private_class_method :null_config
52
+ end
53
+ end
@@ -1,44 +1,2 @@
1
1
  module Giblish
2
- # delegates all method calls to the first supplied delegate that
3
- # implements it.
4
- class DataDelegator
5
- attr_reader :delegates
6
-
7
- def initialize(*delegate_arr)
8
- @delegates = Array(delegate_arr)
9
- end
10
-
11
- def add(delegate)
12
- @delegates << delegate
13
- end
14
-
15
- # define this to short-cut circular references
16
- #
17
- # TODO: This should probably be avoided by refactoring the SuccessfulConversion
18
- # class which, as of this writing, is part of a circular ref to a PathTree which
19
- # throws 'inspect' calls into an eternal loop instead of implementing a custom 'inspect'
20
- # method.
21
- def inspect
22
- @delegates.map do |d|
23
- "<#{d.class}:#{d.object_id}>"
24
- end.join(",")
25
- end
26
-
27
- def method_missing(m, *args, &block)
28
- del = @delegates&.find { |d| d.respond_to?(m) }
29
- if del.nil?
30
- Giblog.logger.warn { "Did not find method '#{m}' in any delegate (#{@delegates}"}
31
- end
32
-
33
- del.nil? ? super : del.send(m, *args, &block)
34
- end
35
-
36
- def respond_to_missing?(method_name, include_private = false)
37
- ok = @delegates.find { |d|
38
- d.respond_to?(method_name)
39
- }
40
-
41
- ok || super(method_name, include_private)
42
- end
43
- end
44
2
  end