mobile_template 0.0.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.
Files changed (211) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +22 -0
  4. data/README.md +28 -0
  5. data/Rakefile +3 -0
  6. data/bin/mobile_template +71 -0
  7. data/lib/mobile_template/version.rb +4 -0
  8. data/lib/mobile_template.rb +5 -0
  9. data/mobile_template.gemspec +21 -0
  10. data/templates/assets/Gemfile +4 -0
  11. data/templates/assets/config.rb +96 -0
  12. data/templates/assets/config.ru +4 -0
  13. data/templates/assets/source/images/vendor/ajax-loader.gif +0 -0
  14. data/templates/assets/source/images/vendor/ajax-loader.png +0 -0
  15. data/templates/assets/source/images/vendor/icons-18-black.png +0 -0
  16. data/templates/assets/source/images/vendor/icons-18-white.png +0 -0
  17. data/templates/assets/source/images/vendor/icons-36-black.png +0 -0
  18. data/templates/assets/source/images/vendor/icons-36-white.png +0 -0
  19. data/templates/assets/source/index.html.erb +2 -0
  20. data/templates/assets/source/javascripts/app/index.js.coffee +2 -0
  21. data/templates/assets/source/javascripts/application.js.coffee +5 -0
  22. data/templates/assets/source/javascripts/vendor/cordova.js +4841 -0
  23. data/templates/assets/source/javascripts/vendor/jquery.js +9267 -0
  24. data/templates/assets/source/javascripts/vendor/jquery.mobile.js +7410 -0
  25. data/templates/assets/source/layout.erb +24 -0
  26. data/templates/assets/source/stylesheets/application.css.scss +2 -0
  27. data/templates/assets/source/stylesheets/vendor/jquery.mobile.css.scss +1872 -0
  28. data/templates/cordova_android/.gitignore +18 -0
  29. data/templates/cordova_android/LICENSE +202 -0
  30. data/templates/cordova_android/NOTICE +5 -0
  31. data/templates/cordova_android/README.md +95 -0
  32. data/templates/cordova_android/VERSION +1 -0
  33. data/templates/cordova_android/bin/BOOM +4 -0
  34. data/templates/cordova_android/bin/autotest +2 -0
  35. data/templates/cordova_android/bin/bench +29 -0
  36. data/templates/cordova_android/bin/create +46 -0
  37. data/templates/cordova_android/bin/create.bat +1 -0
  38. data/templates/cordova_android/bin/create.js +88 -0
  39. data/templates/cordova_android/bin/create.xml +79 -0
  40. data/templates/cordova_android/bin/node_modules/.bin/cake +7 -0
  41. data/templates/cordova_android/bin/node_modules/.bin/coffee +7 -0
  42. data/templates/cordova_android/bin/node_modules/.bin/nodeunit +120 -0
  43. data/templates/cordova_android/bin/node_modules/coffee-script/.npmignore +11 -0
  44. data/templates/cordova_android/bin/node_modules/coffee-script/LICENSE +22 -0
  45. data/templates/cordova_android/bin/node_modules/coffee-script/README +48 -0
  46. data/templates/cordova_android/bin/node_modules/coffee-script/Rakefile +78 -0
  47. data/templates/cordova_android/bin/node_modules/coffee-script/bin/cake +7 -0
  48. data/templates/cordova_android/bin/node_modules/coffee-script/bin/coffee +7 -0
  49. data/templates/cordova_android/bin/node_modules/coffee-script/extras/jsl.conf +44 -0
  50. data/templates/cordova_android/bin/node_modules/coffee-script/lib/browser.js +75 -0
  51. data/templates/cordova_android/bin/node_modules/coffee-script/lib/cake.js +76 -0
  52. data/templates/cordova_android/bin/node_modules/coffee-script/lib/coffee-script.js +135 -0
  53. data/templates/cordova_android/bin/node_modules/coffee-script/lib/command.js +301 -0
  54. data/templates/cordova_android/bin/node_modules/coffee-script/lib/grammar.js +591 -0
  55. data/templates/cordova_android/bin/node_modules/coffee-script/lib/helpers.js +66 -0
  56. data/templates/cordova_android/bin/node_modules/coffee-script/lib/index.js +8 -0
  57. data/templates/cordova_android/bin/node_modules/coffee-script/lib/lexer.js +656 -0
  58. data/templates/cordova_android/bin/node_modules/coffee-script/lib/nodes.js +2289 -0
  59. data/templates/cordova_android/bin/node_modules/coffee-script/lib/optparse.js +111 -0
  60. data/templates/cordova_android/bin/node_modules/coffee-script/lib/parser.js +676 -0
  61. data/templates/cordova_android/bin/node_modules/coffee-script/lib/repl.js +123 -0
  62. data/templates/cordova_android/bin/node_modules/coffee-script/lib/rewriter.js +363 -0
  63. data/templates/cordova_android/bin/node_modules/coffee-script/lib/scope.js +120 -0
  64. data/templates/cordova_android/bin/node_modules/coffee-script/package.json +27 -0
  65. data/templates/cordova_android/bin/node_modules/nodeunit/.gitignore +5 -0
  66. data/templates/cordova_android/bin/node_modules/nodeunit/.npmignore +3 -0
  67. data/templates/cordova_android/bin/node_modules/nodeunit/CONTRIBUTORS.md +60 -0
  68. data/templates/cordova_android/bin/node_modules/nodeunit/LICENSE +19 -0
  69. data/templates/cordova_android/bin/node_modules/nodeunit/Makefile +126 -0
  70. data/templates/cordova_android/bin/node_modules/nodeunit/README.md +432 -0
  71. data/templates/cordova_android/bin/node_modules/nodeunit/bin/nodeunit +120 -0
  72. data/templates/cordova_android/bin/node_modules/nodeunit/bin/nodeunit.json +10 -0
  73. data/templates/cordova_android/bin/node_modules/nodeunit/deps/async.js +623 -0
  74. data/templates/cordova_android/bin/node_modules/nodeunit/deps/console.log.js +55 -0
  75. data/templates/cordova_android/bin/node_modules/nodeunit/deps/ejs.js +125 -0
  76. data/templates/cordova_android/bin/node_modules/nodeunit/deps/json2.js +483 -0
  77. data/templates/cordova_android/bin/node_modules/nodeunit/examples/browser/nodeunit.js +1757 -0
  78. data/templates/cordova_android/bin/node_modules/nodeunit/examples/browser/suite1.js +12 -0
  79. data/templates/cordova_android/bin/node_modules/nodeunit/examples/browser/suite2.js +13 -0
  80. data/templates/cordova_android/bin/node_modules/nodeunit/examples/browser/test.html +16 -0
  81. data/templates/cordova_android/bin/node_modules/nodeunit/img/example_fail.png +0 -0
  82. data/templates/cordova_android/bin/node_modules/nodeunit/img/example_pass.png +0 -0
  83. data/templates/cordova_android/bin/node_modules/nodeunit/index.js +3 -0
  84. data/templates/cordova_android/bin/node_modules/nodeunit/lib/assert.js +316 -0
  85. data/templates/cordova_android/bin/node_modules/nodeunit/lib/core.js +260 -0
  86. data/templates/cordova_android/bin/node_modules/nodeunit/lib/nodeunit.js +82 -0
  87. data/templates/cordova_android/bin/node_modules/nodeunit/lib/reporters/browser.js +119 -0
  88. data/templates/cordova_android/bin/node_modules/nodeunit/lib/reporters/default.js +123 -0
  89. data/templates/cordova_android/bin/node_modules/nodeunit/lib/reporters/html.js +107 -0
  90. data/templates/cordova_android/bin/node_modules/nodeunit/lib/reporters/index.js +9 -0
  91. data/templates/cordova_android/bin/node_modules/nodeunit/lib/reporters/junit.js +183 -0
  92. data/templates/cordova_android/bin/node_modules/nodeunit/lib/reporters/minimal.js +112 -0
  93. data/templates/cordova_android/bin/node_modules/nodeunit/lib/reporters/skip_passed.js +105 -0
  94. data/templates/cordova_android/bin/node_modules/nodeunit/lib/track.js +48 -0
  95. data/templates/cordova_android/bin/node_modules/nodeunit/lib/types.js +187 -0
  96. data/templates/cordova_android/bin/node_modules/nodeunit/lib/utils.js +209 -0
  97. data/templates/cordova_android/bin/node_modules/nodeunit/man1/nodeunit.1 +95 -0
  98. data/templates/cordova_android/bin/node_modules/nodeunit/nodelint.cfg +4 -0
  99. data/templates/cordova_android/bin/node_modules/nodeunit/package.json +56 -0
  100. data/templates/cordova_android/bin/node_modules/nodeunit/share/junit.xml.ejs +19 -0
  101. data/templates/cordova_android/bin/node_modules/nodeunit/share/license.js +11 -0
  102. data/templates/cordova_android/bin/node_modules/nodeunit/share/nodeunit.css +70 -0
  103. data/templates/cordova_android/bin/templates/project/.cordova/android/readme.md +1 -0
  104. data/templates/cordova_android/bin/templates/project/.cordova/readme.md +3 -0
  105. data/templates/cordova_android/bin/templates/project/cordova/create +36 -0
  106. data/templates/cordova_android/bin/templates/project/cordova/debug +9 -0
  107. data/templates/cordova_android/bin/templates/project/cordova/emulate +12 -0
  108. data/templates/cordova_android/bin/templates/project/cordova/log +3 -0
  109. data/templates/cordova_android/bin/templates/project/cordova/templates/Activity.java +16 -0
  110. data/templates/cordova_android/bin/templates/project/cordova/templates/project/AndroidManifest.xml +50 -0
  111. data/templates/cordova_android/bin/templates/project/cordova/templates/project/assets/www/index.html +42 -0
  112. data/templates/cordova_android/bin/templates/project/cordova/templates/project/assets/www/main.js +146 -0
  113. data/templates/cordova_android/bin/templates/project/cordova/templates/project/assets/www/master.css +96 -0
  114. data/templates/cordova_android/bin/templates/project/cordova/templates/project/res/drawable/icon.png +0 -0
  115. data/templates/cordova_android/bin/templates/project/cordova/templates/project/res/xml/cordova.xml +5 -0
  116. data/templates/cordova_android/bin/templates/project/cordova/templates/project/res/xml/plugins.xml +19 -0
  117. data/templates/cordova_android/bin/test +26 -0
  118. data/templates/cordova_android/bin/tests/autotest.coffee +4 -0
  119. data/templates/cordova_android/bin/tests/create.coffee +21 -0
  120. data/templates/cordova_android/bin/tests/debug.coffee +0 -0
  121. data/templates/cordova_android/bin/tests/test.coffee +0 -0
  122. data/templates/cordova_android/framework/.classpath +8 -0
  123. data/templates/cordova_android/framework/.project +33 -0
  124. data/templates/cordova_android/framework/AndroidManifest.xml +68 -0
  125. data/templates/cordova_android/framework/ant.properties +34 -0
  126. data/templates/cordova_android/framework/assets/js/accelerometer.js +137 -0
  127. data/templates/cordova_android/framework/assets/js/app.js +89 -0
  128. data/templates/cordova_android/framework/assets/js/battery.js +134 -0
  129. data/templates/cordova_android/framework/assets/js/camera.js +168 -0
  130. data/templates/cordova_android/framework/assets/js/capture.js +203 -0
  131. data/templates/cordova_android/framework/assets/js/compass.js +168 -0
  132. data/templates/cordova_android/framework/assets/js/contact.js +310 -0
  133. data/templates/cordova_android/framework/assets/js/cordova.android.js +4841 -0
  134. data/templates/cordova_android/framework/assets/js/cordova.js.base +924 -0
  135. data/templates/cordova_android/framework/assets/js/crypto.js +54 -0
  136. data/templates/cordova_android/framework/assets/js/device.js +83 -0
  137. data/templates/cordova_android/framework/assets/js/file.js +1082 -0
  138. data/templates/cordova_android/framework/assets/js/filetransfer.js +125 -0
  139. data/templates/cordova_android/framework/assets/js/geolocation.js +209 -0
  140. data/templates/cordova_android/framework/assets/js/header.txt +19 -0
  141. data/templates/cordova_android/framework/assets/js/media.js +233 -0
  142. data/templates/cordova_android/framework/assets/js/network.js +100 -0
  143. data/templates/cordova_android/framework/assets/js/notification.js +133 -0
  144. data/templates/cordova_android/framework/assets/js/position.js +100 -0
  145. data/templates/cordova_android/framework/assets/js/storage.js +439 -0
  146. data/templates/cordova_android/framework/assets/www/index.html +27 -0
  147. data/templates/cordova_android/framework/build.xml +216 -0
  148. data/templates/cordova_android/framework/libs/commons-codec-1.3.jar +0 -0
  149. data/templates/cordova_android/framework/proguard-project.txt +20 -0
  150. data/templates/cordova_android/framework/project.properties +14 -0
  151. data/templates/cordova_android/framework/res/drawable/icon.png +0 -0
  152. data/templates/cordova_android/framework/res/drawable/splash.png +0 -0
  153. data/templates/cordova_android/framework/res/layout/main.xml +29 -0
  154. data/templates/cordova_android/framework/res/values/strings.xml +23 -0
  155. data/templates/cordova_android/framework/res/xml/cordova.xml +37 -0
  156. data/templates/cordova_android/framework/res/xml/plugins.xml +37 -0
  157. data/templates/cordova_android/framework/src/com/phonegap/api/IPlugin.java +27 -0
  158. data/templates/cordova_android/framework/src/com/phonegap/api/LOG.java +28 -0
  159. data/templates/cordova_android/framework/src/com/phonegap/api/PhonegapActivity.java +28 -0
  160. data/templates/cordova_android/framework/src/com/phonegap/api/Plugin.java +27 -0
  161. data/templates/cordova_android/framework/src/com/phonegap/api/PluginManager.java +35 -0
  162. data/templates/cordova_android/framework/src/com/phonegap/api/PluginResult.java +53 -0
  163. data/templates/cordova_android/framework/src/org/apache/cordova/AccelListener.java +311 -0
  164. data/templates/cordova_android/framework/src/org/apache/cordova/App.java +198 -0
  165. data/templates/cordova_android/framework/src/org/apache/cordova/AudioHandler.java +364 -0
  166. data/templates/cordova_android/framework/src/org/apache/cordova/AudioPlayer.java +450 -0
  167. data/templates/cordova_android/framework/src/org/apache/cordova/AuthenticationToken.java +69 -0
  168. data/templates/cordova_android/framework/src/org/apache/cordova/BatteryListener.java +156 -0
  169. data/templates/cordova_android/framework/src/org/apache/cordova/CallbackServer.java +431 -0
  170. data/templates/cordova_android/framework/src/org/apache/cordova/CameraLauncher.java +500 -0
  171. data/templates/cordova_android/framework/src/org/apache/cordova/Capture.java +400 -0
  172. data/templates/cordova_android/framework/src/org/apache/cordova/CompassListener.java +308 -0
  173. data/templates/cordova_android/framework/src/org/apache/cordova/ContactAccessor.java +198 -0
  174. data/templates/cordova_android/framework/src/org/apache/cordova/ContactAccessorSdk5.java +1934 -0
  175. data/templates/cordova_android/framework/src/org/apache/cordova/ContactManager.java +113 -0
  176. data/templates/cordova_android/framework/src/org/apache/cordova/CordovaChromeClient.java +314 -0
  177. data/templates/cordova_android/framework/src/org/apache/cordova/CordovaWebViewClient.java +306 -0
  178. data/templates/cordova_android/framework/src/org/apache/cordova/Device.java +219 -0
  179. data/templates/cordova_android/framework/src/org/apache/cordova/DirectoryManager.java +161 -0
  180. data/templates/cordova_android/framework/src/org/apache/cordova/DroidGap.java +1417 -0
  181. data/templates/cordova_android/framework/src/org/apache/cordova/ExifHelper.java +165 -0
  182. data/templates/cordova_android/framework/src/org/apache/cordova/FileTransfer.java +458 -0
  183. data/templates/cordova_android/framework/src/org/apache/cordova/FileUploadResult.java +63 -0
  184. data/templates/cordova_android/framework/src/org/apache/cordova/FileUtils.java +1048 -0
  185. data/templates/cordova_android/framework/src/org/apache/cordova/GeoBroker.java +165 -0
  186. data/templates/cordova_android/framework/src/org/apache/cordova/GeoListener.java +133 -0
  187. data/templates/cordova_android/framework/src/org/apache/cordova/GpsListener.java +163 -0
  188. data/templates/cordova_android/framework/src/org/apache/cordova/HttpHandler.java +80 -0
  189. data/templates/cordova_android/framework/src/org/apache/cordova/LinearLayoutSoftKeyboardDetect.java +104 -0
  190. data/templates/cordova_android/framework/src/org/apache/cordova/NetworkListener.java +153 -0
  191. data/templates/cordova_android/framework/src/org/apache/cordova/NetworkManager.java +248 -0
  192. data/templates/cordova_android/framework/src/org/apache/cordova/Notification.java +366 -0
  193. data/templates/cordova_android/framework/src/org/apache/cordova/PreferenceNode.java +34 -0
  194. data/templates/cordova_android/framework/src/org/apache/cordova/PreferenceSet.java +62 -0
  195. data/templates/cordova_android/framework/src/org/apache/cordova/StandAlone.java +35 -0
  196. data/templates/cordova_android/framework/src/org/apache/cordova/Storage.java +239 -0
  197. data/templates/cordova_android/framework/src/org/apache/cordova/TempListener.java +112 -0
  198. data/templates/cordova_android/framework/src/org/apache/cordova/api/CordovaInterface.java +145 -0
  199. data/templates/cordova_android/framework/src/org/apache/cordova/api/IPlugin.java +116 -0
  200. data/templates/cordova_android/framework/src/org/apache/cordova/api/LOG.java +234 -0
  201. data/templates/cordova_android/framework/src/org/apache/cordova/api/Plugin.java +210 -0
  202. data/templates/cordova_android/framework/src/org/apache/cordova/api/PluginManager.java +359 -0
  203. data/templates/cordova_android/framework/src/org/apache/cordova/api/PluginResult.java +119 -0
  204. data/templates/cordova_android/framework/src/org/apache/cordova/file/EncodingException.java +28 -0
  205. data/templates/cordova_android/framework/src/org/apache/cordova/file/FileExistsException.java +28 -0
  206. data/templates/cordova_android/framework/src/org/apache/cordova/file/InvalidModificationException.java +29 -0
  207. data/templates/cordova_android/framework/src/org/apache/cordova/file/NoModificationAllowedException.java +28 -0
  208. data/templates/cordova_android/framework/src/org/apache/cordova/file/TypeMismatchException.java +29 -0
  209. data/templates/cordova_android/framework/test/org/apache/cordova/PreferenceNodeTest.java +53 -0
  210. data/templates/cordova_android/framework/test/org/apache/cordova/PreferenceSetTest.java +73 -0
  211. metadata +279 -0
