fluidinfo 0.2.2 → 0.3.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.
- data/Gemfile +1 -2
- data/Gemfile.lock +2 -4
- data/VERSION +1 -1
- data/fluidinfo.gemspec +5 -8
- data/lib/fluidinfo.rb +70 -61
- data/test/test_fluidinfo.rb +20 -2
- metadata +19 -33
data/Gemfile
CHANGED
@@ -3,8 +3,7 @@ source "http://rubygems.org"
|
|
3
3
|
# Example:
|
4
4
|
# gem "activesupport", ">= 2.3.5"
|
5
5
|
gem "rest-client", ">= 1.6.1"
|
6
|
-
gem "
|
7
|
-
gem "crack"
|
6
|
+
gem "yajl-ruby", ">= 0.8.2"
|
8
7
|
|
9
8
|
# Add dependencies to develop your gem here.
|
10
9
|
# Include everything needed to run rake, tests, features, etc.
|
data/Gemfile.lock
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
crack (0.1.8)
|
5
4
|
git (1.2.5)
|
6
5
|
jeweler (1.5.2)
|
7
6
|
bundler (~> 1.0.0)
|
8
7
|
git (>= 1.2.5)
|
9
8
|
rake
|
10
|
-
json (1.5.1)
|
11
9
|
mime-types (1.16)
|
12
10
|
rake (0.8.7)
|
13
11
|
rcov (0.9.9)
|
@@ -15,16 +13,16 @@ GEM
|
|
15
13
|
mime-types (>= 1.16)
|
16
14
|
shoulda (2.11.3)
|
17
15
|
uuidtools (2.1.2)
|
16
|
+
yajl-ruby (0.8.2)
|
18
17
|
|
19
18
|
PLATFORMS
|
20
19
|
ruby
|
21
20
|
|
22
21
|
DEPENDENCIES
|
23
22
|
bundler (~> 1.0.0)
|
24
|
-
crack
|
25
23
|
jeweler (~> 1.5.2)
|
26
|
-
json (>= 1.5.1)
|
27
24
|
rcov
|
28
25
|
rest-client (>= 1.6.1)
|
29
26
|
shoulda
|
30
27
|
uuidtools (>= 2.1.2)
|
28
|
+
yajl-ruby (>= 0.8.2)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/fluidinfo.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{fluidinfo}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Eric Seidel"]
|
12
|
-
s.date = %q{2011-03-
|
12
|
+
s.date = %q{2011-03-23}
|
13
13
|
s.description = %q{This gem provides a simple interface to fluidinfo, built on top of the rest-client gem.}
|
14
14
|
s.email = %q{gridaphobe@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -44,8 +44,7 @@ Gem::Specification.new do |s|
|
|
44
44
|
|
45
45
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
46
46
|
s.add_runtime_dependency(%q<rest-client>, [">= 1.6.1"])
|
47
|
-
s.add_runtime_dependency(%q<
|
48
|
-
s.add_runtime_dependency(%q<crack>, [">= 0"])
|
47
|
+
s.add_runtime_dependency(%q<yajl-ruby>, [">= 0.8.2"])
|
49
48
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
50
49
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
51
50
|
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
@@ -53,8 +52,7 @@ Gem::Specification.new do |s|
|
|
53
52
|
s.add_development_dependency(%q<uuidtools>, [">= 2.1.2"])
|
54
53
|
else
|
55
54
|
s.add_dependency(%q<rest-client>, [">= 1.6.1"])
|
56
|
-
s.add_dependency(%q<
|
57
|
-
s.add_dependency(%q<crack>, [">= 0"])
|
55
|
+
s.add_dependency(%q<yajl-ruby>, [">= 0.8.2"])
|
58
56
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
59
57
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
60
58
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
@@ -63,8 +61,7 @@ Gem::Specification.new do |s|
|
|
63
61
|
end
|
64
62
|
else
|
65
63
|
s.add_dependency(%q<rest-client>, [">= 1.6.1"])
|
66
|
-
s.add_dependency(%q<
|
67
|
-
s.add_dependency(%q<crack>, [">= 0"])
|
64
|
+
s.add_dependency(%q<yajl-ruby>, [">= 0.8.2"])
|
68
65
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
69
66
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
70
67
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
data/lib/fluidinfo.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
require "rest-client"
|
2
2
|
require "uri"
|
3
|
-
require "
|
3
|
+
require "yajl/json_gem"
|
4
4
|
require "base64"
|
5
|
-
require "
|
5
|
+
require "set"
|
6
6
|
|
7
7
|
module Fluidinfo
|
8
|
+
ITERABLE_TYPES = Set.new [Array, Hash]
|
9
|
+
SERIALIZABLE_TYPES = Set.new [NilClass, String, Fixnum, Float, Symbol,
|
10
|
+
TrueClass, FalseClass]
|
11
|
+
|
8
12
|
class Client
|
9
13
|
# The main fluidinfo instance.
|
10
14
|
@@MAIN = 'https://fluiddb.fluidinfo.com'
|
@@ -38,26 +42,9 @@ module Fluidinfo
|
|
38
42
|
# consult the {Fluidinfo API documentation}[api.fluidinfo.com] for a list of
|
39
43
|
# appropriate options
|
40
44
|
def get(path, options={})
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
if key == :tags
|
45
|
-
val.each do |tag|
|
46
|
-
args += "&tag=#{URI.escape tag.to_s}"
|
47
|
-
end
|
48
|
-
else
|
49
|
-
args += "&#{URI.escape key.to_s}=#{URI.escape val.to_s}"
|
50
|
-
end
|
51
|
-
args[0] = '?'
|
52
|
-
end
|
53
|
-
path += args
|
54
|
-
response = RestClient.get path, @headers
|
55
|
-
begin
|
56
|
-
JSON.load response.to_str
|
57
|
-
rescue JSON::ParserError
|
58
|
-
# this should mean that fluidinfo returned a non-hash/array primitive
|
59
|
-
Crack::JSON.parse response.to_str
|
60
|
-
end
|
45
|
+
url = build_url path, options
|
46
|
+
response = RestClient.get url, @headers
|
47
|
+
JSON.parse response
|
61
48
|
end
|
62
49
|
|
63
50
|
##
|
@@ -76,11 +63,9 @@ module Fluidinfo
|
|
76
63
|
def post(path, options={})
|
77
64
|
path = @instance + path
|
78
65
|
if options[:body]
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
headers = @headers.merge :content_type => mime
|
83
|
-
JSON.parse(RestClient.post path, body, headers)
|
66
|
+
payload = build_payload options
|
67
|
+
headers = @headers.merge :content_type => payload[:mime]
|
68
|
+
JSON.parse(RestClient.post path, payload[:body], headers)
|
84
69
|
else
|
85
70
|
JSON.parse(RestClient.post path, nil)
|
86
71
|
end
|
@@ -93,29 +78,10 @@ module Fluidinfo
|
|
93
78
|
#
|
94
79
|
# +options[:mime]+ contains the MIME-type unless the payload is JSON-encodable
|
95
80
|
def put(path, options={})
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
end
|
101
|
-
body = options[:body]
|
102
|
-
if options[:mime]
|
103
|
-
mime = options[:mime]
|
104
|
-
else
|
105
|
-
mime = "application/json"
|
106
|
-
begin
|
107
|
-
body = JSON.dump options[:body]
|
108
|
-
rescue JSON::GeneratorError
|
109
|
-
if options[:body] == nil
|
110
|
-
body = "null"
|
111
|
-
else
|
112
|
-
body = options[:body].to_s
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
# nothing returned in response body for PUT
|
117
|
-
headers = @headers.merge :content_type => mime
|
118
|
-
RestClient.put path, body, headers
|
81
|
+
url = build_url path, options
|
82
|
+
payload = build_payload options
|
83
|
+
headers = @headers.merge :content_type => payload[:mime]
|
84
|
+
RestClient.put url, payload[:body], headers
|
119
85
|
end
|
120
86
|
|
121
87
|
##
|
@@ -125,19 +91,62 @@ module Fluidinfo
|
|
125
91
|
# consult the {Fluidinfo API documentation}[api.fluidinfo.com] for a list of
|
126
92
|
# appropriate options
|
127
93
|
def delete(path, options={})
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
94
|
+
url = build_url path, options
|
95
|
+
# nothing returned in response body for DELETE
|
96
|
+
RestClient.delete url, @headers
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
##
|
101
|
+
# Build a url from the given path and url args
|
102
|
+
def build_url(path, options={})
|
103
|
+
opts = options.reject do |key, val|
|
104
|
+
[:body, :mime].include? key
|
105
|
+
end
|
106
|
+
args = opts.inject([]) do |arr, (key, val)|
|
107
|
+
if key == :tags
|
108
|
+
# dealing with tag list
|
109
|
+
val.each do |tag|
|
110
|
+
arr << "tag=#{tag}"
|
111
|
+
end
|
112
|
+
else
|
113
|
+
arr << "#{key}=#{val}"
|
114
|
+
end
|
115
|
+
arr
|
116
|
+
end.join('&')
|
117
|
+
if args != ''
|
118
|
+
URI.escape "#{@instance}#{path}?#{args}"
|
119
|
+
else
|
120
|
+
"#{@instance}#{path}"
|
121
|
+
end
|
132
122
|
end
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
123
|
+
|
124
|
+
##
|
125
|
+
# Build the payload from the options hash
|
126
|
+
def build_payload(options)
|
127
|
+
payload = options.reject {|k,v| !([:body, :mime].include? k)}
|
128
|
+
if payload[:mime]
|
129
|
+
# user set mime-type, let them deal with it :)
|
130
|
+
payload
|
131
|
+
elsif ITERABLE_TYPES.include? payload[:body].class
|
132
|
+
payload[:body] = JSON.dump payload[:body]
|
133
|
+
payload[:mime] = "application/json"
|
134
|
+
payload
|
135
|
+
elsif SERIALIZABLE_TYPES.include? payload[:body].class
|
136
|
+
payload[:body] = JSON.dump payload[:body]
|
137
|
+
payload[:mime] = "application/vnd.fluiddb.value+json"
|
138
|
+
payload
|
139
|
+
else
|
140
|
+
raise TypeError, "You must supply the mime-type"
|
137
141
|
end
|
138
142
|
end
|
139
|
-
# nothing returned in response body for DELETE
|
140
|
-
RestClient.delete path, @headers
|
141
|
-
end
|
142
143
|
end
|
144
|
+
|
145
|
+
def self.version
|
146
|
+
# This was borrowed from the rest-client gem :)
|
147
|
+
version_path = File.dirname(__FILE__) + "/../VERSION"
|
148
|
+
return File.read(version_path).chomp if File.file?(version_path)
|
149
|
+
"0.0.0"
|
150
|
+
end
|
151
|
+
|
143
152
|
end
|
data/test/test_fluidinfo.rb
CHANGED
@@ -73,6 +73,24 @@ class FluidinfoTest < Test::Unit::TestCase
|
|
73
73
|
:returnNamespaces => true)
|
74
74
|
end
|
75
75
|
end
|
76
|
+
|
77
|
+
context "/values" do
|
78
|
+
should "retrieve a set of tags" do
|
79
|
+
expected = {
|
80
|
+
"results" => {
|
81
|
+
"id" => {
|
82
|
+
"e034d8c0-a2e4-4094-895b-3a8065f9696e" => {
|
83
|
+
"fluiddb/users/username" => { "value" => "gridaphobe" },
|
84
|
+
"fluiddb/about" => { "value" => "Object for the user named gridaphobe"}
|
85
|
+
}
|
86
|
+
}
|
87
|
+
}
|
88
|
+
}
|
89
|
+
assert_equal expected, @fluid.get("/values",
|
90
|
+
:query => 'fluiddb/users/username="gridaphobe"',
|
91
|
+
:tags => ['fluiddb/users/username', 'fluiddb/about'])
|
92
|
+
end
|
93
|
+
end
|
76
94
|
end
|
77
95
|
|
78
96
|
context "POST" do
|
@@ -126,9 +144,9 @@ class FluidinfoTest < Test::Unit::TestCase
|
|
126
144
|
path = "/objects/#{ns_id}/test/#{new_ns}/#{new_tag}"
|
127
145
|
# Make sure that all primitive values are properly encoded and
|
128
146
|
# sent to Fluidinfo
|
129
|
-
primitives = [1, 1.1, "foo", true, nil, [1, 2, 3]]
|
147
|
+
primitives = [1, 1.1, "foo", true, nil, [1, '2', 3]]
|
130
148
|
primitives.each do |p|
|
131
|
-
resp = @fluid.put
|
149
|
+
resp = @fluid.put(path, :body => p)
|
132
150
|
assert_equal p, @fluid.get(path)
|
133
151
|
end
|
134
152
|
|
metadata
CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Eric Seidel
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-03-
|
18
|
+
date: 2011-03-23 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -40,13 +40,13 @@ dependencies:
|
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
hash:
|
43
|
+
hash: 59
|
44
44
|
segments:
|
45
|
-
-
|
46
|
-
-
|
47
|
-
-
|
48
|
-
version:
|
49
|
-
name:
|
45
|
+
- 0
|
46
|
+
- 8
|
47
|
+
- 2
|
48
|
+
version: 0.8.2
|
49
|
+
name: yajl-ruby
|
50
50
|
version_requirements: *id002
|
51
51
|
prerelease: false
|
52
52
|
type: :runtime
|
@@ -60,26 +60,12 @@ dependencies:
|
|
60
60
|
segments:
|
61
61
|
- 0
|
62
62
|
version: "0"
|
63
|
-
name: crack
|
64
|
-
version_requirements: *id003
|
65
|
-
prerelease: false
|
66
|
-
type: :runtime
|
67
|
-
- !ruby/object:Gem::Dependency
|
68
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
69
|
-
none: false
|
70
|
-
requirements:
|
71
|
-
- - ">="
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
hash: 3
|
74
|
-
segments:
|
75
|
-
- 0
|
76
|
-
version: "0"
|
77
63
|
name: shoulda
|
78
|
-
version_requirements: *
|
64
|
+
version_requirements: *id003
|
79
65
|
prerelease: false
|
80
66
|
type: :development
|
81
67
|
- !ruby/object:Gem::Dependency
|
82
|
-
requirement: &
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
83
69
|
none: false
|
84
70
|
requirements:
|
85
71
|
- - ~>
|
@@ -91,11 +77,11 @@ dependencies:
|
|
91
77
|
- 0
|
92
78
|
version: 1.0.0
|
93
79
|
name: bundler
|
94
|
-
version_requirements: *
|
80
|
+
version_requirements: *id004
|
95
81
|
prerelease: false
|
96
82
|
type: :development
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
|
-
requirement: &
|
84
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
99
85
|
none: false
|
100
86
|
requirements:
|
101
87
|
- - ~>
|
@@ -107,11 +93,11 @@ dependencies:
|
|
107
93
|
- 2
|
108
94
|
version: 1.5.2
|
109
95
|
name: jeweler
|
110
|
-
version_requirements: *
|
96
|
+
version_requirements: *id005
|
111
97
|
prerelease: false
|
112
98
|
type: :development
|
113
99
|
- !ruby/object:Gem::Dependency
|
114
|
-
requirement: &
|
100
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
115
101
|
none: false
|
116
102
|
requirements:
|
117
103
|
- - ">="
|
@@ -121,11 +107,11 @@ dependencies:
|
|
121
107
|
- 0
|
122
108
|
version: "0"
|
123
109
|
name: rcov
|
124
|
-
version_requirements: *
|
110
|
+
version_requirements: *id006
|
125
111
|
prerelease: false
|
126
112
|
type: :development
|
127
113
|
- !ruby/object:Gem::Dependency
|
128
|
-
requirement: &
|
114
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
129
115
|
none: false
|
130
116
|
requirements:
|
131
117
|
- - ">="
|
@@ -137,7 +123,7 @@ dependencies:
|
|
137
123
|
- 2
|
138
124
|
version: 2.1.2
|
139
125
|
name: uuidtools
|
140
|
-
version_requirements: *
|
126
|
+
version_requirements: *id007
|
141
127
|
prerelease: false
|
142
128
|
type: :development
|
143
129
|
description: This gem provides a simple interface to fluidinfo, built on top of the rest-client gem.
|