makevoid-taza 0.8.6

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.
Files changed (70) hide show
  1. data/History.txt +74 -0
  2. data/Manifest.txt +61 -0
  3. data/README +79 -0
  4. data/README.textile +1 -0
  5. data/VERSION.yml +4 -0
  6. data/bin/taza +17 -0
  7. data/generators/flow/flow_generator.rb +57 -0
  8. data/generators/flow/templates/flow.rb.erb +9 -0
  9. data/generators/page/page_generator.rb +58 -0
  10. data/generators/page/templates/functional_page_spec.rb.erb +8 -0
  11. data/generators/page/templates/page.rb.erb +8 -0
  12. data/generators/partial/partial_generator.rb +57 -0
  13. data/generators/partial/templates/partial.rb.erb +7 -0
  14. data/generators/site/site_generator.rb +56 -0
  15. data/generators/site/templates/site.rb.erb +10 -0
  16. data/generators/site/templates/site.yml.erb +3 -0
  17. data/lib/app_generators/taza/taza_generator.rb +74 -0
  18. data/lib/app_generators/taza/templates/config.yml.erb +3 -0
  19. data/lib/app_generators/taza/templates/rakefile.rb.erb +10 -0
  20. data/lib/app_generators/taza/templates/spec_helper.rb.erb +11 -0
  21. data/lib/extensions/array.rb +10 -0
  22. data/lib/extensions/hash.rb +15 -0
  23. data/lib/extensions/object.rb +33 -0
  24. data/lib/extensions/string.rb +11 -0
  25. data/lib/taza.rb +24 -0
  26. data/lib/taza/browser.rb +53 -0
  27. data/lib/taza/entity.rb +55 -0
  28. data/lib/taza/fixture.rb +68 -0
  29. data/lib/taza/fixtures.rb +24 -0
  30. data/lib/taza/flow.rb +40 -0
  31. data/lib/taza/page.rb +128 -0
  32. data/lib/taza/settings.rb +33 -0
  33. data/lib/taza/site.rb +150 -0
  34. data/lib/taza/tasks.rb +54 -0
  35. data/spec/array_spec.rb +17 -0
  36. data/spec/browser_spec.rb +86 -0
  37. data/spec/entity_spec.rb +35 -0
  38. data/spec/fixture_spec.rb +51 -0
  39. data/spec/fixtures_spec.rb +47 -0
  40. data/spec/flow_generator_spec.rb +50 -0
  41. data/spec/hash_spec.rb +15 -0
  42. data/spec/object_spec.rb +29 -0
  43. data/spec/page_generator_spec.rb +56 -0
  44. data/spec/page_module_spec.rb +165 -0
  45. data/spec/page_spec.rb +105 -0
  46. data/spec/partial_generator_spec.rb +38 -0
  47. data/spec/project_generator_spec.rb +56 -0
  48. data/spec/sandbox/config.yml +3 -0
  49. data/spec/sandbox/config/config.yml +1 -0
  50. data/spec/sandbox/config/site_name.yml +5 -0
  51. data/spec/sandbox/fixtures/examples.yml +15 -0
  52. data/spec/sandbox/fixtures/foo_site/bars.yml +2 -0
  53. data/spec/sandbox/fixtures/foos.yml +3 -0
  54. data/spec/sandbox/fixtures/users.yml +3 -0
  55. data/spec/sandbox/flows/batman.rb +5 -0
  56. data/spec/sandbox/flows/robin.rb +4 -0
  57. data/spec/sandbox/pages/foo/bar.rb +9 -0
  58. data/spec/sandbox/pages/foo/bay.rb +10 -0
  59. data/spec/sandbox/pages/foo/baz.rb +11 -0
  60. data/spec/sandbox/pages/foo/partials/partial_the_reckoning.rb +2 -0
  61. data/spec/settings_spec.rb +92 -0
  62. data/spec/site_fixtures_spec.rb +17 -0
  63. data/spec/site_generator_spec.rb +56 -0
  64. data/spec/site_spec.rb +268 -0
  65. data/spec/spec_helper.rb +57 -0
  66. data/spec/string_spec.rb +8 -0
  67. data/spec/taza_bin_spec.rb +13 -0
  68. data/spec/taza_tasks_spec.rb +56 -0
  69. data/taza.gemspec +46 -0
  70. metadata +196 -0
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+
3
+ module <%= site_name.camelize %>
4
+ class <%= name.camelize %> < ::Taza::Page
5
+
6
+ end
7
+ end
@@ -0,0 +1,56 @@
1
+ require 'rubygems'
2
+ require 'rubigen'
3
+ require 'activesupport'
4
+
5
+ class SiteGenerator < RubiGen::Base
6
+ default_options :author => nil
7
+ attr_reader :name
8
+
9
+ def initialize(runtime_args, runtime_options = {})
10
+ super
11
+ usage if args.empty?
12
+ @name = args.shift
13
+ extract_options
14
+ end
15
+
16
+ def manifest
17
+ record do |m|
18
+ site_path = File.join('lib','sites')
19
+ m.template "site.rb.erb", File.join(site_path,"#{name.underscore}.rb")
20
+ m.directory File.join(site_path,"#{name.underscore}")
21
+ m.directory File.join(site_path,("#{name.underscore}"),"flows")
22
+ m.directory File.join(site_path,("#{name.underscore}"),"pages")
23
+ m.directory File.join(site_path,("#{name.underscore}"),"pages","partials")
24
+ m.directory File.join('spec','isolation',name.underscore)
25
+ m.template "site.yml.erb", File.join('config',"#{name.underscore}.yml")
26
+ end
27
+ end
28
+
29
+ protected
30
+ def banner
31
+ <<-EOS
32
+ Creates a taza site.
33
+
34
+ USAGE: #{$0} #{spec.name} name
35
+ EOS
36
+ end
37
+
38
+ def add_options!(opts)
39
+ # opts.separator ''
40
+ # opts.separator 'Options:'
41
+ # For each option below, place the default
42
+ # at the top of the file next to "default_options"
43
+ # opts.on("-a", "--author=\"Your Name\"", String,
44
+ # "Some comment about this option",
45
+ # "Default: none") { |options[:author]| }
46
+ # opts.on("-v", "--version", "Show the #{File.basename($0)} version number and quit.")
47
+ end
48
+
49
+ def extract_options
50
+ # for each option, extract it into a local variable (and create an "attr_reader :author" at the top)
51
+ # Templates can access these value via the attr_reader-generated methods, but not the
52
+ # raw instance variable value.
53
+ # @author = options[:author]
54
+ end
55
+
56
+ end
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'taza'
3
+
4
+ module <%= name.camelize %>
5
+ include ForwardInitialization
6
+
7
+ class <%= name.camelize %> < ::Taza::Site
8
+
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ ---
2
+ isolation:
3
+ :url: http://www.google.com
@@ -0,0 +1,74 @@
1
+ require 'rubygems'
2
+ require 'rubigen'
3
+ class TazaGenerator < RubiGen::Base
4
+ DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
5
+ Config::CONFIG['ruby_install_name'])
6
+
7
+ default_options :author => nil
8
+
9
+ attr_reader :name
10
+
11
+ def initialize(runtime_args, runtime_options = {})
12
+ super
13
+ usage if args.empty?
14
+ @destination_root = File.expand_path(args.shift)
15
+ @name = base_name
16
+ extract_options
17
+ end
18
+
19
+ def manifest
20
+ record do |m|
21
+ create_directories(m)
22
+ m.template "rakefile.rb.erb", "rakefile"
23
+ m.template "config.yml.erb", File.join("config","config.yml")
24
+ m.template "spec_helper.rb.erb", File.join("spec","spec_helper.rb")
25
+ m.dependency "install_rubigen_scripts", [destination_root, 'taza'],
26
+ :shebang => options[:shebang], :collision => :force
27
+ m.template "console.erb", File.join("script","console")
28
+ m.template "console.cmd.erb", File.join("script","console.cmd")
29
+ end
30
+ end
31
+
32
+ def create_directories(m)
33
+ BASEDIRS.each { |path| m.directory path }
34
+ m.directory File.join('lib','sites')
35
+ m.directory File.join('spec','isolation')
36
+ m.directory File.join('spec','integration')
37
+ m.directory File.join('spec','story')
38
+ m.directory 'script'
39
+ end
40
+
41
+ protected
42
+ def banner
43
+ <<-EOS
44
+ USAGE: #{spec.name} path/for/your/test/project [options]
45
+ EOS
46
+ end
47
+
48
+ def add_options!(opts)
49
+ opts.separator ''
50
+ opts.separator 'Options:'
51
+ # For each option below, place the default
52
+ # at the top of the file next to "default_options"
53
+ # opts.on("-a", "--author=\"Your Name\"", String,
54
+ # "Some comment about this option",
55
+ # "Default: none") { |options[:author]| }
56
+ opts.on("-v", "--version", "Show the #{File.basename($0)} version number and quit.")
57
+ end
58
+
59
+ def extract_options
60
+ # for each option, extract it into a local variable (and create an "attr_reader :author" at the top)
61
+ # Templates can access these value via the attr_reader-generated methods, but not the
62
+ # raw instance variable value.
63
+ # @author = options[:author]
64
+ end
65
+
66
+ # Installation skeleton. Intermediate directories are automatically
67
+ # created so don't sweat their absence here.
68
+ BASEDIRS = %w(
69
+ lib
70
+ config
71
+ script
72
+ spec
73
+ )
74
+ end
@@ -0,0 +1,3 @@
1
+ ---
2
+ :browser: :firefox
3
+ :driver: :selenium
@@ -0,0 +1,10 @@
1
+ <%= "#Generated at #{Time.now}" %>
2
+ require 'rubygems'
3
+ require 'taza/tasks'
4
+
5
+ Taza::Rake::Tasks.new do |t|
6
+ file_hole = "artifacts/#{Time.now.to_i}"
7
+ t.spec_opts = ["--format html:#{file_hole}/index.html",
8
+ "--format p",
9
+ "--format failing_examples:#{file_hole}/failing_examples.txt"]
10
+ end
@@ -0,0 +1,11 @@
1
+ ENV['TAZA_ENV'] = "isolation" if ENV['TAZA_ENV'].nil?
2
+ require 'rubygems'
3
+ require 'spec'
4
+ require 'mocha'
5
+
6
+ lib_path = File.expand_path("#{File.dirname(__FILE__)}/../lib/sites")
7
+ $LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
8
+
9
+ Spec::Runner.configure do |config|
10
+ config.mock_with :mocha
11
+ end
@@ -0,0 +1,10 @@
1
+ class Array
2
+ # Returns true if the two arrays elements are equal ignoring order
3
+ # Example:
4
+ # [1,2].equivalent([2,1]) # => true
5
+ # [1,2,3].equivalent([2,1]) # => false
6
+ def equivalent?(other_array)
7
+ merged_array = self & other_array
8
+ merged_array.size == self.size && merged_array.size == other_array.size
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ class Hash
2
+ def convert_hash_keys_to_methods(fixture) # :nodoc:
3
+ Taza::Entity.new(self,fixture)
4
+ end
5
+
6
+ # Recursively replace key names that should be symbols with symbols.
7
+ def key_strings_to_symbols!
8
+ result = Hash.new
9
+ self.each_pair do |key,value|
10
+ value.key_strings_to_symbols! if value.kind_of? Hash and value.respond_to? :key_strings_to_symbols!
11
+ result[key.to_sym] = value
12
+ end
13
+ self.replace(result)
14
+ end
15
+ end
@@ -0,0 +1,33 @@
1
+ # instance_exec comes with >1.8.7 thankfully
2
+ if VERSION <= '1.8.6'
3
+ class Object
4
+ def metaclass
5
+ class << self; self; end
6
+ end
7
+
8
+ module InstanceExecHelper; end
9
+ include InstanceExecHelper
10
+ # instance_exec method evaluates a block of code relative to the specified object, with parameters whom come from outside the object.
11
+ def instance_exec(*args, &block)
12
+ begin
13
+ old_critical, Thread.critical = Thread.critical, true
14
+ n = 0
15
+ n += 1 while respond_to?(mname="__instance_exec#{n}")
16
+ InstanceExecHelper.module_eval{ define_method(mname, &block) }
17
+ ensure
18
+ Thread.critical = old_critical
19
+ end
20
+ begin
21
+ ret = send(mname, *args)
22
+ ensure
23
+ InstanceExecHelper.module_eval{ remove_method(mname) } rescue nil
24
+ end
25
+ ret
26
+ end
27
+ end
28
+ end
29
+ class Object
30
+ def metaclass
31
+ class << self; self; end
32
+ end
33
+ end
@@ -0,0 +1,11 @@
1
+ require 'rubygems'
2
+ require 'activesupport'
3
+
4
+ class String
5
+ # pluralizes a string and turns it into a symbol
6
+ # Example:
7
+ # "apple".pluralize_to_sym # => :apples
8
+ def pluralize_to_sym
9
+ self.pluralize.to_sym
10
+ end
11
+ end
@@ -0,0 +1,24 @@
1
+ require 'taza/page'
2
+ require 'taza/site'
3
+ require 'taza/browser'
4
+ require 'taza/settings'
5
+ require 'taza/flow'
6
+ require 'taza/entity'
7
+ require 'taza/fixtures'
8
+ require 'extensions/object'
9
+ require 'extensions/string'
10
+ require 'extensions/hash'
11
+ require 'extensions/array'
12
+
13
+ module ForwardInitialization
14
+ module ClassMethods
15
+ def new(*args,&block)
16
+ const_get("#{name.split("::").last}").new(*args,&block)
17
+ end
18
+ end
19
+
20
+ def self.included(klass)
21
+ klass.extend(ClassMethods)
22
+ end
23
+ end
24
+
@@ -0,0 +1,53 @@
1
+ module Taza
2
+ class Browser
3
+
4
+ # Create a browser instance depending on configuration. Configuration should be read in via Taza::Settings.config.
5
+ #
6
+ # Example:
7
+ # browser = Taza::Browser.create(Taza::Settings.config)
8
+ #
9
+ def self.create(params={})
10
+ self.send("create_#{params[:driver]}".to_sym,params)
11
+ end
12
+
13
+ def self.browser_class(params)
14
+ self.send("#{params[:driver]}_#{params[:browser]}".to_sym)
15
+ end
16
+
17
+ private
18
+
19
+ def self.create_watir(params)
20
+ method = "watir_#{params[:browser]}"
21
+ raise BrowserUnsupportedError unless self.respond_to?(method)
22
+ watir = self.send(method,params)
23
+ watir
24
+ end
25
+
26
+ def self.create_selenium(params)
27
+ require 'selenium'
28
+ Selenium::SeleniumDriver.new(params[:server_ip],params[:server_port],'*' + params[:browser].to_s,params[:timeout])
29
+ end
30
+
31
+ def self.watir_firefox(params)
32
+ require 'firewatir'
33
+ FireWatir::Firefox.new
34
+ end
35
+
36
+ def self.watir_safari(params)
37
+ require 'safariwatir'
38
+ Watir::Safari.new
39
+ end
40
+
41
+ def self.watir_ie(params)
42
+ require 'watir'
43
+ if params[:attach]
44
+ browser = Watir::IE.find(:title, //)
45
+ end
46
+ browser || Watir::IE.new
47
+ end
48
+ end
49
+
50
+ # We don't know how to create the browser you asked for
51
+ class BrowserUnsupportedError < StandardError; end
52
+ end
53
+
@@ -0,0 +1,55 @@
1
+ module Taza
2
+
3
+ class Entity
4
+ #Creates a entity, pass in a hash to be methodized and the fixture to look up other fixtures (not entirely happy with this abstraction)
5
+ def initialize(hash,fixture)
6
+ @hash = hash
7
+ @fixture = fixture
8
+ define_methods_for_hash_keys
9
+ end
10
+
11
+ #This method converts hash keys into methods onto the entity
12
+ def define_methods_for_hash_keys
13
+ @hash.keys.each do |key|
14
+ create_method(key) do
15
+ get_value_for_entry(key)
16
+ end
17
+ end
18
+ end
19
+
20
+ #This method will lookup another fixture if a pluralized fixture exists otherwise return the value in the hash
21
+ def get_value_for_entry(key) # :nodoc:
22
+ if @fixture.nil?
23
+ create_entity_if_value_is_hash(key)
24
+ elsif @fixture.fixture_exists?(key)
25
+ @fixture.specific_fixture_entities(key.to_sym, @hash[key])
26
+ elsif @fixture.pluralized_fixture_exists?(key)
27
+ @fixture.get_fixture_entity(key.pluralize.to_sym,@hash[key])
28
+ else
29
+ create_entity_if_value_is_hash(key)
30
+ end
31
+ end
32
+ alias :[] :get_value_for_entry
33
+
34
+ def create_entity_if_value_is_hash(key)
35
+ if (@fixture.nil? && @hash[key].is_a?(Hash))
36
+ Entity.new(@hash[key], nil)
37
+ elsif (!@fixture.nil? && @hash[key].is_a?(Hash))
38
+ Entity.new(@hash[key], @fixture)
39
+ else
40
+ @hash[key]
41
+ end
42
+ end
43
+
44
+ def to_hash
45
+ cloned_hash = @hash.clone
46
+ cloned_hash.key_strings_to_symbols!
47
+ end
48
+
49
+ private
50
+ def create_method(name, &block) # :nodoc:
51
+ self.class.send(:define_method, name, &block)
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,68 @@
1
+ require 'find'
2
+ require 'erb'
3
+ require 'extensions/hash'
4
+ require 'taza/entity'
5
+
6
+ module Taza
7
+ # The module that will mixin methods based on the fixture files in your 'spec/fixtures'
8
+ #
9
+ # Example:
10
+ # describe "something" do
11
+ # it "should test something" do
12
+ # users(:jane_smith).first_name.should eql("jane")
13
+ # end
14
+ # end
15
+ #
16
+ # where there is a spec/fixtures/users.yml file containing a entry of:
17
+ # jane_smith:
18
+ # first_name: jane
19
+ # last_name: smith
20
+ class Fixture # :nodoc:
21
+
22
+ def initialize # :nodoc:
23
+ @fixtures = {}
24
+ end
25
+
26
+ def load_fixtures_from(dir) # :nodoc:
27
+ Dir.glob(File.join(dir,'*.yml')) do |file|
28
+ templatized_fixture=ERB.new(File.read(file))
29
+ entitized_fixture = {}
30
+ YAML.load(templatized_fixture.result()).each do |key, value|
31
+ entitized_fixture[key] = value.convert_hash_keys_to_methods(self)
32
+ end
33
+ @fixtures[File.basename(file,'.yml').to_sym] = entitized_fixture
34
+ end
35
+ end
36
+
37
+ def fixture_names # :nodoc:
38
+ @fixtures.keys
39
+ end
40
+
41
+ def get_fixture(fixture_file_key)
42
+ @fixtures[fixture_file_key]
43
+ end
44
+
45
+ def get_fixture_entity(fixture_file_key,entity_key) # :nodoc:
46
+ @fixtures[fixture_file_key][entity_key]
47
+ end
48
+
49
+ def pluralized_fixture_exists?(singularized_fixture_name) # :nodoc:
50
+ fixture_exists?(singularized_fixture_name.pluralize.to_sym)
51
+ end
52
+
53
+ def specific_fixture_entities(fixture_key, select_array)
54
+ cloned_fixture = @fixtures[fixture_key].clone
55
+ cloned_fixture.delete_if {|key , value| !select_array.include?(key)}
56
+ end
57
+
58
+ def fixture_exists?(fixture_name)
59
+ fixture_names.include?(fixture_name.to_sym)
60
+ end
61
+
62
+ def self.base_path # :nodoc:
63
+ File.join('.','spec','fixtures','')
64
+ end
65
+ end
66
+
67
+ end
68
+