rapidash 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dc6b0e6636bacbfbc9b0294b808b87e69d8ed6d9
4
- data.tar.gz: 58ff477a1fd01590ed8deb47647e9be8c0212ff5
3
+ metadata.gz: b7cf2002fd2e632f1c5150d3d3a5d858d58ec09c
4
+ data.tar.gz: 6de1e547b1243cce13a8440a41ac28113e191843
5
5
  SHA512:
6
- metadata.gz: 715b0e98003340a217a1d0d3b673a7f0b5d96e4dbbe45b0f26e718d949a5777c5ae16b392573df2f005fa36e69f2dfa1347c5c9e320827ad957ab177ebb438e7
7
- data.tar.gz: 470f35e9d9234fd207d1a002875957f453c8fd55541a3c2ecd86a91124fca19dd48d890e3b7f3fe2cac1ec56db000783d7169d4db0768eadec61aa6eb4dd1edc
6
+ metadata.gz: b64aa96d960b5a4bb1e2e50bd7c16c262e40fe57548745d1410385c3ce25f8b3374dc2673da012c0d9c5038c21e0e3746eb3fe4405a8c30b1a8b308d2215cd64
7
+ data.tar.gz: 9e1d5838e548568064e63bfe8ff2c3cc173d308c7a4f5c9c79615cb7fdf29fedeb837c51c352ec0d5813643bba8c4598b9e1e2e6eb467ba9dc9c3b253798c777
data/README.md CHANGED
@@ -22,32 +22,65 @@ Or install it yourself as:
22
22
 
23
23
  Resources can be defined as follows:
24
24
 
25
- class Users < Rapidash::Base
26
- end
25
+ ```ruby
26
+ class Users < Rapidash::Base
27
+ end
28
+ ```
27
29
 
28
30
  The URL of the resource will be inferred from the class name. In this case Users. If you want to override that, you can with the url method.
29
31
 
30
- class Users < Rapidash::Base
31
- url :members # or url "members" is also supported
32
- end
32
+ ```ruby
33
+ class Users < Rapidash::Base
34
+ url :members # or url "members" is also supported
35
+ end
36
+ ```
33
37
 
34
38
  Resources can exist inside other resources. For example, on Github, a user has repositories. The following could be how you build the resources:
35
39
 
36
- class Repos < Rapidash::Base
37
- end
40
+ ```ruby
41
+ class Repos < Rapidash::Base
42
+ end
38
43
 
39
- class Users < Rapidash::Base
40
- resource :repos
41
- end
44
+ class Users < Rapidash::Base
45
+ resource :repos
46
+ end
47
+ ```
48
+
49
+ #### Root elements
50
+
51
+ A root element can be set for create and post actions
52
+
53
+ ```ruby
54
+ class Posts < Rapidash::Base
55
+ end
56
+
57
+ client.posts.create!({:post => {:name => "a post"}})
58
+ ```
59
+
60
+ With a root element, the code would look like this:
61
+
62
+ ```ruby
63
+ class Posts < Rapidash::Base
64
+ root :post
65
+ end
66
+
67
+ client.posts.create!(:name => "a post")
68
+ ```
42
69
 
43
70
  ### Client
44
71
 
45
72
  The main thing a client must do is define a method, `oauth` and `http` are currently supported. You can also define resources which links a resource as defined above to the client.
46
73
 
47
- class Client < Rapidash::Client
48
- method :oauth
49
- resource :users
50
- end
74
+ ```ruby
75
+ class Client < Rapidash::Client
76
+ method :oauth
77
+ resource :users
78
+ use_patch # This will use PATCH when updating instead of POST
79
+ extension :json #Append the extension fo the urls
80
+ end
81
+ ```
82
+
83
+
51
84
 
52
85
  OAuth provides an initialize method which you can see in the Facebook client example.
53
86
 
@@ -55,57 +88,63 @@ Currently when using the HTTP method, you will need to define your own initializ
55
88
 
56
89
  ### Making calls
57
90
 
58
- client = Client.new
59
- client.site = "http://example.com/"
60
- client.users #Returns an instance of Users
61
- client.users! #Will make a call to "http://example.com/users
62
- client.users!(1) #Will make a call to http://example.com/users/1
63
- client.users!(params => {:page => 1}}) # Will make a call to http://example.com/users?page=1
91
+ ```ruby
92
+ client = Client.new
93
+ client.site = "http://example.com/"
94
+ client.users #Returns an instance of Users
95
+ client.users! #Will make a call to "http://example.com/users.json
96
+ client.users!(1) #Will make a call to http://example.com/users/1.json
97
+ client.users!(params => {:page => 1}}) #Will make a call to http://example.com/users.json?page=1
98
+ client.users.create!({:user => {:name => "Gazler"}}) #POST requst to /users.json
99
+ client.users(1).update!({:user => {:name => "Gazler"}}) #PUT or PATCH requst to /users.json
100
+ client.users(1).delete! #DELETE requst to /users.json
101
+ ```
64
102
 
