makevoid-taza 0.8.6

Sign up to get free protection for your applications and to get access to all the features.
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
+