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.
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