fluidinfo 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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 "json", ">= 1.5.1"
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.2.2
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.2.2"
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-22}
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<json>, [">= 1.5.1"])
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<json>, [">= 1.5.1"])
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<json>, [">= 1.5.1"])
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 "json"
3
+ require "yajl/json_gem"
4
4
  require "base64"
5
- require "crack/json"
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
- path = @instance + path
42
- args = ''
43
- options.each do |key, val|
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
- body = options[:body]
80
- mime = "application/json"
81
- body = JSON.dump options[:body]
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
- path = @instance + path
97
- if options[:query]
98
- query = URI.escape options[:query]
99
- path += "?query=#{query}"
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
- path = @instance + path
129
- if options[:query]
130
- query = URI.escape options[:query]
131
- path += "?query=#{query}"
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
- if options[:tags]
134
- options[:tags].each do |tag|
135
- tag = URI.escape tag
136
- path += "&tag=#{tag}"
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
@@ -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 path, :body => p
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
- - 2
9
- - 2
10
- version: 0.2.2
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-22 00:00:00 -04:00
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: 1
43
+ hash: 59
44
44
  segments:
45
- - 1
46
- - 5
47
- - 1
48
- version: 1.5.1
49
- name: json
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: *id004
64
+ version_requirements: *id003
79
65
  prerelease: false
80
66
  type: :development
81
67
  - !ruby/object:Gem::Dependency
82
- requirement: &id005 !ruby/object:Gem::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: *id005
80
+ version_requirements: *id004
95
81
  prerelease: false
96
82
  type: :development
97
83
  - !ruby/object:Gem::Dependency
98
- requirement: &id006 !ruby/object:Gem::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: *id006
96
+ version_requirements: *id005
111
97
  prerelease: false
112
98
  type: :development
113
99
  - !ruby/object:Gem::Dependency
114
- requirement: &id007 !ruby/object:Gem::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: *id007
110
+ version_requirements: *id006
125
111
  prerelease: false
126
112
  type: :development
127
113
  - !ruby/object:Gem::Dependency
128
- requirement: &id008 !ruby/object:Gem::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: *id008
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.