lab42_literate 0.1.1 → 0.1.2
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/README.md +17 -2
- data/lib/lab42/literate/example_doctest.rb +2 -2
- data/lib/lab42/literate/extractor/block.rb +24 -0
- data/lib/lab42/literate/extractor.rb +25 -16
- data/lib/lab42/literate/group_doctest.rb +11 -5
- data/lib/lab42/literate/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 719c356f00f0141fa7a9c0bfec1b25792f067927
|
4
|
+
data.tar.gz: ab1de21e75855dcf24996a447d08479734a54901
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb38c90f79ff71b04b4d6252fe0f5ce7ba6d4bc9564ce279ee8ea2f198f107568d7e609eccf3952af8680a389c13b0654086cc0edd784d631af86c4db4fbd8f4
|
7
|
+
data.tar.gz: fadeeeee4eb23c14de66a2d1788a7d01aa2ffb620c7a6f65b3c5b82c01c9d5def3e517bb607bdfe3ea7be8e6ce5f643d0dfd12943f6e9c8fae498b58348813d3
|
data/README.md
CHANGED
@@ -25,9 +25,9 @@ Then in your `spec_helper`
|
|
25
25
|
|
26
26
|
which makes the `doctest` method available in all example groupes of type `literate`.
|
27
27
|
|
28
|
-
###
|
28
|
+
### Very Quick Start
|
29
29
|
|
30
|
-
You can write RSpec example code inside a ` ```ruby literate ` block.
|
30
|
+
You can write RSpec example code inside a ` ```ruby literate ` block.
|
31
31
|
|
32
32
|
```ruby literate
|
33
33
|
expect(%w{a b c}).not_to be_empty
|
@@ -45,3 +45,18 @@ with
|
|
45
45
|
RSpec.describe 'example', type: :literate do
|
46
46
|
doctest 'some_literate.md'
|
47
47
|
end
|
48
|
+
|
49
|
+
|
50
|
+
### How does it work?
|
51
|
+
|
52
|
+
Each block ` ```ruby literate` creates an example with title `"literate block in #{file}:#{start_lnb}..#{end_lnb}"`
|
53
|
+
and instance_evals the lines from the block in the example's context.
|
54
|
+
|
55
|
+
|
56
|
+
### Setup?
|
57
|
+
|
58
|
+
Not yet.
|
59
|
+
|
60
|
+
### Explicit Title of the generated example
|
61
|
+
|
62
|
+
Just add text after ` ```ruby literate`
|
@@ -4,8 +4,8 @@ module Lab42::Literate::ExampleDoctest
|
|
4
4
|
|
5
5
|
def doctest filename
|
6
6
|
doc_blocks = Ex.extract(File.readlines(filename))
|
7
|
-
doc_blocks.each do |
|
8
|
-
instance_eval(lines.join("\n"))
|
7
|
+
doc_blocks.each do |block|
|
8
|
+
instance_eval(block.lines.join("\n"))
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Lab42::Literate::Extractor::Block
|
2
|
+
attr_reader :lines, :start_lnb, :title
|
3
|
+
|
4
|
+
def add_line line
|
5
|
+
lines << line
|
6
|
+
end
|
7
|
+
|
8
|
+
def get_title alternative
|
9
|
+
title.empty? ? alternative : title
|
10
|
+
end
|
11
|
+
|
12
|
+
def range
|
13
|
+
start_lnb..(start_lnb.pred + lines.size)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def initialize start_lnb, title: ''
|
19
|
+
@lines = []
|
20
|
+
@start_lnb = start_lnb
|
21
|
+
@title = title
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -1,16 +1,20 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
1
3
|
module Lab42::Literate::Extractor extend self
|
4
|
+
require_relative 'extractor/block'
|
5
|
+
|
2
6
|
|
3
|
-
START_EXTRACTION = %r[\A \s* ``` ruby \s+ literate ]x
|
7
|
+
START_EXTRACTION = %r[\A \s* ``` ruby \s+ literate \s* (?<explicit_title> .*) ]x
|
4
8
|
STOP_EXTRACTION = %r[\A \s* ``` \s* \z]x
|
5
9
|
|
6
10
|
ALTERNATE_EQ_FORM = %r[\A (\s*) (.*) \s+ \#=> \s+ (.*) \z]x
|
7
11
|
|
8
12
|
def extract from_lines
|
9
|
-
|
13
|
+
initial = OpenStruct.new(state: :outside, blocks: [])
|
10
14
|
from_lines
|
11
15
|
.each_with_index
|
12
|
-
.inject(
|
13
|
-
.
|
16
|
+
.inject(initial){|acc, (line, lnb)| update(line, lnb, acc) }
|
17
|
+
.blocks
|
14
18
|
end
|
15
19
|
|
16
20
|
|
@@ -23,28 +27,33 @@ module Lab42::Literate::Extractor extend self
|
|
23
27
|
%W{#{$1}expect(#{$2}).to eq(#{$3.strip})}.join(' ') }
|
24
28
|
end
|
25
29
|
|
26
|
-
def update line, lnb,
|
27
|
-
if state == :outside
|
28
|
-
update_outside line, lnb,
|
30
|
+
def update line, lnb, acc
|
31
|
+
if acc.state == :outside
|
32
|
+
update_outside line, lnb, acc
|
29
33
|
else
|
30
|
-
update_inside line,
|
34
|
+
update_inside line, acc
|
31
35
|
end
|
32
36
|
end
|
33
37
|
|
34
|
-
def update_inside line,
|
38
|
+
def update_inside line, acc
|
35
39
|
if STOP_EXTRACTION === line.chomp
|
36
|
-
|
40
|
+
merge_acc( acc, state: :outside )
|
37
41
|
else
|
38
|
-
|
42
|
+
acc.blocks.last.add_line(convert(line))
|
43
|
+
acc
|
39
44
|
end
|
40
45
|
end
|
41
46
|
|
42
|
-
def update_outside line, lnb,
|
43
|
-
|
44
|
-
|
47
|
+
def update_outside line, lnb, acc
|
48
|
+
match = START_EXTRACTION.match line.chomp
|
49
|
+
if match
|
50
|
+
merge_acc( acc, state: :inside, blocks: acc.blocks << Block.new(lnb, title: match['explicit_title']) )
|
45
51
|
else
|
46
|
-
|
52
|
+
acc
|
47
53
|
end
|
48
54
|
end
|
49
|
-
|
55
|
+
|
56
|
+
def merge_acc acc, **params
|
57
|
+
OpenStruct.new(**(acc.to_h.merge params))
|
58
|
+
end
|
50
59
|
end
|
@@ -4,11 +4,17 @@ module Lab42::Literate::GroupDoctest
|
|
4
4
|
|
5
5
|
def doctest filename
|
6
6
|
doc_blocks = Ex.extract(File.readlines(filename))
|
7
|
-
doc_blocks.each
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
doc_blocks.each{ |block| make_context filename, block }
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def make_context filename, block
|
13
|
+
return if block.lines.empty?
|
14
|
+
title = block.get_title "literate block in #{filename}:#{block.range.inspect}"
|
15
|
+
context title do
|
16
|
+
it do
|
17
|
+
eval(block.lines.join("\n"))
|
12
18
|
end
|
13
19
|
end
|
14
20
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lab42_literate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Dober
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-12-
|
11
|
+
date: 2017-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -134,6 +134,7 @@ files:
|
|
134
134
|
- lib/lab42/literate.rb
|
135
135
|
- lib/lab42/literate/example_doctest.rb
|
136
136
|
- lib/lab42/literate/extractor.rb
|
137
|
+
- lib/lab42/literate/extractor/block.rb
|
137
138
|
- lib/lab42/literate/group_doctest.rb
|
138
139
|
- lib/lab42/literate/version.rb
|
139
140
|
homepage: https://github.com/RobertDober/lab42_literate
|