spade-packager 0.1.0

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 (316) hide show
  1. data/.gitignore +2 -0
  2. data/.gitmodules +6 -0
  3. data/bin/spadepkg +8 -0
  4. data/lib/libgems_ext.rb +8 -0
  5. data/lib/libgems_ext/config_file.rb +33 -0
  6. data/lib/libgems_ext/dependency_installer.rb +150 -0
  7. data/lib/libgems_ext/installer.rb +39 -0
  8. data/lib/libgems_ext/libgems.rb +39 -0
  9. data/lib/libgems_ext/spec_fetcher.rb +11 -0
  10. data/lib/spade-packager.rb +1 -0
  11. data/lib/spade/packager.rb +18 -0
  12. data/lib/spade/packager/cli.rb +9 -0
  13. data/lib/spade/packager/cli/base.rb +196 -0
  14. data/lib/spade/packager/cli/owner.rb +46 -0
  15. data/lib/spade/packager/cli/project_generator.rb +117 -0
  16. data/lib/spade/packager/credentials.rb +38 -0
  17. data/lib/spade/packager/local.rb +50 -0
  18. data/lib/spade/packager/package.rb +160 -0
  19. data/lib/spade/packager/remote.rb +98 -0
  20. data/lib/spade/packager/repository.rb +18 -0
  21. data/lib/spade/packager/version.rb +5 -0
  22. data/packages/coffee-script/.gitignore +8 -0
  23. data/packages/coffee-script/.npmignore +11 -0
  24. data/packages/coffee-script/Cakefile +229 -0
  25. data/packages/coffee-script/LICENSE +22 -0
  26. data/packages/coffee-script/README +47 -0
  27. data/packages/coffee-script/Rakefile +78 -0
  28. data/packages/coffee-script/bin/cake +7 -0
  29. data/packages/coffee-script/bin/coffee +7 -0
  30. data/packages/coffee-script/documentation/coffee/aliases.coffee +11 -0
  31. data/packages/coffee-script/documentation/coffee/array_comprehensions.coffee +2 -0
  32. data/packages/coffee-script/documentation/coffee/block_comment.coffee +6 -0
  33. data/packages/coffee-script/documentation/coffee/cake_tasks.coffee +9 -0
  34. data/packages/coffee-script/documentation/coffee/classes.coffee +25 -0
  35. data/packages/coffee-script/documentation/coffee/comparisons.coffee +5 -0
  36. data/packages/coffee-script/documentation/coffee/conditionals.coffee +13 -0
  37. data/packages/coffee-script/documentation/coffee/default_args.coffee +8 -0
  38. data/packages/coffee-script/documentation/coffee/do.coffee +4 -0
  39. data/packages/coffee-script/documentation/coffee/embedded.coffee +5 -0
  40. data/packages/coffee-script/documentation/coffee/existence.coffee +10 -0
  41. data/packages/coffee-script/documentation/coffee/expressions.coffee +9 -0
  42. data/packages/coffee-script/documentation/coffee/expressions_assignment.coffee +3 -0
  43. data/packages/coffee-script/documentation/coffee/expressions_comprehension.coffee +3 -0
  44. data/packages/coffee-script/documentation/coffee/expressions_try.coffee +7 -0
  45. data/packages/coffee-script/documentation/coffee/fat_arrow.coffee +6 -0
  46. data/packages/coffee-script/documentation/coffee/functions.coffee +2 -0
  47. data/packages/coffee-script/documentation/coffee/heredocs.coffee +7 -0
  48. data/packages/coffee-script/documentation/coffee/heregexes.coffee +11 -0
  49. data/packages/coffee-script/documentation/coffee/interpolation.coffee +6 -0
  50. data/packages/coffee-script/documentation/coffee/multiple_return_values.coffee +7 -0
  51. data/packages/coffee-script/documentation/coffee/object_comprehensions.coffee +4 -0
  52. data/packages/coffee-script/documentation/coffee/object_extraction.coffee +13 -0
  53. data/packages/coffee-script/documentation/coffee/objects_and_arrays.coffee +19 -0
  54. data/packages/coffee-script/documentation/coffee/objects_reserved.coffee +5 -0
  55. data/packages/coffee-script/documentation/coffee/overview.coffee +28 -0
  56. data/packages/coffee-script/documentation/coffee/parallel_assignment.coffee +6 -0
  57. data/packages/coffee-script/documentation/coffee/patterns_and_splats.coffee +7 -0
  58. data/packages/coffee-script/documentation/coffee/prototypes.coffee +3 -0
  59. data/packages/coffee-script/documentation/coffee/range_comprehensions.coffee +2 -0
  60. data/packages/coffee-script/documentation/coffee/scope.coffee +5 -0
  61. data/packages/coffee-script/documentation/coffee/slices.coffee +7 -0
  62. data/packages/coffee-script/documentation/coffee/soaks.coffee +1 -0
  63. data/packages/coffee-script/documentation/coffee/splats.coffee +27 -0
  64. data/packages/coffee-script/documentation/coffee/splices.coffee +5 -0
  65. data/packages/coffee-script/documentation/coffee/strings.coffee +8 -0
  66. data/packages/coffee-script/documentation/coffee/switch.coffee +10 -0
  67. data/packages/coffee-script/documentation/coffee/try.coffee +8 -0
  68. data/packages/coffee-script/documentation/coffee/while.coffee +10 -0
  69. data/packages/coffee-script/documentation/css/docs.css +374 -0
  70. data/packages/coffee-script/documentation/css/idle.css +64 -0
  71. data/packages/coffee-script/documentation/docs/browser.html +25 -0
  72. data/packages/coffee-script/documentation/docs/cake.html +43 -0
  73. data/packages/coffee-script/documentation/docs/coffee-script.html +51 -0
  74. data/packages/coffee-script/documentation/docs/command.html +161 -0
  75. data/packages/coffee-script/documentation/docs/docco.css +186 -0
  76. data/packages/coffee-script/documentation/docs/grammar.html +399 -0
  77. data/packages/coffee-script/documentation/docs/helpers.html +31 -0
  78. data/packages/coffee-script/documentation/docs/index.html +3 -0
  79. data/packages/coffee-script/documentation/docs/lexer.html +490 -0
  80. data/packages/coffee-script/documentation/docs/nodes.html +1338 -0
  81. data/packages/coffee-script/documentation/docs/optparse.html +78 -0
  82. data/packages/coffee-script/documentation/docs/repl.html +24 -0
  83. data/packages/coffee-script/documentation/docs/rewriter.html +251 -0
  84. data/packages/coffee-script/documentation/docs/scope.html +54 -0
  85. data/packages/coffee-script/documentation/docs/underscore.html +295 -0
  86. data/packages/coffee-script/documentation/images/background.png +0 -0
  87. data/packages/coffee-script/documentation/images/banding.png +0 -0
  88. data/packages/coffee-script/documentation/images/button_bg.png +0 -0
  89. data/packages/coffee-script/documentation/images/button_bg_dark.gif +0 -0
  90. data/packages/coffee-script/documentation/images/button_bg_green.gif +0 -0
  91. data/packages/coffee-script/documentation/images/favicon.ico +0 -0
  92. data/packages/coffee-script/documentation/images/logo.png +0 -0
  93. data/packages/coffee-script/documentation/images/screenshadow.png +0 -0
  94. data/packages/coffee-script/documentation/index.html.erb +1607 -0
  95. data/packages/coffee-script/documentation/js/aliases.js +17 -0
  96. data/packages/coffee-script/documentation/js/array_comprehensions.js +6 -0
  97. data/packages/coffee-script/documentation/js/block_comment.js +4 -0
  98. data/packages/coffee-script/documentation/js/cake_tasks.js +10 -0
  99. data/packages/coffee-script/documentation/js/classes.js +44 -0
  100. data/packages/coffee-script/documentation/js/comparisons.js +3 -0
  101. data/packages/coffee-script/documentation/js/conditionals.js +12 -0
  102. data/packages/coffee-script/documentation/js/default_args.js +7 -0
  103. data/packages/coffee-script/documentation/js/do.js +10 -0
  104. data/packages/coffee-script/documentation/js/embedded.js +4 -0
  105. data/packages/coffee-script/documentation/js/existence.js +6 -0
  106. data/packages/coffee-script/documentation/js/expressions.js +15 -0
  107. data/packages/coffee-script/documentation/js/expressions_assignment.js +2 -0
  108. data/packages/coffee-script/documentation/js/expressions_comprehension.js +9 -0
  109. data/packages/coffee-script/documentation/js/expressions_try.js +7 -0
  110. data/packages/coffee-script/documentation/js/fat_arrow.js +9 -0
  111. data/packages/coffee-script/documentation/js/functions.js +7 -0
  112. data/packages/coffee-script/documentation/js/heredocs.js +2 -0
  113. data/packages/coffee-script/documentation/js/heregexes.js +2 -0
  114. data/packages/coffee-script/documentation/js/interpolation.js +4 -0
  115. data/packages/coffee-script/documentation/js/multiple_return_values.js +5 -0
  116. data/packages/coffee-script/documentation/js/object_comprehensions.js +15 -0
  117. data/packages/coffee-script/documentation/js/object_extraction.js +10 -0
  118. data/packages/coffee-script/documentation/js/objects_and_arrays.js +17 -0
  119. data/packages/coffee-script/documentation/js/objects_reserved.js +4 -0
  120. data/packages/coffee-script/documentation/js/overview.js +35 -0
  121. data/packages/coffee-script/documentation/js/parallel_assignment.js +4 -0
  122. data/packages/coffee-script/documentation/js/patterns_and_splats.js +4 -0
  123. data/packages/coffee-script/documentation/js/prototypes.js +3 -0
  124. data/packages/coffee-script/documentation/js/range_comprehensions.js +9 -0
  125. data/packages/coffee-script/documentation/js/scope.js +8 -0
  126. data/packages/coffee-script/documentation/js/slices.js +4 -0
  127. data/packages/coffee-script/documentation/js/soaks.js +2 -0
  128. data/packages/coffee-script/documentation/js/splats.js +15 -0
  129. data/packages/coffee-script/documentation/js/splices.js +3 -0
  130. data/packages/coffee-script/documentation/js/strings.js +2 -0
  131. data/packages/coffee-script/documentation/js/switch.js +23 -0
  132. data/packages/coffee-script/documentation/js/try.js +8 -0
  133. data/packages/coffee-script/documentation/js/while.js +18 -0
  134. data/packages/coffee-script/documentation/vendor/jquery-1.4.2.js +6240 -0
  135. data/packages/coffee-script/examples/beautiful_code/binary_search.coffee +16 -0
  136. data/packages/coffee-script/examples/beautiful_code/quicksort_runtime.coffee +13 -0
  137. data/packages/coffee-script/examples/beautiful_code/regular_expression_matcher.coffee +34 -0
  138. data/packages/coffee-script/examples/blocks.coffee +54 -0
  139. data/packages/coffee-script/examples/code.coffee +167 -0
  140. data/packages/coffee-script/examples/computer_science/README +4 -0
  141. data/packages/coffee-script/examples/computer_science/binary_search.coffee +25 -0
  142. data/packages/coffee-script/examples/computer_science/bubble_sort.coffee +11 -0
  143. data/packages/coffee-script/examples/computer_science/linked_list.coffee +108 -0
  144. data/packages/coffee-script/examples/computer_science/luhn_algorithm.coffee +36 -0
  145. data/packages/coffee-script/examples/computer_science/merge_sort.coffee +19 -0
  146. data/packages/coffee-script/examples/computer_science/selection_sort.coffee +23 -0
  147. data/packages/coffee-script/examples/poignant.coffee +181 -0
  148. data/packages/coffee-script/examples/potion.coffee +206 -0
  149. data/packages/coffee-script/examples/underscore.coffee +682 -0
  150. data/packages/coffee-script/examples/web_server.coffee +12 -0
  151. data/packages/coffee-script/extras/EXTRAS +7 -0
  152. data/packages/coffee-script/extras/coffee-script.js +8 -0
  153. data/packages/coffee-script/extras/jsl.conf +44 -0
  154. data/packages/coffee-script/index.html +2515 -0
  155. data/packages/coffee-script/lib/browser.js +52 -0
  156. data/packages/coffee-script/lib/cake.js +76 -0
  157. data/packages/coffee-script/lib/coffee-script.js +82 -0
  158. data/packages/coffee-script/lib/command.js +263 -0
  159. data/packages/coffee-script/lib/grammar.js +581 -0
  160. data/packages/coffee-script/lib/helpers.js +66 -0
  161. data/packages/coffee-script/lib/index.js +8 -0
  162. data/packages/coffee-script/lib/lexer.js +633 -0
  163. data/packages/coffee-script/lib/nodes.js +2165 -0
  164. data/packages/coffee-script/lib/optparse.js +111 -0
  165. data/packages/coffee-script/lib/parser.js +649 -0
  166. data/packages/coffee-script/lib/repl.js +42 -0
  167. data/packages/coffee-script/lib/rewriter.js +353 -0
  168. data/packages/coffee-script/lib/scope.js +120 -0
  169. data/packages/coffee-script/lib/spade-format.js +45 -0
  170. data/packages/coffee-script/package.json +26 -0
  171. data/packages/coffee-script/src/browser.coffee +43 -0
  172. data/packages/coffee-script/src/cake.coffee +69 -0
  173. data/packages/coffee-script/src/coffee-script.coffee +92 -0
  174. data/packages/coffee-script/src/command.coffee +214 -0
  175. data/packages/coffee-script/src/grammar.coffee +590 -0
  176. data/packages/coffee-script/src/helpers.coffee +56 -0
  177. data/packages/coffee-script/src/index.coffee +2 -0
  178. data/packages/coffee-script/src/lexer.coffee +653 -0
  179. data/packages/coffee-script/src/nodes.coffee +1754 -0
  180. data/packages/coffee-script/src/optparse.coffee +99 -0
  181. data/packages/coffee-script/src/repl.coffee +42 -0
  182. data/packages/coffee-script/src/rewriter.coffee +326 -0
  183. data/packages/coffee-script/src/scope.coffee +94 -0
  184. data/packages/coffee-script/test/arguments.coffee +127 -0
  185. data/packages/coffee-script/test/assignment.coffee +98 -0
  186. data/packages/coffee-script/test/break.coffee +18 -0
  187. data/packages/coffee-script/test/comments.coffee +201 -0
  188. data/packages/coffee-script/test/conditionals.coffee +181 -0
  189. data/packages/coffee-script/test/exception_handling.coffee +90 -0
  190. data/packages/coffee-script/test/helpers.coffee +96 -0
  191. data/packages/coffee-script/test/importing.coffee +18 -0
  192. data/packages/coffee-script/test/operators.coffee +225 -0
  193. data/packages/coffee-script/test/ranges_slices_and_splices.coffee +186 -0
  194. data/packages/coffee-script/test/regular_expressions.coffee +56 -0
  195. data/packages/coffee-script/test/test.html +123 -0
  196. data/packages/coffee-script/test/test_chaining.coffee +77 -0
  197. data/packages/coffee-script/test/test_classes.coffee +372 -0
  198. data/packages/coffee-script/test/test_compilation.coffee +26 -0
  199. data/packages/coffee-script/test/test_comprehensions.coffee +318 -0
  200. data/packages/coffee-script/test/test_existence.coffee +165 -0
  201. data/packages/coffee-script/test/test_functions.coffee +379 -0
  202. data/packages/coffee-script/test/test_heredocs.coffee +111 -0
  203. data/packages/coffee-script/test/test_literals.coffee +270 -0
  204. data/packages/coffee-script/test/test_option_parser.coffee +27 -0
  205. data/packages/coffee-script/test/test_pattern_matching.coffee +162 -0
  206. data/packages/coffee-script/test/test_returns.coffee +63 -0
  207. data/packages/coffee-script/test/test_splats.coffee +102 -0
  208. data/packages/coffee-script/test/test_strings.coffee +118 -0
  209. data/packages/coffee-script/test/test_switch.coffee +103 -0
  210. data/packages/coffee-script/test/test_while.coffee +71 -0
  211. data/packages/ivory/LICENSE.txt +1 -0
  212. data/packages/ivory/README.md +19 -0
  213. data/packages/ivory/lib/buffer.js +111 -0
  214. data/packages/ivory/lib/events.js +137 -0
  215. data/packages/ivory/lib/fs.js +266 -0
  216. data/packages/ivory/lib/main.js +13 -0
  217. data/packages/ivory/lib/path.js +158 -0
  218. data/packages/ivory/lib/ruby/buffer.rb +145 -0
  219. data/packages/ivory/lib/ruby/constants.rb +585 -0
  220. data/packages/ivory/lib/ruby/events.rb +32 -0
  221. data/packages/ivory/lib/ruby/fs.rb +245 -0
  222. data/packages/ivory/lib/ruby/process.rb +28 -0
  223. data/packages/ivory/lib/stream.js +115 -0
  224. data/packages/ivory/lib/util.js +414 -0
  225. data/packages/ivory/package.json +11 -0
  226. data/packages/ivory/spade-boot.js +78 -0
  227. data/packages/jquery/main.js +7179 -0
  228. data/packages/jquery/package.json +10 -0
  229. data/packages/json/lib/main.js +14 -0
  230. data/packages/json/package.json +8 -0
  231. data/packages/lproj/README.md +77 -0
  232. data/packages/lproj/examples/demo-app/en.lproj/localized.strings +2 -0
  233. data/packages/lproj/examples/demo-app/fr.lproj/localized.strings +3 -0
  234. data/packages/lproj/examples/demo-app/index.html +8 -0
  235. data/packages/lproj/examples/demo-app/lib/main.js +7 -0
  236. data/packages/lproj/examples/demo-app/package.json +9 -0
  237. data/packages/lproj/lib/main.js +78 -0
  238. data/packages/lproj/lib/strings-format.js +6 -0
  239. data/packages/lproj/package.json +9 -0
  240. data/packages/optparse/README.md +161 -0
  241. data/packages/optparse/TODO +1 -0
  242. data/packages/optparse/examples/browser-test.html +75 -0
  243. data/packages/optparse/examples/nodejs-test.js +90 -0
  244. data/packages/optparse/lib/optparse.js +309 -0
  245. data/packages/optparse/package.json +13 -0
  246. data/packages/optparse/seed.yml +5 -0
  247. data/packages/text/lib/main.js +8 -0
  248. data/packages/text/package.json +9 -0
  249. data/packages/web-file/README.md +7 -0
  250. data/packages/web-file/lib/errors.js +32 -0
  251. data/packages/web-file/lib/file-reader.js +10 -0
  252. data/packages/web-file/lib/file-system.js +234 -0
  253. data/packages/web-file/lib/file-writer.js +10 -0
  254. data/packages/web-file/lib/file.js +9 -0
  255. data/packages/web-file/lib/main.js +34 -0
  256. data/packages/web-file/lib/platform.js +25 -0
  257. data/packages/web-file/lib/ruby/file.rb +252 -0
  258. data/packages/web-file/lib/ruby/file_reader.rb +69 -0
  259. data/packages/web-file/lib/ruby/file_system.rb +134 -0
  260. data/packages/web-file/lib/ruby/file_writer.rb +78 -0
  261. data/packages/web-file/package.json +12 -0
  262. data/packages/web-typed-array/README.md +7 -0
  263. data/packages/web-typed-array/lib/array-buffer-view.js +9 -0
  264. data/packages/web-typed-array/lib/array-buffer.js +7 -0
  265. data/packages/web-typed-array/lib/main.js +33 -0
  266. data/packages/web-typed-array/lib/platform.js +20 -0
  267. data/packages/web-typed-array/lib/ruby/array_buffer.rb +31 -0
  268. data/packages/web-typed-array/lib/ruby/array_buffer_view.rb +130 -0
  269. data/packages/web-typed-array/lib/ruby/typed_array.rb +133 -0
  270. data/packages/web-typed-array/lib/typed-array.js +26 -0
  271. data/packages/web-typed-array/package.json +9 -0
  272. data/spade-packager.gemspec +39 -0
  273. data/spec/cli/build_spec.rb +57 -0
  274. data/spec/cli/install_spec.rb +119 -0
  275. data/spec/cli/installed_spec.rb +55 -0
  276. data/spec/cli/list_spec.rb +74 -0
  277. data/spec/cli/login_spec.rb +75 -0
  278. data/spec/cli/new_spec.rb +5 -0
  279. data/spec/cli/owner_spec.rb +114 -0
  280. data/spec/cli/push_spec.rb +73 -0
  281. data/spec/cli/uninstall_spec.rb +58 -0
  282. data/spec/cli/unpack_spec.rb +72 -0
  283. data/spec/cli/unyank_spec.rb +73 -0
  284. data/spec/cli/yank_spec.rb +73 -0
  285. data/spec/credentials_spec.rb +23 -0
  286. data/spec/fixtures/badrake-0.8.7.spd +0 -0
  287. data/spec/fixtures/builder-3.0.0.spd +0 -0
  288. data/spec/fixtures/bundler-1.1.pre.spd +0 -0
  289. data/spec/fixtures/coffee-1.0.1.pre.spd +0 -0
  290. data/spec/fixtures/core-test-0.4.3.spd +0 -0
  291. data/spec/fixtures/core-test/bin/cot +3 -0
  292. data/spec/fixtures/core-test/lib/main.js +1 -0
  293. data/spec/fixtures/core-test/resources/runner.css +0 -0
  294. data/spec/fixtures/core-test/tests/test.js +1 -0
  295. data/spec/fixtures/highline-1.6.1.spd +0 -0
  296. data/spec/fixtures/ivory-0.0.1.spd +0 -0
  297. data/spec/fixtures/jquery-1.4.3.spd +0 -0
  298. data/spec/fixtures/optparse-1.0.1.spd +0 -0
  299. data/spec/fixtures/package.json +30 -0
  300. data/spec/fixtures/rake-0.8.6.spd +0 -0
  301. data/spec/fixtures/rake-0.8.7.spd +0 -0
  302. data/spec/gauntlet_spec.rb +27 -0
  303. data/spec/package_spec.rb +267 -0
  304. data/spec/spec_helper.rb +32 -0
  305. data/spec/support/cli.rb +103 -0
  306. data/spec/support/fake.rb +48 -0
  307. data/spec/support/fake_gem_server.rb +67 -0
  308. data/spec/support/fake_gemcutter.rb +50 -0
  309. data/spec/support/matchers.rb +32 -0
  310. data/spec/support/path.rb +61 -0
  311. data/templates/project/LICENSE +19 -0
  312. data/templates/project/README.md +21 -0
  313. data/templates/project/lib/main.js +9 -0
  314. data/templates/project/project.json +31 -0
  315. data/templates/project/tests/main-test.js +8 -0
  316. metadata +484 -0
