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,125 @@
1
+ require "spec_helper"
2
+ require "webmock/rspec"
3
+
4
+ if ENV['VMC_V2_TEST_USER'] && ENV['VMC_V2_TEST_PASSWORD'] && ENV['VMC_V2_TEST_TARGET']
5
+ describe 'A new user tries to use VMC against v2', :ruby19 => true do
6
+ include ConsoleAppSpeckerMatchers
7
+ include VMC::Interactive
8
+
9
+ let(:target) { ENV['VMC_V2_TEST_TARGET'] }
10
+ let(:username) { ENV['VMC_V2_TEST_USER'] }
11
+ let(:password) { ENV['VMC_V2_TEST_PASSWORD'] }
12
+
13
+ let(:app) do
14
+ fuzz = defined?(TRAVIS_BUILD_ID) ? TRAVIS_BUILD_ID : Time.new.to_f.to_s.gsub(".", "_")
15
+ "hello-sinatra-#{fuzz}"
16
+ end
17
+
18
+ before do
19
+ FileUtils.rm_rf File.expand_path(VMC::CONFIG_DIR)
20
+ WebMock.allow_net_connect!
21
+ Interact::Progress::Dots.start!
22
+ end
23
+
24
+ after do
25
+ vmc %W(delete #{app} -f --no-script)
26
+ Interact::Progress::Dots.stop!
27
+ end
28
+
29
+ it 'pushes a simple sinatra app using defaults as much as possible' do
30
+ run("#{vmc_bin} target http://#{target}") do |runner|
31
+ expect(runner).to say %r{Setting target to http://#{target}... OK}
32
+ end
33
+
34
+ run("#{vmc_bin} login") do |runner|
35
+ expect(runner).to say %r{target: https?://#{target}}
36
+
37
+ expect(runner).to say "Email>"
38
+ runner.send_keys username
39
+
40
+ expect(runner).to say "Password>"
41
+ runner.send_keys password
42
+
43
+ expect(runner).to say "Authenticating... OK"
44
+
45
+ expect(runner).to say(
46
+ "Organization>" => proc {
47
+ runner.send_keys "1"
48
+ expect(runner).to say /Switching to organization .*\.\.\. OK/
49
+ },
50
+ "Switching to organization" => proc {}
51
+ )
52
+
53
+ expect(runner).to say(
54
+ "Space>" => proc {
55
+ runner.send_keys "1"
56
+ expect(runner).to say /Switching to space .*\.\.\. OK/
57
+ },
58
+ "Switching to space" => proc {}
59
+ )
60
+ end
61
+
62
+ run("#{vmc_bin} app #{app}") do |runner|
63
+ expect(runner).to say "Unknown app '#{app}'."
64
+ end
65
+
66
+ Dir.chdir("#{SPEC_ROOT}/assets/hello-sinatra") do
67
+ run("#{vmc_bin} push") do |runner|
68
+ expect(runner).to say "Name>"
69
+ runner.send_keys app
70
+
71
+ expect(runner).to say "Instances> 1"
72
+ runner.send_keys ""
73
+
74
+ expect(runner).to say "Custom startup command> "
75
+ runner.send_keys "bundle exec ruby main.rb -p $PORT"
76
+
77
+ expect(runner).to say "Memory Limit>"
78
+ runner.send_keys "64M"
79
+
80
+ expect(runner).to say "Creating #{app}... OK"
81
+
82
+ expect(runner).to say "Subdomain> #{app}"
83
+ runner.send_keys ""
84
+
85
+ expect(runner).to say "1:"
86
+ expect(runner).to say "Domain>"
87
+ runner.send_keys "1"
88
+
89
+ expect(runner).to say(/Creating route #{app}\..*\.\.\. OK/)
90
+ expect(runner).to say(/Binding #{app}\..* to #{app}\.\.\. OK/)
91
+
92
+ expect(runner).to say "Create services for application?> n"
93
+ runner.send_keys ""
94
+
95
+ # skip this
96
+ if runner.expect "Bind other services to application?> n", 1
97
+ runner.send_keys ""
98
+ end
99
+
100
+ expect(runner).to say "Save configuration?> n"
101
+ runner.send_keys ""
102
+
103
+ expect(runner).to say "Uploading #{app}... OK"
104
+ expect(runner).to say "Starting #{app}... OK"
105
+
106
+ expect(runner).to say "Using Ruby", 10
107
+ expect(runner).to say "Your bundle is complete!", 30
108
+
109
+ expect(runner).to say "Checking #{app}..."
110
+ expect(runner).to say "1/1 instances"
111
+ expect(runner).to say "OK", 30
112
+ end
113
+ end
114
+
115
+ run("#{vmc_bin} delete #{app}") do |runner|
116
+ expect(runner).to say "Really delete #{app}?>"
117
+ runner.send_keys "y"
118
+
119
+ expect(runner).to say "Deleting #{app}... OK"
120
+ end
121
+ end
122
+ end
123
+ else
124
+ $stderr.puts 'Skipping integration specs; please provide $VMC_TEST_TARGET, $VMC_TEST_USER, and $VMC_TEST_PASSWORD'
125
+ end
@@ -0,0 +1,32 @@
1
+ require "spec_helper"
2
+
3
+ if ENV['VMC_V2_TEST_TARGET']
4
+ describe 'A new user tries to use VMC against v2 production', :ruby19 => true do
5
+ include ConsoleAppSpeckerMatchers
6
+
7
+ let(:target) { ENV['VMC_V2_TEST_TARGET'] }
8
+
9
+ before do
10
+ Interact::Progress::Dots.start!
11
+ end
12
+
13
+ after do
14
+ Interact::Progress::Dots.stop!
15
+ end
16
+
17
+ it "can switch targets, even if a target is invalid" do
18
+ run("#{vmc_bin} target invalid-target") do |runner|
19
+ expect(runner).to say "target refused"
20
+ runner.wait_for_exit
21
+ end
22
+
23
+ run("#{vmc_bin} target #{target}") do |runner|
24
+ expect(runner).to say "Setting target"
25
+ expect(runner).to say target
26
+ runner.wait_for_exit
27
+ end
28
+ end
29
+ end
30
+ else
31
+ $stderr.puts 'Skipping v2 integration specs; please provide $VMC_V2_TEST_TARGET'
32
+ end
@@ -0,0 +1,63 @@
1
+ SPEC_ROOT = File.dirname(__FILE__).freeze
2
+
3
+ require "rspec"
4
+ require "cfoundry"
5
+ require "cfoundry/test_support"
6
+ require "vmc"
7
+ require "vmc/test_support"
8
+ require "webmock"
9
+ require "ostruct"
10
+
11
+ INTEGRATE_WITH = ENV["INTEGRATE_WITH"] || "default"
12
+
13
+ def vmc_bin
14
+ vmc = File.expand_path("#{SPEC_ROOT}/../bin/vmc.dev")
15
+ if INTEGRATE_WITH != 'default'
16
+ "rvm #{INTEGRATE_WITH}@vmc do #{vmc}"
17
+ else
18
+ vmc
19
+ end
20
+ end
21
+
22
+ Dir[File.expand_path('../support/**/*.rb', __FILE__)].each do |file|
23
+ require file
24
+ end
25
+
26
+ RSpec.configure do |c|
27
+ c.include Fake::FakeMethods
28
+ c.include V1Fake::FakeMethods
29
+ c.include ConsoleAppSpeckerMatchers
30
+
31
+ c.mock_with :rr
32
+
33
+ if RUBY_VERSION =~ /^1\.8\.\d/
34
+ c.filter_run_excluding :ruby19 => true
35
+ end
36
+
37
+ c.include FakeHomeDir
38
+ c.include CommandHelper
39
+ c.include InteractHelper
40
+ c.include ConfigHelper
41
+
42
+ c.before(:all) do
43
+ WebMock.disable_net_connect!
44
+ end
45
+
46
+ c.before do
47
+ VMC::CLI.send(:class_variable_set, :@@client, nil)
48
+ end
49
+ end
50
+
51
+ def name_list(xs)
52
+ if xs.empty?
53
+ "none"
54
+ else
55
+ xs.collect(&:name).join(", ")
56
+ end
57
+ end
58
+
59
+ def run(command)
60
+ SpeckerRunner.new(command) do |runner|
61
+ yield runner
62
+ end
63
+ end
@@ -0,0 +1,80 @@
1
+ def command(klass, &specs)
2
+ describe klass do
3
+ let(:stub_precondition?) { true }
4
+ before do
5
+ any_instance_of klass do |cli|
6
+ stub(cli).precondition if stub_precondition?
7
+ stub(cli).client { client }
8
+ end
9
+ end
10
+
11
+ before(:all) do
12
+ klass.class_eval do
13
+ def wrap_errors
14
+ yield
15
+ rescue VMC::UserError => e
16
+ err e.message
17
+ end
18
+ end
19
+ end
20
+
21
+ after(:all) do
22
+ klass.class_eval do
23
+ remove_method :wrap_errors
24
+ end
25
+ end
26
+
27
+ class_eval(&specs)
28
+ end
29
+ end
30
+
31
+ module CommandHelper
32
+ def vmc(argv)
33
+ Mothership.new.exit_status 0
34
+ stub(VMC::CLI).exit { |code| code }
35
+ capture_output { VMC::CLI.start(argv + ["--debug", "--no-script"]) }
36
+ end
37
+
38
+ def bool_flag(flag)
39
+ "#{'no-' unless send(flag)}#{flag.to_s.gsub('_', '-')}"
40
+ end
41
+
42
+ attr_reader :stdout, :stderr, :stdin, :status
43
+
44
+ def capture_output
45
+ $real_stdout = $stdout
46
+ $real_stderr = $stderr
47
+ $real_stdin = $stdin
48
+ $stdout = @stdout = StringIO.new
49
+ $stderr = @stderr = StringIO.new
50
+ $stdin = @stdin = StringIO.new
51
+ @status = yield
52
+ @stdout.rewind
53
+ @stderr.rewind
54
+ @status
55
+ ensure
56
+ $stdout = $real_stdout
57
+ $stderr = $real_stderr
58
+ $stdin = $real_stdin
59
+ end
60
+
61
+ def output
62
+ @output ||= TrackingExpector.new(stdout)
63
+ end
64
+
65
+ def error_output
66
+ @error_output ||= TrackingExpector.new(stderr)
67
+ end
68
+
69
+ def mock_invoke(*args)
70
+ any_instance_of described_class do |cli|
71
+ mock(cli).invoke *args
72
+ end
73
+ end
74
+
75
+ def dont_allow_invoke(*args)
76
+ any_instance_of described_class do |cli|
77
+ dont_allow(cli).invoke *args
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,15 @@
1
+ module ConfigHelper
2
+ def write_token_file(config={})
3
+ File.open(File.expand_path(tokens_file_path), 'w') do |f|
4
+ f.puts YAML.dump(
5
+ { "https://api.some-domain.com" =>
6
+ {
7
+ :version => 2,
8
+ :token => 'bearer token',
9
+ :refresh_token => nil
10
+ }.merge(config)
11
+ }
12
+ )
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,75 @@
1
+ module ConsoleAppSpeckerMatchers
2
+ class InvalidInputError < StandardError; end
3
+
4
+ class ExpectOutputMatcher
5
+ attr_reader :timeout
6
+
7
+ def initialize(expected_output, timeout = 30)
8
+ @expected_output = expected_output
9
+ @timeout = timeout
10
+ end
11
+
12
+ def matches?(runner)
13
+ raise InvalidInputError unless runner.respond_to?(:expect)
14
+ expected = runner.expect(@expected_output, @timeout)
15
+ @full_output = runner.output
16
+ !!expected
17
+ end
18
+
19
+ def failure_message
20
+ "expected '#{@expected_output}' to be printed, but it wasn't. full output:\n#@full_output"
21
+ end
22
+
23
+ def negative_failure_message
24
+ "expected '#{@expected_output}' to not be printed, but it was. full output:\n#@full_output"
25
+ end
26
+ end
27
+
28
+
29
+ class ExitCodeMatcher
30
+ def initialize(expected_code)
31
+ @expected_code = expected_code
32
+ end
33
+
34
+ def matches?(runner)
35
+ raise InvalidInputError unless runner.respond_to?(:exit_code)
36
+
37
+ begin
38
+ Timeout.timeout(5) do
39
+ @actual_code = runner.exit_code
40
+ end
41
+
42
+ @actual_code == @expected_code
43
+ rescue Timeout::Error
44
+ @timed_out = true
45
+ false
46
+ end
47
+ end
48
+
49
+ def failure_message
50
+ if @timed_out
51
+ "expected process to exit with status #@expected_code, but it did not exit within 5 seconds"
52
+ else
53
+ "expected process to exit with status #{@expected_code}, but it exited with status #{@actual_code}"
54
+ end
55
+ end
56
+
57
+ def negative_failure_message
58
+ if @timed_out
59
+ "expected process to exit with status #@expected_code, but it did not exit within 5 seconds"
60
+ else
61
+ "expected process to not exit with status #{@expected_code}, but it did"
62
+ end
63
+ end
64
+ end
65
+
66
+ def say(expected_output, timeout = 30)
67
+ ExpectOutputMatcher.new(expected_output, timeout)
68
+ end
69
+
70
+ def have_exited_with(expected_code)
71
+ ExitCodeMatcher.new(expected_code)
72
+ end
73
+
74
+ alias :exit_with :have_exited_with
75
+ end
@@ -0,0 +1,55 @@
1
+ require "fakefs/safe"
2
+
3
+ module FakeHomeDir
4
+ def self.included(klass)
5
+ super
6
+ klass.extend(ClassMethods)
7
+ end
8
+
9
+ module ClassMethods
10
+ def stub_home_dir_with(&block)
11
+ around do |example|
12
+ bootstrap_dir = instance_exec(&block)
13
+
14
+ if bootstrap_dir
15
+ fixture = File.expand_path(bootstrap_dir)
16
+ files = build_file_buffer(fixture)
17
+ end
18
+
19
+ FakeFS do
20
+ home = File.expand_path("~")
21
+ write_file_buffer(files, home) if files
22
+ example.call
23
+ end
24
+
25
+ FakeFS::FileSystem.clear
26
+ end
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def build_file_buffer(path)
33
+ files = {}
34
+
35
+ Dir.glob("#{path}/**/*", File::FNM_DOTMATCH).each do |file|
36
+ next if file =~ /\.$/
37
+ next if File.directory?(file)
38
+
39
+ files[file.sub(path + "/", "")] = File.read(file)
40
+ end
41
+
42
+ files
43
+ end
44
+
45
+ def write_file_buffer(files, path)
46
+ files.each do |file, body|
47
+ full = "#{path}/#{file}"
48
+
49
+ FileUtils.mkdir_p(File.dirname(full))
50
+ File.open(full, "w") do |io|
51
+ io.write body
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,29 @@
1
+ module InteractHelper
2
+ def stub_ask(*args, &block)
3
+ a_stub = nil
4
+ any_instance_of VMC::CLI do |interactive|
5
+ a_stub = stub(interactive).ask(*args, &block)
6
+ end
7
+ a_stub
8
+ end
9
+
10
+ def mock_ask(*args, &block)
11
+ a_mock = nil
12
+ any_instance_of VMC::CLI do |interactive|
13
+ a_mock = mock(interactive).ask(*args, &block)
14
+ end
15
+ a_mock
16
+ end
17
+
18
+ def dont_allow_ask(*args)
19
+ any_instance_of VMC::CLI do |interactive|
20
+ dont_allow(interactive).ask(*args)
21
+ end
22
+ end
23
+
24
+ def mock_with_progress(message)
25
+ any_instance_of VMC::CLI do |interactive|
26
+ mock(interactive).with_progress(message) { |_, block| block.call }
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,40 @@
1
+ shared_examples_for "an error that's obvious to the user" do |options|
2
+ message = options[:with_message]
3
+
4
+ it "prints the message" do
5
+ subject
6
+ expect(stderr.string).to include message
7
+ end
8
+
9
+ it "sets the exit code to 1" do
10
+ mock(context).exit_status(1)
11
+ subject
12
+ end
13
+
14
+ it "does not mention ~/.vmc/crash" do
15
+ subject
16
+ expect(stderr.string).to_not include VMC::CRASH_FILE
17
+ end
18
+ end
19
+
20
+ shared_examples_for "an error that gets passed through" do |options|
21
+ before do
22
+ described_class.class_eval do
23
+ alias_method :wrap_errors_original, :wrap_errors
24
+ def wrap_errors
25
+ yield
26
+ end
27
+ end
28
+ end
29
+
30
+ after do
31
+ described_class.class_eval do
32
+ remove_method :wrap_errors
33
+ alias_method :wrap_errors, :wrap_errors_original
34
+ end
35
+ end
36
+
37
+ it "reraises the error" do
38
+ expect { subject }.to raise_error(options[:with_exception], options[:with_message])
39
+ end
40
+ end
@@ -0,0 +1,14 @@
1
+ shared_examples_for 'inputs must have descriptions' do
2
+ describe 'inputs' do
3
+ subject { command.inputs }
4
+
5
+ it "is not missing any descriptions" do
6
+ subject.each do |_, attrs|
7
+ next if attrs[:hidden]
8
+
9
+ expect(attrs[:description]).to be
10
+ expect(attrs[:description].strip).to_not be_empty
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,79 @@
1
+ require "pty"
2
+
3
+ class SpeckerRunner
4
+ def initialize(*args)
5
+ @stdout, slave = PTY.open
6
+ system("stty raw", :in => slave)
7
+ read, @stdin = IO.pipe
8
+
9
+ @pid = spawn(*(args.push(:in => read, :out => slave, :err => slave)))
10
+
11
+ @expector = TrackingExpector.new(@stdout, ENV["DEBUG_BACON"])
12
+
13
+ yield self
14
+ end
15
+
16
+ def expect(matcher, timeout = 30)
17
+ case matcher
18
+ when Hash
19
+ expect_branches(matcher, timeout)
20
+ else
21
+ @expector.expect(matcher, timeout)
22
+ end
23
+ end
24
+
25
+ def send_keys(text_to_send)
26
+ @stdin.puts(text_to_send)
27
+ end
28
+
29
+ def exit_code
30
+ return @status if @status
31
+
32
+ status = nil
33
+ Timeout.timeout(5) do
34
+ _, status = Process.waitpid2(@pid)
35
+ end
36
+
37
+ @status = numeric_exit_code(status)
38
+ end
39
+
40
+ alias_method :wait_for_exit, :exit_code
41
+
42
+ def exited?
43
+ !running?
44
+ end
45
+
46
+ def running?
47
+ !!Process.getpgid(@pid)
48
+ end
49
+
50
+ def output
51
+ @expector.output
52
+ end
53
+
54
+ def debug
55
+ @expector.debug
56
+ end
57
+
58
+ def debug=(x)
59
+ @expector.debug = x
60
+ end
61
+
62
+ private
63
+
64
+ def expect_branches(branches, timeout)
65
+ branch_names = /#{branches.keys.collect { |k| Regexp.quote(k) }.join("|")}/
66
+ expected = @expector.expect(branch_names, timeout)
67
+ return unless expected
68
+
69
+ data = expected.first.match(/(#{branch_names})$/)
70
+ matched = data[1]
71
+ branches[matched].call
72
+ end
73
+
74
+ def numeric_exit_code(status)
75
+ status.exitstatus
76
+ rescue NoMethodError
77
+ status
78
+ end
79
+ end
@@ -0,0 +1,71 @@
1
+ class TrackingExpector
2
+ attr_reader :output
3
+
4
+ def initialize(out, debug = false)
5
+ @out = out
6
+ @debug = debug
7
+ @unused = ""
8
+ @output = ""
9
+ end
10
+
11
+ def expect(pattern, timeout = 5)
12
+ buffer = ''
13
+
14
+ case pattern
15
+ when String
16
+ pattern = Regexp.new(Regexp.quote(pattern))
17
+ when Regexp
18
+ else
19
+ raise TypeError, "unsupported pattern class: #{pattern.class}"
20
+ end
21
+
22
+ result = nil
23
+ position = 0
24
+ @unused ||= ""
25
+
26
+ while true
27
+ if !@unused.empty?
28
+ c = @unused.slice!(0).chr
29
+ elsif output_ended?(timeout)
30
+ @unused = buffer
31
+ break
32
+ else
33
+ c = @out.getc.chr
34
+ end
35
+
36
+ STDOUT.putc c if @debug
37
+
38
+ # wear your flip flops
39
+ unless (c == "\e") .. (c == "m")
40
+ if c == "\b"
41
+ if position > 0 && buffer[position - 1] && buffer[position - 1].chr != "\n"
42
+ position -= 1
43
+ end
44
+ else
45
+ if buffer.size > position
46
+ buffer[position] = c
47
+ else
48
+ buffer << c
49
+ end
50
+
51
+ position += 1
52
+ end
53
+ end
54
+
55
+ if matches = pattern.match(buffer)
56
+ result = [buffer, *matches.to_a[1..-1]]
57
+ break
58
+ end
59
+ end
60
+
61
+ @output << buffer
62
+
63
+ result
64
+ end
65
+
66
+ private
67
+
68
+ def output_ended?(timeout)
69
+ (@out.is_a?(IO) && !IO.select([@out], nil, nil, timeout)) || @out.eof?
70
+ end
71
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+ require "vmc/cli/app/base"
3
+
4
+ describe VMC::App::Base do
5
+ describe '#human_size' do
6
+ let(:base) { VMC::App::Base.new }
7
+
8
+ it { base.human_size(1_023).should == "1023.0B" }
9
+ it { base.human_size(1_024).should == "1.0K" }
10
+ it { base.human_size(1_024 * 1_024).should == "1.0M" }
11
+ it { base.human_size(1_024 * 1_024 * 1.5).should == "1.5M" }
12
+ it { base.human_size(1_024 * 1_024 * 1_024).should == "1.0G" }
13
+ it { base.human_size(1_024 * 1_024 * 1_024 * 1.5).should == "1.5G" }
14
+ it { base.human_size(1_024 * 1_024 * 1_024 * 1.234, 3).should == "1.234G" }
15
+ it { base.human_size(31395840).should == "29.9M" } # tests against floating point errors
16
+ end
17
+ end