speculate_about 0.2.2 → 0.4.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
  SHA256:
3
- metadata.gz: 5abf0f1d0b408b81d4b2b9644eeaaca4137bcf0180f298bb94145b275a847ecd
4
- data.tar.gz: a040f692852c90de48d3d1a758ecda31ce8a3d1f36920ce44145d396f7666aca
3
+ metadata.gz: 1d08ccbaea3017274bdc86160387aeed915eba6aac5e5119cca48c2e8f4a53a3
4
+ data.tar.gz: dd53be1c870c773d263a59b03204b469c593e0244df48ea19aaac1be87a45b5d
5
5
  SHA512:
6
- metadata.gz: d6d2d63515ade99e8eaac787572359c3b707301263d4ebbee6ce3df03546426262202e092eef337239cf9a82e92096e8fa7318756b405f46900c0514fd1d1d4c
7
- data.tar.gz: 5ca6224cf00ab3ee4cd13d8ba2df5cfc83bcc7d516a018435f097ed509f94a27cc2ec9df054a2cc43b2215a3399a0b79c4279c00b01b9fd27181e0c0ac905597
6
+ metadata.gz: 222b7eff1615cae7c4e3af5fbaffae7812e9e1144de7884b5a3b7d798e7647f9ea259dddf632e5262977d6a07da1234f22457c84eb656c225ba7745b1a317f49
7
+ data.tar.gz: 70c8e9c20f41acc002bfdda9ae3fa6f63561538730989c63e25e0460a65785b21d5835c9f16efc4f41ccaf22a51b179a27bc77c42a7585afa0474d2e95a9dcb8
@@ -3,11 +3,11 @@ require 'rspec'
3
3
  require 'speculations/parser'
4
4
 
5
5
  module SpeculateAbout
6
- def speculate_about file
6
+ def speculate_about file, alternate_syntax: false
7
7
  paths = _find_files(file, File.dirname( caller.first ))
8
8
  raise ArgumentError, "no files found for pattern #{file}" if paths.empty?
9
9
  paths.each do |path|
10
- code = _compile path, file
10
+ code = _compile path, _readable(path), alternate_syntax: alternate_syntax
11
11
  ENV["SPECULATE_ABOUT_DEBUG"] ? _show(code, path) : instance_eval(code, path)
12
12
  end
13
13
  end
@@ -15,14 +15,13 @@ module SpeculateAbout
15
15
 
16
16
  private
17
17
 
18
- def _compile path, file
19
- ast = Speculations::Parser.new.parse_from_file(path, file)
18
+ def _compile path, file, alternate_syntax: false
19
+ ast = Speculations::Parser.new.parse_from_file(path, file, alternate_syntax: alternate_syntax)
20
20
  ast.to_code
21
21
  end
22
- def _show(code, path)
23
- message = "Generated code for #{path}"
24
- _underline(message)
25
- puts code
22
+ def _readable(path)
23
+ d = File.dirname(path)
24
+ File.join(File.basename(d), File.basename(path))
26
25
  end
27
26
  def _find_files file, local_path
28
27
  [Dir.pwd, local_path]
@@ -30,6 +29,11 @@ module SpeculateAbout
30
29
  Dir.glob(File.join(dir, file))
31
30
  end
32
31
  end
32
+ def _show(code, path)
33
+ message = "Generated code for #{path}"
34
+ _underline(message)
35
+ puts code
36
+ end
33
37
  def _underline(message, ul: "=")
34
38
  puts message
35
39
  puts message.gsub(/./, ul)
@@ -3,7 +3,7 @@ class Speculations::Parser
3
3
  require_relative './parser/context'
4
4
  require_relative './parser/state'
5
5
 
6
- attr_reader :filename, :input, :orig_filename, :root, :state
6
+ attr_reader :alternate_syntax, :filename, :input, :orig_filename, :root, :state
7
7
 
8
8
  def self.parsers
9
9
  @__parsers__ ||= {
@@ -14,7 +14,8 @@ class Speculations::Parser
14
14
  }
