snapdragon 0.1.5 → 0.1.6

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
2
  SHA1:
3
- metadata.gz: 97aadcc78ce94e09bf9863c15eab1d025770f72c
4
- data.tar.gz: 5c005537c8cb301eedc865b49d4df0d49f24b705
3
+ metadata.gz: f1632da8263c3d4445832f76e9cc084c863946f2
4
+ data.tar.gz: 6abc0912510a43f966bdcd5a2092398f76255923
5
5
  SHA512:
6
- metadata.gz: e82eccf5e685602a71fc77992c3c7b81455761643b876834cc68096efd8f0f8d5748bc710599704f2a5747bbf825a8d1d9cea560cf821438640479c032252f3a
7
- data.tar.gz: 355df2ec500429b87cfb339b7eb5358bc46596ecc00a30efb0a12ec024d7543317bfe6999ff990238f3beba7a72758c6a07343721e4151b1f5ba32aee6102cf9
6
+ metadata.gz: 0245feb11ac0d4a2bc8b6e9ba1f04b45f24be9635c18bd12c7b27df683f5a9d0ff9d5824d8858cd93a49de00ecb989ab7e94c0b39ca9d9a98e5f601ecd5da8e8
7
+ data.tar.gz: a295d969bf7ff0f5e0f4bcd86c6bd9dd46deec98d3fecd09c6867031e6de83f4c4ba7a32727136f5184b01d32c7c89a512d63adabf0ec42449baac4a3c1f33d7
data/ChangeLog.markdown CHANGED
@@ -6,9 +6,24 @@ versions as well as provide a rough history.
6
6
 
7
7
  #### Next Release
8
8
 