65
103
  ## Example Clients
66
104
 
67
105
  ### Facebook
68
106
 
69
- require 'rapidash'
107
+ ```ruby
108
+ require 'rapidash'
70
109
 
71
- class Me < Rapidash::Base
72
- end
110
+ class Me < Rapidash::Base
111
+ end
73
112
 
74
- class Facebook < Rapidash::Client
75
- method :oauth
76
- resource :me
77
- end
113
+ class Facebook < Rapidash::Client
114
+ method :oauth
115
+ resource :me
116
+ end
78
117
 
79
- client = Facebook.new({
80
- :site => "https://graph.facebook.com",
81
- :uid => "YOUR_ID",
82
- :secret => "YOUR_SECRET",
83
- :access_token => "YOUR_TOKEN"
84
- })
85
- p client.me!.first_name #Gary
118
+ client = Facebook.new({
119
+ :site => "https://graph.facebook.com",
120
+ :uid => "YOUR_ID",
121
+ :secret => "YOUR_SECRET",
122
+ :access_token => "YOUR_TOKEN"
123
+ })
124
+ p client.me!.first_name #Gary
125
+ ```
86
126
 
87
127
  ### Github
88
128
 
89
- require 'rapidash'
90
-
91
- class Repos < Rapidash::Base
129
+ ```ruby
130
+ require 'rapidash'
92
131
 
93
- class Users < Rapidash::Base
94
- resource :repos
95
- end
132
+ class Repos < Rapidash::Base
96
133
 
97
- class Github < Rapidash::Client
98
- method :http
99
- resource :users
134
+ class Users < Rapidash::Base
135
+ resource :repos
136
+ end
100
137
 
101
- def initialize
102
- @site = "https://api.github.com/"
103
- end
104
- end
138
+ class Github < Rapidash::Client
139
+ method :http
140
+ resource :users
141
+ site "https://api.github.com/"
142
+ end
105
143
 
106
- client = Github.new
107
- p client.users!("Gazler").name #Gary Rennie
108
- p client.users("Gazler").repos![0].name #Githug
144
+ client = Github.new
145
+ p client.users!("Gazler").name #Gary Rennie
146
+ p client.users("Gazler").repos![0].name #Githug
147
+ ```
109
148
 
110
149
  ## Contributing
111
150
 
data/lib/rapidash/base.rb CHANGED
@@ -3,8 +3,17 @@ module Rapidash
3
3
 
4
4
  include Urlable
5
5
  include Resourceable
6
+
6
7
  attr_accessor :url, :options, :client
7
8
 
9
+ class << self
10
+ attr_accessor :root_element
11
+
12
+ def root(name)
13
+ @root_element = name.to_sym
14
+ end
15
+ end
16
+
8
17
  def initialize(*args)
9
18
  @client, @id, options = args
10
19
 
@@ -20,34 +29,42 @@ module Rapidash
20
29
  end
21
30
 
22
31
  def create!(params)
23
- self.options[:method] = :post
24
- self.options[:body] = params.to_json
32
+ options[:method] = :post
33
+ set_body!(params)
25
34
  call!
26
35
  end
27
36
 
28
37
  def update!(params)
29
- self.options[:method] = client.class.patch ? :patch : :put
30
- self.options[:body] = params.to_json
38
+ options[:method] = client.class.patch ? :patch : :put
39
+ set_body!(params)
31
40
  call!
32
41
  end
33
42
 
34
43
  def delete!
35
- self.options[:method] = :delete
44
+ options[:method] = :delete
36
45
  call!
37
46
  end
38
47
 
39
48
 
40
49
  def call!
41
50
  self.options ||= {}
42
- self.options.delete(:previous_url)
43
- self.options[:header] ||= {}
44
- self.options[:header]["content-type"] = "application/json"
45
- method = self.options.delete(:method) || :get
46
- client.send(method, url, self.options)
51
+ options.delete(:previous_url)
52
+ options[:header] ||= {}
53
+ options[:header]["content-type"] = "application/json"
54
+ method = options.delete(:method) || :get
55
+ client.send(method, url, options)
47
56
  end
48
57
 
49
58
  private
50
59
 
60
+ def set_body!(params)
61
+ if self.class.root_element
62
+ options[:body] = {self.class.root_element => params}.to_json
63
+ else
64
+ options[:body] = params.to_json
65
+ end
66
+ end
67
+
51
68
  def base_url