15
15
  end
16
16
 
17
- def parse_from_file file, orig_filename = nil
17
+ def parse_from_file file, orig_filename = nil, alternate_syntax: false
18
+ @alternate_syntax = alternate_syntax
18
19
  @filename = file
19
20
  @orig_filename = orig_filename || file
20
21
  @input = File
@@ -31,7 +32,7 @@ class Speculations::Parser
31
32
  end
32
33
 
33
34
  def parse!
34
- root = node = Context.new(name: "Speculations from #{@filename}", lnb: 0, filename: @filename, orig_filename: orig_filename, parent: nil)
35
+ root = node = Context.new(alternate_syntax: alternate_syntax, name: "Speculations from #{@filename}", lnb: 0, filename: @filename, orig_filename: orig_filename, parent: nil)
35
36
  input.each_with_index do |line, lnb|
36
37
  @state, node = self.class.parsers.fetch(@state).parse(line, lnb.succ, node)
37
38
  end
@@ -3,22 +3,23 @@ class Speculations::Parser::Context
3
3
  require_relative './context/example'
4
4
  require_relative './context/setup'
5
5
 
6
- attr_reader :filename, :level, :lnb, :name, :orig_filename, :parent, :potential_name, :setup
6
+ attr_reader :alternate_syntax, :filename, :level, :lnb, :name, :orig_filename, :parent, :potential_name, :setup
7
7
 
8
8
  def add_child(name:, lnb:)
9
9
  raise "Illegal nesting" if parent
10
- children << self.class.new(name: name, lnb: lnb, parent: self)
10
+ children << self.class.new(alternate_syntax: alternate_syntax, name: name, lnb: lnb, parent: self)
11
11
  children.last
12
12
  end
13
13
 
14
14
  def add_example(lnb:, line:)
15
15
  examples << Example.new(lnb: lnb, parent: self, line: line, name: potential_name)
16
- @potential_name = nil
16
+ reset_context
17
17
  examples.last
18
18
  end
19
19
 
20
20
  def add_include(lnb:)
21
21
  includes << Include.new(lnb: lnb, parent: self)
22
+ @given = false
22
23
  includes.last
23
24
  end
24
25
 
@@ -30,6 +31,10 @@ class Speculations::Parser::Context
30
31
  @__examples__ ||= []
31
32
  end
32
33
 
34
+ def given?
35
+ @given
36
+ end
37
+
33
38
  def includes
34
39
  @__includes__ ||= []
35
40
  end
@@ -39,8 +44,20 @@ class Speculations::Parser::Context
39
44
  lines.flatten.map{ |line| "#{prefix}#{line.strip}" }.join("\n")
40
45
  end
41
46
 
47
+ def reset_context
48
+ @potential_name = nil
49
+ @given = false
50
+ self
51
+ end
52
+
53
+ def set_given given
54
+ @given = given
55
+ self
56
+ end
57
+
42
58
  def set_name(potential_name)
43
59
  @potential_name = potential_name
60
+ self
44
61
  end
45
62
 
46
63
  def set_setup(lnb:)
@@ -60,8 +77,10 @@ class Speculations::Parser::Context
60
77
 
61
78
  private
62
79
 
63
- def initialize(lnb:, name:, filename: nil, orig_filename: nil, parent: nil)
80
+ def initialize(alternate_syntax: false, lnb:, name:, filename: nil, orig_filename: nil, parent: nil)
64
81
  _init_from_parent filename, orig_filename, parent
82
+ @alternate_syntax = alternate_syntax
83
+ @given = false
65
84
  @level = parent ? parent.level.succ : 1
66
85
  @lnb = lnb
67
86
  @setup = nil
