greenpepper-ruby 0.0.1
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.
- data/bin/greenpepperize +71 -0
- data/bin/greenpepperrails +33 -0
- data/bin/greenpepperruby +15 -0
- data/data/greenpepper.rake +37 -0
- data/data/helper.rb +32 -0
- data/data/tags +6 -0
- data/lib/greenpepper/argumentparser.rb +161 -0
- data/lib/greenpepper/common/loadpath.rb +7 -0
- data/lib/greenpepper/context/htmlcontext.rb +26 -0
- data/lib/greenpepper/converter.rb +347 -0
- data/lib/greenpepper/core.rb +152 -0
- data/lib/greenpepper/example/collectionexample.rb +305 -0
- data/lib/greenpepper/example/dowithexample.rb +192 -0
- data/lib/greenpepper/example/exampleheader.rb +41 -0
- data/lib/greenpepper/example/examplewithfixture.rb +73 -0
- data/lib/greenpepper/example/executionresults.rb +160 -0
- data/lib/greenpepper/example/fieldaccessor.rb +36 -0
- data/lib/greenpepper/example/freetextexample.rb +51 -0
- data/lib/greenpepper/example/importexample.rb +39 -0
- data/lib/greenpepper/example/nameresolver.rb +69 -0
- data/lib/greenpepper/example/ruleforexample.rb +117 -0
- data/lib/greenpepper/example/setupexample.rb +79 -0
- data/lib/greenpepper/example/silentexample.rb +14 -0
- data/lib/greenpepper/example/unknownexample.rb +17 -0
- data/lib/greenpepper/exception/greenpepperexception.rb +57 -0
- data/lib/greenpepper/executionunit.rb +39 -0
- data/lib/greenpepper/factory/collectionexamplefactory.rb +59 -0
- data/lib/greenpepper/factory/dowithexamplefactory.rb +71 -0
- data/lib/greenpepper/factory/examplefactory.rb +14 -0
- data/lib/greenpepper/factory/freetextexamplefactory.rb +29 -0
- data/lib/greenpepper/factory/htmlexamplefactory.rb +49 -0
- data/lib/greenpepper/factory/importexamplefactory.rb +27 -0
- data/lib/greenpepper/factory/ruleforexamplefactory.rb +46 -0
- data/lib/greenpepper/factory/setupexamplefactory.rb +31 -0
- data/lib/greenpepper/factory/silentexamplefactory.rb +21 -0
- data/lib/greenpepper/factory/unknownexamplefactory.rb +16 -0
- data/lib/greenpepper/freetext.rb +164 -0
- data/lib/greenpepper/grammar/array.treetop +51 -0
- data/lib/greenpepper/grammar/arrayparser.rb +14 -0
- data/lib/greenpepper/greenpepperconfig.rb +19 -0
- data/lib/greenpepper/greenpeppertask.rb +60 -0
- data/lib/greenpepper/logger.rb +45 -0
- data/lib/greenpepper/parser/freetextparser.rb +96 -0
- data/lib/greenpepper/parser/htmlparser.rb +70 -0
- data/lib/greenpepper/parser/scenario.rb +25 -0
- data/lib/greenpepper/parser/table.rb +37 -0
- data/lib/greenpepper/parser/wikiparser.rb +26 -0
- data/lib/greenpepper/pass/freetextpass.rb +24 -0
- data/lib/greenpepper/pass/greenpepperpass.rb +92 -0
- data/lib/greenpepper/pass/tablepass.rb +38 -0
- data/lib/greenpepper/railsargumentparser.rb +46 -0
- data/lib/greenpepper/redpeppertask.rb +89 -0
- data/lib/greenpepper/repository/atlassianrepository.rb +100 -0
- data/lib/greenpepper/writer/consolewriter.rb +21 -0
- data/lib/greenpepper/writer/freetextresult.rb +233 -0
- data/lib/greenpepper/writer/freetextwriter.rb +44 -0
- data/lib/greenpepper/writer/html.rb +14 -0
- data/lib/greenpepper/writer/htmldocwriter.rb +82 -0
- data/lib/greenpepper/writer/htmlresult.rb +192 -0
- data/lib/greenpepper/writer/htmlwriter.rb +112 -0
- data/lib/greenpepper/writer/output.rb +26 -0
- data/lib/greenpepper/writer/result.rb +35 -0
- data/lib/greenpepper/writer/xmlwriter.rb +32 -0
- data/test/coreseedstest.rb +39 -0
- data/test/greenpepper/argumentparsertest.rb +162 -0
- data/test/greenpepper/common/loadpathtest.rb +24 -0
- data/test/greenpepper/common/stattest.rb +186 -0
- data/test/greenpepper/convertertest.rb +371 -0
- data/test/greenpepper/coretest.rb +159 -0
- data/test/greenpepper/example/collectionexampletest.rb +484 -0
- data/test/greenpepper/example/dowithexampletest.rb +148 -0
- data/test/greenpepper/example/exampletest.rb +28 -0
- data/test/greenpepper/example/freetextexampletest.rb +151 -0
- data/test/greenpepper/example/importexampletest.rb +79 -0
- data/test/greenpepper/example/nameresolvertest.rb +56 -0
- data/test/greenpepper/example/ruleforexampletest.rb +225 -0
- data/test/greenpepper/example/setupexampletest.rb +140 -0
- data/test/greenpepper/example/silentexampletest.rb +17 -0
- data/test/greenpepper/example/unknownexampletest.rb +17 -0
- data/test/greenpepper/factory/collectionexamplefactorytest.rb +51 -0
- data/test/greenpepper/factory/dowithexamplefactorytest.rb +48 -0
- data/test/greenpepper/factory/examplefactorytest.rb +88 -0
- data/test/greenpepper/factory/freetextexamplefactorytest.rb +54 -0
- data/test/greenpepper/factory/importexamplefactorytest.rb +40 -0
- data/test/greenpepper/factory/ruleforexamplefactorytest.rb +55 -0
- data/test/greenpepper/factory/setupexamplefactorytest.rb +29 -0
- data/test/greenpepper/factory/silentexamplefactorytest.rb +38 -0
- data/test/greenpepper/freetexttest.rb +222 -0
- data/test/greenpepper/grammar/arrayparsertest.rb +45 -0
- data/test/greenpepper/loggertest.rb +26 -0
- data/test/greenpepper/parser/freetextparsertest.rb +124 -0
- data/test/greenpepper/parser/htmlparsertest.rb +77 -0
- data/test/greenpepper/parser/wikiparsertest.rb +21 -0
- data/test/greenpepper/pass/freetextpasstest.rb +54 -0
- data/test/greenpepper/pass/greenpepperpasstest.rb +47 -0
- data/test/greenpepper/pass/tablepasstest.rb +23 -0
- data/test/greenpepper/repository/atlassionrepositorytest.rb +85 -0
- data/test/greenpepper/writer/freetextwritertest.rb +301 -0
- data/test/greenpepper/writer/htmlcollectionwritertest.rb +145 -0
- data/test/greenpepper/writer/htmldowithwritertest.rb +87 -0
- data/test/greenpepper/writer/htmlruleforwritertest.rb +147 -0
- data/test/greenpepper/writer/htmlsetupwritertest.rb +107 -0
- data/test/greenpepper/writer/htmlstatresulttest.rb +118 -0
- data/test/greenpepper/writer/htmlwriterpositiontest.rb +53 -0
- data/test/greenpepper/writer/writertest.rb +33 -0
- data/test/greenpepper/writer/xmlwritertest.rb +34 -0
- data/test/integration/collectionexampleintegrationtest.rb +64 -0
- data/test/integration/errorhandlingintegrationtest.rb +68 -0
- data/test/integration/freetextexampleintegrationtest.rb +75 -0
- data/test/integration/greenpepperexecutableintegrationtest.rb +22 -0
- data/test/integration/importexampleintegrationtest.rb +41 -0
- data/test/integration/interpretationordertest.rb +48 -0
- data/test/integration/ruleforexampleintegrationtest.rb +102 -0
- data/test/integration/securityintegrationtest.rb +30 -0
- data/test/integration/setupexampleintegrationtest.rb +31 -0
- data/test/integration/silentexampleintegrationtest.rb +29 -0
- data/test/task/greenpeppertasktest.rb +96 -0
- data/test/task/redpeppertasktest.rb +120 -0
- data/vendor/accents.rb +85 -0
- metadata +234 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
Author: Simon Mathieu (simon.math@gmail.com)
|
|
3
|
+
Pascal Ouellet (pas.ouellet@gmail.com)
|
|
4
|
+
Date: October 5, 2009
|
|
5
|
+
=end
|
|
6
|
+
|
|
7
|
+
module GreenPepper
|
|
8
|
+
|
|
9
|
+
require 'greenpepper/factory/freetextexamplefactory'
|
|
10
|
+
require 'greenpepper/parser/freetextparser'
|
|
11
|
+
require 'greenpepper/writer/freetextwriter'
|
|
12
|
+
|
|
13
|
+
require 'greenpepper/pass/greenpepperpass'
|
|
14
|
+
|
|
15
|
+
class FreeTextPass < GreenPepperPass
|
|
16
|
+
def initialize()
|
|
17
|
+
parser = FreeTextParser.new
|
|
18
|
+
factory = FreeTextExampleFactory.new
|
|
19
|
+
writer = FreeTextWriter.new
|
|
20
|
+
super(parser, factory, writer)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
Author: Pascal Ouellet (pas.ouellet@gmail.com)
|
|
3
|
+
Date: October 27, 2009
|
|
4
|
+
=end
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
module GreenPepper
|
|
9
|
+
class GreenPepperPass
|
|
10
|
+
|
|
11
|
+
@@passes = []
|
|
12
|
+
attr_accessor :writer
|
|
13
|
+
# TODO Malformed do with table test
|
|
14
|
+
def initialize(parser, factory, writer)
|
|
15
|
+
@parser = parser
|
|
16
|
+
@factory = factory
|
|
17
|
+
@writer = writer
|
|
18
|
+
# Force LibXML to keep the line number when parsing
|
|
19
|
+
LibXML::XML::default_line_numbers = true
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def extract_data document, filename
|
|
23
|
+
# Extract the content of the document
|
|
24
|
+
execution_units = @parser.extract_content document, filename
|
|
25
|
+
|
|
26
|
+
# Build examples from the content
|
|
27
|
+
i = 0
|
|
28
|
+
new_execution_units = []
|
|
29
|
+
while i < execution_units.size
|
|
30
|
+
content = execution_units[i].content
|
|
31
|
+
context = execution_units[i].context
|
|
32
|
+
|
|
33
|
+
current_unit = i
|
|
34
|
+
@factory.push_content content
|
|
35
|
+
i += 1
|
|
36
|
+
while @factory.need_more_content?
|
|
37
|
+
|
|
38
|
+
if i >= execution_units.size
|
|
39
|
+
raise GreenPepperMalformedTableError.new(
|
|
40
|
+
"Can't parse document, one of the table is not formated correctly.")
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
content = @factory.push_content execution_units[i].content
|
|
44
|
+
context.nb_table +=1
|
|
45
|
+
i += 1
|
|
46
|
+
end
|
|
47
|
+
example = @factory.build_example
|
|
48
|
+
execution_units[current_unit].example = example
|
|
49
|
+
new_execution_units << execution_units[current_unit]
|
|
50
|
+
end
|
|
51
|
+
new_execution_units
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def write document, execution_units, writer_options
|
|
55
|
+
if execution_units.size > 0
|
|
56
|
+
document = @writer.write document, execution_units, writer_options
|
|
57
|
+
end
|
|
58
|
+
document
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def self.interpret(document, filename = 'UNKNOWN', writer_options = {})
|
|
62
|
+
ex_units = []
|
|
63
|
+
@@passes.each{|pass| ex_units += pass.extract_data(document, filename)}
|
|
64
|
+
|
|
65
|
+
ex_units.sort!{|first, second|first.context.index <=> second.context.index}
|
|
66
|
+
# Execute examples
|
|
67
|
+
ex_units.each{ |ex_unit|
|
|
68
|
+
ex_unit.execute
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
# Don't write unless we have to
|
|
72
|
+
pass_it = 0
|
|
73
|
+
@@passes.each{|pass|
|
|
74
|
+
temp_units = []
|
|
75
|
+
ex_units.each{|unit|
|
|
76
|
+
if pass.writer.support? unit
|
|
77
|
+
temp_units << unit
|
|
78
|
+
end
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
document = pass.write(document, temp_units, writer_options)
|
|
82
|
+
}
|
|
83
|
+
[ex_units, document]
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def self.passes=(passes)
|
|
87
|
+
@@passes = passes
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
end
|
|
92
|
+
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
Author: Simon Mathieu (simon.math@gmail.com)
|
|
3
|
+
Pascal Ouellet (pas.ouellet@gmail.com)
|
|
4
|
+
Date: October 5, 2009
|
|
5
|
+
=end
|
|
6
|
+
module GreenPepper
|
|
7
|
+
|
|
8
|
+
require 'greenpepper/parser/htmlparser'
|
|
9
|
+
require 'greenpepper/factory/examplefactory'
|
|
10
|
+
require 'greenpepper/writer/htmlwriter'
|
|
11
|
+
require 'greenpepper/factory/htmlexamplefactory'
|
|
12
|
+
require 'greenpepper/factory/ruleforexamplefactory'
|
|
13
|
+
require 'greenpepper/factory/importexamplefactory'
|
|
14
|
+
require 'greenpepper/factory/setupexamplefactory'
|
|
15
|
+
require 'greenpepper/factory/dowithexamplefactory'
|
|
16
|
+
require 'greenpepper/factory/collectionexamplefactory'
|
|
17
|
+
require 'greenpepper/factory/silentexamplefactory'
|
|
18
|
+
|
|
19
|
+
require 'greenpepper/pass/greenpepperpass'
|
|
20
|
+
|
|
21
|
+
class TablePass < GreenPepperPass
|
|
22
|
+
def initialize()
|
|
23
|
+
parser = HtmlParser.new
|
|
24
|
+
factory = HtmlExampleFactory.new([ImportExampleFactory.new,
|
|
25
|
+
RuleForExampleFactory.new,
|
|
26
|
+
SetupExampleFactory.new,
|
|
27
|
+
DoWithExampleFactory.new,
|
|
28
|
+
ListOfExampleFactory.new,
|
|
29
|
+
SetOfExampleFactory.new,
|
|
30
|
+
SubsetOfExampleFactory.new,
|
|
31
|
+
SupersetOfExampleFactory.new,
|
|
32
|
+
SilentExampleFactory.new
|
|
33
|
+
])
|
|
34
|
+
writer = HtmlWriter.new
|
|
35
|
+
super(parser, factory, writer)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
author : S�bastien Boisclair (sebastien.boisclair2@usherbrooke.ca)
|
|
3
|
+
date: November 26, 2009
|
|
4
|
+
=end
|
|
5
|
+
module RailsArgumentParser
|
|
6
|
+
|
|
7
|
+
def self.extract_args
|
|
8
|
+
args = {}
|
|
9
|
+
|
|
10
|
+
env = extract_single_arg("--env")
|
|
11
|
+
args[:env] = env
|
|
12
|
+
|
|
13
|
+
path = extract_single_arg("--rails")
|
|
14
|
+
args[:rails] = path
|
|
15
|
+
args
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.extract_single_arg(argument)
|
|
19
|
+
ind = ARGV.index(argument)
|
|
20
|
+
result = nil
|
|
21
|
+
if ind != nil
|
|
22
|
+
if ind + 1 >= ARGV.length
|
|
23
|
+
puts "Wrong number of arguments.\n"
|
|
24
|
+
puts argument + " needs a linked argument."
|
|
25
|
+
ARGV.delete_at(ind)
|
|
26
|
+
else
|
|
27
|
+
result = ARGV[ind+1]
|
|
28
|
+
ARGV.delete_at(ind+1)
|
|
29
|
+
ARGV.delete_at(ind)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
result
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.usage
|
|
36
|
+
index = ARGV.index('--help')
|
|
37
|
+
if ARGV.length == 0 || index != nil
|
|
38
|
+
puts "Usage: ruby greenpepperrails input_document output_document [option]"
|
|
39
|
+
puts "--rails path to the rails application"
|
|
40
|
+
puts "--env name of the environment of rails application"
|
|
41
|
+
puts "all the options that can be used with greenpepper.rb can be used " +
|
|
42
|
+
"with greenpepperrails\n\n"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'rubygems'
|
|
4
|
+
require 'libxml'
|
|
5
|
+
require 'rake'
|
|
6
|
+
require 'rake/tasklib'
|
|
7
|
+
require 'net/http'
|
|
8
|
+
require 'cgi'
|
|
9
|
+
require 'greenpepper/greenpepperconfig'
|
|
10
|
+
|
|
11
|
+
module GreenPepper
|
|
12
|
+
class RedPepperTask < Rake::TaskLib
|
|
13
|
+
attr_accessor :server, :path, :spec_id, :spec_name
|
|
14
|
+
|
|
15
|
+
def initialize(name, http = Net::HTTP)
|
|
16
|
+
@name = name
|
|
17
|
+
@http_client = http
|
|
18
|
+
@path = 'greenpepper/specifications'
|
|
19
|
+
|
|
20
|
+
yield self if block_given?
|
|
21
|
+
load_config
|
|
22
|
+
define
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
# Create the tasks defined by this task lib.
|
|
27
|
+
def define
|
|
28
|
+
task @name do
|
|
29
|
+
if @spec_id.nil? && @spec_name.nil?
|
|
30
|
+
download_all_specs
|
|
31
|
+
else
|
|
32
|
+
if @spec_name
|
|
33
|
+
url = get_url_for_name @spec_name
|
|
34
|
+
name = @spec_name
|
|
35
|
+
elsif @spec_id
|
|
36
|
+
url = get_url_for_id @spec_id
|
|
37
|
+
name = @spec_id.to_s
|
|
38
|
+
end
|
|
39
|
+
page = get_page(url)
|
|
40
|
+
name = parse_for_name(page)
|
|
41
|
+
|
|
42
|
+
write_page page, name
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def download_all_specs
|
|
48
|
+
all_ids_string = @http_client.get URI.parse("#{@server}/specifications/all")
|
|
49
|
+
all_ids_string.split("\n").each do |id|
|
|
50
|
+
url = get_url_for_id(id)
|
|
51
|
+
page = get_page(url)
|
|
52
|
+
name = parse_for_name page
|
|
53
|
+
write_page page, name
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def get_url_for_id id
|
|
58
|
+
"#{@server}/specifications/spec/#{id}"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def get_url_for_name name
|
|
62
|
+
"#{@server}/specifications/spec/name/#{CGI::escape name}"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def get_page url
|
|
66
|
+
@http_client.get URI.parse(url)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def write_page(page, name)
|
|
70
|
+
filepath = File.join @path, name + '.html'
|
|
71
|
+
FileUtils.mkdir_p @path if !File.directory?(@path)
|
|
72
|
+
File.open(filepath, 'w') { |f| f.write page }
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def parse_for_name page
|
|
76
|
+
page_parse = (LibXML::XML::HTMLParser.string page).parse
|
|
77
|
+
name = ""
|
|
78
|
+
page_parse.find("//title").each {|t| name = t.content}
|
|
79
|
+
name.strip
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def load_config
|
|
84
|
+
config = GreenPepperConfig.instance
|
|
85
|
+
GreenPepperConfig.maybe_set self, "@server", config
|
|
86
|
+
GreenPepperConfig.maybe_set self, "@path", config
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
author: Éloise Dubé (eloise.dube@gmail.com)
|
|
3
|
+
date: March 29, 2009
|
|
4
|
+
=end
|
|
5
|
+
module GreenPepper
|
|
6
|
+
|
|
7
|
+
require 'cgi'
|
|
8
|
+
require 'xmlrpc/client'
|
|
9
|
+
require 'greenpepper/exception/greenpepperexception'
|
|
10
|
+
|
|
11
|
+
class AtlassianRepository
|
|
12
|
+
|
|
13
|
+
def initialize(uri, server = nil)
|
|
14
|
+
uri = AtlassianURI.new(uri) if uri.is_a?(String)
|
|
15
|
+
@uri = uri
|
|
16
|
+
server = Confluence::Server.new(@uri.url, @uri.handler) unless server
|
|
17
|
+
@repo = server
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def load_document(filename)
|
|
21
|
+
filename = CGI::unescape(filename)
|
|
22
|
+
|
|
23
|
+
parse_input_filename filename
|
|
24
|
+
return @repo.getRenderedSpecification(@uri.username, @uri.password,
|
|
25
|
+
[@uri.space, @input_filename, false, true])
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def parse_input_filename(filename)
|
|
29
|
+
# format of filename : FILENAME?ATTRIBUTES
|
|
30
|
+
@file_attributes = Hash.new
|
|
31
|
+
|
|
32
|
+
filename_parts = filename.split "?"
|
|
33
|
+
@input_filename = filename_parts[0]
|
|
34
|
+
if filename_parts.size > 1
|
|
35
|
+
attribute_parts = filename_parts[1].split "="
|
|
36
|
+
@file_attributes[attribute_parts[0]] = attribute_parts[1]
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
class AtlassianURI
|
|
42
|
+
attr_reader :uri, :url, :handler, :space, :username, :password
|
|
43
|
+
def initialize(uri)
|
|
44
|
+
@uri = uri
|
|
45
|
+
uri_parts = @uri.split ";"
|
|
46
|
+
if uri_parts.size < 2
|
|
47
|
+
raise GreenPepperRepositoryError.new("Bad format of URI. " + uri)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
success = /(.*)\?handler=(.*)&(.*)#(.*)/ === uri_parts[1]
|
|
51
|
+
if success == false
|
|
52
|
+
raise GreenPepperRepositoryError.new(
|
|
53
|
+
"Can't parse confluence URL")
|
|
54
|
+
end
|
|
55
|
+
@url = $1
|
|
56
|
+
@handler = $2
|
|
57
|
+
@space = $4
|
|
58
|
+
attribute_parts = $3.split "="
|
|
59
|
+
|
|
60
|
+
@username = ""
|
|
61
|
+
@password = ""
|
|
62
|
+
|
|
63
|
+
if uri_parts.size > 2
|
|
64
|
+
@username = uri_parts[2]
|
|
65
|
+
@password = uri_parts[3]
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# A useful helper for running Confluence XML-RPC from Ruby.
|
|
71
|
+
# Also takes care of re-logging in if your login times out.
|
|
72
|
+
#
|
|
73
|
+
# Source code :
|
|
74
|
+
# http://confluence.atlassian.com/display/CONFEXT/Confluence4r
|
|
75
|
+
module Confluence
|
|
76
|
+
class ServerFactory
|
|
77
|
+
def create_server(server_url)
|
|
78
|
+
XMLRPC::Client.new2 server_url
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
class Server
|
|
82
|
+
def initialize(server_url, handler, factory = ServerFactory.new)
|
|
83
|
+
unless server_url[-11..-1] == "/rpc/xmlrpc"
|
|
84
|
+
server_url += "/rpc/xmlrpc"
|
|
85
|
+
end
|
|
86
|
+
server = factory.create_server server_url
|
|
87
|
+
@conf = server.proxy handler
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def method_missing(method_name, *args)
|
|
91
|
+
begin
|
|
92
|
+
@conf.send(method_name, *(args))
|
|
93
|
+
rescue XMLRPC::FaultException => e
|
|
94
|
+
raise e.faultString
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
end #module GreenPepper
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
author: Martin Provencher (martin.provencher@usherbrooke.ca)
|
|
3
|
+
date: March 18, 2009
|
|
4
|
+
=end
|
|
5
|
+
module GreenPepper
|
|
6
|
+
|
|
7
|
+
require 'greenpepper/example/ruleforexample'
|
|
8
|
+
|
|
9
|
+
class ConsoleWriter
|
|
10
|
+
def initialize results
|
|
11
|
+
@results = results
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def output
|
|
15
|
+
results = HtmlTableExecutionResults.get_all_results(@results)
|
|
16
|
+
total = results.successes + results.failures + results.ignored + results.errors
|
|
17
|
+
"#{total} tests: #{results.successes} right, #{results.failures}" +
|
|
18
|
+
" wrong, #{results.ignored} ignored, #{results.errors} exception(s)"
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end #module GreenPepper
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
author: Simon Mathieu (simon.math@gmail.com)
|
|
3
|
+
date: October 3, 2009
|
|
4
|
+
=end
|
|
5
|
+
module GreenPepper
|
|
6
|
+
|
|
7
|
+
require 'greenpepper/writer/html'
|
|
8
|
+
require 'greenpepper/writer/result'
|
|
9
|
+
require 'greenpepper/converter'
|
|
10
|
+
require 'cgi'
|
|
11
|
+
|
|
12
|
+
module KeywordFormat
|
|
13
|
+
def indent(text)
|
|
14
|
+
"<div class=\"greenpepper-freetext-indent\">#{text}</div>"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def indent2(text)
|
|
18
|
+
"<div class=\"greenpepper-freetext-indent2\">#{text}</div>"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def newline(text)
|
|
22
|
+
"<div class=\"greenpepper-freetext\">#{text}</div>"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def highlight(color, text)
|
|
26
|
+
"<font style=\"background-color: #{color};\">#{text}</font>"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def yellow_highlight(text)
|
|
30
|
+
highlight(Html::YELLOW, text)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def green_highlight(text)
|
|
34
|
+
highlight(Html::GREEN, text)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def red_highlight(text)
|
|
38
|
+
highlight(Html::RED, text)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def grey_highlight(text)
|
|
42
|
+
highlight(Html::GREY, text)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def error(error)
|
|
46
|
+
res = indent yellow_highlight("#{error.class}: " +
|
|
47
|
+
"#{CGI::escapeHTML error.to_s}")
|
|
48
|
+
if error.backtrace
|
|
49
|
+
res += '<hr/>'
|
|
50
|
+
error.backtrace.each { |step|
|
|
51
|
+
res << indent2(yellow_highlight(CGI::escapeHTML(step)))
|
|
52
|
+
}
|
|
53
|
+
end
|
|
54
|
+
res
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
class GivenSuccess < ExampleResult
|
|
59
|
+
def write(action)
|
|
60
|
+
action
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def success?
|
|
64
|
+
true
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
class WhenSuccess < ExampleResult
|
|
69
|
+
def write(action)
|
|
70
|
+
action
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def success?
|
|
74
|
+
true
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
class ThenResults < ExampleResult
|
|
79
|
+
include KeywordFormat
|
|
80
|
+
attr_accessor :expectations
|
|
81
|
+
|
|
82
|
+
def initialize(regex, expectations)
|
|
83
|
+
@regex, @expectations = regex, expectations
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def write(action)
|
|
87
|
+
expected_lines = []
|
|
88
|
+
match_data = @regex.match action
|
|
89
|
+
i = match_data.size - 1
|
|
90
|
+
while i > 0
|
|
91
|
+
start_index = match_data.offset(i)[0]
|
|
92
|
+
end_index = match_data.offset(i)[1]
|
|
93
|
+
|
|
94
|
+
# Type conversion of expected and received value
|
|
95
|
+
converter = TypeConverter.instance
|
|
96
|
+
expected = converter.format_object(match_data[i],
|
|
97
|
+
@expectations[i-1].expected)
|
|
98
|
+
received = converter.format_object(match_data[i],
|
|
99
|
+
@expectations[i-1].received)
|
|
100
|
+
|
|
101
|
+
# Highlight match
|
|
102
|
+
action = action[0...start_index] +
|
|
103
|
+
then_highlight(expected,
|
|
104
|
+
@expectations[i-1].check_result) +
|
|
105
|
+
action[end_index..-1]
|
|
106
|
+
|
|
107
|
+
# Write expected lines for failures
|
|
108
|
+
unless @expectations[i-1].check_result
|
|
109
|
+
expected_lines << indent(
|
|
110
|
+
red_highlight("Expected value was #{expected}, " +
|
|
111
|
+
"but #{received} was received"))
|
|
112
|
+
end
|
|
113
|
+
i -= 1
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
expected_lines.reverse.each do |line|
|
|
117
|
+
action += line
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
action
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def then_highlight(string, result)
|
|
124
|
+
result ? green_highlight(string) : red_highlight(string)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def update_stats(results)
|
|
128
|
+
@expectations[0..-1].each do |exp|
|
|
129
|
+
exp.check_result ? results.add_success : results.add_failure
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
class AskSuccess < ExampleResult
|
|
135
|
+
include KeywordFormat
|
|
136
|
+
attr_accessor :answer
|
|
137
|
+
|
|
138
|
+
def initialize(answer)
|
|
139
|
+
@answer = answer
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def write(action)
|
|
143
|
+
action + indent("Answer: " + grey_highlight(@answer))
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def success?
|
|
147
|
+
true
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
class CheckSuccess < ExampleResult
|
|
152
|
+
include KeywordFormat
|
|
153
|
+
|
|
154
|
+
def write(action)
|
|
155
|
+
green_highlight action
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def update_stats(results)
|
|
159
|
+
results.add_success
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def success?
|
|
163
|
+
true
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
class HeaderSuccess < ExampleResult
|
|
168
|
+
def initialize(fixture_name)
|
|
169
|
+
@fixture_name = fixture_name
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def write(action)
|
|
173
|
+
"Scenario: #{@fixture_name}"
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def success?
|
|
177
|
+
true
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
class KeywordError < ExampleResult
|
|
182
|
+
include KeywordFormat
|
|
183
|
+
def update_stats(results)
|
|
184
|
+
results.add_error
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def error?
|
|
188
|
+
true
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
class ActionError < KeywordError
|
|
193
|
+
attr_reader :exception
|
|
194
|
+
|
|
195
|
+
def initialize(exception)
|
|
196
|
+
@exception = exception
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def write(action)
|
|
200
|
+
newline(yellow_highlight(action)) +
|
|
201
|
+
error(@exception)
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
class HeaderError < KeywordError
|
|
206
|
+
def initialize(fixture_name, error)
|
|
207
|
+
@fixture_name = fixture_name
|
|
208
|
+
@error = error
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
def write(action)
|
|
212
|
+
"Scenario: " + yellow_highlight(@fixture_name) +
|
|
213
|
+
indent(error(@error))
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
class CheckFailure < ExampleResult
|
|
218
|
+
include KeywordFormat
|
|
219
|
+
|
|
220
|
+
def write(action)
|
|
221
|
+
red_highlight action
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def update_stats(results)
|
|
225
|
+
results.add_failure
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def failure?
|
|
229
|
+
true
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
end
|