@@ -0,0 +1,112 @@
1
+ /*!
2
+ * Nodeunit
3
+ * Copyright (c) 2010 Caolan McMahon
4
+ * MIT Licensed
5
+ */
6
+
7
+ /**
8
+ * Module dependencies
9
+ */
10
+
11
+ var nodeunit = require('../nodeunit'),
12
+ utils = require('../utils'),
13
+ fs = require('fs'),
14
+ path = require('path'),
15
+ AssertionError = require('assert').AssertionError;
16
+
17
+ /**
18
+ * Reporter info string
19
+ */
20
+
21
+ exports.info = "Pretty minimal output";
22
+
23
+ /**
24
+ * Run all tests within each module, reporting the results to the command-line.
25
+ *
26
+ * @param {Array} files
27
+ * @api public
28
+ */
29
+
30
+ exports.run = function (files, options) {
31
+
32
+ if (!options) {
33
+ // load default options
34
+ var content = fs.readFileSync(
35
+ __dirname + '/../../bin/nodeunit.json', 'utf8'
36
+ );
37
+ options = JSON.parse(content);
38
+ }
39
+
40
+ var red = function (str) {
41
+ return options.error_prefix + str + options.error_suffix;
42
+ };
43
+ var green = function (str) {
44
+ return options.ok_prefix + str + options.ok_suffix;
45
+ };
46
+ var magenta = function (str) {
47
+ return options.assertion_prefix + str + options.assertion_suffix;
48
+ };
49
+ var bold = function (str) {
50
+ return options.bold_prefix + str + options.bold_suffix;
51
+ };
52
+
53
+ var start = new Date().getTime();
54
+ var paths = files.map(function (p) {
55
+ return path.join(process.cwd(), p);
56
+ });
57
+
58
+ nodeunit.runFiles(paths, {
59
+ testspec: options.testspec,
60
+ moduleStart: function (name) {
61
+ process.stdout.write(bold(name) + ': ');
62
+ },
63
+ moduleDone: function (name, assertions) {
64
+ console.log('');
65
+ if (assertions.failures()) {
66
+ assertions.forEach(function (a) {
67
+ if (a.failed()) {
68
+ a = utils.betterErrors(a);
69
+ if (a.error instanceof AssertionError && a.message) {
70
+ console.log(
71
+ 'Assertion in test ' + bold(a.testname) + ': ' +
72
+ magenta(a.message)
73
+ );
74
+ }
75
+ console.log(a.error.stack + '\n');
76
+ }
77
+ });
78
+ }
79
+
80
+ },
81
+ testStart: function () {
82
+ },
83
+ testDone: function (name, assertions) {
84
+ if (!assertions.failures()) {
85
+ process.stdout.write('.');
86
+ }
87
+ else {
88
+ process.stdout.write(red('F'));
89
+ assertions.forEach(function (assertion) {
90
+ assertion.testname = name;
91
+ });
92
+ }
93
+ },
94
+ done: function (assertions) {
95
+ var end = new Date().getTime();
96
+ var duration = end - start;
97
+ if (assertions.failures()) {
98
+ console.log(
99
+ '\n' + bold(red('FAILURES: ')) + assertions.failures() +
100
+ '/' + assertions.length + ' assertions failed (' +
101
+ assertions.duration + 'ms)'
102
+ );
103
+ }
104
+ else {
105
+ console.log(
106
+ '\n' + bold(green('OK: ')) + assertions.length +
107
+ ' assertions (' + assertions.duration + 'ms)'
108
+ );
109
+ }
110
+ }
111
+ });
112
+ };
@@ -0,0 +1,105 @@
1
+ /*!
2
+ * Nodeunit
3
+ * Copyright (c) 2010 Caolan McMahon
4
+ * MIT Licensed
5
+ */
6
+
7
+ /**
8
+ * Module dependencies
9
+ */
10
+
11
+ var nodeunit = require('../nodeunit'),
12
+ utils = require('../utils'),
13
+ fs = require('fs'),
14
+ path = require('path'),
15
+ AssertionError = require('assert').AssertionError;
16
+
17
+ /**
18
+ * Reporter info string
19
+ */
20
+
21
+ exports.info = "Skip passed tests output";
22
+
23
+ /**
24
+ * Run all tests within each module, reporting the results to the command-line.
25
+ *
26
+ * @param {Array} files
27
+ * @api public
28
+ */
29
+
30
+ exports.run = function (files, options) {
31
+
32
+ if (!options) {
33
+ // load default options
34
+ var content = fs.readFileSync(
35
+ __dirname + '/../../bin/nodeunit.json', 'utf8'
36
+ );
37
+ options = JSON.parse(content);
38
+ }
39
+
40
+ var error = function (str) {
41
+ return options.error_prefix + str + options.error_suffix;
42
+ };
43
+ var ok = function (str) {
44
+ return options.ok_prefix + str + options.ok_suffix;
45
+ };
46
+ var bold = function (str) {
47
+ return options.bold_prefix + str + options.bold_suffix;
48
+ };
49
+ var assertion_message = function (str) {
50
+ return options.assertion_prefix + str + options.assertion_suffix;
51
+ };
52
+
53
+ var start = new Date().getTime();
54
+ var paths = files.map(function (p) {
55
+ return path.join(process.cwd(), p);
56
+ });
57
+
58
+ nodeunit.runFiles(paths, {
59
+ testspec: options.testspec,
60
+ moduleStart: function (name) {
61
+ console.log('\n' + bold(name));
62
+ },
63
+ testDone: function (name, assertions) {
64
+ if (assertions.failures()) {
65
+ console.log(error('✖ ' + name) + '\n');
66
+ assertions.forEach(function (a) {
67
+ if (a.failed()) {
68
+ a = utils.betterErrors(a);
69
+ if (a.error instanceof AssertionError && a.message) {
70
+ console.log(
71
+ 'Assertion Message: ' + assertion_message(a.message)
72
+ );
73
+ }
74
+ console.log(a.error.stack + '\n');
75
+ }
76
+ });
77
+ }
78
+ },
79
+ moduleDone: function (name, assertions) {
80
+ if (!assertions.failures()) {
81
+ console.log('✔ all tests passed');
82
+ }
83
+ else {
84
+ console.log(error('✖ some tests failed'));
85
+ }
86
+ },
87
+ done: function (assertions) {
88
+ var end = new Date().getTime();
89
+ var duration = end - start;
90
+ if (assertions.failures()) {
91
+ console.log(
92
+ '\n' + bold(error('FAILURES: ')) + assertions.failures() +
93
+ '/' + assertions.length + ' assertions failed (' +
94
+ assertions.duration + 'ms)'
95
+ );
96
+ }
97
+ else {
98
+ console.log(
99
+ '\n' + bold(ok('OK: ')) + assertions.length +
100
+ ' assertions (' + assertions.duration + 'ms)'
101
+ );
102
+ }
103
+ }
104
+ });
105
+ };
@@ -0,0 +1,48 @@
1
+ /*!
2
+ * Simple util module to track tests. Adds a process.exit hook to print
3
+ * the undone tests.
4
+ */
5
+
6
+
7
+ exports.createTracker = function (on_exit) {
8
+ var names = {};
9
+ var tracker = {
10
+ names: function () {
11
+ var arr = [];
12
+ for (var k in names) {
13
+ if (names.hasOwnProperty(k)) {
14
+ arr.push(k);
15
+ }
16
+ }
17
+ return arr;
18
+ },
19
+ unfinished: function () {
20
+ return tracker.names().length;
21
+ },
22
+ put: function (testname) {
23
+ names[testname] = testname;
24
+ },
25
+ remove: function (testname) {
26
+ delete names[testname];
27
+ }
28
+ };
29
+
30
+ process.on('exit', function() {
31
+ on_exit = on_exit || exports.default_on_exit;
32
+ on_exit(tracker);
33
+ });
34
+
35
+ return tracker;
36
+ };
37
+
38
+ exports.default_on_exit = function (tracker) {
39
+ if (tracker.unfinished()) {
40
+ console.log('');
41
+ console.log('Undone tests (or their setups/teardowns): ');
42
+ var names = tracker.names();
43
+ for (var i = 0; i < names.length; i += 1) {
44
+ console.log(names[i]);
45
+ }
46
+ process.reallyExit(tracker.unfinished());
47
+ }
48
+ };
@@ -0,0 +1,187 @@
1
+ /*!
2
+ * Nodeunit
3
+ * Copyright (c) 2010 Caolan McMahon
4
+ * MIT Licensed
5
+ *
6
+ * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS!
7
+ * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build.
8
+ * Only code on that line will be removed, its mostly to avoid requiring code
9
+ * that is node specific
10
+ */
11
+
12
+ /**
13
+ * Module dependencies
14
+ */
15
+
16
+ var assert = require('./assert'), //@REMOVE_LINE_FOR_BROWSER
17
+ async = require('../deps/async'); //@REMOVE_LINE_FOR_BROWSER
18
+
19
+
20
+ /**
21
+ * Creates assertion objects representing the result of an assert call.
22
+ * Accepts an object or AssertionError as its argument.
23
+ *
24
+ * @param {object} obj
25
+ * @api public
26
+ */
27
+
28
+ exports.assertion = function (obj) {
29
+ return {
30
+ method: obj.method || '',
31
+ message: obj.message || (obj.error && obj.error.message) || '',
32
+ error: obj.error,
33
+ passed: function () {
34
+ return !this.error;
35
+ },
36
+ failed: function () {
37
+ return Boolean(this.error);
38
+ }
39
+ };
40
+ };
41
+
42
+ /**
43
+ * Creates an assertion list object representing a group of assertions.
44
+ * Accepts an array of assertion objects.
45
+ *
46
+ * @param {Array} arr
47
+ * @param {Number} duration
48
+ * @api public
49
+ */
50
+
51
+ exports.assertionList = function (arr, duration) {
52
+ var that = arr || [];
53
+ that.failures = function () {
54
+ var failures = 0;
55
+ for (var i=0; i<this.length; i++) {
56
+ if (this[i].failed()) failures++;
57
+ }
58
+ return failures;
59
+ };
60
+ that.passes = function () {
61
+ return that.length - that.failures();
62
+ };
63
+ that.duration = duration || 0;
64
+ return that;
65
+ };
66
+
67
+ /**
68
+ * Create a wrapper function for assert module methods. Executes a callback
69
+ * after the it's complete with an assertion object representing the result.
70
+ *
71
+ * @param {Function} callback
72
+ * @api private
73
+ */
74
+
75
+ var assertWrapper = function (callback) {
76
+ return function (new_method, assert_method, arity) {
77
+ return function () {
78
+ var message = arguments[arity-1];
79
+ var a = exports.assertion({method: new_method, message: message});
80
+ try {
81
+ assert[assert_method].apply(null, arguments);
82
+ }
83
+ catch (e) {
84
+ a.error = e;
85
+ }
86
+ callback(a);
87
+ };
88
+ };
89
+ };
90
+
91
+ /**
92
+ * Creates the 'test' object that gets passed to every test function.
93
+ * Accepts the name of the test function as its first argument, followed by
94
+ * the start time in ms, the options object and a callback function.
95
+ *
96
+ * @param {String} name
97
+ * @param {Number} start
98
+ * @param {Object} options
99
+ * @param {Function} callback
100
+ * @api public
101
+ */
102
+
103
+ exports.test = function (name, start, options, callback) {
104
+ var expecting;
105
+ var a_list = [];
106
+
107
+ var wrapAssert = assertWrapper(function (a) {
108
+ a_list.push(a);
109
+ if (options.log) {
110
+ async.nextTick(function () {
111
+ options.log(a);
112
+ });
113
+ }
114
+ });
115
+
116
+ var test = {
117
+ done: function (err) {
118
+ if (expecting !== undefined && expecting !== a_list.length) {
119
+ var e = new Error(
120
+ 'Expected ' + expecting + ' assertions, ' +
121
+ a_list.length + ' ran'
122
+ );
123
+ var a1 = exports.assertion({method: 'expect', error: e});
124
+ a_list.push(a1);
125
+ if (options.log) {
126
+ async.nextTick(function () {
127
+ options.log(a1);
128
+ });
129
+ }
130
+ }
131
+ if (err) {
132
+ var a2 = exports.assertion({error: err});
133
+ a_list.push(a2);
134
+ if (options.log) {
135
+ async.nextTick(function () {
136
+ options.log(a2);
137
+ });
138
+ }
139
+ }
140
+ var end = new Date().getTime();
141
+ async.nextTick(function () {
142
+ var assertion_list = exports.assertionList(a_list, end - start);
143
+ options.testDone(name, assertion_list);
144
+ callback(null, a_list);
145
+ });
146
+ },
147
+ ok: wrapAssert('ok', 'ok', 2),
148
+ same: wrapAssert('same', 'deepEqual', 3),
149
+ equals: wrapAssert('equals', 'equal', 3),
150
+ expect: function (num) {
151
+ expecting = num;
152
+ },
153
+ _assertion_list: a_list
154
+ };
155
+ // add all functions from the assert module
156
+ for (var k in assert) {
157
+ if (assert.hasOwnProperty(k)) {
158
+ test[k] = wrapAssert(k, k, assert[k].length);
159
+ }
160
+ }
161
+ return test;
162
+ };
163
+
164
+ /**
165
+ * Ensures an options object has all callbacks, adding empty callback functions
166
+ * if any are missing.
167
+ *
168
+ * @param {Object} opt
169
+ * @return {Object}
170
+ * @api public
171
+ */
172
+
173
+ exports.options = function (opt) {
174
+ var optionalCallback = function (name) {
175
+ opt[name] = opt[name] || function () {};
176
+ };
177
+
178
+ optionalCallback('moduleStart');
179
+ optionalCallback('moduleDone');
180
+ optionalCallback('testStart');
181
+ optionalCallback('testDone');
182
+ //optionalCallback('log');
183
+
184
+ // 'done' callback is not optional.
185
+
186
+ return opt;
187
+ };
@@ -0,0 +1,209 @@
1
+ /*!
2
+ * Nodeunit
3
+ * Copyright (c) 2010 Caolan McMahon
4
+ * MIT Licensed
5
+ */
6
+
7
+ /**
8
+ * Module dependencies
9
+ */
10
+
11
+ var async = require('../deps/async'),
12
+ fs = require('fs'),
13
+ util = require('util'),
14
+ Script = process.binding('evals').Script,
15
+ http = require('http');
16
+
17
+
18
+ /**
19
+ * Detect if coffee-script is available and search for .coffee as an
20
+ * extension in modulePaths if it is.
21
+ */
22
+
23
+ var extensionPattern;
24
+ try {
25
+ require('coffee-script');
26
+ extensionPattern = /\.(?:js|coffee)$/;
27
+ }
28
+ catch (e) {
29
+ extensionPattern = /\.js$/;
30
+ }
31
+
32
+
33
+ /**
34
+ * Finds all modules at each path in an array, If a path is a directory, it
35
+ * returns all supported file types inside it. This only reads 1 level deep in
36
+ * the directory and does not recurse through sub-directories.
37
+ *
38
+ * The extension (.js, .coffee etc) is stripped from the filenames so they can
39
+ * simply be require()'ed.
40
+ *
41
+ * @param {Array} paths
42
+ * @param {Function} callback
43
+ * @api public
44
+ */
45
+
46
+ exports.modulePaths = function (paths, callback) {
47
+ async.concat(paths, function (p, cb) {
48
+ fs.stat(p, function (err, stats) {
49
+ if (err) {
50
+ return cb(err);
51
+ }
52
+ if (stats.isFile()) {
53
+ return cb(null, [p]);
54
+ }
55
+ if (stats.isDirectory()) {
56
+ fs.readdir(p, function (err, files) {
57
+ if (err) {
58
+ return cb(err);
59
+ }
60
+
61
+ // filter out any filenames with unsupported extensions
62
+ var modules = files.filter(function (filename) {
63
+ return extensionPattern.exec(filename);
64
+ });
65
+
66
+ // remove extension from module name and prepend the
67
+ // directory path
68
+ var fullpaths = modules.map(function (filename) {
69
+ var mod_name = filename.replace(extensionPattern, '');
70
+ return [p, mod_name].join('/');
71
+ });
72
+
73
+ // sort filenames here, because Array.map changes order
74
+ fullpaths.sort();
75
+
76
+ cb(null, fullpaths);
77
+ });
78
+ }
79
+ });
80
+ }, callback);
81
+ };
82
+
83
+ /**
84
+ * Evaluates JavaScript files in a sandbox, returning the context. The first
85
+ * argument can either be a single filename or an array of filenames. If
86
+ * multiple filenames are given their contents are concatenated before
87
+ * evalution. The second argument is an optional context to use for the sandbox.
88
+ *
89
+ * @param files
90
+ * @param {Object} sandbox
91
+ * @return {Object}
92
+ * @api public
93
+ */
94
+
95
+ exports.sandbox = function (files, /*optional*/sandbox) {
96
+ var source, script, result;
97
+ if (!(files instanceof Array)) {
98
+ files = [files];
99
+ }
100
+ source = files.map(function (file) {
101
+ return fs.readFileSync(file, 'utf8');
102
+ }).join('');
103
+
104
+ if (!sandbox) {
105
+ sandbox = {};
106
+ }
107
+ script = new Script(source);
108
+ result = script.runInNewContext(sandbox);
109
+ return sandbox;
110
+ };
111
+
112
+ /**
113
+ * Provides a http request, response testing environment.
114
+ *
115
+ * Example:
116
+ *
117
+ * var httputil = require('nodeunit').utils.httputil
118
+ * exports.testSomething = function(test) {
119
+ * httputil(function (req, resp) {
120
+ * resp.writeHead(200, {});
121
+ * resp.end('test data');
122
+ * },
123
+ * function(server, client) {
124
+ * client.fetch('GET', '/', {}, function(resp) {
125
+ * test.equal('test data', resp.body);
126
+ * server.close();
127
+ * test.done();
128
+ * })
129
+ * });
130
+ * };
131
+ *
132
+ * @param {Function} cgi
133
+ * @param {Function} envReady
134
+ * @api public
135
+ */
136
+ exports.httputil = function (cgi, envReady) {
137
+ var hostname = process.env.HOSTNAME || 'localhost';
138
+ var port = process.env.PORT || 3000;
139
+
140
+ var server = http.createServer(cgi);
141
+ server.listen(port, hostname);
142
+
143
+ var client = http.createClient(port, hostname);
144
+ client.fetch = function (method, path, headers, respReady) {
145
+ var request = this.request(method, path, headers);
146
+ request.end();
147
+ request.on('response', function (response) {
148
+ response.setEncoding('utf8');
149
+ response.on('data', function (chunk) {
150
+ if (response.body) {
151
+ response.body += chunk;
152
+ } else {
153
+ response.body = chunk;
154
+ }
155
+ });
156
+ response.on('end', function () {
157
+ if (response.headers['content-type'] === 'application/json') {
158
+ response.bodyAsObject = JSON.parse(response.body);
159
+ }
160
+ respReady(response);
161
+ });
162
+ });
163
+ };
164
+
165
+ process.nextTick(function () {
166
+ if (envReady && typeof envReady === 'function') {
167
+ envReady(server, client);
168
+ }
169
+ });
170
+ };
171
+
172
+
173
+ /**
174
+ * Improves formatting of AssertionError messages to make deepEqual etc more
175
+ * readable.
176
+ *
177
+ * @param {Object} assertion
178
+ * @return {Object}
179
+ * @api public
180
+ */
181
+
182
+ exports.betterErrors = function (assertion) {
183
+ if (!assertion.error) return;
184
+
185
+ var e = assertion.error;
186
+ // deepEqual error message is a bit sucky, lets improve it!
187
+ // e.actual and e.expected could be null or undefined, so
188
+ // using getOwnPropertyDescriptor to see if they exist:
189
+ if (Object.getOwnPropertyDescriptor(e, 'actual') &&
190
+ Object.getOwnPropertyDescriptor(e, 'expected')) {
191
+
192
+ // alexgorbatchev 2010-10-22 :: Added a bit of depth to inspection
193
+ var actual = util.inspect(e.actual, false, 10).replace(/\n$/, '');
194
+ var expected = util.inspect(e.expected, false, 10).replace(/\n$/, '');
195
+ var multiline = (
196
+ actual.indexOf('\n') !== -1 ||
197
+ expected.indexOf('\n') !== -1
198
+ );
199
+ var spacing = (multiline ? '\n' : ' ');
200
+ e._message = e.message;
201
+ e.stack = (
202
+ e.name + ':' + spacing +
203
+ actual + spacing + e.operator + spacing +
204
+ expected + '\n' +
205
+ e.stack.split('\n').slice(1).join('\n')
206
+ );
207
+ }
208
+ return assertion;
209
+ };