52
69
  if old_url = self.options[:previous_url]
53
70
  return "#{old_url}/"
@@ -26,5 +26,6 @@ module Rapidash
26
26
  def delete(url, options = {})
27
27
  request(:delete, url, options)
28
28
  end
29
+
29
30
  end
30
31
  end
@@ -7,7 +7,7 @@ module Rapidash
7
7
 
8
8
  module ClassMethods
9
9
 
10
- attr_accessor :patch
10
+ attr_accessor :patch, :url_extension
11
11
 
12
12
  def method(method)
13
13
  case method
@@ -22,6 +22,10 @@ module Rapidash
22
22
  def use_patch
23
23
  @patch = true
24
24
  end
25
+
26
+ def extension(extension)
27
+ @url_extension = extension
28
+ end
25
29
  end
26
30
  end
27
31
  end
@@ -3,20 +3,31 @@ require 'faraday'
3
3
  module Rapidash
4
4
  module HTTPClient
5
5
 
6
- attr_accessor :site, :extension
6
+ def self.included(base)
7
+ base.extend(ClassMethods)
8
+ end
9
+
10
+ attr_accessor :extension, :site
7
11
  attr_writer :connection
8
12
 
9
- def site=(value)
13
+ def initialize
14
+ end
15
+
16
+ def site=(site)
17
+ @site = site
10
18
  @connection = nil
11
- @site = value
12
19
  end
13
20
 
14
21
  def connection
15
- @connection ||= Faraday.new(site)
22
+ @connection ||= Faraday.new(site || self.class.site_url)
16
23
  end
17
24
 
18
25
  def request(verb, url, options = {})
19
- url = "#{url}.#{extension}" if extension
26
+ if extension
27
+ url = "#{url}.#{(extension)}"
28
+ elsif self.class.respond_to?(:url_extension) && self.class.url_extension
29
+ url = "#{url}.#{(self.class.url_extension)}"
30
+ end
20
31
  url = connection.build_url(url, options[:params]).to_s
21
32
  response = connection.run_request(verb, url, options[:body], options[:header])
22
33
 
@@ -29,5 +40,15 @@ module Rapidash
29
40
  return Response.new(response)
30
41
  end
31
42
  end
43
+
44
+
45
+
46
+ module ClassMethods
47
+ attr_accessor :site_url
48
+
49
+ def site(site)
50
+ @site_url = site
51
+ end
52
+ end
32
53
  end
33
54
  end
@@ -18,7 +18,11 @@ module Rapidash
18
18
  end
19
19
 
20
20
  def request(verb, url, options = {})
21
- url = "#{url}.#{extension}" if extension
21
+ if extension
22
+ url = "#{url}.#{(extension)}"
23
+ elsif self.class.respond_to?(:url_extension) && self.class.url_extension
24
+ url = "#{url}.#{(self.class.url_extension)}"
25
+ end
22
26
  response = oauth_access_token.send(verb.to_sym, "#{site}/#{url}", options)
23
27
  body = JSON.parse(response.body)
24
28
  if body.kind_of?(Hash)
@@ -1,4 +1,3 @@
1
- require 'rubygems'
2
1
  require 'json'
3
2
  require 'hashie'
4
3
 
@@ -1,3 +1,3 @@
1
1
  module Rapidash
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -16,6 +16,10 @@ class BaseTesterClient
16
16
  end
17
17
  end
18
18
 
19
+ class RootTester < Rapidash::Base
20
+ root :post
21
+ end
22
+
19
23
 
20
24
  describe Rapidash::Base do
21
25
 
@@ -38,11 +42,15 @@ describe Rapidash::Base do
38
42
  let(:headers) { {"content-type" => "application/json"} }
39
43
  let(:subject) { BaseTester.new(client) }
40
44
 
45
+ let(:no_root) {
46
+ {
47
+ :title => "A test post"
48
+ }
49
+ }
50
+
41
51
  let(:post) {
42
52
  {
43
- :post => {
44
- :title => "A test post"
45
- }
53
+ :post => no_root
46
54
  }
47
55
  }
48
56
 
@@ -55,6 +63,16 @@ describe Rapidash::Base do
55
63
  :body => post.to_json
56
64
  })
57
65
  end
66
+
67
+ it "should use the root element if one is defined" do
68
+ subject = RootTester.new
69
+ subject.should_receive(:call!)
70
+ subject.create!(no_root)
71
+ subject.instance_variable_get(:@options).should eql({
72
+ :method => :post,
73
+ :body => post.to_json
74
+ })
75
+ end
58
76
  end
59
77
 
60
78
  describe ".update!" do
@@ -76,6 +94,16 @@ describe Rapidash::Base do
76
94
  :body => post.to_json
