test_notifier 2.0.3 → 2.1.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: 5d8fd6d8f3c507c644caa30c41ecc00286ed974b
4
- data.tar.gz: c6985dcc140c2b59dded50c59bcc538a217778aa
2
+ SHA256:
3
+ metadata.gz: 48e80e39f269e2232354733498a32f2752e2d119786f5e6ed3694010194c006d
4
+ data.tar.gz: e24235a4358017441c12aab610ace1b43bfbaab5b65c899c3e128af53b9f7edf
5
5
  SHA512:
6
- metadata.gz: ef1b1773a57e18902b2264e41464f08998fb72cbb4c74cb9b4688fb79d4572f646ab085f82646047e654182b97527bcaffba8889bbea4ec7f2b945c01118e387
7
- data.tar.gz: 905c8b9129e4ca416ac8d0734beeb11cebcef1bb0c77e051596f22e34ef2aa05a4cf93236c633db52254ee13137a7c40ce900bdcc79afbd2948c7a9c30ca178b
6
+ metadata.gz: 80664726eaaa82e62db4970584a1cbe95246c2142ea09e88d0d8fbc8de438b1420ae9ad270f05d90a3d5d2c2543165942957915ef2f56114efbfa66605719179
7
+ data.tar.gz: 929599d9ea690c9e9bf7e189ce42c735abf9d83f961b16c70a3d1967053d516deb6d18bea39a212e4cd74412ff4b1e9669f0d41c85ef9920d6faea0ec4b96828
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
1
  *.gem
2
2
  pkg
3
- nbproject
3
+ nbproject
4
+ *.lock
data/.rubocop.yml ADDED
@@ -0,0 +1,9 @@
1
+ ---
2
+ inherit_gem:
3
+ rubocop-fnando: .rubocop.yml
4
+
5
+ AllCops:
6
+ TargetRubyVersion: 2.7
7
+ NewCops: enable
8
+ Exclude:
9
+ - vendor/**/*
data/Gemfile CHANGED
@@ -1,2 +1,4 @@
1
- source "http://rubygems.org"
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
2
4
  gemspec
data/README.md ADDED
@@ -0,0 +1,81 @@
1
+ # Test Notifier
2
+
3
+ Inspired by
4
+ http://railstips.org/2007/7/23/autotest-growl-pass-fail-notifications
5
+
6
+ After using Growl notification, I decided to write my own plugin because I have
7
+ to work on Ubuntu and Mac OS X and I missed the notification on my Linux box.
8
+ This plugin works with Linux, Mac OS X and Windows. All you need to do is
9
+ install the specific notification library for your OS.
10
+
11
+ Instead of displaying lots of notifications for each failure, I prefer to be
12
+ notified about the whole test result (you'll have to check your log file anyway
13
+ in order to clean up the failures/errors).
14
+
15
+ ## Installation
16
+
17
+ ```
18
+ gem install test_notifier
19
+ ```
20
+
21
+ Check <https://github.com/fnando/notifier> to see how you can configure a
22
+ notifier for your OS.
23
+
24
+ ## Usage
25
+
26
+ If you're using Test::Unit you should add
27
+ `require "test_notifier/runner/test_unit"` to your `test_helper.rb` file.
28
+
29
+ If you're using RSpec you should add `require "test_notifier/runner/spec"` to
30
+ your `spec_helper.rb` file. If you're using RSpec 2-3, you need to add
31
+ `require "test_notifier/runner/rspec"` instead.
32
+
33
+ If you're using Autotest you should add
34
+ `require "test_notifier/runner/autotest"` to the file `~/.autotest`
35
+
36
+ If you're using MiniTest you should add
37
+ `require "test_notifier/runner/minitest"` to your `test_helper.rb` file.
38
+
39
+ You can define your notifier.
40
+
41
+ ```ruby
42
+ TestNotifier.default_notifier = :terminal_notifier
43
+ ```
44
+
45
+ The available notifiers are `:terminal_notifier`, `:hud`, `:kdialog`,
46
+ `:knotify`, `:notify_send`, `:osd_cat`, and `:snarl`.
47
+
48
+ If you'd like to make Test Notifier optional for your project:
49
+
50
+ ```ruby
51
+ TestNotifier.silence_no_notifier_warning = true
52
+ ```
53
+
54
+ ## Maintainer
55
+
56
+ - Nando Vieira - https://nandovieira.com
57
+
58
+ ## Collaborators
59
+
60
+ https://github.com/fnando/test_notifier/graphs/contributors
61
+
62
+ ## License
63
+
64
+ (The MIT License)
65
+
66
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
67
+ this software and associated documentation files (the 'Software'), to deal in
68
+ the Software without restriction, including without limitation the rights to
69
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
70
+ the Software, and to permit persons to whom the Software is furnished to do so,
71
+ subject to the following conditions:
72
+
73
+ The above copyright notice and this permission notice shall be included in all
74
+ copies or substantial portions of the Software.
75
+
76
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
77
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
78
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
79
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
80
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
81
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile CHANGED
@@ -1,5 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bundler"
2
4
  Bundler::GemHelper.install_tasks
3
5
 
4
6
  require "rspec/core/rake_task"
5
7
  RSpec::Core::RakeTask.new
8
+
9
+ require "rubocop/rake_task"
10
+ RuboCop::RakeTask.new
11
+
12
+ task default: %i[spec rubocop]
@@ -1,36 +1,49 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_notifier"
2
4
 
3
5
  Autotest.add_hook :ran_command do |at|
4
- begin
5
- content = at.results.to_s
6
+ content = at.results.to_s
7
+
8
+ rspec_re = /(\d+) examples?, (\d+) failures?(, (\d+) pendings?)?/
9
+ test_unit_re = /(\d+) tests, (\d+) assertions, (\d+) failures, (\d+) errors/
6
10
 
