watirmark 5.14.16
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/app_generators/create_project/create_project_generator.rb +115 -0
- data/app_generators/create_project/templates/features/env.rb.erb +8 -0
- data/app_generators/create_project/templates/features/model_steps.rb.erb +9 -0
- data/app_generators/create_project/templates/features/post_error_steps.rb.erb +15 -0
- data/app_generators/create_project/templates/features/sample.feature.erb +5 -0
- data/app_generators/create_project/templates/features/site_steps.rb.erb +7 -0
- data/app_generators/create_project/templates/generators/controller.rb.erb +9 -0
- data/app_generators/create_project/templates/generators/generate.rb.erb +9 -0
- data/app_generators/create_project/templates/generators/model.rb.erb +7 -0
- data/app_generators/create_project/templates/generators/mvc_generator.rb.erb +100 -0
- data/app_generators/create_project/templates/generators/rbeautify.rb.erb +212 -0
- data/app_generators/create_project/templates/generators/view.rb.erb +16 -0
- data/app_generators/create_project/templates/generators/workflow_loader.rb.erb +1 -0
- data/app_generators/create_project/templates/library/base_controller.rb.erb +9 -0
- data/app_generators/create_project/templates/library/base_view.rb.erb +6 -0
- data/app_generators/create_project/templates/library/configuration.rb.erb +6 -0
- data/app_generators/create_project/templates/library/core_libraries.rb.erb +9 -0
- data/app_generators/create_project/templates/library/loader.rb.erb +23 -0
- data/app_generators/create_project/templates/library/page_load_checker.rb.erb +11 -0
- data/app_generators/create_project/templates/library/post_errors_checker.rb.erb +23 -0
- data/app_generators/create_project/templates/library/project_require_file.rb.erb +8 -0
- data/app_generators/create_project/templates/library/search_controller.rb.erb +12 -0
- data/app_generators/create_project/templates/library/workflows.rb.erb +0 -0
- data/app_generators/create_project/templates/project/config.yml.erb +3 -0
- data/app_generators/create_project/templates/project/gemfile.rb.erb +11 -0
- data/app_generators/create_project/templates/project/rakefile.rb.erb +21 -0
- data/bin/etapestry/Gemfile +11 -0
- data/bin/etapestry/config.yml +3 -0
- data/bin/etapestry/features/etapestry_home.feature +5 -0
- data/bin/etapestry/features/step_definitions/model_steps.rb +9 -0
- data/bin/etapestry/features/step_definitions/post_error_steps.rb +15 -0
- data/bin/etapestry/features/step_definitions/site_steps.rb +7 -0
- data/bin/etapestry/features/support/env.rb +8 -0
- data/bin/etapestry/generators/mvc/mvc_generator.rb +100 -0
- data/bin/etapestry/generators/mvc/rbeautify.rb +212 -0
- data/bin/etapestry/generators/mvc/templates/controller.rb.erb +9 -0
- data/bin/etapestry/generators/mvc/templates/model.rb.erb +7 -0
- data/bin/etapestry/generators/mvc/templates/view.rb.erb +16 -0
- data/bin/etapestry/generators/mvc/templates/workflow_loader.rb.erb +1 -0
- data/bin/etapestry/lib/etapestry.rb +8 -0
- data/bin/etapestry/lib/etapestry/checkers/page_load_checker.rb +11 -0
- data/bin/etapestry/lib/etapestry/checkers/post_errors_checker.rb +23 -0
- data/bin/etapestry/lib/etapestry/configuration.rb +6 -0
- data/bin/etapestry/lib/etapestry/core_libraries.rb +9 -0
- data/bin/etapestry/lib/etapestry/loader.rb +23 -0
- data/bin/etapestry/lib/etapestry/site/base_controller.rb +9 -0
- data/bin/etapestry/lib/etapestry/site/base_view.rb +6 -0
- data/bin/etapestry/lib/etapestry/site/search_controller.rb +12 -0
- data/bin/etapestry/lib/etapestry/workflows.rb +0 -0
- data/bin/etapestry/rakefile.rb +21 -0
- data/bin/etapestry/script/generate.rb +9 -0
- data/bin/twitter/features/hashtag_search.feature +93 -0
- data/bin/twitter/features/step_definitions/hashtag_steps.rb +9 -0
- data/bin/twitter/lib/twitter/workflows/search/result_controller.rb +13 -0
- data/bin/twitter/lib/twitter/workflows/search/result_model.rb +5 -0
- data/bin/twitter/lib/twitter/workflows/search/result_view.rb +19 -0
- data/bin/watirmark +10 -0
- data/lib/watirmark.rb +26 -0
- data/lib/watirmark/at_exit.rb +13 -0
- data/lib/watirmark/configuration.rb +201 -0
- data/lib/watirmark/controller/actions.rb +172 -0
- data/lib/watirmark/controller/assertions.rb +116 -0
- data/lib/watirmark/controller/controller.rb +191 -0
- data/lib/watirmark/controller/dialogs.rb +33 -0
- data/lib/watirmark/controller/matcher.rb +19 -0
- data/lib/watirmark/cucumber/cuke_helper.rb +150 -0
- data/lib/watirmark/cucumber/email_helper.rb +103 -0
- data/lib/watirmark/cucumber/env.rb +9 -0
- data/lib/watirmark/cucumber/hooks.rb +16 -0
- data/lib/watirmark/cucumber/model_helper.rb +34 -0
- data/lib/watirmark/cucumber/transforms.rb +55 -0
- data/lib/watirmark/exceptions.rb +15 -0
- data/lib/watirmark/extensions/ruby_extensions.rb +129 -0
- data/lib/watirmark/extensions/webdriver_extensions.rb +150 -0
- data/lib/watirmark/formatters/snapshot_formatter.rb +23 -0
- data/lib/watirmark/loader.rb +87 -0
- data/lib/watirmark/model.rb +3 -0
- data/lib/watirmark/models/cucumber_helper.rb +49 -0
- data/lib/watirmark/models/debug_methods.rb +21 -0
- data/lib/watirmark/models/default_values.rb +21 -0
- data/lib/watirmark/models/factory.rb +168 -0
- data/lib/watirmark/models/factory_method_generators.rb +84 -0
- data/lib/watirmark/models/factory_methods.rb +72 -0
- data/lib/watirmark/models/trait.rb +35 -0
- data/lib/watirmark/models/upload_csv.rb +24 -0
- data/lib/watirmark/page/keyed_element.rb +63 -0
- data/lib/watirmark/page/page.rb +50 -0
- data/lib/watirmark/page/page_definition.rb +187 -0
- data/lib/watirmark/page/process_page.rb +112 -0
- data/lib/watirmark/page/radio_maps.rb +53 -0
- data/lib/watirmark/profile.rb +22 -0
- data/lib/watirmark/rake/smoketest.rb +17 -0
- data/lib/watirmark/screenshot.rb +127 -0
- data/lib/watirmark/session.rb +115 -0
- data/lib/watirmark/version.rb +5 -0
- data/spec/assertions_spec.rb +95 -0
- data/spec/config_spec.rb +82 -0
- data/spec/controller_actions_spec.rb +91 -0
- data/spec/controller_spec.rb +426 -0
- data/spec/controllers_and_models_spec.rb +52 -0
- data/spec/model_factory_spec.rb +568 -0
- data/spec/model_traits_spec.rb +141 -0
- data/spec/page_spec.rb +127 -0
- data/spec/process_page_spec.rb +163 -0
- data/spec/spec_helper.rb +17 -0
- metadata +238 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Watirmark
|
|
2
|
+
module Model
|
|
3
|
+
|
|
4
|
+
DebugModelValues = Hash.new{|h,k| h[k]=Hash.new}
|
|
5
|
+
|
|
6
|
+
module DebugMethods
|
|
7
|
+
def model_name=(name)
|
|
8
|
+
@model_name = name
|
|
9
|
+
add_debug_overrides
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def add_debug_overrides
|
|
13
|
+
return unless @model_name && DebugModelValues != {}
|
|
14
|
+
Watirmark.logger.warn "Adding DEBUG overrides for #@model_name"
|
|
15
|
+
update DebugModelValues['*'] if DebugModelValues['*']
|
|
16
|
+
update DebugModelValues[@model_name] if DebugModelValues[@model_name]
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Watirmark
|
|
2
|
+
module Model
|
|
3
|
+
class DefaultValues < Hash
|
|
4
|
+
|
|
5
|
+
# This is a workaround for zip being defined in Enumerable and
|
|
6
|
+
# we want to use zip in the model as a zip code
|
|
7
|
+
undef :zip
|
|
8
|
+
|
|
9
|
+
# This works around an issue that gets hit when
|
|
10
|
+
# running from rake and the model has default.desc set.
|
|
11
|
+
# If we don't have it here it thinks we're trying to call rakes' #desc
|
|
12
|
+
def desc(&block)
|
|
13
|
+
self[:desc] = block
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def method_missing(name, &block)
|
|
17
|
+
self[name] = block
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
require_relative 'cucumber_helper'
|
|
2
|
+
require_relative 'default_values'
|
|
3
|
+
require_relative 'factory_methods'
|
|
4
|
+
require_relative 'factory_method_generators'
|
|
5
|
+
require_relative 'debug_methods'
|
|
6
|
+
|
|
7
|
+
module Watirmark
|
|
8
|
+
module Model
|
|
9
|
+
|
|
10
|
+
class Factory
|
|
11
|
+
extend FactoryMethods
|
|
12
|
+
|
|
13
|
+
include CucumberHelper
|
|
14
|
+
include DebugMethods
|
|
15
|
+
include FactoryMethodGenerators
|
|
16
|
+
|
|
17
|
+
attr_accessor :defaults, :model_name, :models, :parent, :children, :model_type
|
|
18
|
+
attr_reader :keywords
|
|
19
|
+
|
|
20
|
+
def initialize(params={})
|
|
21
|
+
@params = params
|
|
22
|
+
@model_type = self.class.model_type_name
|
|
23
|
+
@search = self.class.search || Proc.new{nil}
|
|
24
|
+
@keywords = self.class.keys.dup || []
|
|
25
|
+
@children = self.class.children.dup.map(&:new)
|
|
26
|
+
set_model_name
|
|
27
|
+
set_default_values
|
|
28
|
+
create_model_getters_and_setters
|
|
29
|
+
set_initial_values
|
|
30
|
+
Watirmark.logger.info inspect
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def uuid
|
|
34
|
+
@uuid ||= (Watirmark::Configuration.instance.uuid || UUID.new.generate(:compact)[0..9]).to_s
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def strip_equals_from_method_name(method)
|
|
38
|
+
method.to_s.delete('=').to_sym
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# The search_term, used for a controller's search can be defined in this model
|
|
42
|
+
# or will look in a parent's model. This allows us to define it once for a composed model
|
|
43
|
+
def search_term
|
|
44
|
+
instance_eval(&@search) || (parent.search_term if parent)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def add_model(model)
|
|
49
|
+
@children << model
|
|
50
|
+
create_child_methods
|
|
51
|
+
Watirmark.logger.info "Added Model #{model.inspect} to #{model_name || model_class_name}"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def find(model_class)
|
|
56
|
+
return self if self.kind_of? model_class
|
|
57
|
+
@children.each do |m|
|
|
58
|
+
return m if m.model_type == model_class
|
|
59
|
+
found_model = m.find model_class
|
|
60
|
+
return found_model if found_model
|
|
61
|
+
end
|
|
62
|
+
nil
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def inspect
|
|
67
|
+
model_friendly_name = @model_name ? "#@model_name: " : nil
|
|
68
|
+
model_details = " #{to_h}" unless to_h.empty?
|
|
69
|
+
included_models = "\n #{@children.map(&:inspect).join("\n ")}" unless @children.empty?
|
|
70
|
+
"#{model_friendly_name}#{model_class_name}#{model_details}#{included_models}"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def model_class_name
|
|
75
|
+
name = self.class.inspect.to_s
|
|
76
|
+
name = self.class.superclass.to_s if name.to_s =~ /Class/
|
|
77
|
+
name = 'Model' if name.to_s =~ /Module/
|
|
78
|
+
name.sub!(/.+::/,'')
|
|
79
|
+
name
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def includes? hash
|
|
84
|
+
hash.each_pair { |key, value| return false unless send("#{key}") == value }
|
|
85
|
+
true
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# Update the model using the provided hash
|
|
90
|
+
def update hash
|
|
91
|
+
remove_empty_entries hash
|
|
92
|
+
hash.each_pair { |key, value| send "#{key}=", value }
|
|
93
|
+
self
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
# Update the model using the provided hash but only if exists (TODO: may not be needed any more)
|
|
98
|
+
def update_existing_members hash
|
|
99
|
+
remove_empty_entries hash
|
|
100
|
+
hash.each_pair { |key, value| send "#{key}=", value if respond_to? "#{key}=".to_sym }
|
|
101
|
+
self
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def remove_empty_entries hash
|
|
105
|
+
hash.delete(':')
|
|
106
|
+
hash.delete_if {|k| k =~ /^\s+$/}
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def to_h
|
|
110
|
+
h = {}
|
|
111
|
+
@keywords.each do |key|
|
|
112
|
+
begin
|
|
113
|
+
name = key
|
|
114
|
+
value = send(key)
|
|
115
|
+
if value.kind_of?(Proc)
|
|
116
|
+
h[name] = instance_eval(&value) unless value.nil?
|
|
117
|
+
else
|
|
118
|
+
h[name] = value unless value.nil?
|
|
119
|
+
end
|
|
120
|
+
rescue NoMethodError
|
|
121
|
+
h[name] = "[defined at runtime]"
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
h
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
private
|
|
129
|
+
|
|
130
|
+
def set_model_name
|
|
131
|
+
if @params[:model_name]
|
|
132
|
+
@model_name = @params[:model_name]
|
|
133
|
+
@params.delete(:model_name)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def create_model_getters_and_setters
|
|
138
|
+
create_keyword_methods
|
|
139
|
+
create_child_methods
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def set_default_values
|
|
143
|
+
@defaults = self.class.default.dup
|
|
144
|
+
@traits = self.class.included_traits || []
|
|
145
|
+
include_defaults_from_traits @traits
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def set_initial_values
|
|
149
|
+
update @params
|
|
150
|
+
add_debug_overrides
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def include_defaults_from_traits(traits)
|
|
155
|
+
traits.each do |trait_name|
|
|
156
|
+
trait = Watirmark::Model::Traits.instance[trait_name]
|
|
157
|
+
trait.defaults.each {|k, v| @defaults[k] = v unless @defaults.key?(k)}
|
|
158
|
+
trait.traits.each {|t| include_defaults_from_traits([t])}
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def method_name model
|
|
163
|
+
model.model_class_name.to_s.sub(/Model$/, '').underscore
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
module Watirmark
|
|
2
|
+
module Model
|
|
3
|
+
module FactoryMethodGenerators
|
|
4
|
+
|
|
5
|
+
# Act like an OpenStruct so we can be backward compatible with older controllers
|
|
6
|
+
def method_missing(key, *args, &block)
|
|
7
|
+
create_getters_and_setters strip_equals_from_method_name(key)
|
|
8
|
+
send key, *args
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def create_keyword_methods
|
|
14
|
+
@keywords.each do |key|
|
|
15
|
+
create_getters_and_setters key
|
|
16
|
+
set_default_value key
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def create_getters_and_setters key
|
|
21
|
+
@keywords << key unless @keywords.include? key #handle call from method_missing
|
|
22
|
+
create_getter_method key
|
|
23
|
+
create_setter_method key
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def create_getter_method(key)
|
|
27
|
+
meta_def key do
|
|
28
|
+
normalize instance_variable_get("@#{key}")
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def create_setter_method(key)
|
|
33
|
+
meta_def "#{key}=" do |value|
|
|
34
|
+
instance_variable_set "@#{key}", value
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def set_default_value key
|
|
39
|
+
send("#{key}=", get_default_value(key)) if send(key).nil?
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def get_default_value(key)
|
|
43
|
+
@defaults.key?(key) ? @defaults[key] : nil
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# if the value is a proc, evaluate it, otherwise just return
|
|
47
|
+
def normalize(val)
|
|
48
|
+
val.kind_of?(Proc) ? instance_eval(&val) : val
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def create_child_methods
|
|
53
|
+
@children.each do |model|
|
|
54
|
+
model.parent = self
|
|
55
|
+
create_model_collection model
|
|
56
|
+
create_model_method model
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def collection_name model
|
|
61
|
+
method_name(model).pluralize
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def create_model_collection model
|
|
66
|
+
@collection ||= []
|
|
67
|
+
@collection << model unless @collection.include? model
|
|
68
|
+
meta_def collection_name(model).pluralize do
|
|
69
|
+
@collection
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def create_model_method model
|
|
75
|
+
unless respond_to? method_name(model)
|
|
76
|
+
meta_def method_name(model) do
|
|
77
|
+
model
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
module Watirmark
|
|
2
|
+
module Model
|
|
3
|
+
module FactoryMethods
|
|
4
|
+
attr_accessor :search, :model_type_name, :included_traits
|
|
5
|
+
attr_writer :default, :keys
|
|
6
|
+
|
|
7
|
+
def inherited(klass)
|
|
8
|
+
unless self == Factory
|
|
9
|
+
add_keywords_to_subclass klass
|
|
10
|
+
add_defaults_to_subclass klass
|
|
11
|
+
add_traits_to_subclass klass
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def default
|
|
16
|
+
@default ||= DefaultValues.new
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def keys
|
|
20
|
+
@keys ||= []
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def defaults(&block)
|
|
24
|
+
default.instance_exec &block
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def children
|
|
28
|
+
@children ||= []
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def model *models
|
|
32
|
+
models.each { |model| raise Watirmark::ModelCreationError unless Class === model }
|
|
33
|
+
@children = children + models
|
|
34
|
+
@children.uniq!
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def model_type(c_name)
|
|
38
|
+
@model_type_name = c_name
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def search_term &block
|
|
42
|
+
@search = block
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def traits(*names)
|
|
46
|
+
@included_traits = [*names].flatten
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def keywords(*args)
|
|
50
|
+
@keys = [*args].flatten
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
private
|
|
54
|
+
|
|
55
|
+
def add_keywords_to_subclass klass
|
|
56
|
+
if @keys
|
|
57
|
+
klass.keys = []
|
|
58
|
+
klass.keys += @keys.dup
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def add_defaults_to_subclass klass
|
|
63
|
+
klass.default = @default.dup if @default
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def add_traits_to_subclass klass
|
|
67
|
+
klass.included_traits = @included_traits.dup if @included_traits
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'singleton'
|
|
2
|
+
module Watirmark
|
|
3
|
+
module Model
|
|
4
|
+
def self.trait(name, &block)
|
|
5
|
+
new_trait = Trait.new
|
|
6
|
+
new_trait.instance_eval(&block)
|
|
7
|
+
Watirmark::Model::Traits.instance[name] = new_trait
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class Trait
|
|
11
|
+
attr_accessor :defaults
|
|
12
|
+
|
|
13
|
+
def initialize
|
|
14
|
+
@defaults = {}
|
|
15
|
+
@traits = []
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def traits(*names)
|
|
19
|
+
if names.empty?
|
|
20
|
+
@traits
|
|
21
|
+
else
|
|
22
|
+
@traits += names
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def method_missing(sym, *args, &block)
|
|
27
|
+
@defaults[sym] = block
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class Traits < Hash
|
|
32
|
+
include Singleton
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Watirmark
|
|
2
|
+
module Model
|
|
3
|
+
class UploadCSV < Factory
|
|
4
|
+
require 'csv'
|
|
5
|
+
require 'tempfile'
|
|
6
|
+
|
|
7
|
+
def create_csv(table)
|
|
8
|
+
Watirmark.logger.info "Creating temporary CSV: #{csv_file}"
|
|
9
|
+
Watirmark.logger.info table.inspect
|
|
10
|
+
CSV.open(csv_file, 'wb') do |csv|
|
|
11
|
+
table.each do |line|
|
|
12
|
+
csv << line
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def csv_file
|
|
18
|
+
@file ||= Tempfile.new(%w(csv_data .csv))
|
|
19
|
+
@file.path
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require 'watirmark/page/radio_maps'
|
|
2
|
+
|
|
3
|
+
module Watirmark
|
|
4
|
+
|
|
5
|
+
module KeywordMethods
|
|
6
|
+
attr_accessor :keyword, :radio_map
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class KeyedElement
|
|
10
|
+
attr_reader :keyword, :process_page, :permissions
|
|
11
|
+
|
|
12
|
+
def initialize(context, options)
|
|
13
|
+
@context = context
|
|
14
|
+
@keyword = options[:keyword]
|
|
15
|
+
@block = options[:block]
|
|
16
|
+
@process_page = options[:process_page]
|
|
17
|
+
@permissions = options[:permissions] || {}
|
|
18
|
+
@map = Watirmark::RadioMap.new(options[:map]) if options[:map]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def get *args
|
|
22
|
+
@process_page.activate
|
|
23
|
+
watir_object = @context.instance_exec(*args, &@block)
|
|
24
|
+
watir_object.extend(KeywordMethods)
|
|
25
|
+
watir_object.radio_map = @map if @map
|
|
26
|
+
watir_object.keyword = @keyword
|
|
27
|
+
watir_object
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def set val
|
|
31
|
+
return if val.nil?
|
|
32
|
+
@process_page.activate
|
|
33
|
+
element = get
|
|
34
|
+
val = @map.lookup(val) if @map
|
|
35
|
+
case val
|
|
36
|
+
when 'nil'
|
|
37
|
+
element.clear # workaround to empty element values
|
|
38
|
+
else
|
|
39
|
+
case element
|
|
40
|
+
when Watir::Radio
|
|
41
|
+
element.set val
|
|
42
|
+
when Watir::CheckBox
|
|
43
|
+
val ? element.set : element.clear
|
|
44
|
+
when Watir::Select
|
|
45
|
+
element.select val
|
|
46
|
+
when Watir::Button
|
|
47
|
+
element.click
|
|
48
|
+
else
|
|
49
|
+
element.value = val
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def populate_allowed?
|
|
55
|
+
@permissions[:populate]
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def verify_allowed?
|
|
59
|
+
@permissions[:verify]
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
end
|