asciidoctor-doctest 1.5.2.0 → 2.0.0.beta.1

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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.adoc +48 -68
  4. data/features/fixtures/html-slim/Rakefile +5 -11
  5. data/features/generator_html.feature +6 -6
  6. data/features/test_html.feature +70 -28
  7. data/lib/asciidoctor/doctest.rb +11 -14
  8. data/lib/asciidoctor/doctest/asciidoc_converter.rb +85 -0
  9. data/lib/asciidoctor/doctest/{base_example.rb → example.rb} +6 -27
  10. data/lib/asciidoctor/doctest/factory.rb +36 -0
  11. data/lib/asciidoctor/doctest/generator.rb +30 -23
  12. data/lib/asciidoctor/doctest/html/converter.rb +64 -0
  13. data/lib/asciidoctor/doctest/{html/normalizer.rb → html_normalizer.rb} +4 -4
  14. data/lib/asciidoctor/doctest/io.rb +14 -0
  15. data/lib/asciidoctor/doctest/{asciidoc/examples_suite.rb → io/asciidoc.rb} +4 -8
  16. data/lib/asciidoctor/doctest/{base_examples_suite.rb → io/base.rb} +28 -46
  17. data/lib/asciidoctor/doctest/io/xml.rb +69 -0
  18. data/lib/asciidoctor/doctest/no_fallback_template_converter.rb +42 -0
  19. data/lib/asciidoctor/doctest/rake_tasks.rb +229 -0
  20. data/lib/asciidoctor/doctest/test_reporter.rb +110 -0
  21. data/lib/asciidoctor/doctest/tester.rb +134 -0
  22. data/lib/asciidoctor/doctest/version.rb +1 -1
  23. data/spec/asciidoc_converter_spec.rb +64 -0
  24. data/spec/{base_example_spec.rb → example_spec.rb} +4 -5
  25. data/spec/factory_spec.rb +46 -0
  26. data/spec/html/converter_spec.rb +95 -0
  27. data/spec/{html/normalizer_spec.rb → html_normalizer_spec.rb} +1 -1
  28. data/spec/{asciidoc/examples_suite_spec.rb → io/asciidoc_spec.rb} +3 -8
  29. data/spec/{html/examples_suite_spec.rb → io/xml_spec.rb} +3 -106
  30. data/spec/no_fallback_template_converter_spec.rb +38 -0
  31. data/spec/shared_examples/{base_examples_suite.rb → base_examples.rb} +25 -28
  32. data/spec/spec_helper.rb +4 -0
  33. data/spec/tester_spec.rb +153 -0
  34. metadata +52 -59
  35. data/features/fixtures/html-slim/test/html_test.rb +0 -6
  36. data/features/fixtures/html-slim/test/test_helper.rb +0 -5
  37. data/lib/asciidoctor/doctest/asciidoc_renderer.rb +0 -111
  38. data/lib/asciidoctor/doctest/generator_task.rb +0 -115
  39. data/lib/asciidoctor/doctest/html/example.rb +0 -21
  40. data/lib/asciidoctor/doctest/html/examples_suite.rb +0 -118
  41. data/lib/asciidoctor/doctest/test.rb +0 -125
  42. data/spec/asciidoc_renderer_spec.rb +0 -103
  43. data/spec/test_spec.rb +0 -164
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 17448118b205d1f1a39fb2ccde52df38b512899e
4
- data.tar.gz: 22caa40c2925809f7931347b267639676cc9c88a
3
+ metadata.gz: adc5657c9e7bcd1f4dfda82cdbce7789414b7129
4
+ data.tar.gz: 1549da48c04eb0b58148e7e0e37b81483274d366
5
5
  SHA512:
6
- metadata.gz: 098697a3599f989cf9b39a463182467c06ef6c2fb8dfeb9beca1510967899ad8a406368fcc392cdf16e7eef287b0d2deda3097f3692bb18207326891716fb41e
7
- data.tar.gz: 119b67494d4af4d29eb09ddb22e1a2f189290b5bc3e095bd74a40469109c16317754d30111178e7a4b1a10eb677d9f283b9887b7b5cb7ac7a4d33ed75837c6ae
6
+ metadata.gz: 412eb45db40fe2eec88e7a8507be9531a855ecb8efe898bc22f4fed70a12e7d3b4a044110a39fdd5706a9a647b9371e86c301edaa8042b9d3e0d112186f17316
7
+ data.tar.gz: a49cc812d65eade759965016fb5a816726af906b18f0367f90adde476c4f373aa0ab10ea4c1f9c00086c9caa51525f342438870fe37ddefffbdee5f6b8ea0170
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License
2
2
 