7
- rspec_matches = content.match(/(\d+) examples?, (\d+) failures?(, (\d+) pendings?)?/)
8
- test_unit_matches = content.match(/(\d+) tests, (\d+) assertions, (\d+) failures, (\d+) errors/)
11
+ rspec_matches = content.match(rspec_re)
12
+ test_unit_matches = content.match(test_unit_re)
9
13
 
10
- if rspec_matches
11
- _, examples, failures, _, pending = *rspec_matches
14
+ if rspec_matches
15
+ _, examples, failures, _, pending = *rspec_matches
12
16
 
13
- stats = TestNotifier::Stats.new(:spec, {
14
- :count => examples,
15
- :failures => failures,
16
- :pending => pending
17
- })
17
+ stats = TestNotifier::Stats.new(
18
+ :spec,
19
+ {
20
+ count: examples,
21
+ failures: failures,
22
+ pending: pending
23
+ }
24
+ )
18
25
 
19
- TestNotifier.notify(:status => stats.status, :message => stats.message) unless examples.to_i.zero?
20
- elsif test_unit_matches
21
- _, tests, assertions, failures, errors = *test_unit_matches
26
+ unless examples.to_i.zero?
27
+ TestNotifier.notify(status: stats.status, message: stats.message)
28
+ end
29
+ elsif test_unit_matches
30
+ _, tests, assertions, failures, errors = *test_unit_matches
22
31
 
23
- stats = TestNotifier::Stats.new(:test_unit, {
24
- :count => tests,
25
- :assertions => assertions,
26
- :failures => failures,
27
- :errors => errors
28
- })
32
+ stats = TestNotifier::Stats.new(
33
+ :test_unit,
34
+ {
35
+ count: tests,
36
+ assertions: assertions,
37
+ failures: failures,
38
+ errors: errors
39
+ }
40
+ )
29
41
 
30
- TestNotifier.notify(:status => stats.status, :message => stats.message) unless tests.to_i.zero?
42
+ unless tests.to_i.zero?
43
+ TestNotifier.notify(status: stats.status, message: stats.message)
31
44
  end
32
- rescue => e
33
- puts e
34
- puts e.backtrace
35
45
  end
46
+ rescue StandardError => error
47
+ puts error
48
+ puts error.backtrace
36
49
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_notifier"
2
4
  require "minitest/unit"
3
5
 
@@ -5,11 +7,11 @@ MiniTest::Unit.after_tests do
5
7
  runner = MiniTest::Unit.runner
6
8
 
7
9
  stats = TestNotifier::Stats.new(:minitest, {
8
- :count => runner.test_count,
9
- :assertions => runner.assertion_count,
10
- :failures => runner.failures,
11
- :errors => runner.errors
12
- })
10
+ count: runner.test_count,
11
+ assertions: runner.assertion_count,
12
+ failures: runner.failures,
13
+ errors: runner.errors
14
+ })
13
15
 
14
- TestNotifier.notify(:status => stats.status, :message => stats.message)
16
+ TestNotifier.notify(status: stats.status, message: stats.message)
15
17
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "rspec/core/version"
2
4
 
3
5
  if RSpec::Core::Version::STRING >= "3.0.0"
@@ -1,29 +1,50 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_notifier"
2
4
  require "rspec/core/formatters/base_text_formatter"
3
5
 
4
- class RSpec::Core::Formatters::BaseTextFormatter
5
- alias dump_summary_original dump_summary
6
+ module RSpec
7
+ module Core
8
+ module Formatters
9
+ class BaseTextFormatter
10
+ alias dump_summary_original dump_summary
6
11
 
7
- def dump_summary(duration, example_count, failure_count, pending_count)
8
- dump_summary_original(duration, example_count, failure_count, pending_count)
12
+ def dump_summary(duration, example_count, failure_count, pending_count)
13
+ dump_summary_original(
14
+ duration,
15
+ example_count,
16
+ failure_count,
17
+ pending_count
18
+ )
9
19
 
10
- return if example_count.zero?
20
+ return if example_count.zero?
11
21
 
12
- failure_filter = proc {|e|
13
- e.instance_variable_get("@exception").class.name == "RSpec::Expectations::ExpectationNotMetError"
14
- }
22
+ failure_filter = proc do |error|
23
+ error
24
+ .instance_variable_get(:@exception)
25
+ .instance_of?(RSpec::Expectations::ExpectationNotMetError)
26
+ end
15
27
 
16
- error_filter = proc {|e|
17
- %w[RSpec::Expectations::ExpectationNotMetError NilClass].include?(e.instance_variable_get("@exception").class.name)
18
- }
28
+ error_filter = proc do |error|
29
+ %w[
30
+ RSpec::Expectations::ExpectationNotMetError
31
+ NilClass
32
+ ].include?(error.instance_variable_get(:@exception).class.name)
33
+ end
19
34
 
20
- stats = TestNotifier::Stats.new(:rspec, {
21
- :count => example_count,
22
- :failures => examples.select(&failure_filter).count,
23
- :pending => pending_count,
24
- :errors => examples.reject(&error_filter).count
25
- })
35
+ stats = TestNotifier::Stats.new(
36
+ :rspec,
37
+ {
38
+ count: example_count,
39
+ failures: examples.count(&failure_filter),
40
+ pending: pending_count,
41
+ errors: examples.count(&error_filter)
42
+ }
43
+ )
26
44
 
27
- TestNotifier.notify(:status => stats.status, :message => stats.message)
45
+ TestNotifier.notify(status: stats.status, message: stats.message)
46
+ end
47
+ end
48
+ end
28
49
  end
29
50
  end
