asciidoctor-doctest 1.5.2.0 → 2.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
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