jasmine 3.2.0 → 3.6.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
- SHA1:
3
- metadata.gz: 61c418427317b2d2da6ddb980901af2cdb616b40
4
- data.tar.gz: a98243a46a3ea909bd5232df705707559aefade0
2
+ SHA256:
3
+ metadata.gz: f5041dde9ff09182c2b5a3df9c1197f5271688e38f0e823155d069ae4bfdc473
4
+ data.tar.gz: a6b003232f7ef9a71ae0283b9b486ff275efdeaed368f08fa6f2576c9050382d
5
5
  SHA512:
6
- metadata.gz: d377543ffad94909b7a92c3cc8b654401073766e3049e82164009f18f11bce43c85e4b65738346a8c7fe9f9848574011c0d9ae234f0c8a5079b0cb168ebdb475
7
- data.tar.gz: 1f3629bcd9be40a05036e185bc5bf2b41d4d0110be809d34eae3bd18b4338c98928c9db8bd1dfba3f9043e1e83c693b20e06d2948f7d9621ac5b3c52f0a39891
6
+ metadata.gz: 5709eb88e178882d97c11dc350fc7c55857f4612b8372e2b1ac1cc3504e8e386bcb578db024372d2454621cbd647713bcac68c9fccb85c31b7fa89785b0785bd
7
+ data.tar.gz: ebcfdb3e7b9b41cda30b63e29d692701d2ec88f820202cf2e4ff5dbff2bbf420edec9cb102f2881266efeb19ab6208610f37fdb0bfa712105123e0ab02524d16
data/.gitignore CHANGED
@@ -5,9 +5,9 @@ bin
5
5
  .bundle
6
6
  .DS_Store
7
7
  .rvmrc
8
+ .ruby-version
8
9
  .pairs
9
10
  *.swp
10
11
  tags
11
12
  Gemfile.lock
12
13
  spec/reports
13
- .rvmrc
@@ -2,25 +2,34 @@ language: ruby
2
2
  sudo: false
3
3
  cache: bundler
4
4
 
5
+ addons:
6
+ chrome: stable
7
+
5
8
  rvm:
6
9
  - "2.3"
7
- - "2.4"
8
10
  - "2.5"
11
+ - "2.6"
9
12
 
10
13
  env:
14
+ - "RAILS_VERSION=rails6"
11
15
  - "RAILS_VERSION=rails5"
12
16
  - "RAILS_VERSION=rails4"
13
17
  - "RAILS_VERSION=pojs"
14
18
 
15
19
  script: "if [ $PERFORMANCE_SPECS ];then bundle exec rake performance_specs --trace; else bundle exec rake --trace; fi"
16
20
 
17
- matrix:
21
+ jobs:
18
22
  fast_finish: true
19
23
  include:
20
24
  - env:
21
25
  - "PERFORMANCE_SPECS=true"
22
26
  - "RAILS_VERSION=rails5"
27
+ exclude:
28
+ - rvm: "2.3"
29
+ env: "RAILS_VERSION=rails6"
23
30
 
24
31
  before_install:
25
- - gem update --system
26
- - gem install bundler
32
+ - "if [$RAILS_VERSION != rails4 ];then gem update --system; fi"
33
+ - gem uninstall -v '>= 2' -i $(rvm gemdir)@global -ax bundler || true
34
+ - "if [ $RAILS_VERSION = rails4 ];then gem install bundler -v '< 2.0' ; else gem install bundler; fi"
35
+ - bundle --version
data/Gemfile CHANGED
@@ -6,7 +6,7 @@ gem 'anchorman', :platform => :mri
6
6
 
7
7
  # during development, do not release
8
8
  if ENV['TRAVIS']
9
- gem 'jasmine-core', :git => 'http://github.com/jasmine/jasmine.git'
9
+ gem 'jasmine-core', :git => 'http://github.com/jasmine/jasmine.git', ref: 'main'
10
10
  else
11
11
  gem 'jasmine-core', :path => '../jasmine'
12
12
  end
@@ -21,8 +21,6 @@ end
21
21
 