@@ -1,35 +1,50 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_notifier"
2
4
  require "rspec/core"
3
5
  require "rspec/core/formatters/base_text_formatter"
4
6
 
5
- class RSpec::Core::Formatters::BaseTextFormatter
6
- alias dump_summary_original dump_summary
7
-
8
- def dump_summary(options)
9
- dump_summary_original(options)
10
-
11
- example_count = options.example_count
12
- failure_count = options.failure_count
13
- pending_count = options.pending_count
14
- examples = options.examples
15
-
16
- return if example_count.zero?
17
-
18
- failure_filter = proc {|e|
19
- e.instance_variable_get("@exception").class.name == "RSpec::Expectations::ExpectationNotMetError"
20
- }
21
-
22
- error_filter = proc {|e|
23
- %w[RSpec::Expectations::ExpectationNotMetError NilClass].include?(e.instance_variable_get("@exception").class.name)
24
- }
25
-
26
- stats = TestNotifier::Stats.new(:rspec, {
27
- :count => example_count,
28
- :failures => examples.select(&failure_filter).count,
29
- :pending => pending_count,
30
- :errors => examples.reject(&error_filter).count
31
- })
32
-
33
- TestNotifier.notify(:status => stats.status, :message => stats.message)
7
+ module RSpec
8
+ module Core
9
+ module Formatters
10
+ class BaseTextFormatter
11
+ alias dump_summary_original dump_summary
12
+
13
+ def dump_summary(options)
14
+ dump_summary_original(options)
15
+
16
+ example_count = options.example_count
17
+ pending_count = options.pending_count
18
+ examples = options.examples
19
+
20
+ return if example_count.zero?
21
+
22
+ failure_filter = proc do |error|
23
+ error
24
+ .instance_variable_get(:@exception)
25
+ .instance_of?(RSpec::Expectations::ExpectationNotMetError)
26
+ end
27
+
28
+ error_filter = proc {|e|
29
+ %w[
30
+ RSpec::Expectations::ExpectationNotMetError
31
+ NilClass
32
+ ].include?(e.instance_variable_get(:@exception).class.name)
33
+ }
34
+
35
+ stats = TestNotifier::Stats.new(
36
+ :rspec,
37
+ {
38
+ count: example_count,
39
+ failures: examples.count(&failure_filter),
40
+ pending: pending_count,
41
+ errors: examples.count(&error_filter)
42
+ }
43
+ )
44
+
45
+ TestNotifier.notify(status: stats.status, message: stats.message)
46
+ end
47
+ end
48
+ end
34
49
  end
35
50
  end
@@ -1,21 +1,30 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_notifier"
2
4
  require "spec/runner/formatter/base_text_formatter"
3
5
 
4
- class Spec::Runner::Formatter::BaseTextFormatter
5
- alias dump_summary_original dump_summary
6
+ module Spec
7
+ module Runner
8
+ module Formatter
9
+ class BaseTextFormatter
10
+ alias dump_summary_original dump_summary
6
11
 
7
- def dump_summary(duration, example_count, failure_count, pending_count)
8
- dump_summary_original(duration, example_count, failure_count, pending_count)
12
+ def dump_summary(duration, example_count, failure_count, pending_count)
13
+ dump_summary_original(duration, example_count, failure_count,
14
+ pending_count)
9
15
 
10
- return if example_count.zero?
16
+ return if example_count.zero?
11
17
 
12
- stats = TestNotifier::Stats.new(:spec, {
13
- :count => example_count,
14
- :failures => failure_count,
15
- :pending => pending_count,
16
- :errors => nil
17
- })
18
+ stats = TestNotifier::Stats.new(:spec, {
19
+ count: example_count,
20
+ failures: failure_count,
21
+ pending: pending_count,
22
+ errors: nil
23
+ })
18
24
 
19
- TestNotifier.notify(:status => stats.status, :message => stats.message)
25
+ TestNotifier.notify(status: stats.status, message: stats.message)
26
+ end
27
+ end
28
+ end
20
29
  end
21
30
  end
@@ -1,29 +1,38 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_notifier"
2
4
  require "test/unit/ui/console/testrunner"
3
5
 
4
- class Test::Unit::UI::Console::TestRunner
5
- alias finished_original finished
6
-
7
- def finished(elapsed_time)
8
- finished_original(elapsed_time)
6
+ module Test
7
+ module Unit
8
+ module UI
9
+ module Console
10
+ class TestRunner
11
+ alias finished_original finished
9
12
 
10
- begin
11
- re = /(\d+) tests, (\d+) assertions, (\d+) failures, (\d+) errors/
12
- _, tests, assertions, failures, errors = *@result.to_s.match(re)
13
- return if tests.to_i.zero?
13
+ def finished(elapsed_time)
14
+ finished_original(elapsed_time)
14
15
 
16
+ begin
17
+ re = /(\d+) tests, (\d+) assertions, (\d+) failures, (\d+) errors/
18
+ _, tests, assertions, failures, errors = *@result.to_s.match(re)
19
+ return if tests.to_i.zero?
15
20
 
16
- stats = TestNotifier::Stats.new(:test_unit, {
17
- :count => tests,
18
- :assertions => assertions,
19
- :failures => failures,
20
- :errors => errors
21
- })
21
+ stats = TestNotifier::Stats.new(:test_unit, {
22
+ count: tests,
23
+ assertions: assertions,
24
+ failures: failures,
25
+ errors: errors
26
+ })
22
27
 
23
- TestNotifier.notify(:status => stats.status, :message => stats.message)
24
- rescue => e
25
- puts e
26
- puts e.backtrace
28
+ TestNotifier.notify(status: stats.status, message: stats.message)
29
+ rescue StandardError => error
30
+ puts error
31
+ puts error.backtrace
32
+ end
33
+ end
34
+ end
35
+ end
27
36
  end
