static 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. checksums.yaml +7 -0
  2. data/bin/static +11 -0
  3. data/lib/static/cli.rb +2 -2
  4. data/lib/static/version.rb +1 -1
  5. data/vendor/cfoundry-0.5.2/LICENSE +746 -0
  6. data/vendor/cfoundry-0.5.2/Rakefile +38 -0
  7. data/vendor/cfoundry-0.5.2/lib/cc_api_stub/applications.rb +53 -0
  8. data/vendor/cfoundry-0.5.2/lib/cc_api_stub/domains.rb +16 -0
  9. data/vendor/cfoundry-0.5.2/lib/cc_api_stub/frameworks.rb +22 -0
  10. data/vendor/cfoundry-0.5.2/lib/cc_api_stub/helper.rb +131 -0
  11. data/vendor/cfoundry-0.5.2/lib/cc_api_stub/login.rb +21 -0
  12. data/vendor/cfoundry-0.5.2/lib/cc_api_stub/organization_users.rb +21 -0
  13. data/vendor/cfoundry-0.5.2/lib/cc_api_stub/organizations.rb +70 -0
  14. data/vendor/cfoundry-0.5.2/lib/cc_api_stub/routes.rb +26 -0
  15. data/vendor/cfoundry-0.5.2/lib/cc_api_stub/runtimes.rb +22 -0
  16. data/vendor/cfoundry-0.5.2/lib/cc_api_stub/service_bindings.rb +22 -0
  17. data/vendor/cfoundry-0.5.2/lib/cc_api_stub/service_instances.rb +22 -0
  18. data/vendor/cfoundry-0.5.2/lib/cc_api_stub/services.rb +25 -0
  19. data/vendor/cfoundry-0.5.2/lib/cc_api_stub/spaces.rb +49 -0
  20. data/vendor/cfoundry-0.5.2/lib/cc_api_stub/users.rb +84 -0
  21. data/vendor/cfoundry-0.5.2/lib/cc_api_stub.rb +17 -0
  22. data/vendor/cfoundry-0.5.2/lib/cfoundry/auth_token.rb +63 -0
  23. data/vendor/cfoundry-0.5.2/lib/cfoundry/baseclient.rb +201 -0
  24. data/vendor/cfoundry-0.5.2/lib/cfoundry/chatty_hash.rb +46 -0
  25. data/vendor/cfoundry-0.5.2/lib/cfoundry/client.rb +46 -0
  26. data/vendor/cfoundry-0.5.2/lib/cfoundry/concerns/login_helpers.rb +13 -0
  27. data/vendor/cfoundry-0.5.2/lib/cfoundry/errors.rb +160 -0
  28. data/vendor/cfoundry-0.5.2/lib/cfoundry/rest_client.rb +299 -0
  29. data/vendor/cfoundry-0.5.2/lib/cfoundry/test_support.rb +3 -0
  30. data/vendor/cfoundry-0.5.2/lib/cfoundry/trace_helpers.rb +40 -0
  31. data/vendor/cfoundry-0.5.2/lib/cfoundry/uaaclient.rb +112 -0
  32. data/vendor/cfoundry-0.5.2/lib/cfoundry/upload_helpers.rb +186 -0
  33. data/vendor/cfoundry-0.5.2/lib/cfoundry/v1/app.rb +363 -0
  34. data/vendor/cfoundry-0.5.2/lib/cfoundry/v1/base.rb +71 -0
  35. data/vendor/cfoundry-0.5.2/lib/cfoundry/v1/client.rb +193 -0
  36. data/vendor/cfoundry-0.5.2/lib/cfoundry/v1/framework.rb +21 -0
  37. data/vendor/cfoundry-0.5.2/lib/cfoundry/v1/model.rb +178 -0
  38. data/vendor/cfoundry-0.5.2/lib/cfoundry/v1/model_magic.rb +129 -0
  39. data/vendor/cfoundry-0.5.2/lib/cfoundry/v1/runtime.rb +24 -0
  40. data/vendor/cfoundry-0.5.2/lib/cfoundry/v1/service.rb +39 -0
  41. data/vendor/cfoundry-0.5.2/lib/cfoundry/v1/service_instance.rb +32 -0
  42. data/vendor/cfoundry-0.5.2/lib/cfoundry/v1/service_plan.rb +19 -0
  43. data/vendor/cfoundry-0.5.2/lib/cfoundry/v1/user.rb +22 -0
  44. data/vendor/cfoundry-0.5.2/lib/cfoundry/v2/app.rb +392 -0
  45. data/vendor/cfoundry-0.5.2/lib/cfoundry/v2/base.rb +83 -0
  46. data/vendor/cfoundry-0.5.2/lib/cfoundry/v2/client.rb +138 -0
  47. data/vendor/cfoundry-0.5.2/lib/cfoundry/v2/domain.rb +11 -0
  48. data/vendor/cfoundry-0.5.2/lib/cfoundry/v2/framework.rb +14 -0
  49. data/vendor/cfoundry-0.5.2/lib/cfoundry/v2/model.rb +148 -0
  50. data/vendor/cfoundry-0.5.2/lib/cfoundry/v2/model_magic.rb +449 -0
  51. data/vendor/cfoundry-0.5.2/lib/cfoundry/v2/organization.rb +16 -0
  52. data/vendor/cfoundry-0.5.2/lib/cfoundry/v2/route.rb +15 -0
  53. data/vendor/cfoundry-0.5.2/lib/cfoundry/v2/runtime.rb +12 -0
  54. data/vendor/cfoundry-0.5.2/lib/cfoundry/v2/service.rb +19 -0
  55. data/vendor/cfoundry-0.5.2/lib/cfoundry/v2/service_auth_token.rb +9 -0
  56. data/vendor/cfoundry-0.5.2/lib/cfoundry/v2/service_binding.rb +10 -0
  57. data/vendor/cfoundry-0.5.2/lib/cfoundry/v2/service_instance.rb +14 -0
  58. data/vendor/cfoundry-0.5.2/lib/cfoundry/v2/service_plan.rb +12 -0
  59. data/vendor/cfoundry-0.5.2/lib/cfoundry/v2/space.rb +18 -0
  60. data/vendor/cfoundry-0.5.2/lib/cfoundry/v2/user.rb +64 -0
  61. data/vendor/cfoundry-0.5.2/lib/cfoundry/validator.rb +39 -0
  62. data/vendor/cfoundry-0.5.2/lib/cfoundry/version.rb +4 -0
  63. data/vendor/cfoundry-0.5.2/lib/cfoundry/zip.rb +56 -0
  64. data/vendor/cfoundry-0.5.2/lib/cfoundry.rb +2 -0
  65. data/vendor/cfoundry-0.5.2/spec/cc_api_stub/applications_spec.rb +69 -0
  66. data/vendor/cfoundry-0.5.2/spec/cc_api_stub/domains_spec.rb +19 -0
  67. data/vendor/cfoundry-0.5.2/spec/cc_api_stub/frameworks_spec.rb +19 -0
  68. data/vendor/cfoundry-0.5.2/spec/cc_api_stub/login_spec.rb +20 -0
  69. data/vendor/cfoundry-0.5.2/spec/cc_api_stub/organization_users_spec.rb +19 -0
  70. data/vendor/cfoundry-0.5.2/spec/cc_api_stub/organizations_spec.rb +97 -0
  71. data/vendor/cfoundry-0.5.2/spec/cc_api_stub/routes_spec.rb +19 -0
  72. data/vendor/cfoundry-0.5.2/spec/cc_api_stub/runtimes_spec.rb +19 -0
  73. data/vendor/cfoundry-0.5.2/spec/cc_api_stub/service_bindings_spec.rb +13 -0
  74. data/vendor/cfoundry-0.5.2/spec/cc_api_stub/service_instances_spec.rb +19 -0
  75. data/vendor/cfoundry-0.5.2/spec/cc_api_stub/services_spec.rb +12 -0
  76. data/vendor/cfoundry-0.5.2/spec/cc_api_stub/spaces_spec.rb +38 -0
  77. data/vendor/cfoundry-0.5.2/spec/cc_api_stub/users_spec.rb +107 -0
  78. data/vendor/cfoundry-0.5.2/spec/cfoundry/auth_token_spec.rb +125 -0
  79. data/vendor/cfoundry-0.5.2/spec/cfoundry/baseclient_spec.rb +225 -0
  80. data/vendor/cfoundry-0.5.2/spec/cfoundry/client_spec.rb +15 -0
  81. data/vendor/cfoundry-0.5.2/spec/cfoundry/errors_spec.rb +80 -0
  82. data/vendor/cfoundry-0.5.2/spec/cfoundry/rest_client_spec.rb +281 -0
  83. data/vendor/cfoundry-0.5.2/spec/cfoundry/trace_helpers_spec.rb +72 -0
  84. data/vendor/cfoundry-0.5.2/spec/cfoundry/uaaclient_spec.rb +332 -0
  85. data/vendor/cfoundry-0.5.2/spec/cfoundry/upload_helpers_spec.rb +174 -0
  86. data/vendor/cfoundry-0.5.2/spec/cfoundry/v1/base_spec.rb +58 -0
  87. data/vendor/cfoundry-0.5.2/spec/cfoundry/v1/client_spec.rb +17 -0
  88. data/vendor/cfoundry-0.5.2/spec/cfoundry/v1/model_magic_spec.rb +43 -0
  89. data/vendor/cfoundry-0.5.2/spec/cfoundry/v2/app_spec.rb +144 -0
  90. data/vendor/cfoundry-0.5.2/spec/cfoundry/v2/base_spec.rb +299 -0
  91. data/vendor/cfoundry-0.5.2/spec/cfoundry/v2/client_spec.rb +73 -0
  92. data/vendor/cfoundry-0.5.2/spec/cfoundry/v2/model_magic_spec.rb +173 -0
  93. data/vendor/cfoundry-0.5.2/spec/cfoundry/v2/organization_spec.rb +15 -0
  94. data/vendor/cfoundry-0.5.2/spec/cfoundry/v2/space_spec.rb +15 -0
  95. data/vendor/cfoundry-0.5.2/spec/fakes/app_fake.rb +5 -0
  96. data/vendor/cfoundry-0.5.2/spec/fakes/domain_fake.rb +5 -0
  97. data/vendor/cfoundry-0.5.2/spec/fakes/framework_fake.rb +5 -0
  98. data/vendor/cfoundry-0.5.2/spec/fakes/organization_fake.rb +5 -0
  99. data/vendor/cfoundry-0.5.2/spec/fakes/route_fake.rb +5 -0
  100. data/vendor/cfoundry-0.5.2/spec/fakes/runtime_fake.rb +5 -0
  101. data/vendor/cfoundry-0.5.2/spec/fakes/service_fake.rb +5 -0
  102. data/vendor/cfoundry-0.5.2/spec/fakes/service_instance_fake.rb +5 -0
  103. data/vendor/cfoundry-0.5.2/spec/fakes/service_plan_fake.rb +5 -0
  104. data/vendor/cfoundry-0.5.2/spec/fakes/space_fake.rb +5 -0
  105. data/vendor/cfoundry-0.5.2/spec/fakes/user_fake.rb +5 -0
  106. data/vendor/cfoundry-0.5.2/spec/fixtures/apps/with_dotfiles/xyz +1 -0
  107. data/vendor/cfoundry-0.5.2/spec/fixtures/apps/with_nested_directories/foo/bar/baz/fizz +0 -0
  108. data/vendor/cfoundry-0.5.2/spec/fixtures/apps/with_nested_directories/xyz +0 -0
  109. data/vendor/cfoundry-0.5.2/spec/fixtures/apps/with_vmcignore/ignored_dir/file_in_ignored_dir.txt +1 -0
  110. data/vendor/cfoundry-0.5.2/spec/fixtures/apps/with_vmcignore/ignored_file.txt +1 -0
  111. data/vendor/cfoundry-0.5.2/spec/fixtures/apps/with_vmcignore/non_ignored_dir/file_in_non_ignored_dir.txt +1 -0
  112. data/vendor/cfoundry-0.5.2/spec/fixtures/apps/with_vmcignore/non_ignored_dir/ignored_file.txt +1 -0
  113. data/vendor/cfoundry-0.5.2/spec/fixtures/apps/with_vmcignore/non_ignored_file.txt +1 -0
  114. data/vendor/cfoundry-0.5.2/spec/fixtures/empty_file +0 -0
  115. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_application.json +24 -0
  116. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_application_summary.json +57 -0
  117. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_created_application.json +11 -0
  118. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_created_domain.json +10 -0
  119. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_created_organization.json +11 -0
  120. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_created_route.json +13 -0
  121. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_created_service_instance.json +11 -0
  122. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_created_space.json +11 -0
  123. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_created_user.json +11 -0
  124. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_empty_search.json +7 -0
  125. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_frameworks.json +20 -0
  126. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_organization.json +144 -0
  127. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_organization_domains.json +34 -0
  128. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_organization_search.json +37 -0
  129. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_organization_summary.json +19 -0
  130. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_organization_users.json +81 -0
  131. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_runtimes.json +20 -0
  132. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_service_binding.json +22 -0
  133. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_service_bindings.json +24 -0
  134. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_service_instance.json +81 -0
  135. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_service_instances.json +0 -0
  136. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_service_types.json +124 -0
  137. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_space.json +45 -0
  138. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_space_summary.json +86 -0
  139. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_stats.json +29 -0
  140. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_user.json +112 -0
  141. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_user_organizations.json +92 -0
  142. data/vendor/cfoundry-0.5.2/spec/fixtures/fake_cc_user_with_managers.json +85 -0
  143. data/vendor/cfoundry-0.5.2/spec/spec_helper.rb +20 -0
  144. data/vendor/cfoundry-0.5.2/spec/support/fake_helper.rb +236 -0
  145. data/vendor/cfoundry-0.5.2/spec/support/randoms.rb +3 -0
  146. data/vendor/cfoundry-0.5.2/spec/support/shared_examples/cc_api_stub_request_examples.rb +79 -0
  147. data/vendor/cfoundry-0.5.2/spec/support/shared_examples/client_login_examples.rb +46 -0
  148. data/vendor/cfoundry-0.5.2/spec/support/shared_examples/model_summary_examples.rb +34 -0
  149. data/vendor/cfoundry-0.5.2/spec/support/v1_fake_helper.rb +144 -0
  150. data/vendor/cfoundry-0.5.2/vendor/errors/README.md +4 -0
  151. data/vendor/cfoundry-0.5.2/vendor/errors/v1.yml +189 -0
  152. data/vendor/cfoundry-0.5.2/vendor/errors/v2.yml +360 -0
  153. data/vendor/tunnel-vmc-plugin-0.2.2/Rakefile +39 -0
  154. data/vendor/tunnel-vmc-plugin-0.2.2/config/clients.yml +17 -0
  155. data/vendor/tunnel-vmc-plugin-0.2.2/helper-app/Gemfile +10 -0
  156. data/vendor/tunnel-vmc-plugin-0.2.2/helper-app/server.rb +43 -0
  157. data/vendor/tunnel-vmc-plugin-0.2.2/lib/tunnel-vmc-plugin/plugin.rb +178 -0
  158. data/vendor/tunnel-vmc-plugin-0.2.2/lib/tunnel-vmc-plugin/tunnel.rb +308 -0
  159. data/vendor/tunnel-vmc-plugin-0.2.2/lib/tunnel-vmc-plugin/version.rb +3 -0
  160. data/vendor/tunnel-vmc-plugin-0.2.2/spec/plugin_spec.rb +29 -0
  161. data/vendor/tunnel-vmc-plugin-0.2.2/spec/spec_helper.rb +15 -0
  162. data/vendor/vmc-0.5.0/LICENSE +1277 -0
  163. data/vendor/vmc-0.5.0/Rakefile +101 -0
  164. data/vendor/vmc-0.5.0/bin/vmc +11 -0
  165. data/vendor/vmc-0.5.0/lib/vmc/cli/app/app.rb +45 -0
  166. data/vendor/vmc-0.5.0/lib/vmc/cli/app/apps.rb +99 -0
  167. data/vendor/vmc-0.5.0/lib/vmc/cli/app/base.rb +82 -0
  168. data/vendor/vmc-0.5.0/lib/vmc/cli/app/crashes.rb +42 -0
  169. data/vendor/vmc-0.5.0/lib/vmc/cli/app/delete.rb +95 -0
  170. data/vendor/vmc-0.5.0/lib/vmc/cli/app/deprecated.rb +11 -0
  171. data/vendor/vmc-0.5.0/lib/vmc/cli/app/env.rb +78 -0
  172. data/vendor/vmc-0.5.0/lib/vmc/cli/app/files.rb +137 -0
  173. data/vendor/vmc-0.5.0/lib/vmc/cli/app/health.rb +26 -0
  174. data/vendor/vmc-0.5.0/lib/vmc/cli/app/instances.rb +53 -0
  175. data/vendor/vmc-0.5.0/lib/vmc/cli/app/logs.rb +76 -0
  176. data/vendor/vmc-0.5.0/lib/vmc/cli/app/push/create.rb +153 -0
  177. data/vendor/vmc-0.5.0/lib/vmc/cli/app/push/interactions.rb +94 -0
  178. data/vendor/vmc-0.5.0/lib/vmc/cli/app/push/sync.rb +64 -0
  179. data/vendor/vmc-0.5.0/lib/vmc/cli/app/push.rb +105 -0
  180. data/vendor/vmc-0.5.0/lib/vmc/cli/app/rename.rb +35 -0
  181. data/vendor/vmc-0.5.0/lib/vmc/cli/app/restart.rb +20 -0
  182. data/vendor/vmc-0.5.0/lib/vmc/cli/app/scale.rb +71 -0
  183. data/vendor/vmc-0.5.0/lib/vmc/cli/app/start.rb +150 -0
  184. data/vendor/vmc-0.5.0/lib/vmc/cli/app/stats.rb +67 -0
  185. data/vendor/vmc-0.5.0/lib/vmc/cli/app/stop.rb +27 -0
  186. data/vendor/vmc-0.5.0/lib/vmc/cli/domain/base.rb +12 -0
  187. data/vendor/vmc-0.5.0/lib/vmc/cli/domain/domains.rb +40 -0
  188. data/vendor/vmc-0.5.0/lib/vmc/cli/domain/map.rb +55 -0
  189. data/vendor/vmc-0.5.0/lib/vmc/cli/domain/unmap.rb +56 -0
  190. data/vendor/vmc-0.5.0/lib/vmc/cli/help.rb +15 -0
  191. data/vendor/vmc-0.5.0/lib/vmc/cli/interactive.rb +105 -0
  192. data/vendor/vmc-0.5.0/lib/vmc/cli/organization/base.rb +14 -0
  193. data/vendor/vmc-0.5.0/lib/vmc/cli/organization/create.rb +32 -0
  194. data/vendor/vmc-0.5.0/lib/vmc/cli/organization/delete.rb +73 -0
  195. data/vendor/vmc-0.5.0/lib/vmc/cli/organization/org.rb +45 -0
  196. data/vendor/vmc-0.5.0/lib/vmc/cli/organization/orgs.rb +35 -0
  197. data/vendor/vmc-0.5.0/lib/vmc/cli/organization/rename.rb +36 -0
  198. data/vendor/vmc-0.5.0/lib/vmc/cli/route/base.rb +12 -0
  199. data/vendor/vmc-0.5.0/lib/vmc/cli/route/map.rb +80 -0
  200. data/vendor/vmc-0.5.0/lib/vmc/cli/route/routes.rb +26 -0
  201. data/vendor/vmc-0.5.0/lib/vmc/cli/route/unmap.rb +94 -0
  202. data/vendor/vmc-0.5.0/lib/vmc/cli/service/base.rb +8 -0
  203. data/vendor/vmc-0.5.0/lib/vmc/cli/service/bind.rb +44 -0
  204. data/vendor/vmc-0.5.0/lib/vmc/cli/service/create.rb +126 -0
  205. data/vendor/vmc-0.5.0/lib/vmc/cli/service/delete.rb +86 -0
  206. data/vendor/vmc-0.5.0/lib/vmc/cli/service/rename.rb +35 -0
  207. data/vendor/vmc-0.5.0/lib/vmc/cli/service/service.rb +42 -0
  208. data/vendor/vmc-0.5.0/lib/vmc/cli/service/services.rb +114 -0
  209. data/vendor/vmc-0.5.0/lib/vmc/cli/service/unbind.rb +38 -0
  210. data/vendor/vmc-0.5.0/lib/vmc/cli/space/base.rb +21 -0
  211. data/vendor/vmc-0.5.0/lib/vmc/cli/space/create.rb +60 -0
  212. data/vendor/vmc-0.5.0/lib/vmc/cli/space/delete.rb +95 -0
  213. data/vendor/vmc-0.5.0/lib/vmc/cli/space/rename.rb +39 -0
  214. data/vendor/vmc-0.5.0/lib/vmc/cli/space/space.rb +64 -0
  215. data/vendor/vmc-0.5.0/lib/vmc/cli/space/spaces.rb +55 -0
  216. data/vendor/vmc-0.5.0/lib/vmc/cli/space/switch.rb +16 -0
  217. data/vendor/vmc-0.5.0/lib/vmc/cli/start/base.rb +83 -0
  218. data/vendor/vmc-0.5.0/lib/vmc/cli/start/colors.rb +13 -0
  219. data/vendor/vmc-0.5.0/lib/vmc/cli/start/info.rb +126 -0
  220. data/vendor/vmc-0.5.0/lib/vmc/cli/start/login.rb +96 -0
  221. data/vendor/vmc-0.5.0/lib/vmc/cli/start/logout.rb +17 -0
  222. data/vendor/vmc-0.5.0/lib/vmc/cli/start/target.rb +71 -0
  223. data/vendor/vmc-0.5.0/lib/vmc/cli/start/target_interactions.rb +37 -0
  224. data/vendor/vmc-0.5.0/lib/vmc/cli/start/targets.rb +16 -0
  225. data/vendor/vmc-0.5.0/lib/vmc/cli/user/base.rb +29 -0
  226. data/vendor/vmc-0.5.0/lib/vmc/cli/user/create.rb +39 -0
  227. data/vendor/vmc-0.5.0/lib/vmc/cli/user/delete.rb +27 -0
  228. data/vendor/vmc-0.5.0/lib/vmc/cli/user/passwd.rb +50 -0
  229. data/vendor/vmc-0.5.0/lib/vmc/cli/user/register.rb +42 -0
  230. data/vendor/vmc-0.5.0/lib/vmc/cli/user/users.rb +32 -0
  231. data/vendor/vmc-0.5.0/lib/vmc/cli.rb +475 -0
  232. data/vendor/vmc-0.5.0/lib/vmc/constants.rb +13 -0
  233. data/vendor/vmc-0.5.0/lib/vmc/detect.rb +129 -0
  234. data/vendor/vmc-0.5.0/lib/vmc/errors.rb +17 -0
  235. data/vendor/vmc-0.5.0/lib/vmc/plugin.rb +56 -0
  236. data/vendor/vmc-0.5.0/lib/vmc/spacing.rb +89 -0
  237. data/vendor/vmc-0.5.0/lib/vmc/spec_helper.rb +1 -0
  238. data/vendor/vmc-0.5.0/lib/vmc/test_support.rb +6 -0
  239. data/vendor/vmc-0.5.0/lib/vmc/version.rb +3 -0
  240. data/vendor/vmc-0.5.0/lib/vmc.rb +8 -0
  241. data/vendor/vmc-0.5.0/spec/assets/hello-sinatra/Gemfile +3 -0
  242. data/vendor/vmc-0.5.0/spec/assets/hello-sinatra/config.ru +3 -0
  243. data/vendor/vmc-0.5.0/spec/assets/hello-sinatra/main.rb +6 -0
  244. data/vendor/vmc-0.5.0/spec/assets/specker_runner/specker_runner_input.rb +6 -0
  245. data/vendor/vmc-0.5.0/spec/assets/specker_runner/specker_runner_pause.rb +5 -0
  246. data/vendor/vmc-0.5.0/spec/console_app_specker/console_app_specker_matchers_spec.rb +152 -0
  247. data/vendor/vmc-0.5.0/spec/console_app_specker/specker_runner_spec.rb +157 -0
  248. data/vendor/vmc-0.5.0/spec/features/v1/new_user_flow_spec.rb +109 -0
  249. data/vendor/vmc-0.5.0/spec/features/v2/account_lifecycle_spec.rb +64 -0
  250. data/vendor/vmc-0.5.0/spec/features/v2/push_flow_spec.rb +125 -0
  251. data/vendor/vmc-0.5.0/spec/features/v2/switching_targets_spec.rb +32 -0
  252. data/vendor/vmc-0.5.0/spec/spec_helper.rb +63 -0
  253. data/vendor/vmc-0.5.0/spec/support/command_helper.rb +80 -0
  254. data/vendor/vmc-0.5.0/spec/support/config_helper.rb +15 -0
  255. data/vendor/vmc-0.5.0/spec/support/console_app_specker_matchers.rb +75 -0
  256. data/vendor/vmc-0.5.0/spec/support/fake_home_dir.rb +55 -0
  257. data/vendor/vmc-0.5.0/spec/support/interact_helper.rb +29 -0
  258. data/vendor/vmc-0.5.0/spec/support/shared_examples/errors.rb +40 -0
  259. data/vendor/vmc-0.5.0/spec/support/shared_examples/input.rb +14 -0
  260. data/vendor/vmc-0.5.0/spec/support/specker_runner.rb +79 -0
  261. data/vendor/vmc-0.5.0/spec/support/tracking_expector.rb +71 -0
  262. data/vendor/vmc-0.5.0/spec/vmc/cli/app/base_spec.rb +17 -0
  263. data/vendor/vmc-0.5.0/spec/vmc/cli/app/delete_spec.rb +188 -0
  264. data/vendor/vmc-0.5.0/spec/vmc/cli/app/instances_spec.rb +65 -0
  265. data/vendor/vmc-0.5.0/spec/vmc/cli/app/push/create_spec.rb +591 -0
  266. data/vendor/vmc-0.5.0/spec/vmc/cli/app/push_spec.rb +369 -0
  267. data/vendor/vmc-0.5.0/spec/vmc/cli/app/rename_spec.rb +104 -0
  268. data/vendor/vmc-0.5.0/spec/vmc/cli/app/scale_spec.rb +76 -0
  269. data/vendor/vmc-0.5.0/spec/vmc/cli/app/start_spec.rb +168 -0
  270. data/vendor/vmc-0.5.0/spec/vmc/cli/app/stats_spec.rb +68 -0
  271. data/vendor/vmc-0.5.0/spec/vmc/cli/domain/map_spec.rb +130 -0
  272. data/vendor/vmc-0.5.0/spec/vmc/cli/domain/unmap_spec.rb +69 -0
  273. data/vendor/vmc-0.5.0/spec/vmc/cli/organization/orgs_spec.rb +108 -0
  274. data/vendor/vmc-0.5.0/spec/vmc/cli/organization/rename_spec.rb +113 -0
  275. data/vendor/vmc-0.5.0/spec/vmc/cli/route/map_spec.rb +140 -0
  276. data/vendor/vmc-0.5.0/spec/vmc/cli/route/unmap_spec.rb +221 -0
  277. data/vendor/vmc-0.5.0/spec/vmc/cli/service/bind_spec.rb +25 -0
  278. data/vendor/vmc-0.5.0/spec/vmc/cli/service/delete_spec.rb +22 -0
  279. data/vendor/vmc-0.5.0/spec/vmc/cli/service/rename_spec.rb +105 -0
  280. data/vendor/vmc-0.5.0/spec/vmc/cli/service/service_spec.rb +23 -0
  281. data/vendor/vmc-0.5.0/spec/vmc/cli/service/unbind_spec.rb +25 -0
  282. data/vendor/vmc-0.5.0/spec/vmc/cli/space/create_spec.rb +73 -0
  283. data/vendor/vmc-0.5.0/spec/vmc/cli/space/rename_spec.rb +102 -0
  284. data/vendor/vmc-0.5.0/spec/vmc/cli/space/spaces_spec.rb +104 -0
  285. data/vendor/vmc-0.5.0/spec/vmc/cli/space/switch_space_spec.rb +55 -0
  286. data/vendor/vmc-0.5.0/spec/vmc/cli/start/info_spec.rb +160 -0
  287. data/vendor/vmc-0.5.0/spec/vmc/cli/start/login_spec.rb +142 -0
  288. data/vendor/vmc-0.5.0/spec/vmc/cli/start/logout_spec.rb +50 -0
  289. data/vendor/vmc-0.5.0/spec/vmc/cli/start/target_spec.rb +123 -0
  290. data/vendor/vmc-0.5.0/spec/vmc/cli/user/create_spec.rb +54 -0
  291. data/vendor/vmc-0.5.0/spec/vmc/cli/user/delete_spec.rb +51 -0
  292. data/vendor/vmc-0.5.0/spec/vmc/cli/user/passwd_spec.rb +102 -0
  293. data/vendor/vmc-0.5.0/spec/vmc/cli/user/register_spec.rb +140 -0
  294. data/vendor/vmc-0.5.0/spec/vmc/cli_spec.rb +448 -0
  295. data/vendor/vmc-0.5.0/spec/vmc/detect_spec.rb +54 -0
  296. metadata +446 -43
