speculate_about 0.5.1 → 1.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 +4 -4
- data/lib/speculations/parser/context.rb +6 -15
- data/lib/speculations/parser/state/candidate.rb +3 -3
- data/lib/speculations/parser/state/in.rb +2 -2
- data/lib/speculations/parser/state/includes.rb +31 -0
- data/lib/speculations/parser/state/triggers.rb +2 -2
- data/lib/speculations/parser/state.rb +1 -0
- data/lib/speculations/parser.rb +3 -1
- data/lib/speculations/version.rb +1 -1
- data/lib/speculations.rb +16 -1
- metadata +6 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 691aa57b9ad1035ca6eb20fe75f89b818414dcd33e05acd9d6621e13ee1cfb23
|
4
|
+
data.tar.gz: 286766d1c5243bc9c1c6eb205c6e38ee97b3d06c90f4d77b6d84638a56d465e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cea1cc7dc006a7315fac53026959d444ae5a9bdcad161a94f57df7fdf3bead8cf5ee23aac5b9eaecdd68bc888cbf0df9e290acc4e09435f2b5bd771113ce38c3
|
7
|
+
data.tar.gz: 6dcd950c3ea0bace47c8ecf3e42dd38ff41d747ac92918c30c08e2403e0c6c2471dcf69c1f3eddc04049988c40d555b07f470ee6a3e873cf8c36aa1223828690
|
@@ -4,15 +4,6 @@ module Speculations
|
|
4
4
|
require_relative './context/include'
|
5
5
|
require_relative './context/example'
|
6
6
|
|
7
|
-
DISCLAIMER = <<-EOD
|
8
|
-
# DO NOT EDIT!!!
|
9
|
-
# This file was generated from FILENAME with the speculate_about gem, if you modify this file
|
10
|
-
# one of two bad things will happen
|
11
|
-
# - your documentation specs are not correct
|
12
|
-
# - your modifications will be overwritten by the speculate rake task
|
13
|
-
# YOU HAVE BEEN WARNED
|
14
|
-
EOD
|
15
|
-
|
16
7
|
attr_reader :filename, :level, :lnb, :title, :parent, :root, :tree_level
|
17
8
|
|
18
9
|
def new_context(title:, lnb:, level: )
|
@@ -94,14 +85,10 @@ module Speculations
|
|
94
85
|
if parent
|
95
86
|
map_lines(%{# #{filename}:#{lnb}}, %{context "#{title}" do}, indent: -1)
|
96
87
|
else
|
97
|
-
|
88
|
+
[]
|
98
89
|
end
|
99
90
|
end
|
100
91
|
|
101
|
-
def _root_header
|
102
|
-
map_lines(DISCLAIMER.gsub("FILENAME", filename.inspect).split("\n"), %{RSpec.describe #{filename.inspect} do}, indent: -1)
|
103
|
-
end
|
104
|
-
|
105
92
|
def _init_from_parent
|
106
93
|
@root = parent.root
|
107
94
|
@filename = parent.filename
|
@@ -109,7 +96,11 @@ module Speculations
|
|
109
96
|
end
|
110
97
|
|
111
98
|
def _footer
|
112
|
-
|
99
|
+
if parent
|
100
|
+
map_lines("end", indent: -1)
|
101
|
+
else
|
102
|
+
[]
|
103
|
+
end
|
113
104
|
end
|
114
105
|
|
115
106
|
def _realign_levels new_parent
|
@@ -11,17 +11,17 @@ module Speculations
|
|
11
11
|
new_parent = node.parent_of_level(level.pred)
|
12
12
|
node = new_parent.new_context(title: match[2], lnb: lnb, level: level)
|
13
13
|
[:out, node]
|
14
|
-
when match = State.maybe_example(line)
|
15
|
-
[:candidate, node, match[:title]]
|
16
14
|
when match = State.maybe_include(line)
|
17
15
|
[:candidate, node, :inc]
|
16
|
+
when match = State.maybe_example(line)
|
17
|
+
[:candidate, node, match[:title]]
|
18
18
|
when match = State.ruby_code_block(line)
|
19
19
|
if ctxt == :inc
|
20
20
|
node = node.new_include(lnb: lnb)
|
21
21
|
else
|
22
22
|
node = node.new_example(title: ctxt, lnb: lnb)
|
23
23
|
end
|
24
|
-
[:in, node]
|
24
|
+
[:in, node, (ctxt == :inc ? :includes : :out)]
|
25
25
|
else
|
26
26
|
[:out, node]
|
27
27
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Speculations
|
2
|
+
class Parser
|
3
|
+
module State
|
4
|
+
module Includes extend self
|
5
|
+
|
6
|
+
def parse line, lnb, node, _ctxt
|
7
|
+
case
|
8
|
+
when match = State.context_match(line)
|
9
|
+
make_new_context(lnb: lnb, node: node, match: match)
|
10
|
+
when match = State.maybe_include(line)
|
11
|
+
[:candidate, node, :inc]
|
12
|
+
when match = State.maybe_example(line)
|
13
|
+
[:candidate, node, match[:title]]
|
14
|
+
else
|
15
|
+
[:includes, node]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def make_new_context(lnb:, match:, node:)
|
22
|
+
level = match[:level].size
|
23
|
+
new_parent = node.parent_of_level(level.pred)
|
24
|
+
node = new_parent.new_context(title: match[:title], lnb: lnb, level: level)
|
25
|
+
[:out, node]
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -3,10 +3,10 @@ module Speculations::Parser::State::Triggers
|
|
3
3
|
BLANK_RGX = %r{\A\s*\z}
|
4
4
|
CONTEXT_RGX = %r[\A\s{0,3}(?<level>\#{1,7})\s+Context:?\s+(?<title>.*)]
|
5
5
|
EOBLOCK_RGX = %r[\A\s{0,3}```\s*\z]
|
6
|
-
GIVEN_RGX = %r[\A\s{0,3}(?:Given|When)\b]
|
6
|
+
GIVEN_RGX = %r[\A\s{0,3}(?:Given|When|And)\b]
|
7
7
|
EXAMPLE_RGX = %r[\A\s{0,3}Example:?\s+(<?title>.*)]
|
8
8
|
RUBY_RGX = %r[\A\s{0,3}```ruby]
|
9
|
-
THEN_RGX = %r[\A\s{0,3}(?:Then|But|And|Also)\b\s*(?<title>.*)]
|
9
|
+
THEN_RGX = %r[\A\s{0,3}(?:Then|But|And|Also|Or)\b\s*(?<title>.*)]
|
10
10
|
|
11
11
|
def blank_line line
|
12
12
|
BLANK_RGX.match(line)
|
data/lib/speculations/parser.rb
CHANGED
@@ -8,6 +8,7 @@ module Speculations
|
|
8
8
|
@__parsers__ ||= {
|
9
9
|
candidate: State::Candidate,
|
10
10
|
in: State::In,
|
11
|
+
includes: State::Includes,
|
11
12
|
out: State::Out
|
12
13
|
}
|
13
14
|
end
|
@@ -31,7 +32,8 @@ module Speculations
|
|
31
32
|
root = node = Context.new(filename: @filename)
|
32
33
|
ctxt = nil
|
33
34
|
@input.each_with_index do |line, lnb|
|
34
|
-
|
35
|
+
parser = self.class.parsers.fetch(@state)
|
36
|
+
@state, node, ctxt = parser.parse(line, lnb.succ, node, ctxt)
|
35
37
|
end
|
36
38
|
root
|
37
39
|
end
|
data/lib/speculations/version.rb
CHANGED
data/lib/speculations.rb
CHANGED
@@ -2,18 +2,33 @@ require 'fileutils'
|
|
2
2
|
require_relative 'speculations/parser'
|
3
3
|
module Speculations extend self
|
4
4
|
|
5
|
+
DISCLAIMER = <<-EOD
|
6
|
+
# DO NOT EDIT!!!
|
7
|
+
# This file was generated from FILENAME with the speculate_about gem, if you modify this file
|
8
|
+
# one of two bad things will happen
|
9
|
+
# - your documentation specs are not correct
|
10
|
+
# - your modifications will be overwritten by the speculate rake task
|
11
|
+
# YOU HAVE BEEN WARNED
|
12
|
+
EOD
|
13
|
+
|
5
14
|
def compile(infile, outfile=nil)
|
6
15
|
raise ArgumentError, "#{infile} not found" unless File.readable? infile
|
7
16
|
outfile ||= _speculation_path(infile)
|
8
17
|
if _out_of_date?(outfile, infile)
|
9
18
|
ast = Speculations::Parser.new.parse_from_file(infile)
|
10
|
-
|
19
|
+
code = _decorated_ast_code ast, infile
|
20
|
+
File.write(outfile, code.join("\n"))
|
11
21
|
end
|
12
22
|
outfile
|
13
23
|
end
|
14
24
|
|
15
25
|
private
|
16
26
|
|
27
|
+
def _decorated_ast_code ast, filename
|
28
|
+
[DISCLAIMER.gsub("FILENAME", filename.inspect).split("\n"), %{RSpec.describe #{filename.inspect} do}] +
|
29
|
+
ast.to_code + ["end"]
|
30
|
+
end
|
31
|
+
|
17
32
|
def _out_of_date?(outf, inf)
|
18
33
|
return true unless File.exists? outf
|
19
34
|
return File.lstat(outf).mtime <= File.lstat(inf).mtime
|
metadata
CHANGED
@@ -1,43 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: speculate_about
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Dober
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: rake
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '13.0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '13.0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rspec
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '3.10'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '3.10'
|
11
|
+
date: 2022-01-30 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
41
13
|
description: Allows Markdown or other text files to be used as literal specs, à la
|
42
14
|
Elixr doctest, but from any file.
|
43
15
|
email: robert.dober@gmail.com
|
@@ -57,6 +29,7 @@ files:
|
|
57
29
|
- lib/speculations/parser/state.rb
|
58
30
|
- lib/speculations/parser/state/candidate.rb
|
59
31
|
- lib/speculations/parser/state/in.rb
|
32
|
+
- lib/speculations/parser/state/includes.rb
|
60
33
|
- lib/speculations/parser/state/out.rb
|
61
34
|
- lib/speculations/parser/state/triggers.rb
|
62
35
|
- lib/speculations/version.rb
|
@@ -72,14 +45,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
72
45
|
requirements:
|
73
46
|
- - ">="
|
74
47
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
48
|
+
version: 3.1.0
|
76
49
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
50
|
requirements:
|
78
51
|
- - ">="
|
79
52
|
- !ruby/object:Gem::Version
|
80
53
|
version: '0'
|
81
54
|
requirements: []
|
82
|
-
rubygems_version: 3.
|
55
|
+
rubygems_version: 3.3.3
|
83
56
|
signing_key:
|
84
57
|
specification_version: 4
|
85
58
|
summary: Extract RSpecs from Markdown
|