clairvoyant 0.0.0 → 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +54 -10
- data/lib/clairvoyant.rb +45 -1
- data/lib/clairvoyant/builder.rb +61 -0
- data/lib/clairvoyant/indentable.rb +12 -0
- data/lib/clairvoyant/method.rb +21 -0
- data/lib/clairvoyant/version.rb +1 -1
- data/spec/fixtures/basic_rspec.rb +9 -0
- metadata +16 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a318ff0f912c23bd9f489aedaf96fccdd3340f4
|
4
|
+
data.tar.gz: a87c1748b49afee8c2a829bed91590211198336d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7790fd8f1fe37b8dce32f487eedced7736d322993025777461c1d815434e81bc8abf4a256e99ac27bfa9af162971440d1bdc99e0a4c70783eb9d47487d213a7e
|
7
|
+
data.tar.gz: b5050a033bf01a1ce43b1f18a03547adcdd79cc63d4a8949b541dc72db35c4ebfd9d1efa177b2c625761b74095bf28dba29090cba236f33c83d08e0da20c66ed
|
data/README.md
CHANGED
@@ -1,28 +1,72 @@
|
|
1
1
|
# Clairvoyant
|
2
2
|
|
3
|
-
|
3
|
+
## SUPER ALPHA
|
4
4
|
|
5
|
-
|
5
|
+
This is not meant to be used for anything serious at this point. It will at least give you a skeleton for your
|
6
|
+
code but not much beyond that at this point. You've been warned.
|
6
7
|
|
7
|
-
|
8
|
+
## What is it? (Theoretical)
|
8
9
|
|
9
|
-
|
10
|
+
Divine what code should be written to make a suite of tests pass.
|
10
11
|
|
11
|
-
|
12
|
+
Test code is extremely close to actual code, and a lot of inferences can be made about the nature of the code that would be generated in order to fulfil the tests.
|
12
13
|
|
13
|
-
|
14
|
+
By parsing RSPEC with a secondary DSL, we can formulate an Abstract Syntax Tree from the tests that can be reasonably mapped to working Ruby code.
|
14
15
|
|
15
|
-
|
16
|
+
## Abstract
|
16
17
|
|
17
|
-
|
18
|
+
```
|
19
|
+
describe Person do
|
20
|
+
let(:person) { Person.new('brandon', 23) }
|
21
|
+
|
22
|
+
describe '#name' do
|
23
|
+
expect(person.name).to eq('brandon')
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#age' do
|
27
|
+
expect(person.age).to eq(23)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
```
|
31
|
+
|
32
|
+
...would map to the AST:
|
33
|
+
```ruby
|
34
|
+
{
|
35
|
+
person: {
|
36
|
+
name: string,
|
37
|
+
age: integer
|
38
|
+
}
|
39
|
+
}
|
40
|
+
```
|
41
|
+
|
42
|
+
...and can be converted to:
|
43
|
+
```ruby
|
44
|
+
class Person
|
45
|
+
attr_accessor :name, :age
|
46
|
+
|
47
|
+
def initialize(name, age)
|
48
|
+
@name = name
|
49
|
+
@age = age
|
50
|
+
end
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
This is merely an abstract and requires a lot of work though.
|
18
55
|
|
19
56
|
## Usage
|
20
57
|
|
21
|
-
|
58
|
+
Currently it will only work with very basic RSPEC files. This will be tested against later.
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
builder = Clairvoyant.grok('path/to/rspec/file.rb')
|
62
|
+
|
63
|
+
# And there's your class!
|
64
|
+
puts builder
|
65
|
+
```
|
22
66
|
|
23
67
|
## Contributing
|
24
68
|
|
25
|
-
1. Fork it ( http://github.com
|
69
|
+
1. Fork it ( http://github.com/baweaver/clairvoyant/fork )
|
26
70
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
71
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
72
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/lib/clairvoyant.rb
CHANGED
@@ -1,5 +1,49 @@
|
|
1
1
|
require "clairvoyant/version"
|
2
2
|
|
3
|
+
require 'clairvoyant/indentable'
|
4
|
+
|
5
|
+
require 'clairvoyant/builder'
|
6
|
+
require 'clairvoyant/method'
|
7
|
+
|
3
8
|
module Clairvoyant
|
4
|
-
|
9
|
+
class << self
|
10
|
+
# RSPEC describe parser
|
11
|
+
#
|
12
|
+
# @param description [String] - What we're describing
|
13
|
+
#
|
14
|
+
# @return [type] [description]
|
15
|
+
def describe(description, &block)
|
16
|
+
@builder.klass_name ||= description if description.is_a?(Symbol)
|
17
|
+
@builder.add_method(description) if description[0] == '#'
|
18
|
+
block.call rescue nil
|
19
|
+
end
|
20
|
+
|
21
|
+
# Catch missing constants so we don't hav obscure rescues throughout the
|
22
|
+
# code
|
23
|
+
#
|
24
|
+
# @param name [Symbol] - Name of the undefined constant that was caught
|
25
|
+
#
|
26
|
+
# @return [Symbol]
|
27
|
+
def const_missing(name)
|
28
|
+
name
|
29
|
+
end
|
30
|
+
|
31
|
+
# Parses a file into a builder
|
32
|
+
#
|
33
|
+
# @param file_name [String] - Path to the file
|
34
|
+
#
|
35
|
+
# @return [Clairvoyant::Builder]
|
36
|
+
def grok(file_name)
|
37
|
+
cleaned_lines =
|
38
|
+
File
|
39
|
+
.open(file_name, 'r')
|
40
|
+
.drop_while { |line| !line.include?('describe') }.join("\n")
|
41
|
+
|
42
|
+
@builder = Clairvoyant::Builder.new
|
43
|
+
|
44
|
+
self.class_eval cleaned_lines
|
45
|
+
|
46
|
+
@builder
|
47
|
+
end
|
48
|
+
end
|
5
49
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Clairvoyant
|
2
|
+
# Used to build up Clairvoyant generated classes
|
3
|
+
#
|
4
|
+
# @author [lemur]
|
5
|
+
class Builder
|
6
|
+
include Indentable
|
7
|
+
|
8
|
+
attr_accessor :klass_name
|
9
|
+
|
10
|
+
def initialize(klass_name: nil, indent_size: 2)
|
11
|
+
@klass_name = klass_name
|
12
|
+
@indent_size = indent_size
|
13
|
+
@klass_methods = []
|
14
|
+
end
|
15
|
+
|
16
|
+
# Used to format the klass.
|
17
|
+
#
|
18
|
+
# @note I don't like the way this is written, clean later
|
19
|
+
#
|
20
|
+
# @return [Proc]
|
21
|
+
def klass
|
22
|
+
-> method_string {
|
23
|
+
"class #{@klass_name}\n" << method_string.rstrip << "\nend"
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
# Adds a method to the builder
|
28
|
+
#
|
29
|
+
# @param name [String] - Name of the method
|
30
|
+
#
|
31
|
+
# @return [Array[Clairvoyant::Method]] - Current methods
|
32
|
+
def add_method(name)
|
33
|
+
@klass_methods << Method.new(name: name[1..-1])
|
34
|
+
end
|
35
|
+
|
36
|
+
# Composes a Ruby Class from the builder
|
37
|
+
#
|
38
|
+
# @return [String] - Saveable and Runnable Ruby Class
|
39
|
+
def compose_klass
|
40
|
+
klass.call @klass_methods.reduce('') { |method_string, method|
|
41
|
+
method_string << "#{method}\n\n"
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
# Alias for compose_klass
|
46
|
+
#
|
47
|
+
# @return [String]
|
48
|
+
def to_s
|
49
|
+
compose_klass
|
50
|
+
end
|
51
|
+
|
52
|
+
# Saves the generated class as a file
|
53
|
+
#
|
54
|
+
# @param path [String] - Where to save
|
55
|
+
#
|
56
|
+
# @return [Unit]
|
57
|
+
def save_as(path)
|
58
|
+
File.open(path, 'w') { |file| file << compose_klass }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Clairvoyant
|
2
|
+
class Method
|
3
|
+
include Indentable
|
4
|
+
|
5
|
+
attr_reader :name
|
6
|
+
|
7
|
+
def initialize(name:, indentation: 2)
|
8
|
+
@name = name
|
9
|
+
@indentation = indentation
|
10
|
+
end
|
11
|
+
|
12
|
+
# Formats a method as a ruby method
|
13
|
+
#
|
14
|
+
# @return [String]
|
15
|
+
def to_s
|
16
|
+
"#{indent(1)}def #{name}\n" <<
|
17
|
+
"#{indent(2)}# Code here later\n" <<
|
18
|
+
"#{indent(1)}end"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/clairvoyant/version.rb
CHANGED
metadata
CHANGED
@@ -1,41 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: clairvoyant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Weaver
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-07-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.5'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.5'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
description: Attempts to divine what code will make tests pass
|
@@ -45,14 +45,18 @@ executables: []
|
|
45
45
|
extensions: []
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
|
-
- .gitignore
|
48
|
+
- ".gitignore"
|
49
49
|
- Gemfile
|
50
50
|
- LICENSE.txt
|
51
51
|
- README.md
|
52
52
|
- Rakefile
|
53
53
|
- clairvoyant.gemspec
|
54
54
|
- lib/clairvoyant.rb
|
55
|
+
- lib/clairvoyant/builder.rb
|
56
|
+
- lib/clairvoyant/indentable.rb
|
57
|
+
- lib/clairvoyant/method.rb
|
55
58
|
- lib/clairvoyant/version.rb
|
59
|
+
- spec/fixtures/basic_rspec.rb
|
56
60
|
homepage: https://www.github.com/baweaver/clairvoyant
|
57
61
|
licenses:
|
58
62
|
- MIT
|
@@ -63,19 +67,19 @@ require_paths:
|
|
63
67
|
- lib
|
64
68
|
required_ruby_version: !ruby/object:Gem::Requirement
|
65
69
|
requirements:
|
66
|
-
- -
|
70
|
+
- - ">="
|
67
71
|
- !ruby/object:Gem::Version
|
68
72
|
version: '0'
|
69
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
74
|
requirements:
|
71
|
-
- -
|
75
|
+
- - ">="
|
72
76
|
- !ruby/object:Gem::Version
|
73
77
|
version: '0'
|
74
78
|
requirements: []
|
75
79
|
rubyforge_project:
|
76
|
-
rubygems_version: 2.
|
80
|
+
rubygems_version: 2.4.5
|
77
81
|
signing_key:
|
78
82
|
specification_version: 4
|
79
83
|
summary: Predict code to be written from RSPEC
|
80
|
-
test_files:
|
81
|
-
|
84
|
+
test_files:
|
85
|
+
- spec/fixtures/basic_rspec.rb
|