konacha-chai-matchers 0.0.8 → 0.0.9

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.
data/.gitmodules CHANGED
@@ -1,39 +1,45 @@
1
1
  [submodule "chai-spies"]
2
- path = chai-spies
3
- url = git://github.com/chaijs/chai-spies.git
2
+ path = chai-spies
3
+ url = git://github.com/chaijs/chai-spies.git
4
4
  [submodule "sinon-chai"]
5
- path = sinon-chai
6
- url = git://github.com/domenic/sinon-chai.git
5
+ path = sinon-chai
6
+ url = git://github.com/domenic/sinon-chai.git
7
7
  [submodule "chai-as-promised"]
8
- path = chai-as-promised
9
- url = git://github.com/domenic/chai-as-promised.git
8
+ path = chai-as-promised
9
+ url = git://github.com/domenic/chai-as-promised.git
10
10
  [submodule "chai-jquery"]
11
- path = chai-jquery
12
- url = git://github.com/chaijs/chai-jquery.git
11
+ path = chai-jquery
12
+ url = git://github.com/chaijs/chai-jquery.git
13
13
  [submodule "chai-timers"]
14
- path = chai-timers
15
- url = git://github.com/chaijs/chai-timers.git
14
+ path = chai-timers
15
+ url = git://github.com/chaijs/chai-timers.git
16
16
  [submodule "chai-stats"]
17
- path = chai-stats
18
- url = git://github.com/chaijs/chai-stats.git
17
+ path = chai-stats
18
+ url = git://github.com/chaijs/chai-stats.git
19
19
  [submodule "chai-null"]
20
- path = chai-null
21
- url = git://github.com/chaijs/chai-null.git
20
+ path = chai-null
21
+ url = git://github.com/chaijs/chai-null.git
22
22
  [submodule "chai-factories"]
23
- path = chai-factories
24
- url = git://github.com/chaijs/chai-factories.git
23
+ path = chai-factories
24
+ url = git://github.com/chaijs/chai-factories.git
25
25
  [submodule "chai-changes"]
26
- path = chai-changes
27
- url = https://github.com/matthijsgroen/chai-changes.git
26
+ path = chai-changes
27
+ url = https://github.com/matthijsgroen/chai-changes.git
28
28
  [submodule "chai-backbone"]
29
- path = chai-backbone
30
- url = https://github.com/matthijsgroen/chai-backbone.git
31
- [submodule "Sinon.JS"]
32
- path = Sinon.JS
33
- url = git://github.com/cjohansen/Sinon.JS.git
29
+ path = chai-backbone
30
+ url = https://github.com/matthijsgroen/chai-backbone.git
34
31
  [submodule "js-factories"]
35
- path = js-factories
36
- url = git://github.com/matthijsgroen/js-factories.git
32
+ path = js-factories
33
+ url = git://github.com/matthijsgroen/js-factories.git
37
34
  [submodule "mocha-as-promised"]
38
- path = mocha-as-promised
39
- url = git://github.com/domenic/mocha-as-promised.git
35
+ path = mocha-as-promised
36
+ url = git://github.com/domenic/mocha-as-promised.git
37
+ [submodule "chai-things"]
38
+ path = chai-things
39
+ url = git://github.com/RubenVerborgh/Chai-Things.git
40
+ [submodule "chai-fuzzy"]
41
+ path = chai-fuzzy
42
+ url = git://github.com/elliotf/chai-fuzzy.git
43
+ [submodule "sinon"]
44
+ path = sinon
45
+ url = git://github.com/cjohansen/Sinon.JS.git
@@ -1,7 +1,7 @@
1
1
  module Konacha
2
2
  module Chai
3
3
  module Matchers
4
- VERSION = "0.0.8"
4
+ VERSION = "0.0.9"
5
5
  end
6
6
  end
7
7
  end
data/tasks/update.rb CHANGED
@@ -1,9 +1,10 @@
1
1
  require 'pathname'
2
+ require 'json'
2
3
 
3
4
  desc 'updates all submodules'
4
5
  task :update do
5
6
  modules = collect_modules