@@ -8,8 +8,12 @@ module Speculations::Parser::State extend self
8
8
  CONTEXT_RGX = %r[\A\s{0,3}\#{1,7}\s+Context\s+(.*)]
9
9
  EOBLOCK_RGX = %r[\A\s{0,3}```\s*\z]
10
10
  EXAMPLE_RGX = %r[\A\s{0,3}```.*\s:example]
11
+ GIVEN_RGX = %r[\A\s{0,3}(?:Given|When)\b]
11
12
  INCLUDE_RGX = %r[\A\s{0,3}```.*\s:include]
12
- NAME_RGX = %r[\A\s{0,3}Example:\s+(.*)]
13
+ NAME_RGX = %r[\A\s{0,3}Example:?\s+(.*)]i
14
+ RUBY_RGX = %r[\A\s{0,3}```ruby]
15
+ THEN_RGX = %r[\A\s{0,3}(?:Then|But|And)\s+(.*)]
16
+ WS_RGX = %r[\A\s*\z]
13
17
 
14
18
  def before_match line
15
19
  BEFORE_RGX =~ line
@@ -28,6 +32,10 @@ module Speculations::Parser::State extend self
28
32
  def example_match line
29
33
  EXAMPLE_RGX =~ line
30
34
  end
35
+
36
+ def given_match line
37
+ GIVEN_RGX =~ line
38
+ end
31
39
 
32
40
  def include_match line
33
41
  INCLUDE_RGX =~ line
@@ -36,4 +44,16 @@ module Speculations::Parser::State extend self
36
44
  def potential_name line
37
45
  NAME_RGX.match(line)
38
46
  end
47
+
48
+ def ruby_match line
49
+ RUBY_RGX =~ line
50
+ end
51
+
52
+ def then_match line
53
+ THEN_RGX.match(line)
54
+ end
55
+
56
+ def ws_match line
57
+ WS_RGX =~ line
58
+ end
39
59
  end
@@ -4,6 +4,50 @@ module Speculations
4
4
  module Out extend self
5
5
 
6
6
  def parse line, lnb, node
7
+ if node.alternate_syntax
8
+ _parse_alternate line, lnb, node
9
+ else
10
+ _parse_classical line, lnb, node
11
+ end
12
+ end
13
+
14
+ private
15
+
16
+ def _parse_alternate line, lnb, node
17
+ case
18
+ when name = State.context_match(line)
19
+ node = node.parent if node.parent
20
+ new_node = node.add_child(name: name, lnb: lnb)
21
+ [:out, new_node.reset_context]
22
+ when State.ws_match(line)
23
+ [:out, node]
24
+ when name = State.potential_name(line)
25
+ node.set_name(name[1])
26
+ node.set_given(false)
27
+ [:out, node]
28
+ when name = State.then_match(line)
29
+ node.set_name(name[1])
30
+ node.set_given(false)
31
+ [:out, node]
32
+ when State.given_match(line)
33
+ node.set_name(nil)
34
+ [:out, node.set_given(true)]
35
+ when State.ruby_match(line)
36
+ if node.potential_name
37
+ node = node.add_example(lnb: lnb, line: line)
38
+ [:exa, node]
39
+ elsif node.given?
40
+ node = node.add_include(lnb: lnb)
41
+ [:inc, node]
42
+ else
43
+ [:out, node]
44
+ end
45
+ else
46
+ [:out, node.reset_context]
47
+ end
48
+ end
49
+
50
+ def _parse_classical line, lnb, node
7
51
  case
8
52
  when name = State.context_match(line)
9
53
  node = node.parent if node.parent
@@ -1,3 +1,3 @@
1
1
  module SpeculateAbout
2
- VERSION = "0.2.2"
2
+ VERSION = "0.4.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: speculate_about
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.4.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: 2020-11-11 00:00:00.000000000 Z
11
+ date: 2020-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -63,7 +63,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
63
  - !ruby/object:Gem::Version
64
64
  version: '0'
65
65
  requirements: []
66
- rubygems_version: 3.2.0.rc.1
66
+ rubygems_version: 3.1.4
67
67
  signing_key:
68
68
  specification_version: 4
69
69
  summary: Extract RSpecs from Markdown