fluent 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 831ffd392a614908ecb6463d83c08722cc6db46e
4
- data.tar.gz: b77b255e808fa50a53e782a6c0e516d0694109ae
3
+ metadata.gz: e7b289657c5c2713886307bdc023c6fdcaf9bbcb
4
+ data.tar.gz: 38bb9627501b8de39e237a5394075f2777160098
5
5
  SHA512:
6
- metadata.gz: c5220df18eb53a74fdafcdcfbb38e89b02e8085cbe321db5a5f6117d842603201ed7f9b75f89d6851c06054d4d8e168319e1d555cb312647d4314026b97d38d9
7
- data.tar.gz: a628d1f6c4436395a4c04435800892a45b92619723a827d729bcd36cc2412974ac17eb3c53352d2c3ba0664fc01f902b6a7178645fb7dffd1d461944219f95dd
6
+ metadata.gz: a092ca78215b22f6b0b62918db49bf3adf109133dc3552df6c0c05cddc52b86863b06121a0a2403c5e62a399a5532cac4f8feee00b215f02fdcb7c9f0cebdd08
7
+ data.tar.gz: a640ce119c147c73d3acf21f50b5e6ad1bbef349de59b3d9b9ec7dcbcb9a7ad4568d3c8df4394b641ac6218de7574bd3c6dc93a3825429a1ffa0250201e5f952
data/HISTORY.md CHANGED
@@ -1,6 +1,17 @@
1
1
  Change Log and History
2
2
  ======================
3
3
 
4
+ Version 0.7.0 / 2013-12-06
5
+ --------------------------
6
+
7
+ This release adds some key new features:
8
+
9
+ * The ability to create workflows and have those workflows automatically executed. The workflow mechanism relies entirely on the factory module in order to create the context by which a set of actions can be taken against a page definition or activity definition.
10
+
11
+ * Two new enclosers have been added: "within_modal" and "within_window". These allow you to work within the context of a modal box or a different browser window.
12
+
13
+ * A data configuration module has been added that allows you to more easily call upon environment or configuration data as part of your test execution.
14
+
4
15
  Version 0.6.0 / 2013-11-26
5
16
  --------------------------
6
17
 