6
- update_modules modules
7
+ #update_modules modules
7
8
  vendor_files modules
8
9
  end
9
10
 
@@ -12,7 +13,9 @@ def collect_modules
12
13
  File.open('.gitmodules') do |f|
13
14
  contents = f.read
14
15
  contents.each_line do |line|
15
- modules << $1 if line =~ /\[submodule "(.*)"\]/
16
+ if matches = /\[submodule "(.*)"\]/.match(line)
17
+ modules << matches[1]
18
+ end
16
19
  end
17
20
  end
18
21
  modules
@@ -20,28 +23,52 @@ end
20
23
 
21
24
  def main_files folders
22
25
  folders.map do |f|
23
- file_search = f.downcase
24
- file_search << '.js' unless file_search =~ /\.js$/
26
+ r = determine_file_from_suggestion f
27
+ r ||= get_main_file_from_package "./#{f}/package.json", f
25
28
 
26
- path_order = ["./#{f}/pkg/#{file_search}", "./#{f}/#{file_search}", "./#{f}/lib/#{file_search}"]
27
-
28
- r = path_order.map do |p|
29
- p if File.exist? p
30
- end.flatten.compact.first
29
+ { lib: r, module: f }
31
30
  end.flatten.compact
32
31
  end
33
32
 
33
+ def determine_file_from_suggestion filename, folder = filename
34
+ file_search = filename.downcase
35
+ file_search << '.js' unless file_search =~ /\.js$/
36
+
37
+ path_order = [
38
+ "./#{folder}/pkg/#{file_search}",
39
+ "./#{folder}/#{file_search}",
40
+ "./#{folder}/lib/#{file_search}"
41
+ ]
42
+ path_order.map do |p|
43
+ p if File.exist? p
44
+ end.flatten.compact.first
45
+ end
46
+
47
+ def get_main_file_from_package filename, folder
48
+ return unless File.exist? filename
49
+ json_string = File.open(filename).read
50
+ json = JSON.parse json_string
51
+ return unless json.has_key? "main"
52
+ main_file = json["main"]
53
+ determine_file_from_suggestion main_file, folder
54
+ end
55
+
34
56
  def vendor_files modules
35
57
  files = main_files modules
36
- puts "found #{files.length} of the #{modules.length} lib files" unless files.length == modules.length
58
+ missing = files.map { |f| f[:lib].nil? ? f[:module] : nil }.compact
59
+
60
+ puts "missing #{missing.length} lib files: #{missing.inspect}" unless missing.empty?
61
+
37
62
  path = "./vendor/assets/javascripts/"
38
63
  Pathname.new(path).mkpath()
39
- FileUtils.cp files, path
64
+ files.each do |info|
65
+ FileUtils.cp(info[:lib], "#{path}#{info[:module]}.js") if info[:lib]
66
+ end
40
67
  end
41
68
 
42
69
  def update_modules modules
43
70
  modules.each do |mod|
44
- `cd ./#{mod} && git pull`
71
+ `cd ./#{mod} && git pull origin master`
45
72
  `cd ./#{mod} && ./build` if File.exist? "./#{mod}/build"
46
73
  end
47
74
  end
