rutema 1.1.3 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gemtest +0 -0
- data/History.txt +5 -0
- data/Manifest.txt +28 -23
- data/README.md +91 -0
- data/README.txt +2 -10
- data/Rakefile +6 -9
- data/bin/rutema +9 -0
- data/bin/rutemax +2 -0
- data/lib/rutema/configuration.rb +7 -8
- data/lib/rutema/elements/minimal.rb +45 -0
- data/lib/rutema/gems.rb +3 -3
- data/lib/rutema/models/activerecord.rb +164 -0
- data/lib/rutema/models/base.rb +5 -0
- data/lib/rutema/{specification.rb → objectmodel.rb} +4 -10
- data/lib/rutema/parsers/base.rb +29 -0
- data/lib/rutema/parsers/xml.rb +186 -0
- data/lib/rutema/reporters/activerecord.rb +9 -18
- data/lib/rutema/{reporter.rb → reporters/base.rb} +3 -7
- data/lib/rutema/reporters/email.rb +2 -5
- data/lib/rutema/reporters/text.rb +2 -2
- data/lib/rutema/reporters/yaml.rb +1 -2
- data/lib/rutema/runners/default.rb +157 -0
- data/lib/rutema/runners/step.rb +23 -0
- data/lib/rutema/system.rb +15 -420
- data/test/distro_test/config/full.rutema +2 -0
- data/test/distro_test/specs/check.spec +8 -0
- data/test/distro_test/specs/duplicate_name.spec +8 -0
- data/test/distro_test/specs/fail.spec +9 -0
- data/test/distro_test/specs/setup.spec +8 -0
- data/test/distro_test/specs/teardown.spec +8 -0
- data/test/rutema.rutema +1 -1
- data/test/rutema.spec +5 -5
- data/test/test_activerecord.rb +0 -0
- data/test/test_configuration.rb +7 -9
- data/test/test_couchdb.rb +14 -0
- data/test/{test_specification.rb → test_objectmodel.rb} +8 -11
- data/test/test_parsers.rb +136 -0
- data/test/test_rake.rb +2 -3
- data/test/{test_reporter.rb → test_reporters.rb} +0 -0
- data/test/test_runners.rb +72 -0
- data/test/test_system.rb +3 -166
- metadata +57 -62
- data/bin/rutema_upgrader +0 -81
- data/distro_test.sh +0 -6
- data/lib/rutema/model.rb +0 -231
- data/lib/rutema/reporters/couchdb.rb +0 -62
- data/lib/rutema/reporters/standard_reporters.rb +0 -7
- data/selftest.sh +0 -2
- data/test/data/sample09.db +0 -0
- data/test/migration.spec +0 -9
- data/test/test_model.rb +0 -62
data/.gemtest
ADDED
File without changes
|
data/History.txt
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
== 1.2.0 /2011-04-01
|
2
|
+
* refactored library structure
|
3
|
+
* More unit tests. We're now over the magical 80% coverage point
|
4
|
+
* Updated gem dependencies for activerecord to the newest version
|
5
|
+
* Deprecated rutemax. The command now is simply rutema (avoids observed confusion). Will remove in 1.3.0
|
1
6
|
== 1.1.3 /2010-12-23
|
2
7
|
* fixed dependency handling of Rutema::RakeTask within the block.
|
3
8
|
== 1.1.2 /2010-12-22
|
data/Manifest.txt
CHANGED
@@ -1,46 +1,51 @@
|
|
1
|
+
bin/rutema
|
2
|
+
bin/rutemax
|
1
3
|
COPYING.txt
|
2
4
|
History.txt
|
3
|
-
Manifest.txt
|
4
|
-
README.txt
|
5
|
-
Rakefile
|
6
|
-
bin/rutemax
|
7
|
-
bin/rutema_upgrader
|
8
|
-
distro_test.sh
|
9
5
|
lib/rutema/configuration.rb
|
6
|
+
lib/rutema/elements/minimal.rb
|
10
7
|
lib/rutema/gems.rb
|
11
|
-
lib/rutema/
|
8
|
+
lib/rutema/models/activerecord.rb
|
9
|
+
lib/rutema/models/base.rb
|
10
|
+
lib/rutema/objectmodel.rb
|
11
|
+
lib/rutema/parsers/base.rb
|
12
|
+
lib/rutema/parsers/xml.rb
|
12
13
|
lib/rutema/rake.rb
|
13
|
-
lib/rutema/reporter.rb
|
14
14
|
lib/rutema/reporters/activerecord.rb
|
15
|
+
lib/rutema/reporters/base.rb
|
15
16
|
lib/rutema/reporters/email.rb
|
16
|
-
lib/rutema/reporters/standard_reporters.rb
|
17
17
|
lib/rutema/reporters/text.rb
|
18
18
|
lib/rutema/reporters/yaml.rb
|
19
|
-
lib/rutema/
|
20
|
-
lib/rutema/
|
19
|
+
lib/rutema/runners/default.rb
|
20
|
+
lib/rutema/runners/step.rb
|
21
21
|
lib/rutema/system.rb
|
22
|
-
|
23
|
-
|
22
|
+
Manifest.txt
|
23
|
+
Rakefile
|
24
|
+
README.md
|
25
|
+
README.txt
|
24
26
|
test/distro_test/config/database.rutema
|
25
27
|
test/distro_test/config/full.rutema
|
26
28
|
test/distro_test/config/minimal.rutema
|
29
|
+
test/distro_test/specs/check.spec
|
30
|
+
test/distro_test/specs/duplicate_name.spec
|
31
|
+
test/distro_test/specs/fail.spec
|
32
|
+
test/distro_test/specs/include.scenario
|
33
|
+
test/distro_test/specs/no_title.spec
|
34
|
+
test/distro_test/specs/sample.spec
|
35
|
+
test/distro_test/specs/setup.spec
|
27
36
|
test/distro_test/specs/T001.spec
|
28
37
|
test/distro_test/specs/T002.spec
|
29
38
|
test/distro_test/specs/T003.spec
|
30
39
|
test/distro_test/specs/T004.spec
|
31
40
|
test/distro_test/specs/T005.spec
|
32
41
|
test/distro_test/specs/T006.spec
|
33
|
-
test/distro_test/specs/
|
34
|
-
test/distro_test/specs/no_title.spec
|
35
|
-
test/distro_test/specs/sample.spec
|
42
|
+
test/distro_test/specs/teardown.spec
|
36
43
|
test/rutema.rutema
|
37
44
|
test/rutema.spec
|
38
|
-
test/
|
45
|
+
test/test_activerecord.rb
|
39
46
|
test/test_configuration.rb
|
40
|
-
test/
|
41
|
-
test/
|
42
|
-
test/
|
47
|
+
test/test_objectmodel.rb
|
48
|
+
test/test_parsers.rb
|
49
|
+
test/test_reporters.rb
|
50
|
+
test/test_runners.rb
|
43
51
|
test/test_system.rb
|
44
|
-
test/test_couchdb.rb
|
45
|
-
test/test_rake.rb
|
46
|
-
|
data/README.md
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
rutema [http://patir.rubyforge.org/rutema](http://patir.rubyforge.org/rutema)
|
2
|
+
|
3
|
+
## DESCRIPTION:
|
4
|
+
rutema is a test execution tool with a twist.
|
5
|
+
It allows you to combine test tools while it takes care of logging, reporting, archiving of results and formalizes execution of automated and manual tests.
|
6
|
+
It's purpose is to make testing in heterogeneous environments easier.
|
7
|
+
|
8
|
+
For more information look at http://patir.rubyforge.org/rutema
|
9
|
+
|
10
|
+
## FEATURES/PROBLEMS:
|
11
|
+
* Unified test execution environment for automated and manual tests
|
12
|
+
* Extensible reports and notifications in various formats (email, rss, pdf, html etc.)
|
13
|
+
* Comprehensive history of test execution
|
14
|
+
* A well defined way to create a project specific test specification format
|
15
|
+
|
16
|
+
## SYNOPSIS:
|
17
|
+
See http://patir.rubyforge.org/rutema/distro_test.html for an introductory example.
|
18
|
+
|
19
|
+
## REQUIREMENTS:
|
20
|
+
* patir (http://patir.rubyforge.org)
|
21
|
+
* mailfactory (http://rubyforge.org/projects/mailfactory/)
|
22
|
+
* activerecord (http://ar.rubyonrails.com/)
|
23
|
+
* sqlite3 (http://rubyforge.org/projects/sqlite-ruby/)
|
24
|
+
* ruport (http://rubyreports.org/)
|
25
|
+
* acts_as_reportable
|
26
|
+
* highline
|
27
|
+
|
28
|
+
## INSTALL:
|
29
|
+
* gem install rutema
|
30
|
+
|
31
|
+
## LICENSE:
|
32
|
+
(The Ruby License)
|
33
|
+
|
34
|
+
rutema is copyright (c) 2007 - 2011 Vassilis Rizopoulos
|
35
|
+
|
36
|
+
You can redistribute it and/or modify it under either the terms of the GPL
|
37
|
+
(see COPYING.txt file), or the conditions below:
|
38
|
+
|
39
|
+
1. You may make and give away verbatim copies of the source form of the
|
40
|
+
software without restriction, provided that you duplicate all of the
|
41
|
+
original copyright notices and associated disclaimers.
|
42
|
+
|
43
|
+
2. You may modify your copy of the software in any way, provided that
|
44
|
+
you do at least ONE of the following:
|
45
|
+
|
46
|
+
a) place your modifications in the Public Domain or otherwise
|
47
|
+
make them Freely Available, such as by posting said
|
48
|
+
modifications to Usenet or an equivalent medium, or by allowing
|
49
|
+
the author to include your modifications in the software.
|
50
|
+
|
51
|
+
b) use the modified software only within your corporation or
|
52
|
+
organization.
|
53
|
+
|
54
|
+
c) rename any non-standard executables so the names do not conflict
|
55
|
+
with standard executables, which must also be provided.
|
56
|
+
|
57
|
+
d) make other distribution arrangements with the author.
|
58
|
+
|
59
|
+
3. You may distribute the software in object code or executable
|
60
|
+
form, provided that you do at least ONE of the following:
|
61
|
+
|
62
|
+
a) distribute the executables and library files of the software,
|
63
|
+
together with instructions (in the manual page or equivalent)
|
64
|
+
on where to get the original distribution.
|
65
|
+
|
66
|
+
b) accompany the distribution with the machine-readable source of
|
67
|
+
the software.
|
68
|
+
|
69
|
+
c) give non-standard executables non-standard names, with
|
70
|
+
instructions on where to get the original software distribution.
|
71
|
+
|
72
|
+
d) make other distribution arrangements with the author.
|
73
|
+
|
74
|
+
4. You may modify and include the part of the software into any other
|
75
|
+
software (possibly commercial). But some files in the distribution
|
76
|
+
are not written by the author, so that they are not under this terms.
|
77
|
+
|
78
|
+
They are gc.c(partly), utils.c(partly), regex.[ch], st.[ch] and some
|
79
|
+
files under the ./missing directory. See each file for the copying
|
80
|
+
condition.
|
81
|
+
|
82
|
+
5. The scripts and library files supplied as input to or produced as
|
83
|
+
output from the software do not automatically fall under the
|
84
|
+
copyright of the software, but belong to whomever generated them,
|
85
|
+
and may be sold commercially, and may be aggregated with this
|
86
|
+
software.
|
87
|
+
|
88
|
+
6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
|
89
|
+
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
90
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
91
|
+
PURPOSE.
|
data/README.txt
CHANGED
@@ -10,7 +10,6 @@ For more information look at http://patir.rubyforge.org/rutema
|
|
10
10
|
== FEATURES/PROBLEMS:
|
11
11
|
* Unified test execution environment for automated and manual tests
|
12
12
|
* Extensible reports and notifications in various formats (email, rss, pdf, html etc.)
|
13
|
-
* Web frontend and command line report generation tools for browsing the test results database (with rutemaweb)
|
14
13
|
* Comprehensive history of test execution
|
15
14
|
* A well defined way to create a project specific test specification format
|
16
15
|
|
@@ -32,7 +31,7 @@ See http://patir.rubyforge.org/rutema/distro_test.html for an introductory examp
|
|
32
31
|
== LICENSE:
|
33
32
|
(The Ruby License)
|
34
33
|
|
35
|
-
rutema is copyright (c) 2007 -
|
34
|
+
rutema is copyright (c) 2007 - 2011 Vassilis Rizopoulos
|
36
35
|
|
37
36
|
You can redistribute it and/or modify it under either the terms of the GPL
|
38
37
|
(see COPYING.txt file), or the conditions below:
|
@@ -89,11 +88,4 @@ You can redistribute it and/or modify it under either the terms of the GPL
|
|
89
88
|
6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
|
90
89
|
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
91
90
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
92
|
-
PURPOSE.
|
93
|
-
|
94
|
-
== CREDITS
|
95
|
-
RutemaWeb uses icons from
|
96
|
-
Fast Icon (Dirceu Veiga)
|
97
|
-
Homepage: http://www.fasticon.com
|
98
|
-
The page design used is an adaptation of RedTie, a design found in www.oswd.org
|
99
|
-
Homepage: http://www.oswd.org/design/preview/id/3699
|
91
|
+
PURPOSE.
|
data/Rakefile
CHANGED
@@ -2,29 +2,26 @@
|
|
2
2
|
# -*- ruby -*-
|
3
3
|
$:.unshift File.join(File.dirname(__FILE__),"lib")
|
4
4
|
$:.unshift File.join(File.dirname(__FILE__),"ext")
|
5
|
+
require 'rutema/system'
|
5
6
|
require 'rubygems'
|
6
|
-
require 'rutema/gems'
|
7
7
|
require 'hoe'
|
8
|
-
require 'rutema/system'
|
9
|
-
|
10
8
|
Hoe.spec('rutema') do |p|
|
11
9
|
p.version=Rutema::Version::STRING
|
12
10
|
p.rubyforge_name = 'patir'
|
13
11
|
p.author = "Vassilis Rizopoulos"
|
14
12
|
p.email = "riva@braveworld.net"
|
15
13
|
p.summary = 'rutema is a test execution and management framework for heterogeneous testing environments'
|
16
|
-
p.description = p.paragraphs_of('README.
|
17
|
-
p.url =
|
14
|
+
p.description = p.paragraphs_of('README.md', 1..5).join("\n\n")
|
15
|
+
p.url = "http://patir.rubyforge.org/rutema"
|
18
16
|
p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
|
19
17
|
p.extra_deps<<['patir',">=0.6.4"]
|
20
18
|
p.extra_deps<<['highline','1.5.2']
|
21
19
|
p.extra_deps<<['mailfactory','1.4.0']
|
22
|
-
p.extra_deps<<['activerecord','
|
20
|
+
p.extra_deps<<['activerecord','3.0.5']
|
23
21
|
p.extra_deps<<['ruport','1.6.3']
|
24
22
|
p.extra_deps<<['acts_as_reportable','1.1.1']
|
25
|
-
p.extra_deps<<['couchrest','=0.
|
26
|
-
p.spec_extras={:executables=>["rutemax","
|
27
|
-
:default_executable=>"rutemax"}
|
23
|
+
#p.extra_deps<<['couchrest','=1.0.1']
|
24
|
+
p.spec_extras={:executables=>["rutemax","rutema"],:default_executable=>"rutema"}
|
28
25
|
end
|
29
26
|
|
30
27
|
# vim: syntax=Ruby
|
data/bin/rutema
ADDED
data/bin/rutemax
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
# Copyright (c) 2007-2010 Vassilis Rizopoulos. All rights reserved.
|
2
|
+
require 'rubygems'
|
2
3
|
require 'rutema/gems'
|
3
4
|
require 'rutema/system'
|
4
5
|
begin
|
6
|
+
puts "rutemax is deprecated and will be removed in the near future, use rutema instead"
|
5
7
|
Rutema::RutemaX.new(ARGV)
|
6
8
|
rescue
|
7
9
|
exit 1
|
data/lib/rutema/configuration.rb
CHANGED
@@ -2,18 +2,17 @@
|
|
2
2
|
$:.unshift File.join(File.dirname(__FILE__),"..")
|
3
3
|
|
4
4
|
module Rutema
|
5
|
-
#This module defines the "configuration directives" used in the configuration of
|
5
|
+
#This module defines the "configuration directives" used in the configuration of Rutema
|
6
6
|
#
|
7
7
|
#Example
|
8
8
|
#A configuration file needs as a minimum to define which parser to use and which tests to run.
|
9
9
|
#
|
10
10
|
#Since rutema configuration files are valid Ruby code, you can use the full power of the Ruby language including require directives
|
11
11
|
#
|
12
|
-
# require 'rubygems'
|
13
12
|
# require 'rake'
|
14
13
|
# configuration.parser={:class=>Rutema::MinimalXMLParser}
|
15
14
|
# configuration.tests=FileList['all/of/the/tests/**/*.*']
|
16
|
-
module
|
15
|
+
module RutemaConfiguration
|
17
16
|
#Adds a hash of values to the tools hash of the configuration
|
18
17
|
#
|
19
18
|
#This hash is then accessible in the parser and reporters as a property of the configuration instance
|
@@ -79,7 +78,7 @@ module Rutema
|
|
79
78
|
end
|
80
79
|
end
|
81
80
|
|
82
|
-
#Adds the files to the specifications available to
|
81
|
+
#Adds the files to the specifications available to Rutema.
|
83
82
|
def tests= array_of_files
|
84
83
|
@tests||=Array.new
|
85
84
|
@tests+=array_of_files
|
@@ -124,11 +123,11 @@ module Rutema
|
|
124
123
|
end
|
125
124
|
end
|
126
125
|
|
127
|
-
#This class reads a
|
126
|
+
#This class reads a Rutema configuration file
|
128
127
|
#
|
129
|
-
#See Rutema::
|
130
|
-
class
|
131
|
-
include
|
128
|
+
#See Rutema::RutemaConfiguration for configuration examples and directives
|
129
|
+
class RutemaConfigurator<Patir::Configurator
|
130
|
+
include RutemaConfiguration
|
132
131
|
def initialize config_file,logger=nil
|
133
132
|
@reporters=Array.new
|
134
133
|
@context=Hash.new
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Copyright (c) 2007-2011 Vassilis Rizopoulos. All rights reserved.
|
2
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','..')
|
3
|
+
module Rutema
|
4
|
+
#The Elements module provides the namespace for the various modules adding parser functionality
|
5
|
+
module Elements
|
6
|
+
#Minimal offers a minimal(chic) set of elements for use in specifications
|
7
|
+
#
|
8
|
+
#These are:
|
9
|
+
# echo
|
10
|
+
# command
|
11
|
+
# prompt
|
12
|
+
module Minimal
|
13
|
+
#echo prints a message on the screen:
|
14
|
+
# <echo text="A meaningful message"/>
|
15
|
+
# <echo>A meaningful message</echo>
|
16
|
+
def element_echo step
|
17
|
+
step.cmd=Patir::RubyCommand.new("echo"){|cmd| cmd.error="";cmd.output="#{step.text}";$stdout.puts(cmd.output) ;:success}
|
18
|
+
end
|
19
|
+
#prompt asks the user a yes/no question. Answering yes means the step is succesful.
|
20
|
+
# <prompt text="Do you want fries with that?"/>
|
21
|
+
#
|
22
|
+
#A prompt element automatically makes a specification "attended"
|
23
|
+
def element_prompt step
|
24
|
+
step.attended=true
|
25
|
+
step.cmd=Patir::RubyCommand.new("prompt") do |cmd|
|
26
|
+
cmd.output=""
|
27
|
+
cmd.error=""
|
28
|
+
if HighLine.new.agree("#{step.text}")
|
29
|
+
step.output="y"
|
30
|
+
else
|
31
|
+
raise "n"
|
32
|
+
end#if
|
33
|
+
end#do rubycommand
|
34
|
+
end
|
35
|
+
#command executes a shell command
|
36
|
+
# <command cmd="useful_command.exe with parameters", working_directory="some/directory"/>
|
37
|
+
def element_command step
|
38
|
+
raise ParserError,"missing required attribute cmd in #{step}" unless step.has_cmd?
|
39
|
+
wd=Dir.pwd
|
40
|
+
wd=step.working_directory if step.has_working_directory?
|
41
|
+
step.cmd=Patir::ShellCommand.new(:cmd=>step.cmd,:working_directory=>File.expand_path(wd))
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/rutema/gems.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
gem 'activerecord','
|
1
|
+
gem 'activerecord','3.0.5'
|
2
2
|
gem 'patir',">=0.6.4"
|
3
|
-
gem '
|
4
|
-
gem '
|
3
|
+
gem 'ruport','=1.6.3'
|
4
|
+
gem 'acts_as_reportable','>=1.1.1'
|
@@ -0,0 +1,164 @@
|
|
1
|
+
# Copyright (c) 2007-2010 Vassilis Rizopoulos. All rights reserved.
|
2
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','..')
|
3
|
+
require 'rutema/models/base'
|
4
|
+
require 'active_record'
|
5
|
+
require 'ruport/acts_as_reportable'
|
6
|
+
|
7
|
+
#this fixes the AR Logger hack that annoys me sooooo much
|
8
|
+
class Logger
|
9
|
+
private
|
10
|
+
def format_message(severity, datetime, progname, msg)
|
11
|
+
(@formatter || @default_formatter).call(severity, datetime, progname, msg)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
module Rutema
|
15
|
+
module ActiveRecord
|
16
|
+
#This is the schema for the AR database used to store test results
|
17
|
+
#
|
18
|
+
#We store the RutemaConfiguration#context for every run so that reports for past runs can be recreated without running the actual tests again.
|
19
|
+
class Schema< ::ActiveRecord::Migration
|
20
|
+
def self.up
|
21
|
+
create_table :runs do |t|
|
22
|
+
t.column :context, :string
|
23
|
+
end
|
24
|
+
|
25
|
+
create_table :scenarios do |t|
|
26
|
+
t.column :name, :string, :null=>false
|
27
|
+
t.column :run_id,:integer, :null=>false
|
28
|
+
t.column :attended,:bool, :null=>false
|
29
|
+
t.column :status, :string,:null=>false
|
30
|
+
t.column :number,:integer
|
31
|
+
t.column :start_time, :datetime,:null=>false
|
32
|
+
t.column :stop_time, :datetime
|
33
|
+
t.column :version, :string
|
34
|
+
t.column :title, :string
|
35
|
+
t.column :description, :string
|
36
|
+
end
|
37
|
+
|
38
|
+
create_table :steps do |t|
|
39
|
+
t.column :scenario_id,:integer, :null=>false
|
40
|
+
t.column :name, :string
|
41
|
+
t.column :number, :integer,:null=>false
|
42
|
+
t.column :status, :string,:null=>false
|
43
|
+
t.column :output, :text
|
44
|
+
t.column :error, :text
|
45
|
+
t.column :duration, :decimal
|
46
|
+
end
|
47
|
+
|
48
|
+
create_table :parse_errors do |t|
|
49
|
+
t.column :filename, :string,:null=>false
|
50
|
+
t.column :error, :string
|
51
|
+
t.column :run_id,:integer, :null=>false
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
class Run< ::ActiveRecord::Base
|
56
|
+
has_many :scenarios
|
57
|
+
has_many :parse_errors
|
58
|
+
serialize :context
|
59
|
+
acts_as_reportable
|
60
|
+
end
|
61
|
+
class Scenario< ::ActiveRecord::Base
|
62
|
+
belongs_to :run
|
63
|
+
has_many :steps
|
64
|
+
acts_as_reportable
|
65
|
+
end
|
66
|
+
class Step< ::ActiveRecord::Base
|
67
|
+
belongs_to :scenario
|
68
|
+
acts_as_reportable
|
69
|
+
end
|
70
|
+
class ParseError< ::ActiveRecord::Base
|
71
|
+
belongs_to :run
|
72
|
+
acts_as_reportable
|
73
|
+
end
|
74
|
+
#Exports the contents of the database/model as a yaml dump
|
75
|
+
class Export
|
76
|
+
def initialize params
|
77
|
+
@logger = params[:logger]
|
78
|
+
@logger ||= Patir.setup_logger
|
79
|
+
@result_set_size = params[:result_set_size]
|
80
|
+
@result_set_size ||= 1000
|
81
|
+
@currently_on_no=0
|
82
|
+
database_configuration = params[:db]
|
83
|
+
raise "No database configuration defined, missing :db configuration key." unless database_configuration
|
84
|
+
ActiveRecord.connect(database_configuration,@logger)
|
85
|
+
end
|
86
|
+
def next
|
87
|
+
@logger.info("Found #{Run.count} runs") if @currently_on_no==0
|
88
|
+
@logger.info("Exporting from #{@currently_on_no} to #{@currently_on_no+@result_set_size}")
|
89
|
+
export(@result_set_size)
|
90
|
+
end
|
91
|
+
def all
|
92
|
+
@logger.info("Found #{Run.count} runs")
|
93
|
+
export(nil)
|
94
|
+
end
|
95
|
+
private
|
96
|
+
def export offset=nil
|
97
|
+
if offset
|
98
|
+
runs=Run.find(:all,:order=>"id ASC",:limit=>@result_set_size,:offset=>@currently_on_no)
|
99
|
+
@currently_on_no+=offset
|
100
|
+
else
|
101
|
+
runs=Run.find(:all)
|
102
|
+
end
|
103
|
+
return nil if runs.empty?
|
104
|
+
export=[]
|
105
|
+
runs.each do |run|
|
106
|
+
e={:parse_errors=>[],:scenarios=>[],:context=>run.context}
|
107
|
+
run.parse_errors.each { |pe| e[:parse_errors]<<{:filename=>pe.filename, :error=>pe.error} }
|
108
|
+
run.scenarios.each { |sc| e[:scenarios]<<export_scenario(sc) }
|
109
|
+
export<<e
|
110
|
+
@logger.debug("Exported #{run.id}")
|
111
|
+
end
|
112
|
+
return export
|
113
|
+
end
|
114
|
+
def export_scenario sc
|
115
|
+
scenario={:name=>sc[:name],
|
116
|
+
:attended=>sc[:attended],
|
117
|
+
:status=>sc[:status],
|
118
|
+
:number=>sc[:number],
|
119
|
+
:start_time=>sc[:start_time],
|
120
|
+
:stop_time=>sc[:stop_time],
|
121
|
+
:version=>sc[:version],
|
122
|
+
:title=>sc[:title],
|
123
|
+
:description=>sc[:description],
|
124
|
+
:steps=>[]
|
125
|
+
}
|
126
|
+
sc.steps.each do |step|
|
127
|
+
st={:name=>step[:name],
|
128
|
+
:number=>step[:number],
|
129
|
+
:status=>step[:status],
|
130
|
+
:output=>step[:output],
|
131
|
+
:error=>step[:error],
|
132
|
+
:duration=>step[:duration]
|
133
|
+
}
|
134
|
+
scenario[:steps]<<st
|
135
|
+
end
|
136
|
+
return scenario
|
137
|
+
end
|
138
|
+
end
|
139
|
+
#Establishes an ActiveRecord connection
|
140
|
+
def self.connect cfg,logger
|
141
|
+
conn=cnct(cfg,logger)
|
142
|
+
Schema.migrate(:up) if perform_migration?(cfg)
|
143
|
+
end
|
144
|
+
private
|
145
|
+
#Establishes an active record connection using the cfg hash
|
146
|
+
#There is only a rudimentary check to ensure the integrity of cfg
|
147
|
+
def self.cnct cfg,logger
|
148
|
+
if cfg[:adapter] && cfg[:database]
|
149
|
+
logger.debug("Connecting to #{cfg[:database]}")
|
150
|
+
return ::ActiveRecord::Base.establish_connection(cfg)
|
151
|
+
else
|
152
|
+
raise Rutema::ConnectionError,"Erroneous database configuration. Missing :adapter and/or :database"
|
153
|
+
end
|
154
|
+
end
|
155
|
+
def self.perform_migration? cfg
|
156
|
+
return true if cfg[:migrate]
|
157
|
+
#special case for sqlite3
|
158
|
+
if cfg[:adapter]=="sqlite3" && !File.exists?(cfg[:database])
|
159
|
+
return true
|
160
|
+
end
|
161
|
+
return false
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|