77
95
  })
78
96
  end
97
+
98
+ it "should use the root element if one is defined" do
99
+ subject = RootTester.new(client)
100
+ subject.should_receive(:call!)
101
+ subject.update!(no_root)
102
+ subject.instance_variable_get(:@options).should eql({
103
+ :method => :patch,
104
+ :body => post.to_json
105
+ })
106
+ end
79
107
  end
80
108
 
81
109
  describe ".delete!" do
@@ -10,6 +10,14 @@ class HTTPClientTester
10
10
  method :http
11
11
  end
12
12
 
13
+ class HTTPClientPatchTester < HTTPClientTester
14
+ use_patch
15
+ end
16
+
17
+ class HTTPClientExtensionTester < HTTPClientTester
18
+ extension :json
19
+ end
20
+
13
21
  class TestClientTester
14
22
  include Rapidash::Clientable
15
23
  method :test
@@ -54,4 +62,16 @@ describe Rapidash::Clientable do
54
62
 
55
63
  end
56
64
 
65
+ describe "#use_patch" do
66
+ it "should set the patch variable to true" do
67
+ HTTPClientPatchTester.new.class.instance_variable_get(:@patch).should eql(true)
68
+ end
69
+ end
70
+
71
+ describe "#extension" do
72
+ it "should set the url_extension variable" do
73
+ HTTPClientExtensionTester.new.class.instance_variable_get(:@url_extension).should eql(:json)
74
+ end
75
+ end
76
+
57
77
  end
@@ -4,6 +4,17 @@ class HTTPTester
4
4
  include Rapidash::HTTPClient
5
5
  end
6
6
 
7
+ class HTTPSiteTester < HTTPTester
8
+ site "http://mysite.com/"
9
+ end
10
+
11
+ class HTTPExtensionTester < HTTPTester
12
+ site "http://mysite.com/"
13
+ def self.url_extension
14
+ :json
15
+ end
16
+ end
17
+
7
18
  describe Rapidash::HTTPClient do
8
19
 
9
20
  let!(:subject) { HTTPTester.new }
@@ -28,6 +39,18 @@ describe Rapidash::HTTPClient do
28
39
  it "should create a Faraday object" do
29
40
  subject.connection.class.should eql(Faraday::Connection)
30
41
  end
42
+
43
+ it "should use the site variable if set" do
44
+ Faraday.should_receive(:new).with("http://example.com/")
45
+ subject.site = "http://example.com/"
46
+ subject.connection
47
+ end
48
+
49
+ it "should use the class URL if one is defined" do
50
+ subject = HTTPSiteTester.new
51
+ Faraday.should_receive(:new).with("http://mysite.com/")
52
+ subject.connection
53
+ end
31
54
  end
32
55
 
33
56
  describe ".request" do
@@ -46,6 +69,13 @@ describe Rapidash::HTTPClient do
46
69
  subject.request(:get, "foo")
47
70
  end
48
71
 
72
+ it "should use the class extension if one is set" do
73
+ subject = HTTPExtensionTester.new
74
+ subject.connection.should_receive(:run_request).with(:get, "http://mysite.com/foo.json", nil, nil).and_return(valid_response)
75
+ subject.request(:get, "foo")
76
+ end
77
+
78
+
49
79
  it "should return a response object" do
50
80
  subject.connection.should_receive(:run_request).with(:get, "http://example.com/foo", nil, nil).and_return(valid_response)
51
81
  response = subject.request(:get, "foo")
@@ -4,6 +4,12 @@ class OAuthTester
4
4
  include Rapidash::OAuthClient
5
5
  end
6
6
 
7
+ class OAuthExtensionTester < OAuthTester
8
+ def self.url_extension
9
+ :json
10
+ end
11
+ end
12
+
7
13
  describe Rapidash::OAuthClient do
8
14
 
9
15
  let(:options) do
@@ -67,6 +73,15 @@ describe Rapidash::OAuthClient do
67
73
  subject.request(:get, "me")
68
74
  end
69
75
 
76
+ it "should use the class extension if one is set" do
77
+ subject = OAuthExtensionTester.new(options)
78
+ subject.stub(:oauth_access_token).and_return(request)
79
+ request.stub(:get).and_return(response)
80
+ request.should_receive(:get).with("http://example.com/me.json", anything)
81
+ subject.request(:get, "me")
82
+ end
83
+
84
+
70
85
  it "should return a Hashie::Mash" do
71
86
  subject.request(:get, "me").class.should eql(Hashie::Mash)
72
87
  end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,2 @@
1
- require 'rubygems'
2
1
  require "./lib/rapidash"
3
2
  require "ostruct"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rapidash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gary 'Gazler' Rennie