soda 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/lib/FieldUtils.rb +102 -0
- data/lib/Soda.rb +2628 -0
- data/lib/SodaCSV.rb +88 -0
- data/lib/SodaFireFox.rb +118 -0
- data/lib/SodaLogReporter.rb +810 -0
- data/lib/SodaReportSummery.rb +470 -0
- data/lib/SodaReporter.rb +452 -0
- data/lib/SodaTestCheck.rb +347 -0
- data/lib/SodaUtils.rb +931 -0
- data/lib/SodaXML.rb +129 -0
- data/lib/fields/CheckBoxField.rb +87 -0
- data/lib/fields/FileField.rb +37 -0
- data/lib/fields/LiField.rb +40 -0
- data/lib/fields/RadioField.rb +44 -0
- data/lib/fields/SelectField.rb +59 -0
- data/lib/fields/SodaField.rb +363 -0
- data/lib/fields/TextField.rb +31 -0
- data/lib/soda.rb +2 -0
- data/lib/utils/sodalookups.rb +465 -0
- metadata +114 -0
data/lib/SodaXML.rb
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
###############################################################################
|
2
|
+
# Copyright (c) 2010, SugarCRM, Inc.
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
# * Redistributions of source code must retain the above copyright
|
8
|
+
# notice, this list of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright
|
10
|
+
# notice, this list of conditions and the following disclaimer in the
|
11
|
+
# documentation and/or other materials provided with the distribution.
|
12
|
+
# * Neither the name of SugarCRM, Inc. nor the
|
13
|
+
# names of its contributors may be used to endorse or promote products
|
14
|
+
# derived from this software without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
19
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL SugarCRM, Inc. BE LIABLE FOR ANY
|
20
|
+
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
21
|
+
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
22
|
+
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
23
|
+
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
24
|
+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25
|
+
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
###############################################################################
|
27
|
+
|
28
|
+
###############################################################################
|
29
|
+
# Needed Ruby libs:
|
30
|
+
###############################################################################
|
31
|
+
require 'rubygems'
|
32
|
+
require 'libxml'
|
33
|
+
require 'SodaUtils'
|
34
|
+
|
35
|
+
###############################################################################
|
36
|
+
# SodaXML -- Class
|
37
|
+
# This class converts XML documents into Soda Meta Data.
|
38
|
+
# A valid Soda XML file always should start with <soda> and end with </soda>
|
39
|
+
#
|
40
|
+
###############################################################################
|
41
|
+
class SodaXML
|
42
|
+
attr_accessor :doc
|
43
|
+
|
44
|
+
###############################################################################
|
45
|
+
# processChildren -- Method
|
46
|
+
# This method walks through the node and converts it into Soda Markup
|
47
|
+
# *Tag(node) names indicate what action to take
|
48
|
+
# *attributes are mapped directly over
|
49
|
+
# *child nodes map to the children attribute
|
50
|
+
#
|
51
|
+
# Params:
|
52
|
+
# node: This is the root doc from the XML parser from a soda file.
|
53
|
+
#
|
54
|
+
# Results:
|
55
|
+
# retutns an array of hashes.
|
56
|
+
#
|
57
|
+
###############################################################################
|
58
|
+
def processChildren(node)
|
59
|
+
children = []
|
60
|
+
|
61
|
+
for child in node.children()
|
62
|
+
if (child.name == 'text')
|
63
|
+
next
|
64
|
+
end
|
65
|
+
|
66
|
+
cur = Hash.new()
|
67
|
+
cur['line_number'] = "#{child.line_num}"
|
68
|
+
cur['do'] = "#{child.name}"
|
69
|
+
|
70
|
+
case child.name
|
71
|
+
when /javascript/i
|
72
|
+
cur['content'] = child.content
|
73
|
+
when /ruby/i
|
74
|
+
cur['content'] = child.content
|
75
|
+
when /comment/i
|
76
|
+
cur['content'] = child.content
|
77
|
+
when /whitelist/i
|
78
|
+
cur['content'] = child.content
|
79
|
+
end
|
80
|
+
|
81
|
+
child.attributes.each do | attribute |
|
82
|
+
cur[attribute.name] = "#{attribute.value}"
|
83
|
+
end
|
84
|
+
|
85
|
+
if child.children?()
|
86
|
+
cur['children'] = self.processChildren(child)
|
87
|
+
end
|
88
|
+
|
89
|
+
children.push(cur)
|
90
|
+
end
|
91
|
+
|
92
|
+
return children
|
93
|
+
end
|
94
|
+
|
95
|
+
###############################################################################
|
96
|
+
# parse -- Method
|
97
|
+
# This methos parses the XML document and returns Soda markup.
|
98
|
+
#
|
99
|
+
# Params:
|
100
|
+
# file: The soda XML file to parse into soda meta data.
|
101
|
+
#
|
102
|
+
# Results:
|
103
|
+
# returns an array of hashes from the processChildren method.
|
104
|
+
#
|
105
|
+
###############################################################################
|
106
|
+
def parse(file)
|
107
|
+
data = nil
|
108
|
+
parser = nil
|
109
|
+
doc = nil
|
110
|
+
|
111
|
+
begin
|
112
|
+
LibXML::XML.default_line_numbers = true
|
113
|
+
parser = LibXML::XML::Parser.file(file)
|
114
|
+
doc = parser.parse()
|
115
|
+
data = processChildren(doc.root)
|
116
|
+
rescue Exception => e
|
117
|
+
$curSoda.rep.log("Failed to parse XML file: \"#{file}\"!\n",
|
118
|
+
SodaUtils::ERROR)
|
119
|
+
$curSoda.rep.ReportException(e, true, file)
|
120
|
+
|
121
|
+
data = nil
|
122
|
+
ensure
|
123
|
+
# make sure this exception doesn't make it up to the soda level #
|
124
|
+
end
|
125
|
+
|
126
|
+
return data
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
@@ -0,0 +1,87 @@
|
|
1
|
+
###############################################################################
|
2
|
+
# Copyright (c) 2010, SugarCRM, Inc.
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
# * Redistributions of source code must retain the above copyright
|
8
|
+
# notice, this list of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright
|
10
|
+
# notice, this list of conditions and the following disclaimer in the
|
11
|
+
# documentation and/or other materials provided with the distribution.
|
12
|
+
# * Neither the name of SugarCRM, Inc. nor the
|
13
|
+
# names of its contributors may be used to endorse or promote products
|
14
|
+
# derived from this software without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
19
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL SugarCRM, Inc. BE LIABLE FOR ANY
|
20
|
+
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
21
|
+
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
22
|
+
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
23
|
+
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
24
|
+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25
|
+
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
###############################################################################
|
27
|
+
|
28
|
+
###############################################################################
|
29
|
+
# SodaCheckBoxField -- Class
|
30
|
+
# This is a simple class for dealing with Checkbox fields.
|
31
|
+
#
|
32
|
+
###############################################################################
|
33
|
+
class SodaCheckBoxField < SodaField
|
34
|
+
|
35
|
+
###############################################################################
|
36
|
+
# set -- Method
|
37
|
+
# This sets the value for a given field.
|
38
|
+
#
|
39
|
+
# Params:
|
40
|
+
# field: The field to set a value on.
|
41
|
+
# value: The value to set.
|
42
|
+
#
|
43
|
+
# Results:
|
44
|
+
#
|
45
|
+
###############################################################################
|
46
|
+
def self.set(field, value)
|
47
|
+
result = 0
|
48
|
+
|
49
|
+
if (!field.enabled?)
|
50
|
+
$curSoda.rep.ReportFailure(
|
51
|
+
"Error: Trying to set a value for a disabled Element!\n")
|
52
|
+
else
|
53
|
+
value = self.getStringTrue(value)
|
54
|
+
field.set(value)
|
55
|
+
result = 0
|
56
|
+
end
|
57
|
+
|
58
|
+
return result
|
59
|
+
end
|
60
|
+
|
61
|
+
###############################################################################
|
62
|
+
# assert -- Method
|
63
|
+
#
|
64
|
+
#
|
65
|
+
#
|
66
|
+
###############################################################################
|
67
|
+
def self.assert(field, value)
|
68
|
+
result = nil
|
69
|
+
|
70
|
+
if (value.kind_of? Regexp)
|
71
|
+
$curSoda.rep.log("Warning: Regex does not work on checkbox fields\n")
|
72
|
+
end
|
73
|
+
|
74
|
+
value = self.getStringTrue(value)
|
75
|
+
$curSoda.rep.log("Field Value: #{field.checked?()}\n")
|
76
|
+
|
77
|
+
if (value)
|
78
|
+
result = field.checked?()
|
79
|
+
else
|
80
|
+
result = !field.checked?()
|
81
|
+
end
|
82
|
+
|
83
|
+
return result
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
###############################################################################
|
2
|
+
# Copyright (c) 2010, SugarCRM, Inc.
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
# * Redistributions of source code must retain the above copyright
|
8
|
+
# notice, this list of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright
|
10
|
+
# notice, this list of conditions and the following disclaimer in the
|
11
|
+
# documentation and/or other materials provided with the distribution.
|
12
|
+
# * Neither the name of SugarCRM, Inc. nor the
|
13
|
+
# names of its contributors may be used to endorse or promote products
|
14
|
+
# derived from this software without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
19
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL SugarCRM, Inc. BE LIABLE FOR ANY
|
20
|
+
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
21
|
+
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
22
|
+
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
23
|
+
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
24
|
+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25
|
+
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
###############################################################################
|
27
|
+
|
28
|
+
###############################################################################
|
29
|
+
# SodaFileField -- Class
|
30
|
+
# This is just an empty class...
|
31
|
+
#
|
32
|
+
#
|
33
|
+
###############################################################################
|
34
|
+
class SodaFileField < SodaField
|
35
|
+
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
###############################################################################
|
2
|
+
# Copyright (c) 2010, SugarCRM, Inc.
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
# * Redistributions of source code must retain the above copyright
|
8
|
+
# notice, this list of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright
|
10
|
+
# notice, this list of conditions and the following disclaimer in the
|
11
|
+
# documentation and/or other materials provided with the distribution.
|
12
|
+
# * Neither the name of SugarCRM, Inc. nor the
|
13
|
+
# names of its contributors may be used to endorse or promote products
|
14
|
+
# derived from this software without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
19
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL SugarCRM, Inc. BE LIABLE FOR ANY
|
20
|
+
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
21
|
+
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
22
|
+
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
23
|
+
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
24
|
+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25
|
+
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
###############################################################################
|
27
|
+
|
28
|
+
class SodaLiField < SodaField
|
29
|
+
|
30
|
+
def self.assert(field, value)
|
31
|
+
comp = "#{field.text}"
|
32
|
+
|
33
|
+
if (comp =~ /#{value}/)
|
34
|
+
return true
|
35
|
+
else
|
36
|
+
return false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
###############################################################################
|
2
|
+
# Copyright (c) 2010, SugarCRM, Inc.
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
# * Redistributions of source code must retain the above copyright
|
8
|
+
# notice, this list of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright
|
10
|
+
# notice, this list of conditions and the following disclaimer in the
|
11
|
+
# documentation and/or other materials provided with the distribution.
|
12
|
+
# * Neither the name of SugarCRM, Inc. nor the
|
13
|
+
# names of its contributors may be used to endorse or promote products
|
14
|
+
# derived from this software without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
19
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL SugarCRM, Inc. BE LIABLE FOR ANY
|
20
|
+
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
21
|
+
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
22
|
+
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
23
|
+
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
24
|
+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25
|
+
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
###############################################################################
|
27
|
+
|
28
|
+
class SodaRadioField < SodaCheckBoxField
|
29
|
+
|
30
|
+
def self.set(field, value)
|
31
|
+
result = 0
|
32
|
+
if (!field.enabled?)
|
33
|
+
result = -1
|
34
|
+
$curSoda.rep.ReportFailure(
|
35
|
+
"Error: Trying to set value for a disabled Element!\n")
|
36
|
+
else
|
37
|
+
field.set()
|
38
|
+
result = 0
|
39
|
+
end
|
40
|
+
|
41
|
+
return result
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
###############################################################################
|
2
|
+
# Copyright (c) 2010, SugarCRM, Inc.
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
# * Redistributions of source code must retain the above copyright
|
8
|
+
# notice, this list of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright
|
10
|
+
# notice, this list of conditions and the following disclaimer in the
|
11
|
+
# documentation and/or other materials provided with the distribution.
|
12
|
+
# * Neither the name of SugarCRM, Inc. nor the
|
13
|
+
# names of its contributors may be used to endorse or promote products
|
14
|
+
# derived from this software without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
19
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL SugarCRM, Inc. BE LIABLE FOR ANY
|
20
|
+
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
21
|
+
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
22
|
+
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
23
|
+
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
24
|
+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25
|
+
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
###############################################################################
|
27
|
+
|
28
|
+
class SodaSelectField < SodaField
|
29
|
+
|
30
|
+
def self.set(field, value)
|
31
|
+
result = 0
|
32
|
+
|
33
|
+
if (!field.enabled?)
|
34
|
+
result = -1
|
35
|
+
$curSoda.rep.ReportFailure(
|
36
|
+
"Error: Trying to set a value for a disabled Element!\n")
|
37
|
+
else
|
38
|
+
begin
|
39
|
+
field.select(value)
|
40
|
+
result = 0
|
41
|
+
rescue
|
42
|
+
field.select_value(value)
|
43
|
+
result = 0
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
return result
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.assert(field, value)
|
51
|
+
return field.selected?(value)
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.getAllContents(field)
|
55
|
+
return field.getAllContents
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
@@ -0,0 +1,363 @@
|
|
1
|
+
###############################################################################
|
2
|
+
# Copyright (c) 2010, SugarCRM, Inc.
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
# * Redistributions of source code must retain the above copyright
|
8
|
+
# notice, this list of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright
|
10
|
+
# notice, this list of conditions and the following disclaimer in the
|
11
|
+
# documentation and/or other materials provided with the distribution.
|
12
|
+
# * Neither the name of SugarCRM, Inc. nor the
|
13
|
+
# names of its contributors may be used to endorse or promote products
|
14
|
+
# derived from this software without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
19
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL SugarCRM, Inc. BE LIABLE FOR ANY
|
20
|
+
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
21
|
+
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
22
|
+
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
23
|
+
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
24
|
+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25
|
+
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
###############################################################################
|
27
|
+
|
28
|
+
###############################################################################
|
29
|
+
# SodaField -- Class
|
30
|
+
#
|
31
|
+
#
|
32
|
+
#
|
33
|
+
#
|
34
|
+
###############################################################################
|
35
|
+
class SodaField
|
36
|
+
|
37
|
+
require 'FieldUtils'
|
38
|
+
|
39
|
+
###############################################################################
|
40
|
+
#
|
41
|
+
###############################################################################
|
42
|
+
def self.assert(field, value)
|
43
|
+
comp = (!field.value.empty?)? field.value: field.text
|
44
|
+
$curSoda.rep.log("Field Value: #{field.value}\n")
|
45
|
+
if value.kind_of? Regexp
|
46
|
+
return value.match(comp)
|
47
|
+
end
|
48
|
+
return value == comp
|
49
|
+
end
|
50
|
+
|
51
|
+
###############################################################################
|
52
|
+
# jsevent - Method
|
53
|
+
# THis method fires a javascript event.
|
54
|
+
#
|
55
|
+
# Params:
|
56
|
+
# field: The field to fire the event on.
|
57
|
+
# jsevent: The event to fire: onmoseover...
|
58
|
+
#
|
59
|
+
# Results:
|
60
|
+
# None.
|
61
|
+
#
|
62
|
+
###############################################################################
|
63
|
+
def self.jsevent(field, jsevent, wait = true)
|
64
|
+
info = nil
|
65
|
+
elm_type = nil
|
66
|
+
msg = "Firing JavaScript Event: '#{jsevent}' for Element: "
|
67
|
+
|
68
|
+
begin
|
69
|
+
tmp = FieldUtils.WatirFieldToStr(field, $curSoda.rep)
|
70
|
+
tmp = "Unknown" if (tmp == nil)
|
71
|
+
$curSoda.rep.log("#{msg}#{tmp}.\n")
|
72
|
+
|
73
|
+
if (Watir::Browser.default !~ /ie/i)
|
74
|
+
self.focus(field)
|
75
|
+
end
|
76
|
+
|
77
|
+
field.fire_event("#{jsevent}", wait)
|
78
|
+
rescue Exception => e
|
79
|
+
$curSoda.rep.ReportException(e, true)
|
80
|
+
ensure
|
81
|
+
end
|
82
|
+
|
83
|
+
$curSoda.rep.log("JavaScript Event finished.\n")
|
84
|
+
end
|
85
|
+
|
86
|
+
###############################################################################
|
87
|
+
#
|
88
|
+
###############################################################################
|
89
|
+
def self.uploadFile(fieldname, file)
|
90
|
+
$curSoda.file_field(:value, fieldname).set(file)
|
91
|
+
end
|
92
|
+
|
93
|
+
###############################################################################
|
94
|
+
# set -- Method
|
95
|
+
# This method sets the value for the field. Checks to make sure that the
|
96
|
+
# field is enabled before trying to set.
|
97
|
+
#
|
98
|
+
# Params:
|
99
|
+
# field: this is the watir object for the field.
|
100
|
+
# value: The vale to set the field to.
|
101
|
+
#
|
102
|
+
# Results:
|
103
|
+
# returns 0 on success, or -1 on error
|
104
|
+
#
|
105
|
+
###############################################################################
|
106
|
+
def self.set(field, value)
|
107
|
+
result = 0
|
108
|
+
msg = "Setting Element: "
|
109
|
+
|
110
|
+
begin
|
111
|
+
tmp = FieldUtils.WatirFieldToStr(field, $curSoda.rep)
|
112
|
+
tmp = "Unknown" if (tmp == nil)
|
113
|
+
$curSoda.rep.log("#{msg}#{tmp}: Value => '#{value}'.\n")
|
114
|
+
|
115
|
+
if (!field.enabled?)
|
116
|
+
$curSoda.rep.ReportFailure(
|
117
|
+
"Error: Trying to set a value for a disabled Element!\n")
|
118
|
+
result = -1
|
119
|
+
else
|
120
|
+
field.set(value)
|
121
|
+
result = 0
|
122
|
+
end
|
123
|
+
rescue Exception => e
|
124
|
+
$curSoda.rep.ReportException(e, true)
|
125
|
+
result = -1
|
126
|
+
ensure
|
127
|
+
end
|
128
|
+
|
129
|
+
return result
|
130
|
+
end
|
131
|
+
|
132
|
+
###############################################################################
|
133
|
+
# append -- Method:
|
134
|
+
# This method appends a value to the existing value for a watir text
|
135
|
+
# field. Checks that the field is enabled before appending.
|
136
|
+
#
|
137
|
+
# Params:
|
138
|
+
# field: this is the watir object for the field.
|
139
|
+
# value: this is the vale to append to the field.
|
140
|
+
#
|
141
|
+
# Results:
|
142
|
+
# returns -1 on error, or 0 on success.
|
143
|
+
#
|
144
|
+
###############################################################################
|
145
|
+
def self.append(field, value)
|
146
|
+
result = 0
|
147
|
+
msg = "Appending to Element: "
|
148
|
+
|
149
|
+
begin
|
150
|
+
tmp = FieldUtils.WatirFieldToStr(field, $curSoda.rep)
|
151
|
+
tmp = "Unknown" if (tmp == nil)
|
152
|
+
$curSoda.rep.log("#{msg}#{tmp}: Value => '#{value}'.\n")
|
153
|
+
|
154
|
+
if (!field.enabled?)
|
155
|
+
$curSoda.rep.ReportFailure(
|
156
|
+
"Error: Trying to set a value for a disabled Element!\n")
|
157
|
+
result = -1
|
158
|
+
else
|
159
|
+
field.append(value)
|
160
|
+
result = 0
|
161
|
+
end
|
162
|
+
rescue Exception => e
|
163
|
+
$curSoda.rep.ReportException(e, true)
|
164
|
+
result = -1
|
165
|
+
ensure
|
166
|
+
end
|
167
|
+
|
168
|
+
$curSoda.rep.log("Append finished.\n")
|
169
|
+
|
170
|
+
return result
|
171
|
+
end
|
172
|
+
|
173
|
+
###############################################################################
|
174
|
+
# alertHack -- Method
|
175
|
+
# This method auto answers java alerts & confirms.
|
176
|
+
#
|
177
|
+
# Input: alert: true or false, to cancel or ok dialog.
|
178
|
+
#
|
179
|
+
# Output: always retutns true.
|
180
|
+
#
|
181
|
+
###############################################################################
|
182
|
+
def self.alertHack(alert = nil, modify = true)
|
183
|
+
if (alert == nil)
|
184
|
+
return true
|
185
|
+
end
|
186
|
+
|
187
|
+
begin
|
188
|
+
if (modify)
|
189
|
+
if (Watir::Browser.default == 'firefox')
|
190
|
+
alertConfirm = "var old_alert = browser.contentWindow.alert;"
|
191
|
+
alertConfirm += "var old_confirm = browser.contentWindow."+
|
192
|
+
"confirm;"
|
193
|
+
alertConfirm += "browser.contentWindow.alert = function()"+
|
194
|
+
"{return #{alert};};"
|
195
|
+
alertConfirm += "browser.contentWindow.confirm = function()"+
|
196
|
+
"{return #{alert};};"
|
197
|
+
if (alert)
|
198
|
+
alertConfirm += "browser.contentWindow.onbeforeunload = null;"
|
199
|
+
end
|
200
|
+
$jssh_socket.send(alertConfirm + "\n", 0)
|
201
|
+
$curSoda.browser.read_socket();
|
202
|
+
end
|
203
|
+
|
204
|
+
if (Watir::Browser.default == 'ie')
|
205
|
+
alertConfirm = "var old_alert = window.alert;"
|
206
|
+
alertConfirm += "var old_confirm = window.confirm;"
|
207
|
+
alertConfirm += "window.alert = function(){return #{alert};};"
|
208
|
+
alertConfirm += "window.confirm = function(){return #{alert};};"
|
209
|
+
if (alert)
|
210
|
+
alertConfirm += "window.onbeforeunload = null;"
|
211
|
+
end
|
212
|
+
$curSoda.browser.document.parentWindow.eval(alertConfirm + "\n")
|
213
|
+
end
|
214
|
+
else
|
215
|
+
if (Watir::Browser.default == 'firefox')
|
216
|
+
alertConfirm = "browser.contentWindow.alert = old_alert;"
|
217
|
+
alertConfirm += "browser.contentWindow.confirm = old_confirm;"
|
218
|
+
if (alert)
|
219
|
+
alertConfirm += "browser.contentWindow.onbeforeunload = null;"
|
220
|
+
end
|
221
|
+
$jssh_socket.send(alertConfirm + "\n", 0)
|
222
|
+
$curSoda.browser.read_socket();
|
223
|
+
end
|
224
|
+
|
225
|
+
if (Watir::Browser.default == 'ie')
|
226
|
+
alertConfirm = "var old_alert = window.alert;"
|
227
|
+
alertConfirm += "var old_confirm = window.confirm;"
|
228
|
+
alertConfirm += "window.alert = old_alert;"
|
229
|
+
alertConfirm += "window.confirm = old_confirm;"
|
230
|
+
if (alert)
|
231
|
+
alertConfirm += "window.onbeforeunload = null;"
|
232
|
+
end
|
233
|
+
$curSoda.browser.document.parentWindow.eval(alertConfirm + "\n")
|
234
|
+
end
|
235
|
+
end
|
236
|
+
rescue Exception => e
|
237
|
+
$curSoda.rep.ReportException(e, true)
|
238
|
+
ensure
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
###############################################################################
|
243
|
+
# click -- Method
|
244
|
+
# This method fires a watir element object's click method.
|
245
|
+
#
|
246
|
+
# Params:
|
247
|
+
# field: This is the watir object to click.
|
248
|
+
# sugarwait: true/false, will calling SodaUtils.WaitSugarAjaxDone if true.
|
249
|
+
#
|
250
|
+
# Results:
|
251
|
+
# Always returns 0
|
252
|
+
#
|
253
|
+
###############################################################################
|
254
|
+
def self.click(field, sugarwait = false)
|
255
|
+
result = 0
|
256
|
+
msg = "Clicking element: "
|
257
|
+
retry_count = 10
|
258
|
+
i = 0
|
259
|
+
|
260
|
+
begin
|
261
|
+
self.focus(field)
|
262
|
+
rescue Exception => e
|
263
|
+
if (Watir::Browser.default !~ /ie/i)
|
264
|
+
$curSoda.rep.ReportException(e, true)
|
265
|
+
end
|
266
|
+
ensure
|
267
|
+
end
|
268
|
+
|
269
|
+
for i in 0..retry_count
|
270
|
+
result = 0
|
271
|
+
|
272
|
+
begin
|
273
|
+
tmp = FieldUtils.WatirFieldToStr(field, $curSoda.rep)
|
274
|
+
tmp = "Unknown" if (tmp == nil)
|
275
|
+
|
276
|
+
$curSoda.rep.log("#{msg}#{tmp}.\n")
|
277
|
+
field.click()
|
278
|
+
$curSoda.browser.wait()
|
279
|
+
|
280
|
+
if (sugarwait)
|
281
|
+
SodaUtils.WaitSugarAjaxDone($curSoda.browser, $curSoda.rep)
|
282
|
+
end
|
283
|
+
rescue Exception => e
|
284
|
+
result = -1
|
285
|
+
|
286
|
+
if (e.message !~ /missing ; before statement/i)
|
287
|
+
$curSoda.rep.ReportException(e, true)
|
288
|
+
break
|
289
|
+
else
|
290
|
+
sleep(1)
|
291
|
+
end
|
292
|
+
ensure
|
293
|
+
end
|
294
|
+
|
295
|
+
break if (result == 0)
|
296
|
+
$curSoda.rep.log("Retying: #{i}\n", SodaUtils::WARN)
|
297
|
+
end
|
298
|
+
|
299
|
+
$curSoda.rep.log("Click finished.\n")
|
300
|
+
|
301
|
+
return result
|
302
|
+
end
|
303
|
+
|
304
|
+
###############################################################################
|
305
|
+
#
|
306
|
+
###############################################################################
|
307
|
+
def self.focus(field)
|
308
|
+
return field.focus
|
309
|
+
end
|
310
|
+
|
311
|
+
###############################################################################
|
312
|
+
#
|
313
|
+
###############################################################################
|
314
|
+
def self.clear(field)
|
315
|
+
return field.clear
|
316
|
+
end
|
317
|
+
|
318
|
+
###############################################################################
|
319
|
+
#
|
320
|
+
###############################################################################
|
321
|
+
def self.getValue(field)
|
322
|
+
return field.value
|
323
|
+
end
|
324
|
+
|
325
|
+
###############################################################################
|
326
|
+
#
|
327
|
+
###############################################################################
|
328
|
+
def self.getText(field)
|
329
|
+
return field.text()
|
330
|
+
end
|
331
|
+
|
332
|
+
###############################################################################
|
333
|
+
#
|
334
|
+
###############################################################################
|
335
|
+
def self.enabled(field)
|
336
|
+
return field.enabled?()
|
337
|
+
end
|
338
|
+
|
339
|
+
###############################################################################
|
340
|
+
#
|
341
|
+
###############################################################################
|
342
|
+
def self.disabled(field)
|
343
|
+
return field.disabled()
|
344
|
+
end
|
345
|
+
|
346
|
+
###############################################################################
|
347
|
+
# return true or false based on a string value
|
348
|
+
###############################################################################
|
349
|
+
def self.getStringTrue(value)
|
350
|
+
if value.is_a?(String)
|
351
|
+
value.downcase!
|
352
|
+
|
353
|
+
if value == 'true' or value == 'yes' or value == '1'
|
354
|
+
return true
|
355
|
+
else
|
356
|
+
return false
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
return value
|
361
|
+
end
|
362
|
+
|
363
|
+
end
|