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
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ tmp
2
+ devbin
data/.gitmodules ADDED
@@ -0,0 +1,6 @@
1
+ [submodule "packages/optparse"]
2
+ path = packages/optparse
3
+ url = https://github.com/qrush/optparse-js.git
4
+ [submodule "packages/coffee-script"]
5
+ path = packages/coffee-script
6
+ url = https://github.com/charlesjolley/coffee-script.git
data/bin/spadepkg ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
3
+ $:.unshift(lib) if File.exists?(lib)
4
+
5
+ require 'spade/packager'
6
+
7
+ Spade::Packager::CLI::Base.start
8
+
@@ -0,0 +1,8 @@
1
+ require 'libgems_ext/libgems'
2
+ require 'libgems_ext/config_file'
3
+ require 'libgems_ext/dependency_installer'
4
+ require 'libgems_ext/installer'
5
+ require 'libgems_ext/spec_fetcher'
6
+
7
+ # Reload from new paths
8
+ LibGems.load_configuration
@@ -0,0 +1,33 @@
1
+ require 'libgems/config_file'
2
+
3
+ module LibGems
4
+ class ConfigFile
5
+
6
+ # Duplicate, with slight work-arounds, but needed for SYSTEM_WIDE_CONFIG_FILE
7
+ system_config_path =
8
+ if defined?(Win32API) # Already required in original version
9
+ CSIDL_COMMON_APPDATA = 0x0023
10
+ path = 0.chr * 260
11
+ if RUBY_VERSION > '1.9' then
12
+ SHGetFolderPath = Win32API.new 'shell32', 'SHGetFolderPath', 'PLPLP',
13
+ 'L', :stdcall
14
+ SHGetFolderPath.call nil, CSIDL_COMMON_APPDATA, nil, 1, path
15
+ else
16
+ SHGetFolderPath = Win32API.new 'shell32', 'SHGetFolderPath', 'LLLLP',
17
+ 'L'
18
+ SHGetFolderPath.call 0, CSIDL_COMMON_APPDATA, 0, 1, path
19
+ end
20
+
21
+ path.strip
22
+ else
23
+ '/etc'
24
+ end
25
+
26
+ remove_const(:SYSTEM_WIDE_CONFIG_FILE)
27
+ SYSTEM_WIDE_CONFIG_FILE = File.join system_config_path, 'spaderc'
28
+
29
+ def credentials_path
30
+ File.join(LibGems.user_dir, "credentials")
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,150 @@
1
+ require 'libgems/dependency_installer'
2
+
3
+ module LibGems
4
+ class DependencyInstaller
5
+
6
+ # Had to overwrite this all just to change the match from /gem$/ to /spd$/
7
+ # TODO: Consider whether extension should be settable in LibGems
8
+ def find_spec_by_name_and_version(gem_name,
9
+ version = LibGems::Requirement.default,
10
+ prerelease = false)
11
+ spec_and_source = nil
12
+
13
+ glob = if File::ALT_SEPARATOR then
14
+ gem_name.gsub File::ALT_SEPARATOR, File::SEPARATOR
15
+ else
16
+ gem_name
17
+ end
18
+
19
+ local_gems = Dir["#{glob}*"].sort.reverse
20
+
21
+ unless local_gems.empty? then
22
+ local_gems.each do |gem_file|
23
+ next unless gem_file =~ /spd$/
24
+ begin
25
+ spec = LibGems::Format.from_file_by_path(gem_file).spec
26
+ spec_and_source = [spec, gem_file]
27
+ break
28
+ rescue SystemCallError, LibGems::Package::FormatError
29
+ end
30
+ end
31
+ end
32
+
33
+ if spec_and_source.nil? then
34
+ dep = LibGems::Dependency.new gem_name, version
35
+ dep.prerelease = true if prerelease
36
+ spec_and_sources = find_gems_with_sources(dep).reverse
37
+
38
+ spec_and_source = spec_and_sources.find { |spec, source|
39
+ LibGems::Platform.match spec.platform
40
+ }
41
+ end
42
+
43
+ if spec_and_source.nil? then
44
+ raise LibGems::GemNotFoundException.new(
45
+ "Could not find a valid spd '#{gem_name}' (#{version}) locally or in a repository",
46
+ gem_name, version, @errors)
47
+ end
48
+
49
+ @specs_and_sources = [spec_and_source]
50
+ end
51
+
52
+ # Overwrite this to use our custom installer
53
+ def install dep_or_name, version = LibGems::Requirement.default
54
+ LibGems.with_rubygems_compat do
55
+ if String === dep_or_name then
56
+ find_spec_by_name_and_version dep_or_name, version, @prerelease
57
+ else
58
+ dep_or_name.prerelease = @prerelease
59
+ @specs_and_sources = [find_gems_with_sources(dep_or_name).last]
60
+ end
61
+
62
+ @installed_gems = []
63
+
64
+ gather_dependencies
65
+
66
+ @gems_to_install.each do |spec|
67
+ last = spec == @gems_to_install.last
68
+ # HACK is this test for full_name acceptable?
69
+ next if @source_index.any? { |n,_| n == spec.full_name } and not last
70
+
71
+ # TODO: make this sorta_verbose so other users can benefit from it
72
+ say "Installing spd #{spec.full_name}" if LibGems.configuration.really_verbose
73
+
74
+ _, source_uri = @specs_and_sources.assoc spec
75
+ begin
76
+ local_gem_path = LibGems::RemoteFetcher.fetcher.download spec, source_uri,
77
+ @cache_dir
78
+ rescue LibGems::RemoteFetcher::FetchError
79
+ next if @force
80
+ raise
81
+ end
82
+
83
+ inst = LibGems::Installer.new local_gem_path,
84
+ :bin_dir => @bin_dir,
85
+ :development => @development,
86
+ :env_shebang => @env_shebang,
87
+ :force => @force,
88
+ :format_executable => @format_executable,
89
+ :ignore_dependencies => @ignore_dependencies,
90
+ :install_dir => @install_dir,
91
+ :security_policy => @security_policy,
92
+ :source_index => @source_index,
93
+ :user_install => @user_install,
94
+ :wrappers => @wrappers
95
+
96
+ spec = inst.install
97
+
98
+ @installed_gems << spec
99
+ end
100
+
101
+ @installed_gems
102
+ end
103
+ end
104
+
105
+ def find_gems_with_sources(dep)
106
+ # Reset the errors
107
+ @errors = nil
108
+ gems_and_sources = []
109
+
110
+ if @domain == :both or @domain == :local then
111
+ Dir[File.join(Dir.pwd, "#{dep.name}-[0-9]*.spd")].each do |gem_file|
112
+ spec = LibGems::Format.from_file_by_path(gem_file).spec
113
+ gems_and_sources << [spec, gem_file] if spec.name == dep.name
114
+ end
115
+ end
116
+
117
+ if @domain == :both or @domain == :remote then
118
+ begin
119
+ requirements = dep.requirement.requirements.map do |req, ver|
120
+ req
121
+ end
122
+
123
+ all = !dep.prerelease? &&
124
+ # we only need latest if there's one requirement and it is
125
+ # guaranteed to match the newest specs
126
+ (requirements.length > 1 or
127
+ (requirements.first != ">=" and requirements.first != ">"))
128
+
129
+ found, @errors = LibGems::SpecFetcher.fetcher.fetch_with_errors dep, all, true, dep.prerelease?
130
+
131
+ gems_and_sources.push(*found)
132
+
133
+ rescue LibGems::RemoteFetcher::FetchError => e
134
+ if LibGems.configuration.really_verbose then
135
+ say "Error fetching remote data:\t\t#{e.message}"
136
+ say "Falling back to local-only install"
137
+ end
138
+ @domain = :local
139
+ end
140
+ end
141
+
142
+ gems_and_sources.sort_by do |gem, source|
143
+ [gem, source =~ /^http:\/\// ? 0 : 1] # local gems win
144
+ end
145
+ end
146
+
147
+ end
148
+ end
149
+
150
+
@@ -0,0 +1,39 @@
1
+ require 'libgems/installer'
2
+
3
+ module LibGems
4
+ class Installer
5
+
6
+ def app_script_text(bin_file_name)
7
+ <<-TEXT
8
+ #{shebang bin_file_name}
9
+ #
10
+ # This file was generated by Spade.
11
+ #
12
+ # The application '#{@spec.name}' is installed as part of an spd, and
13
+ # this file is here to facilitate running it.
14
+ #
15
+
16
+ version = "#{LibGems::Requirement.default}"
17
+
18
+ if ARGV.first =~ /^_(.*)_$/ and LibGems::Version.correct? $1 then
19
+ version = $1
20
+ ARGV.shift
21
+ end
22
+
23
+ gem '#{@spec.name}', version
24
+
25
+ path = LibGems.bin_path('#{@spec.name}', '#{bin_file_name}', version)
26
+ shebang = File.open(path){|f| f.readline }
27
+
28
+ if shebang =~ /^\#\!.*ruby/
29
+ load path
30
+ else
31
+ exec path, *ARGV
32
+ end
33
+ TEXT
34
+ end
35
+
36
+ end
37
+ end
38
+
39
+
@@ -0,0 +1,39 @@
1
+ require 'libgems'
2
+
3
+ module LibGems
4
+ def self.default_sources
5
+ %w[https://sproutcutter.heroku.com/]
6
+ end
7
+
8
+ def self.host
9
+ @host ||= "https://sproutcutter.heroku.com"
10
+ end
11
+
12
+ def self.default_dir
13
+ File.join LibGems.user_home, Spade::SPADE_DIR
14
+ end
15
+
16
+ def self.user_dir
17
+ File.join LibGems.user_home, Spade::SPADE_DIR
18
+ end
19
+
20
+ def self.config_file
21
+ File.join LibGems.user_home, '.spaderc'
22
+ end
23
+
24
+ def self.path
25
+ @gem_path ||= nil
26
+
27
+ unless @gem_path then
28
+ paths = [ENV['SPADE_PATH'] || LibGems.configuration.path || default_path]
29
+ set_paths paths.compact.join(File::PATH_SEPARATOR)
30
+ end
31
+
32
+ @gem_path
33
+ end
34
+
35
+ def self.dir
36
+ set_home(ENV['SPADE_HOME'] || LibGems.configuration.home || default_dir) unless @gem_home
37
+ @gem_home
38
+ end
39
+ end
@@ -0,0 +1,11 @@
1
+ require 'libgems/spec_fetcher'
2
+
3
+ module LibGems
4
+ class SpecFetcher
5
+ alias :orig_initialize :initialize
6
+ def initialize(*args)
7
+ orig_initialize(*args)
8
+ @dir = File.join LibGems.dir, 'specs'
9
+ end
10
+ end
11
+ end
@@ -0,0 +1 @@
1
+ require 'spade/packager'
@@ -0,0 +1,18 @@
1
+ require 'spade/core'
2
+ require 'libgems'
3
+ require 'libgems_ext'
4
+
5
+ module Spade
6
+ module Packager
7
+ TEMPLATES_DIR = File.expand_path("../../../templates", __FILE__)
8
+
9
+ autoload :CLI, 'spade/packager/cli'
10
+ autoload :Credentials, 'spade/packager/credentials'
11
+ autoload :Local, 'spade/packager/local'
12
+ autoload :Package, 'spade/packager/package'
13
+ autoload :Remote, 'spade/packager/remote'
14
+ autoload :Repository, 'spade/packager/repository'
15
+ autoload :Version, 'spade/packager/version'
16
+ end
17
+ end
18
+
@@ -0,0 +1,9 @@
1
+ module Spade
2
+ module Packager
3
+ module CLI
4
+ autoload :Base, 'spade/packager/cli/base'
5
+ autoload :Owner, 'spade/packager/cli/owner'
6
+ autoload :ProjectGenerator, 'spade/packager/cli/project_generator'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,196 @@
1
+ require 'thor'
2
+ require 'highline'
3
+
4
+ module Spade
5
+ module Packager
6
+ module CLI
7
+ LOGIN_MESSAGE = "Please login first with `spade login`."
8
+
9
+ class Base < Thor
10
+
11
+ class_option :verbose, :type => :boolean, :default => false,
12
+ :aliases => ['-V'],
13
+ :desc => 'Show additional debug information while running'
14
+
15
+ desc "owner", "Manage users for a package"
16
+ subcommand "owner", Spade::Packager::CLI::Owner
17
+
18
+ desc "install [PACKAGE]", "Installs one or many spade packages"
19
+ method_option :version, :type => :string, :default => ">= 0", :aliases => ['-v'], :desc => 'Specify a version to install'
20
+ method_option :prerelease, :type => :boolean, :default => false, :aliases => ['--pre'], :desc => 'Install a prerelease version'
21
+ def install(*packages)
22
+ report_arity_error("install") and return if packages.size.zero?
23
+
24
+ begin
25
+ packages.each do |package|
26
+ installed = Spade::Packager::Remote.new.install(package, options[:version], options[:prerelease])
27
+ installed.each do |spec|
28
+ say "Successfully installed #{spec.full_name}"
29
+ end
30
+ end
31
+ rescue LibGems::InstallError => e
32
+ abort "Install error: #{e}"
33
+ rescue LibGems::GemNotFoundException => e
34
+ abort "Can't find package #{e.name} #{e.version} available for install"
35
+ rescue Errno::EACCES, LibGems::FilePermissionError => e
36
+ abort e.message
37
+ end
38
+ end
39
+
40
+ desc "installed [PACKAGE]", "Shows what spade packages are installed"
41
+ def installed(*packages)
42
+ local = Spade::Packager::Local.new
43
+ index = local.installed(packages)
44
+ print_specs(packages, index)
45
+ end
46
+
47
+ desc "uninstall [PACKAGE]", "Uninstalls one or many packages"
48
+ def uninstall(*packages)
49
+ local = Spade::Packager::Local.new
50
+ if packages.size > 0
51
+ packages.each do |package|
52
+ if !local.uninstall(package)
53
+ abort %{No packages installed named "#{package}"}
54
+ end
55
+ end
56
+ else
57
+ report_arity_error('uninstall')
58
+ end
59
+ end
60
+
61
+ desc "login", "Log in with your Spade credentials"
62
+ def login
63
+ highline = HighLine.new
64
+ say "Enter your Spade credentials."
65
+
66
+ begin
67
+ email = highline.ask "\nEmail:" do |q|
68
+ next unless STDIN.tty?
69
+ q.readline = true
70
+ end
71
+
72
+ password = highline.ask "\nPassword:" do |q|
73
+ next unless STDIN.tty?
74
+ q.echo = "*"
75
+ end
76
+ rescue Interrupt => ex
77
+ abort "Cancelled login."
78
+ end
79
+
80
+ say "\nLogging in as #{email}..."
81
+
82
+ if Spade::Packager::Remote.new.login(email, password)
83
+ say "Logged in!"
84
+ else
85
+ say "Incorrect email or password."
86
+ login
87
+ end
88
+ end
89
+
90
+ desc "push", "Distribute your spade package"
91
+ def push(package)
92
+ remote = Spade::Packager::Remote.new
93
+ if remote.logged_in?
94
+ say remote.push(package)
95
+ else
96
+ say LOGIN_MESSAGE
97
+ end
98
+ end
99
+
100
+ desc "yank", "Remove a specific package version release from SproutCutter"
101
+ method_option :version, :type => :string, :default => nil, :aliases => ['-v'], :desc => 'Specify a version to yank'
102
+ method_option :undo, :type => :boolean, :default => false, :desc => 'Unyank package'
103
+ def yank(package)
104
+ if options[:version]
105
+ remote = Spade::Packager::Remote.new
106
+ if remote.logged_in?
107
+ if options[:undo]
108
+ say remote.unyank(package, options[:version])
109
+ else
110
+ say remote.yank(package, options[:version])
111
+ end
112
+ else
113
+ say LOGIN_MESSAGE
114
+ end
115
+ else
116
+ say "Version required"
117
+ end
118
+ end
119
+
120
+ desc "list", "View available packages for download"
121
+ method_option :all, :type => :boolean, :default => false, :aliases => ['-a'], :desc => 'List all versions available'
122
+ method_option :prerelease, :type => :boolean, :default => false, :aliases => ['--pre'], :desc => 'List prerelease versions available'
123
+ def list(*packages)
124
+ remote = Spade::Packager::Remote.new
125
+ index = remote.list_packages(packages, options[:all], options[:prerelease])
126
+ print_specs(packages, index)
127
+ end
128
+
129
+ desc "new [NAME]", "Generate a new project skeleton"
130
+ def new(name)
131
+ ProjectGenerator.new(self,
132
+ name, File.expand_path(name)).run
133
+ end
134
+
135
+ desc "build", "Build a spade package from a package.json"
136
+ def build
137
+ local = Spade::Packager::Local.new
138
+ if local.logged_in?
139
+ package = local.pack("package.json")
140
+ if package.errors.empty?
141
+ puts "Successfully built package: #{package.to_ext}"
142
+ else
143
+ failure_message = "Spade encountered the following problems building your package:"
144
+ package.errors.each do |error|
145
+ failure_message << "\n* #{error}"
146
+ end
147
+ abort failure_message
148
+ end
149
+ else
150
+ abort LOGIN_MESSAGE
151
+ end
152
+ end
153
+
154
+ desc "unpack [PACKAGE]", "Extract files from a spade package"
155
+ method_option :target, :type => :string, :default => ".", :aliases => ['-t'], :desc => 'Unpack to given directory'
156
+ def unpack(*paths)
157
+ local = Spade::Packager::Local.new
158
+
159
+ paths.each do |path|
160
+ begin
161
+ package = local.unpack(path, options[:target])
162
+ unpack_path = File.expand_path(File.join(Dir.pwd, options[:target], package.to_full_name))
163
+ puts "Unpacked spade into: #{unpack_path}"
164
+ rescue Errno::EACCES, LibGems::FilePermissionError => ex
165
+ abort "There was a problem unpacking #{path}:\n#{ex.message}"
166
+ end
167
+ end
168
+ end
169
+
170
+ private
171
+
172
+ def report_arity_error(name)
173
+ self.class.handle_argument_error(self.class.tasks[name], nil)
174
+ end
175
+
176
+ def print_specs(packages, index)
177
+ spades = {}
178
+
179
+ index.each do |(name, version, platform)|
180
+ spades[name] ||= []
181
+ spades[name] << version
182
+ end
183
+
184
+ if spades.size.zero?
185
+ abort %{No packages found matching "#{packages.join('", "')}".}
186
+ else
187
+ spades.each do |name, versions|
188
+ puts "#{name} (#{versions.sort.reverse.join(", ")})"
189
+ end
190
+ end
191
+ end
192
+
193
+ end
194
+ end
195
+ end
196
+ end