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,46 @@
1
+ module Spade::Packager::CLI
2
+ class Owner < Thor
3
+ default_task :list
4
+
5
+ desc "list [PACKAGE]", "Display owners of a package"
6
+ def list(package)
7
+ remote = Spade::Packager::Remote.new
8
+ if remote.logged_in?
9
+ yaml = remote.list_owners(package)
10
+ owners = YAML.load(yaml)
11
+
12
+ if owners.is_a?(Array)
13
+ say "Owners for package: #{package}"
14
+ owners.each do |owner|
15
+ say "- #{owner['email']}"
16
+ end
17
+ else
18
+ say owners
19
+ end
20
+ else
21
+ abort LOGIN_MESSAGE
22
+ end
23
+ end
24
+
25
+ desc "add [PACKAGE] [EMAIL]", "Allow another user to push new versions of your spade package"
26
+ def add(package, email)
27
+ remote = Spade::Packager::Remote.new
28
+ if remote.logged_in?
29
+ say remote.add_owner(package, email)
30
+ else
31
+ abort LOGIN_MESSAGE
32
+ end
33
+ end
34
+
35
+ desc "remove [PACKAGE] [EMAIL]", "Allow another user to push new versions of your spade package"
36
+ def remove(package, email)
37
+ remote = Spade::Packager::Remote.new
38
+ if remote.logged_in?
39
+ say remote.remove_owner(package, email)
40
+ else
41
+ abort LOGIN_MESSAGE
42
+ end
43
+ end
44
+ end
45
+ end
46
+
@@ -0,0 +1,117 @@
1
+ module Spade::Packager::CLI
2
+ class ProjectGenerator
3
+ include Thor::Actions
4
+
5
+ source_root File.join(TEMPLATES_DIR, 'project')
6
+
7
+ attr_reader :name
8
+
9
+ def initialize(thor, name, root)
10
+ @thor, @name, @root = thor, name, root
11
+
12
+ self.destination_root = root
13
+ end
14
+
15
+ def run
16
+ empty_directory '.'
17
+ FileUtils.cd(destination_root)
18
+
19
+ template "LICENSE"
20
+ template "README.md"
21
+ template "project.json"
22
+
23
+ empty_directory "lib"
24
+ empty_directory "tests"
25
+
26
+ inside "lib" do
27
+ template "main.js"
28
+ end
29
+
30
+ inside "tests" do
31
+ template "main-test.js"
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def app_const
38
+ name.gsub(/\W|-/, '_').squeeze('_').gsub(/(?:^|_)(.)/) { $1.upcase }
39
+ end
40
+
41
+ def current_year
42
+ Time.now.year
43
+ end
44
+
45
+ def source_paths
46
+ [File.expand_path('../../templates/project', __FILE__)] +
47
+ @thor.source_paths
48
+ end
49
+
50
+ def respond_to?(*args)
51
+ super || @thor.respond_to?(*args)
52
+ end
53
+
54
+ def method_missing(name, *args, &blk)
55
+ @thor.send(name, *args, &blk)
56
+ end
57
+ end
58
+ end
59
+ module Spade::CLI
60
+ class ProjectGenerator
61
+ include Thor::Actions
62
+
63
+ source_root File.expand_path('../../templates/project', __FILE__)
64
+
65
+ attr_reader :name
66
+
67
+ def initialize(thor, name, root)
68
+ @thor, @name, @root = thor, name, root
69
+
70
+ self.destination_root = root
71
+ end
72
+
73
+ def run
74
+ empty_directory '.'
75
+ FileUtils.cd(destination_root)
76
+
77
+ template "LICENSE"
78
+ template "README.md"
79
+ template "project.json"
80
+
81
+ empty_directory "lib"
82
+ empty_directory "tests"
83
+
84
+ inside "lib" do
85
+ template "main.js"
86
+ end
87
+
88
+ inside "tests" do
89
+ template "main-test.js"
90
+ end
91
+ end
92
+
93
+ private
94
+
95
+ def app_const
96
+ name.gsub(/\W|-/, '_').squeeze('_').gsub(/(?:^|_)(.)/) { $1.upcase }
97
+ end
98
+
99
+ def current_year
100
+ Time.now.year
101
+ end
102
+
103
+ def source_paths
104
+ [File.expand_path('../../templates/project', __FILE__)] +
105
+ @thor.source_paths
106
+ end
107
+
108
+ def respond_to?(*args)
109
+ super || @thor.respond_to?(*args)
110
+ end
111
+
112
+ def method_missing(name, *args, &blk)
113
+ @thor.send(name, *args, &blk)
114
+ end
115
+ end
116
+ end
117
+
@@ -0,0 +1,38 @@
1
+ module Spade
2
+ module Packager
3
+ class Credentials
4
+ attr_reader :email, :api_key
5
+
6
+ def initialize
7
+ parse
8
+ end
9
+
10
+ def save(email, api_key)
11
+ @email = email
12
+ @api_key = api_key
13
+ write
14
+ end
15
+
16
+ private
17
+
18
+ def write
19
+ FileUtils.mkdir_p(File.dirname(path))
20
+ File.open(path, "w") do |file|
21
+ file.write YAML.dump(:spade_api_key => api_key, :spade_email => email)
22
+ end
23
+ end
24
+
25
+ def path
26
+ LibGems.configuration.credentials_path
27
+ end
28
+
29
+ def parse
30
+ if File.exist?(path)
31
+ hash = YAML.load_file(path)
32
+ @email = hash[:spade_email]
33
+ @api_key = hash[:spade_api_key]
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,50 @@
1
+ require 'libgems/uninstaller'
2
+
3
+ module Spade::Packager
4
+ class Local < Repository
5
+ def uninstall(package)
6
+ LibGems::Uninstaller.new(package).uninstall
7
+ true
8
+ rescue LibGems::InstallError
9
+ false
10
+ end
11
+
12
+ def pack(path)
13
+ package = Spade::Packager::Package.new(creds.email)
14
+ package.json_path = path
15
+ if package.valid?
16
+ silence do
17
+ LibGems::Builder.new(package.to_spec).build
18
+ end
19
+ end
20
+ package
21
+ end
22
+
23
+ def unpack(path, target)
24
+ package = Spade::Packager::Package.new
25
+ package.spade = path
26
+ unpack_dir = File.expand_path(File.join(Dir.pwd, target, package.to_full_name))
27
+ LibGems::Installer.new(path, :unpack => true).unpack unpack_dir
28
+ package
29
+ end
30
+
31
+ def installed(packages)
32
+ specs = LibGems.source_index.search dependency_for(packages)
33
+
34
+ specs.map do |spec|
35
+ [spec.name, spec.version, spec.original_platform]
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def silence
42
+ original_verbose = LibGems.configuration.verbose
43
+ LibGems.configuration.verbose = false
44
+ yield
45
+ ensure
46
+ LibGems.configuration.verbose = original_verbose
47
+ end
48
+ end
49
+ end
50
+
@@ -0,0 +1,160 @@
1
+ require 'json'
2
+
3
+ module Spade::Packager
4
+ class Package
5
+ EXT = "spd"
6
+ METADATA = %w[keywords licenses engines main bin directories]
7
+ FIELDS = %w[name version description author homepage summary]
8
+ attr_accessor :metadata, :lib_path, :test_path, :errors, :json_path, :attributes, :directories, :dependencies
9
+ attr_accessor *FIELDS
10
+
11
+ def initialize(email = "")
12
+ @email = email
13
+ end
14
+
15
+ def spade=(path)
16
+ format = LibGems::Format.from_file_by_path(path)
17
+ fill_from_gemspec(format.spec)
18
+ end
19
+
20
+ def to_spec
21
+ return unless valid?
22
+ LibGems::Specification.new do |spec|
23
+ spec.name = name
24
+ spec.version = version
25
+ spec.authors = [author]
26
+ spec.email = @email
27
+ spec.homepage = homepage
28
+ spec.summary = summary
29
+ spec.description = description
30
+ spec.requirements = [metadata.to_json]
31
+ spec.files = directory_files + ["package.json"]
32
+ spec.test_files = glob_files(test_path) if test_path
33
+ spec.bindir = bin_path
34
+ spec.executables = bin_files.map{|p| File.basename(p) } if bin_path
35
+ spec.rubyforge_project = "spade"
36
+ def spec.file_name
37
+ "#{full_name}.#{EXT}"
38
+ end
39
+ dependencies.each{|d,v| spec.add_dependency(d, v) } if dependencies
40
+ end
41
+ end
42
+
43
+ def as_json(options = {})
44
+ json = self.metadata.clone
45
+ FIELDS.each{|key| json[key] = send(key)}
46
+ json["dependencies"] = self.dependencies
47
+ json
48
+ end
49
+
50
+ def to_full_name
51
+ "#{name}-#{version}"
52
+ end
53
+
54
+ def to_ext
55
+ "#{self.to_full_name}.#{EXT}"
56
+ end
57
+
58
+ def errors
59
+ @errors ||= []
60
+ end
61
+
62
+ def validate
63
+ validate_fields && validate_version && validate_paths
64
+ end
65
+
66
+ def valid?
67
+ read && parse && validate
68
+ end
69
+
70
+ private
71
+
72
+ def directory_files
73
+ directories.values.map{|dir| glob_files(dir) }.flatten
74
+ end
75
+
76
+ def bin_files
77
+ if @attributes["bin"]
78
+ @attributes["bin"].values
79
+ else
80
+ []
81
+ end
82
+ end
83
+
84
+ def bin_path
85
+ @directories["bin"] || "bin"
86
+ end
87
+
88
+ def lib_path
89
+ @directories["lib"]
90
+ end
91
+
92
+ def test_path
93
+ @directories["test"]
94
+ end
95
+
96
+ def parse
97
+ FIELDS.each do |field|
98
+ send("#{field}=", @attributes[field])
99
+ end
100
+
101
+ self.dependencies = @attributes["dependencies"] || {}
102
+ self.directories = @attributes["directories"] || {}
103
+ self.metadata = Hash[*@attributes.select { |k, v| METADATA.include?(k) }.flatten(1)]
104
+ end
105
+
106
+ def read
107
+ @attributes = JSON.parse(File.read(@json_path))
108
+ rescue *[JSON::ParserError, Errno::EACCES, Errno::ENOENT] => ex
109
+ add_error "There was a problem parsing package.json: #{ex.message}"
110
+ end
111
+
112
+ def validate_paths
113
+ %w[lib test].all? do |directory|
114
+ path = send("#{directory}_path")
115
+ if path.nil? || File.directory?(File.join(Dir.pwd, path))
116
+ true
117
+ else
118
+ add_error "'#{path}' specified for #{directory} directory, is not a directory"
119
+ end
120
+ end
121
+ end
122
+
123
+ def validate_version
124
+ LibGems::Version.new(version)
125
+ true
126
+ rescue ArgumentError => ex
127
+ add_error ex.to_s
128
+ end
129
+
130
+ def validate_fields
131
+ %w[name description summary homepage author version directories].all? do |field|
132
+ value = send(field)
133
+ if value.nil? || value.size.zero?
134
+ add_error "Package requires a '#{field}' field"
135
+ else
136
+ true
137
+ end
138
+ end
139
+ end
140
+
141
+ def add_error(message)
142
+ self.errors << message
143
+ false
144
+ end
145
+
146
+ def glob_files(path)
147
+ Dir[File.join(path, "**", "*")].reject{|f| File.directory?(f) }
148
+ end
149
+
150
+ def fill_from_gemspec(spec)
151
+ FIELDS.each{|field| send("#{field}=", spec.send(field).to_s) }
152
+
153
+ self.dependencies = {}
154
+ spec.dependencies.each{|d| self.dependencies[d.name] = d.requirement.to_s }
155
+
156
+ self.metadata = JSON.parse(spec.requirements.first)
157
+ end
158
+ end
159
+ end
160
+
@@ -0,0 +1,98 @@
1
+ module Spade::Packager
2
+ class Remote < Repository
3
+ include LibGems::UserInteraction
4
+
5
+ def login(email, password)
6
+ response = raw_request :get, "api/v1/api_key" do |req|
7
+ req.basic_auth email, password
8
+ end
9
+
10
+ case response
11
+ when Net::HTTPSuccess
12
+ creds.save(email, response.body)
13
+ true
14
+ else
15
+ false
16
+ end
17
+ end
18
+
19
+ def push(package)
20
+ begin
21
+ body = LibGems.read_binary package
22
+ LibGems::Format.from_file_by_path(package)
23
+ rescue Exception => ex
24
+ return "There was a problem opening your package.\n#{ex.class}: #{ex.to_s}"
25
+ end
26
+
27
+ request :post, "api/v1/gems" do |req|
28
+ req.body = body
29
+ req.add_field "Content-Length", body.size
30
+ req.add_field "Content-Type", "application/octet-stream"
31
+ req.add_field "Authorization", creds.api_key
32
+ end
33
+ end
34
+
35
+ def yank(package, version)
36
+ request :delete, "api/v1/gems/yank" do |req|
37
+ req.set_form_data 'gem_name' => package, 'version' => version
38
+ req.add_field "Authorization", creds.api_key
39
+ end
40
+ end
41
+
42
+ def unyank(package, version)
43
+ request :put, "api/v1/gems/unyank" do |req|
44
+ req.set_form_data 'gem_name' => package, 'version' => version
45
+ req.add_field "Authorization", creds.api_key
46
+ end
47
+ end
48
+
49
+ def add_owner(package, email)
50
+ request :post, "api/v1/gems/#{package}/owners" do |req|
51
+ req.set_form_data 'email' => email
52
+ req.add_field "Authorization", creds.api_key
53
+ end
54
+ end
55
+
56
+ def remove_owner(package, email)
57
+ request :delete, "api/v1/gems/#{package}/owners" do |req|
58
+ req.set_form_data 'email' => email
59
+ req.add_field "Authorization", creds.api_key
60
+ end
61
+ end
62
+
63
+ def list_owners(package)
64
+ request :get, "api/v1/gems/#{package}/owners.yaml" do |req|
65
+ req.add_field "Authorization", creds.api_key
66
+ end
67
+ end
68
+
69
+ def list_packages(packages, all, prerelease)
70
+ fetcher = LibGems::SpecFetcher.fetcher
71
+ fetcher.find_matching(dependency_for(packages), all, false, prerelease).map(&:first)
72
+ end
73
+
74
+ def install(package, version, prerelease)
75
+ inst = LibGems::DependencyInstaller.new(:prerelease => prerelease)
76
+ inst.install package, LibGems::Requirement.new([version])
77
+ inst.installed_gems
78
+ end
79
+
80
+ private
81
+
82
+ def raw_request(method, path, &block)
83
+ require 'net/http'
84
+ host = ENV['SPADE_HOST'] || LibGems.host
85
+ uri = URI.parse "#{host}/#{path}"
86
+
87
+ request_method = Net::HTTP.const_get method.to_s.capitalize
88
+
89
+ LibGems::RemoteFetcher.fetcher.request(uri, request_method, &block)
90
+ end
91
+
92
+ def request(method, path, &block)
93
+ response = raw_request(method, path, &block)
94
+ response.body
95
+ end
96
+ end
97
+ end
98
+