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 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.