28
37
  end
29
38
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TestNotifier
2
4
  module Runner
3
5
  autoload :RSpec, "test_notifier/runner/rspec"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TestNotifier
2
4
  class Stats
3
5
  attr_accessor :adapter, :options
@@ -17,15 +19,16 @@ module TestNotifier
17
19
  send("message_for_#{adapter}")
18
20
  end
19
21
 
20
- private
21
- def normalize(options)
22
- [:count, :success, :failures, :pending, :errors, :assertions].inject({}) do |buffer, key|
22
+ private def normalize(options)
23
+ %i[
24
+ count success failures pending errors
25
+ assertions
26
+ ].each_with_object({}) do |key, buffer|
23
27
  buffer[key] = options[key].to_i
24
- buffer
25
28
  end
26
29
  end
27
30
 
28
- def status_for_minitest
31
+ private def status_for_minitest
29
32
  if options[:errors].nonzero?
30
33
  :error
31
34
  elsif options[:failures].nonzero?
@@ -35,7 +38,7 @@ module TestNotifier
35
38
  end
36
39
  end
37
40
 
38
- def status_for_test_unit
41
+ private def status_for_test_unit
39
42
  if options[:errors].nonzero?
40
43
  :error
41
44
  elsif options[:failures].nonzero?
@@ -45,7 +48,7 @@ module TestNotifier
45
48
  end
46
49
  end
47
50
 
48
- def status_for_rspec
51
+ private def status_for_rspec
49
52
  if options[:errors].nonzero?
50
53
  :error
51
54
  elsif options[:failures].nonzero?
@@ -55,7 +58,7 @@ module TestNotifier
55
58
  end
56
59
  end
57
60
 
58
- def status_for_spec
61
+ private def status_for_spec
59
62
  if options[:failures].nonzero?
60
63
  :fail
61
64
  else
@@ -63,44 +66,56 @@ module TestNotifier
63
66
  end
64
67
  end
65
68
 
66
- def message_for_rspec
67
- options[:success] = options[:count] - (options[:failures] + options[:errors])
69
+ private def message_for_rspec
70
+ options[:success] =
71
+ options[:count] - (options[:failures] + options[:errors])
68
72
 
69
73
  text = []
70
- text << "#{options[:count]} " + pluralize(options[:count], "example")
74
+ text << ("#{options[:count]} " + pluralize(options[:count], "example"))
71
75
  text << "#{options[:failures]} failed" unless options[:failures].zero?
72
76
  text << "#{options[:pending]} pending" unless options[:pending].zero?
73
- text << "#{options[:errors]} " + pluralize(options[:errors], "error") unless options[:errors].zero?
77
+ unless options[:errors].zero?
78
+ text << ("#{options[:errors]} " + pluralize(options[:errors],
79
+ "error"))
80
+ end
74
81
  text.join(", ")
75
82
  end
76
83
 
77
- def message_for_spec
84
+ private def message_for_spec
78
85
  text = []
79
- text << "#{options[:count]} " + pluralize(options[:count], "example")
86
+ text << ("#{options[:count]} " + pluralize(options[:count], "example"))
80
87
  text << "#{options[:failures]} failed" unless options[:failures].zero?
81
88
  text << "#{options[:pending]} pending" unless options[:pending].zero?
82
89
  text.join(", ")
83
90
  end
84
91
 
85
- def message_for_test_unit
92
+ private def message_for_test_unit
86
93
  text = []
87
- text << "#{options[:count]} " + pluralize(options[:count], "test")
88
- text << "#{options[:assertions]} " + pluralize(options[:assertions], "assertion")
94
+ text << ("#{options[:count]} " + pluralize(options[:count], "test"))
95
+ text << ("#{options[:assertions]} " + pluralize(options[:assertions],
96
+ "assertion"))
89
97
  text << "#{options[:failures]} failed" unless options[:failures].zero?
90
- text << "#{options[:errors]} " + pluralize(options[:errors], "error") unless options[:errors].zero?
98
+ unless options[:errors].zero?
99
+ text << ("#{options[:errors]} " + pluralize(options[:errors],
100
+ "error"))
101
+ end
91
102
  text.join(", ")
92
103
  end
93
104
 
94
- def message_for_minitest
105
+ private def message_for_minitest
95
106
  text = []
96
- text << "#{options[:count]} " + pluralize(options[:count], "test")
97
- text << "#{options[:assertions]} " + pluralize(options[:assertions], "assertion")
107
+ text << ("#{options[:count]} " + pluralize(options[:count], "test"))
108
+ text << ("#{options[:assertions]} " + pluralize(options[:assertions],
109
+ "assertion"))
98
110
  text << "#{options[:failures]} failed" unless options[:failures].zero?
99
- text << "#{options[:errors]} " + pluralize(options[:errors], "error") unless options[:errors].zero?
111
+ unless options[:errors].zero?
112
+ text << ("#{options[:errors]} " + pluralize(options[:errors],
113
+ "error"))
114
+ end
100
115
  text.join(", ")
101
116
  end
102
117
 
103
- def pluralize(count, text)
118
+ private def pluralize(count, text)
104
119
  count > 1 ? "#{text}s" : text
105
120
  end
106
121
  end
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TestNotifier
2
4
  module Version
3
5
  MAJOR = 2
4
- MINOR = 0
5
- PATCH = 3
6
+ MINOR = 1
7
+ PATCH = 0
6
8
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
9
  end
8
10
  end
data/lib/test_notifier.rb CHANGED
@@ -1,42 +1,53 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "notifier"
2
4
 
3
5
  module TestNotifier
4
- class << self
5
- attr_accessor :silence_no_notifier_warning
6
- end
7
-
8
6
  extend self
