spreedly 1.0.0

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 (67) hide show
  1. data/History.txt +6 -0
  2. data/Manifest.txt +66 -0
  3. data/README.txt +68 -0
  4. data/Rakefile +72 -0
  5. data/lib/spreedly.rb +154 -0
  6. data/lib/spreedly/common.rb +24 -0
  7. data/lib/spreedly/mock.rb +113 -0
  8. data/lib/spreedly/version.rb +3 -0
  9. data/test/spreedly_gem_test.rb +152 -0
  10. data/test/test_site.yml +2 -0
  11. data/vendor/httparty/History +108 -0
  12. data/vendor/httparty/MIT-LICENSE +20 -0
  13. data/vendor/httparty/Manifest +55 -0
  14. data/vendor/httparty/README +35 -0
  15. data/vendor/httparty/Rakefile +47 -0
  16. data/vendor/httparty/bin/httparty +98 -0
  17. data/vendor/httparty/cucumber.yml +1 -0
  18. data/vendor/httparty/examples/aaws.rb +32 -0
  19. data/vendor/httparty/examples/basic.rb +11 -0
  20. data/vendor/httparty/examples/delicious.rb +37 -0
  21. data/vendor/httparty/examples/google.rb +16 -0
  22. data/vendor/httparty/examples/rubyurl.rb +14 -0
  23. data/vendor/httparty/examples/twitter.rb +31 -0
  24. data/vendor/httparty/examples/whoismyrep.rb +10 -0
  25. data/vendor/httparty/features/basic_authentication.feature +20 -0
  26. data/vendor/httparty/features/command_line.feature +7 -0
  27. data/vendor/httparty/features/deals_with_http_error_codes.feature +26 -0
  28. data/vendor/httparty/features/handles_multiple_formats.feature +34 -0
  29. data/vendor/httparty/features/steps/env.rb +15 -0
  30. data/vendor/httparty/features/steps/httparty_response_steps.rb +26 -0
  31. data/vendor/httparty/features/steps/httparty_steps.rb +15 -0
  32. data/vendor/httparty/features/steps/mongrel_helper.rb +55 -0
  33. data/vendor/httparty/features/steps/remote_service_steps.rb +47 -0
  34. data/vendor/httparty/features/supports_redirection.feature +22 -0
  35. data/vendor/httparty/httparty.gemspec +37 -0
  36. data/vendor/httparty/lib/core_extensions.rb +189 -0
  37. data/vendor/httparty/lib/httparty.rb +201 -0
  38. data/vendor/httparty/lib/httparty/cookie_hash.rb +9 -0
  39. data/vendor/httparty/lib/httparty/exceptions.rb +7 -0
  40. data/vendor/httparty/lib/httparty/logging.rb +35 -0
  41. data/vendor/httparty/lib/httparty/module_inheritable_attributes.rb +25 -0
  42. data/vendor/httparty/lib/httparty/parsers.rb +4 -0
  43. data/vendor/httparty/lib/httparty/parsers/json.rb +74 -0
  44. data/vendor/httparty/lib/httparty/parsers/xml.rb +209 -0
  45. data/vendor/httparty/lib/httparty/request.rb +169 -0
  46. data/vendor/httparty/lib/httparty/response.rb +17 -0
  47. data/vendor/httparty/lib/httparty/version.rb +3 -0
  48. data/vendor/httparty/setup.rb +1585 -0
  49. data/vendor/httparty/spec/fixtures/delicious.xml +23 -0
  50. data/vendor/httparty/spec/fixtures/empty.xml +0 -0
  51. data/vendor/httparty/spec/fixtures/google.html +3 -0
  52. data/vendor/httparty/spec/fixtures/twitter.json +1 -0
  53. data/vendor/httparty/spec/fixtures/twitter.xml +403 -0
  54. data/vendor/httparty/spec/fixtures/undefined_method_add_node_for_nil.xml +2 -0
  55. data/vendor/httparty/spec/hash_spec.rb +49 -0
  56. data/vendor/httparty/spec/httparty/cookie_hash_spec.rb +38 -0
  57. data/vendor/httparty/spec/httparty/parsers/json_spec.rb +44 -0
  58. data/vendor/httparty/spec/httparty/parsers/xml_spec.rb +454 -0
  59. data/vendor/httparty/spec/httparty/request_spec.rb +203 -0
  60. data/vendor/httparty/spec/httparty/response_spec.rb +53 -0
  61. data/vendor/httparty/spec/httparty_spec.rb +259 -0
  62. data/vendor/httparty/spec/spec.opts +3 -0
  63. data/vendor/httparty/spec/spec_helper.rb +21 -0
  64. data/vendor/httparty/spec/string_spec.rb +29 -0
  65. data/vendor/httparty/website/css/common.css +47 -0
  66. data/vendor/httparty/website/index.html +74 -0
  67. metadata +141 -0