22
22
  gem 'mime-types', '< 3.0', platform: [:jruby]
23
23
 
24
- platform :rbx do
25
- gem 'json'
26
- gem 'rubysl'
27
- gem 'racc'
24
+ if ENV['RAILS_VERSION'] != 'rails4'
25
+ gem "bundler", "~> 2.1"
28
26
  end
@@ -1,4 +1,6 @@
1
- # The Jasmine Gem [![Build Status](https://travis-ci.org/jasmine/jasmine-gem.png?branch=master)](https://travis-ci.org/jasmine/jasmine-gem)
1
+ # The Jasmine Gem [![Build Status](https://travis-ci.org/jasmine/jasmine-gem.png?branch=main)](https://travis-ci.org/jasmine/jasmine-gem)
2
+ [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fjasmine%2Fjasmine-gem.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fjasmine%2Fjasmine-gem?ref=badge_shield)
3
+ [![Gem Version](https://badge.fury.io/rb/jasmine.svg)](https://badge.fury.io/rb/jasmine)
2
4
 
3
5
  The [Jasmine](http://github.com/jasmine/jasmine) Ruby Gem is a package of helper code for developing Jasmine projects for Ruby-based web projects (Rails, Sinatra, etc.) or for JavaScript projects where Ruby is a welcome partner. It serves up a project's Jasmine suite in a browser so you can focus on your code instead of manually editing script tags in the Jasmine runner HTML file.
4
6
 
@@ -7,7 +9,7 @@ This gem contains:
7
9
 
8
10
  * A small server that builds and executes a Jasmine suite for a project
9
11
  * A script that sets up a project to use the Jasmine gem's server
10
- * Generators for Ruby on Rails projects (Rails 3, 4, and 5)
12
+ * Generators for Ruby on Rails projects (Rails 4 and 5)
11
13
 
12
14
  You can get all of this by: `gem install jasmine` or by adding Jasmine to your `Gemfile`.
13
15
 
@@ -47,9 +49,11 @@ This uses PhantomJS to load and run the Jasmine suite.
47
49
 
48
50
  Please note that PhantomJS will be auto-installed by the [phantomjs-gem][phantomjs-gem] at the first `rake jasmine:ci` run. If you have a matching PhantomJS version somewhere on your path, it won't install. You can disable automatic installation altogether (and use the PhantomJS on your path) via the config helper in your jasmine_helper.rb:
49
51
 
50
- Jasmine.configure do |config|
51
- config.prevent_phantom_js_auto_install = true
52
- end
52
+ ```ruby
53
+ Jasmine.configure do |config|
54
+ config.prevent_phantom_js_auto_install = true
55
+ end
56
+ ```
53
57
 
54
58
  [phantomjs-gem]: https://github.com/colszowka/phantomjs-gem#phantomjs-as-a-rubygem
55
59
 
@@ -73,17 +77,56 @@ To change the port that `rake jasmine` uses:
73
77
 
74
78
  In your jasmine_helper.rb:
75
79
 
76
- Jasmine.configure do |config|
77
- config.server_port = 5555
78
- end
80
+ ```ruby
81
+ Jasmine.configure do |config|
82
+ config.server_port = 5555
83
+ end
84
+ ```
79
85
 
80
86
  By default `rake jasmine:ci` will attempt to find a random open port, to set the port that `rake jasmine:ci` uses:
81
87
 
82
88
  In your jasmine_helper.rb:
83
89
 
84
- Jasmine.configure do |config|
85
- config.ci_port = 1234
86
- end
90
+ ```ruby
91
+ Jasmine.configure do |config|
92
+ config.ci_port = 1234
93
+ end
94
+ ```
95
+
96
+ By default `rake jasmine:ci` will print results in color, to change this configuration:
97
+
98
+ In your jasmine_helper.rb:
99
+
100
+ ```ruby
101
+ Jasmine.configure do |config|
102
+ config.color = false
103
+ end
104
+ ```
105
+
106
+ ## Using headless Chrome
107
+
108
+ * Add `chrome_remote` as a dependency
109
+ * In your jasmine_helper.rb:
110
+ ```ruby
111
+ Jasmine.configure do |config|
112
+ config.runner_browser = :chromeheadless
113
+ end
114
+ ```
115
+
116
+ ### Additional configuration options
117
+
118
+ * `config.chrome_binary` - to customize which binary to execute
119
+ * `config.chrome_cli_options` - if you know what you're doing you can customize the CLI
120
+ * `config.chrome_startup_timeout` - change the amount of time to wait for chrome to start
121
+
122
+ ### On Travis-CI
123
+
124
+ Add this to your `.travis.yml`
125
+
126
+ ```yaml
127
+ addons:
128
+ chrome: stable
129
+ ```
87
130
 
88
131
  ## Support
89
132
 
@@ -94,3 +137,7 @@ Twitter: [@jasminebdd](http://twitter.com/jasminebdd)
94
137
  Please file issues here at Github
95
138
 
96
139
  Copyright (c) 2008-2017 Pivotal Labs. This software is licensed under the MIT License.
140
+
141
+
142
+ ## License
143
+ [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fjasmine%2Fjasmine-gem.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fjasmine%2Fjasmine-gem?ref=badge_large)
@@ -26,8 +26,10 @@ Gem::Specification.new do |s|
26
26
  when 'pojs'
27
27
  when 'rails4'
28
28
  s.add_development_dependency 'rails', '>= 4.2', '< 5.0.0'
29
- else #default to rails 5
30
- s.add_development_dependency 'rails', '>= 5'
29
+ when 'rails5'
30
+ s.add_development_dependency 'rails', '>= 5', '< 6.0.0'
31
+ else #default to rails 6 - keep in sync with `rails_version` in spec_helper
32
+ s.add_development_dependency 'rails', '>= 6', '< 7.0.0'
31
33
  end
32
34
 
33
35
  s.add_development_dependency 'rack-test'
@@ -35,7 +37,7 @@ Gem::Specification.new do |s|
35
37
  s.add_development_dependency 'rspec', '>= 2.5.0'
36
38
  s.add_development_dependency 'nokogiri'
37
39
 
38
- s.add_dependency 'jasmine-core', '3.2.0'
40
+ s.add_dependency 'jasmine-core', '~> 3.6.0'
39
41
  s.add_dependency 'rack', '>= 1.2.1'
40
42
  s.add_dependency 'rake'
41
43
  s.add_dependency 'phantomjs'
@@ -18,6 +18,7 @@ jasmine_files = ['base',
18
18
  File.join('formatters', 'console'),
19
19
  File.join('formatters', 'multi'),
20
20
  File.join('runners', 'phantom_js'),
21
+ File.join('runners', 'chrome_headless'),
21
22
  ]
22
23
 
23
24
 
@@ -13,11 +13,11 @@ module Jasmine
13
13
  UnsupportedRailsVersion = Class.new(StandardError)
14
14
 
15
15
  def asset_bundle
16
- return Rails4Or5AssetBundle.new if Jasmine::Dependencies.rails4? || Jasmine::Dependencies.rails5?
17
- raise UnsupportedRailsVersion, "Jasmine only supports the asset pipeline for Rails 4. - 5"
16
+ return Rails4Or5Or6AssetBundle.new if Jasmine::Dependencies.rails4? || Jasmine::Dependencies.rails5? || Jasmine::Dependencies.rails6?
17
+ raise UnsupportedRailsVersion, "Jasmine only supports the asset pipeline for Rails 4. - 6"
18
18
  end
19
19
 
20
- class Rails4Or5AssetBundle
20
+ class Rails4Or5Or6AssetBundle
21
21
  def assets(pathname)
22
22
  if pathname =~ /\.css$/
23
23
  context.get_stylesheet_assets(pathname.gsub(/\.css$/, ''))
@@ -29,7 +29,23 @@ module Jasmine
29
29
  private
30
30
 
31
31
  def context
32
- @context ||= ActionView::Base.new.extend(GetOriginalAssetsHelper)
32
+ @context ||= template.extend(GetOriginalAssetsHelper)
33
+ end
34
+
35
+ def controller_class
36
+ Class.new(ActionController::Base)
37
+ end
38
+
39
+ def controller
40
+ controller_class.new
41
+ end
42
+
43
+ def lookup_context
44
+ ActionView::LookupContext.new([])
45
+ end
46
+
47
+ def template
48
+ ActionView::Base.new(lookup_context, {}, controller)
33
49
  end
34
50
 
35
51
  module GetOriginalAssetsHelper
@@ -11,8 +11,7 @@ module Jasmine
11
11
  end
12
12
 
13
13
  def run
14
- formatters = config.formatters.map { |formatter_class| formatter_class.new }
15
-
14
+ formatters = build_formatters
16
15
  exit_code_formatter = Jasmine::Formatters::ExitCode.new
17
16
  formatters << exit_code_formatter
18
17
 
@@ -46,5 +45,21 @@ module Jasmine
46
45
  def app
47
46
  @application_factory.app(@config)
48
47
  end
48
+
49
+ def build_formatters
50
+ config.formatters.map do |formatter_class|
51
+ meta_method = if formatter_class.class == Class
52
+ formatter_class.instance_method(:initialize)
53
+ else
54
+ formatter_class.method(:new)
55
+ end
56
+
57
+ if meta_method.arity == 0 || meta_method.parameters[0][0] != :req
58
+ formatter_class.new
59
+ else
60
+ formatter_class.new(config)
61
+ end
62
+ end
63
+ end
49
64
  end
50
65
  end
@@ -71,13 +71,23 @@ module Jasmine
71
71
  end
72
72
 
73
73
  @config.runner = lambda do |formatter, jasmine_server_url|
74
- Jasmine::Runners::PhantomJs.new(formatter,
75
- jasmine_server_url,
76
- @config.prevent_phantom_js_auto_install,
77
- @config.show_console_log,
78
- @config.phantom_config_script,
79
- @config.show_full_stack_trace,
80
- @config.phantom_cli_options)
74
+ case @config.runner_browser
75
+ when :phantomjs
76
+ Jasmine::Runners::PhantomJs.new(formatter,
77
+ jasmine_server_url,
78
+ @config.prevent_phantom_js_auto_install,
79
+ @config.show_console_log,
80
+ @config.phantom_config_script,
81
+ @config.show_full_stack_trace,
82
+ @config.phantom_cli_options)
83
+ when :chromeheadless
84
+ Jasmine::Runners::ChromeHeadless.new(formatter,
85
+ jasmine_server_url,
86
+ @config)
87
+ else
88
+ raise "Jasmine.config.runner_browser should be either phantomjs or chromeheadless"
89
+ end
90
+
81
91
  end
82
92
  end
83
93
 
@@ -6,6 +6,7 @@ module Jasmine
6
6
  attr_accessor :jasmine_path, :spec_path, :boot_path, :src_path, :image_path, :runner_boot_path
7
7
  attr_accessor :jasmine_dir, :spec_dir, :boot_dir, :src_dir, :images_dir, :runner_boot_dir
8
8
  attr_accessor :formatters
9
+ attr_accessor :color
9
10
  attr_accessor :host
10
11
  attr_accessor :spec_format
11
12
  attr_accessor :runner
@@ -17,7 +18,11 @@ module Jasmine
17
18
  attr_accessor :random
18
19
  attr_accessor :phantom_config_script
19
20
  attr_accessor :phantom_cli_options
21
+ attr_accessor :chrome_cli_options
22
+ attr_accessor :chrome_startup_timeout
23
+ attr_accessor :chrome_binary
20
24
  attr_accessor :show_full_stack_trace
25
+ attr_accessor :runner_browser
21
26
  attr_reader :rack_apps
22
27
 
23
28
  def initialize()
@@ -41,8 +46,13 @@ module Jasmine
41
46
  @random = true
42
47
  @phantom_config_script = nil
43
48
  @phantom_cli_options = {}
49
+ @chrome_cli_options = {"no-sandbox" => nil, "headless" => nil, "remote-debugging-port" => 9222}
50
+ @chrome_startup_timeout = 3
51
+ @chrome_binary = nil
52
+ @runner_browser = :phantomjs
44
53
 
45
54
  @formatters = [Jasmine::Formatters::Console]
55
+ @color = true
46
56
 
47
57
  @server_port = 8888
48
58
  end
@@ -10,13 +10,19 @@ module Jasmine
10
10
  rails? && Rails.version.to_i == 5
11
11
  end
12
12
 
13
+ def rails6?
14
+ rails? && Rails.version.to_i == 6
15
+ end
16
+
13
17
  def rails?
14
18
  defined?(Rails) && Rails.respond_to?(:version)
15
19
  end
16
20
 
17
21
  def use_asset_pipeline?
18
- assets_pipeline_available = (rails4? || rails5?) && Rails.respond_to?(:application) && Rails.application.respond_to?(:assets) && !Rails.application.assets.nil?
19
- assets_pipeline_available && (rails4? || rails5?)
22
+ (rails4? || rails5? || rails6?) &&
23
+ Rails.respond_to?(:application) &&
24
+ Rails.application.respond_to?(:assets) &&
25
+ !Rails.application.assets.nil?
20
26
  end
21
27
  end
22
28
  end
@@ -1,7 +1,8 @@
1
1
  module Jasmine
2
2
  module Formatters
3
3
  class Console
4
- def initialize(outputter = Kernel)
4
+ def initialize(config, outputter = Kernel)
5
+ @config = config
5
6
  @results = []
6
7
  @outputter = outputter
7
8
  end
@@ -91,13 +92,13 @@ module Jasmine
91
92
  def chars(results)
92
93
  results.map do |result|
93
94
  if result.succeeded?
94
- "\e[32m.\e[0m"
95
+ colored(:green, '.')
95
96
  elsif result.pending?
96
- "\e[33m*\e[0m"
97
+ colored(:yellow, '*')
97
98
  elsif result.disabled?
98
99
  ""
99
100
  else
100
- "\e[31mF\e[0m"
101
+ colored(:red, 'F')
101
102
  end
102
103
  end.join('')
103
104
  end
@@ -111,7 +112,7 @@ module Jasmine
111
112
  reason = 'No reason given'
112
113
  reason = spec.pending_reason if spec.pending_reason && spec.pending_reason != ''
113
114
 
114
- "\t#{spec.full_name}\n\t \e[33m#{reason}\e[0m"
115
+ "\t#{spec.full_name}\n\t #{colored(:yellow, reason)}"
115
116
  end
116
117
 
117
118
  def failure_message(failure)
@@ -121,7 +122,7 @@ module Jasmine
121
122
  def expectation_message(expectation)
122
123
  <<-FE
123
124
  Message:
124
- \e[31m#{expectation.message}\e[0m
125
+ #{colored(:red, expectation.message)}
125
126
  Stack:
126
127
  #{stack(expectation.stack)}
127
128
  FE
@@ -130,6 +131,25 @@ module Jasmine
130
131
  def stack(stack)
131
132
  stack.split("\n").map(&:strip).join("\n ")
132
133
  end
134
+
135
+ def colored(color, message)
136
+ s = case color
137
+ when :green
138
+ "\e[32m"
139
+ when :yellow
140
+ "\e[33m"
141
+ when :red
142
+ "\e[31m"
143
+ else
144
+ "\e[0m"
145
+ end
146
+
147
+ if @config.color
148
+ "#{s}#{message}\e[0m"
149
+ else
150
+ message
151
+ end
152
+ end
133
153
  end
134
154
  end
135
155
  end
@@ -0,0 +1,126 @@
1
+ # require 'phantomjs'
2
+ require "socket"
3
+
4
+ module Jasmine
5
+ module Runners
6
+ class ChromeHeadless
7
+ def initialize(formatter, jasmine_server_url, config)
8
+ @formatter = formatter
9
+ @jasmine_server_url = jasmine_server_url
10
+ @config = config
11
+ @show_console_log = @config.show_console_log
12
+ @show_full_stack_trace = @config.show_full_stack_trace
13
+ @cli_options = @config.chrome_cli_options || {}
14
+ end
15
+
16
+ def run
17
+ chrome_server = IO.popen("\"#{chrome_binary}\" #{cli_options_string}")
18
+ wait_for_chrome_to_start_debug_socket
19
+
20
+ begin
21
+ require "chrome_remote"
22
+ rescue LoadError => e
23
+ raise 'Add "chrome_remote" you your Gemfile. To use chromeheadless we require this gem.'
24
+ end
25
+
26
+ chrome = wait_for { ChromeRemote.client }
27
+ chrome.send_cmd "Runtime.enable"
28
+ chrome.send_cmd "Page.navigate", url: jasmine_server_url
29
+ result_recived = false
30
+ run_details = { 'random' => false }
31
+ chrome.on "Runtime.consoleAPICalled" do |params|
32
+ if params["type"] == "log"
33
+ if params["args"][0] && params["args"][0]["value"] == "jasmine_spec_result"
34
+ results = JSON.parse(params["args"][1]["value"], :max_nesting => false)
35
+ .map { |r| Result.new(r.merge!("show_full_stack_trace" => @show_full_stack_trace)) }
36
+ formatter.format(results)
37
+ elsif params["args"][0] && params["args"][0]["value"] == "jasmine_suite_result"
38
+ results = JSON.parse(params["args"][1]["value"], :max_nesting => false)
39
+ .map { |r| Result.new(r.merge!("show_full_stack_trace" => @show_full_stack_trace)) }
40
+ failures = results.select(&:failed?)
41
+ if failures.any?
42
+ formatter.format(failures)
43
+ end
44
+ elsif params["args"][0] && params["args"][0]["value"] == "jasmine_done"
45
+ result_recived = true
46
+ run_details = JSON.parse(params["args"][1]["value"], :max_nesting => false)
47
+ elsif show_console_log
48
+ puts params["args"].map { |e| e["value"] }.join(' ')
49
+ end
50
+ end
51
+ end
52
+
53
+ chrome.listen_until {|msg| result_recived }
54
+ formatter.done(run_details)
55
+ chrome.send_cmd "Browser.close"
56
+ Process.kill("INT", chrome_server.pid)
57
+ end
58
+
59
+ def chrome_binary
60
+ config.chrome_binary || find_chrome_binary
61
+ end
62
+
63
+ def find_chrome_binary
64
+ path = [
65
+ "/usr/bin/google-chrome",
66
+ "/usr/bin/google-chrome-stable",
67
+ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
68
+ ].detect { |path|
69
+ File.file?(path)
70
+ }
71
+ raise "No Chrome binary found" if path.nil?
72
+ path
73
+ end
74
+
75
+ def cli_options_string
76
+ @cli_options.
77
+ map {|(k, v)| if v then "--#{k}=#{v}" else "--#{k}" end }.
78
+ join(' ')
79
+ end
80
+
81
+ def wait_for
82
+
83
+
84
+ puts "new logic"
85
+
86
+
87
+ time = Time.now.to_i
88
+ result = try_to { yield }
89
+
90
+ while !result && Time.now.to_i - time < config.chrome_startup_timeout
91
+ sleep(0.1)
92
+ result = try_to { yield }
93
+ end
94
+ result
95
+ end
96
+
97
+ def try_to
98
+ yield
99
+ rescue
100
+ nil
101
+ end
102
+
103
+ def wait_for_chrome_to_start_debug_socket
104
+ open_socket = -> do
105
+ begin
106
+ conn = TCPSocket.new('localhost', 9222)
107
+ conn.close
108
+ true
109
+ rescue
110
+ nil
111
+ end
112
+ end
113
+
114
+ message = "Chrome didn't seem to start the webSocketDebugger at port: 9222, timeout #{config.chrome_startup_timeout}sec"
115
+ raise message unless wait_for(&open_socket)
116
+ end
117
+
118
+ def boot_js
119
+ File.expand_path('chromeheadless_boot.js', File.dirname(__FILE__))
120
+ end
121
+
122
+ private
123
+ attr_reader :formatter, :jasmine_server_url, :show_console_log, :config
124
+ end
125
+ end
126
+ end