9
7
 
10
- NO_NOTIFIERS_MESSAGE = "[TEST NOTIFIER] You have no supported notifiers installed. Please read documentation.\n"
8
+ NO_NOTIFIERS_MESSAGE = "[TEST NOTIFIER] You have no supported notifiers " \
9
+ "installed. Please read documentation.\n"
11
10
 
12
11
  IMAGES = {
13
- :fail => File.dirname(__FILE__) + "/../resources/fail.png",
14
- :error => File.dirname(__FILE__) + "/../resources/error.png",
15
- :success => File.dirname(__FILE__) + "/../resources/success.png"
16
- }
12
+ fail: File.expand_path("#{__dir__}/../resources/fail.png"),
13
+ error: File.expand_path("#{__dir__}/../resources/error.png"),
14
+ success: File.expand_path("#{__dir__}/../resources/success.png")
15
+ }.freeze
16
+
17
+ HUD_SYMBOLS = {
18
+ fail: "exclamationmark.triangle",
19
+ error: "xmark.octagon.fill",
20
+ success: "checkmark.circle"
21
+ }.freeze
17
22
 
18
23
  TITLES = {
19
- :fail => "Failed!",
20
- :success => "Passed!",
21
- :error => "Error!"
22
- }
24
+ fail: "Failed!",
25
+ success: "Passed!",
26
+ error: "Error!"
27
+ }.freeze
23
28
 
24
29
  COLORS = {
25
- :fail => "orange",
26
- :success => "green",
27
- :error => "red"
28
- }
30
+ fail: "orange",
31
+ success: "green",
32
+ error: "red"
33
+ }.freeze
34
+
35
+ attr_accessor :silence_no_notifier_warning
29
36
 
30
37
  def default_notifier=(notifier)
31
38
  Notifier.default_notifier = notifier
32
39
  end
33
40
 
34
41
  def notify(options)
35
- options.merge!({
36
- :title => TITLES[options[:status]],
37
- :image => IMAGES[options[:status]],
38
- :color => COLORS[options[:status]]
39
- })
42
+ options = options.merge(
43
+ title: TITLES[options[:status]],
44
+ image: IMAGES[options[:status]],
45
+ color: COLORS[options[:status]]
46
+ )
47
+
48
+ if Notifier.notifier == Notifier::Hud
49
+ options[:image] = HUD_SYMBOLS[options[:status]]
50
+ end
40
51
 
41
52
  notifier.notify(options)
42
53
  end
@@ -45,7 +56,7 @@ module TestNotifier
45
56
  notifier = Notifier.notifier
46
57
 
47
58
  if notifier == Notifier::Placebo && !silence_no_notifier_warning
48
- STDERR << NO_NOTIFIERS_MESSAGE
59
+ $stderr << NO_NOTIFIERS_MESSAGE
49
60
  end
50
61
 
51
62
  notifier
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
1
4
  require "test_notifier"
2
5
 
3
6
  module SpecHelpers
4
7
  def unsupport_all_notifiers
5
8
  Notifier.notifiers.each do |notifier|
6
- allow(notifier).to receive(:supported?).and_return(false) unless notifier == Notifier::Placebo
9
+ unless notifier == Notifier::Placebo
10
+ allow(notifier).to receive(:supported?).and_return(false)
11
+ end
7
12
  end
8
13
  end
9
14
  end
@@ -1,26 +1,30 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe TestNotifier::Stats, "MiniTest" do
4
6
  subject(:stats) { TestNotifier::Stats.new(:minitest) }
5
7
 
6
8
  it "returns success message" do
7
- stats.options = { :count => 10, :assertions => 20 }
9
+ stats.options = {count: 10, assertions: 20}
8
10
  expect(stats.message).to eql("10 tests, 20 assertions")
9
11
  end
10
12
 
11
13
  it "message with failing examples" do
12
- stats.options = { :count => 10, :assertions => 20, :failures => 5 }
14
+ stats.options = {count: 10, assertions: 20, failures: 5}
13
15
  expect(stats.message).to eql("10 tests, 20 assertions, 5 failed")
14
16
  end
15
17
 
16
18
  it "message with error examples" do
17
- stats.options = { :count => 10, :assertions => 20, :errors => 5 }
19
+ stats.options = {count: 10, assertions: 20, errors: 5}
18
20
  expect(stats.message).to eql("10 tests, 20 assertions, 5 errors")
19
21
  end
20
22
 
21
23
  it "message with all types" do
22
- stats.options = { :count => 6, :failures => 2, :errors => 3, :assertions => 20 }
24
+ stats.options = {
25
+ count: 6, failures: 2, errors: 3,
26
+ assertions: 20
27
+ }
23
28
  expect(stats.message).to eql("6 tests, 20 assertions, 2 failed, 3 errors")
24
29
  end
25
30
  end
26
-
@@ -1,25 +1,27 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe TestNotifier::Stats, "RSpec 1" do
4
6
  subject(:stats) { TestNotifier::Stats.new(:spec) }
5
7
 
6
8
  it "returns success message" do
7
- stats.options = { :count => 10 }
9
+ stats.options = {count: 10}
8
10
  expect(stats.message).to eql("10 examples")
9
11
  end
10
12
 
11
13
  it "returns message with failing examples" do
12
- stats.options = { :count => 10, :failures => 5 }
14
+ stats.options = {count: 10, failures: 5}
13
15
  expect(stats.message).to eql("10 examples, 5 failed")
14
16
  end
15
17
 
16
18
  it "returns message with pending examples" do
17
- stats.options = { :count => 10, :pending => 5 }
19
+ stats.options = {count: 10, pending: 5}
18
20
  expect(stats.message).to eql("10 examples, 5 pending")
19
21
  end
20
22
 