@@ -0,0 +1,3 @@
1
+ module Spreedly
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,152 @@
1
+ require 'test/unit'
2
+ require 'shoulda'
3
+ require 'yaml'
4
+ require 'pp'
5
+
6
+ if ENV["SPREEDLY_TEST"] == "REAL"
7
+ require 'spreedly'
8
+ else
9
+ require 'spreedly/mock'
10
+ end
11
+
12
+ test_site = YAML.load(File.read(File.dirname(__FILE__) + '/test_site.yml'))
13
+ Spreedly.configure(test_site['name'], test_site['token'])
14
+
15
+ class SpreedlyGemTest < Test::Unit::TestCase
16
+ def self.only_real
17
+ yield if ENV["SPREEDLY_TEST"] == "REAL"
18
+ end
19
+
20
+ context "A Spreedly site" do
21
+ setup do
22
+ Spreedly::Subscriber.wipe!
23
+ end
24
+
25
+ should "add a subscriber" do
26
+ subscriber = Spreedly::Subscriber.create!('joe')
27
+ assert_not_nil subscriber.token
28
+ assert_equal subscriber.token, Spreedly::Subscriber.find('joe').token
29
+ end
30
+
31
+ should "get a subscriber" do
32
+ id = create_subscriber.id
33
+ subscriber = Spreedly::Subscriber.find(id)
34
+ assert_nil subscriber.active_until
35
+ end
36
+
37
+ should "expose and parse attributes" do
38
+ subscriber = create_subscriber
39
+ assert_kind_of Time, subscriber.created_at
40
+ assert_equal false, subscriber.active
41
+ assert_equal BigDecimal('0.0'), subscriber.store_credit
42
+ end
43
+
44
+ should "raise error if subscriber exists" do
45
+ create_subscriber('bob')
46
+ ex = assert_raise(RuntimeError) do
47
+ create_subscriber('bob')
48
+ end
49
+ assert_match(/exists/i, ex.message)
50
+ end
51
+
52
+ should "raise error if subscriber is invalid" do
53
+ ex = assert_raise(RuntimeError) do
54
+ create_subscriber('')
55
+ end
56
+ assert_match(/no id/i, ex.message)
57
+ end
58
+
59
+ should "create with additional params" do
60
+ subscriber = create_subscriber("fred", "fred@example.com", "FREDDY")
61
+ assert_equal "FREDDY", subscriber.screen_name
62
+ assert_equal "fred@example.com", subscriber.email
63
+ end
64
+
65
+ should "return all subscribers" do
66
+ one = create_subscriber
67
+ two = create_subscriber
68
+ subscribers = Spreedly::Subscriber.all
69
+ assert subscribers.size >= 2
70
+ assert subscribers.detect{|e| e.id == one.id}
71
+ assert subscribers.detect{|e| e.id == two.id}
72
+ end
73
+
74
+ should "generate a subscribe url" do
75
+ assert_equal "https://spreedly.com/terralien-test/subscribers/joe/subscribe/1/Joe%20Bob",
76
+ Spreedly.subscribe_url('joe', '1', "Joe Bob")
77
+ assert_equal "https://spreedly.com/terralien-test/subscribers/joe/subscribe/1/",
78
+ Spreedly.subscribe_url('joe', '1')
79
+ end
80
+
81
+ should "generate an edit subscriber url" do
82
+ assert_equal "https://spreedly.com/terralien-test/subscriber_accounts/zetoken",
83
+ Spreedly.edit_subscriber_url('zetoken')
84
+ end
85
+
86
+ should "comp an inactive subscriber" do
87
+ sub = create_subscriber
88
+ assert !sub.active?
89
+ assert_nil sub.active_until
90
+ assert_equal "", sub.feature_level
91
+ sub.comp(1, 'days', 'Sweet!')
92
+ sub = Spreedly::Subscriber.find(sub.id)
93
+ assert_not_nil sub.active_until
94
+ assert_equal 'Sweet!', sub.feature_level
95
+ assert sub.active?
96
+ end
97
+
98
+ should "comp an active subscriber" do
99
+ sub = create_subscriber
100
+ assert !sub.active?
101
+ sub.comp(1, 'days')
102
+
103
+ sub = Spreedly::Subscriber.find(sub.id)
104
+ assert sub.active?
105
+ old_active_until = sub.active_until
106
+ sub.comp(1, 'days')
107
+
108
+ sub = Spreedly::Subscriber.find(sub.id)
109
+ assert sub.active?
110
+ assert old_active_until < sub.active_until
111
+ end
112
+
113
+ should "throw an error if comp is against unknown subscriber" do
114
+ sub = create_subscriber
115
+ Spreedly::Subscriber.wipe!
116
+ ex = assert_raise(RuntimeError) do
117
+ sub.comp(1, 'days')
118
+ end
119
+ assert_match(/exists/i, ex.message)
120
+ end
121
+
122
+ should "throw an error if comp is invalid" do
123
+ sub = create_subscriber
124
+ ex = assert_raise(RuntimeError) do
125
+ sub.comp(nil, nil)
126
+ end
127
+ assert_match(/validation/i, ex.message)
128
+ assert_raise(RuntimeError){sub.comp(1, nil)}
129
+ assert_raise(RuntimeError){sub.comp(nil, 'days')}
130
+ end
131
+
132
+ should "return subscription plans" do
133
+ assert !Spreedly::SubscriptionPlan.all.empty?
134
+ assert_not_nil Spreedly::SubscriptionPlan.all.first.name
135
+ end
136
+
137
+ only_real do
138
+ should "throw an error if comp is wrong type" do
139
+ sub = create_subscriber
140
+ sub.comp(1, 'days')
141
+ ex = assert_raise(RuntimeError) do
142
+ sub.comp(1, 'days')
143
+ end
144
+ assert_match(/invalid/i, ex.message)
145
+ end
146
+ end
147
+ end
148
+
149
+ def create_subscriber(id=(rand*100000000).to_i, email=nil, screen_name=nil)
150
+ Spreedly::Subscriber.create!(id, email, screen_name)
151
+ end
152
+ end
@@ -0,0 +1,2 @@
1
+ name: terralien-test
2
+ token: 3a8233463b5f8150d8bab0d2e7bac9272fc31763
@@ -0,0 +1,108 @@
1
+ == 0.3.1 2009-02-10
2
+ * 1 minor fix, 1 minor enhancement
3
+ * Fixed unescaping umlauts (siebertm)
4
+ * Added yaml response parsing (Miha Filej)
5
+
6
+ == 0.3.0 2009-01-31
7
+ * 1 major enhancement, 1 bug fix
8
+ * JSON gem no longer a requirement. It was conflicting with rails json stuff so I just stole ActiveSupport's json decoding and bundled it with HTTParty.
9
+ * Fixed bug where query strings were being duplicated on redirects
10
+ * Added a bunch of specs and moved some code around.
11
+
12
+ == 0.2.10 2009-01-29
13
+ * 1 minor enhancement
14
+ * Made encoding on query parameters treat everything except URI::PATTERN::UNRESERVED as UNSAFE to force encoding of '+' character (Julian Russell)
15
+
16
+ == 0.2.9 2009-01-29
17
+ * 3 minor enhancements
18
+ * Added a 'headers' accessor to the response with a hash of any HTTP headers. (Don Peterson)
19
+ * Add support for a ":cookies" option to be used at the class level, or as an option on any individual call. It should be passed a hash, which will be converted to the proper format and added to the request headers when the call is made. (Don Peterson)
20
+ * Refactored several specs and added a full suite of cucumber features (Don Peterson)
21
+
22
+ == 0.2.8 2009-01-28
23
+ * 1 major fix
24
+ * fixed major bug with response where it wouldn't iterate or really work at all with parsed responses
25
+
26
+ == 0.2.7 2009-01-28
27
+ * 2 minor fixes, 2 minor enhancements, 2 major enhancements
28
+ * fixed undefined method add_node for nil class error that occasionally happened (juliocesar)
29
+ * Handle nil or unexpected values better when typecasting. (Brian Landau)
30
+ * More robust handling of mime types (Alex Vollmer)
31
+ * Fixed support for specifying headers and added support for basic auth to CLI. (Alex Vollmer)
32
+ * Added first class response object that includes original body and status code (Alex Vollmer)
33
+ * Now parsing all response types as some non-200 responses provide important information, this means no more exception raising (Alex Vollmer)
34
+
35
+ == 0.2.6 2009-01-05
36
+ * 1 minor bug fix
37
+ * added explicit require of time as Time#parse failed outside of rails (willcodeforfoo)
38
+
39
+ == 0.2.5 2009-01-05
40
+ * 1 major enhancement
41
+ * Add command line interface to HTTParty (Alex Vollmer)
42
+
43
+ == 0.2.4 2008-12-23
44
+ * 1 bug fix
45
+ * Fixed that mimetype detection was failing if no mimetype was returned from service (skippy)
46
+ == 0.2.3 2008-12-23
47
+ * 1 bug fix
48
+ * Fixed typecasting class variable naming issue
49
+
50
+ == 0.2.2 2008-12-08
51
+ * 1 bug fix
52
+ * Added the missing core extension hash method to_xml_attributes
53
+
54
+ == 0.2.1 2008-12-08
55
+ * 1 bug fix
56
+ * Fixed that HTTParty was borking ActiveSupport and as such Rails (thanks to Rob Sanheim)
57
+
58
+ == 0.2.0 2008-12-07
59
+ * 1 major enhancement
60
+ * Removed ActiveSupport as a dependency. Now requires json gem for json deserialization and uses an included class to do the xml parsing.
61
+
62
+ == 0.1.8 2008-11-30
63
+ * 3 major enhancements
64
+ * Moved base_uri normalization into request class and out of httparty module, fixing
65
+ the problem where base_uri was not always being normalized.
66
+ * Stupid simple support for HTTParty.get/post/put/delete. (jqr)
67
+ * Switched gem management to Echoe from newgem.
68
+
69
+ == 0.1.7 2008-11-30
70
+ * 1 major enhancement
71
+ * fixed multiple class definitions overriding each others options
72
+
73
+ == 0.1.6 2008-11-26
74
+ * 1 major enhancement
75
+ * now passing :query to set_form_data if post request to avoid content length errors
76
+
77
+ == 0.1.5 2008-11-14
78
+ * 2 major enhancements
79
+ * Refactored send request method out into its own object.
80
+ * Added :html format if you just want to do that.
81
+
82
+ == 0.1.4 2008-11-08
83
+ * 3 major enhancements:
84
+ * Removed some cruft
85
+ * Added ability to follow redirects automatically and turn that off (Alex Vollmer)
86
+
87
+ == 0.1.3 2008-08-22
88
+
89
+ * 3 major enhancements:
90
+ * Added http_proxy key for setting proxy server and port (francxk@gmail.com)
91
+ * Now raises exception when http error occurs (francxk@gmail.com)
92
+ * Changed auto format detection from file extension to response content type (Jay Pignata)
93
+
94
+ == 0.1.2 2008-08-09
95
+
96
+ * 1 major enhancement:
97
+ * default_params were not being appended to query string if option[:query] was blank
98
+
99
+ == 0.1.1 2008-07-30
100
+
101
+ * 2 major enhancement:
102
+ * Added :basic_auth key for options when making a request
103
+ * :query and :body both now work with query string or hash
104
+
105
+ == 0.1.0 2008-07-27
106
+
107
+ * 1 major enhancement:
108
+ * Initial release
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 John Nunemaker
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,55 @@
1
+ bin/httparty
2
+ cucumber.yml
3
+ examples/aaws.rb
4
+ examples/basic.rb
5
+ examples/delicious.rb
6
+ examples/google.rb
7
+ examples/rubyurl.rb
8
+ examples/twitter.rb
9
+ examples/whoismyrep.rb
10
+ features/basic_authentication.feature
11
+ features/command_line.feature
12
+ features/deals_with_http_error_codes.feature
13
+ features/handles_multiple_formats.feature
14
+ features/steps/env.rb
15
+ features/steps/httparty_response_steps.rb
16
+ features/steps/httparty_steps.rb
17
+ features/steps/mongrel_helper.rb
18
+ features/steps/remote_service_steps.rb
19
+ features/supports_redirection.feature
20
+ History
21
+ httparty.gemspec
22
+ lib/core_extensions.rb
23
+ lib/httparty/cookie_hash.rb
24
+ lib/httparty/exceptions.rb
25
+ lib/httparty/module_inheritable_attributes.rb
26
+ lib/httparty/parsers/json.rb
27
+ lib/httparty/parsers/xml.rb
28
+ lib/httparty/parsers.rb
29
+ lib/httparty/request.rb
30
+ lib/httparty/response.rb
31
+ lib/httparty/version.rb
32
+ lib/httparty.rb
33
+ Manifest
34
+ MIT-LICENSE
35
+ Rakefile
36
+ README
37
+ setup.rb
38
+ spec/fixtures/delicious.xml
39
+ spec/fixtures/empty.xml
40
+ spec/fixtures/google.html
41
+ spec/fixtures/twitter.json
42
+ spec/fixtures/twitter.xml
43
+ spec/fixtures/undefined_method_add_node_for_nil.xml
44
+ spec/hash_spec.rb
45
+ spec/httparty/cookie_hash_spec.rb
46
+ spec/httparty/parsers/json_spec.rb
47
+ spec/httparty/parsers/xml_spec.rb
48
+ spec/httparty/request_spec.rb
49
+ spec/httparty/response_spec.rb
50
+ spec/httparty_spec.rb
51
+ spec/spec.opts
52
+ spec/spec_helper.rb
53
+ spec/string_spec.rb
54
+ website/css/common.css
55
+ website/index.html
@@ -0,0 +1,35 @@
1
+ = httparty
2
+
3
+ == DESCRIPTION:
4
+
5
+ Makes http fun again!
6
+
7
+ == FEATURES:
8
+
9
+ * Easy get, post requests
10
+ * Basic http authentication
11
+ * Default request query string parameters (ie: for api keys that are needed on each request)
12
+ * Automatic parsing of JSON and XML into ruby hashes based on response content-type
13
+
14
+ == EXAMPLES:
15
+
16
+ See http://github.com/jnunemaker/httparty/tree/master/examples
17
+
18
+ == COMMAND LINE INTERFACE
19
+
20
+ httparty also includes the executable <tt>httparty</tt> which can be
21
+ used to query web services and examine the resulting output. By default
22
+ it will output the response as a pretty-printed Ruby object (useful for
23
+ grokking the structure of output). This can also be overridden to output
24
+ formatted XML or JSON. Execute <tt>httparty --help</tt> for all the
25
+ options. Below is an example of how easy it is.
26
+
27
+ httparty "http://twitter.com/statuses/public_timeline.json"
28
+
29
+ == REQUIREMENTS:
30
+
31
+ * You like to party!
32
+
33
+ == INSTALL:
34
+
35
+ * sudo gem install httparty
@@ -0,0 +1,47 @@
1
+ ProjectName = 'httparty'
2
+ WebsitePath = "jnunemaker@rubyforge.org:/var/www/gforge-projects/#{ProjectName}"
3
+
4
+ require 'rubygems'
5
+ require 'rake'
6
+ require 'echoe'
7
+ require 'spec/rake/spectask'
8
+ require "lib/#{ProjectName}/version"
9
+ require 'cucumber/rake/task'
10
+
11
+ Echoe.new(ProjectName, HTTParty::Version) do |p|
12
+ p.description = "Makes http fun! Also, makes consuming restful web services dead easy."
13
+ p.install_message = "When you HTTParty, you must party hard!"
14
+ p.url = "http://#{ProjectName}.rubyforge.org"
15
+ p.author = "John Nunemaker"
16
+ p.email = "nunemaker@gmail.com"
17
+ p.need_tar_gz = false
18
+ p.docs_host = WebsitePath
19
+ end
20
+
21
+ desc 'Upload website files to rubyforge'
22
+ task :website do
23
+ sh %{rsync -av website/ #{WebsitePath}}
24
+ Rake::Task['website_docs'].invoke
25
+ end
26
+
27
+ task :website_docs do
28
+ Rake::Task['redocs'].invoke
29
+ sh %{rsync -av doc/ #{WebsitePath}/docs}
30
+ end
31
+
32
+ desc 'Preps the gem for a new release'
33
+ task :prepare do
34
+ %w[manifest build_gemspec].each do |task|
35
+ Rake::Task[task].invoke
36
+ end
37
+ end
38
+
39
+ Rake::Task[:default].prerequisites.clear
40
+ task :default => :spec
41
+ Spec::Rake::SpecTask.new do |t|
42
+ t.spec_files = FileList["spec/**/*_spec.rb"]
43
+ end
44
+
45
+ Cucumber::Rake::Task.new(:features) do |t|
46
+ t.cucumber_opts = "--format pretty"
47
+ end
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "optparse"
4
+ require "pp"
5
+
6
+ $:.unshift(File.join(File.dirname(__FILE__), "/../lib"))
7
+ require "httparty"
8
+
9
+ opts = {
10
+ :action => :get,
11
+ :headers => {},
12
+ :verbose => false
13
+ }
14
+
15
+ def die(msg)
16
+ STDERR.puts(msg)
17
+ exit 1
18
+ end
19
+
20
+ OptionParser.new do |o|
21
+ o.banner = "USAGE: #{$0} [options] [url]"
22
+
23
+ o.on("-f",
24
+ "--format [FORMAT]",
25
+ "Output format to use instead of pretty-print ruby: " +
26
+ "plain, json or xml") do |f|
27
+ opts[:output_format] = f.downcase.to_sym
28
+ end
29
+
30
+ o.on("-a",
31
+ "--action [ACTION]",
32
+ "HTTP action: get (default), post, put or delete") do |a|
33
+ opts[:action] = a.downcase.to_sym
34
+ end
35
+
36
+ o.on("-d",
37
+ "--data [BODY]",
38
+ "Data to put in request body (prefix with '@' for file)") do |d|
39
+ if d =~ /^@/
40
+ opts[:data] = open(d).read
41
+ else
42
+ opts[:data] = d
43
+ end
44
+ end
45
+
46
+ o.on("-H", "--header [NAME=VALUE]", "Additional HTTP headers in NAME=VALUE form") do |h|
47
+ die "Invalid header specification, should be Name:Value" unless h =~ /.+:.+/
48
+ name, value = h.split(':')
49
+ opts[:headers][name.strip] = value.strip
50
+ end
51
+
52
+ o.on("-v", "--verbose", "If set, print verbose output") do |v|
53
+ opts[:verbose] = true
54
+ end
55
+
56
+ o.on("-u", "--user [CREDS]", "Use basic authentication. Value should be user:password") do |u|
57
+ die "Invalid credentials format. Must be user:password" unless u =~ /.+:.+/
58
+ user, password = u.split(':')
59
+ opts[:basic_auth] = { :username => user, :password => password }
60
+ end
61
+
62
+ o.on("-h", "--help", "Show help documentation") do |h|
63
+ puts o
64
+ exit
65
+ end
66
+ end.parse!
67
+
68
+ puts "Querying #{ARGV.first} with options: #{opts.inspect}" if opts[:verbose]
69
+
70
+ if ARGV.empty?
71
+ STDERR.puts "You need to provide a URL"
72
+ STDERR.puts "USAGE: #{$0} [options] [url]"
73
+ end
74
+
75
+ if opts[:output_format].nil?
76
+ response = HTTParty.send(opts[:action], ARGV.first, opts)
77
+ puts "Status: #{response.code}"
78
+ pp response
79
+ else
80
+ print_format = opts[:output_format]
81
+ response = HTTParty.send(opts[:action], ARGV.first, opts)
82
+ puts "Status: #{response.code}"
83
+ case opts[:output_format]
84
+ when :json
85
+ begin
86
+ require 'rubygems'
87
+ require 'json'
88
+ puts JSON.pretty_generate(response.delegate)
89
+ rescue LoadError
90
+ puts YAML.dump(response.delegate)
91
+ end
92
+ when :xml
93
+ REXML::Document.new(response.body).write(STDOUT, 2)
94
+ puts
95
+ else
96
+ puts response
97
+ end
98
+ end