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,51 @@
|
|
|
1
|
+
grammar ArrayGrammar
|
|
2
|
+
rule root
|
|
3
|
+
space '['? string ']'? space {
|
|
4
|
+
def text
|
|
5
|
+
array = Array.new
|
|
6
|
+
string.text(array)
|
|
7
|
+
end
|
|
8
|
+
}
|
|
9
|
+
/
|
|
10
|
+
string
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
rule string
|
|
14
|
+
value ',' value2:(string)? {
|
|
15
|
+
def text(array)
|
|
16
|
+
value.text(array)
|
|
17
|
+
value2.text(array)
|
|
18
|
+
end
|
|
19
|
+
}
|
|
20
|
+
/
|
|
21
|
+
value
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
rule value
|
|
25
|
+
space texte:('\'' txt '\'' / '"' txt '"') space {
|
|
26
|
+
def text(array)
|
|
27
|
+
array << texte.text_value if !texte.text_value.empty?
|
|
28
|
+
array
|
|
29
|
+
end
|
|
30
|
+
}
|
|
31
|
+
/
|
|
32
|
+
space texte:txt_without_commas space {
|
|
33
|
+
def text(array)
|
|
34
|
+
array << texte.text_value if !texte.text_value.empty?
|
|
35
|
+
array
|
|
36
|
+
end
|
|
37
|
+
}
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
rule txt_without_commas
|
|
41
|
+
[^\[|\]|'\'|'"'|',']*
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
rule txt
|
|
45
|
+
[^\[\]'\''"']*
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
rule space
|
|
49
|
+
[\s]*
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
authors: Edouard Murat
|
|
3
|
+
date: March 28, 2009
|
|
4
|
+
=end
|
|
5
|
+
require 'rubygems'
|
|
6
|
+
require 'treetop'
|
|
7
|
+
require 'greenpepper/grammar/array'
|
|
8
|
+
|
|
9
|
+
module ArrayGrammarModule
|
|
10
|
+
@parser = ArrayGrammarParser.new
|
|
11
|
+
def ArrayGrammarModule.parse(s)
|
|
12
|
+
array = @parser.parse(s).text
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module GreenPepper
|
|
2
|
+
class GreenPepperConfig
|
|
3
|
+
include Singleton
|
|
4
|
+
#GreenPepperTask
|
|
5
|
+
attr_accessor :spec_dir, :result_dir, :greenpepper_path
|
|
6
|
+
|
|
7
|
+
#RedPepperTask
|
|
8
|
+
attr_accessor :server, :path
|
|
9
|
+
|
|
10
|
+
def self.configure
|
|
11
|
+
yield GreenPepperConfig.instance
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.maybe_set(instance, symbol, config)
|
|
15
|
+
value = config.instance_variable_get(symbol)
|
|
16
|
+
instance.instance_variable_set symbol, value if value
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
=begin
|
|
3
|
+
author: Simon Mathieu (simon.math@gmail.com)
|
|
4
|
+
date: November 8, 2009
|
|
5
|
+
=end
|
|
6
|
+
|
|
7
|
+
require 'rake'
|
|
8
|
+
require 'rake/tasklib'
|
|
9
|
+
require 'greenpepper/greenpepperconfig'
|
|
10
|
+
|
|
11
|
+
module GreenPepper
|
|
12
|
+
class GreenPepperTask < Rake::TaskLib
|
|
13
|
+
attr_accessor :spec_dir, :spec_name, :result_dir, :greenpepper_path
|
|
14
|
+
|
|
15
|
+
def initialize(name)
|
|
16
|
+
@name = name
|
|
17
|
+
|
|
18
|
+
@spec_dir = 'greenpepper/specifications'
|
|
19
|
+
@spec_name = '**/*.html'
|
|
20
|
+
@result_dir = 'greenpepper/results'
|
|
21
|
+
@greenpepper_path = nil
|
|
22
|
+
|
|
23
|
+
yield self if block_given?
|
|
24
|
+
load_config
|
|
25
|
+
define
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
def define
|
|
30
|
+
task @name do
|
|
31
|
+
begin
|
|
32
|
+
core_path = 'greenpepper/core'
|
|
33
|
+
core_path = File.join @greenpepper_path, core_path if @greenpepper_path
|
|
34
|
+
require core_path
|
|
35
|
+
rescue Exception => e
|
|
36
|
+
raise "Could not find GreenPepper core (greenpepper/core.rb)." +
|
|
37
|
+
" Please specify GreenPepper path in GreenPepperTask variable" +
|
|
38
|
+
" 'greenpepper_path'."
|
|
39
|
+
end
|
|
40
|
+
core = GreenPepper::GreenPepperCore.new
|
|
41
|
+
pattern = File.join @spec_dir, @spec_name
|
|
42
|
+
files = Dir.glob pattern
|
|
43
|
+
files.each{ |file|
|
|
44
|
+
# TODO Support sub folders in result
|
|
45
|
+
output = File.join @result_dir, File.basename(file)
|
|
46
|
+
args = [file, output]
|
|
47
|
+
puts "Specification: #{output}"
|
|
48
|
+
core.run args
|
|
49
|
+
}
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def load_config
|
|
54
|
+
config = GreenPepperConfig.instance
|
|
55
|
+
GreenPepperConfig.maybe_set self, "@spec_dir", config
|
|
56
|
+
GreenPepperConfig.maybe_set self, "@result_dir", config
|
|
57
|
+
GreenPepperConfig.maybe_set self, "@greenpepper_path", config
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
author: Simon Mathieu (simon.math@gmail.com)
|
|
3
|
+
date: March 30, 2009
|
|
4
|
+
=end
|
|
5
|
+
module GreenPepper
|
|
6
|
+
|
|
7
|
+
#Very very simple logger.
|
|
8
|
+
class Logger
|
|
9
|
+
def initialize(output)
|
|
10
|
+
@output = output
|
|
11
|
+
|
|
12
|
+
log_file = get_log_path
|
|
13
|
+
|
|
14
|
+
@output_file = File.open(log_file, 'a')
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def get_log_path
|
|
18
|
+
if /win32/ === RUBY_PLATFORM
|
|
19
|
+
"C:/temp/greenpepperruby.log"
|
|
20
|
+
else
|
|
21
|
+
"/tmp/greenpepperruby.log"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
#Prints to the output
|
|
26
|
+
def error(message)
|
|
27
|
+
@output.puts message
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
#Print to log file
|
|
31
|
+
def log(message)
|
|
32
|
+
@output_file.puts message if @output_file
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def log_error(message)
|
|
36
|
+
error message
|
|
37
|
+
log message
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
#Close the log file
|
|
41
|
+
def close
|
|
42
|
+
@output_file.close
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
author: Simon Mathieu (simon.math@gmail.com)
|
|
3
|
+
date: October 3, 2009
|
|
4
|
+
=end
|
|
5
|
+
|
|
6
|
+
module GreenPepper
|
|
7
|
+
|
|
8
|
+
require 'rubygems'
|
|
9
|
+
require 'libxml'
|
|
10
|
+
require 'greenpepper/parser/scenario'
|
|
11
|
+
require 'greenpepper/executionunit'
|
|
12
|
+
require 'greenpepper/context/htmlcontext'
|
|
13
|
+
|
|
14
|
+
class FreeTextParser
|
|
15
|
+
|
|
16
|
+
def extract_content(document, filename = 'UNKNOWN')
|
|
17
|
+
doc = load_doc document, filename
|
|
18
|
+
extract_scenarios_from_html(doc)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def replace_scenarios(document, html_results)
|
|
22
|
+
doc = load_doc document
|
|
23
|
+
pres = find_free_text_pre doc
|
|
24
|
+
if pres.size != html_results.size
|
|
25
|
+
raise GreenPepperError.new("Mismatch in result size.")
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
pres.each_with_index{ |pre, index|
|
|
29
|
+
new = (LibXML::XML::Parser.string(
|
|
30
|
+
"<div>#{html_results[index]}</div>",
|
|
31
|
+
:encoding => LibXML::XML::Encoding::UTF_8,
|
|
32
|
+
:options => LibXML::XML::HTMLParser::Options::NOBLANKS).parse).root.copy(true)
|
|
33
|
+
replace_node pre, new
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
doc.root.to_s
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
def load_doc(document, filename = 'UNKNOWN')
|
|
41
|
+
begin
|
|
42
|
+
doc = (LibXML::XML::HTMLParser.string document,
|
|
43
|
+
:encoding => LibXML::XML::Encoding::UTF_8,
|
|
44
|
+
:options => LibXML::XML::HTMLParser::Options::NOBLANKS).parse
|
|
45
|
+
rescue LibXML::XML::Error => exception
|
|
46
|
+
message = "An error occured while using LibXML : " +
|
|
47
|
+
"Invalid element at #{filename}:#{exception.line}"
|
|
48
|
+
raise GreenPepperLibXmlError.new(message)
|
|
49
|
+
end
|
|
50
|
+
doc
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def replace_node(old, new)
|
|
54
|
+
if old.prev?
|
|
55
|
+
prev = old.prev
|
|
56
|
+
prev.next = new
|
|
57
|
+
elsif old.parent.first
|
|
58
|
+
# Make new the first child of the parent
|
|
59
|
+
old.parent.first.prev = new
|
|
60
|
+
else
|
|
61
|
+
old.parent << new
|
|
62
|
+
end
|
|
63
|
+
old.remove!
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def extract_scenarios_from_html(doc)
|
|
67
|
+
execution_units = []
|
|
68
|
+
pres = find_free_text_pre doc
|
|
69
|
+
pres.each{ |pre_element|
|
|
70
|
+
scenario_regex = /Scenario\s?:\s*(.*)$/
|
|
71
|
+
lines = pre_element.content.strip.split("\n").collect{|line| line.strip}
|
|
72
|
+
|
|
73
|
+
raise GreenPepperNoScenarioInTag.new unless scenario_regex === lines[0]
|
|
74
|
+
|
|
75
|
+
scenario = Scenario.new lines[0].match(scenario_regex).to_a[1]
|
|
76
|
+
scenario.add_lines lines[1..-1]
|
|
77
|
+
|
|
78
|
+
context = ExampleContext.new pre_element.line_num
|
|
79
|
+
|
|
80
|
+
unit = ExecutionUnit.new scenario, context
|
|
81
|
+
execution_units << unit
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
execution_units
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def find_free_text_pre(doc)
|
|
88
|
+
pres = []
|
|
89
|
+
doc.find("//pre").each{ |pre_element|
|
|
90
|
+
pre_classes = pre_element["class"].split(" ")
|
|
91
|
+
pres << pre_element if pre_classes.index("greenpepper-freetext")
|
|
92
|
+
}
|
|
93
|
+
pres
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'libxml'
|
|
3
|
+
require 'greenpepper/context/htmlcontext'
|
|
4
|
+
require 'greenpepper/parser/table'
|
|
5
|
+
require 'greenpepper/exception/greenpepperexception'
|
|
6
|
+
require 'greenpepper/executionunit'
|
|
7
|
+
|
|
8
|
+
module GreenPepper
|
|
9
|
+
|
|
10
|
+
class HtmlParser
|
|
11
|
+
|
|
12
|
+
attr_reader :html_string
|
|
13
|
+
|
|
14
|
+
def parse_file(filename)
|
|
15
|
+
file_content = ""
|
|
16
|
+
File.open(filename, "r") { |f| file_content = f.read }
|
|
17
|
+
extract_content file_content, filename
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def extract_content(text, filename = "UNKNOWN")
|
|
21
|
+
begin
|
|
22
|
+
# TODO Remove this in favor of proper character encoding
|
|
23
|
+
# support. This is a hack to address a bug where the Confluence server
|
|
24
|
+
# would return non ascii characters.
|
|
25
|
+
text.gsub! /[\x80-\xff]/, ""
|
|
26
|
+
|
|
27
|
+
doc = (LibXML::XML::HTMLParser.string text).parse
|
|
28
|
+
ex_units = extract_tables(doc)
|
|
29
|
+
rescue LibXML::XML::Error => exception
|
|
30
|
+
message = "An error occured while using LibXML : " +
|
|
31
|
+
"Invalid element at #{filename}:#{exception.line}"
|
|
32
|
+
raise GreenPepperLibXmlError.new(message)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
ex_units
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def extract_tables(doc)
|
|
39
|
+
execution_units = []
|
|
40
|
+
|
|
41
|
+
table_parser = HtmlTableParser.new
|
|
42
|
+
|
|
43
|
+
doc.find("//table").each_with_index{ |table_element, table_index|
|
|
44
|
+
table = table_parser.parse(table_element)
|
|
45
|
+
context = HtmlContext.new table_element.line_num, table_index
|
|
46
|
+
|
|
47
|
+
ex_unit = ExecutionUnit.new table, context
|
|
48
|
+
|
|
49
|
+
execution_units << ex_unit
|
|
50
|
+
}
|
|
51
|
+
execution_units
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
class HtmlTableParser
|
|
56
|
+
def parse(table_element)
|
|
57
|
+
table = Table.new
|
|
58
|
+
table_element.find('.//tr').each{ |row|
|
|
59
|
+
cells = Array.new
|
|
60
|
+
row.find('td | th').each { |cell|
|
|
61
|
+
content = cell.content
|
|
62
|
+
content = "" if content == "\302\240" #Clear " "
|
|
63
|
+
cells.push content.strip
|
|
64
|
+
}
|
|
65
|
+
table.push_row cells
|
|
66
|
+
}
|
|
67
|
+
table
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end #module GreenPepper
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
class Scenario
|
|
10
|
+
attr_reader :fixture_name, :lines
|
|
11
|
+
def initialize(fixture_name)
|
|
12
|
+
@lines = []
|
|
13
|
+
@fixture_name = fixture_name
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def add_line(line)
|
|
17
|
+
@lines << line
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def add_lines(lines)
|
|
21
|
+
@lines = @lines + lines
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
author: Pascal Ouellet (pas.ouellet@gmail.com)
|
|
3
|
+
date: March 6, 2009
|
|
4
|
+
=end
|
|
5
|
+
module GreenPepper
|
|
6
|
+
|
|
7
|
+
class Table
|
|
8
|
+
def initialize
|
|
9
|
+
@table = Array.new
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def [](row)
|
|
13
|
+
@table[row]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def push_row(row)
|
|
17
|
+
@table.push row.clone
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def merge_with(to_merge)
|
|
21
|
+
@table = @table + to_merge.table
|
|
22
|
+
self
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def ==(rho)
|
|
26
|
+
return false unless rho.is_a? Table
|
|
27
|
+
@table == rho.table
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def each_row
|
|
31
|
+
@table.each{|row| yield row }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
protected
|
|
35
|
+
attr_reader :table
|
|
36
|
+
end
|
|
37
|
+
end #module GreenPepper
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
Author: Simon Mathieu (simon.math@gmail.com)
|
|
3
|
+
Date: April 12, 2009
|
|
4
|
+
=end
|
|
5
|
+
|
|
6
|
+
require 'greenpepper/parser/table'
|
|
7
|
+
require 'greenpepper/parser/htmlparser'
|
|
8
|
+
require 'rubygems'
|
|
9
|
+
require 'redcloth'
|
|
10
|
+
require 'libxml'
|
|
11
|
+
|
|
12
|
+
module GreenPepper
|
|
13
|
+
|
|
14
|
+
class WikiTableParser
|
|
15
|
+
def parse(wiki_table_string)
|
|
16
|
+
s = wiki_table_string.split("\n")
|
|
17
|
+
s = s.collect{|x| x.strip}
|
|
18
|
+
s = s.join("\n")
|
|
19
|
+
html = RedCloth.new(s).to_html
|
|
20
|
+
doc = (LibXML::XML::HTMLParser.string html).parse.root
|
|
21
|
+
html_parser = HtmlTableParser.new
|
|
22
|
+
html_parser.parse doc
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|