watirmark 5.14.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. data/app_generators/create_project/create_project_generator.rb +115 -0
  2. data/app_generators/create_project/templates/features/env.rb.erb +8 -0
  3. data/app_generators/create_project/templates/features/model_steps.rb.erb +9 -0
  4. data/app_generators/create_project/templates/features/post_error_steps.rb.erb +15 -0
  5. data/app_generators/create_project/templates/features/sample.feature.erb +5 -0
  6. data/app_generators/create_project/templates/features/site_steps.rb.erb +7 -0
  7. data/app_generators/create_project/templates/generators/controller.rb.erb +9 -0
  8. data/app_generators/create_project/templates/generators/generate.rb.erb +9 -0
  9. data/app_generators/create_project/templates/generators/model.rb.erb +7 -0
  10. data/app_generators/create_project/templates/generators/mvc_generator.rb.erb +100 -0
  11. data/app_generators/create_project/templates/generators/rbeautify.rb.erb +212 -0
  12. data/app_generators/create_project/templates/generators/view.rb.erb +16 -0
  13. data/app_generators/create_project/templates/generators/workflow_loader.rb.erb +1 -0
  14. data/app_generators/create_project/templates/library/base_controller.rb.erb +9 -0
  15. data/app_generators/create_project/templates/library/base_view.rb.erb +6 -0
  16. data/app_generators/create_project/templates/library/configuration.rb.erb +6 -0
  17. data/app_generators/create_project/templates/library/core_libraries.rb.erb +9 -0
  18. data/app_generators/create_project/templates/library/loader.rb.erb +23 -0
  19. data/app_generators/create_project/templates/library/page_load_checker.rb.erb +11 -0
  20. data/app_generators/create_project/templates/library/post_errors_checker.rb.erb +23 -0
  21. data/app_generators/create_project/templates/library/project_require_file.rb.erb +8 -0
  22. data/app_generators/create_project/templates/library/search_controller.rb.erb +12 -0
  23. data/app_generators/create_project/templates/library/workflows.rb.erb +0 -0
  24. data/app_generators/create_project/templates/project/config.yml.erb +3 -0
  25. data/app_generators/create_project/templates/project/gemfile.rb.erb +11 -0
  26. data/app_generators/create_project/templates/project/rakefile.rb.erb +21 -0
  27. data/bin/etapestry/Gemfile +11 -0
  28. data/bin/etapestry/config.yml +3 -0
  29. data/bin/etapestry/features/etapestry_home.feature +5 -0
  30. data/bin/etapestry/features/step_definitions/model_steps.rb +9 -0
  31. data/bin/etapestry/features/step_definitions/post_error_steps.rb +15 -0
  32. data/bin/etapestry/features/step_definitions/site_steps.rb +7 -0
  33. data/bin/etapestry/features/support/env.rb +8 -0
  34. data/bin/etapestry/generators/mvc/mvc_generator.rb +100 -0
  35. data/bin/etapestry/generators/mvc/rbeautify.rb +212 -0
  36. data/bin/etapestry/generators/mvc/templates/controller.rb.erb +9 -0
  37. data/bin/etapestry/generators/mvc/templates/model.rb.erb +7 -0
  38. data/bin/etapestry/generators/mvc/templates/view.rb.erb +16 -0
  39. data/bin/etapestry/generators/mvc/templates/workflow_loader.rb.erb +1 -0
  40. data/bin/etapestry/lib/etapestry.rb +8 -0
  41. data/bin/etapestry/lib/etapestry/checkers/page_load_checker.rb +11 -0
  42. data/bin/etapestry/lib/etapestry/checkers/post_errors_checker.rb +23 -0
  43. data/bin/etapestry/lib/etapestry/configuration.rb +6 -0
  44. data/bin/etapestry/lib/etapestry/core_libraries.rb +9 -0
  45. data/bin/etapestry/lib/etapestry/loader.rb +23 -0
  46. data/bin/etapestry/lib/etapestry/site/base_controller.rb +9 -0
  47. data/bin/etapestry/lib/etapestry/site/base_view.rb +6 -0
  48. data/bin/etapestry/lib/etapestry/site/search_controller.rb +12 -0
  49. data/bin/etapestry/lib/etapestry/workflows.rb +0 -0
  50. data/bin/etapestry/rakefile.rb +21 -0
  51. data/bin/etapestry/script/generate.rb +9 -0
  52. data/bin/twitter/features/hashtag_search.feature +93 -0
  53. data/bin/twitter/features/step_definitions/hashtag_steps.rb +9 -0
  54. data/bin/twitter/lib/twitter/workflows/search/result_controller.rb +13 -0
  55. data/bin/twitter/lib/twitter/workflows/search/result_model.rb +5 -0
  56. data/bin/twitter/lib/twitter/workflows/search/result_view.rb +19 -0
  57. data/bin/watirmark +10 -0
  58. data/lib/watirmark.rb +26 -0
  59. data/lib/watirmark/at_exit.rb +13 -0
  60. data/lib/watirmark/configuration.rb +201 -0
  61. data/lib/watirmark/controller/actions.rb +172 -0
  62. data/lib/watirmark/controller/assertions.rb +116 -0
  63. data/lib/watirmark/controller/controller.rb +191 -0
  64. data/lib/watirmark/controller/dialogs.rb +33 -0
  65. data/lib/watirmark/controller/matcher.rb +19 -0
  66. data/lib/watirmark/cucumber/cuke_helper.rb +150 -0
  67. data/lib/watirmark/cucumber/email_helper.rb +103 -0
  68. data/lib/watirmark/cucumber/env.rb +9 -0
  69. data/lib/watirmark/cucumber/hooks.rb +16 -0
  70. data/lib/watirmark/cucumber/model_helper.rb +34 -0
  71. data/lib/watirmark/cucumber/transforms.rb +55 -0
  72. data/lib/watirmark/exceptions.rb +15 -0
  73. data/lib/watirmark/extensions/ruby_extensions.rb +129 -0
  74. data/lib/watirmark/extensions/webdriver_extensions.rb +150 -0
  75. data/lib/watirmark/formatters/snapshot_formatter.rb +23 -0
  76. data/lib/watirmark/loader.rb +87 -0
  77. data/lib/watirmark/model.rb +3 -0
  78. data/lib/watirmark/models/cucumber_helper.rb +49 -0
  79. data/lib/watirmark/models/debug_methods.rb +21 -0
  80. data/lib/watirmark/models/default_values.rb +21 -0
  81. data/lib/watirmark/models/factory.rb +168 -0
  82. data/lib/watirmark/models/factory_method_generators.rb +84 -0
  83. data/lib/watirmark/models/factory_methods.rb +72 -0
  84. data/lib/watirmark/models/trait.rb +35 -0
  85. data/lib/watirmark/models/upload_csv.rb +24 -0
  86. data/lib/watirmark/page/keyed_element.rb +63 -0
  87. data/lib/watirmark/page/page.rb +50 -0
  88. data/lib/watirmark/page/page_definition.rb +187 -0
  89. data/lib/watirmark/page/process_page.rb +112 -0
  90. data/lib/watirmark/page/radio_maps.rb +53 -0
  91. data/lib/watirmark/profile.rb +22 -0
  92. data/lib/watirmark/rake/smoketest.rb +17 -0
  93. data/lib/watirmark/screenshot.rb +127 -0
  94. data/lib/watirmark/session.rb +115 -0
  95. data/lib/watirmark/version.rb +5 -0
  96. data/spec/assertions_spec.rb +95 -0
  97. data/spec/config_spec.rb +82 -0
  98. data/spec/controller_actions_spec.rb +91 -0
  99. data/spec/controller_spec.rb +426 -0
  100. data/spec/controllers_and_models_spec.rb +52 -0
  101. data/spec/model_factory_spec.rb +568 -0
  102. data/spec/model_traits_spec.rb +141 -0
  103. data/spec/page_spec.rb +127 -0
  104. data/spec/process_page_spec.rb +163 -0
  105. data/spec/spec_helper.rb +17 -0
  106. metadata +238 -0