3
- Copyright 2014-2015 Jakub Jirutka <jakub@jirutka.cz> and the Asciidoctor Project.
3
+ Copyright 2014-2017 Jakub Jirutka <jakub@jirutka.cz> and the Asciidoctor Project.
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.adoc CHANGED
@@ -1,11 +1,6 @@
1
1
  = Asciidoctor::DocTest
2
2
  Jakub Jirutka <https://github.com/jirutka[@jirutka]>
3
- :page-layout: base
4
- :idprefix:
5
- ifdef::env-github[:idprefix: user-content-]
6
- :idseparator: -
7
3
  :source-language: ruby
8
- :language: {source-language}
9
4
  // custom
10
5
  :gem-name: asciidoctor-doctest
11
6
  :gh-name: asciidoctor/{gem-name}
@@ -55,83 +50,62 @@ mkdir -p test/examples/asciidoc
55
50
 
56
51
  . Add development dependency on `asciidoctor-doctest` to your gemspec:
57
52
  +
58
- [source]
59
- s.add_development_dependency 'asciidoctor-doctest', '~> 1.5.2'
53
+ [source, ruby]
54
+ s.add_development_dependency 'asciidoctor-doctest', '~> 2.0.0'
60
55
  +
61
56
  or Gemfile if you’re not distributing the backend as a gem:
62
57
  +
63
- [source]
64
- gem 'asciidoctor-doctest', '~> 1.5.2'
58
+ [source, ruby]
59
+ gem 'asciidoctor-doctest', '~> 2.0.0'
65
60
  +
66
61
  and run `bundle install`.
67
62
 
68
- . Create or edit `test/test_helper.rb`; require test dependencies and setup `examples_path`:
63
+ . Create or edit `Rakefile` and configure DocTest tasks:
69
64
  +
70
- [source]
65
+ [source, ruby]
71
66
  ----
72
67
  require 'asciidoctor/doctest'
73
- require 'minitest/autorun'
74
-
75
- # used to colorize output
76
- require 'minitest/rg'
77
-
78
- # needed if you're testing templates-based backend
68
+ require 'thread_safe'
79
69
  require 'tilt'
80
70
 
81
- # extra input examples (optional)
82
- DocTest.examples_path.unshift 'test/examples/asciidoc'
83
-
84
- # output examples
85
- DocTest.examples_path.unshift 'test/examples/shiny'
86
- ----
87
-
88
- . Create test file `test/templates_test.rb` and extend class link:{src-base}/test.rb[DocTest::Test]. Specify `converter_opts` and then call `generate_tests!` macro with a specific subclass of `BaseExamplesSuite`:
89
- +
90
- [source]
91
- ----
92
- require 'test_helper'
93
-
94
- class TestTemplates < DocTest::Test
95
- converter_opts template_dirs: 'data/templates'
96
- generate_tests! DocTest::HTML::ExamplesSuite
71
+ DocTest::RakeTasks.new(:doctest) do |t|
72
+ t.output_suite = DocTest::HTML::ExamplesSuite
73
+ t.output_suite_opts = {
74
+ examples_path: 'test/examples/shiny'
75
+ }
76
+ # add extra input examples (optional)
77
+ t.input_suite_opts = {
78
+ examples_path: [ *DocTest.examples_path, 'test/examples/asciidoc' ]
79
+ }
80
+ t.converter_opts = {
81
+ template_dirs: 'data/templates'
82
+ }
97
83
  end
98
84
  ----
99
85
 
100
- . Create or edit `Rakefile`; add tasks to run tests and optionally a generator of output examples:
86
+ . Check if rake loads the DocTest tasks _doctest_, _doctest:test_ and _doctest:generate_.
101
87
  +
102
- [source]
103
- ----
104
- require 'asciidoctor/doctest'
105
- require 'rake/testtask'
106
- require 'thread_safe'
107
- require 'tilt'
88
+ [source, sh]
89
+ bundle exec rake -D
108
90
 
109
- Rake::TestTask.new(:test) do |task|
110
- task.description = 'Run tests for templates'
111
- task.pattern = 'test/templates_test.rb'
112
- task.libs << 'test'
113
- end
114
91
 
