aviator 0.0.5 → 0.0.6

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 (220) hide show
  1. checksums.yaml +8 -8
  2. data/README.md +1 -204
  3. data/aviator.gemspec +3 -2
  4. data/lib/aviator/core/cli/describer.rb +99 -48
  5. data/lib/aviator/core/cli.rb +1 -0
  6. data/lib/aviator/core/request.rb +46 -9
  7. data/lib/aviator/core/request_builder.rb +82 -30
  8. data/lib/aviator/core/response.rb +15 -23
  9. data/lib/aviator/core/service.rb +43 -17
  10. data/lib/aviator/core.rb +1 -0
  11. data/lib/aviator/openstack/common/v2/admin/base.rb +9 -0
  12. data/lib/aviator/openstack/common/v2/public/base.rb +43 -0
  13. data/lib/aviator/openstack/compute/v2/admin/confirm_server_resize.rb +4 -14
  14. data/lib/aviator/openstack/compute/v2/admin/create_network.rb +56 -0
  15. data/lib/aviator/openstack/compute/v2/admin/get_host_details.rb +4 -15
  16. data/lib/aviator/openstack/compute/v2/admin/list_hosts.rb +5 -16
  17. data/lib/aviator/openstack/compute/v2/admin/lock_server.rb +34 -0
  18. data/lib/aviator/openstack/compute/v2/admin/migrate_server.rb +34 -0
  19. data/lib/aviator/openstack/compute/v2/admin/reset_server.rb +39 -0
  20. data/lib/aviator/openstack/compute/v2/admin/resize_server.rb +5 -15
  21. data/lib/aviator/openstack/compute/v2/admin/unlock_server.rb +34 -0
  22. data/lib/aviator/openstack/compute/v2/public/change_admin_password.rb +14 -24
  23. data/lib/aviator/openstack/compute/v2/public/create_image.rb +4 -14
  24. data/lib/aviator/openstack/compute/v2/public/create_server.rb +9 -19
  25. data/lib/aviator/openstack/compute/v2/public/delete_image.rb +4 -15
  26. data/lib/aviator/openstack/compute/v2/public/delete_server.rb +4 -14
  27. data/lib/aviator/openstack/compute/v2/public/get_flavor_details.rb +29 -0
  28. data/lib/aviator/openstack/compute/v2/public/get_image_details.rb +4 -15
  29. data/lib/aviator/openstack/compute/v2/public/get_network_details.rb +30 -0
  30. data/lib/aviator/openstack/compute/v2/public/get_server.rb +9 -20
  31. data/lib/aviator/openstack/compute/v2/public/list_addresses.rb +5 -17
  32. data/lib/aviator/openstack/compute/v2/public/list_flavors.rb +8 -28
  33. data/lib/aviator/openstack/compute/v2/public/list_images.rb +6 -26
  34. data/lib/aviator/openstack/compute/v2/public/list_networks.rb +27 -0
  35. data/lib/aviator/openstack/compute/v2/public/list_servers.rb +14 -25
  36. data/lib/aviator/openstack/compute/v2/public/pause_server.rb +34 -0
  37. data/lib/aviator/openstack/compute/v2/public/reboot_server.rb +4 -14
  38. data/lib/aviator/openstack/compute/v2/public/rebuild_server.rb +8 -18
  39. data/lib/aviator/openstack/compute/v2/public/resume_server.rb +34 -0
  40. data/lib/aviator/openstack/compute/v2/public/root.rb +4 -14
  41. data/lib/aviator/openstack/compute/v2/public/suspend_server.rb +34 -0
  42. data/lib/aviator/openstack/compute/v2/public/unpause_server.rb +34 -0
  43. data/lib/aviator/openstack/compute/v2/public/update_server.rb +6 -16
  44. data/lib/aviator/openstack/identity/v2/admin/add_role_to_user_on_tenant.rb +5 -18
  45. data/lib/aviator/openstack/identity/v2/admin/create_tenant.rb +4 -14
  46. data/lib/aviator/openstack/identity/v2/admin/create_user.rb +1 -1
  47. data/lib/aviator/openstack/identity/v2/admin/delete_role_from_user_on_tenant.rb +6 -18
  48. data/lib/aviator/openstack/identity/v2/admin/delete_tenant.rb +4 -15
  49. data/lib/aviator/openstack/identity/v2/admin/list_tenants.rb +5 -24
  50. data/lib/aviator/openstack/identity/v2/admin/update_tenant.rb +4 -14
  51. data/lib/aviator/openstack/identity/v2/admin/update_user.rb +1 -1
  52. data/lib/aviator/openstack/identity/v2/public/create_token.rb +6 -11
  53. data/lib/aviator/openstack/identity/v2/public/list_tenants.rb +5 -24
  54. data/lib/aviator/openstack/identity/v2/public/root.rb +5 -14
  55. data/lib/aviator/openstack/image/v1/public/root.rb +5 -14
  56. data/lib/aviator/openstack/metering/v1/admin/list_projects.rb +4 -11
  57. data/lib/aviator/openstack/volume/v1/public/create_volume.rb +47 -0
  58. data/lib/aviator/openstack/volume/v1/public/delete_volume.rb +25 -0
  59. data/lib/aviator/openstack/volume/v1/public/get_volume.rb +28 -0
  60. data/lib/aviator/openstack/volume/v1/public/list_volume_types.rb +29 -0
  61. data/lib/aviator/openstack/volume/v1/public/list_volumes.rb +37 -0
  62. data/lib/aviator/openstack/volume/v1/public/root.rb +6 -14
  63. data/lib/aviator/openstack/volume/v1/public/update_volume.rb +43 -0
  64. data/lib/aviator/version.rb +1 -1
  65. data/test/aviator/core/cli/describer_test.rb +236 -114
  66. data/test/aviator/core/request_builder_test.rb +133 -12
  67. data/test/aviator/core/request_test.rb +64 -0
  68. data/test/aviator/core/service_test.rb +18 -0
  69. data/test/aviator/openstack/common/v2/public/base_test.rb +109 -0
  70. data/test/aviator/openstack/compute/v2/admin/create_network_test.rb +163 -0
  71. data/test/aviator/openstack/compute/v2/admin/lock_server_test.rb +125 -0
  72. data/test/aviator/openstack/compute/v2/admin/migrate_server_test.rb +125 -0
  73. data/test/aviator/openstack/compute/v2/admin/reset_server_test.rb +141 -0
  74. data/test/aviator/openstack/compute/v2/admin/resize_server_test.rb +9 -0
  75. data/test/aviator/openstack/compute/v2/admin/unlock_server_test.rb +125 -0
  76. data/test/aviator/openstack/compute/v2/public/change_admin_password_test.rb +9 -0
  77. data/test/aviator/openstack/compute/v2/public/create_server_test.rb +14 -1
  78. data/test/aviator/openstack/compute/v2/public/get_flavor_details_test.rb +126 -0
  79. data/test/aviator/openstack/compute/v2/public/get_image_details_test.rb +1 -1
  80. data/test/aviator/openstack/compute/v2/public/get_network_details_test.rb +123 -0
  81. data/test/aviator/openstack/compute/v2/public/get_server_test.rb +35 -35
  82. data/test/aviator/openstack/compute/v2/public/list_addresses_test.rb +9 -0
  83. data/test/aviator/openstack/compute/v2/public/list_flavors_test.rb +50 -40
  84. data/test/aviator/openstack/compute/v2/public/list_images_test.rb +42 -33
  85. data/test/aviator/openstack/compute/v2/public/list_networks_test.rb +100 -0
  86. data/test/aviator/openstack/compute/v2/public/list_servers_test.rb +9 -1
  87. data/test/aviator/openstack/compute/v2/public/pause_server_test.rb +125 -0
  88. data/test/aviator/openstack/compute/v2/public/rebuild_server_test.rb +12 -0
  89. data/test/aviator/openstack/compute/v2/public/resume_server_test.rb +125 -0
  90. data/test/aviator/openstack/compute/v2/public/suspend_server_test.rb +125 -0
  91. data/test/aviator/openstack/compute/v2/public/unpause_server_test.rb +125 -0
  92. data/test/aviator/openstack/compute/v2/public/update_server_test.rb +37 -27
  93. data/test/aviator/openstack/identity/v2/admin/create_user_test.rb +9 -0
  94. data/test/aviator/openstack/identity/v2/admin/update_user_test.rb +9 -0
  95. data/test/aviator/openstack/identity/v2/public/create_token_test.rb +16 -5
  96. data/test/aviator/openstack/identity/v2/public/list_tenants_test.rb +131 -0
  97. data/test/aviator/openstack/volume/v1/public/create_volume_test.rb +126 -0
  98. data/test/aviator/openstack/volume/v1/public/delete_volume_test.rb +131 -0
  99. data/test/aviator/openstack/volume/v1/public/get_volume_test.rb +141 -0
  100. data/test/aviator/openstack/volume/v1/public/list_volume_types_test.rb +91 -0
  101. data/test/aviator/openstack/volume/v1/public/list_volumes_test.rb +154 -0
  102. data/test/aviator/openstack/volume/v1/public/update_volume_test.rb +130 -0
  103. data/test/cassettes/openstack/common/v2/public/base/returns_the_correct_value_for_headers_.yml +62 -0
  104. data/test/cassettes/openstack/compute/v2/admin/create_network/leads_to_a_valid_response_when_invalid_parameters_are_provided.yml +98 -0
  105. data/test/cassettes/openstack/compute/v2/admin/create_network/leads_to_a_valid_response_when_valid_parameters_are_provided.yml +103 -0
  106. data/test/cassettes/openstack/compute/v2/admin/create_network/returns_the_correct_value_for_headers_.yml +64 -0
  107. data/test/cassettes/openstack/compute/v2/admin/create_network/returns_the_correct_value_for_http_method_.yml +64 -0
  108. data/test/cassettes/openstack/compute/v2/admin/create_network/returns_the_correct_value_for_url_.yml +64 -0
  109. data/test/cassettes/openstack/compute/v2/admin/lock_server/leads_to_a_valid_response_when_invalid_server_id_is_provided.yml +98 -0
  110. data/test/cassettes/openstack/compute/v2/admin/lock_server/leads_to_a_valid_response_when_valid_params_are_provided.yml +131 -0
  111. data/test/cassettes/openstack/compute/v2/admin/lock_server/returns_the_correct_value_for_body_.yml +64 -0
  112. data/test/cassettes/openstack/compute/v2/admin/lock_server/returns_the_correct_value_for_headers_.yml +64 -0
  113. data/test/cassettes/openstack/compute/v2/admin/lock_server/returns_the_correct_value_for_http_method_.yml +64 -0
  114. data/test/cassettes/openstack/compute/v2/admin/lock_server/returns_the_correct_value_for_url_.yml +64 -0
  115. data/test/cassettes/openstack/compute/v2/admin/migrate_server/leads_to_a_valid_response_when_invalid_server_id_is_provided.yml +98 -0
  116. data/test/cassettes/openstack/compute/v2/admin/migrate_server/leads_to_a_valid_response_when_valid_params_are_provided.yml +131 -0
  117. data/test/cassettes/openstack/compute/v2/admin/migrate_server/returns_the_correct_value_for_body_.yml +64 -0
  118. data/test/cassettes/openstack/compute/v2/admin/migrate_server/returns_the_correct_value_for_headers_.yml +64 -0
  119. data/test/cassettes/openstack/compute/v2/admin/migrate_server/returns_the_correct_value_for_http_method_.yml +64 -0
  120. data/test/cassettes/openstack/compute/v2/admin/migrate_server/returns_the_correct_value_for_url_.yml +64 -0
  121. data/test/cassettes/openstack/compute/v2/admin/reset_server/leads_to_a_valid_response_when_invalid_server_id_is_provided.yml +98 -0
  122. data/test/cassettes/openstack/compute/v2/admin/reset_server/leads_to_a_valid_response_when_valid_params_are_provided.yml +131 -0
  123. data/test/cassettes/openstack/compute/v2/admin/reset_server/returns_the_correct_value_for_body_.yml +64 -0
  124. data/test/cassettes/openstack/compute/v2/admin/reset_server/returns_the_correct_value_for_headers_.yml +64 -0
  125. data/test/cassettes/openstack/compute/v2/admin/reset_server/returns_the_correct_value_for_http_method_.yml +64 -0
  126. data/test/cassettes/openstack/compute/v2/admin/reset_server/returns_the_correct_value_for_url_.yml +64 -0
  127. data/test/cassettes/openstack/compute/v2/admin/unlock_server/leads_to_a_valid_response_when_invalid_server_id_is_provided.yml +98 -0
  128. data/test/cassettes/openstack/compute/v2/admin/unlock_server/leads_to_a_valid_response_when_valid_params_are_provided.yml +131 -0
  129. data/test/cassettes/openstack/compute/v2/admin/unlock_server/returns_the_correct_value_for_body_.yml +64 -0
  130. data/test/cassettes/openstack/compute/v2/admin/unlock_server/returns_the_correct_value_for_headers_.yml +64 -0
  131. data/test/cassettes/openstack/compute/v2/admin/unlock_server/returns_the_correct_value_for_http_method_.yml +64 -0
  132. data/test/cassettes/openstack/compute/v2/admin/unlock_server/returns_the_correct_value_for_url_.yml +64 -0
  133. data/test/cassettes/openstack/compute/v2/public/get_flavor_details/leads_to_a_valid_response_when_invalid_parameters_are_provided.yml +96 -0
  134. data/test/cassettes/openstack/compute/v2/public/get_flavor_details/leads_to_a_valid_response_when_parameters_are_provided.yml +99 -0
  135. data/test/cassettes/openstack/compute/v2/public/get_flavor_details/returns_the_correct_value_for_body_.yml +62 -0
  136. data/test/cassettes/openstack/compute/v2/public/get_flavor_details/returns_the_correct_value_for_headers_.yml +62 -0
  137. data/test/cassettes/openstack/compute/v2/public/get_flavor_details/returns_the_correct_value_for_http_method_.yml +62 -0
  138. data/test/cassettes/openstack/compute/v2/public/get_flavor_details/returns_the_correct_value_for_url_.yml +62 -0
  139. data/test/cassettes/openstack/compute/v2/public/get_network_details/leads_to_a_valid_response_when_invalid_network_id_is_provided.yml +99 -0
  140. data/test/cassettes/openstack/compute/v2/public/get_network_details/leads_to_a_valid_response_when_valid_network_id_is_provided.yml +136 -0
  141. data/test/cassettes/openstack/compute/v2/public/get_network_details/returns_the_correct_value_for_body_.yml +65 -0
  142. data/test/cassettes/openstack/compute/v2/public/get_network_details/returns_the_correct_value_for_headers_.yml +65 -0
  143. data/test/cassettes/openstack/compute/v2/public/get_network_details/returns_the_correct_value_for_http_method_.yml +65 -0
  144. data/test/cassettes/openstack/compute/v2/public/get_network_details/returns_the_correct_value_for_url_.yml +65 -0
  145. data/test/cassettes/openstack/compute/v2/public/list_networks/leads_to_a_valid_response_when_no_parameters_are_provided.yml +101 -0
  146. data/test/cassettes/openstack/compute/v2/public/list_networks/returns_the_correct_value_for_body_.yml +65 -0
  147. data/test/cassettes/openstack/compute/v2/public/list_networks/returns_the_correct_value_for_headers_.yml +65 -0
  148. data/test/cassettes/openstack/compute/v2/public/list_networks/returns_the_correct_value_for_http_method_.yml +65 -0
  149. data/test/cassettes/openstack/compute/v2/public/list_networks/returns_the_correct_value_for_url_.yml +65 -0
  150. data/test/cassettes/openstack/compute/v2/public/pause_server/leads_to_a_valid_response_when_invalid_server_id_is_provided.yml +99 -0
  151. data/test/cassettes/openstack/compute/v2/public/pause_server/leads_to_a_valid_response_when_valid_params_are_provided.yml +132 -0
  152. data/test/cassettes/openstack/compute/v2/public/pause_server/returns_the_correct_value_for_body_.yml +65 -0
  153. data/test/cassettes/openstack/compute/v2/public/pause_server/returns_the_correct_value_for_headers_.yml +65 -0
  154. data/test/cassettes/openstack/compute/v2/public/pause_server/returns_the_correct_value_for_http_method_.yml +65 -0
  155. data/test/cassettes/openstack/compute/v2/public/pause_server/returns_the_correct_value_for_url_.yml +65 -0
  156. data/test/cassettes/openstack/compute/v2/public/resume_server/leads_to_a_valid_response_when_invalid_server_id_is_provided.yml +99 -0
  157. data/test/cassettes/openstack/compute/v2/public/resume_server/leads_to_a_valid_response_when_valid_params_are_provided.yml +132 -0
  158. data/test/cassettes/openstack/compute/v2/public/resume_server/returns_the_correct_value_for_body_.yml +65 -0
  159. data/test/cassettes/openstack/compute/v2/public/resume_server/returns_the_correct_value_for_headers_.yml +65 -0
  160. data/test/cassettes/openstack/compute/v2/public/resume_server/returns_the_correct_value_for_http_method_.yml +65 -0
  161. data/test/cassettes/openstack/compute/v2/public/resume_server/returns_the_correct_value_for_url_.yml +65 -0
  162. data/test/cassettes/openstack/compute/v2/public/suspend_server/leads_to_a_valid_response_when_invalid_server_id_is_provided.yml +99 -0
  163. data/test/cassettes/openstack/compute/v2/public/suspend_server/leads_to_a_valid_response_when_valid_params_are_provided.yml +132 -0
  164. data/test/cassettes/openstack/compute/v2/public/suspend_server/returns_the_correct_value_for_body_.yml +65 -0
  165. data/test/cassettes/openstack/compute/v2/public/suspend_server/returns_the_correct_value_for_headers_.yml +65 -0
  166. data/test/cassettes/openstack/compute/v2/public/suspend_server/returns_the_correct_value_for_http_method_.yml +65 -0
  167. data/test/cassettes/openstack/compute/v2/public/suspend_server/returns_the_correct_value_for_url_.yml +65 -0
  168. data/test/cassettes/openstack/compute/v2/public/unpause_server/leads_to_a_valid_response_when_invalid_server_id_is_provided.yml +99 -0
  169. data/test/cassettes/openstack/compute/v2/public/unpause_server/leads_to_a_valid_response_when_valid_params_are_provided.yml +132 -0
  170. data/test/cassettes/openstack/compute/v2/public/unpause_server/returns_the_correct_value_for_body_.yml +65 -0
  171. data/test/cassettes/openstack/compute/v2/public/unpause_server/returns_the_correct_value_for_headers_.yml +65 -0
  172. data/test/cassettes/openstack/compute/v2/public/unpause_server/returns_the_correct_value_for_http_method_.yml +65 -0
  173. data/test/cassettes/openstack/compute/v2/public/unpause_server/returns_the_correct_value_for_url_.yml +65 -0
  174. data/test/cassettes/openstack/identity/v2/public/list_tenants/leads_to_a_valid_response_when_no_parameters_are_provided.yml +143 -0
  175. data/test/cassettes/openstack/identity/v2/public/list_tenants/leads_to_a_valid_response_when_session_is_using_a_default_token.yml +74 -0
  176. data/test/cassettes/openstack/identity/v2/public/list_tenants/returns_the_correct_value_for_body_.yml +62 -0
  177. data/test/cassettes/openstack/identity/v2/public/list_tenants/returns_the_correct_value_for_headers_.yml +62 -0
  178. data/test/cassettes/openstack/identity/v2/public/list_tenants/returns_the_correct_value_for_http_method_.yml +62 -0
  179. data/test/cassettes/openstack/identity/v2/public/list_tenants/returns_the_correct_value_for_url_.yml +62 -0
  180. data/test/cassettes/openstack/volume/v1/public/create_volume/leads_to_a_valid_response_when_parameters_are_provided.yml +101 -0
  181. data/test/cassettes/openstack/volume/v1/public/create_volume/returns_the_correct_value_for_body_.yml +62 -0
  182. data/test/cassettes/openstack/volume/v1/public/create_volume/returns_the_correct_value_for_headers_.yml +62 -0
  183. data/test/cassettes/openstack/volume/v1/public/create_volume/returns_the_correct_value_for_http_method_.yml +62 -0
  184. data/test/cassettes/openstack/volume/v1/public/create_volume/returns_the_correct_value_for_url_.yml +62 -0
  185. data/test/cassettes/openstack/volume/v1/public/delete_volume/leads_to_a_valid_response_when_invalid_volume_id_is_provided.yml +96 -0
  186. data/test/cassettes/openstack/volume/v1/public/delete_volume/leads_to_a_valid_response_when_valid_volume_id_is_provided.yml +167 -0
  187. data/test/cassettes/openstack/volume/v1/public/delete_volume/returns_the_correct_value_for_body_.yml +62 -0
  188. data/test/cassettes/openstack/volume/v1/public/delete_volume/returns_the_correct_value_for_headers_.yml +62 -0
  189. data/test/cassettes/openstack/volume/v1/public/delete_volume/returns_the_correct_value_for_http_method_.yml +62 -0
  190. data/test/cassettes/openstack/volume/v1/public/delete_volume/returns_the_correct_value_for_url_.yml +62 -0
  191. data/test/cassettes/openstack/volume/v1/public/get_volume/leads_to_a_valid_response_when_a_valid_volume_id_is_provided.yml +213 -0
  192. data/test/cassettes/openstack/volume/v1/public/get_volume/leads_to_a_valid_response_when_an_invalid_volume_id_is_provided.yml +96 -0
  193. data/test/cassettes/openstack/volume/v1/public/get_volume/returns_the_correct_value_for_body_.yml +62 -0
  194. data/test/cassettes/openstack/volume/v1/public/get_volume/returns_the_correct_value_for_headers_.yml +62 -0
  195. data/test/cassettes/openstack/volume/v1/public/get_volume/returns_the_correct_value_for_http_method_.yml +62 -0
  196. data/test/cassettes/openstack/volume/v1/public/get_volume/returns_the_correct_value_for_url_.yml +62 -0
  197. data/test/cassettes/openstack/volume/v1/public/list_volume_types/leads_to_a_valid_response_when_no_parameters_are_provided.yml +95 -0
  198. data/test/cassettes/openstack/volume/v1/public/list_volume_types/returns_the_correct_value_for_body_.yml +62 -0
  199. data/test/cassettes/openstack/volume/v1/public/list_volume_types/returns_the_correct_value_for_headers_.yml +62 -0
  200. data/test/cassettes/openstack/volume/v1/public/list_volume_types/returns_the_correct_value_for_http_method_.yml +62 -0
  201. data/test/cassettes/openstack/volume/v1/public/list_volumes/leads_to_a_valid_response_when_no_parameters_are_provided.yml +178 -0
  202. data/test/cassettes/openstack/volume/v1/public/list_volumes/leads_to_a_valid_response_when_parameters_are_invalid.yml +95 -0
  203. data/test/cassettes/openstack/volume/v1/public/list_volumes/leads_to_a_valid_response_when_parameters_are_valid.yml +170 -0
  204. data/test/cassettes/openstack/volume/v1/public/list_volumes/returns_the_correct_value_for_body_.yml +62 -0
  205. data/test/cassettes/openstack/volume/v1/public/list_volumes/returns_the_correct_value_for_headers_.yml +62 -0
  206. data/test/cassettes/openstack/volume/v1/public/list_volumes/returns_the_correct_value_for_http_method_.yml +62 -0
  207. data/test/cassettes/openstack/volume/v1/public/root/leads_to_a_valid_response_when_no_parameters_are_provided.yml +36 -39
  208. data/test/cassettes/openstack/volume/v1/public/root/returns_the_correct_value_for_body_.yml +28 -31
  209. data/test/cassettes/openstack/volume/v1/public/root/returns_the_correct_value_for_headers_.yml +28 -31
  210. data/test/cassettes/openstack/volume/v1/public/root/returns_the_correct_value_for_http_method_.yml +28 -31
  211. data/test/cassettes/openstack/volume/v1/public/root/returns_the_correct_value_for_url_.yml +28 -31
  212. data/test/cassettes/openstack/volume/v1/public/update_volume/leads_to_a_valid_response_when_invalid_volume_id_is_provided.yml +96 -0
  213. data/test/cassettes/openstack/volume/v1/public/update_volume/leads_to_a_valid_response_when_valid_volume_id_is_provided.yml +179 -0
  214. data/test/cassettes/openstack/volume/v1/public/update_volume/returns_the_correct_value_for_body_.yml +62 -0
  215. data/test/cassettes/openstack/volume/v1/public/update_volume/returns_the_correct_value_for_headers_.yml +62 -0
  216. data/test/cassettes/openstack/volume/v1/public/update_volume/returns_the_correct_value_for_http_method_.yml +62 -0
  217. data/test/cassettes/openstack/volume/v1/public/update_volume/returns_the_correct_value_for_url_.yml +62 -0
  218. data/test/support/vcr_setup.rb +3 -3
  219. metadata +297 -4
  220. data/README.md.orig +0 -217
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MWFjN2RhZjk0MjY3Yjc3MzI4YzM2ZTAyZGUxYTY1YTdiN2FjNmY2NA==
4
+ ODAxM2VmMWQ3YzJmNWE1ZTdkODQ5Yzc4NGI2NDljNTdhODA1ZGM3NQ==
5
5
  data.tar.gz: !binary |-
