jasmine 1.3.0 → 1.3.1

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 (46) hide show
  1. data/Rakefile +11 -2
  2. data/generators/jasmine/templates/spec/javascripts/support/jasmine-rails.yml +2 -2
  3. data/generators/jasmine/templates/spec/javascripts/support/jasmine.yml +2 -1
  4. data/jasmine.gemspec +1 -1
  5. data/lib/jasmine.rb +10 -2
  6. data/lib/jasmine/application.rb +6 -33
  7. data/lib/jasmine/asset_expander.rb +19 -0
  8. data/lib/jasmine/asset_pipeline_mapper.rb +11 -14
  9. data/lib/jasmine/asset_pipeline_utility.rb +19 -0
  10. data/lib/jasmine/base.rb +4 -0
  11. data/lib/jasmine/config.rb +74 -111
  12. data/lib/jasmine/configuration.rb +83 -0
  13. data/lib/jasmine/core_configuration.rb +28 -0
  14. data/lib/jasmine/javascripts/boot.js +28 -0
  15. data/lib/jasmine/path_expander.rb +18 -0
  16. data/lib/jasmine/path_mapper.rb +29 -0
  17. data/lib/jasmine/results_processor.rb +21 -20
  18. data/lib/jasmine/run.html.erb +0 -37
  19. data/lib/jasmine/run_specs.rb +12 -8
  20. data/lib/jasmine/server.rb +1 -1
  21. data/lib/jasmine/tasks/jasmine.rake +3 -4
  22. data/lib/jasmine/version.rb +1 -1
  23. data/lib/jasmine/yaml_config_parser.rb +54 -0
  24. data/spec/application_integration_spec.rb +15 -0
  25. data/spec/application_spec.rb +37 -92
  26. data/spec/asset_expander_spec.rb +42 -0
  27. data/spec/asset_pipeline_mapper_spec.rb +12 -11
  28. data/spec/base_spec.rb +14 -0
  29. data/spec/configuration_spec.rb +163 -0
  30. data/spec/jasmine_self_test_spec.rb +14 -7
  31. data/spec/page_spec.rb +2 -4
  32. data/spec/path_expander_spec.rb +96 -0
  33. data/spec/path_mapper_spec.rb +33 -0
  34. data/spec/server_spec.rb +2 -2
  35. data/spec/yaml_config_parser_spec.rb +182 -0
  36. metadata +34 -23
  37. data/lib/jasmine/runner_config.rb +0 -71
  38. data/lib/jasmine/sprockets_mapper.rb +0 -13
  39. data/lib/rack/jasmine/redirect.rb +0 -20
  40. data/spec/config_spec.rb +0 -309
  41. data/spec/fixture/jasmine.erb.yml +0 -4
  42. data/spec/fixture/spec/example_spec.js +0 -5
  43. data/spec/fixture/src/example.js +0 -3
  44. data/spec/jasmine_self_test_config.rb +0 -19
  45. data/spec/runner_config_spec.rb +0 -136
  46. data/spec/sprockets_mapper_spec.rb +0 -17
data/Rakefile CHANGED
@@ -29,10 +29,19 @@ task :default => :spec
29
29
 
30
30
  namespace :jasmine do
31
31
  require "jasmine-core"
32
- require './spec/jasmine_self_test_config'
33
32
  task :server do
34
33
  port = ENV['JASMINE_PORT'] || 8888
35
- JasmineSelfTestConfig.new.start_server(port)
34
+ Jasmine.configure do |config|
35
+ root = File.expand_path(File.join(File.dirname(__FILE__), ".."))
36
+ config.src_dir = File.join(root, 'src')
37
+ config.spec_dir = Jasmine::Core.path
38
+ config.spec_files = lambda { (Jasmine::Core.html_spec_files + Jasmine::Core.core_spec_files).map {|f| File.join(config.spec_dir, f) } }
39
+ end
40
+
41
+ config = Jasmine.config
42
+
43
+ server = Jasmine::Server.new(8888, Jasmine::Application.app(config))
44
+ server.start
36
45
 