@@ -0,0 +1,32 @@
1
+ Bundler.require :default, :development
2
+
3
+ require 'support/cli'
4
+ require 'support/fake'
5
+ require 'support/fake_gem_server'
6
+ require 'support/fake_gemcutter'
7
+ require 'support/matchers'
8
+ require 'support/path'
9
+
10
+ module SpecHelpers
11
+ def set_host(host='http://localhost:9292')
12
+ LibGems.host = host
13
+ LibGems.sources = [LibGems.host]
14
+ end
15
+ end
16
+
17
+ RSpec.configure do |config|
18
+ working_dir = Dir.pwd
19
+
20
+ config.include SpecHelpers
21
+
22
+ config.around do |blk|
23
+ reset!
24
+
25
+ blk.call
26
+
27
+ kill!
28
+ stop_fake
29
+ Dir.chdir working_dir if Dir.pwd != working_dir
30
+ end
31
+ end
32
+
@@ -0,0 +1,103 @@
1
+ require 'spade/packager/cli/base'
2
+
3
+ module SpecHelpers
4
+ attr_reader :stdin, :stdout, :stderr
5
+
6
+ # Dummy wrapper for testing
7
+ class CLI < Thor
8
+ desc "package", "Package commands"
9
+ subcommand "package", Spade::Packager::CLI::Base
10
+ end
11
+
12
+ def env
13
+ @env ||= {}
14
+ end
15
+
16
+ def spade(*argv)
17
+ opts = Hash === argv.last ? argv.pop : {}
18
+
19
+ kill!
20
+ create_pipes
21
+
22
+ @pid = Process.fork do
23
+ Dir.chdir opts[:chdir] if opts[:chdir]
24
+
25
+ @stdout.close
26
+ STDOUT.reopen @stdout_child
27
+
28
+ @stdin.close
29
+ STDIN.reopen @stdin_child
30
+
31
+ if opts[:track_stderr]
32
+ @stderr.close
33
+ STDERR.reopen @stderr_child
34
+ end
35
+
36
+ env.each do |key, val|
37
+ ENV[key] = val
38
+ end
39
+
40
+ CLI.start(argv)
41
+ end
42
+
43
+ @stdout_child.close
44
+ @stdin_child.close
45
+ @stderr_child.close
46
+ @pid
47
+ end
48
+
49
+ def out_until_block(io = stdout)
50
+ # read 1 first so we wait until the process is done processing the last write
51
+ chars = io.read(1)
52
+
53
+ loop do
54
+ chars << io.read_nonblock(1000)
55
+ sleep 0.05
56
+ end
57
+ rescue Errno::EAGAIN, EOFError
58
+ chars
59
+ end
60
+
61
+ def input(line, opts = {})
62
+ if on = opts[:on]
63
+ should_block_on on
64
+ end
65
+ stdin << "#{line}\n"
66
+ end
67
+
68
+ def wait
69
+ return unless @pid
70
+
71
+ pid, status = Process.wait2(@pid, 0)
72
+
73
+ @exit_status = status
74
+ @pid = nil
75
+ end
76
+
77
+ def exit_status
78
+ wait
79
+ @exit_status
80
+ end
81
+
82
+ def kill!
83
+ Process.kill(9, @pid) if @pid
84
+ end
85
+
86
+ def create_pipes
87
+ @stdout, @stdout_child = IO.pipe
88
+ @stdin_child, @stdin = IO.pipe
89
+ @stderr, @stderr_child = IO.pipe
90
+ end
91
+
92
+ def write_api_key(api_key)
93
+ write_creds("user@example.com", api_key)
94
+ end
95
+
96
+ def write_creds(email, api_key)
97
+ FileUtils.mkdir_p(spade_dir)
98
+ File.open(spade_dir("credentials"), "w") do |file|
99
+ file.write YAML.dump(:spade_api_key => api_key, :spade_email => email)
100
+ end
101
+ end
102
+ end
103
+
@@ -0,0 +1,48 @@
1
+ require 'rack'
2
+ require 'logger'
3
+ require 'timeout'
4
+ require 'net/http'
5
+
6
+ module SpecHelpers
7
+ class Fake
8
+ def call(env)
9
+ [200, {"Content-Type" => "text/plain"}, ["Hello world!"]]
10
+ end
11
+ end
12
+
13
+ def start_fake(app)
14
+ uri = URI.parse("http://localhost:9292/")
15
+ raise "Server already running on 9292" if uri_active?(uri)
16
+
17
+ @fake_pid = Process.fork do
18
+ logger = Logger.new(StringIO.new)
19
+ Rack::Handler::WEBrick.run(app, :Port => 9292, :Logger => logger, :AccessLog => [[logger, WEBrick::AccessLog::COMBINED_LOG_FORMAT]])
20
+ end
21
+ ready = false
22
+ until ready
23
+ if uri_active?(uri)
24
+ ready = true
25
+ else
26
+ print "-" if ENV["VERBOSE"]
27
+ end
28
+ end
29
+ end
30
+
31
+ def stop_fake
32
+ Process.kill(9, @fake_pid) if @fake_pid
33
+ end
34
+
35
+ private
36
+
37
+ def uri_active?(uri)
38
+ begin
39
+ timeout(1) do
40
+ Net::HTTP.get_response(uri)
41
+ end
42
+ true
43
+ rescue Timeout::Error, SystemCallError
44
+ false
45
+ end
46
+ end
47
+ end
48
+
@@ -0,0 +1,67 @@
1
+ class FakeGemServer
2
+ include SpecHelpers
3
+
4
+ def index(name, version)
5
+ [name, LibGems::Version.new(version), "ruby"]
6
+ end
7
+
8
+ def call(env)
9
+ request = Rack::Request.new(env)
10
+
11
+ if request.path =~ /latest_specs/
12
+ latest_index = [
13
+ index("builder", "3.0.0"),
14
+ index("highline", "1.6.1"),
15
+ index("rake", "0.8.7"),
16
+ index("core-test", "0.4.3"),
17
+ index("ivory", "0.0.1"),
18
+ index("optparse", "1.0.1")
19
+ ]
20
+ [200, {"Content-Type" => "application/octet-stream"}, compress(latest_index)]
21
+ elsif request.path =~ /prerelease_specs/
22
+ prerelease_index = [
23
+ index("bundler", "1.1.pre")
24
+ ]
25
+ [200, {"Content-Type" => "application/octet-stream"}, compress(prerelease_index)]
26
+ elsif request.path =~ /specs/
27
+ big_index = [
28
+ index("builder", "3.0.0"),
29
+ index("highline", "1.6.1"),
30
+ index("rake", "0.8.7"),
31
+ index("rake", "0.8.6"),
32
+ index("core-test", "0.4.3"),
33
+ index("ivory", "0.0.1"),
34
+ index("optparse", "1.0.1")
35
+ ]
36
+ [200, {"Content-Type" => "application/octet-stream"}, compress(big_index)]
37
+ elsif request.path =~ /\/quick\/Marshal\.4\.8\/(.*)\.gemspec\.rz$/
38
+
39
+ spec = LibGems::Format.from_file_by_path(gem_or_spade($1).to_s).spec
40
+ value = LibGems.deflate(Marshal.dump(spec))
41
+
42
+ [200, {"Content-Type" => "application/octet-stream"}, value]
43
+ elsif request.path =~ /\/gems\/(.*)\.gem$/
44
+ [200, {"Content-Type" => "application/octet-stream"}, File.read(gem_or_spade($1))]
45
+ else
46
+ [200, {"Content-Type" => "text/plain"}, "fake gem server"]
47
+ end
48
+ end
49
+
50
+ def compress(index)
51
+ compressed = StringIO.new
52
+ gzip = Zlib::GzipWriter.new(compressed)
53
+ gzip.write(Marshal.dump(index))
54
+ gzip.close
55
+ compressed.string
56
+ end
57
+
58
+ private
59
+
60
+ def gem_or_spade(name)
61
+ fixture = fixtures("#{name}.gem")
62
+ fixture = fixtures("#{name}.spd") unless File.exist?(fixture)
63
+ fixture
64
+ end
65
+
66
+ end
67
+
@@ -0,0 +1,50 @@
1
+ class FakeGemcutter
2
+ def initialize(api_key)
3
+ @api_key = api_key
4
+ end
5
+
6
+ def respond(code, text)
7
+ [code, {"Content-Type" => "text/plain"}, text]
8
+ end
9
+
10
+ def call(env)
11
+ request = Rack::Request.new(env)
12
+
13
+ if request.env["HTTP_AUTHORIZATION"] != @api_key
14
+ respond 401, "One cannot simply walk into Mordor!"
15
+ elsif request.path == "/api/v1/gems" && request.post?
16
+ respond 200, "Successfully registered rake (0.8.7)"
17
+ elsif request.path == "/api/v1/gems/yank" && request.delete?
18
+ version = request.params["version"].to_i
19
+ if version < 1
20
+ respond 404, "This gem could not be found"
21
+ elsif version < 2
22
+ respond 200, "Successfully yanked gem: #{request.params["gem_name"]} (#{request.params["version"]})"
23
+ else
24
+ respond 500, "The version #{request.params["version"]} has already been yanked."
25
+ end
26
+ elsif request.path == "/api/v1/gems/unyank" && request.put?
27
+ version = request.params["version"].to_i
28
+ if version < 1
29
+ respond 404, "This gem could not be found"
30
+ elsif version < 2
31
+ respond 200, "Successfully unyanked gem: #{request.params["gem_name"]} (#{request.params["version"]})"
32
+ else
33
+ respond 500, "The version #{request.params["version"]} is already indexed."
34
+ end
35
+ elsif request.path == "/api/v1/gems/rake/owners"
36
+ if request.post?
37
+ respond 200, "Owner added successfully."
38
+ elsif request.delete?
39
+ respond 200, "Owner removed successfully."
40
+ end
41
+ elsif request.path == "/api/v1/gems/rake/owners.yaml" && request.get?
42
+ yaml = YAML.dump([{'email' => 'geddy@example.com'},
43
+ {'email' => 'lerxst@example.com'}])
44
+ respond(200, yaml)
45
+ else
46
+ respond(404, "Invalid request")
47
+ end
48
+ end
49
+ end
50
+
@@ -0,0 +1,32 @@
1
+ RSpec::Matchers.define :be_fetched do
2
+ include SpecHelpers
3
+ match do |name|
4
+ File.exist?(spade_dir("cache", "#{name}.gem")) == true
5
+ end
6
+ end
7
+
8
+ RSpec::Matchers.define :be_unpacked do
9
+ match do |name|
10
+ File.directory?(spade_dir("gems", name)) == true
11
+ end
12
+ end
13
+
14
+ RSpec::Matchers.define :exist do
15
+ match do |name|
16
+ File.exist?(name) == true
17
+ end
18
+ end
19
+
20
+ RSpec::Matchers.define :have_error do |error|
21
+ match do |package|
22
+ package.valid? == false &&
23
+ package.errors.size.should == 1 &&
24
+ package.errors.first.include?(error) == true
25
+ end
26
+ end
27
+
28
+ # Make sure matchers can get to the path helpers
29
+ class RSpec::Matchers::Matcher
30
+ include SpecHelpers
31
+ end
32
+
@@ -0,0 +1,61 @@
1
+ module SpecHelpers
2
+ def reset!
3
+ FileUtils.rm_rf tmp
4
+ [ home, local ].each do |dir|
5
+ FileUtils.mkdir_p(dir)
6
+ end
7
+ end
8
+
9
+ def cd(path, &blk)
10
+ Dir.chdir(path, &blk)
11
+ end
12
+
13
+ def cwd(*args)
14
+ Pathname.new(Dir.pwd).join(*args)
15
+ end
16
+
17
+ def rm(path)
18
+ FileUtils.rm path
19
+ end
20
+
21
+ def rm_r(path)
22
+ FileUtils.rm_r path
23
+ end
24
+
25
+ def rm_rf(path)
26
+ FileUtils.rm_rf(path)
27
+ end
28
+
29
+ def root
30
+ @root ||= Pathname.new(File.expand_path("../../..", __FILE__))
31
+ end
32
+
33
+ def fixtures(*path)
34
+ root.join('spec/fixtures', *path)
35
+ end
36
+
37
+ def tmp(*path)
38
+ root.join("tmp", *path)
39
+ end
40
+
41
+ def home(*path)
42
+ tmp.join("home", *path)
43
+ end
44
+
45
+ def local(*path)
46
+ tmp.join("local", *path)
47
+ end
48
+
49
+ def spade_dir(*path)
50
+ home(Spade::SPADE_DIR, *path)
51
+ end
52
+
53
+ def goto_home
54
+ cd(home)
55
+ env["HOME"] = home.to_s
56
+ LibGems.clear_paths
57
+ end
58
+
59
+ module_function :root, :tmp, :home, :local, :goto_home
60
+ end
61
+
@@ -0,0 +1,19 @@
1
+ Copyright (c) <%= current_year %> YOUR NAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
@@ -0,0 +1,21 @@
1
+ # <%= name %>
2
+
3
+ ### Description:
4
+
5
+ FIX (describe your package)
6
+
7
+ ### Features / Problems:
8
+
9
+ * FIX (list of features or problems)
10
+
11
+ ### Synopsis:
12
+
13
+ FIX (code sample of usage)
14
+
15
+ ### Requirements:
16
+
17
+ * FIX (list of requirements)
18
+
19
+ ### Install:
20
+
21
+ * FIX (describe how to install)