true 2.0.0.alpha.4 → 2.0.0.beta.1
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 +4 -4
- data/CHANGELOG.md +4 -1
- data/README.md +13 -13
- data/VERSION +1 -1
- data/bin/true-cli +8 -8
- data/lib/main.js +147 -0
- data/sass/true/_assert.scss +2 -4
- data/sass/true/_results.scss +1 -1
- data/sass/true/_settings.scss +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82b889e126441092c78fae0935640eddff42dd26
|
4
|
+
data.tar.gz: 5ced6822242622c9d5b2c535a020595c4e27af45
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a0aefdab1acf74ad6a17293014f084f626f16d858ea61fa6b54f67ba066889c0de896d0613907d8d1e6ef26d10e74a024b7d10b395fd0e0d07642f681d46e44
|
7
|
+
data.tar.gz: e170d9287c8043791a2936dd894aad9c7a3c3a1e6553e5fddb944de40df1535f1bbc0975dd704616c17dbae8d1958e18fb8d44de17817da761b7dc7ff4e83219
|
data/CHANGELOG.md
CHANGED
@@ -5,8 +5,11 @@ True Changelog
|
|
5
5
|
----------------
|
6
6
|
- Improve internal logic, and namespace private functions behind `_true-*`.
|
7
7
|
- Add `assert()`, `input`, and `expect` mixins for testing CSS output.
|
8
|
-
- Support for LibSass
|
8
|
+
- Support for LibSass.
|
9
|
+
- Add Mocha JS integration.
|
10
|
+
— Create NPM package.
|
9
11
|
- Simplify output options down to single `$true-terminal-output` setting.
|
12
|
+
Defaults to `false` (required for libsass).
|
10
13
|
|
11
14
|
|
12
15
|
1.0.1 (10/18/14)
|
data/README.md
CHANGED
@@ -34,12 +34,15 @@ bower install true
|
|
34
34
|
Command Line
|
35
35
|
------------
|
36
36
|
|
37
|
+
_This command-line tool uses Ruby
|
38
|
+
and the Ruby Sass compiler._
|
39
|
+
|
37
40
|
```bash
|
38
41
|
true-cli [options] PATH
|
39
42
|
```
|
40
43
|
|
41
44
|
Options:
|
42
|
-
* `-s`
|
45
|
+
* `-s` silent
|
43
46
|
* `-c` config file
|
44
47
|
* `-d` debug config file settings
|
45
48
|
|
@@ -93,15 +96,12 @@ Usage
|
|
93
96
|
Settings
|
94
97
|
--------
|
95
98
|
|
96
|
-
There is only one setting
|
97
|
-
`$true-terminal-output`
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
* LibSass doesn't support `@debug`.
|
107
|
-
* The Ruby CLI requires the final summary output.
|
99
|
+
There is only one setting:
|
100
|
+
`$true-terminal-output`
|
101
|
+
toggles output to the terminal on and off.
|
102
|
+
|
103
|
+
- `true` will display a final summary of your test results in the terminal,
|
104
|
+
and show detailed information on failing assertions.
|
105
|
+
*Required for `true-cli`.*
|
106
|
+
- `false` to turn off all terminal output.
|
107
|
+
*Required for Libsass.*
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0.0.
|
1
|
+
2.0.0.beta.0
|
data/bin/true-cli
CHANGED
@@ -8,7 +8,7 @@ COLORS = {
|
|
8
8
|
:fail => "\033[91m",
|
9
9
|
:end => "\033[0m"
|
10
10
|
}
|
11
|
-
options = {'debug' => false, '
|
11
|
+
options = {'debug' => false, 'silent' => false, 'color' => false}
|
12
12
|
config_file = File.join(Dir.pwd, 'test', 'true.yml')
|
13
13
|
OptionParser.new do |opts|
|
14
14
|
opts.banner = "Usage: true-cli [options] file"
|
@@ -19,8 +19,8 @@ OptionParser.new do |opts|
|
|
19
19
|
opts.on('-d', '--debug') do
|
20
20
|
options['debug'] = true
|
21
21
|
end
|
22
|
-
opts.on('-s', '--
|
23
|
-
options['
|
22
|
+
opts.on('-s', '--silent') do
|
23
|
+
options['silent'] = true
|
24
24
|
end
|
25
25
|
end.parse!(ARGV)
|
26
26
|
|
@@ -35,7 +35,7 @@ def with_captured_stdout
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
if File.exists?(config_file)
|
38
|
-
puts "Using config file: #{config_file}" unless options['
|
38
|
+
puts "Using config file: #{config_file}" unless options['silent']
|
39
39
|
config_options = YAML.load(File.read(config_file))
|
40
40
|
options.merge!(config_options['options']) if config_options.has_key?('options')
|
41
41
|
if options['debug']
|
@@ -68,16 +68,16 @@ end
|
|
68
68
|
if matches[:failed] == '0'
|
69
69
|
if options['color']
|
70
70
|
noun = matches[:tests].to_i == 1 ? 'Test' : 'Tests'
|
71
|
-
puts COLORS[:ok] + "#{matches[:tests]} #{noun}, #{matches[:passed]} Passed, #{matches[:failed]} Failed" + COLORS[:end] unless options['
|
71
|
+
puts COLORS[:ok] + "#{matches[:tests]} #{noun}, #{matches[:passed]} Passed, #{matches[:failed]} Failed" + COLORS[:end] unless options['silent']
|
72
72
|
else
|
73
|
-
puts output unless options['
|
73
|
+
puts output unless options['silent']
|
74
74
|
end
|
75
75
|
exit(0)
|
76
76
|
else
|
77
77
|
if options['color']
|
78
|
-
puts COLORS[:fail] + output + COLORS[:end] unless options['
|
78
|
+
puts COLORS[:fail] + output + COLORS[:end] unless options['silent']
|
79
79
|
else
|
80
|
-
puts output unless options['
|
80
|
+
puts output unless options['silent']
|
81
81
|
end
|
82
82
|
exit(3)
|
83
83
|
end
|
data/lib/main.js
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
var _ = require('underscore');
|
2
|
+
var parseCss = require('css').parse;
|
3
|
+
var sass = require('node-sass');
|
4
|
+
var CssSelectorParser = require('css-selector-parser').CssSelectorParser;
|
5
|
+
var selectorParser = new CssSelectorParser();
|
6
|
+
|
7
|
+
|
8
|
+
// @@@ maybe catch errors and display as warnings instead?
|
9
|
+
|
10
|
+
|
11
|
+
module.exports.runSass = function (options, describe, it) {
|
12
|
+
var assert = require('assert');
|
13
|
+
var css = sass.renderSync(options);
|
14
|
+
var modules = parse(css);
|
15
|
+
|
16
|
+
_.each(modules, function (module) {
|
17
|
+
describe(module.module, function () {
|
18
|
+
_.each(module.tests, function (test) {
|
19
|
+
it(test.test, function () {
|
20
|
+
_.each(test.assertions, function (assertion) {
|
21
|
+
if (!assertion.passed) {
|
22
|
+
var msg = (
|
23
|
+
assertion.description + ' ("' +
|
24
|
+
assertion.returned + '" ' +
|
25
|
+
assertion.assert + ' "' +
|
26
|
+
assertion.expected +
|
27
|
+
'")'
|
28
|
+
);
|
29
|
+
assert.fail(
|
30
|
+
assertion.returned,
|
31
|
+
assertion.expected,
|
32
|
+
msg,
|
33
|
+
assertion.assert
|
34
|
+
);
|
35
|
+
}
|
36
|
+
});
|
37
|
+
});
|
38
|
+
});
|
39
|
+
});
|
40
|
+
});
|
41
|
+
};
|
42
|
+
|
43
|
+
// parse True output CSS and return an array of test modules.
|
44
|
+
var parse = module.exports.parse = function (css) {
|
45
|
+
var modules = [];
|
46
|
+
var ast = parseCss(css);
|
47
|
+
|
48
|
+
_.each(_.where(ast.stylesheet.rules, {type: 'rule'}), function (rule) {
|
49
|
+
var decls = _.where(rule.declarations, {type: 'declaration'});
|
50
|
+
var declPairs = _.zip(
|
51
|
+
_.pluck(decls, 'property'),
|
52
|
+
_.pluck(decls, 'value')
|
53
|
+
);
|
54
|
+
var declInfo = _.object(declPairs);
|
55
|
+
var curAssertion, declString;
|
56
|
+
_.each(rule.selectors, function (sel) {
|
57
|
+
var selInfo = parseSelector(sel);
|
58
|
+
if (!selInfo) {
|
59
|
+
throw new Error("Can't understand selector: " + sel);
|
60
|
+
}
|
61
|
+
var curModule = _.findWhere(modules, {module: selInfo.module});
|
62
|
+
if (!curModule) {
|
63
|
+
curModule = {module: selInfo.module, tests: []};
|
64
|
+
modules.push(curModule);
|
65
|
+
}
|
66
|
+
var curTest = _.findWhere(curModule.tests, {test: selInfo.test});
|
67
|
+
if (!curTest) {
|
68
|
+
curTest = {test: selInfo.test, assertions: []};
|
69
|
+
curModule.tests.push(curTest);
|
70
|
+
}
|
71
|
+
if (selInfo.output) {
|
72
|
+
curAssertion = _.findWhere(
|
73
|
+
curTest.assertions, {description: selInfo.assert});
|
74
|
+
if (!curAssertion) {
|
75
|
+
curAssertion = {
|
76
|
+
description: selInfo.assert,
|
77
|
+
assert: 'equal',
|
78
|
+
};
|
79
|
+
curTest.assertions.push(curAssertion);
|
80
|
+
}
|
81
|
+
declString = _.map(declPairs, function (pair) {
|
82
|
+
return pair[0] + ': ' + pair[1] + ';';
|
83
|
+
}).join(' ');
|
84
|
+
if (selInfo.type === 'input') {
|
85
|
+
curAssertion.returned = declString;
|
86
|
+
} else { // if (selInfo.type == 'expect') {
|
87
|
+
curAssertion.expected = declString;
|
88
|
+
}
|
89
|
+
if (curAssertion.returned && curAssertion.expected) {
|
90
|
+
curAssertion.passed = curAssertion.returned === curAssertion.expected;
|
91
|
+
}
|
92
|
+
} else {
|
93
|
+
curAssertion = {
|
94
|
+
assert: selInfo.assert,
|
95
|
+
description: (declInfo['-description'] || '""').slice(1, -1),
|
96
|
+
passed: declInfo['-result'] === 'PASS',
|
97
|
+
};
|
98
|
+
_.each(_.pairs(declInfo), function (pair) {
|
99
|
+
if (_.contains(['-expected--', '-returned--'], pair[0].slice(0, 11))) {
|
100
|
+
var attr = pair[0].slice(1, 9);
|
101
|
+
var type = pair[0].slice(11);
|
102
|
+
var val = pair[1];
|
103
|
+
curAssertion[attr] = type + ': ' + val;
|
104
|
+
}
|
105
|
+
});
|
106
|
+
curTest.assertions.push(curAssertion);
|
107
|
+
}
|
108
|
+
});
|
109
|
+
});
|
110
|
+
|
111
|
+
return modules;
|
112
|
+
};
|
113
|
+
|
114
|
+
|
115
|
+
var parseSelector = module.exports.parseSelector = function (sel) {
|
116
|
+
var rule = selectorParser.parse(sel).rule;
|
117
|
+
var ret = {output: false};
|
118
|
+
var attrName = function (rule, name) {
|
119
|
+
return (rule &&
|
120
|
+
rule.attrs &&
|
121
|
+
rule.attrs.length == 1 &&
|
122
|
+
rule.attrs[0].name === name
|
123
|
+
);
|
124
|
+
};
|
125
|
+
if (attrName(rule, 'data-module')) {
|
126
|
+
ret.module = rule.attrs[0].value;
|
127
|
+
rule = rule.rule;
|
128
|
+
if (attrName(rule, 'data-test')) {
|
129
|
+
ret.test = rule.attrs[0].value;
|
130
|
+
rule = rule.rule;
|
131
|
+
if (attrName(rule, 'data-assert')) {
|
132
|
+
ret.output = true;
|
133
|
+
ret.assert = rule.attrs[0].value;
|
134
|
+
rule = rule.rule;
|
135
|
+
if (rule.classNames.length === 1 &&
|
136
|
+
_.contains(['input', 'expect'], rule.classNames[0])) {
|
137
|
+
ret.type = rule.classNames[0];
|
138
|
+
return ret;
|
139
|
+
}
|
140
|
+
} else if (rule.classNames.length === 1 &&
|
141
|
+
rule.classNames[0].slice(0, 7) === 'assert-') {
|
142
|
+
ret.assert = rule.classNames[0].slice(7);
|
143
|
+
return ret;
|
144
|
+
}
|
145
|
+
}
|
146
|
+
}
|
147
|
+
};
|
data/sass/true/_assert.scss
CHANGED
@@ -143,7 +143,7 @@
|
|
143
143
|
-expected--#{$expected-type}: _true-inspect($expected);
|
144
144
|
-returned--#{$returned-type}: _true-inspect($returned);
|
145
145
|
|
146
|
-
@if $terminal
|
146
|
+
@if $terminal {
|
147
147
|
@debug '[FAIL] #{_true-context(test)} » #{_true-context(assert)}';
|
148
148
|
@debug 'Expected #{$expected-type} »';
|
149
149
|
@debug _true-inspect($expected);
|
@@ -151,7 +151,5 @@
|
|
151
151
|
@debug _true-inspect($returned);
|
152
152
|
}
|
153
153
|
|
154
|
-
@
|
155
|
-
@warn '#{_true-context(test)} » #{_true-context(assert)}';
|
156
|
-
}
|
154
|
+
@warn '#{_true-context(test)} » #{_true-context(assert)}';
|
157
155
|
}
|
data/sass/true/_results.scss
CHANGED
@@ -143,7 +143,7 @@ $_true-results: (
|
|
143
143
|
@include _true-message($message, comments);
|
144
144
|
@include _true-message('--------------------', comments);
|
145
145
|
|
146
|
-
@if $terminal
|
146
|
+
@if $terminal {
|
147
147
|
$message: _true-report-message(global, single);
|
148
148
|
@include _true-message($message, debug);
|
149
149
|
}
|
data/sass/true/_settings.scss
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: 'true'
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.beta.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Suzanne
|
@@ -41,6 +41,7 @@ extra_rdoc_files:
|
|
41
41
|
- lib/true.rb
|
42
42
|
files:
|
43
43
|
- lib/compass-true.rb
|
44
|
+
- lib/main.js
|
44
45
|
- lib/true.rb
|
45
46
|
- sass/_true.scss
|
46
47
|
- sass/true/_assert.scss
|