jasmine-multi_json 1.3.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. data/.gitignore +13 -0
  2. data/.rspec +1 -0
  3. data/.travis.yml +58 -0
  4. data/Gemfile +8 -0
  5. data/HOW_TO_TEST.markdown +9 -0
  6. data/MIT.LICENSE +20 -0
  7. data/README.markdown +77 -0
  8. data/RELEASE.markdown +22 -0
  9. data/RELEASE_NOTES.markdown +6 -0
  10. data/Rakefile +62 -0
  11. data/generators/jasmine/jasmine_generator.rb +24 -0
  12. data/generators/jasmine/templates/INSTALL +9 -0
  13. data/generators/jasmine/templates/jasmine-example/SpecRunner.html +54 -0
  14. data/generators/jasmine/templates/jasmine-example/spec/PlayerSpec.js +58 -0
  15. data/generators/jasmine/templates/jasmine-example/spec/SpecHelper.js +9 -0
  16. data/generators/jasmine/templates/jasmine-example/src/Player.js +22 -0
  17. data/generators/jasmine/templates/jasmine-example/src/Song.js +7 -0
  18. data/generators/jasmine/templates/lib/tasks/jasmine.rake +8 -0
  19. data/generators/jasmine/templates/spec/javascripts/support/jasmine-rails.yml +81 -0
  20. data/generators/jasmine/templates/spec/javascripts/support/jasmine.yml +74 -0
  21. data/jasmine.gemspec +74 -0
  22. data/lib/generators/jasmine/examples/USAGE +11 -0
  23. data/lib/generators/jasmine/examples/examples_generator.rb +19 -0
  24. data/lib/generators/jasmine/examples/templates/app/assets/javascripts/jasmine_examples/Player.js +22 -0
  25. data/lib/generators/jasmine/examples/templates/app/assets/javascripts/jasmine_examples/Song.js +7 -0
  26. data/lib/generators/jasmine/examples/templates/spec/javascripts/helpers/SpecHelper.js +9 -0
  27. data/lib/generators/jasmine/examples/templates/spec/javascripts/jasmine_examples/PlayerSpec.js +58 -0
  28. data/lib/generators/jasmine/install/USAGE +11 -0
  29. data/lib/generators/jasmine/install/install_generator.rb +18 -0
  30. data/lib/generators/jasmine/install/templates/spec/javascripts/helpers/.gitkeep +0 -0
  31. data/lib/generators/jasmine/install/templates/spec/javascripts/support/jasmine.yml +76 -0
  32. data/lib/jasmine.rb +31 -0
  33. data/lib/jasmine/application.rb +21 -0
  34. data/lib/jasmine/asset_expander.rb +19 -0
  35. data/lib/jasmine/asset_pipeline_mapper.rb +16 -0
  36. data/lib/jasmine/asset_pipeline_utility.rb +19 -0
  37. data/lib/jasmine/base.rb +54 -0
  38. data/lib/jasmine/command_line_tool.rb +70 -0
  39. data/lib/jasmine/config.rb +85 -0
  40. data/lib/jasmine/configuration.rb +83 -0
  41. data/lib/jasmine/core_configuration.rb +28 -0
  42. data/lib/jasmine/dependencies.rb +59 -0
  43. data/lib/jasmine/firebug/firebug-1.6.2.xpi +0 -0
  44. data/lib/jasmine/firebug/firebug-1.7.0.xpi +0 -0
  45. data/lib/jasmine/firebug/firebug-license.txt +30 -0
  46. data/lib/jasmine/firebug/firebug.rb +30 -0
  47. data/lib/jasmine/javascripts/boot.js +28 -0
  48. data/lib/jasmine/page.rb +11 -0
  49. data/lib/jasmine/path_expander.rb +18 -0
  50. data/lib/jasmine/path_mapper.rb +29 -0
  51. data/lib/jasmine/railtie.rb +21 -0
  52. data/lib/jasmine/results.rb +19 -0
  53. data/lib/jasmine/results_processor.rb +38 -0
  54. data/lib/jasmine/rspec_formatter.rb +92 -0
  55. data/lib/jasmine/run.html.erb +18 -0
  56. data/lib/jasmine/run_specs.rb +36 -0
  57. data/lib/jasmine/runners/http.rb +71 -0
  58. data/lib/jasmine/selenium_driver.rb +41 -0
  59. data/lib/jasmine/server.rb +20 -0
  60. data/lib/jasmine/tasks/jasmine.rake +55 -0
  61. data/lib/jasmine/tasks/jasmine_rails3.rake +1 -0
  62. data/lib/jasmine/version.rb +3 -0
  63. data/lib/jasmine/yaml_config_parser.rb +54 -0
  64. data/lib/rack/jasmine/cache_control.rb +20 -0
  65. data/lib/rack/jasmine/focused_suite.rb +17 -0
  66. data/lib/rack/jasmine/runner.rb +27 -0
  67. data/spec/application_integration_spec.rb +15 -0
  68. data/spec/application_spec.rb +44 -0
  69. data/spec/asset_expander_spec.rb +42 -0
  70. data/spec/asset_pipeline_mapper_spec.rb +19 -0
  71. data/spec/base_spec.rb +14 -0
  72. data/spec/configuration_spec.rb +163 -0
  73. data/spec/dependencies_spec.rb +315 -0
  74. data/spec/fixture/Rakefile +4 -0
  75. data/spec/jasmine_command_line_tool_rakeless_spec.rb +20 -0
  76. data/spec/jasmine_command_line_tool_spec.rb +29 -0
  77. data/spec/jasmine_pojs_spec.rb +47 -0
  78. data/spec/jasmine_rails2_spec.rb +89 -0
  79. data/spec/jasmine_rails3_spec.rb +69 -0
  80. data/spec/jasmine_self_test_spec.rb +29 -0
  81. data/spec/page_spec.rb +23 -0
  82. data/spec/path_expander_spec.rb +96 -0
  83. data/spec/path_mapper_spec.rb +33 -0
  84. data/spec/rack/jasmine/runner_spec.rb +25 -0
  85. data/spec/results_processor_spec.rb +3 -0
  86. data/spec/results_spec.rb +27 -0
  87. data/spec/rspec_formatter_spec.rb +88 -0
  88. data/spec/server_spec.rb +48 -0
  89. data/spec/spec_helper.rb +55 -0
  90. data/spec/yaml_config_parser_spec.rb +182 -0
  91. metadata +310 -0