115
- DocTest::GeneratorTask.new(:generate) do |task|
116
- task.output_suite = DocTest::HTML::ExamplesSuite.new(examples_path: 'test/examples/shiny')
117
- task.converter_opts[:template_dirs] = 'data/templates'
118
- #
119
- # add extra input examples (optional)
120
- task.examples_path.unshift 'test/examples/asciidoc'
121
- end
92
+ == Run tests
122
93
 
123
- # When no task specified, run test.
124
- task :default => :test
125
- ----
94
+ Assume that you have defined the Rake tasks in the default namespace _doctest_ (see above).
95
+ Then you can simply run:
126
96
 
97
+ [source, sh]
98
+ bundle exec rake doctest:test
127
99
 
128
- == Run tests
100
+ To test only specific examples, use `PATTERN` with glob-like expression:
129
101
 
130
- Assume that you have defined the test Rake task named `:test` (see above).
131
- Then you can simply run:
102
+ [source, sh]
103
+ bundle exec rake doctest:test PATTERN='block_*:*'
104
+
105
+ For verbose output, use `VERBOSE=yes`:
132
106
 
133
107
  [source, sh]
134
- bundle exec rake test
108
+ bundle exec rake doctest:test VERBOSE=yes
135
109
 
136
110
  image::doc/img/failing-test-term.gif[Failing test in term, align="center"]
137
111
 
@@ -225,11 +199,17 @@ NOTE: The trailing new line (below this) will be removed.
225
199
  HtmlTest assumes that paragraphs are enclosed in `<p></p>` tags and implicitly sets the _include_ option to `./p/node()` for `inline_*:*` examples (if _include_ is not already set).
226
200
  If it’s not your case, then you must overwrite it:
227
201
 
228
- [source]
202
+ [source, ruby]
229
203
  ----
230
- class TestShiny < DocTest::Test
231
- converter_opts template_dirs: 'data/templates'
232
- generate_tests! DocTest::HTML::ExamplesSuite.new(paragraph_xpath: './div/p/node()')
204
+ DocTest::RakeTasks.new(:doctest) do |t|
205
+ t.output_suite = DocTest::HTML::ExamplesSuite
206
+ t.output_suite_opts = {
207
+ examples_path: 'test/examples/shiny',
208
+ paragraph_xpath: './div/p/node()' //<1>
209
+ }
210
+ t.converter_opts = {
211
+ template_dirs: 'data/templates'
212
+ }
233
213
  end
234
214
  ----
235
215
 
@@ -290,27 +270,27 @@ Therefore DocTest provides a generator.
290
270
  When you have at least partially working Asciidoctor _backend_ (converter or a set of templates), you can pass the input examples through it and generate your output examples.
291
271
  Then you should verify them and modify if needed.
292
272
 
293
- Assume that you have defined the generator Rake task named `:generator` (see <<setup-doctest>>).
273
+ Assume that you have defined the Rake tasks in the default namespace _doctest_ (see <<setup-doctest>>).
294
274
 
295
275
  Now you can generate output examples from all the input examples (those with `.adoc` extension) found on the examples_path that doesn’t already exist (i.e. it doesn’t rewrite existing):
296
276
 
297
277
  [source, sh]
298
- bundle exec rake generate
278
+ bundle exec rake doctest:generate
299
279
 
300
280
  Same as previous, but rewrite existing tested examples:
301
281
 
302
282
  [source, sh]
303
- bundle exec rake generate FORCE=yes
283
+ bundle exec rake doctest:generate FORCE=yes
304
284
 
305
285
  Generate just examples for `block_ulist` node (i.e. all examples in `block_ulist.adoc` file(s) found on the examples_path) that doesn’t exist yet:
306
286
 
307
287
  [source, sh]
308
- bundle exec rake generate PATTERN='block_ulist:*'
288
+ bundle exec rake doctest:generate PATTERN='block_ulist:*'
309
289
 
310
290
  (Re)generate examples which name starts with `basic` for all _block_ nodes (i.e. files that starts with `block_`):
311
291
 
312
292
  [source, sh]
313
- bundle exec rake generate PATTERN='block_*:basic*' FORCE=yes
293
+ bundle exec rake doctest:generate PATTERN='block_*:basic*' FORCE=yes
314
294
 
315
295
 
316
296
  == How to extend it
@@ -1,15 +1,9 @@
1
1
  require 'asciidoctor/doctest'
2
- require 'rake/testtask'
3
2
  require 'tilt'
4
3
 
