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,591 @@
1
+ require 'spec_helper'
2
+ require 'fakefs/safe'
3
+
4
+ describe VMC::App::Create do
5
+ let(:inputs) { {} }
6
+ let(:given) { {} }
7
+ let(:global) { { :color => false, :quiet => true } }
8
+
9
+ let(:frameworks) { fake_list(:framework, 3) }
10
+ let(:framework) { buildpack }
11
+ let(:buildpack) { fake(:framework, :name => "buildpack") }
12
+ let(:standalone) { fake(:framework, :name => "standalone") }
13
+
14
+ let(:runtimes) { fake_list(:runtime, 3) }
15
+ let(:runtime) { runtimes.first }
16
+
17
+ let(:service_instances) { fake_list(:service_instance, 5) }
18
+
19
+ let(:client) do
20
+ fake_client(
21
+ :frameworks => frameworks,
22
+ :runtimes => runtimes,
23
+ :service_instances => service_instances)
24
+ end
25
+
26
+ before do
27
+ any_instance_of(VMC::CLI) do |cli|
28
+ stub(cli).client { client }
29
+ end
30
+ end
31
+
32
+ let(:path) { "some-path" }
33
+
34
+ let(:create) do
35
+ command = Mothership.commands[:push]
36
+ create = VMC::App::Push.new(command)
37
+ create.path = path
38
+ create.input = Mothership::Inputs.new(command, create, inputs, given, global)
39
+ create.extend VMC::App::PushInteractions
40
+ create
41
+ end
42
+
43
+ describe '#get_inputs' do
44
+ subject { create.get_inputs }
45
+
46
+ let(:inputs) do
47
+ { :name => "some-name",
48
+ :instances => 1,
49
+ :plan => "p100",
50
+ :memory => "1G",
51
+ :command => "ruby main.rb",
52
+ :buildpack => "git://example.com"
53
+ }
54
+ end
55
+
56
+ context 'when all the inputs are given' do
57
+ its([:name]) { should eq "some-name" }
58
+ its([:total_instances]) { should eq 1 }
59
+ its([:space]) { should eq client.current_space }
60
+ its([:production]) { should eq true }
61
+ its([:framework]) { should eq nil }
62
+ its([:runtime]) { should eq nil }
63
+ its([:command]) { should eq "ruby main.rb" }
64
+ its([:memory]) { should eq 1024 }
65
+ its([:buildpack]) { should eq "git://example.com" }
66
+ end
67
+
68
+ context 'when certain inputs are not given' do
69
+ it 'asks for the name' do
70
+ inputs.delete(:name)
71
+ mock_ask("Name") { "some-name" }
72
+ subject
73
+ end
74
+
75
+ it 'asks for the total instances' do
76
+ inputs.delete(:instances)
77
+ mock_ask("Instances", anything) { 1 }
78
+ subject
79
+ end
80
+
81
+ it 'does not ask for the framework' do
82
+ dont_allow_ask('Framework', anything) do |_, options|
83
+ expect(options[:choices]).to eq frameworks.sort_by(&:name)
84
+ framework
85
+ end
86
+ subject
87
+ end
88
+
89
+ context 'when the command is not given' do
90
+ before { inputs.delete(:command) }
91
+
92
+ shared_examples 'an app that can have a custom start command' do
93
+ it "asks for a start command with a default as 'none'" do
94
+ mock_ask("Custom startup command", :default => "none") do
95
+ "abcd"
96
+ end
97
+
98
+ expect(subject[:command]).to eq "abcd"
99
+ end
100
+
101
+ context "when the user enters 'none'" do
102
+ it "has the command as nil" do
103
+ stub_ask("Custom startup command", :default => "none") do
104
+ "none"
105
+ end
106
+
107
+ expect(subject[:command]).to be_nil
108
+ end
109
+ end
110
+ end
111
+
112
+ context 'when the framework is "buildpack"' do
113
+ let(:framework) { buildpack }
114
+
115
+ include_examples 'an app that can have a custom start command'
116
+ end
117
+
118
+ context 'when the framework is "standalone"' do
119
+ let(:framework) { standalone }
120
+
121
+ include_examples 'an app that can have a custom start command'
122
+ end
123
+
124
+ describe "getting the start command" do
125
+ before do
126
+ FakeFS.activate!
127
+ Dir.mkdir(path)
128
+
129
+ # fakefs removes fnmatch :'(
130
+ stub(create.send(:detector)).detect_framework
131
+ end
132
+
133
+ after do
134
+ FakeFS.deactivate!
135
+ FakeFS::FileSystem.clear
136
+ end
137
+
138
+ context "when there is a Procfile in the app's root" do
139
+ before do
140
+ File.open("#{path}/Procfile", "w") do |file|
141
+ file.write("this is a procfile")
142
+ end
143
+ end
144
+
145
+ it 'does not ask for a start command' do
146
+ dont_allow_ask("Startup command")
147
+ subject
148
+ end
149
+ end
150
+
151
+ context "when there is no Procfile in the app's root" do
152
+ it 'asks for a start command' do
153
+ mock_ask("Custom startup command", :default => "none")
154
+ subject
155
+ end
156
+ end
157
+ end
158
+ end
159
+
160
+ it 'does not ask for the runtime' do
161
+ dont_allow_ask('Runtime', anything) do |_, options|
162
+ expect(options[:choices]).to eq runtimes.sort_by(&:name)
163
+ runtime
164
+ end
165
+ subject
166
+ end
167
+
168
+ it 'asks for the memory' do
169
+ inputs.delete(:memory)
170
+
171
+ memory_choices = %w(64M 128M 256M 512M 1G)
172
+ stub(create).memory_choices { memory_choices }
173
+
174
+ mock_ask('Memory Limit', anything) do |_, options|
175
+ expect(options[:choices]).to eq memory_choices
176
+ "1G"
177
+ end
178
+
179
+ subject
180
+ end
181
+ end
182
+ end
183
+
184
+ describe '#determine_framework' do
185
+ subject { create.determine_framework }
186
+
187
+ context 'when framework is given' do
188
+ let(:inputs) { { :framework => framework } }
189
+
190
+ it 'does not try to get the frameworks' do
191
+ any_instance_of(VMC::Detector) do |detector|
192
+ dont_allow(detector).detect_framework
193
+ dont_allow(detector).all_frameworks
194
+ end
195
+
196
+ dont_allow_ask
197
+ dont_allow(client).frameworks
198
+
199
+ subject
200
+ end
201
+
202
+ it { should eq framework }
203
+ end
204
+
205
+ context 'when framework is not given' do
206
+ context 'and a framework is detected' do
207
+ it "lists the detected framework and an 'other' option" do
208
+ any_instance_of(VMC::Detector) do |detector|
209
+ mock(detector).detect_framework { framework }
210
+ end
211
+
212
+ mock_ask('Framework', anything) do |_, options|
213
+ expect(options[:choices]).to eq [framework, :other] #frameworks.sort_by(&:name)
214
+ framework
215
+ end
216
+
217
+ subject
218
+ end
219
+ end
220
+
221
+ context 'and a framework is not detected' do
222
+ it "lists all available frameworks" do
223
+ any_instance_of(VMC::Detector) do |detector|
224
+ stub(detector).detect_framework
225
+ end
226
+
227
+ mock_ask('Framework', anything) do |_, options|
228
+ expect(options[:choices]).to eq frameworks.sort_by(&:name)
229
+ framework
230
+ end
231
+
232
+ subject
233
+ end
234
+ end
235
+ end
236
+ end
237
+
238
+ describe '#detect_runtimes' do
239
+ subject { create.determine_runtime(framework) }
240
+
241
+ context 'when runtime is given' do
242
+ let(:inputs) { { :runtime => runtime } }
243
+
244
+ it 'does not try to get the runtime' do
245
+ any_instance_of(VMC::Detector) do |detector|
246
+ dont_allow(detector).detect_runtime
247
+ dont_allow(detector).all_runtimes
248
+ end
249
+
250
+ dont_allow_ask
251
+ dont_allow(client).runtimes
252
+
253
+ subject
254
+ end
255
+
256
+ it { should eq runtime }
257
+ end
258
+
259
+ context 'when runtime is not given' do
260
+ context 'and the framework is standalone' do
261
+ let(:framework) { standalone }
262
+
263
+ it "detects the runtime" do
264
+ any_instance_of(VMC::Detector) do |detector|
265
+ mock(detector).detect_runtimes { runtimes }
266
+ end
267
+
268
+ mock_ask('Runtime', anything) do |_, options|
269
+ expect(options[:choices]).to eq(runtimes.sort_by(&:name) + [:other])
270
+ runtime
271
+ end
272
+
273
+ subject
274
+ end
275
+ end
276
+
277
+ context 'and the framework is not standalone' do
278
+ it "gets the runtimes based on the framework" do
279
+ any_instance_of(VMC::Detector) do |detector|
280
+ mock(detector).runtimes(framework) { runtimes }
281
+ end
282
+
283
+ mock_ask('Runtime', anything) do |_, options|
284
+ expect(options[:choices]).to eq(runtimes.sort_by(&:name) + [:other])
285
+ runtime
286
+ end
287
+
288
+ subject
289
+ end
290
+ end
291
+ end
292
+ end
293
+
294
+ describe '#create_app' do
295
+ before { dont_allow_ask }
296
+
297
+ let(:app) { fake(:app, :guid => nil) }
298
+
299
+ let(:attributes) do
300
+ { :name => "some-app",
301
+ :total_instances => 2,
302
+ :framework => framework,
303
+ :runtime => runtime,
304
+ :production => false,
305
+ :memory => 1024,
306
+ :buildpack => "git://example.com"
307
+ }
308
+ end
309
+
310
+ before { stub(client).app { app } }
311
+
312
+ subject { create.create_app(attributes) }
313
+
314
+ it 'creates an app based on the resulting inputs' do
315
+ mock(create).filter(:create_app, app) { app }
316
+
317
+ mock(app).create!
318
+
319
+ subject
320
+
321
+ attributes.each do |key, val|
322
+ expect(app.send(key)).to eq val
323
+ end
324
+ end
325
+
326
+ context "with an invalid buildpack" do
327
+ before do
328
+ stub(app).create! do
329
+ raise CFoundry::MessageParseError.new(
330
+ "Request invalid due to parse error: Field: buildpack, Error: Value git@github.com:cloudfoundry/heroku-buildpack-ruby.git doesn't match regexp String /GIT_URL_REGEX/",
331
+ 1001)
332
+ end
333
+ end
334
+
335
+ it "fails and prints a pretty message" do
336
+ stub(create).line(anything)
337
+ expect { subject }.to raise_error(
338
+ VMC::UserError, "Buildpack must be a public git repository URI.")
339
+ end
340
+ end
341
+ end
342
+
343
+ describe '#map_url' do
344
+ let(:app) { fake(:app, :space => space) }
345
+ let(:space) { fake(:space, :domains => domains) }
346
+ let(:domains) { [fake(:domain, :name => "foo.com")] }
347
+ let(:hosts) { [app.name] }
348
+
349
+ subject { create.map_route(app) }
350
+
351
+ it "asks for a subdomain with 'none' as an option" do
352
+ mock_ask('Subdomain', anything) do |_, options|
353
+ expect(options[:choices]).to eq(hosts + %w(none))
354
+ expect(options[:default]).to eq hosts.first
355
+ hosts.first
356
+ end
357
+
358
+ stub_ask("Domain", anything) { domains.first }
359
+
360
+ stub(create).invoke
361
+
362
+ subject
363
+ end
364
+
365
+ it "asks for a domain with 'none' as an option" do
366
+ stub_ask("Subdomain", anything) { hosts.first }
367
+
368
+ mock_ask('Domain', anything) do |_, options|
369
+ expect(options[:choices]).to eq(domains + %w(none))
370
+ expect(options[:default]).to eq domains.first
371
+ domains.first
372
+ end
373
+
374
+ stub(create).invoke
375
+
376
+ subject
377
+ end
378
+
379
+ it "maps the host and domain after both are given" do
380
+ stub_ask('Subdomain', anything) { hosts.first }
381
+ stub_ask('Domain', anything) { domains.first }
382
+
383
+ mock(create).invoke(:map,
384
+ :app => app, :host => hosts.first,
385
+ :domain => domains.first)
386
+
387
+ subject
388
+ end
389
+
390
+ context "when 'none' is given as the host" do
391
+ context "and a domain is provided afterwards" do
392
+ it "invokes 'map' with an empty host" do
393
+ mock_ask('Subdomain', anything) { "none" }
394
+ stub_ask('Domain', anything) { domains.first }
395
+
396
+ mock(create).invoke(:map,
397
+ :host => "", :domain => domains.first, :app => app)
398
+
399
+ subject
400
+ end
401
+ end
402
+ end
403
+
404
+ context "when 'none' is given as the domain" do
405
+ it "does not perform any mapping" do
406
+ stub_ask('Subdomain', anything) { "foo" }
407
+ mock_ask('Domain', anything) { "none" }
408
+
409
+ dont_allow(create).invoke(:map, anything)
410
+
411
+ subject
412
+ end
413
+ end
414
+
415
+ context "when mapping fails" do
416
+ before do
417
+ mock_ask('Subdomain', anything) { "foo" }
418
+ mock_ask('Domain', anything) { domains.first }
419
+
420
+ mock(create).invoke(:map,
421
+ :host => "foo", :domain => domains.first, :app => app) do
422
+ raise CFoundry::RouteHostTaken.new("foo", 1234)
423
+ end
424
+ end
425
+
426
+ it "asks again" do
427
+ stub(create).line
428
+
429
+ mock_ask('Subdomain', anything) { hosts.first }
430
+ mock_ask('Domain', anything) { domains.first }
431
+
432
+ stub(create).invoke
433
+
434
+ subject
435
+ end
436
+
437
+ it "reports the failure message" do
438
+ mock(create).line "foo"
439
+ mock(create).line
440
+
441
+ stub_ask('Subdomain', anything) { hosts.first }
442
+ stub_ask('Domain', anything) { domains.first }
443
+
444
+ stub(create).invoke
445
+
446
+ subject
447
+ end
448
+ end
449
+ end
450
+
451
+ describe '#create_services' do
452
+ let(:app) { fake(:app) }
453
+ subject { create.create_services(app) }
454
+
455
+ context 'when forcing' do
456
+ let(:inputs) { {:force => true} }
457
+
458
+ it "does not ask to create any services" do
459
+ dont_allow_ask("Create services for application?", anything)
460
+ subject
461
+ end
462
+
463
+ it "does not create any services" do
464
+ dont_allow(create).invoke(:create_service, anything)
465
+ subject
466
+ end
467
+ end
468
+
469
+ context 'when not forcing' do
470
+ let(:inputs) { { :force => false } }
471
+
472
+ it 'does not create the service if asked not to' do
473
+ mock_ask("Create services for application?", anything) { false }
474
+ dont_allow(create).invoke(:create_service, anything)
475
+
476
+ subject
477
+ end
478
+
479
+ it 'asks again to create a service' do
480
+ mock_ask("Create services for application?", anything) { true }
481
+ mock(create).invoke(:create_service, { :app => app }, :plan => :interact).ordered
482
+
483
+ mock_ask("Create another service?", :default => false) { true }
484
+ mock(create).invoke(:create_service, { :app => app }, :plan => :interact).ordered
485
+
486
+ mock_ask("Create another service?", :default => false) { true }
487
+ mock(create).invoke(:create_service, { :app => app }, :plan => :interact).ordered
488
+
489
+ mock_ask("Create another service?", :default => false) { false }
490
+ dont_allow(create).invoke(:create_service, anything).ordered
491
+
492
+ subject
493
+ end
494
+ end
495
+ end
496
+
497
+ describe '#bind_services' do
498
+ let(:app) { fake(:app) }
499
+
500
+ subject { create.bind_services(app) }
501
+
502
+ context 'when forcing' do
503
+ let(:global) { { :force => true, :color => false, :quiet => true } }
504
+
505
+ it "does not ask to bind any services" do
506
+ dont_allow_ask("Bind other services to application?", anything)
507
+ subject
508
+ end
509
+
510
+ it "does not bind any services" do
511
+ dont_allow(create).invoke(:bind_service, anything)
512
+ subject
513
+ end
514
+ end
515
+
516
+ context 'when not forcing' do
517
+ it 'does not bind the service if asked not to' do
518
+ mock_ask("Bind other services to application?", anything) { false }
519
+ dont_allow(create).invoke(:bind_service, anything)
520
+
521
+ subject
522
+ end
523
+
524
+ it 'asks again to bind a service' do
525
+ bind_times = 3
526
+ call_count = 0
527
+
528
+ mock_ask("Bind other services to application?", anything) { true }
529
+
530
+ mock(create).invoke(:bind_service, :app => app).times(bind_times) do
531
+ call_count += 1
532
+ stub(app).services { service_instances.first(call_count) }
533
+ end
534
+
535
+ mock_ask("Bind another service?", anything).times(bind_times) do
536
+ call_count < bind_times
537
+ end
538
+
539
+ subject
540
+ end
541
+
542
+ it 'stops asking if there are no more services to bind' do
543
+ bind_times = service_instances.size
544
+ call_count = 0
545
+
546
+ mock_ask("Bind other services to application?", anything) { true }
547
+
548
+ mock(create).invoke(:bind_service, :app => app).times(bind_times) do
549
+ call_count += 1
550
+ stub(app).services { service_instances.first(call_count) }
551
+ end
552
+
553
+ mock_ask("Bind another service?", anything).times(bind_times - 1) { true }
554
+
555
+ subject
556
+ end
557
+
558
+ context 'when there are no services' do
559
+ let(:service_instances) { [] }
560
+
561
+ it 'does not ask to bind anything' do
562
+ dont_allow_ask
563
+ subject
564
+ end
565
+ end
566
+ end
567
+ end
568
+
569
+ describe '#start_app' do
570
+ let(:app) { fake(:app) }
571
+ subject { create.start_app(app) }
572
+
573
+ context 'when the start flag is provided' do
574
+ let(:inputs) { {:start => true} }
575
+
576
+ it 'invokes the start command' do
577
+ mock(create).invoke(:start, :app => app)
578
+ subject
579
+ end
580
+ end
581
+
582
+ context 'when the start flag is not provided' do
583
+ let(:inputs) { {:start => false} }
584
+
585
+ it 'invokes the start command' do
586
+ dont_allow(create).invoke(:start, anything)
587
+ subject
588
+ end
589
+ end
590
+ end
591
+ end