@@ -0,0 +1,90 @@
1
+ (function(plugin){
2
+ if (
3
+ typeof require === "function"
4
+ && typeof exports === "object"
5
+ && typeof module === "object"
6
+ ) {
7
+ // NodeJS
8
+ module.exports = plugin;
9
+ } else if (
10
+ typeof define === "function"
11
+ && define.amd
12
+ ) {
13
+ // AMD
14
+ define(function () {
15
+ return plugin;
16
+ });
17
+ } else {
18
+ // Other environment (usually <script> tag): plug in to global chai instance directly.
19
+ chai.use(plugin);
20
+ }
21
+ }(function(chai, utils){
22
+ var _;
23
+
24
+ if (
25
+ typeof require === "function"
26
+ && typeof exports === "object"
27
+ && typeof module === "object"
28
+ ) {
29
+ // server-side
30
+ _ = require('underscore');
31
+ } else {
32
+ // browser-side
33
+ _ = window._;
34
+ }
35
+
36
+ // contain => _.where, check _.isEqual
37
+ // containOnce => contain, check size of returned array
38
+ // like => _.isEqual
39
+
40
+ chai.Assertion.addMethod('like', function(expected){
41
+ var obj = this._obj
42
+ this.assert(
43
+ _.isEqual(obj, expected)
44
+ , "expected #{this} to be like #{exp}"
45
+ , "expected #{this} not to be like #{exp}"
46
+ , expected
47
+ , obj
48
+ , true
49
+ )
50
+ });
51
+
52
+ chai.Assertion.addMethod('jsonOf', function(expected){
53
+ var obj = this._obj;
54
+ var expectedAsJSON = JSON.parse(JSON.stringify(expected));
55
+
56
+ this.assert(
57
+ _.isEqual(obj, expectedAsJSON)
58
+ , "expected #{this} to be like JSON #{exp}"
59
+ , "expected #{this} not to be like JSON #{exp}"
60
+ , expectedAsJSON
61
+ , obj
62
+ , true
63
+ )
64
+ });
65
+
66
+ chai.Assertion.addMethod('containOneLike', function(expected){
67
+ var obj = this._obj
68
+
69
+ var _obj = _(obj);
70
+
71
+ if (!_obj.isObject() && !_obj.isArray()) {
72
+ this.assert(
73
+ false
74
+ , "expected #{this} to be an array, object, or string"
75
+ , "expected #{this} to be an array, object, or string"
76
+ )
77
+ }
78
+
79
+ var found = _obj.some(function(needle){
80
+ return _.isEqual(needle,expected);
81
+ });
82
+
83
+ this.assert(
84
+ found
85
+ , "expected #{this} to contain one thing like #{exp}"
86
+ , "expected #{this} not to contain one thing like #{exp}"
87
+ , expected
88
+ )
89
+ });
90
+ }));
@@ -0,0 +1,143 @@
1
+ (function (chaiModule) {
2
+ "use strict";
3
+ // NodeJS
4
+ if (typeof require === "function" && typeof exports === "object" && typeof module === "object")
5
+ module.exports = chaiModule;
6
+ // AMD
7
+ else if (typeof define === "function" && define.amd)
8
+ define(function () { return chaiModule; });
9
+ // Other
10
+ else
11
+ chai.use(chaiModule);
12
+ }(function chaiAsPromised(chai, utils) {
13
+ "use strict";
14
+
15
+ var Assertion = chai.Assertion,
16
+ assertionPrototype = Assertion.prototype,
17
+ expect = chai.expect;
18
+
19
+ // Handles the `something` chain property
20
+ function chainSomething() {
21
+ // `include` or `contains` should have been called before
22
+ if (!utils.flag(this, "contains"))
23
+ throw new Error("cannot use something without include or contains");
24
+ // `something` should not have been used already
25
+ if (utils.flag(this, "something"))
26
+ throw new Error("cannot use something twice in an assertion");
27
+ // flag that this is a `something` chain
28
+ utils.flag(this, "something", {
29
+ // remember if `something` was negated
30
+ negate: utils.flag(this, "negate")
31
+ });
32
+ // reset the negation flag for the coming assertion
33
+ utils.flag(this, "negate", false);
34
+ }
35
+
36
+ // Performs the `something()` assertion
37
+ function assertSomething() {
38
+ // Undo the flags set by the `something` chain property
39
+ var somethingFlags = utils.flag(this, "something");
40
+ utils.flag(this, "something", false);
41
+ utils.flag(this, "negate", somethingFlags.negate);
42
+
43
+ // The assertion's object for `something` should be array-like
44
+ var object = utils.flag(this, "object");
45
+ expect(object).to.have.property("length");
46
+ expect(object.length).to.be.a("number", "something object length");
47
+
48
+ // The object should contain something
49
+ this.assert(object.length > 0,
50
+ "expected #{this} to contain something",
51
+ "expected #{this} not to contain something"
52
+ );
53
+ }
54
+
55
+ // Find all assertion methods
56
+ var methodNames = Object.getOwnPropertyNames(assertionPrototype)
57
+ .filter(function (propertyName) {
58
+ var property = Object.getOwnPropertyDescriptor(assertionPrototype, propertyName);
59
+ return typeof property.value === "function";
60
+ });
61
+
62
+ // Override all methods to react on a possible `something` in the chain
63
+ methodNames.forEach(function (methodName) {
64
+ Assertion.overwriteMethod(methodName, function (_super) {
65
+ return function () {
66
+ // Return if no `something` has been used in the chain
67
+ var somethingFlags = utils.flag(this, "something");
68
+ if (!somethingFlags)
69
+ return _super.apply(this, arguments);
70
+ // Clear the `something` flag; it should not be handled again
71
+ utils.flag(this, "something", false);
72
+
73
+ // The assertion's object for `something` should be array-like
74
+ var arrayObject = utils.flag(this, "object");
75
+ expect(arrayObject).to.have.property("length");
76
+ var length = arrayObject.length;
77
+ expect(length).to.be.a("number", "something object length");
78
+
79
+ // In the negative case, an empty array means success
80
+ var negate = somethingFlags.negate;
81
+ if (negate && !length)
82
+ return;
83
+ // In the positive case, the array should not be empty
84
+ new Assertion(arrayObject).assert(length,
85
+ "expected #{this} to contain something");
86
+
87
+ // Try the assertion on every array element
88
+ var assertionError;
89
+ for (var i = 0; i < length; i++) {
90
+ // Test whether the element satisfies the assertion
91
+ var item = arrayObject[i],
92
+ itemAssertion = copyAssertion(this, item, somethingAssert);
93
+ assertionError = null;
94
+ try { _super.apply(itemAssertion, arguments); }
95
+ catch (error) { assertionError = error; }
96
+ // If the element satisfies the assertion
97
+ if (!assertionError) {
98
+ // In case the base assertion is negated, a satisfying element
99
+ // means the base assertion ("no element must satisfy x") fails
100
+ if (negate) {
101
+ // Assert the negated item assertion, which should fail and throw an error
102
+ var negItemAssertion = copyAssertion(this, item, somethingAssert, true);
103
+ _super.apply(negItemAssertion, arguments);
104
+ // Throw here if, for some reason, the negated item assertion didn't throw
105
+ new Assertion(arrayObject).assert(false,
106
+ "expected no element of #{this} to satisfy the assertion");
107
+ }
108
+ // In the positive case, a satisfying element means the assertion holds
109
+ return;
110
+ }
111
+ }
112
+ // Changes the assertion message to an array viewpoint
113
+ function somethingAssert(test, positive, negative, expected, actual) {
114
+ var replacement = (negate ? "no" : "an") + " element of #{this}";
115
+ utils.flag(this, "object", arrayObject);
116
+ assertionPrototype.assert.call(this, test,
117
+ (negate ? negative : positive).replace("#{this}", replacement),
118
+ (negate ? positive : negative).replace("#{this}", replacement),
119
+ expected, actual);
120
+ }
121
+ // If we reach this point, no element that satisfies the assertion has been found
122
+ if (!negate)
123
+ throw assertionError;
124
+ };
125
+ });
126
+ });
127
+
128
+ // Copies an assertion to another item, using the specified assert function
129
+ function copyAssertion(baseAssertion, item, assert, negate) {
130
+ var assertion = new Assertion(item);
131
+ utils.transferFlags(baseAssertion, assertion, false);
132
+ assertion.assert = assert;
133
+ if (negate)
134
+ utils.flag(assertion, "negate", !utils.flag(assertion, "negate"));
135
+ return assertion;
136
+ }
137
+
138
+ // Define the `something` chainable assertion method and its variants
139
+ ["something", "thing", "item", "one", "some", "any"].forEach(function (methodName) {
140
+ if (!(methodName in assertionPrototype))
141
+ Assertion.addChainableMethod(methodName, assertSomething, chainSomething);
142
+ });
143
+ }));