5
- DocTest::GeneratorTask.new(:generate) do |task|
6
- task.output_suite = DocTest::HTML::ExamplesSuite.new(examples_path: 'examples/html')
7
- task.examples_path = 'examples/asciidoc'
8
- task.converter_opts[:template_dirs] = 'templates'
9
- end
10
-
11
- Rake::TestTask.new(:test) do |task|
12
- task.description = 'Run tests for custom HTML backend'
13
- task.pattern = 'test/html_test.rb'
14
- task.libs << 'test'
4
+ DocTest::RakeTasks.new do |t|
5
+ t.output_examples :html, path: 'examples/html'
6
+ t.input_examples :asciidoc, path: 'examples/asciidoc'
7
+ t.converter = DocTest::HTML::Converter
8
+ t.converter_opts = { template_dirs: 'templates' }
15
9
  end
@@ -4,10 +4,10 @@ Feature: Generating output examples for a custom HTML backend
4
4
  Given I do have a template-based HTML backend with DocTest
5
5
 
6
6
  Scenario: Generate missing output examples
7
- When I run `bundle exec rake generate`
7
+ When I run `bundle exec rake doctest:generate`
8
8
  Then the output should contain:
9
9
  """
10
- Generate testing examples *:*.
10
+ Generating test examples *:* in examples/html
11
11
  --> Unchanged block_quote:with_id_and_role
12
12
  --> Generating block_quote:with_title
13
13
  --> Skipping block_quote:with_attribution
@@ -71,10 +71,10 @@ Feature: Generating output examples for a custom HTML backend
71
71
  """
72
72
 
73
73
  Scenario: Regenerate all outdated output examples
74
- When I run `bundle exec rake generate FORCE=yes`
74
+ When I run `bundle exec rake doctest:generate FORCE=yes`
75
75
  Then the output should contain:
76
76
  """
77
- Generate testing examples *:*.
77
+ Generating test examples *:* in examples/html
78
78
  --> Unchanged block_quote:with_id_and_role
79
79
  --> Generating block_quote:with_title
80
80
  --> Rewriting block_quote:with_attribution
@@ -132,10 +132,10 @@ Feature: Generating output examples for a custom HTML backend
132
132
  """
133
133
 
134
134
  Scenario: Regenerate outdated output examples specified by filter
135
- When I run `bundle exec rake generate PATTERN="*:*attribution" FORCE=yes`
135
+ When I run `bundle exec rake doctest:generate PATTERN="*:*attribution" FORCE=yes`
136
136
  Then the output should contain:
137
137
  """
138
- Generate testing examples *:*attribution.
138
+ Generating test examples *:*attribution in examples/html
139
139
  --> Rewriting block_quote:with_attribution
140
140
 
141
141
  """
@@ -4,53 +4,95 @@ Feature: Testing a custom HTML backend
4
4
  Given I do have a template-based HTML backend with DocTest
5
5
 
6
6
  Scenario: Some examples do not match the expected output
7
- When I run `bundle exec rake test`
7
+ When I run `bundle exec rake doctest:test`
8
8
  Then the output should contain:
9
9
  """
10
- 1) Failure:
11
- TestHtml :: block_quote : with_attribution:
12
- Failing example..
10
+ Running DocTest for the templates: templates.
13
11
 
14
- <div class="quoteblock">
15
- <blockquote>A person who never made a mistake <em>never</em> tried anything new.</blockquote>
16
- E <div>Albert Einstein</div>
17
- A <div class="attribution">— Albert Einstein</div>
18
- </div>
12
+ .SFFS
13
+ """
14
+ Then the output should contain:
15
+ """
16
+ ✗ Failure: block_quote:with_attribution
17
+ Failing example..
18
+
19
+ <div class="quoteblock">
20
+ <blockquote>A person who never made a mistake <em>never</em> tried anything new.</blockquote>
21
+ E <div>Albert Einstein</div>
22
+ A <div class="attribution">— Albert Einstein</div>
23
+ </div>
19
24
  """
20
25
  And the output should contain:
21
26
  """
22
- 2) Failure:
23
- TestHtml :: document : title_with_author:
24
- This example should fail..
27
+ Failure: document:title_with_author
28
+ This example should fail..
25
29
 
26
- <div id="header">
27
- <h1>The Dangerous and Thrilling Documentation Chronicles</h1>
28
- E <div id="author">Kismet Rainbow Chameleon</div>
29
- A <div class="details"><span id="author">Kismet Rainbow Chameleon</span></div>
30
- </div>
30
+ <div id="header">
31
+ <h1>The Dangerous and Thrilling Documentation Chronicles</h1>
32
+ E <div id="author">Kismet Rainbow Chameleon</div>
33
+ A <div class="details"><span id="author">Kismet Rainbow Chameleon</span></div>
34
+ </div>
35
+ """
36
+ And the output should contain:
37
+ """
38
+ 5 examples (1 passed, 2 failed, 2 skipped)
31
39
  """
