aviator 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
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