jasmine 3.2.0 → 3.6.0

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.
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