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