simple-client 0.0.2

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 (297) hide show
  1. data/.bundle/config +4 -0
  2. data/Gemfile +7 -0
  3. data/Gemfile.lock +23 -0
  4. data/bin/rake +16 -0
  5. data/lib/simple-client/simple-client.rb +229 -0
  6. data/lib/simple-client/version.rb +4 -0
  7. data/lib/simple-client.rb +1 -0
  8. data/test/test_simple-client.rb +236 -0
  9. data/vendor/bundle/ruby/1.8/bin/rake +19 -0
  10. data/vendor/bundle/ruby/1.8/cache/addressable-2.2.8.gem +0 -0
  11. data/vendor/bundle/ruby/1.8/cache/crack-0.3.1.gem +0 -0
  12. data/vendor/bundle/ruby/1.8/cache/rake-0.9.2.2.gem +0 -0
  13. data/vendor/bundle/ruby/1.8/cache/webmock-1.8.8.gem +0 -0
  14. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/CHANGELOG.md +126 -0
  15. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/Gemfile +17 -0
  16. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/Gemfile.lock +35 -0
  17. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/LICENSE.txt +202 -0
  18. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/README.md +83 -0
  19. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/Rakefile +37 -0
  20. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/lib/addressable/idna/native.rb +43 -0
  21. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/lib/addressable/idna/pure.rb +4886 -0
  22. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/lib/addressable/idna.rb +25 -0
  23. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/lib/addressable/template.rb +1047 -0
  24. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/lib/addressable/uri.rb +2288 -0
  25. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/lib/addressable/version.rb +30 -0
  26. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/spec/addressable/idna_spec.rb +216 -0
  27. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/spec/addressable/net_http_compat_spec.rb +26 -0
  28. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/spec/addressable/template_spec.rb +2144 -0
  29. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/spec/addressable/uri_spec.rb +4928 -0
  30. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/tasks/clobber.rake +2 -0
  31. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/tasks/gem.rake +85 -0
  32. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/tasks/git.rake +45 -0
  33. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/tasks/metrics.rake +22 -0
  34. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/tasks/rspec.rake +58 -0
  35. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/tasks/rubyforge.rake +89 -0
  36. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/tasks/yard.rake +27 -0
  37. data/vendor/bundle/ruby/1.8/gems/addressable-2.2.8/website/index.html +110 -0
  38. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/History +25 -0
  39. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/LICENSE +20 -0
  40. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/README.rdoc +42 -0
  41. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/Rakefile +32 -0
  42. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/crack.gemspec +53 -0
  43. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/lib/crack/json.rb +79 -0
  44. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/lib/crack/util.rb +17 -0
  45. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/lib/crack/xml.rb +232 -0
  46. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/lib/crack.rb +8 -0
  47. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/test/crack_test.rb +4 -0
  48. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/test/data/twittersearch-firefox.json +1 -0
  49. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/test/data/twittersearch-ie.json +1 -0
  50. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/test/hash_test.rb +28 -0
  51. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/test/json_test.rb +82 -0
  52. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/test/parser_test.rb +27 -0
  53. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/test/string_test.rb +31 -0
  54. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/test/test_helper.rb +12 -0
  55. data/vendor/bundle/ruby/1.8/gems/crack-0.3.1/test/xml_test.rb +499 -0
  56. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/CHANGES +522 -0
  57. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/MIT-LICENSE +21 -0
  58. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/README.rdoc +197 -0
  59. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/Rakefile +369 -0
  60. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/TODO +20 -0
  61. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/bin/rake +33 -0
  62. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/command_line_usage.rdoc +114 -0
  63. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/example/Rakefile1 +38 -0
  64. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/example/Rakefile2 +35 -0
  65. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/example/a.c +6 -0
  66. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/example/b.c +6 -0
  67. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/example/main.c +11 -0
  68. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/glossary.rdoc +51 -0
  69. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/jamis.rb +591 -0
  70. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/proto_rake.rdoc +127 -0
  71. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/rake.1.gz +0 -0
  72. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/rakefile.rdoc +557 -0
  73. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/rational.rdoc +151 -0
  74. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.4.14.rdoc +23 -0
  75. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.4.15.rdoc +35 -0
  76. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.5.0.rdoc +53 -0
  77. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.5.3.rdoc +78 -0
  78. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.5.4.rdoc +46 -0
  79. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.6.0.rdoc +141 -0
  80. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.7.0.rdoc +119 -0
  81. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.7.1.rdoc +59 -0
  82. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.7.2.rdoc +121 -0
  83. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.7.3.rdoc +47 -0
  84. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.8.0.rdoc +114 -0
  85. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.8.2.rdoc +165 -0
  86. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.8.3.rdoc +112 -0
  87. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.8.4.rdoc +147 -0
  88. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.8.5.rdoc +53 -0
  89. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.8.6.rdoc +55 -0
  90. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.8.7.rdoc +55 -0
  91. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.9.0.rdoc +112 -0
  92. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.9.1.rdoc +52 -0
  93. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/doc/release_notes/rake-0.9.2.rdoc +49 -0
  94. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/install.rb +90 -0
  95. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/alt_system.rb +109 -0
  96. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/application.rb +595 -0
  97. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/classic_namespace.rb +11 -0
  98. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/clean.rb +32 -0
  99. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/cloneable.rb +25 -0
  100. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/contrib/compositepublisher.rb +21 -0
  101. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/contrib/ftptools.rb +150 -0
  102. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/contrib/publisher.rb +73 -0
  103. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/contrib/rubyforgepublisher.rb +16 -0
  104. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/contrib/sshpublisher.rb +50 -0
  105. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/contrib/sys.rb +191 -0
  106. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/default_loader.rb +10 -0
  107. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/dsl_definition.rb +176 -0
  108. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/early_time.rb +18 -0
  109. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/ext/core.rb +27 -0
  110. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/ext/module.rb +39 -0
  111. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/ext/string.rb +167 -0
  112. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/ext/time.rb +14 -0
  113. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/file_creation_task.rb +24 -0
  114. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/file_list.rb +403 -0
  115. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/file_task.rb +47 -0
  116. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/file_utils.rb +114 -0
  117. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/file_utils_ext.rb +145 -0
  118. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/gempackagetask.rb +15 -0
  119. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/invocation_chain.rb +51 -0
  120. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/invocation_exception_mixin.rb +16 -0
  121. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/loaders/makefile.rb +40 -0
  122. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/multi_task.rb +16 -0
  123. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/name_space.rb +25 -0
  124. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/packagetask.rb +185 -0
  125. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/pathmap.rb +1 -0
  126. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/pseudo_status.rb +24 -0
  127. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/rake_module.rb +29 -0
  128. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb +22 -0
  129. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/rdoctask.rb +234 -0
  130. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/ruby182_test_unit_fix.rb +25 -0
  131. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/rule_recursion_overflow_error.rb +20 -0
  132. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/runtest.rb +21 -0
  133. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/task.rb +327 -0
  134. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/task_argument_error.rb +7 -0
  135. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/task_arguments.rb +78 -0
  136. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/task_manager.rb +307 -0
  137. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/tasklib.rb +22 -0
  138. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/testtask.rb +191 -0
  139. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/version.rb +8 -0
  140. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake/win32.rb +55 -0
  141. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/lib/rake.rb +69 -0
  142. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/file_creation.rb +34 -0
  143. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/helper.rb +492 -0
  144. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake.rb +40 -0
  145. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_application.rb +489 -0
  146. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_application_options.rb +335 -0
  147. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_clean.rb +14 -0
  148. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_definitions.rb +80 -0
  149. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_directory_task.rb +46 -0
  150. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_dsl.rb +77 -0
  151. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_early_time.rb +31 -0
  152. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_extension.rb +59 -0
  153. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_file_creation_task.rb +56 -0
  154. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_file_list.rb +628 -0
  155. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_file_list_path_map.rb +8 -0
  156. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_file_task.rb +102 -0
  157. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_file_utils.rb +305 -0
  158. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_ftp_file.rb +59 -0
  159. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_functional.rb +450 -0
  160. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_invocation_chain.rb +52 -0
  161. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_makefile_loader.rb +44 -0
  162. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_multi_task.rb +51 -0
  163. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_name_space.rb +43 -0
  164. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_package_task.rb +79 -0
  165. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_path_map.rb +157 -0
  166. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_path_map_explode.rb +34 -0
  167. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_path_map_partial.rb +18 -0
  168. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_pseudo_status.rb +21 -0
  169. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_rake_test_loader.rb +21 -0
  170. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_rdoc_task.rb +83 -0
  171. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_require.rb +40 -0
  172. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_rules.rb +327 -0
  173. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_task.rb +267 -0
  174. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_task_argument_parsing.rb +103 -0
  175. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_task_arguments.rb +88 -0
  176. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_task_lib.rb +9 -0
  177. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_task_manager.rb +157 -0
  178. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_task_manager_argument_resolution.rb +36 -0
  179. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_task_with_arguments.rb +173 -0
  180. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_test_task.rb +120 -0
  181. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_top_level_functions.rb +111 -0
  182. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_rake_win32.rb +72 -0
  183. data/vendor/bundle/ruby/1.8/gems/rake-0.9.2.2/test/test_sys.rb +20 -0
  184. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/CHANGELOG.md +749 -0
  185. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/Gemfile +21 -0
  186. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/Guardfile +24 -0
  187. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/LICENSE +20 -0
  188. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/README.md +728 -0
  189. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/Rakefile +65 -0
  190. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/api.rb +63 -0
  191. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/assertion_failure.rb +11 -0
  192. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/callback_registry.rb +35 -0
  193. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/config.rb +10 -0
  194. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/cucumber.rb +8 -0
  195. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/deprecation.rb +9 -0
  196. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/errors.rb +33 -0
  197. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/http_lib_adapters/curb_adapter.rb +287 -0
  198. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/http_lib_adapters/em_http_request/em_http_request_0_x.rb +151 -0
  199. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/http_lib_adapters/em_http_request/em_http_request_1_x.rb +212 -0
  200. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +11 -0
  201. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/http_lib_adapters/excon_adapter.rb +95 -0
  202. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/http_lib_adapters/http_lib_adapter.rb +7 -0
  203. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/http_lib_adapters/http_lib_adapter_registry.rb +19 -0
  204. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/http_lib_adapters/httpclient_adapter.rb +193 -0
  205. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/http_lib_adapters/net_http.rb +279 -0
  206. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/http_lib_adapters/net_http_response.rb +34 -0
  207. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/http_lib_adapters/patron_adapter.rb +129 -0
  208. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +180 -0
  209. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/matchers/hash_including_matcher.rb +25 -0
  210. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/minitest.rb +15 -0
  211. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/rack_response.rb +63 -0
  212. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/request_execution_verifier.rb +56 -0
  213. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/request_pattern.rb +282 -0
  214. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/request_registry.rb +35 -0
  215. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/request_signature.rb +50 -0
  216. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/request_stub.rb +97 -0
  217. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/response.rb +144 -0
  218. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/responses_sequence.rb +40 -0
  219. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/rspec/matchers/request_pattern_matcher.rb +42 -0
  220. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/rspec/matchers/webmock_matcher.rb +46 -0
  221. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/rspec/matchers.rb +28 -0
  222. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/rspec.rb +33 -0
  223. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/stub_registry.rb +61 -0
  224. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/stub_request_snippet.rb +30 -0
  225. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/test_unit.rb +20 -0
  226. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/util/hash_counter.rb +25 -0
  227. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/util/hash_keys_stringifier.rb +23 -0
  228. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/util/headers.rb +43 -0
  229. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/util/json.rb +54 -0
  230. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/util/uri.rb +101 -0
  231. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/util/version_checker.rb +73 -0
  232. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/version.rb +3 -0
  233. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock/webmock.rb +124 -0
  234. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/lib/webmock.rb +49 -0
  235. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/minitest/test_helper.rb +29 -0
  236. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/minitest/test_webmock.rb +6 -0
  237. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/minitest/webmock_spec.rb +50 -0
  238. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/curb/curb_spec.rb +340 -0
  239. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/curb/curb_spec_helper.rb +144 -0
  240. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/em_http_request/em_http_request_spec.rb +183 -0
  241. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/em_http_request/em_http_request_spec_helper.rb +72 -0
  242. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/excon/excon_spec.rb +15 -0
  243. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/excon/excon_spec_helper.rb +38 -0
  244. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/httpclient/httpclient_spec.rb +76 -0
  245. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/httpclient/httpclient_spec_helper.rb +48 -0
  246. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/net_http/net_http_shared.rb +125 -0
  247. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/net_http/net_http_spec.rb +255 -0
  248. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/net_http/net_http_spec_helper.rb +55 -0
  249. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/net_http/real_net_http_spec.rb +20 -0
  250. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/patron/patron_spec.rb +136 -0
  251. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/patron/patron_spec_helper.rb +50 -0
  252. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +142 -0
  253. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/shared/callbacks.rb +146 -0
  254. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/shared/complex_cross_concern_behaviors.rb +36 -0
  255. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/shared/enabling_and_disabling_webmock.rb +95 -0
  256. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/shared/precedence_of_stubs.rb +15 -0
  257. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/shared/request_expectations.rb +666 -0
  258. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/shared/returning_declared_responses.rb +367 -0
  259. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/shared/stubbing_requests.rb +447 -0
  260. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/typhoeus/typhoeus_hydra_spec.rb +74 -0
  261. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +56 -0
  262. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/acceptance/webmock_shared.rb +41 -0
  263. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/quality_spec.rb +60 -0
  264. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/spec_helper.rb +57 -0
  265. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/support/example_curl_output.txt +22 -0
  266. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/support/my_rack_app.rb +48 -0
  267. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/support/network_connection.rb +25 -0
  268. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/support/webmock_server.rb +65 -0
  269. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/errors_spec.rb +32 -0
  270. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/http_lib_adapters/http_lib_adapter_registry_spec.rb +17 -0
  271. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/http_lib_adapters/http_lib_adapter_spec.rb +12 -0
  272. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/rack_response_spec.rb +74 -0
  273. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/request_execution_verifier_spec.rb +100 -0
  274. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/request_pattern_spec.rb +479 -0
  275. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/request_registry_spec.rb +75 -0
  276. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/request_signature_spec.rb +113 -0
  277. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/request_stub_spec.rb +198 -0
  278. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/response_spec.rb +267 -0
  279. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/stub_registry_spec.rb +86 -0
  280. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/stub_request_snippet_spec.rb +95 -0
  281. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/util/hash_counter_spec.rb +39 -0
  282. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/util/hash_keys_stringifier_spec.rb +27 -0
  283. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/util/headers_spec.rb +28 -0
  284. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/util/json_spec.rb +7 -0
  285. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/util/uri_spec.rb +257 -0
  286. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/util/version_checker_spec.rb +59 -0
  287. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/spec/unit/webmock_spec.rb +7 -0
  288. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/test/http_request.rb +24 -0
  289. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/test/shared_test.rb +76 -0
  290. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/test/test_helper.rb +23 -0
  291. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/test/test_webmock.rb +6 -0
  292. data/vendor/bundle/ruby/1.8/gems/webmock-1.8.8/webmock.gemspec +35 -0
  293. data/vendor/bundle/ruby/1.8/specifications/addressable-2.2.8.gemspec +38 -0
  294. data/vendor/bundle/ruby/1.8/specifications/crack-0.3.1.gemspec +25 -0
  295. data/vendor/bundle/ruby/1.8/specifications/rake-0.9.2.2.gemspec +33 -0
  296. data/vendor/bundle/ruby/1.8/specifications/webmock-1.8.8.gemspec +61 -0
  297. metadata +390 -0