37
46
  puts "your tests are here:"
38
47
  puts " http://localhost:#{port}/"
@@ -43,7 +43,7 @@ stylesheets:
43
43
  # - helpers/**/*.js
44
44
  #
45
45
  helpers:
46
- - helpers/**/*.js
46
+ - 'helpers/**/*.js'
47
47
 
48
48
  # spec_files
49
49
  #
@@ -53,7 +53,7 @@ helpers:
53
53
  # EXAMPLE:
54
54
  #
55
55
  # spec_files:
56
- # - **/*[sS]pec.js
56
+ # - '**/*[sS]pec.js'
57
57
  #
58
58
  spec_files:
59
59
  - '**/*[sS]pec.js'
@@ -37,7 +37,7 @@ stylesheets:
37
37
  # - helpers/**/*.js
38
38
  #
39
39
  helpers:
40
-
40
+ - 'helpers/**/*.js'
41
41
  # spec_files
42
42
  #
43
43
  # Return an array of filepaths relative to spec_dir to include.
@@ -49,6 +49,7 @@ helpers:
49
49
  # - **/*[sS]pec.js
50
50
  #
51
51
  spec_files:
52
+ - '**/*[sS]pec.js'
52
53
 
53
54
  # src_dir
54
55
  #
@@ -67,7 +67,7 @@ Gem::Specification.new do |s|
67
67
  s.add_development_dependency 'json_pure'
68
68
  s.add_development_dependency 'nokogiri'
69
69
 
70
- s.add_dependency 'jasmine-core', ">= 1.3.0"
70
+ s.add_dependency 'jasmine-core', "~> 1.3.1"
71
71
  s.add_dependency 'rack', '~> 1.0'
72
72
  s.add_dependency 'rspec', '>= 1.3.1'
73
73
  s.add_dependency 'selenium-webdriver', '>= 0.1.3'