6
- MzE0YzgxYjE3YTU5ZTg0ZTNlM2NmYTExM2NmMWU4Nzk1MjAxNDNmNQ==
6
+ Y2RjMzE0NmU2ZmRjMTdmYTE5MzhkODFmNDM1OWY4YWJkNDJmMWM1Mg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MmM2MWJlMGExNjU0OWNjOWUyZDY2ZmU4ZWEyMzE2Y2U0ODVkY2QxN2Y1MjU3
10
- MjQ3NTgzYWI2MzEzYmI0N2YzZTZlN2I2NmJhZWMzMTMxNWJjMGZkZTNkMTQ1
11
- NTkyZTU2YTZhYTc5OWIzNGFkYTQxZjE3YjA1ZGJhNDhlNjE2NmU=
9
+ YWQ3MDE0MGIzNWZhMzlkNzEzNGRjYjc0OGQ0NzRhNWY4MmU4NjMzMGRhNjgz
10
+ ODUwZDQ0MDI0MzdhMTcxZWRmNzViZTQ3MDgzNTc3NzU1YThjNzY1NDE0Yzcw
11
+ YmVjNmJmMjJlZTQ0NmEyYzkxNDZiOGM0NjAyMDUzMThhYTkyOGE=
12
12
  data.tar.gz: !binary |-
