greenpepper-ruby 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. data/bin/greenpepperize +71 -0
  2. data/bin/greenpepperrails +33 -0
  3. data/bin/greenpepperruby +15 -0
  4. data/data/greenpepper.rake +37 -0
  5. data/data/helper.rb +32 -0
  6. data/data/tags +6 -0
  7. data/lib/greenpepper/argumentparser.rb +161 -0
  8. data/lib/greenpepper/common/loadpath.rb +7 -0
  9. data/lib/greenpepper/context/htmlcontext.rb +26 -0
  10. data/lib/greenpepper/converter.rb +347 -0
  11. data/lib/greenpepper/core.rb +152 -0
  12. data/lib/greenpepper/example/collectionexample.rb +305 -0
  13. data/lib/greenpepper/example/dowithexample.rb +192 -0
  14. data/lib/greenpepper/example/exampleheader.rb +41 -0
  15. data/lib/greenpepper/example/examplewithfixture.rb +73 -0
  16. data/lib/greenpepper/example/executionresults.rb +160 -0
  17. data/lib/greenpepper/example/fieldaccessor.rb +36 -0
  18. data/lib/greenpepper/example/freetextexample.rb +51 -0
  19. data/lib/greenpepper/example/importexample.rb +39 -0
  20. data/lib/greenpepper/example/nameresolver.rb +69 -0
  21. data/lib/greenpepper/example/ruleforexample.rb +117 -0
  22. data/lib/greenpepper/example/setupexample.rb +79 -0
  23. data/lib/greenpepper/example/silentexample.rb +14 -0
  24. data/lib/greenpepper/example/unknownexample.rb +17 -0
  25. data/lib/greenpepper/exception/greenpepperexception.rb +57 -0
  26. data/lib/greenpepper/executionunit.rb +39 -0
  27. data/lib/greenpepper/factory/collectionexamplefactory.rb +59 -0
  28. data/lib/greenpepper/factory/dowithexamplefactory.rb +71 -0
  29. data/lib/greenpepper/factory/examplefactory.rb +14 -0
  30. data/lib/greenpepper/factory/freetextexamplefactory.rb +29 -0
  31. data/lib/greenpepper/factory/htmlexamplefactory.rb +49 -0
  32. data/lib/greenpepper/factory/importexamplefactory.rb +27 -0
  33. data/lib/greenpepper/factory/ruleforexamplefactory.rb +46 -0
  34. data/lib/greenpepper/factory/setupexamplefactory.rb +31 -0
  35. data/lib/greenpepper/factory/silentexamplefactory.rb +21 -0
  36. data/lib/greenpepper/factory/unknownexamplefactory.rb +16 -0
  37. data/lib/greenpepper/freetext.rb +164 -0
  38. data/lib/greenpepper/grammar/array.treetop +51 -0
  39. data/lib/greenpepper/grammar/arrayparser.rb +14 -0
  40. data/lib/greenpepper/greenpepperconfig.rb +19 -0
  41. data/lib/greenpepper/greenpeppertask.rb +60 -0
  42. data/lib/greenpepper/logger.rb +45 -0
  43. data/lib/greenpepper/parser/freetextparser.rb +96 -0
  44. data/lib/greenpepper/parser/htmlparser.rb +70 -0
  45. data/lib/greenpepper/parser/scenario.rb +25 -0
  46. data/lib/greenpepper/parser/table.rb +37 -0
  47. data/lib/greenpepper/parser/wikiparser.rb +26 -0
  48. data/lib/greenpepper/pass/freetextpass.rb +24 -0
  49. data/lib/greenpepper/pass/greenpepperpass.rb +92 -0
  50. data/lib/greenpepper/pass/tablepass.rb +38 -0
  51. data/lib/greenpepper/railsargumentparser.rb +46 -0
  52. data/lib/greenpepper/redpeppertask.rb +89 -0
  53. data/lib/greenpepper/repository/atlassianrepository.rb +100 -0
  54. data/lib/greenpepper/writer/consolewriter.rb +21 -0
  55. data/lib/greenpepper/writer/freetextresult.rb +233 -0
  56. data/lib/greenpepper/writer/freetextwriter.rb +44 -0
  57. data/lib/greenpepper/writer/html.rb +14 -0
  58. data/lib/greenpepper/writer/htmldocwriter.rb +82 -0
  59. data/lib/greenpepper/writer/htmlresult.rb +192 -0
  60. data/lib/greenpepper/writer/htmlwriter.rb +112 -0
  61. data/lib/greenpepper/writer/output.rb +26 -0
  62. data/lib/greenpepper/writer/result.rb +35 -0
  63. data/lib/greenpepper/writer/xmlwriter.rb +32 -0
  64. data/test/coreseedstest.rb +39 -0
  65. data/test/greenpepper/argumentparsertest.rb +162 -0
  66. data/test/greenpepper/common/loadpathtest.rb +24 -0
  67. data/test/greenpepper/common/stattest.rb +186 -0
  68. data/test/greenpepper/convertertest.rb +371 -0
  69. data/test/greenpepper/coretest.rb +159 -0
  70. data/test/greenpepper/example/collectionexampletest.rb +484 -0
  71. data/test/greenpepper/example/dowithexampletest.rb +148 -0
  72. data/test/greenpepper/example/exampletest.rb +28 -0
  73. data/test/greenpepper/example/freetextexampletest.rb +151 -0
  74. data/test/greenpepper/example/importexampletest.rb +79 -0
  75. data/test/greenpepper/example/nameresolvertest.rb +56 -0
  76. data/test/greenpepper/example/ruleforexampletest.rb +225 -0
  77. data/test/greenpepper/example/setupexampletest.rb +140 -0
  78. data/test/greenpepper/example/silentexampletest.rb +17 -0
  79. data/test/greenpepper/example/unknownexampletest.rb +17 -0
  80. data/test/greenpepper/factory/collectionexamplefactorytest.rb +51 -0
  81. data/test/greenpepper/factory/dowithexamplefactorytest.rb +48 -0
  82. data/test/greenpepper/factory/examplefactorytest.rb +88 -0
  83. data/test/greenpepper/factory/freetextexamplefactorytest.rb +54 -0
  84. data/test/greenpepper/factory/importexamplefactorytest.rb +40 -0
  85. data/test/greenpepper/factory/ruleforexamplefactorytest.rb +55 -0
  86. data/test/greenpepper/factory/setupexamplefactorytest.rb +29 -0
  87. data/test/greenpepper/factory/silentexamplefactorytest.rb +38 -0
  88. data/test/greenpepper/freetexttest.rb +222 -0
  89. data/test/greenpepper/grammar/arrayparsertest.rb +45 -0
  90. data/test/greenpepper/loggertest.rb +26 -0
  91. data/test/greenpepper/parser/freetextparsertest.rb +124 -0
  92. data/test/greenpepper/parser/htmlparsertest.rb +77 -0
  93. data/test/greenpepper/parser/wikiparsertest.rb +21 -0
  94. data/test/greenpepper/pass/freetextpasstest.rb +54 -0
  95. data/test/greenpepper/pass/greenpepperpasstest.rb +47 -0
  96. data/test/greenpepper/pass/tablepasstest.rb +23 -0
  97. data/test/greenpepper/repository/atlassionrepositorytest.rb +85 -0
  98. data/test/greenpepper/writer/freetextwritertest.rb +301 -0
  99. data/test/greenpepper/writer/htmlcollectionwritertest.rb +145 -0
  100. data/test/greenpepper/writer/htmldowithwritertest.rb +87 -0
  101. data/test/greenpepper/writer/htmlruleforwritertest.rb +147 -0
  102. data/test/greenpepper/writer/htmlsetupwritertest.rb +107 -0
  103. data/test/greenpepper/writer/htmlstatresulttest.rb +118 -0
  104. data/test/greenpepper/writer/htmlwriterpositiontest.rb +53 -0
  105. data/test/greenpepper/writer/writertest.rb +33 -0
  106. data/test/greenpepper/writer/xmlwritertest.rb +34 -0
  107. data/test/integration/collectionexampleintegrationtest.rb +64 -0
  108. data/test/integration/errorhandlingintegrationtest.rb +68 -0
  109. data/test/integration/freetextexampleintegrationtest.rb +75 -0
  110. data/test/integration/greenpepperexecutableintegrationtest.rb +22 -0
  111. data/test/integration/importexampleintegrationtest.rb +41 -0
  112. data/test/integration/interpretationordertest.rb +48 -0
  113. data/test/integration/ruleforexampleintegrationtest.rb +102 -0
  114. data/test/integration/securityintegrationtest.rb +30 -0
  115. data/test/integration/setupexampleintegrationtest.rb +31 -0
  116. data/test/integration/silentexampleintegrationtest.rb +29 -0
  117. data/test/task/greenpeppertasktest.rb +96 -0
  118. data/test/task/redpeppertasktest.rb +120 -0
  119. data/vendor/accents.rb +85 -0
  120. 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 "&nbsp;"
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