21
23
  it "returns message with all types" do
22
- stats.options = { :count => 6, :failures => 2, :pending => 3 }
24
+ stats.options = {count: 6, failures: 2, pending: 3}
23
25
  expect(stats.message).to eql("6 examples, 2 failed, 3 pending")
24
26
  end
25
27
  end
@@ -1,30 +1,32 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe TestNotifier::Stats, "RSpec" do
4
6
  subject(:stats) { TestNotifier::Stats.new(:rspec) }
5
7
 
6
8
  it "returns success message" do
7
- stats.options = { :count => 10 }
9
+ stats.options = {count: 10}
8
10
  expect(stats.message).to eql("10 examples")
9
11
  end
10
12
 
11
13
  it "returns message with failing examples" do
12
- stats.options = { :count => 10, :failures => 5 }
14
+ stats.options = {count: 10, failures: 5}
13
15
  expect(stats.message).to eql("10 examples, 5 failed")
14
16
  end
15
17
 
16
18
  it "returns message with pending examples" do
17
- stats.options = { :count => 10, :pending => 5 }
19
+ stats.options = {count: 10, pending: 5}
18
20
  expect(stats.message).to eql("10 examples, 5 pending")
19
21
  end
20
22
 
21
23
  it "returns message with error examples" do
22
- stats.options = { :count => 10, :failures => 5, :errors => 5 }
24
+ stats.options = {count: 10, failures: 5, errors: 5}
23
25
  expect(stats.message).to eql("10 examples, 5 failed, 5 errors")
24
26
  end
25
27
 
26
28
  it "returns message with all types" do
27
- stats.options = { :count => 6, :failures => 3, :errors => 2, :pending => 3 }
29
+ stats.options = {count: 6, failures: 3, errors: 2, pending: 3}
28
30
  expect(stats.message).to eql("6 examples, 3 failed, 3 pending, 2 errors")
29
31
  end
30
32
  end
@@ -1,25 +1,30 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe TestNotifier::Stats, "TestUnit" do
4
6
  subject(:stats) { TestNotifier::Stats.new(:test_unit) }
5
7
 
6
8
  it "returns success message" do
7
- stats.options = { :count => 10, :assertions => 20 }
9
+ stats.options = {count: 10, assertions: 20}
8
10
  expect(stats.message).to eql("10 tests, 20 assertions")
9
11
  end
10
12
 
11
13
  it "returns message with failing examples" do
12
- stats.options = { :count => 10, :assertions => 20, :failures => 5 }
14
+ stats.options = {count: 10, assertions: 20, failures: 5}
13
15
  expect(stats.message).to eql("10 tests, 20 assertions, 5 failed")
14
16
  end
15
17
 
16
18
  it "message with error examples" do
17
- stats.options = { :count => 10, :assertions => 20, :errors => 5 }
19
+ stats.options = {count: 10, assertions: 20, errors: 5}
18
20
  expect(stats.message).to eql("10 tests, 20 assertions, 5 errors")
19
21
  end
20
22
 
21
23
  it "message with all types" do
22
- stats.options = { :count => 6, :failures => 2, :errors => 3, :assertions => 20 }
24
+ stats.options = {
25
+ count: 6, failures: 2, errors: 3,
26
+ assertions: 20
27
+ }
23
28
  expect(stats.message).to eql("6 tests, 20 assertions, 2 failed, 3 errors")
24
29
  end
25
30
  end
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe TestNotifier do
4
6
  before { unsupport_all_notifiers }
5
7
 
6
8
  it "uses default notifier" do
7
- allow(Notifier::Growl).to receive(:supported?).and_return(true)
9
+ allow(Notifier::Hud).to receive(:supported?).and_return(true)
8
10
  allow(Notifier::Snarl).to receive(:supported?).and_return(true)
9
11
  TestNotifier.default_notifier = :snarl
10
12
 
@@ -12,40 +14,78 @@ describe TestNotifier do
12
14
  end
13
15
 
14
16
  it "outputs error message to $stderr when there's no supported notifier" do
15
- expect(STDERR).to receive(:<<).with(TestNotifier::NO_NOTIFIERS_MESSAGE)
17
+ expect($stderr).to receive(:<<).with(TestNotifier::NO_NOTIFIERS_MESSAGE)
16
18
  expect(Notifier::Placebo).to receive(:notify)
17
19
 
18
- TestNotifier.notify :status => :fail, :message => "You have failed!"
20
+ TestNotifier.notify status: :fail, message: "You have failed!"
19
21
  end
20
22
 
21
- it "outputs error message won't display when silence_no_notifier_warning is true" do
23
+ it "doesn't output error message when silence_no_notifier_warning is true" do
22
24
  TestNotifier.silence_no_notifier_warning = true
23
25
 
24
- expect(STDERR).not_to receive(:<<)
26
+ expect($stderr).not_to receive(:<<)
25
27
  expect(Notifier::Placebo).to receive(:notify)
26
28
 
27
- TestNotifier.notify :status => :fail, :message => "You have failed!"
29
+ TestNotifier.notify status: :fail, message: "You have failed!"
28
30
  end
29
31
 
30
- it "outputs error message won't display when silence_no_notifier_warning is true" do
31
- TestNotifier.silence_no_notifier_warning = true
32
+ it "sends notification to supported notifier" do
33
+ args = {
34
+ status: :fail,
35
+ message: "You have failed!",
36
+ title: TestNotifier::TITLES[:fail],
37
+ image: TestNotifier::IMAGES[:fail],
38
+ color: TestNotifier::COLORS[:fail]
39
+ }
32
40
 
33
- expect(STDERR).not_to receive(:<<)
34
- expect(Notifier::Placebo).to receive(:notify)
41
+ allow(Notifier::Snarl).to receive(:supported?).and_return(true)
42
+ expect(Notifier::Snarl).to receive(:notify).with(args)
35
43
 
