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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9af148dabdc4777ca8d0e99ddb16853ceafd4ca5
4
- data.tar.gz: e431c6f0d2aa762843140ae80f73fd09ceb3d39b
3
+ metadata.gz: 719c356f00f0141fa7a9c0bfec1b25792f067927
4
+ data.tar.gz: ab1de21e75855dcf24996a447d08479734a54901
5
5
  SHA512:
6
- metadata.gz: 25db3aefd339b3016e646894321c29503633a77db4924581fbcc4d8f2946df5d4d23640a040b372e086b7deeeb1d2c34a9f8885d06027d11b336ded6d0d7ab6e
7
- data.tar.gz: 2d390a643c3a1ce311f456ed0e0d41449db276ee2973368d5dcfae2555ce8fa8a08b5cbf5d6eaa8aa97859dccbd46bd7be09e89d6d6f843dc3e6dde414338069
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
- ### Example
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 |_, lines|
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
- hash = Hash.new{|h, k| h[k] =[]}
13
+ initial = OpenStruct.new(state: :outside, blocks: [])
10
14
  from_lines
11
15
  .each_with_index
12
- .inject([:outside, 0, hash]){|state, (line, lnb)| update(line, lnb, *state) }
13
- .last
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, state, last_lnb, blocks
27
- if state == :outside
28
- update_outside line, lnb, blocks
30
+ def update line, lnb, acc
31
+ if acc.state == :outside
32
+ update_outside line, lnb, acc
29
33
  else
30
- update_inside line, last_lnb, blocks
34
+ update_inside line, acc
31
35
  end
32
36
  end
33
37
 
34
- def update_inside line, last_lnb, blocks
38
+ def update_inside line, acc
35
39
  if STOP_EXTRACTION === line.chomp
36
- [:outside, nil, blocks]
40
+ merge_acc( acc, state: :outside )
37
41
  else
38
- [:inside, last_lnb, blocks.merge(last_lnb => blocks[last_lnb] << convert(line))]
42
+ acc.blocks.last.add_line(convert(line))
43
+ acc
39
44
  end
40
45
  end
41
46
 
42
- def update_outside line, lnb, blocks
43
- if START_EXTRACTION === line.chomp
44
- [:inside, lnb, blocks]
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
- [:outside, nil, blocks]
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 do |lnb, lines|
8
- context "literate block in #{filename}:#{lnb}..#{lnb+lines.size-1}" do
9
- it do
10
- eval(lines.join("\n"))
11
- end
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
@@ -1,5 +1,5 @@
1
1
  module Lab42
2
2
  module Literate
3
- VERSION = '0.1.1'
3
+ VERSION = '0.1.2'
4
4
  end
5
5
  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.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-18 00:00:00.000000000 Z
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