@@ -0,0 +1,475 @@
1
+ require "yaml"
2
+ require "socket"
3
+ require "net/http"
4
+ require "multi_json"
5
+ require "fileutils"
6
+
7
+ require "mothership"
8
+
9
+ require "cfoundry"
10
+
11
+ require "vmc/constants"
12
+ require "vmc/errors"
13
+ require "vmc/spacing"
14
+
15
+ require "vmc/cli/help"
16
+ require "vmc/cli/interactive"
17
+
18
+
19
+ $vmc_asked_auth = false
20
+
21
+ module VMC
22
+ class CLI < Mothership
23
+ include VMC::Interactive
24
+ include VMC::Spacing
25
+
26
+ option :help, :desc => "Show command usage", :alias => "-h",
27
+ :default => false
28
+
29
+ option :proxy, :desc => "Run this command as another user (admin)", :alias => "-u",
30
+ :value => :email
31
+
32
+ option :version, :desc => "Print version number", :alias => "-v",
33
+ :default => false
34
+
35
+ option :verbose, :desc => "Print extra information", :alias => "-V",
36
+ :default => false
37
+
38
+ option :force, :desc => "Skip interaction when possible", :alias => "-f",
39
+ :type => :boolean, :default => proc { input[:script] }
40
+
41
+ option :debug, :desc => "Print full stack trace (instead of crash log)",
42
+ :type => :boolean, :default => false
43
+
44
+ option :quiet, :desc => "Simplify output format", :alias => "-q",
45
+ :type => :boolean, :default => proc { input[:script] }
46
+
47
+ option :script, :desc => "Shortcut for --quiet and --force",
48
+ :type => :boolean, :default => proc { !$stdout.tty? }
49
+
50
+ option :color, :desc => "Use colorful output",
51
+ :type => :boolean, :default => proc { !input[:quiet] }
52
+
53
+ option :trace, :desc => "Show API traffic", :alias => "-t",
54
+ :default => false
55
+
56
+
57
+ def default_action
58
+ if input[:version]
59
+ line "vmc #{VERSION}"
60
+ else
61
+ super
62
+ end
63
+ end
64
+
65
+ def check_target
66
+ unless client && client.target
67
+ fail "Please select a target with 'vmc target'."
68
+ end
69
+ end
70
+
71
+ def check_logged_in
72
+ unless client.logged_in?
73
+ if force?
74
+ fail "Please log in with 'vmc login'."
75
+ else
76
+ line c("Please log in first to proceed.", :warning)
77
+ line
78
+ invoke :login
79
+ invalidate_client
80
+ end
81
+ end
82
+ end
83
+
84
+ def precondition
85
+ check_target
86
+ check_logged_in
87
+
88
+ return unless v2?
89
+
90
+ unless client.current_organization
91
+ fail "Please select an organization with 'vmc target --ask-org'."
92
+ end
93
+
94
+ unless client.current_space
95
+ fail "Please select a space with 'vmc target --ask-space'."
96
+ end
97
+ end
98
+
99
+ def wrap_errors
100
+ yield
101
+ rescue CFoundry::Timeout => e
102
+ err(e.message)
103
+ rescue Interrupt
104
+ exit_status 130
105
+ rescue Mothership::Error
106
+ raise
107
+ rescue UserError => e
108
+ log_error(e)
109
+ err e.message
110
+ rescue SystemExit
111
+ raise
112
+ rescue CFoundry::Forbidden, CFoundry::InvalidAuthToken => e
113
+ if !$vmc_asked_auth
114
+ $vmc_asked_auth = true
115
+
116
+ line
117
+ line c("Not authenticated! Try logging in:", :warning)
118
+
119
+ # TODO: there's no color here; global flags not being passed
120
+ # through (mothership bug?)
121
+ invoke :login
122
+
123
+ retry
124
+ end
125
+
126
+ log_error(e)
127
+
128
+ err "Denied: #{e.description}"
129
+
130
+ rescue Exception => e
131
+ log_error(e)
132
+
133
+ msg = e.class.name
134
+ msg << ": #{e}" unless e.to_s.empty?
135
+ msg << "\nFor more information, see #{VMC::CRASH_FILE}"
136
+ err msg
137
+
138
+ raise if debug?
139
+ end
140
+
141
+ def execute(cmd, argv, global = {})
142
+ if input[:help]
143
+ invoke :help, :command => cmd.name.to_s
144
+ else
145
+ wrap_errors do
146
+ @command = cmd
147
+ precondition
148
+
149
+ save_token_if_it_changes do
150
+ super
151
+ end
152
+ end
153
+ end
154
+ end
155
+
156
+ def save_token_if_it_changes
157
+ return yield unless client && client.token
158
+
159
+ before_token = client.token
160
+
161
+ yield
162
+
163
+ after_token = client.token
164
+
165
+ return unless after_token
166
+
167
+ if before_token != after_token
168
+ info = target_info
169
+ info[:token] = after_token.auth_header
170
+ save_target_info(info)
171
+ end
172
+ end
173
+
174
+ def log_error(e)
175
+ ensure_config_dir
176
+
177
+ msg = e.class.name
178
+ msg << ": #{e}" unless e.to_s.empty?
179
+
180
+ crash_file = File.expand_path(VMC::CRASH_FILE)
181
+
182
+ FileUtils.mkdir_p(File.dirname(crash_file))
183
+
184
+ File.open(crash_file, "w") do |f|
185
+ f.puts "Time of crash:"
186
+ f.puts " #{Time.now}"
187
+ f.puts ""
188
+ f.puts msg
189
+ f.puts ""
190
+
191
+ if e.respond_to?(:request_trace)
192
+ f.puts "<<<"
193
+ f.puts e.request_trace
194
+ end
195
+
196
+ if e.respond_to?(:response_trace)
197
+ f.puts e.response_trace
198
+ f.puts ">>>"
199
+ f.puts ""
200
+ end
201
+
202
+ vmc_dir = File.expand_path("../../../..", __FILE__) + "/"
203
+ e.backtrace.each do |loc|
204
+ if loc =~ /\/gems\//
205
+ f.puts loc.sub(/.*\/gems\//, "")
206
+ else
207
+ f.puts loc.sub(vmc_dir, "")
208
+ end
209
+ end
210
+ end
211
+ end
212
+
213
+ def quiet?
214
+ input[:quiet]
215
+ end
216
+
217
+ def force?
218
+ input[:force]
219
+ end
220
+
221
+ def debug?
222
+ !!input[:debug]
223
+ end
224
+
225
+ def color_enabled?
226
+ input[:color]
227
+ end
228
+
229
+ def verbose?
230
+ input[:verbose]
231
+ end
232
+
233
+ def user_colors
234
+ return @user_colors if @user_colors
235
+
236
+ colors = File.expand_path(COLORS_FILE)
237
+
238
+ @user_colors = super.dup
239
+
240
+ # most terminal schemes are stupid, so use cyan instead
241
+ @user_colors.each do |k, v|
242
+ if v == :blue
243
+ @user_colors[k] = :cyan
244
+ end
245
+ end
246
+
247
+ if File.exists?(colors)
248
+ YAML.load_file(colors).each do |k, v|
249
+ @user_colors[k.to_sym] = v.to_sym
250
+ end
251
+ end
252
+
253
+ @user_colors
254
+ end
255
+
256
+ def err(msg, status = 1)
257
+ $stderr.puts c(msg, :error)
258
+ exit_status status
259
+ end
260
+
261
+ def fail(msg)
262
+ raise UserError, msg
263
+ end
264
+
265
+ def table(headers, rows)
266
+ tabular(
267
+ !quiet? && headers.collect { |h| h && b(h) },
268
+ *rows)
269
+ end
270
+
271
+ def name_list(xs)
272
+ if xs.empty?
273
+ d("none")
274
+ else
275
+ xs.collect { |x| c(x.name, :name) }.join(", ")
276
+ end
277
+ end
278
+
279
+ def sane_target_url(url)
280
+ unless url =~ /^https?:\/\//
281
+ begin
282
+ TCPSocket.new(url, Net::HTTP.https_default_port)
283
+ url = "https://#{url}"
284
+ rescue Errno::ECONNREFUSED, SocketError, Timeout::Error
285
+ url = "http://#{url}"
286
+ end
287
+ end
288
+
289
+ url.gsub(/\/$/, "")
290
+ end
291
+
292
+ def target_file
293
+ one_of(VMC::TARGET_FILE, VMC::OLD_TARGET_FILE)
294
+ end
295
+
296
+ def tokens_file
297
+ one_of(VMC::TOKENS_FILE, VMC::OLD_TOKENS_FILE)
298
+ end
299
+
300
+ def one_of(*paths)
301
+ paths.each do |p|
302
+ exp = File.expand_path(p)
303
+ return exp if File.exist? exp
304
+ end
305
+
306
+ File.expand_path(paths.first)
307
+ end
308
+
309
+ def client_target
310
+ if File.exists?(target_file)
311
+ File.read(target_file).chomp
312
+ end
313
+ end
314
+
315
+ def ensure_config_dir
316
+ config = File.expand_path(VMC::CONFIG_DIR)
317
+ FileUtils.mkdir_p(config) unless File.exist? config
318
+ end
319
+
320
+ def set_target(url)
321
+ ensure_config_dir
322
+
323
+ File.open(File.expand_path(VMC::TARGET_FILE), "w") do |f|
324
+ f.write(sane_target_url(url))
325
+ end
326
+
327
+ invalidate_client
328
+ end
329
+
330
+ def targets_info
331
+ new_toks = File.expand_path(VMC::TOKENS_FILE)
332
+ old_toks = File.expand_path(VMC::OLD_TOKENS_FILE)
333
+
334
+ info =
335
+ if File.exist? new_toks
336
+ YAML.load_file(new_toks)
337
+ elsif File.exist? old_toks
338
+ MultiJson.load(File.read(old_toks))
339
+ end
340
+
341
+ info ||= {}
342
+
343
+ normalize_targets_info(info)
344
+ end
345
+
346
+ def normalize_targets_info(info_by_url)
347
+ info_by_url.reduce({}) do |hash, pair|
348
+ key, value = pair
349
+ hash[key] = value.is_a?(String) ? { :token => value } : value
350
+ hash
351
+ end
352
+ end
353
+
354
+ def target_info(target = client_target)
355
+ targets_info[target] || {}
356
+ end
357
+
358
+ def save_targets(ts)
359
+ ensure_config_dir
360
+
361
+ File.open(File.expand_path(VMC::TOKENS_FILE), "w") do |io|
362
+ YAML.dump(ts, io)
363
+ end
364
+ end
365
+
366
+ def save_target_info(info, target = client_target)
367
+ ts = targets_info
368
+ ts[target] = info
369
+ save_targets(ts)
370
+ end
371
+
372
+ def remove_target_info(target = client_target)
373
+ ts = targets_info
374
+ ts.delete target
375
+ save_targets(ts)
376
+ end
377
+
378
+ def no_v2
379
+ fail "Not implemented for v2." if v2?
380
+ end
381
+
382
+ def v2?
383
+ client.version == 2
384
+ end
385
+
386
+ def invalidate_client
387
+ @@client = nil
388
+ client
389
+ end
390
+
391
+ def client(target = client_target)
392
+ return @@client if defined?(@@client) && @@client
393
+ return unless target
394
+
395
+ info = target_info(target)
396
+ token = info[:token] && CFoundry::AuthToken.from_hash(info)
397
+
398
+ @@client =
399
+ case info[:version]
400
+ when 2
401
+ fail "User switching not implemented for v2." if input[:proxy]
402
+ CFoundry::V2::Client.new(target, token)
403
+ when 1
404
+ CFoundry::V1::Client.new(target, token)
405
+ else
406
+ CFoundry::Client.new(target, token)
407
+ end
408
+
409
+ @@client.proxy = input[:proxy]
410
+ @@client.trace = input[:trace]
411
+
412
+ uri = URI.parse(target)
413
+ @@client.log = File.expand_path("#{LOGS_DIR}/#{uri.host}.log")
414
+
415
+ unless info.key? :version
416
+ info[:version] = @@client.version
417
+ save_target_info(info, target)
418
+ end
419
+
420
+ if org = info[:organization]
421
+ @@client.current_organization = @@client.organization(org)
422
+ end
423
+
424
+ if space = info[:space]
425
+ @@client.current_space = @@client.space(space)
426
+ end
427
+
428
+ @@client
429
+ rescue CFoundry::InvalidTarget
430
+ end
431
+
432
+ def fail_unknown(display, name)
433
+ fail("Unknown #{display} '#{name}'.")
434
+ end
435
+
436
+ class << self
437
+ def client
438
+ @@client
439
+ end
440
+
441
+ def client=(c)
442
+ @@client = c
443
+ end
444
+
445
+ private
446
+
447
+ def find_by_name(display, &blk)
448
+ proc { |name, *args|
449
+ choices, _ = args
450
+ choices ||= instance_exec(&blk) if block_given?
451
+
452
+ choices.find { |c| c.name == name } ||
453
+ fail_unknown(display, name)
454
+ }
455
+ end
456
+
457
+ def by_name(what, display = what)
458
+ proc { |name, *_|
459
+ client.send(:"#{what}_by_name", name) ||
460
+ fail_unknown(display, name)
461
+ }
462
+ end
463
+
464
+ def find_by_name_insensitive(display, &blk)
465
+ proc { |name, *args|
466
+ choices, _ = args
467
+ choices ||= instance_exec(&blk) if block_given?
468
+
469
+ choices.find { |c| c.name.upcase == name.upcase } ||
470
+ fail_unknown(display, name)
471
+ }
472
+ end
473
+ end
474
+ end
475
+ end
@@ -0,0 +1,13 @@
1
+ module VMC
2
+ OLD_TARGET_FILE = "~/.vmc_target".freeze
3
+ OLD_TOKENS_FILE = "~/.vmc_token".freeze
4
+
5
+ CONFIG_DIR = (ENV['VMC_CONFIG_DIR'].nil?) ? "~/.vmc" : ENV['VMC_CONFIG_DIR']
6
+
7
+ LOGS_DIR = "#{CONFIG_DIR}/logs".freeze
8
+ PLUGINS_FILE = "#{CONFIG_DIR}/plugins.yml".freeze
9
+ TARGET_FILE = "#{CONFIG_DIR}/target".freeze
10
+ TOKENS_FILE = "#{CONFIG_DIR}/tokens.yml".freeze
11
+ COLORS_FILE = "#{CONFIG_DIR}/colors.yml".freeze
12
+ CRASH_FILE = "#{CONFIG_DIR}/crash".freeze
13
+ end
@@ -0,0 +1,129 @@
1
+ require "set"
2
+
3
+ require "clouseau"
4
+
5
+ module VMC
6
+ class Detector
7
+ # "Basic" framework names for a detected language
8
+ PSEUDO_FRAMEWORKS = {
9
+ :node => "node",
10
+ :python => "wsgi",
11
+ :java => "java_web",
12
+ :php => "php",
13
+ :erlang => "otp_rebar",
14
+ :dotnet => "dotNet"
15
+ }
16
+
17
+ # Mismatched framework names
18
+ FRAMEWORK_NAMES = {
19
+ :rails => "rails3"
20
+ }
21
+
22
+ # Clouseau language symbol => matching runtime names
23
+ LANGUAGE_RUNTIMES = {
24
+ :ruby => /^ruby.*/,
25
+ :java => /^java.*/,
26
+ :node => /^node.*/,
27
+ :erlang => /^erlang.*/,
28
+ :dotnet => /^dotNet.*/,
29
+ :python => /^python.*/,
30
+ :php => /^php.*/
31
+ }
32
+
33
+ def initialize(client, path)
34
+ @client = client
35
+ @path = path
36
+ end
37
+
38
+ # detect the framework
39
+ def detect_framework
40
+ detected && frameworks[detected]
41
+ end
42
+
43
+ # detect the language and return the appropriate runtimes
44
+ def detect_runtimes
45
+ if detected && lang = detected.language_name
46
+ runtimes_for(lang)
47
+ else
48
+ []
49
+ end
50
+ end
51
+
52
+ # determine runtimes for a given framework based on the language its
53
+ # detector reports itself as
54
+ def runtimes(framework)
55
+ if detector = detectors[framework]
56
+ runtimes_for(detector.language_name)
57
+ else
58
+ []
59
+ end
60
+ end
61
+
62
+ # determine suitable memory allocation via the framework's detector
63
+ def suggested_memory(framework)
64
+ if detector = detectors[framework]
65
+ detector.memory_suggestion
66
+ end
67
+ end
68
+
69
+ # helper so that this is cached somewhere
70
+ def all_runtimes
71
+ @all_runtimes ||= @client.runtimes
72
+ end
73
+
74
+ # helper so that this is cached somewhere
75
+ def all_frameworks
76
+ @all_frameworks ||= @client.frameworks
77
+ end
78
+
79
+ private
80
+
81
+ def detected
82
+ @detected ||= Clouseau.detect(@path)
83
+ end
84
+
85
+ def map_detectors!
86
+ @framework_detectors = {}
87
+ @detector_frameworks = {}
88
+
89
+ Clouseau.detectors.each do |d|
90
+ name = d.framework_name
91
+ lang = d.language_name
92
+
93
+ framework = all_frameworks.find { |f|
94
+ f.name == name.to_s ||
95
+ f.name == FRAMEWORK_NAMES[name]
96
+ }
97
+
98
+ framework ||= all_frameworks.find { |f|
99
+ f.name == PSEUDO_FRAMEWORKS[lang]
100
+ }
101
+
102
+ next unless framework
103
+
104
+ @framework_detectors[framework] = d
105
+ @detector_frameworks[d] = framework
106
+ end
107
+
108
+ nil
109
+ end
110
+
111
+ # Framework -> Detector
112
+ def detectors
113
+ map_detectors! unless @framework_detectors
114
+ @framework_detectors
115
+ end
116
+
117
+ # Detector -> Framework
118
+ def frameworks
119
+ map_detectors! unless @detector_frameworks
120
+ @detector_frameworks
121
+ end
122
+
123
+ def runtimes_for(language)
124
+ all_runtimes.select do |r|
125
+ LANGUAGE_RUNTIMES[language] === r.name
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,17 @@
1
+ module VMC
2
+ class UserError < RuntimeError
3
+ def initialize(msg)
4
+ @message = msg
5
+ end
6
+
7
+ def to_s
8
+ @message
9
+ end
10
+ end
11
+
12
+ class NotAuthorized < UserError
13
+ def initialize
14
+ @message = "Not authorized."
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,56 @@
1
+ require "set"
2
+ require "yaml"
3
+
4
+ require "vmc/constants"
5
+ require "vmc/cli"
6
+
7
+ module VMC
8
+ module Plugin
9
+ @@plugins = []
10
+
11
+ def self.load_all
12
+ # auto-load gems with 'vmc-plugin' in their name
13
+ matching =
14
+ if Gem::Specification.respond_to? :find_all
15
+ Gem::Specification.find_all do |s|
16
+ s.name =~ /vmc-plugin/
17
+ end
18
+ else
19
+ Gem.source_index.find_name(/vmc-plugin/)
20
+ end
21
+
22
+ enabled = Set.new(matching.collect(&:name))
23
+
24
+ vmc_gems = Gem.loaded_specs["vmc"]
25
+ ((vmc_gems && vmc_gems.dependencies) || Gem.loaded_specs.values).each do |dep|
26
+ if dep.name =~ /vmc-plugin/
27
+ require "#{dep.name}/plugin"
28
+ enabled.delete dep.name
29
+ end
30
+ end
31
+
32
+ # allow explicit enabling/disabling of gems via config
33
+ plugins = File.expand_path(VMC::PLUGINS_FILE)
34
+ if File.exists?(plugins) && yaml = YAML.load_file(plugins)
35
+ enabled += yaml["enabled"] if yaml["enabled"]
36
+ enabled -= yaml["disabled"] if yaml["disabled"]
37
+ end
38
+
39
+ # load up each gem's 'plugin' file
40
+ #
41
+ # we require this file specifically so people can require the gem
42
+ # without it plugging into VMC
43
+ enabled.each do |gemname|
44
+ begin
45
+ require "#{gemname}/plugin"
46
+ rescue Gem::LoadError => e
47
+ puts "Failed to load #{gemname}:"
48
+ puts " #{e}"
49
+ puts
50
+ puts "You may need to update or remove this plugin."
51
+ puts
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end