snapdragon 0.1.5 → 0.1.6

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
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
- };