@@ -1,6 +1,7 @@
1
1
  jasmine_files = ['base',
2
2
  'dependencies',
3
- 'runner_config',
3
+ 'core_configuration',
4
+ 'configuration',
4
5
  'config',
5
6
  'application',
6
7
  'server',
@@ -8,15 +9,22 @@ jasmine_files = ['base',
8
9
  'rspec_formatter',
9
10
  'command_line_tool',
10
11
  'page',
12
+ 'path_mapper',
13
+ 'asset_pipeline_utility',
11
14
  'asset_pipeline_mapper',
12
- 'sprockets_mapper',
15
+ 'asset_expander',
13
16
  'results_processor',
14
17
  'results',
18
+ 'path_expander',
19
+ 'yaml_config_parser',
15
20
  File.join('runners', 'http')]
16
21
 
17
22
  jasmine_files.each do |file|
18
23
  require File.join('jasmine', file)
19
24
  end
25
+ # jasmine_rack_files.each do |file|
26
+ # require File.join('rack', 'jasmine', file)
27
+ # end
20
28
 
21
29
  require File.join('jasmine', "railtie") if Jasmine::Dependencies.rails3?
22
30
 
@@ -3,46 +3,19 @@ require 'rack/utils'
3
3
  require 'jasmine-core'
4
4
  require 'rack/jasmine/runner'
5
5
  require 'rack/jasmine/focused_suite'
6
- require 'rack/jasmine/redirect'
7
6
  require 'rack/jasmine/cache_control'
8
7
  require 'ostruct'
9
8
 
10
9
  module Jasmine
11
10
  class Application
12
- def self.app(config = Jasmine::RunnerConfig.new)
13
- page = Jasmine::Page.new(config)
14
- if Jasmine::Dependencies.rails_3_asset_pipeline?
15
- config.src_mapper = Jasmine::AssetPipelineMapper.new
11
+ def self.app(config, builder = Rack::Builder.new)
12
+ config.rack_apps.each do |(app, config_block)|
13
+ builder.use(app, &config_block)
16
14
  end
17
- Rack::Builder.app do
18
- use Rack::Head
19
- use Rack::Jasmine::CacheControl
20
- if Jasmine::Dependencies.rails_3_asset_pipeline?
21
- map('/assets') do
22
- #load the Sprockets asset helpers
23
- Rails.application.assets.context_class.instance_eval do
24
- include ::Sprockets::Helpers::IsolatedHelper
25
- include ::Sprockets::Helpers::RailsHelper
26
- end
27
- run Rails.application.assets
28
- end
29
- end
30
-
31
- map('/run.html') { run Rack::Jasmine::Redirect.new('/') }
32
- map('/__suite__') { run Rack::Jasmine::FocusedSuite.new(config) }
33
-
34
- #TODO: These path mappings should come from the config.
35
- map('/__JASMINE_ROOT__') { run Rack::File.new(Jasmine::Core.path) }
36
- map(config.spec_path) { run Rack::File.new(config.spec_dir) }
37
- map(config.root_path) { run Rack::File.new(config.project_root) }
38
-
39
- map('/') do
40
- run Rack::Cascade.new([
41
- Rack::URLMap.new('/' => Rack::File.new(config.src_dir)),
42
- Rack::Jasmine::Runner.new(page)
43
- ])
44
- end
15
+ config.rack_path_map.each do |path, handler|
16
+ builder.map(path) { run handler.call }
45
17
  end
18
+ builder
46
19
  end
47
20
  end
48
21
  end
@@ -0,0 +1,19 @@
1
+ module Jasmine
2
+ class AssetExpander
3
+ def initialize(bundled_asset_factory, asset_path_for)
4
+ @bundled_asset_factory = bundled_asset_factory
5
+ @asset_path_for = asset_path_for
6
+ end
7
+
8
+ def expand(src_dir, src_path)
9
+ pathname = src_path.gsub(/^\/?assets\//, '').gsub(/\.js$/, '')
10
+ bundled_asset = @bundled_asset_factory.call(pathname, 'js')
11
+ return nil unless bundled_asset
12
+
13
+ base_asset = "#{bundled_asset.pathname.to_s.gsub(/#{src_dir}/, '')}?body=true"
14
+ bundled_asset.to_a.inject([base_asset]) do |assets, asset|
15
+ assets << "/#{@asset_path_for.call(asset).gsub(/^\//, '')}?body=true"
16
+ end.flatten
17
+ end
18
+ end
19
+ end
@@ -1,19 +1,16 @@
1
- class Jasmine::AssetPipelineMapper
1
+ module Jasmine
2
+ class AssetPipelineMapper
2
3
 
3
- def self.context
4
- context = ::Rails.application.assets.context_class
5
- context.extend(::Sprockets::Helpers::IsolatedHelper)
6
- context.extend(::Sprockets::Helpers::RailsHelper)
7
- end
4
+ def initialize(config, asset_expander)
5
+ @config = config
6
+ @asset_expander = asset_expander
7
+ end
8
8
 
9
- def initialize(context = Jasmine::AssetPipelineMapper.context)
10
- @context = context
11
- end
9
+ def map_src_paths(src_paths)
10
+ src_paths.map do |src_path|
11
+ @asset_expander.call(@config.src_dir, src_path) || src_path
12
+ end.flatten.uniq
13
+ end
12
14
 
13
- def files(src_files)
14
- src_files.map do |src_file|
15
- filename = src_file.gsub(/^assets\//, '').gsub(/\.js$/, '')
16
- @context.asset_paths.asset_for(filename, 'js').to_a.map { |p| @context.asset_path(p).gsub(/^\//, '') + "?body=true" }
17
- end.flatten.uniq
18
15
  end
19
16
  end
@@ -0,0 +1,19 @@
1
+ module Jasmine
2
+ class AssetPipelineUtility
3
+ def self.bundled_asset_factory(pathname, ext)
4
+ context.asset_paths.asset_for(pathname, 'js')
5
+ end
6
+
7
+ def self.asset_path_for(filepath)
8
+ context.asset_path(filepath)
9
+ end
10
+
11
+ def self.context
12
+ return @context if @context
13
+ @context = ::Rails.application.assets.context_class
14
+ @context.extend(::Sprockets::Helpers::IsolatedHelper)
15
+ @context.extend(::Sprockets::Helpers::RailsHelper)
16
+ end
17
+
18
+ end
19
+ end
@@ -47,4 +47,8 @@ module Jasmine
47
47
  File.read(File.join(File.dirname(__FILE__), "run.html.erb"))
48
48
  end
49
49
 
50
+ def self.root(*paths)
51
+ File.expand_path(File.join(File.dirname(__FILE__), *paths))
52
+ end
53
+
50
54
  end
@@ -1,122 +1,85 @@
1
1
  module Jasmine
2
- class Config
3
- attr_accessor :src_mapper
4
-
5
- require 'yaml'
6
- require 'erb'
7
- require 'json'
8
-
9
- def match_files(dir, patterns)
10
- dir = File.expand_path(dir)
11
- negative, positive = patterns.partition {|pattern| /^!/ =~ pattern}
12
- chosen, negated = [positive, negative].collect do |patterns|
13
- patterns.collect do |pattern|
14
- matches = Dir.glob(File.join(dir, pattern.gsub(/^!/,'')))
15
- matches.empty? && !(pattern =~ /\*|^\!/) ? pattern : matches.collect {|f| f.sub("#{dir}/", "")}.sort
16
- end.flatten.uniq
17
- end
18
- chosen - negated
19
- end
20
-
21
- def simple_config
22
- config = File.exist?(simple_config_file) ? YAML::load(ERB.new(File.read(simple_config_file)).result(binding)) : false
23
- config || {}
24
- end
25
-
26
-
27
- def spec_path
28
- "/__spec__"
29
- end
30
-
31
- def root_path
32
- "/__root__"
33
- end
34
-
35
- def js_files(spec_filter = nil)
36
- spec_files_to_include = spec_filter.nil? ? spec_files : match_files(spec_dir, [spec_filter])
37
- src_files.collect {|f| "/" + f } + helpers.collect {|f| File.join(spec_path, f) } + spec_files_to_include.collect {|f| File.join(spec_path, f) }
38
- end
39
-
40
- def user_stylesheets
41
- stylesheets.collect {|f| "/" + f }
42
- end
43
-
44
- def spec_files_full_paths
45
- spec_files.collect {|spec_file| File.join(spec_dir, spec_file) }
46
- end
47
-
48
- def project_root
49
- Dir.pwd
50
- end
51
-
52
- def simple_config_file
53
- File.join(project_root, 'spec/javascripts/support/jasmine.yml')
54
- end
55
-
56
- def src_dir
57
- if simple_config['src_dir']
58
- File.join(project_root, simple_config['src_dir'])
59
- else
60
- project_root
61
- end
62
- end
2
+ require 'erb'
3
+ def self.configure(&block)
4
+ block.call(self.config)
5
+ end
63
6
 
64
- def spec_dir
65
- if simple_config['spec_dir']
66
- File.join(project_root, simple_config['spec_dir'])
67
- else
68
- File.join(project_root, 'spec/javascripts')
69
- end
7
+ def self.initialize_config
8
+ return if @config
9
+ @config = Jasmine::Configuration.new
10
+ core_config = Jasmine::CoreConfiguration.new
11
+
12
+ @config.add_path_mapper(Jasmine::PathMapper.method(:new))
13
+
14
+ @config.jasmine_path = jasmine_path = "/__jasmine__"
15
+ @config.src_path = src_path = "/"
16
+ @config.spec_path = spec_path = "/__spec__"
17
+ @config.boot_path = boot_path = "/__boot__"
18
+
19
+ @config.jasmine_dir = core_config.path
20
+ @config.boot_dir = core_config.boot_path
21
+ @config.boot_files = lambda { core_config.boot_files }
22
+ @config.jasmine_files = lambda { core_config.js_files }
23
+ @config.jasmine_css_files = lambda { core_config.css_files }
24
+
25
+ @config.add_rack_path(jasmine_path, lambda { Rack::File.new(config.jasmine_dir) })
26
+ @config.add_rack_path(boot_path, lambda { Rack::File.new(config.boot_dir) })
27
+ @config.add_rack_path(spec_path, lambda { Rack::File.new(config.spec_dir) })
28
+ @config.add_rack_path(src_path, lambda {
29
+ Rack::Cascade.new([
30
+ Rack::URLMap.new('/' => Rack::File.new(config.src_dir)),
31
+ Rack::Jasmine::Runner.new(Jasmine::Page.new(config))
32
+ ])
33
+ })
34
+
35
+ @config.add_rack_app(Rack::Head)
36
+ @config.add_rack_app(Rack::Jasmine::CacheControl)
37
+
38
+ if Jasmine::Dependencies.rails_3_asset_pipeline?
39
+ @config.add_path_mapper(lambda { |config|
40
+ asset_expander = Jasmine::AssetExpander.new(
41
+ Jasmine::AssetPipelineUtility.method(:bundled_asset_factory),
42
+ Jasmine::AssetPipelineUtility.method(:asset_path_for)
43
+ )
44
+ Jasmine::AssetPipelineMapper.new(config, asset_expander.method(:expand))
45
+ })
46
+ @config.add_rack_path('/assets', lambda {
47
+ # In order to have asset helpers like asset_path and image_path, we need to require 'action_view/base'. This
48
+ # triggers run_load_hooks on action_view which, in turn, causes sprockets/railtie to load the Sprockets asset
49
+ # helpers. Alternatively, you can include the helpers yourself without loading action_view/base:
50
+ Rails.application.assets.context_class.instance_eval do
51
+ include ::Sprockets::Helpers::IsolatedHelper
52
+ include ::Sprockets::Helpers::RailsHelper
53
+ end
54
+ Rails.application.assets
55
+ })
70
56
  end
71
57
 
72
- def helpers
73
- if simple_config['helpers']
74
- match_files(spec_dir, simple_config['helpers'])
75
- else
76
- match_files(spec_dir, ["helpers/**/*.js"])
77
- end
78
- end
79
-
80
- def src_files
81
- return [] unless simple_config['src_files']
58
+ end
82
59
 
83
- if self.src_mapper
84
- self.src_mapper.files(simple_config['src_files'])
85
- else
86
- match_files(src_dir, simple_config['src_files'])
87
- end
88
- end
60
+ def self.config
61
+ initialize_config
62
+ @config
63
+ end
89
64
 
90
- def spec_files
91
- if simple_config['spec_files']
92
- match_files(spec_dir, simple_config['spec_files'])
93
- else
94
- match_files(spec_dir, ["**/*[sS]pec.js"])
65
+ def self.load_configuration_from_yaml(path = nil)
66
+ path ||= File.join(Dir.pwd, 'spec', 'javascripts', 'support', 'jasmine.yml')
67
+ if File.exist?(path)
68
+ yaml_loader = lambda do |filepath|
69
+ YAML::load(ERB.new(File.read(filepath)).result(binding)) if File.exist?(filepath)
95
70
  end
96
- end
97
-
98
- def stylesheets
99
- if simple_config['stylesheets']
100
- match_files(src_dir, simple_config['stylesheets'])
101
- else
102
- []
71
+ yaml_config = Jasmine::YamlConfigParser.new(path, Dir.pwd, Jasmine::PathExpander.method(:expand), yaml_loader)
72
+ Jasmine.configure do |config|
73
+ config.jasmine_dir = yaml_config.jasmine_dir if yaml_config.jasmine_dir
74
+ config.jasmine_files = lambda { yaml_config.jasmine_files } if yaml_config.jasmine_files.any?
75
+ config.jasmine_css_files = lambda { yaml_config.jasmine_css_files } if yaml_config.jasmine_css_files.any?
76
+ config.src_files = lambda { yaml_config.src_files }
77
+ config.spec_files = lambda { yaml_config.helpers + yaml_config.spec_files }
78
+ config.css_files = lambda { yaml_config.css_files }
79
+ config.src_dir = yaml_config.src_dir
80
+ config.spec_dir = yaml_config.spec_dir
103
81
  end
104
82
  end
105
-
106
- def jasmine_host
107
- ENV["JASMINE_HOST"] || 'http://localhost'
108
- end
109
-
110
- def port
111
- @port ||= ENV["JASMINE_PORT"] || Jasmine.find_unused_port
112
- end
113
-
114
- def jasmine_stylesheets
115
- ::Jasmine::Core.css_files.map {|f| "/__JASMINE_ROOT__/#{f}"}
116
- end
117
-
118
- def jasmine_javascripts
119
- ::Jasmine::Core.js_files.map {|f| "/__JASMINE_ROOT__/#{f}" }
120
- end
121
83
  end
84
+
122
85
  end
@@ -0,0 +1,83 @@
1
+ module Jasmine
2
+ class Configuration
3
+ attr_writer :jasmine_css_files, :css_files
4
+ attr_writer :jasmine_files, :boot_files, :src_files, :spec_files
5
+ attr_accessor :jasmine_path, :spec_path, :boot_path, :src_path
6
+ attr_accessor :jasmine_dir, :spec_dir, :boot_dir, :src_dir
7
+ #TODO: these are largely client concerns, move them.
8
+ attr_accessor :port, :browser, :host, :result_batch_size
9
+
10
+ def initialize()
11
+ @rack_paths = {}
12
+ @apps = []
13
+ @path_mappers = []
14
+ @jasmine_css_files = lambda { [] }
15
+ @css_files = lambda { [] }
16
+ @jasmine_files = lambda { [] }
17
+ @boot_files = lambda { [] }
18
+ @src_files = lambda { [] }
19
+ @spec_files = lambda { [] }
20
+ end
21
+
22
+ def css_files
23
+ map(@jasmine_css_files, :jasmine) +
24
+ map(@css_files, :src)
25
+ end
26
+
27
+ def js_files
28
+ map(@jasmine_files, :jasmine) +
29
+ map(@src_files, :src) +
30
+ map(@spec_files, :spec) +
31
+ map(@boot_files, :boot)
32
+ end
33
+
34
+ def rack_path_map
35
+ {}.merge(@rack_paths)
36
+ end
37
+
38
+ def add_rack_path(path, rack_app_lambda)
39
+ @rack_paths[path] = rack_app_lambda
40
+ end
41
+
42
+ def rack_apps
43
+ [] + @apps
44
+ end
45
+
46
+ def add_rack_app(app, &block)
47
+ @apps << [app, block]
48
+ end
49
+
50
+ def add_path_mapper(mapper)
51
+ @path_mappers << mapper.call(self)
52
+ end
53
+
54
+ def port
55
+ @port ||= Jasmine.find_unused_port
56
+ end
57
+
58
+ def browser
59
+ @browser || 'firefox'
60
+ end
61
+
62
+ def host
63
+ @host || 'http://localhost'
64
+ end
65
+
66
+ def result_batch_size
67
+ @result_batch_size || 50
68
+ end
69
+
70
+ private
71
+
72
+ def map(paths, type)
73
+ @path_mappers.inject(paths.call) do |paths, mapper|
74
+ if mapper.respond_to?("map_#{type}_paths")
75
+ mapper.send("map_#{type}_paths", paths)
76
+ else
77
+ paths
78
+ end
79
+ end
80
+ end
81
+
82
+ end
83
+ end