@@ -0,0 +1,9 @@
1
+ module Etapestry
2
+ <%= create_modules %>
3
+ class <%= name.camelize %> < BaseController
4
+ @model = <%= name.camelize %>Model
5
+ @view = <%= name.camelize %>View
6
+ end
7
+ <%= create_module_end %>
8
+ end
9
+
@@ -0,0 +1,7 @@
1
+ module Etapestry
2
+ <%= create_modules %>
3
+ <%= name.camelize %>Model = Watirmark::Model.factory do
4
+ keywords <%= name.camelize %>View.keywords
5
+ end
6
+ <%= create_module_end %>
7
+ end
@@ -0,0 +1,16 @@
1
+ module Etapestry
2
+ <%= create_modules %>
3
+ class <%= name.camelize %>View < BaseView
4
+ keyword(:keyword_name) { browser.text_field(:id, 'element_id') }
5
+
6
+ def home(model)
7
+ end
8
+
9
+ def create(model)
10
+ end
11
+
12
+ def edit(model)
13
+ end
14
+ end
15
+ <%= create_module_end %>
16
+ end
@@ -0,0 +1 @@
1
+ Etapestry::Loader.load_product '<%= product.downcase %>'
@@ -0,0 +1,8 @@
1
+ module Etapestry; end
2
+
3
+ require 'etapestry/configuration'
4
+ require 'watirmark'
5
+ require 'etapestry/loader'
6
+ require 'etapestry/core_libraries'
7
+ require 'etapestry/workflows'
8
+
@@ -0,0 +1,11 @@
1
+ module Watirmark
2
+ class Session
3
+
4
+ # put in here the appropriate waits
5
+ # to verify that the page has loaded completely, if your app has javascript-loaded content
6
+ def self.page_load
7
+ Watir::Wait.until { Page.browser.url != "about:blank" }
8
+ end
9
+ Watirmark::Session::POST_WAIT_CHECKERS << Proc.new { Watirmark::Session::page_load }
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ require 'watirmark/session'
2
+
3
+ module Watirmark
4
+ class Session
5
+
6
+ # Post errors are basically any error messages that
7
+ # appear to the user when a form submission fails. This catches that
8
+ # error and allows the cucumber to catch the error (@@buffer_post_failure)
9
+ # or just throw an exception when an error is seen after a post
10
+ def self.post_errors
11
+ #if Page.browser.table(:class, 'error').present?
12
+ # message = Page.browser.table(:class, 'error').text
13
+ # if @@buffer_post_failure
14
+ # @@post_failure = message.strip
15
+ # else
16
+ # raise Watirmark::PostFailure, message.strip
17
+ # end
18
+ #end
19
+ end
20
+
21
+ Watirmark::Session::POST_WAIT_CHECKERS << Proc.new { Watirmark::Session::post_errors }
22
+ end
23
+ end
@@ -0,0 +1,6 @@
1
+ require 'watirmark/configuration'
2
+
3
+ Watirmark::Configuration.instance.defaults = {
4
+ :configfile => "#{File.dirname(__FILE__) + '/../..'}/config.yml",
5
+ }
6
+ Watirmark::Configuration.instance.reload
@@ -0,0 +1,9 @@
1
+ require 'etapestry/site/base_view'
2
+ require 'etapestry/site/base_controller'
3
+ require 'etapestry/site/search_controller'
4
+ Watirmark.loader do
5
+ base_directory File.dirname(__FILE__)
6
+ product 'Etapestry'
7
+ load_files 'checkers/**/*.rb'
8
+ end
9
+
@@ -0,0 +1,23 @@
1
+ require 'watirmark/loader'
2
+ module Etapestry
3
+ class Loader
4
+ class << self
5
+ @@loaded = {}
6
+
7
+ def load_workflow(name)
8
+ load_files name, "*{_view}.rb"
9
+ load_files name, "*{_model}.rb"
10
+ load_files name, "*{_controller}.rb"
11
+ load_files name, "*.rb"
12
+ end
13
+
14
+ def load_files(name, files)
15
+ Watirmark.loader do
16
+ base_directory File.dirname(__FILE__)
17
+ product 'Etapestry'
18
+ load_files "workflows/#{name}#{files}"
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,9 @@
1
+ module Etapestry
2
+ class BaseController < Watirmark::WebPage::Controller
3
+
4
+ # default way of submitting a form
5
+ def submit
6
+ # @view.save_button.click
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,6 @@
1
+ module Etapestry
2
+ class BaseView < Watirmark::Page
3
+ class << self
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,12 @@
1
+ module Etapestry
2
+ class SearchController < BaseController
3
+
4
+ def current_record_visible?
5
+ raise "Method needs to be defined in the subclass and return a true/false value"
6
+ end
7
+
8
+ def populate_data
9
+ super unless current_record_visible?
10
+ end
11
+ end
12
+ end
File without changes
@@ -0,0 +1,21 @@
1
+ $: << File.expand_path(File.join(File.dirname(__FILE__), 'lib'))
2
+
3
+ # Run a bundle install if running from Jenkins
4
+ begin
5
+ sh "bundle install" if File.dirname(__FILE__) =~ /\/(hudson|mnt)\/workspace\//
6
+ rescue Gem::RemoteFetcher::FetchError
7
+ puts "Unable to connect - retrying #{Time.now}"
8
+ retry
9
+ end
10
+
11
+ require 'bundler/setup'
12
+ require 'cucumber/rake/task'
13
+
14
+ module RakeHelper
15
+ def self.cucumber_task(task_name, files=nil)
16
+ Cucumber::Rake::Task.new(task_name) do |t|
17
+ t.cucumber_opts = "-r features #{FileList[files]} -b --format html -o reports/report.html --format pretty"
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ require 'rubigen'
5
+ require 'rubigen/scripts/generate'
6
+
7
+ ARGV.shift if %w(--help -h).include?(ARGV[0])
8
+ RubiGen::Base.use_component_sources! [:rubygems]
9
+ RubiGen::Scripts::Generate.new.run(ARGV)
@@ -0,0 +1,93 @@
1
+ Feature: Searches using the hashtag symbol(#) should return a list of tweets containing that hashtag
2
+ Given I am logged in as a twitter user
3
+ When I enter a search using a hashtag
4
+ Then I expect to see a list of results for that hashtag
5
+
6
+ Background:
7
+ Given I go to the home page
8
+
9
+
10
+
11
+ # This is the test we're going to automate
12
+
13
+ Scenario: Searching for a hashtag should only return results containing that hashtag
14
+ When I search for "#trest"
15
+ Then I should only see tweets containing the term "#blackbaud"
16
+
17
+
18
+
19
+
20
+ Scenario: Hashtags in tweets should show as links
21
+ When I create a new tweet "This is a tweet with a #test hashtag"
22
+ Then the tweet should contain "#test"
23
+
24
+ Scenario: Clicking hashtags in tweets should show search results for the hashtag
25
+ When I create a new tweet "This is a tweet to follow with a #test hashtag"
26
+ And I click the hashtag "#test" in the last tweet
27
+ Then I should only see tweets containing the term "#test"
28
+
29
+ Scenario: Multiple hashtags should return results containing *all* hashtags defined (AND search)
30
+ When I search for "#blackbaud #winning"
31
+ Then I should only see tweets containing the terms "#blackbaud" and "#winning"
32
+
33
+ Scenario: Saving a hashtag search should preserve the hashtag in the search
34
+ When I search for "#blackbaud"
35
+ And I save the search
36
+ Then I should see the search in the dropdown saved searches list
37
+ And I should be able to select the search from that list
38
+ And I should only see tweets containing the term "#blackbaud"
39
+
40
+ Scenario: New tweets should periodically show 'N new tweets' at the top of the list
41
+ When I search for "#blackbaud"
42
+ And I create a new tweet "This is a tweet with a #test hashtag using the API" using the API
43
+ Then I should see the new tweets header with "1 new tweet"
44
+ When I click the new tweets header
45
+ Then I should see the tweet "This is a tweet with a #test hashtag using the API"
46
+
47
+ Scenario: Empty search results should display the "No tweet results" message
48
+ When I search for "#this_is_an_empty_search_test"
49
+ Then I should see the search message "No tweet results for #this_is_an_empty_search_test"
50
+
51
+ Scenario: "Top" Tweets should be the default search list
52
+ When I search for "#blackbaud"
53
+ Then the selected search filter should be "Top"
54
+
55
+ Scenario: Clicking "Top" should show the most popular tweets on that hashtag
56
+ When I search for "#blackbaud"
57
+ And I select the search filter "All"
58
+ And I select the search filter "Top"
59
+ Then the selected search filter should be "Top"
60
+ And the tweets should pull from the most popular list for "#blackbaud"
61
+
62
+ Scenario: Clicking "All" should show the most recent tweets on that hashtag
63
+ When I search for "#blackbaud"
64
+ And I select the search filter "All"
65
+ Then the selected search filter should be "All"
66
+ And the tweets should pull from the full list for "#blackbaud"
67
+
68
+ Scenario: Clicking "People you follow" should only show hashtag tweets from your follow list
69
+ When I search for "#blackbaud"
70
+ And I select the search filter "People you follow"
71
+ Then the selected search filter should be "People you follow"
72
+ And the tweets should pull from the people list for "#blackbaud"
73
+
74
+ Scenario: Scrolling to the end of the list should autoload the next 20 matches
75
+ When I search for "#blackbaud"
76
+ And I scroll to the bottom of the page
77
+ Then the next 20 results should load
78
+ And the search should contain more than 20 results
79
+
80
+ Scenario: The max size of the list should be 20 items
81
+ When I search for "#blackbaud"
82
+ Then the search should contain at most 20 results
83
+
84
+ Scenario: Advanced searches should honor a single hashtag
85
+
86
+ Scenario: Advanced searches should honor a multiple hashtags
87
+
88
+ Scenario: Promoted tweets should show regardless of the search terms
89
+
90
+ Scenario: Hitting the enter button should return the same set of results as clicking the looking glass
91
+
92
+ Scenario: Searching for a string (not hashtag) should return results matching the hashtag or the string
93
+
@@ -0,0 +1,9 @@
1
+ # use generators
2
+
3
+ When /^I search for "(.*?)"$/ do |arg1|
4
+ Search::Query.new(:search_term => arg1).create
5
+ end
6
+
7
+ Then /^I should only see tweets containing the term "(.*?)"$/ do |arg1|
8
+ Search::Result.each { |result| result.should =~ /#{arg1}/i }
9
+ end
@@ -0,0 +1,13 @@
1
+ module Twitter
2
+ module Search
3
+ class Result < BaseController
4
+ @model = ResultModel
5
+ @view = ResultView
6
+
7
+ def self.each
8
+ @view.results.each {|item| yield item}
9
+ end
10
+ end
11
+ end
12
+ end
13
+
@@ -0,0 +1,5 @@
1
+ module Twitter
2
+ module Search
3
+ ResultModel = Watirmark::Model::Base.new(*ResultView.keywords)
4
+ end
5
+ end
@@ -0,0 +1,19 @@
1
+ module Twitter
2
+ module Search
3
+ class ResultView < BaseView
4
+ private_keyword(:result_container) { browser.div(:id => 'stream-items-id')}
5
+ private_keyword(:results) { result_container.divs(:class, 'content').map(&:text)}
6
+
7
+ class << self
8
+ def home(model)
9
+ end
10
+
11
+ def create(model)
12
+ end
13
+
14
+ def edit(model)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
data/bin/watirmark ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ $:<< File.dirname(__FILE__)
3
+
4
+ require 'rubigen'
5
+ require 'rubigen/scripts/generate'
6
+
7
+ source = RubiGen::PathSource.new(:application, File.join(File.dirname(__FILE__), "../app_generators"))
8
+ RubiGen::Base.reset_sources
9
+ RubiGen::Base.append_sources source
10
+ RubiGen::Scripts::Generate.new.run(ARGV, :generator => 'create_project')
data/lib/watirmark.rb ADDED
@@ -0,0 +1,26 @@
1
+ if RUBY_VERSION != "1.9.3"
2
+ warn "
3
+ ************************************************************************
4
+ Using unsupported Ruby version #{RUBY_VERSION}. Please upgrade to 1.9.3
5
+ ************************************************************************
6
+ "
7
+ end
8
+
9
+ require 'watirmark/configuration'
10
+ Watirmark::Configuration.instance.reload
11
+
12
+ require 'watirmark/at_exit'
13
+ require 'watir-webdriver'
14
+ require 'watirmark/extensions/webdriver_extensions'
15
+ require 'watirmark/extensions/ruby_extensions'
16
+ require 'watirmark/session'
17
+ require 'watirmark/exceptions'
18
+ require 'watirmark/page/keyed_element'
19
+ require 'watirmark/page/page'
20
+ require 'watirmark/controller/controller'
21
+ require 'american_date'
22
+ require 'uuid'
23
+ require 'watirmark/model'
24
+ require 'watirmark/rake/smoketest'
25
+ require 'active_support/inflector'
26
+ FileUtils.rm_rf('reports/screenshots')
@@ -0,0 +1,13 @@
1
+ module Watirmark
2
+ def self.add_exit_task &block
3
+ at_exit {
4
+ if $!.nil? || $!.is_a?(SystemExit) && $!.success?
5
+ code = 0
6
+ else
7
+ code = $!.is_a?(SystemExit) ? $!.status : 1
8
+ end
9
+ block.call
10
+ exit code
11
+ }
12
+ end
13
+ end
@@ -0,0 +1,201 @@
1
+ require 'singleton'
2
+ require 'logger'
3
+
4
+ module Watirmark
5
+
6
+ class Configuration
7
+ include Singleton
8
+
9
+ def initialize
10
+ @settings = {}
11
+ @runtime_defaults = {}
12
+ reload
13
+ end
14
+
15
+ def defaults
16
+ {
17
+ :configfile => nil,
18
+ :hostname => nil,
19
+ :email => 'devnull',
20
+ :closebrowseronexit => false,
21
+ :loglevel => Logger::INFO,
22
+ :uuid => nil,
23
+ :webdriver => :firefox,
24
+ # database
25
+ :dbhostname => nil,
26
+ :dbusername => nil,
27
+ :dbpassword => nil,
28
+ :dbsid => nil,
29
+ :dbport => nil,
30
+ # snapshots
31
+ :snapshotwidth => 1000,
32
+ :snapshotheight => 1000,
33
+ :sandbox => false,
34
+ :projectpath => nil,
35
+
36
+ #to deprecate
37
+ :profile => Hash.new { |h, k| h[k] = Hash.new },
38
+ :profile_name => :undefined,
39
+
40
+ }.merge @runtime_defaults
41
+ end
42
+
43
+ def defaults=(x)
44
+ @runtime_defaults.merge! x
45
+ reload
46
+ end
47
+
48
+ def update(values)
49
+ values.each_pair { |k, v|
50
+ v = Logger.const_get(v.upcase) if k.to_s == "loglevel" && v.class == String
51
+ self[k] = v
52
+ }
53
+ end
54
+
55
+ def inspect
56
+ @settings.inspect
57
+ end
58
+
59
+ def reset
60
+ @settings.each_key { |key| @settings.delete key }
61
+ end
62
+
63
+ def [](key)
64
+ @settings[key.to_sym]
65
+ end
66
+
67
+ def []=(key, value)
68
+ override_method = "#{key}_value".to_sym
69
+ if respond_to? override_method
70
+ @settings[key.to_sym] = self.send override_method, value
71
+ else
72
+ @settings[key.to_sym] = value
73
+ end
74
+ end
75
+
76
+ def method_missing(sym, *args)
77
+ if sym.to_s =~ /(.+)=$/
78
+ self[$1] = args.first
79
+ else
80
+ self[sym]
81
+ end
82
+ end
83
+
84
+ def db
85
+ @db = nil if (@db && @db.respond_to?(:dbh) && @db.dbh.handle == nil)
86
+ @db ||= WatirmarkDB::DB.new(self.hostname, self.dbhostname, self.dbusername, self.dbpassword, self.dbsid, self.dbport)
87
+ end
88
+
89
+
90
+ # This will read in ANY variable set in a configuration file
91
+ def read_from_file
92
+ return unless File.exists?(configfile.to_s)
93
+ filename = File.expand_path(configfile)
94
+ case File.extname filename
95
+ when ".txt", ".hudson"
96
+ parse_text_file filename
97
+ when ".yml"
98
+ parse_yaml_file filename
99
+ else
100
+ Watirmark.logger.warn "Unsure how to handle configuration file #{configfile}. Assuming .txt"
101
+ parse_text_file filename
102
+ end
103
+ end
104
+
105
+ alias :read :read_from_file
106
+
107
+ # The variable needs to be set as a default here or in the
108
+ # library to be read from the environment
109
+ def read_from_environment
110
+ @settings.each_key do |var|
111
+ next if var.to_s.upcase == "USERNAME"
112
+ env = ENV[var.to_s.upcase]
113
+ if var == :webdriver
114
+ ENV['JOB_NAME']=~ /WEBDRIVER=(\w+)/
115
+ env ||= $1
116
+ end
117
+ update var.to_sym => env if env
118
+ end
119
+ end
120
+
121
+ def reload
122
+ update(defaults)
123
+ read_from_file
124
+ read_from_environment
125
+ initialize_logger
126
+ end
127
+
128
+ def logger
129
+ @logger ||= begin
130
+ log = Logger.new STDOUT
131
+ log.formatter = proc {|severity, datetime, progname, msg| "[#{datetime}] #{msg}\n"}
132
+ log
133
+ end
134
+ end
135
+
136
+ def loglevel=(x)
137
+ logger.level = x
138
+ end
139
+
140
+ private
141
+
142
+ def update_key key, value
143
+ case value
144
+ when 'true'
145
+ update key.to_sym => true
146
+ when 'false'
147
+ update key.to_sym => false
148
+ when /^:(.+)/
149
+ update key.to_sym => $1.to_sym
150
+ when /^\d+\s*$/
151
+ update key.to_sym => value.to_i
152
+ when /^(\d*\.\d+)\s*$/
153
+ update key.to_sym => value.to_f
154
+ else
155
+ update key.to_sym => value
156
+ end
157
+ end
158
+
159
+ def update_profile key
160
+ return unless key =~ /^profile\[:(.+)\]\[:(.+)\]/
161
+ logger.warn "profiles are going to be deprecated. Please use YAML and salesforce_sites"
162
+ if self[:profile][$1.to_sym] == nil
163
+ self[:profile] = ({$1.to_sym => {$2.to_sym => value.to_s}})
164
+ else
165
+ self[:profile][$1.to_sym].merge!({$2.to_sym => value.to_s})
166
+ end
167
+ end
168
+
169
+ def update_profile_yaml
170
+ if self[:salesforce_sites] && self[:salesforce_sites]["active"]
171
+ site = self[:salesforce_sites]["active"]
172
+ self[:salesforce_sites][site].each do |key, value|
173
+ self[key.to_sym] = value
174
+ end
175
+ end
176
+ end
177
+
178
+ def parse_yaml_file filename
179
+ YAML.load_file(filename).each_pair { |key, value| update_key key, value }
180
+ update_profile_yaml
181
+ end
182
+
183
+ # This is the old-style method of using a config.txt
184
+ def parse_text_file filename
185
+ Watirmark.logger.warn "Warning: Deprecated use of config.txt. Please use config.yml instead"
186
+ IO.readlines(filename).each do |line|
187
+ line.strip! # Remove all extraneous whitespace
188
+ line.sub!(/#.*$/, "") # Remove comments
189
+ next unless line.length > 0 # Anything left?
190
+ (key, value) = line.split(/\s*=\s*/, 2)
191
+ update_profile key
192
+ update_key key, value
193
+ end
194
+ end
195
+ end
196
+
197
+ def self.logger
198
+ Configuration.instance.logger ||= Logger.new(STDOUT)
199
+ end
200
+
201
+ end