data/README.md CHANGED
@@ -5,6 +5,7 @@ Fluent
5
5
  [![Dependency Status](https://gemnasium.com/jnyman/fluent.png)](https://gemnasium.com/jnyman/fluent)
6
6
  [![Gem Version](https://badge.fury.io/rb/fluent.png)](http://badge.fury.io/rb/fluent)
7
7
  [![Coverage Status](https://coveralls.io/repos/jnyman/fluent/badge.png?branch=master)](https://coveralls.io/r/jnyman/fluent)
8
+ [![Code Climate](https://codeclimate.com/github/jnyman/fluent.png)](https://codeclimate.com/github/jnyman/fluent)
8
9
 
9
10
  Fluent provides a semantic domain-specific language that can be used to construct a fluent interface for test execution libraries.
10
11
 
data/lib/fluent.rb CHANGED
@@ -7,8 +7,10 @@ require 'fluent/enclosers'
7
7
  require 'fluent/evaluators'
8
8
  require 'fluent/generators'
9
9
  require 'fluent/locators'
10
+ require 'fluent/workflows'
10
11
  require 'fluent/data_setter'
11
12
  require 'fluent/data_builder'
13
+ require 'fluent/data_config'
12
14
 
13
15
  require 'watir-webdriver'
14
16
  require 'selenium-webdriver'
@@ -21,6 +23,7 @@ module Fluent
21
23
  include Locators
22
24
  include DataSetter
23
25
  include DataBuilder
26
+ include DataConfig
24
27
 
25
28
  # Browser drivers will be:
26
29
  # [Watir::Browser] or [Selenium::WebDriver::Driver]
@@ -0,0 +1,49 @@
1
+ require 'fluent/data_reader'
2
+
3
+ module Fluent
4
+ module DataConfigHelper
5
+
6
+ # This is being used in order to allow a call to any key in a config
7
+ # file. The key will be treated as a method. Since no such method
8
+ # will exist, the method_missing call will handle finding the key
9
+ # in a file.
10
+ def method_missing(*args, &block)
11
+ determine_data_source unless @data_source
12
+
13
+ key = args.first
14
+
15
+ value = @data_source[key.to_s]
16
+ value = args[1] unless value
17
+
18
+ value
19
+ end
20
+
21
+ # Determines what data source to use. If this is being called, it
22
+ # means no data source was specified. If an environment variable
23
+ # has been set, that will be used. If no data source can be
24
+ # established, a default data file will be referenced.
25
+ def determine_data_source
26
+ @data_source = nil
27
+ @data_source = YAML.load_file "#{data_path}/#{ENV['FLUENT_CONFIG_FILE']}" if ENV['FLUENT_CONFIG_FILE']
28
+
29
+ Fluent::DataConfig.load 'config-data.yml' if @data_source.nil?
30
+ end
31
+
32
+ end
33
+
34
+ module DataConfig
35
+ extend DataReader
36
+ extend DataConfigHelper
37
+
38
+ class << self
39
+ attr_accessor :data_source
40
+ end
41
+
42
+ def self.default_data_path
43
+ 'common/data'
44
+ end
45
+
46
+ end
47
+
48
+
49
+ end
@@ -31,5 +31,36 @@ module Fluent
31
31
  def will_prompt(response, &block)
32
32
  platform.will_prompt(response, &block)
33
33
  end
34
+
35
+ # Used to identify a web element or action on a web element as existing
36
+ # within an enclosing window object. The window can be referenced using
37
+ # either the title attribute of the window or a direct URL. The URL does
38
+ # not have to be the entire URL; it can just be a page name.
39
+ #
40
+ # @param locator [Hash] the :title or :url of the window
41
+ # @param block [Proc] any code that should be executed as an
42
+ # action on or within the window
43
+ def within_window(locator, &block)
44
+ platform.within_window(locator, &block)
45
+ end
46
+
47
+ alias_method :select_window, :within_window
48
+ alias_method :attach_to, :within_window
49
+
50
+ # Used to identify a web element as existing within an enclosing object
51
+ # like a modal dialog box. What this does is override the normal call to
52
+ # showModalDialog and opens a window instead. In order to use this new
53
+ # window, you have to attach to it.
54
+ def within_modal(&block)
55
+ convert_modal_to_window = %Q{
56
+ window.showModalDialog = function(sURL, vArguments, sFeatures) {
57
+ window.dialogArguments = vArguments;
58
+ modalWin = window.open(sURL, 'modal', sFeatures);
59
+ return modalWin;
60
+ }
61
+ }
62
+ driver.execute_script(convert_modal_to_window)
63
+ yield if block_given?
64
+ end
34
65
  end
35
66
  end
data/lib/fluent/errors.rb CHANGED
@@ -5,5 +5,7 @@ module Fluent
5
5
  class TitleNotMatched < StandardError; end
6
6
  class UrlNotMatched < StandardError; end
7
7
  class UnableToCreatePlatform < StandardError; end
8
+ class WorkflowPathNotFound < StandardError; end
9
+ class WorkflowActionNotFound < StandardError; end
8
10
  end
9
11
  end
@@ -2,6 +2,12 @@ module Fluent
2
2
  module Evaluators
3
3
 
4
4
  ## Browser-Level Actions ##
5
+
6
+ def visit(url)
7
+ platform.visit(url)
8
+ end
9
+
10
+ alias_method :navigate_to, :visit
5
11
 
6
12
  def url
7
13
  platform.url
@@ -47,6 +53,12 @@ module Fluent
47
53
  sleep value
48
54
  end
49
55
 
56
+ def focused
57
+ platform.focused
58
+ end
59
+
60
+ alias_method :what_has_focus?, :focused
61
+
50
62
  # Attempts to wait for pending jQuery requests and indicate if the
51
63
  # requests did not occur in a given time period.
52
64
  #
@@ -1,6 +1,9 @@
1
+ require 'fluent/workflows'
2
+
1
3
  module Fluent
2
4
  module Factory
3
-
5
+ include Workflow
6
+
4
7
  # Creates a definition context for actions. If an existing context
5
8
  # exists, that context will be re-used.
6
9
  #
@@ -11,7 +14,11 @@ module Fluent
11
14
  def on(definition, visit=false, &block)
12
15
  definition = get_object_for(definition) if definition.is_a? String
13
16
 
14
- return @active if @active.kind_of?(definition)
17
+ if @active.kind_of?(definition)
18
+ block.call @active if block
19
+ return @active
20
+ end
21
+
15
22
  @active = definition.new(@driver, visit)
16
23
  block.call @active if block
17
24
 
@@ -53,6 +53,13 @@ module Fluent
53
53
  driver.wait_until(timeout, message, &block)
54
54
  end
55
55
 
56
+ def focused
57
+ web_element = driver.execute_script('return document.activeElement')
58
+ type = web_element.type.to_sym if web_element.tag_name.to_sym == :input
59
+ object_class = ::Fluent::WebElements.get_class_for(web_element.tag_name, type)
60
+ object_class.new(web_element, :platform => :watir_webdriver)
61
+ end
62
+
56
63
  ## Encloser Actions ##
57
64
 
58
65
  def will_alert(&block)
@@ -84,6 +91,11 @@ module Fluent
84
91
  result
85
92
  end
86
93
 
94
+ def within_window(locator, &block)
95
+ identifier = {locator.keys.first => /#{Regexp.escape(locator.values.first)}/}
96
+ driver.window(identifier).use(&block)
97
+ end
98
+
87
99
  ## Generator Actions ##
88
100
 
89
101
  def link(locator)
@@ -1,3 +1,3 @@
1
1
  module Fluent
2
- VERSION = '0.6.0'
2
+ VERSION = '0.7.0'
3
3
  end
@@ -0,0 +1,75 @@
1
+ module Fluent
2
+ module WorkflowPaths
3
+ def paths
4
+ @paths
5
+ end
6
+
7
+ def paths=(workflow_path)
8
+ @paths = workflow_path
9
+ end
10
+ end
11
+
12
+ module Workflow
13
+
14
+ def self.included(caller)
15
+ Fluent.trace("#{caller.class} #{caller} is using workflows.")
16
+ caller.extend WorkflowPaths
17
+ @def_caller = caller
18
+ end
19
+
20
+ def self.def_caller
21
+ @def_caller
22
+ end
23
+
24
+ # This provides a workflow for a given workflow path, using a
25
+ # specific definition that is part of that workflow path.
26
+ #
27
+ # @param definition [Object] definition object using the workflow
28
+ # @param path_name [Hash] the name of the path to be used
29
+ # @param block [Proc] a block to be executed as part of the workflow
30
+ # @return [Object] the definition being interacted with
31
+ def workflow_for(definition, path_name = {:using => :default}, &block)
32
+ path_name[:using] = :default unless path_name[:using]
33
+
34
+ path_workflow = workflow_path_for(path_name)
35
+
36
+ workflow_goal = work_item_index_for(path_workflow, definition)
37
+
38
+ workflow_start = path_name[:from] ? path_workflow.find_index { |item| item[0] == path_name[:from]} : 0
39
+
40
+ perform_workflow(path_workflow[workflow_start..workflow_goal])
41
+
42
+ on(definition, &block)
43
+ end
44
+
45
+ def workflow_path_for(path_name)
46
+ # Since I am dealing with an array that contains a hash that, in
47
+ # turn, contains an array of arrays, below I need to make sure I
48
+ # index into the array before keying into the hash. That's the
49
+ # purpose of the [0].
50
+ path = Workflow.def_caller.paths[0][path_name[:using]]
51
+
52
+ raise Fluent::Errors::WorkflowPathNotFound,
53
+ "Workflow path '#{path_name[:using].to_s}' not found." unless path
54
+
55
+ path
56
+ end
57
+
58
+ def work_item_index_for(path_workflow, definition)
59
+ path_workflow.find_index { |item| item[0] == definition }
60
+ end
61
+
62
+ def perform_workflow(definitions)
63
+ definitions.each do |definition, action, *args|
64
+ active = on(definition)
65
+
66
+ raise Fluent::Errors::WorkflowActionNotFound,
67
+ "Workflow action '#{action}' not defined on #{definition}." unless active.respond_to? action
68
+
69
+ active.send action unless args
70
+ active.send action, *args if args
71
+ end
72
+ end
73
+
74
+ end
75
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Nyman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-26 00:00:00.000000000 Z
11
+ date: 2013-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -53,19 +53,19 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '2.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: simplecov
56
+ name: require_all
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '='
59
+ - - '>='
60
60
  - !ruby/object:Gem::Version
61
- version: 0.7.1
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '='
66
+ - - '>='
67
67
  - !ruby/object:Gem::Version
68
- version: 0.7.1
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: watir-webdriver
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -116,6 +116,7 @@ extensions: []
116
116
  extra_rdoc_files: []
117
117
  files:
118
118
  - lib/fluent/data_builder.rb
119
+ - lib/fluent/data_config.rb
119
120
  - lib/fluent/data_reader.rb
120
121
  - lib/fluent/data_setter.rb
121
122
  - lib/fluent/enclosers.rb
@@ -168,6 +169,7 @@ files:
168
169
  - lib/fluent/web_elements/unordered_list.rb
169
170
  - lib/fluent/web_elements/web_element.rb
170
171
  - lib/fluent/web_elements.rb
172
+ - lib/fluent/workflows.rb
171
173
  - lib/fluent.rb
172
174
  - LICENSE.txt
173
175
  - README.md