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 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