9
+ #### v0.1.6
10
+
11
+ * snapdragon_server when given `some/spec.js:344` now opens the browser to the
12
+ correctly filtered URL
13
+ ([\#3](http://github.com/reachlocal/snapdragon/issues/3))
14
+ * snapdragon_server now finds new files/specs on browser refresh
15
+ ([\#1](http://github.com/reachlocal/snapdragon/issues/1))
16
+ * Stack traces are now exclude jasmine.js lines
17
+ ([\#10](http://github.com/reachlocal/snapdragon/issues/10))
18
+ * Added stack traces to the output of failed expectations
19
+ ([\#14](http://github.com/reachlocal/snapdragon/issues/14))
20
+ * Moved from inline code loading to external script tag sources
21
+ ([\#13](http://github.com/reachlocal/snapdragon/issues/13))
22
+
9
23
  #### v0.1.5
10
24
 
11
- * Jasmine runner now hosts files in CWD under `/:path` ([\#12](http://github.com/reachlocal/snapdragon/issues/12))
25
+ * Jasmine runner now hosts files in CWD under `/:path`
26
+ ([\#12](http://github.com/reachlocal/snapdragon/issues/12))
12
27
 
13
28
  #### v0.1.4
14
29
 
data/README.markdown CHANGED
@@ -32,6 +32,13 @@ running the following command:
32
32
 
33
33
  ## Quick Start Guide
34
34
 
35
+ If you are a visual learner Brian Miller and I have put together a Free
36
+ [Snapdragon](http://github.com/reachlocal/snapdragon) Screencast at [The Code
37
+ Breakdown](http://codebreakdown.com) ([direct
38
+ download](http://codebreakdown.com/screencasts/7/download)).
39
+
40
+ [![It in Action](http://media.codebreakdown.com/thumbnails/tcb-0007-thumbnail-400x225.png)](http://codebreakdown.com)
41
+
35
42
  For those of you that like to jump right in and start playing with new tools
36
43
  follow the steps below to get started.
37
44
 
@@ -0,0 +1,6 @@
1
+
2
+ describe("Bar", function() {
3
+ it(".foo", function() {
4
+ bar = new Bar();
5
+ });
6
+ });
@@ -18,7 +18,14 @@ describe("Hoopty", function() {
18
18
  describe(".hello", function() {
19
19
  it("says hello there", function() {
20
20
  var f = new Hoopty();
21
- expect(f.hello()).toBe("Hello There");
21
+ expect(f.hello()).toBe("Hello There aeuaeuo");
22
+ });
23
+ });
24
+
25
+ describe(".goodbye", function() {
26
+ it("says goodbye", function() {
27
+ var f = new Hoopty();
28
+ expect(f.goodbye()).toBe("goodbye");
22
29
  });
23
30
  });
24
31
  });
@@ -4,8 +4,6 @@ require 'launchy'
4
4
 
5
5
  require_relative './web_application'
6
6
  require_relative './suite'
7
- require_relative './spec_file'
8
- require_relative './spec_directory'
9
7
 
10
8
  # Set the default_wait_time to something reasonable for the entire length of
11
9
  # the test suite to run. This should probably eventually be something
@@ -17,77 +15,30 @@ module Snapdragon
17
15
  class CliApplication
18
16
  def initialize(arguements)
19
17
  @args = arguements
20
- @suite = Snapdragon::Suite.new
18
+ @suite = Snapdragon::Suite.new(arguements)
21
19
  end
22
20
 
23
21
  def run
24
- parse_arguements(@args)
25
- run_suite
22
+ session = Capybara::Session.new(:poltergeist, Snapdragon::WebApplication.new(nil, @suite))
23
+ if @suite.filtered?
24
+ session.visit("/run?spec=#{@suite.spec_query_param}")
25
+ else
26
+ session.visit("/run")
27
+ end
28
+ session.find("#testscomplete")
26
29
  return 0
27
30
  end
28
31
 
29
32
  def serve
30
- parse_arguements(@args)
31
33
  server = Capybara::Server.new(Snapdragon::WebApplication.new(nil, @suite), 9292)
32
34
  server.boot
33
- Launchy.open('http://localhost:9292/run')
34
- trap('SIGINT') { puts "Shutting down..."; exit 0 }
35
- sleep
36
- end
37
-
38
- private
39
-
40
- def parse_arguements(arguements)
41
- arguements.each do |arguement|
42
- parse_arguement(arguement)
43
- end
44
- end
45
-
46
- def parse_arguement(arguement)
47
- if is_a_file_path_and_line_number?(arguement)
48
- path, line_num_str = arguement.split(':')
49
- @suite.add_spec_file(SpecFile.new(path, line_num_str.to_i))
50
- elsif is_a_file_path?(arguement)
51
- @suite.add_spec_file(SpecFile.new(arguement))
52
- elsif is_a_directory?(arguement)
53
- spec_dir = Snapdragon::SpecDirectory.new(arguement)
54
- @suite.add_spec_files(spec_dir.spec_files)
55
- end
56
- end
57
-
58
- def is_a_file_path_and_line_number?(arguement)
59
- if arguement =~ /^[\w\/\-\d\.]+[s|S]pec\.js:\d+$/
60
- return true
61
- else
62
- return false
63
- end
64
- end
65
-
66
- def is_a_file_path?(arguement)
67
- if arguement =~ /^[\w\/\-\d\.]+[s|S]pec\.js$/
68
- return true
69
- else
70
- return false
71
- end
72
- end
73
-
74
- def is_a_directory?(arguement)
75
- if arguement =~ /^[\w\/\-\d\.]+$/
76
- return true
77
- else
78
- return false
79
- end
80
- end
81
-
82
- def run_suite
83
- session = Capybara::Session.new(:poltergeist, Snapdragon::WebApplication.new(nil, @suite))
84
35
  if @suite.filtered?
85
- session.visit("/run?spec=#{@suite.spec_query_param}")
86
- session.find("#testscomplete")
36
+ Launchy.open("http://localhost:9292/run?spec=#{@suite.spec_query_param}")
87
37
  else
88
- session.visit("/run")
89
- session.find("#testscomplete")
38
+ Launchy.open('http://localhost:9292/run')
90
39
  end
40
+ trap('SIGINT') { puts "Shutting down..."; exit 0 }
41
+ sleep
91
42
  end
92
43
  end
93
44
  end
@@ -0,0 +1,45 @@
1
+ require_relative './spec_directory'
2
+ require_relative './spec_file'
3
+
4
+ module Snapdragon
5
+ class Path
6
+ attr_reader :path, :line_number
7
+
8
+ def initialize(raw_path)
9
+ @raw_path = raw_path
10
+ if has_line_number?
11
+ @path, @line_number = raw_path.split(':')
12
+ @line_number = @line_number.to_i
13
+ else
14
+ @path = raw_path
15
+ end
16
+ end
17
+
18
+ def spec_files
19
+ if exists?
20
+ if is_a_directory?
21
+ spec_dir = Snapdragon::SpecDirectory.new(self)
22
+ return spec_dir.spec_files
23
+ else
24
+ return [SpecFile.new(self)]
25
+ end
26
+ end
27
+ return []
28
+ end
29
+
30
+ def has_line_number?
31
+ return true if @raw_path =~ /^.*:\d+$/
32
+ return false
33
+ end
34
+
35
+ private
36
+
37
+ def is_a_directory?
38
+ return File.directory?(@path)
39
+ end
40
+
41
+ def exists?
42
+ return File.exists?(@path)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,162 @@
1
+ jasmine.SnapdragonConsoleReporter = function(options) {
2
+ var print = function(msg) { console.log(msg); },
3
+ showColors = options.showColors || true,
4
+ onComplete = options.onComplete || function() {},
5
+ specCount,
6
+ failureCount,
7
+ passedCount,
8
+ failedSpecs = [],
9
+ pendingSpecs = [],
10
+ pendingCount,
11
+ startTimestamp,
12
+ endTimestamp
13
+ ansi = {
14
+ green: '\033[32m',
15
+ red: '\033[31m',
16
+ yellow: '\033[33m',
17
+ none: '\033[0m'
18
+ };
19
+
20
+ function printNewline() {
21
+ print("");
22
+ }
23
+
24
+ function colored(color, str) {
25
+ return showColors ? (ansi[color] + str + ansi.none) : str;
26
+ }
27
+
28
+ function plural(str, count) {
29
+ return count == 1 ? str : str + "s";
30
+ }
31
+
32
+ function repeat(thing, times) {
33
+ var arr = [];
34
+ for (var i = 0; i < times; i++) {
35
+ arr.push(thing);
36
+ }
37
+ return arr;
38
+ }
39
+
40
+ function indent(str, spaces) {
41
+ var lines = (str || '').split("\n");
42
+ var newArr = [];
43
+ for (var i = 0; i < lines.length; i++) {
44
+ newArr.push(repeat(" ", spaces).join("") + lines[i]);
45
+ }
46
+ return newArr.join("\n");
47
+ }
48
+
49
+ function specFailureDetails(spec, failure_number) {
50
+ print(indent(failure_number + ") " + spec.getFullName(), 2));
51
+
52
+ var resultItems = spec.results().getItems();
53
+ for (var i = 0; i < resultItems.length; i++) {
54
+ var result = resultItems[i];
55
+ if (result.trace.stack) {
56
+ print(indent(colored("red", trimStackTrace(result.trace.stack)), 6));
57
+ } else {
58
+ print(indent(colored("red", result.message), 6));
59
+ }
60
+ }
61
+ printNewline();
62
+ }
63
+
64
+ function specPendingDetails(spec) {
65
+ print(indent(colored("yellow", spec.getFullName()), 2));
66
+ printNewline();
67
+ }
68
+
69
+ function signalCapybaraTestsFinishedRunning() {
70
+ var div = document.createElement('div');
71
+ div.id = 'testscomplete';
72
+ document.body.appendChild(div);
73
+ }
74
+
75
+ function trimStackTrace(stackTraceString) {
76
+ return stackTraceString.replace(/\s*at\s*http:\/\/127.0.0.1:\d+\/jasmine-core\/jasmine\.js:\d+\s*/g, "");
77
+ }
78
+
79
+ // Jasmine Hooks
80
+
81
+ this.log = function() {
82
+ };
83
+
84
+ this.reportRunnerStarting = function() {
85
+ startTimestamp = new Date().getTime();
86
+ specCount = 0;
87
+ failureCount = 0;
88
+ passedCount = 0;
89
+ pendingCount = 0;
90
+ print("Running examples...");
91
+ printNewline();
92
+ };
93
+
94
+ this.reportSuiteResults = function(suite) {
95
+ };
96
+
97
+ this.reportSpecStarting = function() {
98
+ };
99
+
100
+ this.reportSpecResults = function(spec) {
101
+ var results = spec.results();
102
+
103
+ if (!results.skipped) { // not pending
104
+ specCount++;
105
+ }
106
+
107
+ if (results.skipped) { // when you filter out tests with spec query param
108
+ pendingCount++;
109
+ pendingSpecs.push(spec);
110
+ } else if (results.passed()) { // passed
111
+ passedCount++;
112
+ } else { // failed
113
+ failureCount++;
114
+ failedSpecs.push(spec);
115
+ }
116
+ };
117
+
118
+ this.reportRunnerResults = function(options) {
119
+ endTimestamp = new Date().getTime();
120
+
121
+ // I have commented out the pending section below because v1.3.1 of
122
+ // jasmine doesn't have a concept of pending. It has a concept of
123
+ // skipped when you filter tests using the spec query param.
124
+
125
+ // if (pendingCount > 0) {
126
+ // print("Pending:");
127
+ // }
128
+
129
+ // for (var i = 0; i < pendingSpecs.length; i++) {
130
+ // specPendingDetails(pendingSpecs[i]);
131
+ // }
132
+
133
+ if (failureCount > 0) {
134
+ print("Failures:");
135
+ printNewline();
136
+ }
137
+
138
+ for (var i = 0; i < failedSpecs.length; i++) {
139
+ specFailureDetails(failedSpecs[i], i + 1);
140
+ }
141
+
142
+ var specCounts = specCount + " " + plural("example", specCount) + ", " + failureCount + " " + plural("failure", failureCount);
143
+
144
+ if (pendingCount) {
145
+ specCounts += ", " + pendingCount + " skipped";
146
+ }
147
+
148
+ var seconds = (endTimestamp - startTimestamp) / 1000.0;
149
+ print("Finished in " + seconds + " " + plural("second", seconds));
150
+
151
+ if (failureCount > 0) { // have any failures
152
+ print(colored("red", specCounts));
153
+ // } else if (pendingCount > 0) {
154
+ // print(colored("yellow", specCounts));
155
+ } else {
156
+ print(colored("green", specCounts));
157
+ }
158
+
159
+ onComplete();
160
+ signalCapybaraTestsFinishedRunning();
161
+ };
162
+ };
@@ -7,13 +7,13 @@ module Snapdragon
7
7
  end
8
8
 
9
9
  def spec_files
10
- spec_paths = []
11
- Dir.glob("#{@path}/**/*").each do |path|
12
- if path =~ /^[\w\/\-\d]+[s|S]pec\.js$/
13
- spec_paths << Snapdragon::SpecFile.new(path)
10
+ spec_file_objs = []
11
+ Dir.glob("#{@path.path}/**/*").each do |raw_path|
12
+ if raw_path =~ /^[\w\/\-\d]+[s|S]pec\.js$/
13
+ spec_file_objs << Snapdragon::SpecFile.new(Snapdragon::Path.new(raw_path))
14
14
  end
15
15
  end
16
- return spec_paths
16
+ return spec_file_objs
17
17
  end
18
18
  end
19
19
  end
@@ -1,19 +1,15 @@
1
1
  module Snapdragon
2
2
  class SpecFile
3
- def initialize(path, line_number = nil)
3
+ def initialize(path)
4
4
  @path = path
5
- @line_number = line_number
6
5
  end
7
6
 
8
- def read
9
- f = File.open(File.expand_path(@path), 'r')
10
- content = f.read
11
- f.close
12
- return content
7
+ def relative_url_path
8
+ File.join('/', @path.path)
13
9
  end
14
10
 
15
11
  def require_paths
16
- f = File.open(File.expand_path(@path), 'r')
12
+ f = File.open(File.expand_path(@path.path), 'r')
17
13
  lines = f.readlines
18
14
  f.close
19
15
 
@@ -21,7 +17,7 @@ module Snapdragon
21
17
 
22
18
  lines.each do |line|
23
19
  if line =~ /\/\/+\s+require_relative\(['"](.+)['"]\)\s+$/
24
- require_paths << File.expand_path(File.join(File.dirname(@path), $1))
20
+ require_paths << File.join('/', File.join(File.dirname(@path.path), $1))
25
21
  end
26
22
  end
27
23
 
@@ -29,8 +25,7 @@ module Snapdragon
29
25
  end
30
26
 
31
27
  def filtered?
32
- return true if @line_number
33
- return false
28
+ return @path.has_line_number?
34
29
  end
35
30
 
36
31
  def spec_query_param
@@ -38,10 +33,10 @@ module Snapdragon
38
33
 
39
34
  # Work our way from the line number up to build the spec query param
40
35
  # description
41
- initial_line_number = @line_number
36
+ initial_line_number = @path.line_number
42
37
  initial_line_index = initial_line_number - 1
43
38
 
44
- f = open(File.expand_path(@path), 'r')
39
+ f = open(File.expand_path(@path.path), 'r')
45
40
  lines = f.readlines
46
41
  f.close
47
42
 
@@ -1,50 +1,44 @@
1
+ require_relative './path'
2
+
1
3
  module Snapdragon
2
4
  class Suite
3
- def initialize
4
- @specs = []
5
- @require_paths = Set.new
6
- @filtered = false
7
- @spec_query_param = ''
5
+ def initialize(paths)
6
+ @paths = paths
8
7
  end
9
8
 
10
- def add_spec_file(spec_file)
11
- if spec_file.filtered?
12
- @filtered = true
13
- @spec_query_param = spec_file.spec_query_param
9
+ def spec_files
10
+ spec_file_objs = []
11
+
12
+ @paths.each do |raw_path|
13
+ path = Snapdragon::Path.new(raw_path)
14
+ spec_file_objs.concat(path.spec_files)
14
15
  end
15
- @specs << spec_file
16
- @require_paths.merge(spec_file.require_paths)
16
+
17
+ return spec_file_objs
17
18
  end
18
19
 
19
- def add_spec_files(spec_files)
20
- spec_files.each do |spec|
21
- add_spec_file(spec)
20
+ def require_paths
21
+ require_paths = Set.new
22
+
23
+ spec_files.each do |foo|
24
+ require_paths.merge(foo.require_paths)
22
25
  end
23
- end
24
26
 
25
- def spec_files
26
- @specs
27
+ return require_paths
27
28
  end
28
29
 
29
- def output_spec_dependencies
30
- require_content = "// output spec dependencies begin here\n\n"
31
- @require_paths.each do |require_path|
32
- require_content << "\n\n// #{require_path} begins here\n"
33
- f = File.open(require_path, 'r')
34
- require_content << f.read
35
- require_content << "\n// #{require_path} ends here\n\n"
36
- f.close
30
+ def filtered?
31
+ spec_files.each do |spec_file|
32
+ return true if spec_file.filtered?
37
33
  end
38
- require_content << "\n// output spec dependencies end here\n"
39
- return require_content
34
+ return false
40
35
  end
41
36
 
42
37
  def spec_query_param
43
- @spec_query_param
44
- end
45
-
46
- def filtered?
47
- @filtered
38
+ spec_files.each do |spec_file|
39
+ return spec_file.spec_query_param if spec_file.filtered?
40
+ end
41
+ return ''
48
42
  end
49
43
  end
50
44
  end
@@ -1,3 +1,3 @@
1
1
  module Snapdragon
2
- VERSION = "0.1.5"
2
+ VERSION = "0.1.6"
3
3
  end
@@ -2,19 +2,17 @@
2
2
  <script type="text/javascript" src="/jasmine-core/jasmine.js"></script>
3
3
  <script type="text/javascript" src="/jasmine-core/jasmine-html.js"></script>
4
4
 
5
- <script type="text/javascript" src="/resources/ConsoleReporter.js"></script>
5
+ <script type="text/javascript" src="/resources/SnapdragonConsoleReporter.js"></script>
6
6
 
7
- <script type="text/javascript">
8
- // The implementation code the spec files being tested need
9
- <%= @suite.output_spec_dependencies %>
10
- </script>
7
+ <!-- The implementation code the spec files being tested need -->
8
+ <% @suite.require_paths.each do |path| %>
9
+ <script type="text/javascript" src="<%= path %>"></script>
10
+ <% end %>
11
11
 
12
- <script type="text/javascript">
13
- // The spec file contents
12
+ <!-- The spec files -->
14
13
  <% @suite.spec_files.each do |spec| %>
15
- <%= spec.read %>
14
+ <script type="text/javascript" src="<%= spec.relative_url_path %>"></script>
16
15
  <% end %>
17
- </script>
18
16
 
19
17
  <script type="text/javascript">
20
18
  (function() {
@@ -25,9 +23,8 @@
25
23
 
26
24
  jasmineEnv.addReporter(htmlReporter);
27
25
 
28
- var consoleReporterFunc = jasmine.ConsoleReporter();
29
- var consoleReporter = new consoleReporterFunc({});
30
- jasmineEnv.addReporter(consoleReporter);
26
+ var snapdragonConsoleReporter = new jasmine.SnapdragonConsoleReporter({});
27
+ jasmineEnv.addReporter(snapdragonConsoleReporter);
31
28
 
32
29
  jasmineEnv.specFilter = function(spec) {
33
30
  return htmlReporter.specFilter(spec);
@@ -22,174 +22,14 @@ describe Snapdragon::CliApplication do
22
22
  end
23
23
 
24
24
  describe "#run" do
25
- it "parses the given command line arguements" do
26
- arguements = stub
27
- app = Snapdragon::CliApplication.new(arguements)
28
- app.should_receive(:parse_arguements).with(arguements)
29
- app.stub(:run_suite)
30
- app.run
31
- end
32
-
33
- it "runs the Jasmine suite" do
34
- app = Snapdragon::CliApplication.new(['/some/path/to_some_spec.js'])
35
- app.stub(:parse_arguements)
36
- app.should_receive(:run_suite)
37
- app.run
38
- end
39
-
40
- it "returns 0 representing success" do
41
- app = Snapdragon::CliApplication.new(['/some/path/to_some_spec.js'])
42
- app.stub(:parse_arguements)
43
- app.stub(:run_suite)
44
- app.run.should eq(0)
45
- end
46
- end
47
-
48
- describe "#parse_arguements" do
49
- let(:arguements) { ['some/path/to/some_spec.js:23', 'some/path/to/some_other_spec.js'] }
50
- subject { Snapdragon::CliApplication.new(arguements) }
51
-
52
- it "iterates over each of the arguments parsing each one" do
53
- subject.should_receive(:parse_arguement).with('some/path/to/some_spec.js:23')
54
- subject.should_receive(:parse_arguement).with('some/path/to/some_other_spec.js')
55
- subject.send(:parse_arguements, arguements)
56
- end
57
- end
58
-
59
- describe "#parse_arguement" do
60
- subject { Snapdragon::CliApplication.new(stub) }
61
-
62
- context "when the arg represents a file + line number" do
63
- before do
64
- subject.stub(:is_a_file_path_and_line_number?).and_return(true)
65
- end
66
-
67
- it "creates a SpecFile with the specified path and line number" do
68
- Snapdragon::SpecFile.should_receive(:new).with('some/path/to/some_spec.js', 45).and_return(stub.as_null_object)
69
- subject.send(:parse_arguement, 'some/path/to/some_spec.js:45')
70
- end
71
-
72
- it "appends the created SpecFile to the applications Suite" do
73
- spec_file = stub('spec_file')
74
- suite = mock('suite')
75
- subject.instance_variable_set(:@suite, suite)
76
- Snapdragon::SpecFile.stub(:new).and_return(spec_file)
77
- suite.should_receive(:add_spec_file).with(spec_file)
78
- subject.send(:parse_arguement, 'some/path/to/some_spec.js:45')
79
- end
80
- end
81
-
82
- context "when the arg represents a file without a line number" do
83
- before do
84
- subject.stub(:is_a_file_path_and_line_number?).and_return(false)
85
- subject.stub(:is_a_file_path?).and_return(true)
86
- end
87
-
88
- it "creates a SpecFile object with the specified path" do
89
- Snapdragon::SpecFile.should_receive(:new).with('some/path/to/some_spec.js').and_return(stub.as_null_object)
90
- subject.send(:parse_arguement, 'some/path/to/some_spec.js')
91
- end
92
-
93
- it "appends the created SpecFile to the application Suite" do
94
- spec_file = stub('spec_file')
95
- suite = mock('suite')
96
- subject.instance_variable_set(:@suite, suite)
97
- Snapdragon::SpecFile.stub(:new).and_return(spec_file)
98
- suite.should_receive(:add_spec_file).with(spec_file)
99
- subject.send(:parse_arguement, 'some/path/to/some_spec.js')
100
- end
101
- end
102
-
103
- context "when the arg respesents a directory" do
104
- before do
105
- subject.stub(:is_a_file_path_and_line_number?).and_return(false)
106
- subject.stub(:is_a_file_path?).and_return(false)
107
- subject.stub(:is_a_directory?).and_return(true)
108
- end
109
-
110
- it "creates a SpecDirectory with the given directory path" do
111
- Snapdragon::SpecDirectory.should_receive(:new).with('some/path/to/some_directory').and_return(stub(:spec_files => []))
112
- subject.send(:parse_arguement, 'some/path/to/some_directory')
113
- end
114
-
115
- it "gets all of the SpecFiles recursively identified in the SpecDirectory path" do
116
- spec_dir = mock
117
- Snapdragon::SpecDirectory.stub(:new).and_return(spec_dir)
118
- spec_dir.should_receive(:spec_files).and_return([])
119
- subject.send(:parse_arguement, 'some/path/to/some_directory')
120
- end
121
-
122
- it "appends the SpecFiles to the application Suite" do
123
- spec_dir = stub('spec_dir')
124
- spec_files = stub('spec_files')
125
- suite = mock('suite')
126
- subject.instance_variable_set(:@suite, suite)
127
- Snapdragon::SpecDirectory.stub(:new).and_return(spec_dir)
128
- spec_dir.stub(:spec_files).and_return(spec_files)
129
- suite.should_receive(:add_spec_files).with(spec_files)
130
- subject.send(:parse_arguement, 'some/path/to/some_directory')
131
- end
132
- end
133
- end
134
-
135
- describe "#is_a_file_path_and_line_number?" do
136
- let(:arguements) { stub('arguments') }
137
- subject { Snapdragon::CliApplication.new(arguements) }
138
-
139
- context "when it matches the pattern of a file path and line number" do
140
- it "returns true" do
141
- subject.send(:is_a_file_path_and_line_number?, 'some/path/to/some_spec.js:534').should be_true
142
- end
143
- end
144
-
145
- context "when it does NOT match the pattern of a file path and line number" do
146
- it "returns false" do
147
- subject.send(:is_a_file_path_and_line_number?, 'some/path/to/some_spec.js').should be_false
148
- end
149
- end
150
- end
151
-
152
- describe "#is_a_file_path?" do
153
- let(:arguements) { stub('arguments') }
154
- subject { Snapdragon::CliApplication.new(arguements) }
155
-
156
- context "when it matches the pattern of a file path" do
157
- it "returns true" do
158
- subject.send(:is_a_file_path?, 'some/path/to/some_spec.js').should be_true
159
- end
160
- end
161
-
162
- context "when it does NOT match the pattern of a file path" do
163
- it "returns false" do
164
- subject.send(:is_a_file_path?, 'some/path/to/some.js').should be_false
165
- end
166
- end
167
- end
168
-
169
- describe "#is_a_directory?" do
170
- let(:arguements) { stub('arguments') }
171
- subject { Snapdragon::CliApplication.new(arguements) }
172
-
173
- context "when it matches the pattern of a directory path" do
174
- it "returns true" do
175
- subject.send(:is_a_directory?, 'some/path/to/some_directory').should be_true
176
- end
177
- end
178
-
179
- context "when it does NOT match the pattern of a directory path" do
180
- it "returns false" do
181
- subject.send(:is_a_directory?, 'some/path/to/some_spec.js').should be_false
182
- end
183
- end
184
- end
185
-
186
- describe "#run_suite" do
187
25
  let(:arguements) { stub('arguments') }
188
26
  subject { Snapdragon::CliApplication.new(arguements) }
189
27
 
190
28
  it "creates a capybara session" do
29
+ suite = stub(filtered?: false)
30
+ Snapdragon::Suite.stub(:new).and_return(suite)
191
31
  Capybara::Session.should_receive(:new).and_return(stub.as_null_object)
192
- subject.send(:run_suite)
32
+ subject.run
193
33
  end
194
34
 
195
35
  context "when suite is filtered" do
@@ -198,10 +38,10 @@ describe Snapdragon::CliApplication do
198
38
  end
199
39
 
200
40
  it "visits /run with the spec query param in the capybara session" do
201
- session = mock
41
+ session = mock(find: nil)
202
42
  Capybara::Session.stub(:new).and_return(session)
203
43
  session.should_receive(:visit).with("/run?spec=some_query_param_spec_filter")
204
- subject.send(:run_suite)
44
+ subject.run
205
45
  end
206
46
  end
207
47
 
@@ -211,10 +51,10 @@ describe Snapdragon::CliApplication do
211
51
  end
212
52
 
213
53
  it "visits /run in that capybara session" do
214
- session = mock
54
+ session = mock(find: nil)
215
55
  Capybara::Session.stub(:new).and_return(session)
216
56
  session.should_receive(:visit).with('/run')
217
- subject.send(:run_suite)
57
+ subject.run
218
58
  end
219
59
  end
220
60
  end
@@ -0,0 +1,100 @@
1
+ require_relative '../../../lib/snapdragon/path'
2
+
3
+ describe Snapdragon::Path do
4
+ describe "#initialize" do
5
+ it "stores the raw path in an instance variable" do
6
+ path = Snapdragon::Path.new('some/path:423')
7
+ path.instance_variable_get(:@raw_path).should eq('some/path:423')
8
+ end
9
+
10
+ context "when given a path and line number" do
11
+ it "stores the path in an instance variable" do
12
+ path = Snapdragon::Path.new('some/path:423')
13
+ path.instance_variable_get(:@path).should eq('some/path')
14
+ end
15
+
16
+ it "stores the line number in an instance variable" do
17
+ path = Snapdragon::Path.new('some/path:423')
18
+ path.instance_variable_get(:@line_number).should eq(423)
19
+ end
20
+ end
21
+
22
+ context "when given a path" do
23
+ it "stores teh path in an instance variable" do
24
+ path = Snapdragon::Path.new('some/path')
25
+ path.instance_variable_get(:@path).should eq('some/path')
26
+ end
27
+ end
28
+ end
29
+
30
+ describe "#spec_files" do
31
+ let(:path) { Snapdragon::Path.new('some/path') }
32
+
33
+ context "when does NOT exist" do
34
+ before do
35
+ path.stub(:exists?).and_return(false)
36
+ end
37
+
38
+ it "returns an empty array" do
39
+ path.spec_files.should eq([])
40
+ end
41
+ end
42
+
43
+ context "when does exist" do
44
+ before do
45
+ path.stub(:exists?).and_return(true)
46
+ end
47
+
48
+ context "when is a directory" do
49
+ before do
50
+ path.stub(:is_a_directory?).and_return(true)
51
+ end
52
+
53
+ it "constructs a spec directory" do
54
+ Snapdragon::SpecDirectory.should_receive(:new).and_return(stub.as_null_object)
55
+ path.spec_files
56
+ end
57
+
58
+ it "returns the spec files recursively found in the spec directory" do
59
+ spec_files = stub
60
+ spec_dir = stub(spec_files: spec_files)
61
+ Snapdragon::SpecDirectory.should_receive(:new).and_return(spec_dir)
62
+ path.spec_files.should eq(spec_files)
63
+ end
64
+ end
65
+
66
+ context "when is NOT a directory" do
67
+ before do
68
+ path.stub(:is_a_directory?).and_return(false)
69
+ end
70
+
71
+ it "constructs a spec file" do
72
+ Snapdragon::SpecFile.should_receive(:new)
73
+ path.spec_files
74
+ end
75
+
76
+ it "returns an array containing a newly constructed spec file" do
77
+ spec_file = stub
78
+ Snapdragon::SpecFile.stub(:new).and_return(spec_file)
79
+ path.spec_files.should eq([spec_file])
80
+ end
81
+ end
82
+ end
83
+ end
84
+
85
+ describe "#has_line_number?" do
86
+ context "when the given raw path has a line number" do
87
+ it "returns true" do
88
+ path = Snapdragon::Path.new('some/path:234')
89
+ path.has_line_number?.should be_true
90
+ end
91
+ end
92
+
93
+ context "when the given raw path does NOT have a line number" do
94
+ it "returns false" do
95
+ path = Snapdragon::Path.new('some/path')
96
+ path.has_line_number?.should be_false
97
+ end
98
+ end
99
+ end
100
+ end
@@ -6,16 +6,6 @@ describe Snapdragon::SpecFile do
6
6
  spec_file = Snapdragon::SpecFile.new('some/path/to_some_spec.js')
7
7
  spec_file.instance_variable_get(:@path).should eq('some/path/to_some_spec.js')
8
8
  end
9
-
10
- it "assigns the given line number" do
11
- spec_file = Snapdragon::SpecFile.new('some/path/to_some_spec.js', 54)
12
- spec_file.instance_variable_get(:@line_number).should eq(54)
13
- end
14
-
15
- it "line number defaults to nil when not assigned" do
16
- spec_file = Snapdragon::SpecFile.new('some/path/to_some_spec.js')
17
- spec_file.instance_variable_get(:@line_number).should eq(nil)
18
- end
19
9
  end
20
10
 
21
11
  describe "#read" do
@@ -2,110 +2,40 @@ require_relative '../../../lib/snapdragon/suite'
2
2
 
3
3
  describe Snapdragon::Suite do
4
4
  describe "#initialize" do
5
- it "assigns an empty array to hold all the spec files" do
6
- suite = Snapdragon::Suite.new
7
- suite.instance_variable_get(:@specs).should eq([])
5
+ it "constucts an instance of a Suite given an array of paths" do
6
+ paths = [stub, stub, stub]
7
+ Snapdragon::Suite.new(paths)
8
8
  end
9
9
 
10
- it "assigns an empty set to hold all the require files" do
11
- suite = Snapdragon::Suite.new
12
- suite.instance_variable_get(:@require_paths).should be_kind_of(Set)
13
- end
14
-
15
- it "assigns @filtered to an initial state of false" do
16
- suite = Snapdragon::Suite.new
17
- suite.instance_variable_get(:@filtered).should be_false
18
- end
19
-
20
- it "assigns @spec_query_param to an initial state of empty string" do
21
- suite = Snapdragon::Suite.new
22
- suite.instance_variable_get(:@spec_query_param).should eq('')
23
- end
24
- end
25
-
26
- describe "#spec_files" do
27
- it "returns the array of specs which the suite contains" do
28
- spec_file = stub(:require_paths => [])
29
- subject.instance_variable_set(:@specs, [spec_file])
30
- subject.spec_files.should eq([spec_file])
31
- end
32
- end
33
-
34
- describe "#add_spec_file" do
35
- it "appends the given SpecFile to the suite of specs" do
36
- spec_file = stub(:require_paths => [], :filtered? => false)
37
- specs = mock
38
- subject.instance_variable_set(:@specs, specs)
39
- specs.should_receive(:<<).with(spec_file)
40
- subject.add_spec_file(spec_file)
41
- end
42
-
43
- it "gets the require paths outlined in the spec" do
44
- spec_file = mock(:filtered? => false)
45
- spec_file.should_receive(:require_paths).and_return([])
46
- subject.add_spec_file(spec_file)
47
- end
48
-
49
- it "contactinates the specs require paths to the suites require paths collection" do
50
- spec_file = stub(:filtered? => false)
51
- require_paths = stub
52
- suite_require_paths = mock
53
- subject.instance_variable_set(:@require_paths, suite_require_paths)
54
- spec_file.stub(:require_paths).and_return(require_paths)
55
- suite_require_paths.should_receive(:merge).with(require_paths)
56
- subject.add_spec_file(spec_file)
57
- end
58
-
59
- context "when spec is filtered" do
60
- it "assigns @filtered to true" do
61
- spec_file = stub(:require_paths => [], :filtered? => true, :spec_query_param => '')
62
- subject.add_spec_file(spec_file)
63
- subject.instance_variable_get(:@filtered).should be_true
64
- end
65
-
66
- it "assigns @spec_query_parm to the spec_files spec_query_parma" do
67
- spec_file = stub(:require_paths => [], :filtered? => true, :spec_query_param => 'some_spec_query_param')
68
- subject.add_spec_file(spec_file)
69
- subject.instance_variable_get(:@spec_query_param).should eq('some_spec_query_param')
70
- end
71
- end
72
- end
73
-
74
- describe "#add_spec_files" do
75
- it "adds each of the spec files" do
76
- spec_file_one = stub('spec_file_one')
77
- spec_file_two = stub('spec_file_two')
78
- subject.should_receive(:add_spec_file).with(spec_file_one)
79
- subject.should_receive(:add_spec_file).with(spec_file_two)
80
- subject.add_spec_files([spec_file_one, spec_file_two])
10
+ it "stores the paths in an instance variable" do
11
+ paths = [stub, stub, stub]
12
+ suite = Snapdragon::Suite.new(paths)
13
+ suite.instance_variable_get(:@paths).should eq(paths)
81
14
  end
82
15
  end
83
16
 
84
17
  describe "#spec_files" do
85
- it "returns the internal collection of spec files" do
86
- specs = stub
87
- subject.instance_variable_set(:@specs, specs)
88
- subject.spec_files.should eq(specs)
18
+ it "creates a path object to represent the path" do
19
+ paths = ['path_a_str', 'path_b_str']
20
+ suite = Snapdragon::Suite.new(paths)
21
+ Snapdragon::Path.should_receive(:new).with('path_a_str').and_return(stub(spec_files: []))
22
+ Snapdragon::Path.should_receive(:new).with('path_b_str').and_return(stub(spec_files: []))
23
+ suite.spec_files
89
24
  end
90
- end
91
-
92
- describe "#output_spec_dependencies" do
93
- it "needs to be tested"
94
- end
95
25
 
96
- describe "#spec_query_param" do
97
- it "returns the suites spec_query_param" do
98
- spec_query_param = stub
99
- subject.instance_variable_set(:@spec_query_param, spec_query_param)
100
- subject.spec_query_param.should eq(spec_query_param)
26
+ it "returns the collection of the spec files of all of the paths" do
27
+ paths = ['path_a_str', 'path_b_str']
28
+ suite = Snapdragon::Suite.new(paths)
29
+ spec_file_a = stub('spec_file_a'), spec_file_b = stub('spec_file_b')
30
+ Snapdragon::Path.stub(:new).with('path_a_str').and_return(stub(spec_files: [spec_file_a]))
31
+ Snapdragon::Path.stub(:new).with('path_b_str').and_return(stub(spec_files: [spec_file_b]))
32
+ suite.spec_files.should eq([spec_file_a, spec_file_b])
101
33
  end
102
34
  end
103
35
 
104
- describe "#filtered?" do
105
- it "returns the filtered state of the suite" do
106
- filtered = stub
107
- subject.instance_variable_set(:@filtered, filtered)
108
- subject.filtered?.should eq(filtered)
36
+ describe "#require_paths" do
37
+ it "returns the merged set of the require paths of each spec file" do
38
+ pending
109
39
  end
110
40
  end
111
41
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snapdragon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew De Ponte
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-19 00:00:00.000000000 Z
11
+ date: 2013-06-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capybara
@@ -131,12 +131,14 @@ files:
131
131
  - bin/build_jspec_filter.rb
132
132
  - bin/snapdragon
133
133
  - bin/snapdragon_server
134
+ - example/spec/bar_spec.js
134
135
  - example/spec/hoopty_spec.js
135
136
  - example/src/hoopty.js
136
137
  - lib/snapdragon.rb
137
138
  - lib/snapdragon/cli_application.rb
139
+ - lib/snapdragon/path.rb
138
140
  - lib/snapdragon/resources/.gitkeep
139
- - lib/snapdragon/resources/ConsoleReporter.js
141
+ - lib/snapdragon/resources/SnapdragonConsoleReporter.js
140
142
  - lib/snapdragon/spec_directory.rb
141
143
  - lib/snapdragon/spec_file.rb
142
144
  - lib/snapdragon/suite.rb
@@ -146,6 +148,7 @@ files:
146
148
  - lib/snapdragon/web_application.rb
147
149
  - snapdragon.gemspec
148
150
  - spec/lib/snapdragon/cli_application_spec.rb
151
+ - spec/lib/snapdragon/path_spec.rb
149
152
  - spec/lib/snapdragon/spec_directory_spec.rb
150
153
  - spec/lib/snapdragon/spec_file_spec.rb
151
154
  - spec/lib/snapdragon/suite_spec.rb
@@ -186,6 +189,7 @@ specification_version: 4
186
189
  summary: A command-line Jasmine JavaScript test runner.
187
190
  test_files:
188
191
  - spec/lib/snapdragon/cli_application_spec.rb
192
+ - spec/lib/snapdragon/path_spec.rb
189
193
  - spec/lib/snapdragon/spec_directory_spec.rb
190
194
  - spec/lib/snapdragon/spec_file_spec.rb
191
195
  - spec/lib/snapdragon/suite_spec.rb
@@ -1,163 +0,0 @@
1
- jasmine.ConsoleReporter = function() {
2
- function ConsoleReporter(options) {
3
- var print = function(msg) { console.log(msg); },
4
- showColors = options.showColors || true,
5
- onComplete = options.onComplete || function() {},
6
- specCount,
7
- failureCount,
8
- passedCount,
9
- failedSpecs = [],
10
- pendingSpecs = [],
11
- pendingCount,
12
- startTimestamp,
13
- endTimestamp
14
- ansi = {
15
- green: '\033[32m',
16
- red: '\033[31m',
17
- yellow: '\033[33m',
18
- none: '\033[0m'
19
- };
20
-
21
- this.log = function() {
22
- };
23
-
24
- // "reportRunnerStarting",
25
- this.reportRunnerStarting = function() {
26
- startTimestamp = new Date().getTime();
27
- specCount = 0;
28
- failureCount = 0;
29
- passedCount = 0;
30
- pendingCount = 0;
31
- print("Running examples...");
32
- printNewline();
33
- };
34
-
35
- // "reportSuiteResults",
36
- this.reportSuitResults = function() {
37
- };
38
-
39
- // "reportSpecStarting",
40
- this.reportSpecStarting = function() {
41
- };
42
-
43
- // "reportRunnerResults",
44
- this.reportRunnerResults = function(options) {
45
- endTimestamp = new Date().getTime();
46
-
47
- // I have commented out the pending section below because v1.3.1 of
48
- // jasmine doesn't have a concept of pending. It has a concept of
49
- // skipped when you filter tests using the spec query param.
50
-
51
- // if (pendingCount > 0) {
52
- // print("Pending:");
53
- // }
54
-
55
- // for (var i = 0; i < pendingSpecs.length; i++) {
56
- // specPendingDetails(pendingSpecs[i]);
57
- // }
58
-
59
- if (failureCount > 0) {
60
- print("Failures:");
61
- printNewline();
62
- }
63
-
64
- for (var i = 0; i < failedSpecs.length; i++) {
65
- specFailureDetails(failedSpecs[i], i + 1);
66
- }
67
-
68
- var specCounts = specCount + " " + plural("example", specCount) + ", " + failureCount + " " + plural("failure", failureCount);
69
-
70
- if (pendingCount) {
71
- specCounts += ", " + pendingCount + " skipped";
72
- }
73
-
74
- var seconds = (endTimestamp - startTimestamp) / 1000.0;
75
- print("Finished in " + seconds + " " + plural("second", seconds));
76
-
77
- if (failureCount > 0) { // have any failures
78
- print(colored("red", specCounts));
79
- // } else if (pendingCount > 0) {
80
- // print(colored("yellow", specCounts));
81
- } else {
82
- print(colored("green", specCounts));
83
- }
84
-
85
- onComplete();
86
- signalCapybaraTestsFinishedRunning();
87
- };
88
-
89
- // "reportSpecResults",
90
- this.reportSpecResults = function(spec) {
91
- var results = spec.results();
92
-
93
- if (!results.skipped) { // not pending
94
- specCount++;
95
- }
96
-
97
- if (results.skipped) { // when you filter out tests with spec query param
98
- pendingCount++;
99
- pendingSpecs.push(spec);
100
- } else if (results.passed()) { // passed
101
- passedCount++;
102
- } else { // failed
103
- failureCount++;
104
- failedSpecs.push(spec);
105
- }
106
- };
107
-
108
- return this;
109
-
110
- function printNewline() {
111
- print("");
112
- }
113
-
114
- function colored(color, str) {
115
- return showColors ? (ansi[color] + str + ansi.none) : str;
116
- }
117
-
118
- function plural(str, count) {
119
- return count == 1 ? str : str + "s";
120
- }
121
-
122
- function repeat(thing, times) {
123
- var arr = [];
124
- for (var i = 0; i < times; i++) {
125
- arr.push(thing);
126
- }
127
- return arr;
128
- }
129
-
130
- function indent(str, spaces) {
131
- var lines = (str || '').split("\n");
132
- var newArr = [];
133
- for (var i = 0; i < lines.length; i++) {
134
- newArr.push(repeat(" ", spaces).join("") + lines[i]);
135
- }
136
- return newArr.join("\n");
137
- }
138
-
139
- function specFailureDetails(spec, failure_number) {
140
- var results = spec.results();
141
- print(indent(failure_number + ") " + spec.getFullName(), 2));
142
-
143
- for (var i = 0; i < results.items_.length; i++) {
144
- var failedExpectation = results.items_[i];
145
- print(indent(colored("red", failedExpectation.message), 6));
146
- }
147
- printNewline();
148
- }
149
-
150
- function specPendingDetails(spec) {
151
- print(indent(colored("yellow", spec.getFullName()), 2));
152
- printNewline();
153
- }
154
-
155
- function signalCapybaraTestsFinishedRunning() {
156
- var div = document.createElement('div');
157
- div.id = 'testscomplete';
158
- document.body.appendChild(div);
159
- }
160
- }
161
-
162
- return ConsoleReporter;
163
- };