13
- YjMxYTgwYzI1MDM2NDdkNzg5NWYxMTY5MjljMDE5OTI4Y2M2OWViYTE5M2Jk
14
- OWJmMTNmODdiYmFmYjg4Mzc0MmZjMTI0NzA4MDQ2ZTJiMDIwZjI4NGRiMjQz
15
- MzlmM2YxY2Q1OTk4ZDA2YjU5MzczMWIxNWUxOWQ4NWZjNDQzNmI=
13
+ ZDBjY2EwMjhlYTBiYTcxMTc0ZjZjNzkzNDA1Y2UwYTRkNWZiODZiN2E5Zjk0
14
+ MTdiZjc4Mzk1MmNmMmExNTEyNWVmYjExZWVhODE3ZjRiMTM3OTEwMGNlNzc5
15
+ NDlmMWQ4ODQyMzRiNzc3NWQwMjhhNjEwMTU1OTg5YTg0MDVjZjA=
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  ![Aviator](https://raw.github.com/aviator/www/gh-pages/images/logo-small.png)
2
2
  <br/>A lightweight library for communicating with the OpenStack API.
3
3
 
4
- ## Project Stats
5
-
6
4
  [![Build Status](https://travis-ci.org/aviator/aviator.png?branch=master)](https://travis-ci.org/aviator/aviator)
7
5
  [![Coverage Status](https://coveralls.io/repos/aviator/aviator/badge.png?branch=master)](https://coveralls.io/r/aviator/aviator?branch=master)
8
6
  [![Code Climate](https://codeclimate.com/github/aviator/aviator.png)](https://codeclimate.com/github/aviator/aviator)
@@ -10,205 +8,4 @@
10
8
  [![Dependency Status](https://gemnasium.com/aviator/aviator.png)](https://gemnasium.com/aviator/aviator)
11
9
 
12
10
 
13
- ## Installation
14
-
15
- Add this line to your application's Gemfile:
16
-
17
- gem 'aviator'
18
-
19
- Or if you want to live on the edge:
20
-
21
- gem 'aviator', :git => 'git@github.com:aviator/aviator.git', :branch => 'develop'
22
-
23
- And then execute:
24
-
25
- $ bundle
26
-
27
- Or install it yourself as:
28
-
29
- $ gem install aviator
30
-
31
- ## Usage
32
-
33
- ```ruby
34
- require 'aviator'
35
-
36
- # Create a new session. See 'Configuration' below for the config file format.
37
- session = Aviator::Session.new(
38
- config_file: 'path/to/aviator.yml',
39
- environment: :production,
40
- log_file: 'path/to/aviator.log'
41
- )
42
-
43
- # Authenticate against the auth service specified in :config_file. If no
44
- # credentials are available in the config file, this line will throw an error.
45
- session.authenticate
46
-
47
- # You can re-authenticate anytime. Note that this creates a new token in the
48
- # underlying environment while the old token is discarded by the Session object.
49
- # Be aware of this fact as it might unnecessarily generate too many tokens.
50
- #
51
- # Notice how you can override the credentials in the config file. Also note that
52
- # the keys used below (:username, :password, :tenantName) match the name as
53
- # indicated in the official OpenStack documentation.
54
- session.authenticate do |credentials|
55
- credentials[:username] = myusername
56
- credentials[:password] = mypassword
57
- credentials[:tenantName] = tenantName
58
- end
59
-
60
- # Serialize the session information for caching. The output is in plaintext JSON which
61
- # contains sensitive information. You are responsible for securing that.
62
- str = session.dump
63
-
64
- # Create a new Session object from a session dump. This DOES NOT create a new token.
65
- # If you employed any form of encryption on the string, make sure to decrypt it first!
66
- session = Aviator::Session.load(str)
67
-
68
- # In some instances, Session::load is inefficient because it creates a new session object
69
- # each time. In a web app environment, for instance, having to destroy and recreate the
70
- # session object can take its toll on performance. In such a scenario, use Session#load
71
- # (instance method, as opposed to class method). This will 'infect' an already existing
72
- # session object with the supplied session dump and return itself instead of creating
73
- # a brand new session object.
74
- session.load(other_session_dump)
75
-
76
- # Depending on how old the loaded session dump is, its session data may already be expired.
77
- # Check if it's still current by calling Session#validate and reauthenticate as needed.
78
- #
79
- # IMPORTANT: The validator must be defined in the config file and it must refer to the
80
- # name of a request that is known to Aviator. See 'Configuration' below for examples
81
- session.authenticate unless session.validate
82
-
83
- # If you want the newly created session to log its output, make sure to indicate it on load
84
- session = Aviator::Session.load(str, log_file: 'path/to/aviator.log')
85
-
86
- # Get a handle to the Identity Service.
87
- keystone = session.identity_service
88
-
89
- # Create a new tenant
90
- response = keystone.request(:create_tenant) do |params|
91
- params[:name] = 'Project'
92
- params[:description] = 'My Project'
93
- params[:enabled] = true
94
- end
95
-
96
- # Aviator uses parameter names as defined in the official OpenStack API doc. You can
97
- # also access the params via dot notation (e.g. params.description) or by using a string
98
- # for a hash key (e.g. params['description']). However, keep in mind that OpenStack
99
- # parameters that have dashes and other characters that are not valid for method names
100
- # and symbols can only be expressed as strings. E.g. params['changes-since']
101
-
102
-
103
- # Be explicit about the endpoint type. Useful in those rare instances when
104
- # the same request name means differently depending on the endpoint type.
105
- # For example, in OpenStack, :list_tenants will return only the tenants the
106
- # user is a member of in the public endpoint whereas the admin endpoint will
107
- # return all tenants in the system.
108
- response = keystone.request(:list_tenants, endpoint_type: 'admin')
109
- ```
110
-
111
- ## Configuration
112
-
113
- The configuration file is a simple YAML file that can have one or more environment definitions.
114
-
115
- ```
116
- production:
117
- provider: openstack
118
- auth_service:
119
- name: identity
120
- host_uri: http://my.openstackenv.org:5000
121
- request: create_token
122
- validator: list_tenants # Request to make for validating the session
123
- api_version: v2 # Optional if version is indicated in host_uri
124
- auth_credentials:
125
- username: admin
126
- password: mypassword
127
- tenantName: myproject
128
-
129
- development_1:
130
- provider: openstack
131
- auth_service:
132
- name: identity
133
- host_uri: http://devstack:5000/v2.0
134
- request: create_token
135
- validator: list_tenants
136
- auth_credentials:
137
- tokenId: 2c963f5512d067b24fdc312707c80c7a6d3d261b
138
- tenantName: admin
139
-
140
- development_2:
141
- provider: openstack
142
- auth_service:
143
- name: identity
144
- host_uri: http://devstack:5000/v2.0
145
- request: create_token
146
- validator: list_tenants
147
- auth_credentials:
148
- username: admin
149
- password: mypassword
150
- tenantName: myproject
151
- ```
152
-
153
- A note on the validator: it can be any request as long as
154
-
155
- 1. It is defined in Aviator
156
- 1. Does not require any parameters
157
- 1. It returns an HTTP status 200 or 203 to indicate auth info validity.
158
- 1. It returns any other HTTP status to indicate that the auth info is invalid.
159
-
160
- ## CLI tools
161
-
162
- List available providers. Includes only OpenStack for now.
163
-
164
- ```bash
165
- $ aviator describe
166
- ```
167
-
168
- List available services for OpenStack.
169
-
170
- ```bash
171
- $ aviator describe openstack
172
- ```
173
-
174
- List available requests for Keystone
175
-
176
- ```bash
177
- $ aviator describe openstack identity
178
- ```
179
-
180
- Describe Keystone's create_tenant request
181
-
182
- ```bash
183
- $ aviator describe openstack identity v2 admin create_tenant
184
- ```
185
-
186
- The last command above will display:
187
-
188
- ```bash
189
- Request: create_tenant
190
-
191
- Parameters:
192
- (required) description
193
- (required) enabled
194
- (required) name
195
-
196
- Sample Code:
197
- session.identity_service.request(:create_tenant, endpoint_type: 'admin') do |params|
198
- params['name'] = value
199
- params['description'] = value
200
- params['enabled'] = value
201
- end
202
-
203
- Links:
204
- documentation:
205
- http://docs.openstack.org/api/openstack-identity-service/2.0/content/
206
- ```
207
-
208
- ## Contributing
209
-
210
- 1. Fork it
211
- 2. Create your feature branch (`git checkout -b my-new-feature`)
212
- 3. Commit your changes (`git commit -am 'Add some feature'`)
213
- 4. Push to the branch (`git push origin my-new-feature`)
214
- 5. Create new Pull Request
11
+ <a href="http://aviator.github.io/www/">Usage and Installation</a>
data/aviator.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["mmaglana@gmail.com"]
11
11
  spec.description = %q{ A lightweight Ruby library for the OpenStack API }
12
12
  spec.summary = %q{ A lightweight Ruby library for the OpenStack API }
13
- spec.homepage = "https://github.com/aviator/aviator"
13
+ spec.homepage = "http://aviator.github.io/www/"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
@@ -21,7 +21,8 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency 'faraday', '~> 0.8.0'
22
22
  spec.add_dependency 'activesupport', '>= 3.2.8'
23
23
  spec.add_dependency 'thor', '~> 0.18.1'
24
-
24
+ spec.add_dependency 'terminal-table', '>= 1.4.5'
25
+
25
26
  spec.add_development_dependency "bundler", "~> 1.3"
26
27
  spec.add_development_dependency "rake"
27
28
  spec.add_development_dependency 'rb-fsevent', '~> 0.9.0'
@@ -1,37 +1,25 @@
1
1
  module Aviator
2
-
3
- module Describer
4
2
 
5
- def self.describe_aviator
6
- provider_names = Pathname.new(__FILE__)
7
- .join('..', '..', '..')
8
- .children
9
- .select{|c| c.directory? && c.basename.to_s != 'core' }
10
- .map{|c| c.basename.to_s }
3
+ class Describer
11
4
 
5
+ def self.describe_aviator
12
6
  str = "Available providers:\n"
13
7
 
14
8
  provider_names.each do |provider_name|
15
9
  str << " #{ provider_name }\n"
16
10
  end
17
-
11
+
18
12
  str
19
13
  end
20
14
 
21
15
 
22
16
  def self.describe_provider(provider_name)
23
- service_names = Pathname.new(__FILE__)
24
- .join('..', '..', '..', provider_name)
25
- .children
26
- .select{|c| c.directory? }
27
- .map{|c| c.basename.to_s }
28
-
29
17
  str = "Available services for #{ provider_name }:\n"
30
18
 
31
- service_names.each do |service_name|
19
+ service_names(provider_name).each do |service_name|
32
20
  str << " #{ service_name }\n"
33
21
  end
34
-
22
+
35
23
  str
36
24
  end
37
25
 
@@ -40,56 +28,119 @@ module Aviator
40
28
  service = Aviator::Service.new provider: provider_name, service: service_name
41
29
  request_class = "Aviator::#{ provider_name.camelize }::#{ service_name.camelize }::"\
42
30
  "#{ api_version.camelize }::#{ endpoint_type.camelize }::#{ request_name.camelize }".constantize
43
-
44
- str = "Request: #{ request_name }\n\n"
45
-
46
- str << "Parameters:\n"
47
-
48
- params = request_class.optional_params.map{|p| [p, :optional]} +
49
- request_class.required_params.map{|p| [p, :required]}
50
-
51
- params.sort{|a,b| a[0].to_s <=> b[0].to_s }.each do |param|
52
- str << " (#{ param[1].to_s }) #{ param[0] }\n"
31
+
32
+ display = "Request: #{ request_name }\n"
33
+
34
+
35
+ # Build the parameters
36
+ params = request_class.optional_params.map{|p| [p, false]} +
37
+ request_class.required_params.map{|p| [p, true]}
38
+
39
+ aliases = request_class.param_aliases
40
+
41
+ if params.length > 0
42
+ display << "\n"
43
+
44
+ headings = ['NAME', 'REQUIRED']
45
+
46
+ headings << 'ALIAS' if aliases.length > 0
47
+
48
+ rows = []
49
+ params.sort{|a,b| a[0].to_s <=> b[0].to_s }.each do |param|
50
+ row = [ param[0], param[1] ? 'Y' : 'N' ]
51
+
52
+ if aliases.length > 0
53
+ row << (aliases.find{|a,p| p == param[0] } || [''])[0]
54
+ end
55
+
56
+ rows << row
57
+ end
58
+
59
+ widths = [
60
+ rows.map{|row| row[0].length }.max,
61
+ rows.map{|row| row[1].length }.max
62
+ ]
63
+
64
+ widths << rows.map{|row| row[2].length }.max if aliases.length > 0
65
+
66
+ table = Terminal::Table.new(headings: headings, rows: rows)
67
+
68
+ table.align_column(1, :center)
69
+
70
+ display << "Parameters:\n"
71
+ display << " " + table.to_s.split("\n").join("\n ")
72
+ display << "\n"
53
73
  end
54
-
55
- str << "\nSample Code:\n"
56
74
 
57
- str << " session.#{ service_name }_service.request(:#{ request_name }, endpoint_type: '#{ request_class.endpoint_type }')"
58
- if params
59
- str << " do |params|\n"
75
+
76
+ # Build the sample code
77
+ display << "\nSample Code:\n"
78
+
79
+ display << " session.#{ service_name }_service.request(:#{ request_name })"
80
+
81
+ if params && params.length > 0
82
+ display << " do |params|\n"
60
83
  params.each do |pair|
61
- str << " params['#{ pair[0] }'] = value\n"
84
+ display << " params.#{ (aliases.find{|a,p| p == pair[0] } || pair)[0] } = value\n"
62
85
  end
63
- str << " end\n"
86
+ display << " end"
64
87
  end
65
-
66
- if request_class.links
67
- str << "\nLinks:\n"
68
-
88
+
89
+ display << "\n"
90
+
91
+
92
+ # Build the links
93
+ if request_class.links && request_class.links.length > 0
94
+ display << "\nLinks:\n"
95
+
69
96
  request_class.links.each do |link|
70
- str << " #{ link[:rel] }:\n"
71
- str << " #{ link[:href] }\n"
97
+ display << " #{ link[:rel] }:\n"
98
+ display << " #{ link[:href] }\n"
72
99
  end
73
100
  end
74
-
75
- str
101
+
102
+ display
76
103
  end
77
104
 
78
105
 
79
106
  def self.describe_service(provider_name, service_name)
80
- service = Aviator::Service.new(provider: provider_name, service: service_name)
81
- klasses = service.request_classes
82
-
83
107
  str = "Available requests for #{ provider_name } #{ service_name }_service:\n"
84
108
 
85
- klasses.each do |klass|
109
+ request_classes(provider_name, service_name).each do |klass|
86
110
  str << " #{ klass.api_version } #{ klass.endpoint_type } #{ klass.name.split('::').last.underscore }\n"
87
111
  end
88
-
112
+
89
113
  str
90
114
  end
91
115
 
92
116
 
117
+ class <<self
118
+ private
119
+
120
+ def provider_names
121
+ Pathname.new(__FILE__)
122
+ .join('..', '..', '..')
123
+ .children
124
+ .select{|c| c.directory? && c.basename.to_s != 'core' }
125
+ .map{|c| c.basename.to_s }
126
+ end
127
+
128
+
129
+ def request_classes(provider_name, service_name)
130
+ service = Aviator::Service.new(provider: provider_name, service: service_name)
131
+ service.request_classes
132
+ end
133
+
134
+
135
+ def service_names(provider_name)
136
+ Pathname.new(__FILE__)
137
+ .join('..', '..', '..', provider_name)
138
+ .children
139
+ .select{|c| c.directory? }
140
+ .map{|c| c.basename.to_s }
141
+ end
142
+ end
143
+
93
144
  end
94
-
145
+
95
146
  end
@@ -1 +1,2 @@
1
+ require "terminal-table"
1
2
  require "aviator/core/cli/describer"
@@ -53,7 +53,7 @@ module Aviator
53
53
  def links
54
54
  self.class.links
55
55
  end
56
-
56
+
57
57
 
58
58
  def optional_params
59
59
  self.class.optional_params
@@ -83,7 +83,7 @@ module Aviator
83
83
  def querystring?
84
84
  self.class.querystring?
85
85
  end
86
-
86
+
87
87
 
88
88
  def url?
89
89
  self.class.url?
@@ -121,18 +121,23 @@ module Aviator
121
121
  def headers?
122
122
  instance_methods.include? :headers
123
123
  end
124
-
125
-
124
+
125
+
126
126
  def links
127
127
  @links ||= []
128
128
  end
129
129
 
130
130
 
131
+ def param_aliases
132
+ @param_aliases ||= {}
133
+ end
134
+
135
+
131
136
  def params_class
132
137
  all_params = required_params + optional_params
133
138
 
134
- if all_params.length > 0
135
- @params_class ||= Struct.new(*all_params)
139
+ if all_params.length > 0 && @params_class.nil?
140
+ @params_class = build_params_class(all_params, self.param_aliases)
136
141
  end
137
142
 
138
143
  @params_class
@@ -147,12 +152,12 @@ module Aviator
147
152
  def querystring?
148
153
  instance_methods.include? :querystring
149
154
  end
150
-
155
+
151
156
 
152
157
  def required_params
153
158
  @required_params ||= []
154
159
  end
155
-
160
+
156
161
 
157
162
  def url?
158
163
  instance_methods.include? :url
@@ -162,6 +167,34 @@ module Aviator
162
167
  private
163
168
 
164
169
 
170
+ def build_params_class(all_params, param_aliases)
171
+ Struct.new(*all_params) do
172
+ alias :param_getter :[]
173
+ alias :param_setter :[]=
174
+
175
+ define_method :[] do |key|
176
+ key = param_aliases[key.to_sym] if param_aliases.keys.include? key.to_sym
177
+ param_getter(key)
178
+ end
179
+
180
+ define_method :[]= do |key, value|
181
+ key = param_aliases[key.to_sym] if param_aliases.keys.include? key.to_sym
182
+ param_setter(key, value)
183
+ end
184
+
185
+ param_aliases.each do |param_alias, param_name|
186
+ define_method param_alias do
187
+ param_getter(param_name)
188
+ end
189
+
190
+ define_method "#{ param_alias }=" do |value|
191
+ param_setter(param_name, value)
192
+ end
193
+ end
194
+ end
195
+ end
196
+
197
+
165
198
  def link(rel, href)
166
199
  links << { rel: rel, href: href }
167
200
  end
@@ -176,12 +209,16 @@ module Aviator
176
209
  self.class.send(attr_name)
177
210
  end
178
211
  end
179
-
212
+
180
213
 
181
214
  def param(param_name, opts={})
182
215
  opts = opts.with_indifferent_access
183
216
  list = (opts[:required] == false ? optional_params : required_params)
184
217
  list << param_name unless optional_params.include?(param_name)
218
+
219
+ if opts[:alias]
220
+ self.param_aliases[opts[:alias]] = param_name
221
+ end
185
222
  end
186
223
 
187
224
  end
@@ -1,37 +1,89 @@
1
1
  module Aviator
2
2
 
3
- class << self
4
-
5
- def define_request(request_name, &block)
6
- class_obj = Class.new(Request, &block)
7
-
8
- set_class_name(
9
- Aviator,
10
- class_obj,
11
-
12
- class_obj.provider,
13
- class_obj.service,
14
- class_obj.api_version,
15
- class_obj.endpoint_type,
16
- request_name
17
- )
3
+ class BaseRequestNotFoundError < StandardError
4
+ attr_reader :base_request_hierarchy
5
+
6
+ def initialize(base_hierarchy)
7
+ @base_request_hierarchy = base_hierarchy
8
+ super("#{ base_request_hierarchy } could not be found!")
18
9
  end
19
-
20
-
21
- private
22
-
23
- def set_class_name(base, obj, *hierarchy)
24
- const_name = hierarchy.shift.to_s.camelize
25
-
26
- const = if base.const_defined?(const_name, false)
27
- base.const_get(const_name, false)
28
- else
29
- base.const_set(const_name, (hierarchy.empty? ? obj : Module.new))
30
- end
31
-
32
- hierarchy.empty? ? const : set_class_name(const, obj, *hierarchy)
10
+ end
11
+
12
+
13
+ class RequestAlreadyDefinedError < StandardError
14
+ attr_reader :namespace,
15
+ :request_name
16
+
17
+ def initialize(namespace, request_name)
18
+ @namespace = namespace
19
+ @request_name = request_name
20
+ super("#{ namespace }::#{ request_name } is already defined")
33
21
  end
34
-
22
+ end
23
+
24
+
25
+ class RequestBuilder
26
+
27
+ class << self
28
+
29
+ def define_request(root_namespace, request_name, options, &block)
30
+ base_klass = get_request_class(root_namespace, options[:inherit])
31
+
32
+ klass = Class.new(base_klass, &block)
33
+
34
+ namespace_arr = [
35
+ klass.provider,
36
+ klass.service,
37
+ klass.api_version,
38
+ klass.endpoint_type
39
+ ]
40
+
41
+ namespace = namespace_arr.inject(root_namespace) do |namespace, sym|
42
+ const_name = sym.to_s.camelize
43
+ namespace.const_set(const_name, Module.new) unless namespace.const_defined?(const_name, false)
44
+ namespace.const_get(const_name, false)
45
+ end
46
+
47
+ klassname = request_name.to_s.camelize
48
+
49
+ if namespace.const_defined?(klassname, false)
50
+ raise RequestAlreadyDefinedError.new(namespace, klassname)
51
+ end
52
+
53
+ namespace.const_set(klassname, klass)
54
+ end
55
+
56
+
57
+ def get_request_class(root_namespace, request_class_arr)
58
+ request_class_arr.inject(root_namespace) do |namespace, sym|
59
+ namespace.const_get(sym.to_s.camelize, false)
60
+ end
61
+ rescue NameError => e
62
+ arr = ['..', '..'] + request_class_arr
63
+ arr[-1,1] = arr.last.to_s + '.rb'
64
+ path = Pathname.new(__FILE__).join(*arr.map{|i| i.to_s }).expand_path
65
+
66
+ if path.exist?
67
+ require path
68
+ request_class_arr.inject(root_namespace) do |namespace, sym|
69
+ namespace.const_get(sym.to_s.camelize, false)
70
+ end
71
+ else
72
+ raise BaseRequestNotFoundError.new(request_class_arr)
73
+ end
74
+ end
75
+
76
+ end
77
+
78
+ end
79
+
80
+
81
+ class << self
82
+
83
+ def define_request(request_name, options={ inherit: [:request] }, &block)
84
+ RequestBuilder.define_request self, request_name, options, &block
85
+ end
86
+
35
87
  end # class << self
36
88
 
37
89
  end