@@ -0,0 +1,279 @@
1
+ require 'net/http'
2
+ require 'net/https'
3
+ require 'stringio'
4
+ require File.join(File.dirname(__FILE__), 'net_http_response')
5
+
6
+
7
+ module WebMock
8
+ module HttpLibAdapters
9
+ class NetHttpAdapter < HttpLibAdapter
10
+ adapter_for :net_http
11
+
12
+ OriginalNetHTTP = Net::HTTP unless const_defined?(:OriginalNetHTTP)
13
+ OriginalNetBufferedIO = Net::BufferedIO unless const_defined?(:OriginalNetBufferedIO)
14
+
15
+ def self.enable!
16
+ Net.send(:remove_const, :BufferedIO)
17
+ Net.send(:remove_const, :HTTP)
18
+ Net.send(:remove_const, :HTTPSession)
19
+ Net.send(:const_set, :HTTP, @webMockNetHTTP)
20
+ Net.send(:const_set, :HTTPSession, @webMockNetHTTP)
21
+ Net.send(:const_set, :BufferedIO, Net::WebMockNetBufferedIO)
22
+ end
23
+
24
+ def self.disable!
25
+ Net.send(:remove_const, :BufferedIO)
26
+ Net.send(:remove_const, :HTTP)
27
+ Net.send(:remove_const, :HTTPSession)
28
+ Net.send(:const_set, :HTTP, OriginalNetHTTP)
29
+ Net.send(:const_set, :HTTPSession, OriginalNetHTTP)
30
+ Net.send(:const_set, :BufferedIO, OriginalNetBufferedIO)
31
+ end
32
+
33
+ @webMockNetHTTP = Class.new(Net::HTTP) do
34
+ class << self
35
+ def socket_type_with_webmock
36
+ StubSocket
37
+ end
38
+ alias_method :socket_type_without_webmock, :socket_type
39
+ alias_method :socket_type, :socket_type_with_webmock
40
+
41
+ if Module.method(:const_defined?).arity == 1
42
+ def const_defined?(name)
43
+ super || self.superclass.const_defined?(name)
44
+ end
45
+ else
46
+ def const_defined?(name, inherit=true)
47
+ super || self.superclass.const_defined?(name, inherit)
48
+ end
49
+ end
50
+
51
+ if Module.method(:const_get).arity != 1
52
+ def const_get(name, inherit=true)
53
+ super
54
+ rescue NameError
55
+ self.superclass.const_get(name, inherit)
56
+ end
57
+ end
58
+
59
+ if Module.method(:constants).arity != 0
60
+ def constants(inherit=true)
61
+ super + self.superclass.constants(inherit)
62
+ end
63
+ end
64
+ end
65
+
66
+ def request_with_webmock(request, body = nil, &block)
67
+ request_signature = WebMock::NetHTTPUtility.request_signature_from_request(self, request, body)
68
+
69
+ WebMock::RequestRegistry.instance.requested_signatures.put(request_signature)
70
+
71
+ if webmock_response = WebMock::StubRegistry.instance.response_for_request(request_signature)
72
+ @socket = Net::HTTP.socket_type.new
73
+ WebMock::CallbackRegistry.invoke_callbacks(
74
+ {:lib => :net_http}, request_signature, webmock_response)
75
+ build_net_http_response(webmock_response, &block)
76
+ elsif WebMock.net_connect_allowed?(request_signature.uri)
77
+ check_right_http_connection
78
+ after_request = lambda do |response|
79
+ if WebMock::CallbackRegistry.any_callbacks?
80
+ webmock_response = build_webmock_response(response)
81
+ WebMock::CallbackRegistry.invoke_callbacks(
82
+ {:lib => :net_http, :real_request => true}, request_signature, webmock_response)
83
+ end
84
+ response.extend Net::WebMockHTTPResponse
85
+ block.call response if block
86
+ response
87
+ end
88
+ response = if (started? && !WebMock::Config.instance.net_http_connect_on_start) || !started?
89
+ @started = false #otherwise start_with_connect wouldn't execute and connect
90
+ start_with_connect {
91
+ response = request_without_webmock(request, nil)
92
+ after_request.call(response)
93
+ }
94
+ else
95
+ response = request_without_webmock(request, nil)
96
+ after_request.call(response)
97
+ end
98
+ else
99
+ raise WebMock::NetConnectNotAllowedError.new(request_signature)
100
+ end
101
+ end
102
+ alias_method :request_without_webmock, :request
103
+ alias_method :request, :request_with_webmock
104
+
105
+ def start_without_connect
106
+ raise IOError, 'HTTP session already opened' if @started
107
+ if block_given?
108
+ begin
109
+ @started = true
110
+ return yield(self)
111
+ ensure
112
+ do_finish
113
+ end
114
+ end
115
+ @started = true
116
+ self
117
+ end
118
+
119
+ def start_with_conditional_connect(&block)
120
+ if WebMock::Config.instance.net_http_connect_on_start
121
+ start_with_connect(&block)
122
+ else
123
+ start_without_connect(&block)
124
+ end
125
+ end
126
+ alias_method :start_with_connect, :start
127
+ alias_method :start, :start_with_conditional_connect
128
+
129
+ def build_net_http_response(webmock_response, &block)
130
+ response = Net::HTTPResponse.send(:response_class, webmock_response.status[0].to_s).new("1.0", webmock_response.status[0].to_s, webmock_response.status[1])
131
+ body = webmock_response.body
132
+ body = nil if body.to_s == ''
133
+
134
+ response.instance_variable_set(:@body, body)
135
+ webmock_response.headers.to_a.each do |name, values|
136
+ values = [values] unless values.is_a?(Array)
137
+ values.each do |value|
138
+ response.add_field(name, value)
139
+ end
140
+ end
141
+
142
+ response.instance_variable_set(:@read, true)
143
+
144
+ response.extend Net::WebMockHTTPResponse
145
+
146
+ raise Timeout::Error, "execution expired" if webmock_response.should_timeout
147
+
148
+ webmock_response.raise_error_if_any
149
+
150
+ yield response if block_given?
151
+
152
+ response
153
+ end
154
+
155
+ def build_webmock_response(net_http_response)
156
+ webmock_response = WebMock::Response.new
157
+ webmock_response.status = [
158
+ net_http_response.code.to_i,
159
+ net_http_response.message]
160
+ webmock_response.headers = net_http_response.to_hash
161
+ webmock_response.body = net_http_response.body
162
+ webmock_response
163
+ end
164
+
165
+
166
+ def check_right_http_connection
167
+ unless @@alredy_checked_for_right_http_connection ||= false
168
+ WebMock::NetHTTPUtility.puts_warning_for_right_http_if_needed
169
+ @@alredy_checked_for_right_http_connection = true
170
+ end
171
+ end
172
+ end
173
+ @webMockNetHTTP.version_1_2
174
+ [
175
+ [:Get, Net::HTTP::Get],
176
+ [:Post, Net::HTTP::Post],
177
+ [:Put, Net::HTTP::Put],
178
+ [:Delete, Net::HTTP::Delete],
179
+ [:Head, Net::HTTP::Head],
180
+ [:Options, Net::HTTP::Options]
181
+ ].each do |c|
182
+ @webMockNetHTTP.const_set(c[0], c[1])
183
+ end
184
+ end
185
+ end
186
+ end
187
+
188
+ class StubSocket #:nodoc:
189
+
190
+ attr_accessor :read_timeout
191
+
192
+ def initialize(*args)
193
+ end
194
+
195
+ def closed?
196
+ @closed ||= true
197
+ end
198
+
199
+ def readuntil(*args)
200
+ end
201
+
202
+ end
203
+
204
+ module Net #:nodoc: all
205
+
206
+ class WebMockNetBufferedIO < BufferedIO
207
+ def initialize_with_webmock(io, debug_output = nil)
208
+ @read_timeout = 60
209
+ @rbuf = ''
210
+ @debug_output = debug_output
211
+
212
+ @io = case io
213
+ when Socket, OpenSSL::SSL::SSLSocket, IO
214
+ io
215
+ when String
216
+ StringIO.new(io)
217
+ end
218
+ raise "Unable to create local socket" unless @io
219
+ end
220
+ alias_method :initialize_without_webmock, :initialize
221
+ alias_method :initialize, :initialize_with_webmock
222
+ end
223
+
224
+ end
225
+
226
+
227
+ module WebMock
228
+ module NetHTTPUtility
229
+
230
+ def self.request_signature_from_request(net_http, request, body = nil)
231
+ protocol = net_http.use_ssl? ? "https" : "http"
232
+
233
+ path = request.path
234
+ path = WebMock::Util::URI.heuristic_parse(request.path).request_uri if request.path =~ /^http/
235
+
236
+ if request["authorization"] =~ /^Basic /
237
+ userinfo = WebMock::Util::Headers.decode_userinfo_from_header(request["authorization"])
238
+ userinfo = WebMock::Util::URI.encode_unsafe_chars_in_userinfo(userinfo) + "@"
239
+ else
240
+ userinfo = ""
241
+ end
242
+
243
+ uri = "#{protocol}://#{userinfo}#{net_http.address}:#{net_http.port}#{path}"
244
+ method = request.method.downcase.to_sym
245
+
246
+ headers = Hash[*request.to_hash.map {|k,v| [k, v]}.inject([]) {|r,x| r + x}]
247
+
248
+ headers.reject! {|k,v| k =~ /[Aa]uthorization/ && v.first =~ /^Basic / } #we added it to url userinfo
249
+
250
+
251
+ if request.body_stream
252
+ body = request.body_stream.read
253
+ request.body_stream = nil
254
+ end
255
+
256
+ if body != nil && body.respond_to?(:read)
257
+ request.set_body_internal body.read
258
+ else
259
+ request.set_body_internal body
260
+ end
261
+
262
+ WebMock::RequestSignature.new(method, uri, :body => request.body, :headers => headers)
263
+ end
264
+
265
+
266
+ def self.check_right_http_connection
267
+ @was_right_http_connection_loaded = defined?(RightHttpConnection)
268
+ end
269
+
270
+ def self.puts_warning_for_right_http_if_needed
271
+ if !@was_right_http_connection_loaded && defined?(RightHttpConnection)
272
+ $stderr.puts "\nWarning: RightHttpConnection has to be required before WebMock is required !!!\n"
273
+ end
274
+ end
275
+
276
+ end
277
+ end
278
+
279
+ WebMock::NetHTTPUtility.check_right_http_connection
@@ -0,0 +1,34 @@
1
+ # This code is entierly copied from VCR (http://github.com/myronmarston/vcr) by courtesy of Myron Marston
2
+
3
+ # A Net::HTTP response that has already been read raises an IOError when #read_body
4
+ # is called with a destination string or block.
5
+ #
6
+ # This causes a problem when VCR records a response--it reads the body before yielding
7
+ # the response, and if the code that is consuming the HTTP requests uses #read_body, it
8
+ # can cause an error.
9
+ #
10
+ # This is a bit of a hack, but it allows a Net::HTTP response to be "re-read"
11
+ # after it has aleady been read. This attemps to preserve the behavior of
12
+ # #read_body, acting just as if it had never been read.
13
+
14
+
15
+ module Net
16
+ module WebMockHTTPResponse
17
+ def read_body(dest = nil, &block)
18
+ if !(defined?(@__read_body_previously_called).nil?) && @__read_body_previously_called
19
+ return super
20
+ end
21
+ return @body if dest.nil? && block.nil?
22
+ raise ArgumentError.new("both arg and block given for HTTP method") if dest && block
23
+ return nil if @body.nil?
24
+
25
+ dest ||= ::Net::ReadAdapter.new(block)
26
+ dest << @body
27
+ @body = dest
28
+ ensure
29
+ # allow subsequent calls to #read_body to proceed as normal, without our hack...
30
+ @__read_body_previously_called = true
31
+ end
32
+ end
33
+ end
34
+
@@ -0,0 +1,129 @@
1
+ begin
2
+ require 'patron'
3
+ rescue LoadError
4
+ # patron not found
5
+ end
6
+
7
+ if defined?(::Patron)
8
+ module WebMock
9
+ module HttpLibAdapters
10
+ class PatronAdapter < ::WebMock::HttpLibAdapter
11
+ adapter_for :patron
12
+
13
+ OriginalPatronSession = ::Patron::Session unless const_defined?(:OriginalPatronSession)
14
+
15
+ class WebMockPatronSession < ::Patron::Session
16
+ def handle_request_with_webmock(req)
17
+ request_signature =
18
+ WebMock::HttpLibAdapters::PatronAdapter.build_request_signature(req)
19
+
20
+ WebMock::RequestRegistry.instance.requested_signatures.put(request_signature)
21
+
22
+ if webmock_response = WebMock::StubRegistry.instance.response_for_request(request_signature)
23
+ WebMock::HttpLibAdapters::PatronAdapter.
24
+ handle_file_name(req, webmock_response)
25
+ res = WebMock::HttpLibAdapters::PatronAdapter.
26
+ build_patron_response(webmock_response, default_response_charset)
27
+ WebMock::CallbackRegistry.invoke_callbacks(
28
+ {:lib => :patron}, request_signature, webmock_response)
29
+ res
30
+ elsif WebMock.net_connect_allowed?(request_signature.uri)
31
+ res = handle_request_without_webmock(req)
32
+ if WebMock::CallbackRegistry.any_callbacks?
33
+ webmock_response = WebMock::HttpLibAdapters::PatronAdapter.
34
+ build_webmock_response(res)
35
+ WebMock::CallbackRegistry.invoke_callbacks(
36
+ {:lib => :patron, :real_request => true}, request_signature,
37
+ webmock_response)
38
+ end
39
+ res
40
+ else
41
+ raise WebMock::NetConnectNotAllowedError.new(request_signature)
42
+ end
43
+ end
44
+
45
+ alias_method :handle_request_without_webmock, :handle_request
46
+ alias_method :handle_request, :handle_request_with_webmock
47
+ end
48
+
49
+ def self.enable!
50
+ Patron.send(:remove_const, :Session)
51
+ Patron.send(:const_set, :Session, WebMockPatronSession)
52
+ end
53
+
54
+ def self.disable!
55
+ Patron.send(:remove_const, :Session)
56
+ Patron.send(:const_set, :Session, OriginalPatronSession)
57
+ end
58
+
59
+ def self.handle_file_name(req, webmock_response)
60
+ if req.action == :get && req.file_name
61
+ begin
62
+ File.open(req.file_name, "w") do |f|
63
+ f.write webmock_response.body
64
+ end
65
+ rescue Errno::EACCES
66
+ raise ArgumentError.new("Unable to open specified file.")
67
+ end
68
+ end
69
+ end
70
+
71
+ def self.build_request_signature(req)
72
+ uri = WebMock::Util::URI.heuristic_parse(req.url)
73
+ uri.path = uri.normalized_path.gsub("[^:]//","/")
74
+ uri.user = req.username
75
+ uri.password = req.password
76
+
77
+ if [:put, :post].include?(req.action)
78
+ if req.file_name
79
+ if !File.exist?(req.file_name) || !File.readable?(req.file_name)
80
+ raise ArgumentError.new("Unable to open specified file.")
81
+ end
82
+ request_body = File.read(req.file_name)
83
+ elsif req.upload_data
84
+ request_body = req.upload_data
85
+ else
86
+ raise ArgumentError.new("Must provide either data or a filename when doing a PUT or POST")
87
+ end
88
+ end
89
+
90
+ request_signature = WebMock::RequestSignature.new(
91
+ req.action,
92
+ uri.to_s,
93
+ :body => request_body,
94
+ :headers => req.headers
95
+ )
96
+ request_signature
97
+ end
98
+
99
+ def self.build_patron_response(webmock_response, default_response_charset)
100
+ raise ::Patron::TimeoutError if webmock_response.should_timeout
101
+ webmock_response.raise_error_if_any
102
+
103
+ header_fields = (webmock_response.headers || []).map { |(k, vs)| Array(vs).map { |v| "#{k}: #{v}" } }.flatten
104
+ status_line = "HTTP/1.1 #{webmock_response.status[0]} #{webmock_response.status[1]}"
105
+ header_data = ([status_line] + header_fields).join("\r\n")
106
+
107
+ ::Patron::Response.new(
108
+ "",
109
+ webmock_response.status[0],
110
+ 0,
111
+ header_data,
112
+ webmock_response.body,
113
+ default_response_charset
114
+ )
115
+ end
116
+
117
+ def self.build_webmock_response(patron_response)
118
+ webmock_response = WebMock::Response.new
119
+ reason = patron_response.status_line.
120
+ scan(%r(\AHTTP/(\d+\.\d+)\s+(\d\d\d)\s*([^\r\n]+)?))[0][2]
121
+ webmock_response.status = [patron_response.status, reason]
122
+ webmock_response.body = patron_response.body
123
+ webmock_response.headers = patron_response.headers
124
+ webmock_response
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,180 @@
1
+ begin
2
+ require 'typhoeus'
3
+ rescue LoadError
4
+ # typhoeus not found
5
+ end
6
+
7
+ if defined?(Typhoeus)
8
+ WebMock::VersionChecker.new('Typhoeus', Typhoeus::VERSION, '0.3.2').check_version!
9
+
10
+ module WebMock
11
+ module HttpLibAdapters
12
+ class TyphoeusAdapter < HttpLibAdapter
13
+ adapter_for :typhoeus
14
+
15
+ def self.enable!
16
+ @disabled = false
17
+ add_after_request_callback
18
+ ::Typhoeus::Hydra.allow_net_connect = true
19
+ end
20
+
21
+ def self.disable!
22
+ @disabled = true
23
+ remove_after_request_callback
24
+ ::Typhoeus::Hydra.allow_net_connect = true
25
+ end
26
+
27
+ def self.disabled?
28
+ !!@disabled
29
+ end
30
+
31
+ def self.add_after_request_callback
32
+ unless Typhoeus::Hydra.
33
+ global_hooks[:after_request_before_on_complete].
34
+ include?(AFTER_REQUEST_CALLBACK)
35
+ Typhoeus::Hydra.
36
+ global_hooks[:after_request_before_on_complete] << AFTER_REQUEST_CALLBACK
37
+ end
38
+ end
39
+
40
+ def self.remove_after_request_callback
41
+ Typhoeus::Hydra.global_hooks[:after_request_before_on_complete].
42
+ delete_if {|v| v == AFTER_REQUEST_CALLBACK }
43
+ end
44
+
45
+ def self.build_request_signature(req)
46
+ uri = WebMock::Util::URI.heuristic_parse(req.url)
47
+ uri.path = uri.normalized_path.gsub("[^:]//","/")
48
+ if req.username
49
+ uri.user = req.username
50
+ uri.password = req.password
51
+ end
52
+
53
+ body = req.body
54
+
55
+ if req.params && req.method == :post
56
+ body = request_body_for_post_request_with_params(req)
57
+ end
58
+
59
+ request_signature = WebMock::RequestSignature.new(
60
+ req.method,
61
+ uri.to_s,
62
+ :body => body,
63
+ :headers => req.headers
64
+ )
65
+
66
+ req.instance_variable_set(:@__webmock_request_signature, request_signature)
67
+
68
+ request_signature
69
+ end
70
+
71
+ def self.request_body_for_post_request_with_params(req)
72
+ params = req.params
73
+ form = Typhoeus::Form.new(params)
74
+ form.process!
75
+ form.to_s
76
+ end
77
+
78
+ def self.build_webmock_response(typhoeus_response)
79
+ webmock_response = WebMock::Response.new
80
+ webmock_response.status = [typhoeus_response.code, typhoeus_response.status_message]
81
+ webmock_response.body = typhoeus_response.body
82
+ webmock_response.headers = typhoeus_response.headers_hash
83
+ webmock_response
84
+ end
85
+
86
+ def self.stub_typhoeus(request_signature, webmock_response, typhoeus)
87
+ response = if webmock_response.should_timeout
88
+ ::Typhoeus::Response.new(
89
+ :code => 0,
90
+ :status_message => "",
91
+ :body => "",
92
+ :headers_hash => {},
93
+ :curl_return_code => 28
94
+ )
95
+ else
96
+ ::Typhoeus::Response.new(
97
+ :code => webmock_response.status[0],
98
+ :status_message => webmock_response.status[1],
99
+ :body => webmock_response.body,
100
+ :headers_hash => webmock_response.headers
101
+ )
102
+ end
103
+
104
+
105
+ typhoeus.stub(
106
+ request_signature.method || :any,
107
+ /.*/,
108
+ :webmock_stub => true
109
+ ).and_return(response)
110
+ end
111
+
112
+ def self.request_hash(request_signature)
113
+ hash = {}
114
+
115
+ hash[:body] = request_signature.body
116
+ hash[:headers] = request_signature.headers
117
+
118
+ hash
119
+ end
120
+
121
+ AFTER_REQUEST_CALLBACK = Proc.new do |request|
122
+ request_signature = request.instance_variable_get(:@__webmock_request_signature)
123
+ webmock_response =
124
+ ::WebMock::HttpLibAdapters::TyphoeusAdapter.
125
+ build_webmock_response(request.response)
126
+ if request.response.mock?
127
+ WebMock::CallbackRegistry.invoke_callbacks(
128
+ {:lib => :typhoeus},
129
+ request_signature,
130
+ webmock_response
131
+ )
132
+ else
133
+ WebMock::CallbackRegistry.invoke_callbacks(
134
+ {:lib => :typhoeus, :real_request => true},
135
+ request_signature,
136
+ webmock_response
137
+ )
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
143
+
144
+
145
+ module Typhoeus
146
+ class Hydra
147
+ def queue_with_webmock(request)
148
+ self.clear_webmock_stubs
149
+
150
+ if WebMock::HttpLibAdapters::TyphoeusAdapter.disabled?
151
+ return queue_without_webmock(request)
152
+ end
153
+
154
+ request_signature =
155
+ ::WebMock::HttpLibAdapters::TyphoeusAdapter.build_request_signature(request)
156
+
157
+ ::WebMock::RequestRegistry.instance.requested_signatures.put(request_signature)
158
+
159
+ if webmock_response = ::WebMock::StubRegistry.instance.response_for_request(request_signature)
160
+ ::WebMock::HttpLibAdapters::TyphoeusAdapter.
161
+ stub_typhoeus(request_signature, webmock_response, self)
162
+ webmock_response.raise_error_if_any
163
+ elsif !WebMock.net_connect_allowed?(request_signature.uri)
164
+ raise WebMock::NetConnectNotAllowedError.new(request_signature)
165
+ end
166
+ queue_without_webmock(request)
167
+ end
168
+
169
+ alias_method :queue_without_webmock, :queue
170
+ alias_method :queue, :queue_with_webmock
171
+
172
+ def clear_webmock_stubs
173
+ self.stubs = [] unless self.stubs
174
+ self.stubs.delete_if {|s|
175
+ s.instance_variable_get(:@options)[:webmock_stub]
176
+ }
177
+ end
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,25 @@
1
+ module WebMock
2
+ module Matchers
3
+ #this is a based on RSpec::Mocks::ArgumentMatchers::HashIncludingMatcher
4
+ #https://github.com/rspec/rspec-mocks/blob/master/lib/rspec/mocks/argument_matchers.rb
5
+ class HashIncludingMatcher
6
+ def initialize(expected)
7
+ @expected = Hash[WebMock::Util::HashKeysStringifier.stringify_keys!(expected).sort]
8
+ end
9
+
10
+ def ==(actual)
11
+ @expected.all? {|k,v| actual.has_key?(k) && v == actual[k]}
12
+ rescue NoMethodError
13
+ false
14
+ end
15
+
16
+ def inspect
17
+ "hash_including(#{@expected.inspect})"
18
+ end
19
+
20
+ def self.from_rspec_matcher(matcher)
21
+ new(matcher.instance_variable_get(:@expected))
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,15 @@
1
+ require 'minitest/unit'
2
+ require 'webmock'
3
+
4
+ MiniTest::Unit::TestCase.class_eval do
5
+ include WebMock::API
6
+
7
+ alias_method :teardown_without_webmock, :teardown
8
+ def teardown_with_webmock
9
+ teardown_without_webmock
10
+ WebMock.reset!
11
+ end
12
+ alias_method :teardown, :teardown_with_webmock
13
+ end
14
+
15
+ WebMock::AssertionFailure.error_class = MiniTest::Assertion