@@ -0,0 +1,31 @@
1
+ jasmine_files = ['base',
2
+ 'dependencies',
3
+ 'core_configuration',
4
+ 'configuration',
5
+ 'config',
6
+ 'application',
7
+ 'server',
8
+ 'selenium_driver',
9
+ 'rspec_formatter',
10
+ 'command_line_tool',
11
+ 'page',
12
+ 'path_mapper',
13
+ 'asset_pipeline_utility',
14
+ 'asset_pipeline_mapper',
15
+ 'asset_expander',
16
+ 'results_processor',
17
+ 'results',
18
+ 'path_expander',
19
+ 'yaml_config_parser',
20
+ File.join('runners', 'http')]
21
+
22
+ jasmine_files.each do |file|
23
+ require File.join('jasmine', file)
24
+ end
25
+ # jasmine_rack_files.each do |file|
26
+ # require File.join('rack', 'jasmine', file)
27
+ # end
28
+
29
+ require File.join('jasmine', "railtie") if Jasmine::Dependencies.rails3?
30
+
31
+
@@ -0,0 +1,21 @@
1
+ require 'rack'
2
+ require 'rack/utils'
3
+ require 'jasmine-core'
4
+ require 'rack/jasmine/runner'
5
+ require 'rack/jasmine/focused_suite'
6
+ require 'rack/jasmine/cache_control'
7
+ require 'ostruct'
8
+
9
+ module Jasmine
10
+ class Application
11
+ def self.app(config, builder = Rack::Builder.new)
12
+ config.rack_apps.each do |(app, config_block)|
13
+ builder.use(app, &config_block)
14
+ end
15
+ config.rack_path_map.each do |path, handler|
16
+ builder.map(path) { run handler.call }
17
+ end
18
+ builder
19
+ end
20
+ end
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
@@ -0,0 +1,16 @@
1
+ module Jasmine
2
+ class AssetPipelineMapper
3
+
4
+ def initialize(config, asset_expander)
5
+ @config = config
6
+ @asset_expander = asset_expander
7
+ end
8
+
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
14
+
15
+ end
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
@@ -0,0 +1,54 @@
1
+ require 'socket'
2
+ require 'erb'
3
+
4
+ module Jasmine
5
+ # this seemingly-over-complex method is necessary to get an open port on at least some of our Macs
6
+ def self.open_socket_on_unused_port
7
+ infos = Socket::getaddrinfo("localhost", nil, Socket::AF_UNSPEC, Socket::SOCK_STREAM, 0, Socket::AI_PASSIVE)
8
+ families = Hash[*infos.collect { |af, *_| af }.uniq.zip([]).flatten]
9
+
10
+ return TCPServer.open('0.0.0.0', 0) if families.has_key?('AF_INET')
11
+ return TCPServer.open('::', 0) if families.has_key?('AF_INET6')
12
+ return TCPServer.open(0)
13
+ end
14
+
15
+ def self.find_unused_port
16
+ socket = open_socket_on_unused_port
17
+ port = socket.addr[1]
18
+ socket.close
19
+ port
20
+ end
21
+
22
+ def self.server_is_listening_on(hostname, port)
23
+ require 'socket'
24
+ begin
25
+ socket = TCPSocket.open(hostname, port)
26
+ rescue Errno::ECONNREFUSED
27
+ return false
28
+ end
29
+ socket.close
30
+ true
31
+ end
32
+
33
+ def self.wait_for_listener(port, name = "required process", seconds_to_wait = 20)
34
+ time_out_at = Time.now + seconds_to_wait
35
+ until server_is_listening_on "localhost", port
36
+ sleep 0.1
37
+ puts "Waiting for #{name} on #{port}..."
38
+ raise "#{name} didn't show up on port #{port} after #{seconds_to_wait} seconds." if Time.now > time_out_at
39
+ end
40
+ end
41
+
42
+ def self.runner_filepath
43
+ File.expand_path(File.join(File.dirname(__FILE__), "run_specs.rb"))
44
+ end
45
+
46
+ def self.runner_template
47
+ File.read(File.join(File.dirname(__FILE__), "run.html.erb"))
48
+ end
49
+
50
+ def self.root(*paths)
51
+ File.expand_path(File.join(File.dirname(__FILE__), *paths))
52
+ end
53
+
54
+ end
@@ -0,0 +1,70 @@
1
+ module Jasmine
2
+ class CommandLineTool
3
+ def cwd
4
+ File.expand_path(File.join(File.dirname(__FILE__), '../..'))
5
+ end
6
+
7
+ def expand(*paths)
8
+ File.expand_path(File.join(*paths))
9
+ end
10
+
11
+ def template_path(filepath)
12
+ expand(cwd, File.join("generators", "jasmine" ,"templates", filepath))
13
+ end
14
+
15
+ def dest_path(filepath)
16
+ expand(Dir.pwd, filepath)
17
+ end
18
+
19
+ def copy_unless_exists(relative_path, dest_path = nil)
20
+ unless File.exist?(dest_path(relative_path))
21
+ FileUtils.copy(template_path(relative_path), dest_path(dest_path || relative_path))
22
+ end
23
+ end
24
+
25
+ def process(argv)
26
+ if argv[0] == 'init'
27
+ require 'fileutils'
28
+
29
+ FileUtils.makedirs('public/javascripts')
30
+ FileUtils.makedirs('spec/javascripts')
31
+ FileUtils.makedirs('spec/javascripts/support')
32
+ FileUtils.makedirs('spec/javascripts/helpers')
33
+
34
+ copy_unless_exists('jasmine-example/src/Player.js', 'public/javascripts/Player.js')
35
+ copy_unless_exists('jasmine-example/src/Song.js', 'public/javascripts/Song.js')
36
+ copy_unless_exists('jasmine-example/spec/PlayerSpec.js', 'spec/javascripts/PlayerSpec.js')
37
+ copy_unless_exists('jasmine-example/spec/SpecHelper.js', 'spec/javascripts/helpers/SpecHelper.js')
38
+
39
+ rails_tasks_dir = dest_path('lib/tasks')
40
+ if File.exist?(rails_tasks_dir)
41
+ copy_unless_exists('lib/tasks/jasmine.rake')
42
+ copy_unless_exists('spec/javascripts/support/jasmine-rails.yml', 'spec/javascripts/support/jasmine.yml')
43
+ else
44
+ copy_unless_exists('spec/javascripts/support/jasmine.yml')
45
+ require 'rake'
46
+ write_mode = 'w'
47
+ if File.exist?(dest_path('Rakefile'))
48
+ load dest_path('Rakefile')
49
+ write_mode = 'a'
50
+ end
51
+
52
+ unless Rake::Task.task_defined?('jasmine')
53
+ File.open(dest_path('Rakefile'), write_mode) do |f|
54
+ f.write("\n" + File.read(template_path('lib/tasks/jasmine.rake')))
55
+ end
56
+ end
57
+ end
58
+ File.open(template_path('INSTALL'), 'r').each_line do |line|
59
+ puts line
60
+ end
61
+ elsif argv[0] == "license"
62
+ puts File.new(expand(cwd, "MIT.LICENSE")).read
63
+ else
64
+ puts "unknown command #{argv}"
65
+ puts "Usage: jasmine init"
66
+ puts " license"
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,85 @@
1
+ module Jasmine
2
+ require 'erb'
3
+ def self.configure(&block)
4
+ block.call(self.config)
5
+ end
6
+
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
+ })
56
+ end
57
+
58
+ end
59
+
60
+ def self.config
61
+ initialize_config
62
+ @config
63
+ end
64
+
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)
70
+ end
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
81
+ end
82
+ end
83
+ end
84
+
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
@@ -0,0 +1,28 @@
1
+ module Jasmine
2
+ class CoreConfiguration
3
+ def initialize(core = Jasmine::Core)
4
+ @core = core
5
+ end
6
+
7
+ def path
8
+ @core.path
9
+ end
10
+
11
+ #TODO: maybe this doesn't belong in CoreConfig
12
+ def boot_path
13
+ Jasmine.root('javascripts')
14
+ end
15
+
16
+ def boot_files
17
+ Dir.glob(File.join(boot_path, "**"))
18
+ end
19
+
20
+ def js_files
21
+ @core.js_files
22
+ end
23
+
24
+ def css_files
25
+ @core.css_files
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,59 @@
1
+ module Jasmine
2
+ module Dependencies
3
+
4
+ class << self
5
+ def rspec2?
6
+ safe_gem_check("rspec", ">= 2.0")
7
+ end
8
+
9
+ def rails2?
10
+ safe_gem_check("rails", "~> 2.3") && running_rails2?
11
+ end
12
+
13
+ def legacy_rails?
14
+ safe_gem_check("rails", "< 2.3.11") && running_legacy_rails?
15
+ end
16
+
17
+ def rails3?
18
+ safe_gem_check("rails", ">= 3.0") && running_rails3?
19
+ end
20
+
21
+ def legacy_rack?
22
+ !defined?(Rack::Server)
23
+ end
24
+
25
+ def rails_3_asset_pipeline?
26
+ rails3? && Rails.respond_to?(:application) && Rails.application.respond_to?(:assets) && Rails.application.assets
27
+ end
28
+
29
+ private
30
+
31
+ def running_legacy_rails?
32
+ running_rails? && (Gem::Version.new(Rails.version) < Gem::Version.new("2.3.11"))
33
+ end
34
+
35
+ def running_rails2?
36
+ running_rails? && Rails.version.to_i == 2
37
+ end
38
+
39
+ def running_rails3?
40
+ running_rails? && Rails.version.to_i == 3
41
+ end
42
+
43
+ def running_rails?
44
+ defined?(Rails) && Rails.respond_to?(:version)
45
+ end
46
+
47
+ def safe_gem_check(gem_name, version_string)
48
+ if Gem::Specification.respond_to?(:find_by_name)
49
+ Gem::Specification.find_by_name(gem_name, version_string)
50
+ elsif Gem.respond_to?(:available?)
51
+ Gem.available?(gem_name, version_string)
52
+ end
53
+ rescue Gem::LoadError
54
+ false
55
+ end
56
+
57
+ end
58
+ end
59
+ end