36
- TestNotifier.notify :status => :fail, :message => "You have failed!"
44
+ TestNotifier.notify status: :fail, message: "You have failed!"
37
45
  end
38
46
 
39
- it "sends notification to supported notifier" do
40
- allow(Notifier::Snarl).to receive(:supported?).and_return(true)
41
- expect(Notifier::Snarl).to receive(:notify).with({
42
- :status => :fail,
43
- :message => "You have failed!",
44
- :title => TestNotifier::TITLES[:fail],
45
- :image => TestNotifier::IMAGES[:fail],
46
- :color => TestNotifier::COLORS[:fail]
47
- })
48
-
49
- TestNotifier.notify :status => :fail, :message => "You have failed!"
47
+ it "sets symbol name for hud notifier (failed)" do
48
+ args = {
49
+ message: "You have failed!",
50
+ title: "Failed!",
51
+ image: "exclamationmark.triangle",
52
+ color: "orange",
53
+ status: :fail
54
+ }
55
+
56
+ allow(Notifier::Hud).to receive(:supported?).and_return(true)
57
+ expect(Notifier::Hud).to receive(:notify).with(args)
58
+
59
+ TestNotifier.notify status: :fail, message: "You have failed!"
60
+ end
61
+
62
+ it "sets symbol name for hud notifier (success)" do
63
+ args = {
64
+ message: "You passed!",
65
+ title: "Passed!",
66
+ image: "checkmark.circle",
67
+ color: "green",
68
+ status: :success
69
+ }
70
+
71
+ allow(Notifier::Hud).to receive(:supported?).and_return(true)
72
+ expect(Notifier::Hud).to receive(:notify).with(args)
73
+
74
+ TestNotifier.notify status: :success, message: "You passed!"
75
+ end
76
+
77
+ it "sets symbol name for hud notifier (error)" do
78
+ args = {
79
+ message: "You have errored!",
80
+ title: "Error!",
81
+ image: "xmark.octagon.fill",
82
+ color: "red",
83
+ status: :error
84
+ }
85
+
86
+ allow(Notifier::Hud).to receive(:supported?).and_return(true)
87
+ expect(Notifier::Hud).to receive(:notify).with(args)
88
+
89
+ TestNotifier.notify status: :error, message: "You have errored!"
50
90
  end
51
91
  end
@@ -1,27 +1,32 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "test_notifier/version"
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/test_notifier/version"
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "test_notifier"
7
- s.version = "#{TestNotifier::Version::STRING}"
7
+ s.version = TestNotifier::Version::STRING.to_s
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ["Nando Vieira"]
10
+ s.required_ruby_version = ">= 2.7"
10
11
  s.email = ["fnando.vieira@gmail.com"]
11
12
  s.homepage = "http://rubygems.org/gems/test_notifier"
12
- s.summary = "Display system notifications (dbus, growl and snarl) after running tests."
13
- s.description = <<-DESC
14
- Display system notifications (dbus, growl and snarl) after
15
- running tests. It works on Mac OS X, Linux and Windows. Powerful when used
16
- with Autotest ZenTest gem and alike for Rails apps.
17
- DESC
13
+ s.summary = "Display system notifications (dbus, terminal notifier, " \
14
+ "snarl, and more) after running tests."
15
+ s.description = "Display system notifications after running tests. It " \
16
+ "works on Mac OS X, Linux and Windows. Powerful when used " \
17
+ "with autotest or guard."
18
18
 
19
+ s.metadata["rubygems_mfa_required"] = "true"
19
20
  s.files = `git ls-files`.split("\n")
20
21
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
+ s.executables = `git ls-files -- bin/*`.split("\n").map do |f|
23
+ File.basename(f)
24
+ end
22
25
  s.require_paths = ["lib"]
23
26
 
24
27
  s.add_dependency "notifier"
25
- s.add_development_dependency "rspec", ">= 3.0.0"
26
28
  s.add_development_dependency "rake"
29
+ s.add_development_dependency "rspec", ">= 3.0.0"
30
+ s.add_development_dependency "rubocop"
31
+ s.add_development_dependency "rubocop-fnando"
27
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test_notifier
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.3
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nando Vieira
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-11 00:00:00.000000000 Z
11
+ date: 2022-02-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: notifier
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rspec
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -39,7 +53,7 @@ dependencies:
39
53
  - !ruby/object:Gem::Version
40
54
  version: 3.0.0
41
55
  - !ruby/object:Gem::Dependency
42
- name: rake
56
+ name: rubocop
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - ">="
@@ -52,10 +66,22 @@ dependencies:
52
66
  - - ">="
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
- description: |
56
- Display system notifications (dbus, growl and snarl) after
57
- running tests. It works on Mac OS X, Linux and Windows. Powerful when used
58
- with Autotest ZenTest gem and alike for Rails apps.
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop-fnando
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Display system notifications after running tests. It works on Mac OS
84
+ X, Linux and Windows. Powerful when used with autotest or guard.
59
85
  email:
60
86
  - fnando.vieira@gmail.com
61
87
  executables: []
@@ -64,9 +90,9 @@ extra_rdoc_files: []
64
90
  files:
65
91
  - ".gitignore"
66
92
  - ".rspec"
93
+ - ".rubocop.yml"
67
94
  - Gemfile
68
- - Gemfile.lock
69
- - README.rdoc
95
+ - README.md
70
96
  - Rakefile
71
97
  - lib/test_notifier.rb
72
98
  - lib/test_notifier/runner.rb
@@ -92,8 +118,9 @@ files:
92
118
  - test_notifier.gemspec
93
119
  homepage: http://rubygems.org/gems/test_notifier
