asciidoctor-doctest 1.5.1.2 → 1.5.2.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
  SHA1:
3
- metadata.gz: b53dc962dc9b4a814b1311a5178533de5ad77dbc
4
- data.tar.gz: 66551c6bd3d034b34d5ae53a0bd060b75afda60c
3
+ metadata.gz: 17448118b205d1f1a39fb2ccde52df38b512899e
4
+ data.tar.gz: 22caa40c2925809f7931347b267639676cc9c88a
5
5
  SHA512:
6
- metadata.gz: ac106abb1cff5378e3f8884ff1b2d48dc93f28851d9411ccfa00edfa27b26443ee3f3c05548dd9fd3dcbd9d32405cc8e2e7f53a79a5e63d83a49770c2d7c85fe
7
- data.tar.gz: b31a3fbb5fdaa396edfbba6dbf735032c3bce9bd91f11d339000b69506841e9f43567896f92f01b60881650c4a694953d769adae2cd3c12259c571e595e5489b
6
+ metadata.gz: 098697a3599f989cf9b39a463182467c06ef6c2fb8dfeb9beca1510967899ad8a406368fcc392cdf16e7eef287b0d2deda3097f3692bb18207326891716fb41e
7
+ data.tar.gz: 119b67494d4af4d29eb09ddb22e1a2f189290b5bc3e095bd74a40469109c16317754d30111178e7a4b1a10eb677d9f283b9887b7b5cb7ac7a4d33ed75837c6ae
@@ -7,6 +7,18 @@ This document provides a high-level view of the changes introduced in DocTest by
7
7
  For a detailed view of what has changed, refer to the {repo-uri}/commits/master[commit history] on GitHub.
8
8
 
9
9
 
10
+ == 1.5.2.0 (2015-04-04)
11
+
12
+ Improvements::
13
+ * Update https://github.com/threedaymonk/htmlbeautifier[htmlbeautifier] to 1.0.0 and remove workaround in `html/html_beautifier` [{commit-uri}/6caafb0[6caafb0]].
14
+ * Extract formatting (serialization) of example’s options into `BaseExamplesSuite#format_options` to be reusable [{commit-uri}/c4d779c[c4d779c]].
15
+ * Implement serialization of examples suite into AsciiDoc [{commit-uri}/900aab8[900aab8]].
16
+ * Replace custom core extensions, ActiveSupport and Colorize with https://github.com/jirutka/corefines[Corefines]. This also means that refinements will be used instead of global monkey-patching, when running on Ruby that supports refinements (currently MRI ≥2.1.0). [{commit-uri}/50e05c1[50e05c1], {commit-uri}/2f4a42e[2f4a42e]]
17
+
18
+ Bug fixes::
19
+ * Fix implementation of `eql?` and `hash` in BaseExample [{commit-uri}/c27615b[c27615b]].
20
+
21
+
10
22
  == 1.5.1.2 (2015-01-03)
11
23
 
12
24
  Improvements::
@@ -56,12 +56,12 @@ mkdir -p test/examples/asciidoc
56
56
  . Add development dependency on `asciidoctor-doctest` to your gemspec:
57
57
  +
58
58
  [source]
59
- s.add_development_dependency 'asciidoctor-doctest', '~> 1.5'
59
+ s.add_development_dependency 'asciidoctor-doctest', '~> 1.5.2'
60
60
  +
61
61
  or Gemfile if you’re not distributing the backend as a gem:
62
62
  +
63
63
  [source]
64
- gem 'asciidoctor-doctest', '~> 1.5'
64
+ gem 'asciidoctor-doctest', '~> 1.5.2'
65
65
  +
66
66
  and run `bundle install`.
67
67
 
@@ -1,5 +1,9 @@
1
1
  require 'asciidoctor/doctest/base_examples_suite'
2
- require 'asciidoctor/doctest/core_ext'
2
+ require 'corefines'
3
+
4
+ using Corefines::Enumerable::map_send
5
+ using Corefines::Object[:blank?, :presence]
6
+ using Corefines::String::concat!
3
7
 
4
8
  module Asciidoctor::DocTest
5
9
  module Asciidoc
@@ -8,8 +12,12 @@ module Asciidoctor::DocTest
8
12
  #
9
13
  # @example Format of the example's header
10
14
  # // .example-name
11
- # // Any text that is not the example's name is considered
15
+ # // Any text that is not the example's name or an option is considered
12
16
  # // as a description.
17
+ # // :option_1: value 1
18
+ # // :option_2: value 1
19
+ # // :option_2: value 2
20
+ # // :boolean_option:
13
21
  # The example's content in *AsciiDoc*.
14
22
  #
15
23
  # NOTE: The trailing new line (below this) will be removed.
@@ -25,20 +33,35 @@ module Asciidoctor::DocTest
25
33
  current = create_example(nil)
26
34
 
27
35
  input.each_line do |line|
