barthes 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/barthes.gemspec +4 -0
- data/bin/barthes +3 -0
- data/lib/barthes/cli.rb +48 -0
- data/lib/barthes/converter.rb +79 -0
- data/lib/barthes/templates/context.erb +3 -0
- data/lib/barthes/templates/describe.erb +17 -0
- data/lib/barthes/templates/expectations/xpath_value.erb +6 -0
- data/lib/barthes/templates/it.erb +39 -0
- data/lib/barthes/version.rb +1 -1
- metadata +72 -10
- checksums.yaml +0 -7
data/barthes.gemspec
CHANGED
data/bin/barthes
ADDED
data/lib/barthes/cli.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'barthes/converter'
|
2
|
+
require 'json'
|
3
|
+
require 'thor'
|
4
|
+
require 'rspec'
|
5
|
+
|
6
|
+
module Barthes
|
7
|
+
class CLI < Thor
|
8
|
+
desc 'convert', 'convert json into rspec'
|
9
|
+
def convert(*paths)
|
10
|
+
files = expand_paths(paths, '.json')
|
11
|
+
files.each do |file|
|
12
|
+
json = JSON.parse File.read(file)
|
13
|
+
converter = Barthes::Converter.new(file, json)
|
14
|
+
spec = converter.convert(json)
|
15
|
+
File.write("#{file.gsub(/.json$/, '')}_spec.rb", spec)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
desc 'exec', 'execute tests from json files'
|
20
|
+
option :rspec, :type => :string, :aliases => :r
|
21
|
+
option :environment, :type => :string, :aliases => :e
|
22
|
+
def exec(*paths)
|
23
|
+
ENV['BARTHES_ENV_PATH'] = options[:environment] if options[:environment]
|
24
|
+
convert(*paths)
|
25
|
+
paths = expand_paths(paths, '.json').map {|path| "#{path.gsub(/.json$/, '')}_spec.rb" }
|
26
|
+
paths += options[:rspec].split(/\s/) if options[:rspec]
|
27
|
+
RSpec::Core::Runner.run(paths)
|
28
|
+
end
|
29
|
+
|
30
|
+
no_commands do
|
31
|
+
def expand_paths(paths, suffix)
|
32
|
+
files = []
|
33
|
+
if paths.empty?
|
34
|
+
files += Dir["./**/*#{suffix}"]
|
35
|
+
else
|
36
|
+
paths.each do |path|
|
37
|
+
if FileTest.directory?(path)
|
38
|
+
files += Dir["#{path}/**/*#{suffix}"]
|
39
|
+
elsif FileTest.file?(path)
|
40
|
+
files << path
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
files
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# TODO: json includesion
|
2
|
+
require 'erubis'
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
module Barthes
|
6
|
+
class Converter
|
7
|
+
module Helpers
|
8
|
+
def resolve_value(value)
|
9
|
+
value = value.gsub(/\@\{(.+?)\}/) { '#{' + "$store['#{$1}']" + '}' }
|
10
|
+
value = value.gsub(/\$\{(.+?)\}/) { '#{' + "@env['#{$1}']" + '}' }
|
11
|
+
"%Q{#{value}}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(name, json)
|
16
|
+
@name = name
|
17
|
+
@json = json
|
18
|
+
end
|
19
|
+
|
20
|
+
def template(name)
|
21
|
+
here = File.dirname(__FILE__)
|
22
|
+
File.read(here + "/templates/#{name.to_s}.erb")
|
23
|
+
end
|
24
|
+
|
25
|
+
def render(template_name, indent, opts={}, &block)
|
26
|
+
opts[:block] = block
|
27
|
+
code = Erubis::Eruby.new(template(template_name)).result(
|
28
|
+
OpenStruct.new(opts).instance_eval { extend Helpers; binding }
|
29
|
+
)
|
30
|
+
code = code.split(/\n/).join("\n" + ("\t" * indent)) if indent
|
31
|
+
code
|
32
|
+
end
|
33
|
+
|
34
|
+
def convert(json)
|
35
|
+
render(:describe, 0, :name => @name) do
|
36
|
+
walk_json(json)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def walk_json(arr)
|
41
|
+
return if arr.class != Array
|
42
|
+
rendered = []
|
43
|
+
case arr.first
|
44
|
+
when 'it'
|
45
|
+
arr.last['_sleep'] = arr.last['sleep']
|
46
|
+
arr.last['name'] = arr[1]
|
47
|
+
rendered << render(:it, 1, arr.last) do
|
48
|
+
walk_expectations(arr.last['expectations'], false).join(" && ")
|
49
|
+
end
|
50
|
+
when 'context'
|
51
|
+
rendered << render(:context, 1, :name => arr[1]) do
|
52
|
+
walk_json(arr.last)
|
53
|
+
end
|
54
|
+
else
|
55
|
+
arr.each do |elem|
|
56
|
+
rendered << walk_json(elem)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
rendered.join("\n\t")
|
60
|
+
end
|
61
|
+
|
62
|
+
# TODO: timeout
|
63
|
+
def walk_expectations(arr, in_or)
|
64
|
+
return if arr.nil?
|
65
|
+
rendered = []
|
66
|
+
arr.each do |elem|
|
67
|
+
if elem.class == Array
|
68
|
+
rendered << walk_expectations(elem, in_or).join(" && ")
|
69
|
+
elsif elem.keys.first == 'Or'
|
70
|
+
rendered << walk_expectations(elem.values, true).join(' || ')
|
71
|
+
elsif elem['type'] == 'Value' || elem['type'] == 'StringComarison'
|
72
|
+
rendered << render(:'expectations/xpath_value', 2, elem)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
rendered
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
describe '<%= name %>' do
|
5
|
+
before(:all) do
|
6
|
+
$store = {}
|
7
|
+
@env = JSON.parse File.read(ENV['BARTHES_ENV_PATH'])
|
8
|
+
client_klass = Object.get_const(@env['client_class'])
|
9
|
+
@client = client_klass.new(@env)
|
10
|
+
end
|
11
|
+
|
12
|
+
<%= block.call %>
|
13
|
+
|
14
|
+
after(:all) do
|
15
|
+
File.write('.store', JSON.pretty_generate($store))
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
it '<%= name %>' do
|
2
|
+
<% if respond_to?(:client) %>
|
3
|
+
client_klass = Object.const_get('<%= client['class'] %>')
|
4
|
+
client = client_klass.new(@env)
|
5
|
+
<% end %>
|
6
|
+
<% if respond_to?(:max_loop) && max_loop && respond_to?(:expectations) && expectations.size > 0 %>
|
7
|
+
<%= max_loop %>.times do
|
8
|
+
response = client.execute({
|
9
|
+
<%- params.each do |k, v| %>
|
10
|
+
<% next if v.nil? %>
|
11
|
+
'<%= k %>' => <%= resolve_value(v) %>,
|
12
|
+
<%- end %>
|
13
|
+
})
|
14
|
+
<% if respond_to?(:expectations) && expectations.size > 0 %>
|
15
|
+
break if (<%= block.call %>)
|
16
|
+
<% end %>
|
17
|
+
<% if _sleep %>
|
18
|
+
sleep <%= _sleep %> / 1000
|
19
|
+
<% end %>
|
20
|
+
end
|
21
|
+
<% end %>
|
22
|
+
response = client.execute({
|
23
|
+
<% params.each do |k, v| next if v.nil? # TODO %>
|
24
|
+
<% next if v.nil? %>
|
25
|
+
'<%= k %>' => <%= resolve_value(v) %>,
|
26
|
+
<% end %>
|
27
|
+
})
|
28
|
+
<% if respond_to?(:expectations) && expectations.size > 0 %>
|
29
|
+
expect(
|
30
|
+
<%= block.call %>
|
31
|
+
).to be_true
|
32
|
+
<% end %>
|
33
|
+
<% if _sleep %>
|
34
|
+
sleep <%= _sleep %> / 1000
|
35
|
+
<% end %>
|
36
|
+
<% if respond_to?(:store) %>
|
37
|
+
$store['<%= store['Key'] %>'] = doc.xpath('<%= store['Xpath'] %>').first.text
|
38
|
+
<% end %>
|
39
|
+
end
|
data/lib/barthes/version.rb
CHANGED
metadata
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: barthes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- tily
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2014-10-
|
12
|
+
date: 2014-10-26 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: bundler
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
19
|
- - ~>
|
18
20
|
- !ruby/object:Gem::Version
|
@@ -20,6 +22,7 @@ dependencies:
|
|
20
22
|
type: :development
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
27
|
- - ~>
|
25
28
|
- !ruby/object:Gem::Version
|
@@ -27,21 +30,72 @@ dependencies:
|
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: rake
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
|
-
- - '>='
|
35
|
+
- - ! '>='
|
32
36
|
- !ruby/object:Gem::Version
|
33
37
|
version: '0'
|
34
38
|
type: :development
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
|
-
- - '>='
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: thor
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: json
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: erubis
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
39
92
|
- !ruby/object:Gem::Version
|
40
93
|
version: '0'
|
41
94
|
description: lightweight scenario test framework
|
42
95
|
email:
|
43
96
|
- tily05@gmail.com
|
44
|
-
executables:
|
97
|
+
executables:
|
98
|
+
- barthes
|
45
99
|
extensions: []
|
46
100
|
extra_rdoc_files: []
|
47
101
|
files:
|
@@ -51,30 +105,38 @@ files:
|
|
51
105
|
- README.md
|
52
106
|
- Rakefile
|
53
107
|
- barthes.gemspec
|
108
|
+
- bin/barthes
|
54
109
|
- lib/barthes.rb
|
110
|
+
- lib/barthes/cli.rb
|
111
|
+
- lib/barthes/converter.rb
|
112
|
+
- lib/barthes/templates/context.erb
|
113
|
+
- lib/barthes/templates/describe.erb
|
114
|
+
- lib/barthes/templates/expectations/xpath_value.erb
|
115
|
+
- lib/barthes/templates/it.erb
|
55
116
|
- lib/barthes/version.rb
|
56
117
|
homepage: ''
|
57
118
|
licenses:
|
58
119
|
- MIT
|
59
|
-
metadata: {}
|
60
120
|
post_install_message:
|
61
121
|
rdoc_options: []
|
62
122
|
require_paths:
|
63
123
|
- lib
|
64
124
|
required_ruby_version: !ruby/object:Gem::Requirement
|
125
|
+
none: false
|
65
126
|
requirements:
|
66
|
-
- - '>='
|
127
|
+
- - ! '>='
|
67
128
|
- !ruby/object:Gem::Version
|
68
129
|
version: '0'
|
69
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
|
+
none: false
|
70
132
|
requirements:
|
71
|
-
- - '>='
|
133
|
+
- - ! '>='
|
72
134
|
- !ruby/object:Gem::Version
|
73
135
|
version: '0'
|
74
136
|
requirements: []
|
75
137
|
rubyforge_project:
|
76
|
-
rubygems_version:
|
138
|
+
rubygems_version: 1.8.24
|
77
139
|
signing_key:
|
78
|
-
specification_version:
|
140
|
+
specification_version: 3
|
79
141
|
summary: lightweight scenario test framework
|
80
142
|
test_files: []
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 7e0ff20ba1c46a3c3361e72d8bdf1fd254595d77
|
4
|
-
data.tar.gz: 7a78620794bb6aafbfb9e0feea9d5477ad8eda10
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: d65dcda9f746d181e25df64a3e85c273405ab98fa28e2a6dab7326009841fba4e4b55ffe45ccb497f54a88a12e1680a31c87b5ad0943107be164e38e6b165040
|
7
|
-
data.tar.gz: 7a18c83ed91e82a70173578480edea46a7b86a78df1f3dc5dd5cdbe2e6a049b3b3354c94ffca6632aa933f0c12c0b20460641cfbf49d9908509219d38b9876cb
|