94
120
  licenses: []
95
- metadata: {}
96
- post_install_message:
121
+ metadata:
122
+ rubygems_mfa_required: 'true'
123
+ post_install_message:
97
124
  rdoc_options: []
98
125
  require_paths:
99
126
  - lib
@@ -101,18 +128,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
101
128
  requirements:
102
129
  - - ">="
103
130
  - !ruby/object:Gem::Version
104
- version: '0'
131
+ version: '2.7'
105
132
  required_rubygems_version: !ruby/object:Gem::Requirement
106
133
  requirements:
107
134
  - - ">="
108
135
  - !ruby/object:Gem::Version
109
136
  version: '0'
110
137
  requirements: []
111
- rubyforge_project:
112
- rubygems_version: 2.2.2
113
- signing_key:
138
+ rubygems_version: 3.3.7
139
+ signing_key:
114
140
  specification_version: 4
115
- summary: Display system notifications (dbus, growl and snarl) after running tests.
141
+ summary: Display system notifications (dbus, terminal notifier, snarl, and more) after
142
+ running tests.
116
143
  test_files:
117
144
  - spec/spec_helper.rb
118
145
  - spec/stats/minitest_spec.rb
@@ -120,4 +147,3 @@ test_files:
120
147
  - spec/stats/rspec_spec.rb
121
148
  - spec/stats/test_unit_spec.rb
122
149
  - spec/test_notifier_spec.rb
123
- has_rdoc:
data/Gemfile.lock DELETED
@@ -1,32 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- test_notifier (2.0.3)
5
- notifier
6
-
7
- GEM
8
- remote: http://rubygems.org/
9
- specs:
10
- diff-lcs (1.2.5)
11
- notifier (0.5.0)
12
- rake (10.3.2)
13
- rspec (3.0.0)
14
- rspec-core (~> 3.0.0)
15
- rspec-expectations (~> 3.0.0)
16
- rspec-mocks (~> 3.0.0)
17
- rspec-core (3.0.0)
18
- rspec-support (~> 3.0.0)
19
- rspec-expectations (3.0.0)
20
- diff-lcs (>= 1.2.0, < 2.0)
21
- rspec-support (~> 3.0.0)
22
- rspec-mocks (3.0.1)
23
- rspec-support (~> 3.0.0)
24
- rspec-support (3.0.0)
25
-
26
- PLATFORMS
27
- ruby
28
-
29
- DEPENDENCIES
30
- rake
31
- rspec (>= 3.0.0)
32
- test_notifier!
data/README.rdoc DELETED
@@ -1,74 +0,0 @@
1
- = Test Notifier
2
-
3
- Inspired by http://railstips.org/2007/7/23/autotest-growl-pass-fail-notifications
4
-
5
- After using Growl notification, I decided to write my own plugin because I have
6
- to work on Ubuntu and Mac OS X and I missed the notification on my Linux box.
7
- This plugin works with Linux, Mac OS X and Windows. All you need to do is
8
- install the specific notification library for your OS.
9
-
10
- Instead of displaying lots of notifications for each failure, I prefer to be
11
- notified about the whole test result (you'll have to check your log
12
- file anyway in order to clean up the failures/errors).
13
-
14
- == Installation
15
-
16
- gem install test_notifier
17
-
18
- Check http://github.com/fnando/notifier to see how you can configure a notifier for your OS.
19
-
20
- == Usage
21
-
22
- If you're using Test::Unit you should add <tt>require "test_notifier/runner/test_unit"</tt> to your <tt>test_helper.rb</tt> file.
23
-
24
- If you're using RSpec you should add <tt>require "test_notifier/runner/spec"</tt> to your <tt>spec_helper.rb</tt> file. If you're using RSpec 2-3, you need to add <tt>require "test_notifier/runner/rspec"</tt> instead.
25
-
26
- If you're using Autotest you should add <tt>require "test_notifier/runner/autotest"</tt> to
27
- the file <tt>~/.autotest</tt>
28
-
29
- If you're using MiniTest you should add <tt>require "test_notifier/runner/minitest"</tt> to your <tt>test_helper.rb</tt> file.
30
-
31
- You can define your notifier.
32
-
33
- TestNotifier.default_notifier = :growl
34
-
35
- The available notifiers are <tt>:growl</tt>, <tt>:kdialog</tt>, <tt>:knotify</tt>, <tt>:notify_send</tt>, <tt>:osd_cat</tt>, and <tt>:snarl</tt>.
36
-
37
- If you'd like to make Test Notifier optional for your project:
38
-
39
- TestNotifier.silence_no_notifier_warning = true
40
-
41
- == Maintainer
42
-
43
- * Nando Vieira - http://simplesideias.com.br
44
-
45
- == Collaborators
46
-
47
- * Szymon (jeznet) Jeż - http://github.com/jeznet
48
- * Steve Halasz - http://github.com/woodchuck
49
- * Khaja Minhajuddin - http://minhajuddin.com/
50
- * Steve Sloan - http://github.com/CodeMonkeySteve
51
- * Jordan Byron - http://jordanbyron.com
52
-
53
- == License
54
-
55
- (The MIT License)
56
-
57
- Permission is hereby granted, free of charge, to any person obtaining
58
- a copy of this software and associated documentation files (the
59
- 'Software'), to deal in the Software without restriction, including
60
- without limitation the rights to use, copy, modify, merge, publish,
61
- distribute, sublicense, and/or sell copies of the Software, and to
62
- permit persons to whom the Software is furnished to do so, subject to
63
- the following conditions:
64
-
65
- The above copyright notice and this permission notice shall be
66
- included in all copies or substantial portions of the Software.
67
-
68
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
69
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
70
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
71
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
72
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
73
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
74
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.