28
- line.chomp!
29
- if line =~ %r{^//\s*\.([^ \n]+)}
36
+ case line.chomp!
37
+ when %r{^//\s*\.([^ \n]+)}
30
38
  local_name = $1
31
39
  current.content.chomp!
32
40
  examples << (current = create_example([group_name, local_name]))
33
- elsif line =~ %r{^//\s*(.*)\s*$}
34
- (current.desc ||= '').concat($1, "\n")
41
+ when %r{^//\s*:([^:]+):(.*)}
42
+ current[$1.to_sym] = $2.blank? ? true : $2.strip
43
+ when %r{^//\s*(.*)\s*$}
44
+ (current.desc ||= '').concat!($1, "\n")
35
45
  else
36
- current.content.concat(line, "\n")
46
+ current.content.concat!(line, "\n")
37
47
  end
38
48
  end
39
49
 
40
50
  examples
41
51
  end
52
+
53
+ def serialize(examples)
54
+ Array(examples).map { |exmpl|
55
+ Array.new.push(".#{exmpl.local_name}")
56
+ .push(*exmpl.desc.lines.map(&:chomp))
57
+ .push(*format_options(exmpl.opts))
58
+ .map_send(:prepend, '// ')
59
+ .push(exmpl.content.presence)
60
+ .compact
61
+ .join("\n")
62
+ .concat("\n")
63
+ }.join("\n")
64
+ end
42
65
  end
43
66
  end
44
67
  end
@@ -1,10 +1,10 @@
1
- require 'active_support/core_ext/array/wrap'
2
- require 'active_support/core_ext/object/blank'
3
1
  require 'asciidoctor'
4
2
  require 'asciidoctor/converter/template'
5
- require 'asciidoctor/doctest/core_ext'
3
+ require 'corefines'
6
4
  require 'delegate'
7
5
 
6
+ using Corefines::Object[:blank?, :presence]
7
+
8
8
  module Asciidoctor
9
9
  module DocTest
10
10
  ##
@@ -43,7 +43,7 @@ module Asciidoctor
43
43
  @converter = converter
44
44
  @converter ||= NoFallbackTemplateConverter unless template_dirs.empty? || templates_fallback
45
45
 
46
- template_dirs = Array.wrap(template_dirs).freeze
46
+ template_dirs = Array(template_dirs).freeze
47
47
  template_dirs.each do |path|
48
48
  fail ArgumentError, "Templates directory '#{path}' doesn't exist!" unless Dir.exist? path
49
49
  end
@@ -1,6 +1,6 @@
1
- require 'active_support/core_ext/object/blank'
2
- require 'active_support/core_ext/object/deep_dup'
3
- require 'active_support/core_ext/object/instance_variables'
1
+ require 'corefines'
2
+
3
+ using Corefines::Object[:blank?, :deep_dup, :instance_values]
4
4
 
5
5
  module Asciidoctor
6
6
  module DocTest
@@ -146,12 +146,12 @@ module Asciidoctor
146
146
  # otherwise +false+.
147
147
  def eql?(other)
148
148
  self.class == other.class &&
149
- instance_variables == other.instance_variables
149
+ instance_values == other.instance_values
150
150
  end
151
151
 
152
152
  # :nocov:
153
153
  def hash
154
- self.class.hash ^ instance_variables.hash
154
+ self.class.hash ^ instance_values.hash
155
155
  end
156
156
  # :nocov:
157
157
 
@@ -1,8 +1,9 @@
1
- require 'active_support/core_ext/enumerable'
2
- require 'active_support/core_ext/array/wrap'
3
- require 'active_support/core_ext/class/attribute'
1
+ require 'corefines'
4
2
  require 'pathname'
5
3
 
4
+ using Corefines::Object::blank?
5
+ using Corefines::Enumerable::index_by
6
+
6
7
  module Asciidoctor
7
8
  module DocTest
8
9
  ##
@@ -24,7 +25,7 @@ module Asciidoctor
24
25
  fail ArgumentError, 'file_ext must not be blank or nil' if file_ext.blank?
25
26
 
26
27
  @file_ext = file_ext.strip.freeze
27
- @examples_path = Array.wrap(examples_path).freeze
28
+ @examples_path = Array(examples_path).freeze
28
29
  @examples_cache = {}
29
30
  end
30
31
 
@@ -150,7 +151,7 @@ module Asciidoctor
150
151
  examples.group_by(&:group_name).each do |group, exmpls|
151
152
  # replace cached examples with the given ones and preserve original order
152
153
  updated_group = [ read_examples(group), exmpls ]
153
- .map_send(:index_by, &:local_name)
154
+ .map { |e| e.index_by(&:local_name) }
154
155
  .reduce(:merge)
155
156
  .values
156
157
 
@@ -173,6 +174,36 @@ module Asciidoctor
173
174
  }.sort
174
175
  end
175
176
 
177
+ protected
178
+
179
+ ##
180
+ # Converts the given options into the format used in examples file.
181
+ #
182
+ # @example
183
+ # {
184
+ # option1: 'value 1',
185
+ # option2: ['value 1', 'value 2']
186
+ # option3: true
187
+ # }
188
+ # V---V---V---V---V---V---V---V---V
189
+ # [
190
+ # ':option1: value 1',
191
+ # ':option2: value 1',
192
+ # ':option2: value 2',
193
+ # ':option3:'
194
+ # ]
195
+ #
196
+ # @param opts [Hash] options
197
+ # @return [Array<String>] formatted options
198
+ #
199
+ def format_options(opts)
200
+ opts.each_with_object([]) do |(name, vals), ary|
201
+ Array(vals).each do |val|
202
+ ary << (val == true ? ":#{name}:" : ":#{name}: #{val}")
203
+ end
204
+ end
205
+ end
206
+
176
207
  private
177
208
 
178
209
  def read_files(file_name)
@@ -1,5 +1,7 @@
1
1
  require 'asciidoctor'
2
- require 'colorize'
2
+ require 'corefines'
3
+
4
+ using Corefines::String::color
3
5
 
4
6
  module Asciidoctor
5
7
  module DocTest
@@ -35,7 +37,7 @@ module Asciidoctor
35
37
  next unless input.name_match? pattern
36
38
 
37
39
  log = ->(msg, color = :default) do
38
- log_os << " --> #{(msg % input.name).colorize(color)}\n" if log_os
40
+ log_os << " --> #{(msg % input.name).color(color)}\n" if log_os
39
41
  end
40
42
 
41
43
  if input.empty?
@@ -1,8 +1,9 @@
1
- require 'active_support/core_ext/string/strip'
2
1
  require 'asciidoctor/doctest/generator'
3
- require 'asciidoctor/doctest/core_ext'
2
+ require 'corefines'
4
3
  require 'rake/tasklib'
5
4
 
5
+ using Corefines::String::unindent
6
+
6
7
  module Asciidoctor
7
8
  module DocTest
8
9
  ##
@@ -99,7 +100,7 @@ module Asciidoctor
99
100
  end
100
101
 
101
102
  def description
102
- <<-EOS.strip_heredoc
103
+ <<-EOS.unindent
103
104
  #{title}
104
105
 
105
106
  Options (environment variables):
@@ -1,6 +1,6 @@
1
1
  require 'asciidoctor/doctest/base_example'
2
- require 'asciidoctor/doctest/html/html_beautifier'
3
2
  require 'asciidoctor/doctest/html/normalizer'
3
+ require 'htmlbeautifier'
4
4
  require 'nokogiri'
5
5
 
6
6
  module Asciidoctor::DocTest
@@ -1,11 +1,12 @@
1
- require 'active_support/core_ext/array/wrap'
2
- require 'active_support/core_ext/object/blank'
3
1
  require 'asciidoctor/doctest/base_examples_suite'
4
- require 'asciidoctor/doctest/core_ext'
5
2
  require 'asciidoctor/doctest/html/example'
6
3
  require 'asciidoctor/doctest/html/normalizer'
4
+ require 'corefines'
7
5
  require 'nokogiri'
8
6
 
7
+ using Corefines::Object[:blank?, :presence, :then]
8
+ using Corefines::String::concat!
9
+
9
10
  module Asciidoctor::DocTest
10
11
  module HTML
11
12
  ##
@@ -13,12 +14,12 @@ module Asciidoctor::DocTest
13
14
  #
14
15
  # @example Format of the example's header
15
16
  # <!-- .example-name
16
- # Any text that is not the example's name or an option and doesn't
17
- # start with // is considered as a description.
18
- # :option-1: value 1
19
- # :option-2: value 1
20
- # :option-2: value 2
21
- # :boolean-option:
17
+ # Any text that is not the example's name or an option is considered
18
+ # as a description.
19
+ # :option_1: value 1
20
+ # :option_2: value 1
21
+ # :option_2: value 2
22
+ # :boolean_option:
22
23
  # -->
23
24
  # <p>The example's content in <strong>HTML</strong>.</p>
24
25
  #
@@ -46,12 +47,12 @@ module Asciidoctor::DocTest
46
47
  elsif in_comment
47
48
  if line =~ /^\s*:([^:]+):(.*)/
48
49
  current[$1.to_sym] = $2.blank? ? true : $2.strip
49
- elsif !line.start_with?('//')
50
+ else
50
51
  desc = line.rstrip.chomp('-->').strip
51
- (current.desc ||= '').concat(desc, "\n") unless desc.empty?
52
+ (current.desc ||= '').concat!(desc, "\n") unless desc.empty?
52
53
  end
53
54
  else
54
- current.content.concat(line, "\n")
55
+ current.content.concat!(line, "\n")
55
56
  end
56
57
  in_comment &= !line.end_with?('-->')
57
58
  end
@@ -60,16 +61,14 @@ module Asciidoctor::DocTest
60
61
  end
61
62
 
62
63
  def serialize(examples)
63
- Array.wrap(examples).map { |exmpl|
64
- header = [ ".#{exmpl.local_name}", exmpl.desc.presence ].compact
64
+ Array(examples).map { |exmpl|
65
+ header = [
66
+ ".#{exmpl.local_name}",
67
+ exmpl.desc.presence,
68
+ *format_options(exmpl.opts)
69
+ ].compact
65
70
 
66
- exmpl.opts.each do |name, vals|
67
- Array.wrap(vals).each do |val|
68
- header << (val == true ? ":#{name}:" : ":#{name}: #{val}")
69
- end
70
- end
71
71
  header_str = header.one? ? (header.first + ' ') : (header.join("\n") + "\n")
72
-
73
72
  [ "<!-- #{header_str}-->", exmpl.content.presence ].compact.join("\n") + "\n"
74
73
  }.join("\n")
75
74
  end
@@ -79,30 +78,38 @@ module Asciidoctor::DocTest
79
78
  end
80
79
 
81
80
  def convert_example(example, opts, renderer)
81
+ # The header & footer are excluded by default; always enable for document examples.
82
82
  header_footer = !!opts[:header_footer] || example.name.start_with?('document')
83
83
 
84
- html = renderer.convert(example.content, header_footer: header_footer)
85
- html = parse_html(html, !header_footer)
86
-
87
- # When asserting inline examples, ignore paragraph "wrapper".
84
+ # When asserting inline examples, defaults to ignore paragraph "wrapper".
88
85
  includes = opts[:include] || (@paragraph_xpath if example.name.start_with? 'inline_')
89
86
 
90
- Array.wrap(includes).each do |xpath|
91
- # XPath returns NodeSet, but we need DocumentFragment, so convert it again.
92
- html = parse_html(html.xpath(xpath).to_html)
93
- end
87
+ renderer.convert(example.content, header_footer: header_footer)
88
+ .then { |s| parse_html s, !header_footer }
89
+ .then { |h| find_nodes h, includes }
90
+ .then { |h| remove_nodes h, opts[:exclude] }
91
+ .then { |h| h.normalize! }
92
+ .then { |h| HtmlBeautifier.beautify h }
93
+ .then { |h| create_example example.name, content: h, opts: opts }
94
+ end
95
+
96
+ protected
94
97
 
95
- Array.wrap(opts[:exclude]).each do |xpath|
96
- html.xpath(xpath).remove
98
+ def find_nodes(html, xpaths)
99
+ Array(xpaths).reduce(html) do |htm, xpath|
100
+ # XPath returns NodeSet, but we need DocumentFragment, so convert it again.
101
+ parse_html htm.xpath(xpath).to_html
97
102
  end
103
+ end
98
104
 
99
- html.normalize!
105
+ def remove_nodes(html, xpaths)
106
+ return html unless xpaths
100
107
 
101
- create_example example.name, content: HtmlBeautifier.beautify(html), opts: opts
108
+ Array(xpaths).each_with_object(html.clone) do |xpath, htm|
109
+ htm.xpath(xpath).remove
110
+ end
102
111
  end
103
112
 
104
- private
105
-
106
113
  def parse_html(str, fragment = true)
107
114
  fragment ? ::Nokogiri::HTML.fragment(str) : ::Nokogiri::HTML.parse(str)
108
115
  end
@@ -1,6 +1,8 @@
1
- require 'active_support/core_ext/object/try'
1
+ require 'corefines'
2
2
  require 'nokogiri'
3
3
 
4
+ using Corefines::Object::try
5
+
4
6
  module Asciidoctor::DocTest
5
7
  module HTML
6
8
  ##
@@ -1,6 +1,8 @@
1
- require 'colorize'
1
+ require 'corefines'
2
2
  require 'diffy'
3
3
 
4
+ using Corefines::String::color
5
+
4
6
  module Asciidoctor
5
7
  module DocTest
6
8
  ##
@@ -59,9 +61,9 @@ module Diffy
59
61
  when /^\\\s*No newline at end of file/
60
62
  # ignore
61
63
  when /^\+/
62
- line.chomp.sub(/^\+/, 'A' + padding).red
64
+ line.chomp.sub(/^\+/, 'A' + padding).color(:red)
63
65
  when /^-/
64
- line.chomp.sub(/^\-/, 'E' + padding).green
66
+ line.chomp.sub(/^\-/, 'E' + padding).color(:green)
65
67
  else
66
68
  padding + line.chomp
67
69
  end
@@ -1,10 +1,12 @@
1
- require 'active_support/core_ext/object/blank'
2
1
  require 'asciidoctor/doctest/asciidoc_renderer'
3
- require 'asciidoctor/doctest/core_ext'
4
2
  require 'asciidoctor/doctest/minitest_diffy'
5
3
  require 'asciidoctor/doctest/asciidoc/examples_suite'
4
+ require 'corefines'
6
5
  require 'minitest'
7
6
 
7
+ using Corefines::Object[:blank?, :presence]
8
+ using Corefines::Module::alias_class_method
9
+
8
10
  module Asciidoctor
9
11
  module DocTest
10
12
  ##
@@ -1,5 +1,5 @@
1
1
  module Asciidoctor
2
2
  module DocTest
3
- VERSION = '1.5.1.2'
3
+ VERSION = '1.5.2.0'
4
4
  end
5
5
  end
@@ -1,6 +1,7 @@
1
- require 'active_support/core_ext/string/strip'
2
1
  require 'forwardable'
3
2
 
3
+ using Corefines::String::unindent
4
+
4
5
  describe DocTest::Asciidoc::ExamplesSuite do
5
6
  extend Forwardable
6
7
 
@@ -19,18 +20,23 @@ describe DocTest::Asciidoc::ExamplesSuite do
19
20
  end
20
21
 
21
22
 
22
- describe '#parse' do
23
+ describe 'parsing/serialization:' do
23
24
 
24
25
  context 'one example' do
25
26
 
26
27
  shared_examples :example do
27
- subject(:parsed) { suite.parse input, 's' }
28
+ let(:parsed) { suite.parse input, 's' }
29
+ let(:serialized) { suite.serialize output }
28
30
 
29
- it { is_expected.to have(1).items }
31
+ it { expect(parsed).to have(1).items }
30
32
 
31
- it 'returns an array with parsed Example object' do
33
+ it 'returns an array with parsed example object' do
32
34
  expect(parsed.first).to eql output
33
35
  end
36
+
37
+ it 'returns a serialized example as string' do
38
+ expect(serialized).to eql input
39
+ end
34
40
  end
35
41
 
36
42
  context 'with name only' do
@@ -42,7 +48,7 @@ describe DocTest::Asciidoc::ExamplesSuite do
42
48
 
43
49
  context 'with multiline content' do
44
50
  let :content do
45
- <<-EOF.strip_heredoc
51
+ <<-EOF.unindent
46
52
  Paragraphs don't require
47
53
  any special markup.
48
54
 
@@ -58,7 +64,7 @@ describe DocTest::Asciidoc::ExamplesSuite do
58
64
 
59
65
  context 'with description' do
60
66
  let :input do
61
- <<-EOF.strip_heredoc
67
+ <<-EOF.unindent
62
68
  // .strong
63
69
  // This is a description,
64
70
  // see?
@@ -73,11 +79,50 @@ describe DocTest::Asciidoc::ExamplesSuite do
73
79
 
74
80
  include_examples :example
75
81
  end
82
+
83
+ context 'with options' do
84
+ let :input do
85
+ <<-EOF.unindent
86
+ // .basic
87
+ // :exclude: /^=+.*/
88
+ // :exclude: /^#+.*/
89
+ // :include: /^----\\n(.*)\\n----/m
90
+ // :header_footer:
91
+ _dummy_
92
+ EOF
93
+ end
94
+
95
+ let :output do
96
+ create_example 's:basic', content: '_dummy_', opts: {
97
+ exclude: ['/^=+.*/', '/^#+.*/'],
98
+ include: ['/^----\\n(.*)\\n----/m'],
99
+ header_footer: true
100
+ }
101
+ end
102
+ include_examples :example
103
+ end
104
+
105
+ context 'with description and options' do
106
+ let :input do
107
+ <<-EOF.unindent
108
+ // .basic
109
+ // This is a description.
110
+ // :exclude: /^=+.*/
111
+ EOF
112
+ end
113
+
114
+ let :output do
115
+ create_example 's:basic', desc: 'This is a description.', opts: {
116
+ exclude: ['/^=+.*/']
117
+ }
118
+ end
119
+ include_examples :example
120
+ end
76
121
  end
77
122
 
78
123
  context 'multiple examples' do
79
124
  let :input do
80
- <<-EOF.strip_heredoc
125
+ <<-EOF.unindent
81
126
  // .basic
82
127
  http://asciidoctor.org
83
128
 
@@ -163,6 +163,8 @@ describe DocTest::BaseExample do
163
163
  end
164
164
 
165
165
  describe '#dup' do
166
+ using Corefines::Object::instance_values
167
+
166
168
  it 'returns deep copy' do
167
169
  origo = described_class.new('a:b', content: 'allons-y!', desc: 'who?', opts: {key: ['value']})
168
170
  copy = origo.dup
@@ -1,4 +1,6 @@
1
- require 'active_support/core_ext/string/strip'
1
+ require 'forwardable'
2
+
3
+ using Corefines::String::unindent
2
4
 
3
5
  describe DocTest::HTML::ExamplesSuite do
4
6
  extend Forwardable
@@ -46,7 +48,7 @@ describe DocTest::HTML::ExamplesSuite do
46
48
 
47
49
  context 'with multiline content' do
48
50
  let :content do
49
- <<-EOF.strip_heredoc
51
+ <<-EOF.unindent
50
52
  <p>Paragraphs don't require
51
53
  any special markup.</p>
52
54
 
@@ -62,7 +64,7 @@ describe DocTest::HTML::ExamplesSuite do
62
64
 
63
65
  context 'with description' do
64
66
  let :input do
65
- <<-EOF.strip_heredoc
67
+ <<-EOF.unindent
66
68
  <!-- .strong
67
69
  This is a description,
68
70
  see?
@@ -80,11 +82,12 @@ describe DocTest::HTML::ExamplesSuite do
80
82
 
81
83
  context 'with options' do
82
84
  let :input do
83
- <<-EOF.strip_heredoc
85
+ <<-EOF.unindent
84
86
  <!-- .basic
85
87
  :exclude: .//code
86
88
  :exclude: .//section
87
89
  :include: ./p/node()
90
+ :header_footer:
88
91
  -->
89
92
  <p>dummy</p>
90
93
  EOF
@@ -93,34 +96,26 @@ describe DocTest::HTML::ExamplesSuite do
93
96
  let :output do
94
97
  create_example 's:basic', content: '<p>dummy</p>', opts: {
95
98
  exclude: ['.//code', './/section'],
96
- include: ['./p/node()']
99
+ include: ['./p/node()'],
100
+ header_footer: true
97
101
  }
98
102
  end
99
103
  include_examples :example
100
104
  end
101
105
 
102
- context 'with boolean option' do
103
- let(:input) { "<!-- .basic\n:header_footer:\n-->\n" }
104
- let(:output) { create_example 's:basic', opts: { header_footer: true } }
105
-
106
- include_examples :example
107
- end
108
-
109
106
  context 'with description and options' do
110
107
  let :input do
111
- <<-EOF.strip_heredoc
108
+ <<-EOF.unindent
112
109
  <!-- .basic
113
110
  This is a description.
114
111
  :exclude: .//code
115
- :header_footer:
116
112
  -->
117
113
  EOF
118
114
  end
119
115
 
120
116
  let :output do
121
117
  create_example 's:basic', desc: 'This is a description.', opts: {
122
- exclude: ['.//code'],
123
- header_footer: true
118
+ exclude: ['.//code']
124
119
  }
125
120
  end
126
121
  include_examples :example
@@ -129,7 +124,7 @@ describe DocTest::HTML::ExamplesSuite do
129
124
 
130
125
  context 'multiple examples' do
131
126
  let :input do
132
- <<-EOF.strip_heredoc
127
+ <<-EOF.unindent
133
128
  <!-- .basic -->
134
129
  http://asciidoctor.org
135
130
 
@@ -1,5 +1,7 @@
1
- require 'active_support/core_ext/string/strip'
2
1
  require 'asciidoctor/doctest/minitest_diffy'
2
+ require 'corefines'
3
+
4
+ using Corefines::String::color
3
5
 
4
6
  describe Diffy::Format do
5
7
 
@@ -34,7 +36,7 @@ describe Diffy::Format do
34
36
  let(:input) { ['+ <div><p>chunky bacon</p></div>'] }
35
37
 
36
38
  it 'replaces "+" with "A", adds padding and colour' do
37
- is_expected.to eq "\n" + 'A <div><p>chunky bacon</p></div>'.red
39
+ is_expected.to eq "\n" + 'A <div><p>chunky bacon</p></div>'.color(:red)
38
40
  end
39
41
  end
40
42
 
@@ -42,7 +44,7 @@ describe Diffy::Format do
42
44
  let(:input) { ['- <p>chunky bacon</p>'] }
43
45
 
44
46
  it 'replaces "-" with "E", adds padding and colour' do
45
- is_expected.to eq "\n" + 'E <p>chunky bacon</p>'.green
47
+ is_expected.to eq "\n" + 'E <p>chunky bacon</p>'.color(:green)
46
48
  end
47
49
  end
48
50
 
@@ -1,7 +1,8 @@
1
- require 'active_support/core_ext/array/access'
2
1
  require 'fileutils'
3
2
  require 'forwardable'
4
3
 
4
+ using Corefines::Array::second
5
+
5
6
  shared_examples DocTest::BaseExamplesSuite do
6
7
  extend Forwardable
7
8
 
@@ -253,6 +254,33 @@ shared_examples DocTest::BaseExamplesSuite do
253
254
  end
254
255
 
255
256
 
257
+ describe '#format_options' do
258
+
259
+ shared_examples :format_options do |input, output|
260
+ it "returns #{output} for #{input}" do
261
+ expect(suite.send(:format_options, input)).to eq output
262
+ end
263
+ end
264
+
265
+ context 'empty' do
266
+ include_examples :format_options, {}, []
267
+ end
268
+
269
+ context 'options with one value' do
270
+ include_examples :format_options, {opt1: 'val1', opt2: 'val2'}, [':opt1: val1', ':opt2: val2']
271
+ end
272
+
273
+ context 'options with multiple values' do
274
+ include_examples :format_options, {opt1: %w[val11 val12], opt2: ['val2']},
275
+ [':opt1: val11', ':opt1: val12', ':opt2: val2']
276
+ end
277
+
278
+ context 'boolean options' do
279
+ include_examples :format_options, {opt1: true, opt2: false}, [':opt1:', ':opt2: false']
280
+ end
281
+ end
282
+
283
+
256
284
  def create_and_write_group(path, group_name, file_ext, *examples)
257
285
  content = [path, group_name + file_ext, *examples].join("\n")
258
286
  File.write File.join(path, group_name + file_ext), content
@@ -1,6 +1,8 @@
1
+ require 'corefines'
1
2
  require 'rspec/collection_matchers'
2
3
  require 'simplecov'
3
4
  require 'asciidoctor/doctest'
5
+ require 'fakefs/spec_helpers'
4
6
 
5
7
  Dir['./spec/{shared_examples,support}/**/*.rb'].each { |file| require file }
6
8
 
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asciidoctor-doctest
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.1.2
4
+ version: 1.5.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jakub Jirutka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-03 00:00:00.000000000 Z
11
+ date: 2015-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: activesupport
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '4.1'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '4.1'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: asciidoctor
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -39,19 +25,19 @@ dependencies:
39
25
  - !ruby/object:Gem::Version
40
26
  version: 1.5.0
41
27
  - !ruby/object:Gem::Dependency
42
- name: colorize
28
+ name: corefines
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
31
  - - "~>"
46
32
  - !ruby/object:Gem::Version
47
- version: '0.6'
33
+ version: 1.0.0
48
34
  type: :runtime
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - "~>"
53
39
  - !ruby/object:Gem::Version
54
- version: '0.6'
40
+ version: 1.0.0
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: diffy
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +58,14 @@ dependencies:
72
58
  requirements:
73
59
  - - "~>"
74
60
  - !ruby/object:Gem::Version
75
- version: 0.0.11
61
+ version: '1.0'
76
62
  type: :runtime
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
66
  - - "~>"
81
67
  - !ruby/object:Gem::Version
82
- version: 0.0.11
68
+ version: '1.0'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: minitest
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -114,20 +100,14 @@ dependencies:
114
100
  requirements:
115
101
  - - "~>"
116
102
  - !ruby/object:Gem::Version
117
- version: 1.6.3
118
- - - "<"
119
- - !ruby/object:Gem::Version
120
- version: 1.6.4
103
+ version: 1.6.0
121
104
  type: :runtime
122
105
  prerelease: false
123
106
  version_requirements: !ruby/object:Gem::Requirement
124
107
  requirements:
125
108
  - - "~>"
126
109
  - !ruby/object:Gem::Version
127
- version: 1.6.3
128
- - - "<"
129
- - !ruby/object:Gem::Version
130
- version: 1.6.4
110
+ version: 1.6.0
131
111
  - !ruby/object:Gem::Dependency
132
112
  name: bundler
133
113
  requirement: !ruby/object:Gem::Requirement
@@ -156,6 +136,20 @@ dependencies:
156
136
  - - "~>"
157
137
  - !ruby/object:Gem::Version
158
138
  version: '10.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: thread_safe
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.3'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.3'
159
153
  - !ruby/object:Gem::Dependency
160
154
  name: yard
161
155
  requirement: !ruby/object:Gem::Requirement
@@ -190,14 +184,14 @@ dependencies:
190
184
  requirements:
191
185
  - - "~>"
192
186
  - !ruby/object:Gem::Version
193
- version: '0.6'
187
+ version: 0.6.4
194
188
  type: :development
195
189
  prerelease: false
196
190
  version_requirements: !ruby/object:Gem::Requirement
197
191
  requirements:
198
192
  - - "~>"
199
193
  - !ruby/object:Gem::Version
200
- version: '0.6'
194
+ version: 0.6.4
201
195
  - !ruby/object:Gem::Dependency
202
196
  name: simplecov
203
197
  requirement: !ruby/object:Gem::Requirement
@@ -357,12 +351,10 @@ files:
357
351
  - lib/asciidoctor/doctest/asciidoc_renderer.rb
358
352
  - lib/asciidoctor/doctest/base_example.rb
359
353
  - lib/asciidoctor/doctest/base_examples_suite.rb
360
- - lib/asciidoctor/doctest/core_ext.rb
361
354
  - lib/asciidoctor/doctest/generator.rb
362
355
  - lib/asciidoctor/doctest/generator_task.rb
363
356
  - lib/asciidoctor/doctest/html/example.rb
364
357
  - lib/asciidoctor/doctest/html/examples_suite.rb
365
- - lib/asciidoctor/doctest/html/html_beautifier.rb
366
358
  - lib/asciidoctor/doctest/html/normalizer.rb
367
359
  - lib/asciidoctor/doctest/minitest_diffy.rb
368
360
  - lib/asciidoctor/doctest/test.rb
@@ -370,13 +362,11 @@ files:
370
362
  - spec/asciidoc/examples_suite_spec.rb
371
363
  - spec/asciidoc_renderer_spec.rb
372
364
  - spec/base_example_spec.rb
373
- - spec/core_ext_spec.rb
374
365
  - spec/html/examples_suite_spec.rb
375
366
  - spec/html/normalizer_spec.rb
376
367
  - spec/minitest_diffy_spec.rb
377
368
  - spec/shared_examples/base_examples_suite.rb
378
369
  - spec/spec_helper.rb
379
- - spec/support/fakefs.rb
380
370
  - spec/support/matchers.rb
381
371
  - spec/test_spec.rb
382
372
  homepage: https://github.com/asciidoctor/asciidoctor-doctest
@@ -399,7 +389,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
399
389
  version: '0'
400
390
  requirements: []
401
391
  rubyforge_project:
402
- rubygems_version: 2.4.5
392
+ rubygems_version: 2.4.6
403
393
  signing_key:
404
394
  specification_version: 4
405
395
  summary: Test suite for Asciidoctor backends
@@ -425,13 +415,11 @@ test_files:
425
415
  - spec/asciidoc/examples_suite_spec.rb
426
416
  - spec/asciidoc_renderer_spec.rb
427
417
  - spec/base_example_spec.rb
428
- - spec/core_ext_spec.rb
429
418
  - spec/html/examples_suite_spec.rb
430
419
  - spec/html/normalizer_spec.rb
431
420
  - spec/minitest_diffy_spec.rb
432
421
  - spec/shared_examples/base_examples_suite.rb
433
422
  - spec/spec_helper.rb
434
- - spec/support/fakefs.rb
435
423
  - spec/support/matchers.rb
436
424
  - spec/test_spec.rb
437
425
  has_rdoc: yard
@@ -1,64 +0,0 @@
1
- module Enumerable
2
-
3
- ##
4
- # Sends a message to each element and collects the result.
5
- #
6
- # @example
7
- # [1, 2, 3].map_send(:+, 3) #=> [4, 5, 6]
8
- #
9
- # @param method_name [Symbol] name of the public method to call.
10
- # @param args arguments to pass to the method.
11
- # @param block [Proc] block to pass to the method.
12
- # @return [Enumerable]
13
- #
14
- def map_send(method_name, *args, &block)
15
- map { |e| e.public_send(method_name, *args, &block) }
16
- end
17
- end
18
-
19
- class Module
20
-
21
- ##
22
- # Makes +new_name+ a new copy of the class method +old_name+.
23
- #
24
- # @param new_name [Symbol] name of the new class method to create.
25
- # @param old_name [Symbol] name of the existing class method to alias.
26
- #
27
- def alias_class_method(new_name, old_name)
28
- singleton_class.send(:alias_method, new_name, old_name)
29
- end
30
- end
31
-
32
- class String
33
-
34
- ##
35
- # Appends (concatenates) the given object to +str+.
36
- #
37
- # @param obj [String, Integer] the string, or codepoint to append.
38
- # @param separator [String, nil] the separator to append when this +str+ is
39
- # not empty.
40
- # @return [String] self
41
- #
42
- def concat(obj, separator = nil)
43
- if separator && !self.empty?
44
- self << separator << obj
45
- else
46
- self << obj
47
- end
48
- end
49
- end
50
-
51
-
52
- # Workarounds for JRuby.
53
- if RUBY_ENGINE == 'jruby'
54
- require 'delegate'
55
-
56
- # @private
57
- class SimpleDelegator
58
-
59
- # https://github.com/jruby/jruby/issues/2412
60
- def warn(*msg)
61
- Kernel.warn(*msg)
62
- end
63
- end
64
- end
@@ -1,17 +0,0 @@
1
- require 'htmlbeautifier'
2
-
3
- module HtmlBeautifier
4
-
5
- ##
6
- # Beautifies the +input+ HTML.
7
- #
8
- # @param input [String, #to_html]
9
- # @return [String] a beautified copy of the +input+.
10
- #
11
- def self.beautify(input)
12
- input = input.to_html unless input.is_a? String
13
- output = []
14
- Beautifier.new(output).scan(input)
15
- output.join
16
- end
17
- end
@@ -1,67 +0,0 @@
1
- describe Enumerable do
2
-
3
- describe '#map_send' do
4
-
5
- it 'sends a message to each element and collects the result' do
6
- expect([1, 2, 3].map_send(:+, 3)).to eq [4, 5, 6]
7
- end
8
- end
9
- end
10
-
11
- describe String do
12
-
13
- describe '#concat' do
14
-
15
- context 'without separator' do
16
- subject { 'foo' }
17
-
18
- it 'appends the given string to self' do
19
- subject.concat 'bar'
20
- is_expected.to eq 'foobar'
21
- end
22
- end
23
-
24
- context 'with separator' do
25
-
26
- context 'when self is empty' do
27
- subject { '' }
28
-
29
- it 'appends the given string to self' do
30
- subject.concat 'bar', "\n"
31
- is_expected.to eq 'bar'
32
- end
33
- end
34
-
35
- context 'when self is not empty' do
36
- subject { 'foo' }
37
-
38
- it 'appends the given separator and string to self' do
39
- subject.concat 'bar', "\n"
40
- is_expected.to eq "foo\nbar"
41
- end
42
- end
43
- end
44
- end
45
- end
46
-
47
-
48
- describe Module do
49
-
50
- describe '#alias_class_method' do
51
-
52
- subject(:klass) do
53
- Class.new do
54
- def self.salute
55
- 'Meow!'
56
- end
57
- end
58
- end
59
-
60
- it 'defines new class method that calls the old class method' do
61
- klass.alias_class_method :say_hello!, :salute
62
-
63
- expect(klass).to respond_to :say_hello!
64
- expect(klass.say_hello!).to eq klass.salute
65
- end
66
- end
67
- end
@@ -1,19 +0,0 @@
1
- require 'fakefs/spec_helpers'
2
-
3
- module FakeFS
4
- # XXX remove after merging of https://github.com/defunkt/fakefs/pull/270
5
- module FileTest
6
-
7
- def readable?(file_name)
8
- File.readable?(file_name)
9
- end
10
- module_function :readable?
11
- end
12
-
13
- # XXX remove after merging of https://github.com/defunkt/fakefs/pull/269
14
- class Pathname
15
- def read(*args)
16
- File.read(@path, *args)
17
- end
18
- end
19
- end