purzelrakete-boomloop 0.0.2 → 0.0.3
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.
- data/README.txt +5 -8
- data/bin/boomloop +2 -2
- data/lib/authentication/client.rb +5 -0
- data/lib/resources/base.rb +23 -7
- data/test/boomloop_resource_test.rb +13 -13
- metadata +1 -1
data/README.txt
CHANGED
@@ -20,17 +20,14 @@ a 3 step process.
|
|
20
20
|
|
21
21
|
== Example API Call
|
22
22
|
|
23
|
-
Once you have authorized your client, you can make the first API call
|
23
|
+
Once you have authorized your client, you can make the first API client call.
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
events = connection.get("/events").body
|
25
|
+
require 'boomloop'
|
26
|
+
events = Boomloop::Resources::Event.index(:order => :proximity, :origin => "opernplatz, frankfurt am main")
|
28
27
|
|
29
|
-
This returns the
|
28
|
+
This returns a list of the top 10 closest upcoming events, where the origin is opernplatz, frankfurt am main.
|
30
29
|
|
31
|
-
The
|
32
|
-
the boomloop script, a config key 'api' is created in the YAMLStore. This holds your the access
|
33
|
-
tokens so that you don't need to negotiate them every time you want to make a request.
|
30
|
+
For a full description of options, see boomloop.com/api. The ruby lib is just a thin wrapper around the REST api, so what goes up rthere, must come down here ;)
|
34
31
|
|
35
32
|
|
36
33
|
|
data/bin/boomloop
CHANGED
@@ -33,11 +33,11 @@ error(parser) unless options.secret && options.key
|
|
33
33
|
|
34
34
|
# negotiate the tokens
|
35
35
|
client = Boomloop::Authentication::Client.new("api", Boomloop::Authentication::Store::YAMLStore.new)
|
36
|
-
request_token = client.consume(options.key, options.secret) rescue error("Invalid. Check your credentials at
|
36
|
+
request_token = client.consume(options.key, options.secret) rescue error("Invalid. Check your credentials at #{ Boomloop::Resources::Base.api_base }oauth/applications.")
|
37
37
|
puts "\nalmost ready! go to #{ request_token.authorize_url }\n\n press enter when you're done... <waiting>\n"
|
38
38
|
|
39
39
|
while !@access_token && gets
|
40
40
|
@access_token = client.activate rescue nil
|
41
41
|
end
|
42
42
|
|
43
|
-
puts "your keys have been activated. you're ready to use the api. \n\n"
|
43
|
+
puts "your keys have been activated. you're ready to use the api. \n\n"
|
@@ -1,3 +1,8 @@
|
|
1
|
+
=begin
|
2
|
+
The Client takes two arguments - a config key, and an authentication name. When you authorize using
|
3
|
+
the boomloop script, a config key 'api' is created in the YAMLStore. This holds your the access
|
4
|
+
tokens so that you don't need to negotiate them every time you want to make a request.
|
5
|
+
=end
|
1
6
|
module Boomloop
|
2
7
|
module Authentication
|
3
8
|
class Client
|
data/lib/resources/base.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
module Boomloop
|
2
2
|
module Resources
|
3
3
|
class Base < ::OpenStruct
|
4
|
-
API_BASE = 'http://api.boomloop.com/'
|
5
|
-
|
6
4
|
class << self
|
7
5
|
attr_accessor :connection
|
8
6
|
end
|
9
7
|
|
8
|
+
def self.api_base
|
9
|
+
ENV["BOOMLOOP_API_BASE"] || 'http://api.boomloop.com/'
|
10
|
+
end
|
11
|
+
|
10
12
|
def self.connection
|
11
13
|
@@connection ||= init
|
12
14
|
end
|
@@ -45,23 +47,37 @@ module Boomloop
|
|
45
47
|
|
46
48
|
# REST methods
|
47
49
|
def self.index(params = {})
|
48
|
-
url =
|
50
|
+
url = api_base + self.plural
|
49
51
|
url += "?#{ params.to_query }" unless params.empty?
|
50
52
|
xml = connection.get(url)
|
51
|
-
|
53
|
+
|
54
|
+
attrs = from_xml(xml)
|
52
55
|
construct_resource_collection(attrs)
|
53
56
|
end
|
54
57
|
|
55
58
|
def self.show(url)
|
56
59
|
xml = connection.get(url)
|
57
|
-
attrs =
|
60
|
+
attrs = from_xml(xml)
|
58
61
|
self.new(attrs[self.singular])
|
59
62
|
end
|
60
63
|
|
61
64
|
def self.create(resource)
|
62
|
-
url =
|
65
|
+
url = api_base + self.plural
|
63
66
|
xml = connection.post(url, resource.to_hash.to_query)
|
64
|
-
self.new(
|
67
|
+
self.new(from_xml(xml)[self.singular])
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.from_xml(response)
|
71
|
+
xml = nil
|
72
|
+
begin
|
73
|
+
xml = Hash.from_xml(response)
|
74
|
+
rescue Exception => e
|
75
|
+
raise Boomloop::APIError.new("Response from boomloop could not be parsed. Response was: \n\n #{ response }")
|
76
|
+
end
|
77
|
+
|
78
|
+
raise Boomloop::APIError.new("There was a problem with your request: \n\n #{ response }") if xml["errors"]
|
79
|
+
|
80
|
+
xml
|
65
81
|
end
|
66
82
|
|
67
83
|
def self.construct_resource_collection(attrs)
|
@@ -16,32 +16,32 @@ context "a boomloop resource" do
|
|
16
16
|
monster.to_hash.should.equal qualities
|
17
17
|
end
|
18
18
|
|
19
|
-
specify "should be showable when calling Boomloop::Resources::Monster.show('
|
20
|
-
@connection.expects(:get).with("
|
19
|
+
specify "should be showable when calling Boomloop::Resources::Monster.show('#{ Boomloop::Resources::Base.api_base }monsters/fred')" do
|
20
|
+
@connection.expects(:get).with("#{ Boomloop::Resources::Base.api_base }monsters/fred").at_least_once.returns(%Q[
|
21
21
|
<monster>
|
22
|
-
<resource_url
|
22
|
+
<resource_url>#{ Boomloop::Resources::Base.api_base }monsters/fred</resource_url>
|
23
23
|
<size>huge</size>
|
24
24
|
<affect>sanguine</affect>
|
25
25
|
<name>fred</name>
|
26
26
|
</monster>
|
27
27
|
])
|
28
28
|
|
29
|
-
monster = Boomloop::Resources::Monster.show(
|
29
|
+
monster = Boomloop::Resources::Monster.show("#{ Boomloop::Resources::Base.api_base }monsters/fred")
|
30
30
|
monster.name.should.equal "fred"
|
31
31
|
end
|
32
32
|
|
33
33
|
specify "should be listable when calling Boomloop::Resources::Monster.index" do
|
34
|
-
@connection.expects(:get).with("
|
34
|
+
@connection.expects(:get).with("#{ Boomloop::Resources::Base.api_base }monsters").at_least_once.returns(%Q[
|
35
35
|
<monsters>
|
36
36
|
<monster>
|
37
|
-
<resource_url
|
37
|
+
<resource_url>#{ Boomloop::Resources::Base.api_base }monsters/fred</resource_url>
|
38
38
|
<size>huge</size>
|
39
39
|
<affect>sanguine</affect>
|
40
40
|
<name>fred</name>
|
41
41
|
</monster>
|
42
42
|
|
43
43
|
<monster>
|
44
|
-
<resource_url
|
44
|
+
<resource_url>#{ Boomloop::Resources::Base.api_base }monsters/simon</resource_url>
|
45
45
|
<size>middling</size>
|
46
46
|
<affect>indifferent</affect>
|
47
47
|
<name>simon</name>
|
@@ -54,10 +54,10 @@ context "a boomloop resource" do
|
|
54
54
|
end
|
55
55
|
|
56
56
|
specify "should be listable when calling Boomloop::Resources::Monster.index and there is only one result" do
|
57
|
-
@connection.expects(:get).with("
|
57
|
+
@connection.expects(:get).with("#{ Boomloop::Resources::Base.api_base }monsters").at_least_once.returns(%Q[
|
58
58
|
<monsters>
|
59
59
|
<monster>
|
60
|
-
<resource_url
|
60
|
+
<resource_url>#{ Boomloop::Resources::Base.api_base }monsters/fred</resource_url>
|
61
61
|
<size>huge</size>
|
62
62
|
<affect>sanguine</affect>
|
63
63
|
<name>fred</name>
|
@@ -70,10 +70,10 @@ context "a boomloop resource" do
|
|
70
70
|
end
|
71
71
|
|
72
72
|
specify "should be listable with attributes when calling Boomloop::Resources::Monster.index(:affect => :sanguine)" do
|
73
|
-
@connection.expects(:get).with("
|
73
|
+
@connection.expects(:get).with("#{ Boomloop::Resources::Base.api_base }monsters?affect=sanguine").at_least_once.returns(%Q[
|
74
74
|
<monsters>
|
75
75
|
<monster>
|
76
|
-
<resource_url
|
76
|
+
<resource_url>#{ Boomloop::Resources::Base.api_base }monsters/fred</resource_url>
|
77
77
|
<size>huge</size>
|
78
78
|
<affect>sanguine</affect>
|
79
79
|
<name>fred</name>
|
@@ -86,10 +86,10 @@ context "a boomloop resource" do
|
|
86
86
|
end
|
87
87
|
|
88
88
|
specify "should be savable when calling .save on a Monster instance" do
|
89
|
-
intended_resource_url =
|
89
|
+
intended_resource_url = "#{ Boomloop::Resources::Base.api_base }monsters/samuel"
|
90
90
|
intended_attributes = { :size => :laughable, :affect => :mordant, :name => "samuel" }
|
91
91
|
|
92
|
-
@connection.expects(:post).with("
|
92
|
+
@connection.expects(:post).with("#{ Boomloop::Resources::Base.api_base }monsters", intended_attributes.to_query).at_least_once.returns(%Q[
|
93
93
|
<monster>
|
94
94
|
<resource_url>#{ intended_resource_url }</resource_url>
|
95
95
|
<size>laughable</size>
|