url 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -19,3 +19,6 @@ rdoc
19
19
  pkg
20
20
 
21
21
  ## PROJECT::SPECIFIC
22
+ .yardoc/*
23
+ .yard/*
24
+ doc/*
data/README.rdoc CHANGED
@@ -1,6 +1,7 @@
1
1
  = URL Gem
2
2
 
3
- A simple url object to allow for object oriented based manipulation and usage of a url
3
+ A simple url object to allow for object oriented based manipulation and usage of a url. It works with Typhoeus if it detects it's installed
4
+ or defaults back to Net::HTTP.
4
5
 
5
6
  == Usage
6
7
 
@@ -21,9 +22,40 @@ You can easily extract or change any part of the url
21
22
  url.params[:foo] = 'bar'
22
23
  url.to_s # => 'https://my.mail.google.com/mail/?foo=bar&shva=1#mbox'
23
24
 
25
+ === Make Requests
26
+
27
+ You can quickly and easily make requests from those urls without having to worry about whether they're https or not.
28
+
29
+ url = URL.new('https://graph.facebook.com/37901410')
30
+ response = url.get
31
+ response # => "{"id":"37901410","name":"Tal Atlas","first_name":"Tal","last_name":"Atlas","link":"http:\\/\\/www.facebook.com\\/talatlas","gender":"male","locale":"en_US"}"
32
+
33
+ A {URL::Response} object is returned from {URL#post}, {URL#get}, or {URL#delete}. This is basically a string with a few additional methods including:
34
+
35
+ The time the request took in seconds
36
+ The http code of the response and whether the request was successful or not (code == 200).
37
+
38
+ response.time # => 1.6
39
+ response.code # => 200
40
+ response.success? # => true
41
+
42
+ You can make GET, POST, or DELETE requests without doing any special formatting.
43
+
44
+ url.path << '/feed'
45
+ url.params[:access_token] = '.....'
46
+ url.params[:message] = "Hey I'm posting this message with ruby"
47
+ json = url.post
48
+
49
+ post_id = magic_method(json)
50
+
51
+ url.path = "/#{post_id}"
52
+ url.params.delete(:message)
53
+ url.delete
54
+
24
55
  == TODO
25
56
  * More Documentation
26
57
  * More specs
58
+ * Make faster
27
59
 
28
60
  == Note on Patches/Pull Requests
29
61
 
data/VERSION.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
2
  :major: 0
3
3
  :minor: 1
4
- :patch: 1
4
+ :patch: 2
5
5
  :build:
data/lib/url.rb CHANGED
@@ -6,12 +6,28 @@ require 'cgi'
6
6
  files = Dir.glob(File.join(File.dirname(__FILE__),'url','**','*.rb'))
7
7
  files.each { |f| require f }
8
8
 
9
- #:include: README.rdoc
9
+ # Main class for managing urls
10
+ # url = URL.new('https://mail.google.com/mail/?shva=1#mbox')
11
+ # url.params # => {:shva => '1'}
12
+ # url.scheme # => 'https'
13
+ # url.host # => 'mail.google.com'
14
+ # url.domain # => 'google.com'
15
+ # url.subdomain # => ['mail']
16
+ # url.path # => '/mail/'
17
+ # url.hash # => 'mbox'
18
+ #
19
+ # url.subdomain = ['my','mail']
20
+ # url.params[:foo] = 'bar'
21
+ # url.to_s # => 'https://my.mail.google.com/mail/?foo=bar&shva=1#mbox'
10
22
  class URL
11
23
  attr_reader :string, :params
24
+
25
+ # Attributes of the URL which are editable
12
26
  attr_accessor :subdomain, :domain, :path, :scheme, :format, :port, :hash
13
27
  alias_method :subdomains, :subdomain
14
28
 
29
+ # Creates a new URL object
30
+ # @param [String] URL the starting url to work with
15
31
  def initialize str
16
32
  @string = str
17
33
  sp = URI.split(@string)
@@ -55,7 +71,7 @@ class URL
55
71
  end
56
72
 
57
73
  # Outputs the full current url
58
- # @param [Hash<Symbol,false>,#whatever] ops Prevent certain parts of the object from being shown by setting `:scheme`,`:port`,`:path`,`:params`, or `:hash` to `false`
74
+ # @param [Hash] ops Prevent certain parts of the object from being shown by setting `:scheme`,`:port`,`:path`,`:params`, or `:hash` to `false`
59
75
  # @return [String]
60
76
  def to_s ops={}
61
77
  ret = String.new
@@ -64,7 +80,6 @@ class URL
64
80
  ret << %{:#{port}} if port && ops[:port] != false
65
81
  if path && ops[:path] != false
66
82
  ret << path
67
- # ret << %{.#{format}} if format && ops[:format] != false
68
83
  end
69
84
 
70
85
  ret << params.to_s if params && ops[:params] != false
@@ -81,13 +96,11 @@ class URL
81
96
  end
82
97
 
83
98
  class << self
99
+ # Define the request handler to use. If Typhoeus is setup it will use {TyHandler} otherwise will default back to Net::HTTP with {NetHandler}
100
+ # @return [Handler]
84
101
  attr_accessor :req_handler
85
102
  end
86
103
 
87
- def req_handler #:nodoc:
88
- self.class.req_handler.new(self)
89
- end
90
-
91
104
  # Performs a get request for the current URL
92
105
  # @return [URL::Response] A subclass of string which also repsonds to a few added mthods storing more information
93
106
  def get(*args)
@@ -106,7 +119,7 @@ class URL
106
119
  req_handler.delete(*args)
107
120
  end
108
121
 
109
- def inspect #:nodoc:
122
+ def inspect
110
123
  "#<URL #{to_s}>"
111
124
  end
112
125
 
@@ -115,5 +128,10 @@ class URL
115
128
  else
116
129
  URL.req_handler = NetHandler
117
130
  end
131
+
132
+ private
133
+ def req_handler
134
+ self.class.req_handler.new(self)
135
+ end
118
136
  end
119
137
 
data/lib/url/handlers.rb CHANGED
@@ -1,5 +1,18 @@
1
1
  class URL
2
2
 
3
+ # Handlers for making requests for the URL. To create your own you need to follow the following conventions:
4
+ # 1. You must define the get, post, and delete instance methods
5
+ # 2. These methods should return a {Response} object
6
+ #
7
+ # To create a {Response} object:
8
+ # hsh = {
9
+ # :code => resp.code,
10
+ # :time => resp.time,
11
+ # :body => resp.body,
12
+ # :response => resp,
13
+ # :url => url.to_s
14
+ # }
15
+ # Response.new(hsh)
3
16
  class Handler
4
17
  attr_reader :url
5
18
  def initialize(url)
@@ -7,6 +20,7 @@ class URL
7
20
  end
8
21
  end
9
22
 
23
+ # Typhoeus handler
10
24
  class TyHandler < Handler
11
25
 
12
26
  def get(args={})
@@ -42,9 +56,9 @@ class URL
42
56
 
43
57
  end
44
58
 
59
+ # Net::HTTP Handler
45
60
  class NetHandler < Handler
46
61
  def get(args={})
47
- puts 'net'
48
62
  http = http_obj
49
63
  request = Net::HTTP::Get.new(url.path + url.params.to_s)
50
64
  t = Time.now
@@ -9,8 +9,26 @@ class URL
9
9
  # * response - the original response object from whatever handler you chose
10
10
  # * time - time taken to make call
11
11
  # * success? - whether the http code is 200
12
+ # * url - the URL the object was gotten from
12
13
  class Response < DelegateClass(String)
13
- attr_reader :body,:time,:code,:response
14
+ # The time taken for the request
15
+ # @returns [Integer]
16
+ attr_reader :time
17
+
18
+ # The http code return
19
+ # @returns [Integer] eg. 200, 404, 500, 503
20
+ attr_reader :code
21
+
22
+ # The response object generated by the handler
23
+ # @returns [Net::HTTPResponse,Typhoeus::Response]
24
+ attr_reader :response
25
+
26
+ # The url which generated this response
27
+ # @returns [String]
28
+ attr_reader :url
29
+
30
+ # @param [String] body The body of the response object, main string
31
+ # @param [Hash] args Additional arguments: :time,:code,:response,:url
14
32
  def initialize(str,args={})
15
33
  if str.is_a?(Hash)
16
34
  args = str
@@ -24,6 +42,8 @@ class URL
24
42
  end
25
43
  end
26
44
 
45
+ # Compares {Response#code} to 200
46
+ # @returns [true,false]
27
47
  def success?
28
48
  return @successful if @successful
29
49
 
data/spec/url_spec.rb CHANGED
@@ -5,40 +5,113 @@ describe URL do
5
5
  @url = URL.new('https://mail.google.com:8080/foo/bar/baz?q=one&foo=bar')
6
6
  end
7
7
 
8
- it "should roundtrip" do
9
- @url.to_s.should == 'https://mail.google.com:8080/foo/bar/baz?q=one&foo=bar'
10
- end
11
-
12
- it "should parse properly" do
13
- @url.params.should == {:q => 'one', :foo => 'bar'}
14
- @url.host.should == 'mail.google.com'
15
- @url.domain.should == 'google.com'
16
- @url.subdomain.should == ['mail']
17
- @url.port.should == '8080'
18
- @url.scheme.should == 'https'
19
- end
20
-
21
- it "should change and add params" do
22
- @url.params[:foo] = 'foo'
23
- @url.params[:baz] = 'baz'
24
- @url.port = '90'
25
- @url.subdomain = 'test'
26
- @url.scheme = 'ftp'
27
- @url.path = '/bar/baz'
8
+ describe "#initialize" do
9
+ it "should parse properly" do
10
+ @url.params.should == {:q => 'one', :foo => 'bar'}
11
+ @url.host.should == 'mail.google.com'
12
+ @url.domain.should == 'google.com'
13
+ @url.subdomain.should == ['mail']
14
+ @url.port.should == '8080'
15
+ @url.scheme.should == 'https'
16
+ end
28
17
 
29
- @url.to_s.should include 'ftp://test.google.com:90/bar/baz?'
30
- @url.to_s.should include 'q=one'
31
- @url.to_s.should include 'foo=foo'
32
- @url.to_s.should include 'baz=baz'
18
+ it "should work with strange urls" do
19
+ url = URL.new('http://one.mail.google.co.uk')
20
+ url.domain.should == 'google.co.uk'
21
+ url.subdomains.should == ['one','mail']
22
+
23
+ url = URL.new('http://localhost')
24
+ url.domain.should == 'localhost'
25
+ url.subdomain.should be_nil
26
+ end
33
27
  end
34
28
 
35
- it "should work with strange urls" do
36
- url = URL.new('http://one.mail.google.co.uk')
37
- url.domain.should == 'google.co.uk'
38
- url.subdomains.should == ['one','mail']
29
+ describe '#to_s' do
30
+ it "should roundtrip" do
31
+ @url.to_s.should == 'https://mail.google.com:8080/foo/bar/baz?q=one&foo=bar'
32
+ end
39
33
 
40
- url = URL.new('http://localhost')
41
- url.domain.should == 'localhost'
42
- url.subdomain.should be_nil
34
+ it "should change and add params" do
35
+ @url.params[:foo] = 'foo'
36
+ @url.params[:baz] = 'baz'
37
+ @url.port = '90'
38
+ @url.subdomain = 'test'
39
+ @url.scheme = 'ftp'
40
+ @url.path = '/bar/baz'
41
+
42
+ @url.to_s.should include 'ftp://test.google.com:90/bar/baz?'
43
+ @url.to_s.should include 'q=one'
44
+ @url.to_s.should include 'foo=foo'
45
+ @url.to_s.should include 'baz=baz'
46
+ end
47
+ end
48
+
49
+ end
50
+
51
+ shared_examples_for "all requests" do
52
+ it "should work" do
53
+ @resp.should be_success
54
+ end
55
+
56
+ it "should have a response of the correct class" do
57
+ @resp.response.should be_a(@resp_class)
58
+ end
59
+
60
+ it "shoudl have all attribures" do
61
+ @resp.time.should be_a(Float)
62
+ @resp.code.should be_a(Integer)
63
+ @resp.url.should be_a(String)
64
+ end
65
+ end
66
+
67
+ shared_examples_for "all builds" do
68
+
69
+
70
+ before do
71
+ @url = URL.new('http://www.omgpop.com/')
72
+ end
73
+
74
+ describe "#get" do
75
+ before do
76
+ @resp = @url.get
77
+ end
78
+ it_should_behave_like "all requests"
79
+ end
80
+
81
+ describe "#post" do
82
+ before do
83
+ @resp = @url.post
84
+ end
85
+ it_should_behave_like "all requests"
86
+ end
87
+
88
+ describe "#delete" do
89
+ before do
90
+ @resp = @url.delete
91
+ end
92
+ it_should_behave_like "all requests"
43
93
  end
44
94
  end
95
+
96
+ describe "Typhoeus", URL do
97
+ before(:all) do
98
+ require 'typhoeus'
99
+ URL.req_handler = URL::TyHandler
100
+ @resp_class = Typhoeus::Response
101
+ end
102
+
103
+ it_should_behave_like "all builds"
104
+
105
+ end
106
+
107
+
108
+ describe "Net::HTTP", URL do
109
+ before(:all) do
110
+ require 'net/http'
111
+ URL.req_handler = URL::NetHandler
112
+ @resp_class = Net::HTTPResponse
113
+ end\
114
+
115
+ it_should_behave_like "all builds"
116
+
117
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: url
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 31
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 1
10
- version: 0.1.1
9
+ - 2
10
+ version: 0.1.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tal Atlas