32
40
  And the output should contain:
33
41
  """
34
- 5 runs, 3 assertions, 2 failures, 0 errors, 2 skips
42
+ You have skipped tests. Run with VERBOSE=yes for details.
43
+ """
44
+
45
+ When I run `bundle exec rake doctest:test VERBOSE=yes`
46
+ Then the output should contain:
47
+ """
48
+ Running DocTest for the templates: templates.
49
+
50
+ ✓ block_quote:with_id_and_role
51
+ ∅ block_quote:with_title
52
+ ✗ block_quote:with_attribution
53
+ ✗ document:title_with_author
54
+ ∅ inline_quoted:emphasis
55
+
56
+ """
57
+ And the output should contain:
58
+ """
59
+ ∅ Skipped: block_quote:with_title
60
+ No expected output found
61
+ """
62
+ And the output should contain:
63
+ """
64
+ ∅ Skipped: inline_quoted:emphasis
65
+ No expected output found
66
+ """
67
+
68
+ Scenario: Test only examples matching the pattern
69
+ When I run `bundle exec rake doctest:test PATTERN=block_*:* VERBOSE=yes`
70
+ Then the output should contain:
71
+ """
72
+ Running DocTest for the templates: templates.
73
+
74
+ ✓ block_quote:with_id_and_role
75
+ ∅ block_quote:with_title
76
+ ✗ block_quote:with_attribution
77
+
35
78
  """
36
79
 
37
80
  Scenario: A necessary template is missing and fallback to the built-in converter is disabled
38
81
  When I remove the file "templates/inline_quoted.html.slim"
39
- And I run `bundle exec rake test`
82
+ And I run `bundle exec rake doctest:test`
40
83
  Then the output should contain:
41
84
  """
42
85
  Could not find a custom template to handle template_name: inline_quoted
43
86
  """
44
87
  And the output should contain:
45
88
  """
46
- 1) Failure:
47
- TestHtml :: block_quote : with_attribution:
48
- Failing example..
89
+ Failure: block_quote:with_attribution
90
+ Failing example..
49
91
 
50
- <div class="quoteblock">
51
- E <blockquote>A person who never made a mistake <em>never</em> tried anything new.</blockquote>
52
- E <div>Albert Einstein</div>
53
- A <blockquote>A person who never made a mistake --TEMPLATE NOT FOUND-- tried anything new.</blockquote>
54
- A <div class="attribution">— Albert Einstein</div>
55
- </div>
92
+ <div class="quoteblock">
93
+ E <blockquote>A person who never made a mistake <em>never</em> tried anything new.</blockquote>
94
+ E <div>Albert Einstein</div>
95
+ A <blockquote>A person who never made a mistake --TEMPLATE NOT FOUND-- tried anything new.</blockquote>
96
+ A <div class="attribution">— Albert Einstein</div>
97
+ </div>
56
98
  """
@@ -3,16 +3,13 @@ require 'pathname'
3
3
  module Asciidoctor
4
4
  module DocTest
5
5
 
6
- BUILTIN_EXAMPLES_PATH = Pathname.new(
6
+ @examples_path = Pathname.new(
7
7
  '../../data/examples/asciidoc').expand_path(__dir__).to_s.freeze
8
8
 
9
- @examples_path = [ BUILTIN_EXAMPLES_PATH ]
10
-
11
- class << self
12
- # @return [Array<String>] paths of the directories where to look for the
13
- # examples suites. Use +unshift+ to add your paths before the built-in
14
- # reference input examples (default: +["{asciidoctor-doctest}/data/examples/asciidoc"]+).
15
- attr_accessor :examples_path
9
+ # @return [Array<String>] paths of the built-in input examples. It always
10
+ # returns a new array.
11
+ def self.examples_path
12
+ [ @examples_path ]
16
13
  end
17
14
  end
18
15
  end
@@ -21,10 +18,10 @@ end
21
18
  DocTest = Asciidoctor::DocTest unless defined? DocTest
22
19
 
23
20
  require 'asciidoctor/doctest/version'
24
- require 'asciidoctor/doctest/base_example'
25
- require 'asciidoctor/doctest/base_examples_suite'
21
+ require 'asciidoctor/doctest/example'
26
22
  require 'asciidoctor/doctest/generator'
27
- require 'asciidoctor/doctest/generator_task'
28
- require 'asciidoctor/doctest/test'
29
- require 'asciidoctor/doctest/asciidoc/examples_suite'
30
- require 'asciidoctor/doctest/html/examples_suite'
23
+ require 'asciidoctor/doctest/rake_tasks'
24
+ require 'asciidoctor/doctest/test_reporter'
25
+ require 'asciidoctor/doctest/tester'
26
+ require 'asciidoctor/doctest/io'
27
+ require 'asciidoctor/doctest/html/converter'
@@ -0,0 +1,85 @@
1
+ require 'asciidoctor'
2
+ require 'asciidoctor/doctest/no_fallback_template_converter'
3
+ require 'corefines'
4
+
5
+ using Corefines::Hash[:rekey, :+]
6
+ using Corefines::Object::blank?
7
+
8
+ module Asciidoctor
9
+ module DocTest
10
+ ##
11
+ # This class is basically a wrapper for +Asciidoctor.convert+ that allows to
12
+ # preset and validate some common parameters.
13
+ class AsciidocConverter
14
+
15
+ # @return [Hash] the default options to be passed to Asciidoctor.
16
+ attr_reader :default_opts
17
+
18
+ ##
19
+ # @param opts [Hash] the default options to be passed to Asciidoctor.
20
+ # For a complete list of all available options see the
21
+ # Asciidoctor's documentation
22
+ #
23
+ # @option opts :backend [#to_s, nil] the name of the tested backend.
24
+ # @option opts :backend_name [#to_s, nil] alias for the +:backend+.
25
+ #
26
+ # @option opts :converter [Class, Asciidoctor::Converter::Base, nil]
27
+ # the backend's converter class (or its instance). When not
28
+ # specified, the default converter for the specified backend is
29
+ # used.
30
+ #
31
+ # @option opts :template_dirs [Array<String>, String] path of the
32
+ # directory (or multiple directories) where to look for the
33
+ # backend's templates. Relative paths are referenced from the
34
+ # working directory.
35
+ #
36
+ # @option opts :templates_fallback [Boolean] allow to fall back to using
37
+ # an appropriate built-in converter when there is no required
38
+ # template in the tested backend?
39
+ # This is actually a default behaviour in Asciidoctor, but since
40
+ # it's inappropriate for testing of custom backends, it's
41
+ # disabled by default.
42
+ #
43
+ # @option opts :safe [Symbol] the safe mode, one of +:unsafe+, +:safe+,
44
+ # +:server+, or +:secure+. Default is +:safe+.
45
+ #
46
+ # @raise [ArgumentError] if some path from the +template_dirs+ doesn't
47
+ # exist or is not a directory.
48
+ #
49
+ def initialize(opts = {})
50
+ opts = opts.rekey(&:to_sym).rekey(:backend_name => :backend)
51
+
52
+ template_dirs = Array(opts[:template_dirs]).freeze
53
+ template_dirs.each do |path|
54
+ fail ArgumentError, "Templates directory '#{path}' doesn't exist!" unless Dir.exist? path
55
+ end
56
+
57
+ unless template_dirs.empty?
58
+ opts[:template_dirs] = template_dirs
59
+ opts[:converter] ||= NoFallbackTemplateConverter unless opts[:templates_fallback]
60
+ end
61
+
62
+ opts[:safe] ||= :safe
63
+ opts.delete(:backend) if opts[:backend].blank?
64
+
65
+ @default_opts = opts
66
+ end
67
+
68
+ ##
69
+ # Converts the given +text+ into AsciiDoc syntax with Asciidoctor using
70
+ # the tested backend.
71
+ #
72
+ # @param text [#to_s] the input text in AsciiDoc syntax.
73
+ # @param opts [Hash] options to pass to Asciidoctor. This will be merged
74
+ # with {#default_opts} with precedence of +opts+.
75
+ # @return [String] converted input.
76
+ #
77
+ def convert(text, opts = {})
78
+ Asciidoctor.convert(text.to_s, @default_opts + opts)
79
+ end
80
+
81
+ alias_method :opts, :default_opts
82
+ alias_method :call, :convert
83
+ end
84
+ end
85
+ end