fluidinfo 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile CHANGED
@@ -1,16 +1,13 @@
1
1
  source "http://rubygems.org"
2
- # Add dependencies required to use your gem here.
3
- # Example:
4
- # gem "activesupport", ">= 2.3.5"
5
- gem "rest-client", ">= 1.6.1"
6
- gem "yajl-ruby", ">= 0.8.2"
7
2
 
8
- # Add dependencies to develop your gem here.
9
- # Include everything needed to run rake, tests, features, etc.
3
+ gem "rest-client", "~> 1.6.7"
4
+ gem "yajl-ruby", "~> 1.0.0"
5
+
10
6
  group :development do
11
- gem "shoulda", ">= 0"
7
+ gem "rake", "~> 0.9.2"
8
+ gem "rspec", "~> 2.6.0"
12
9
  gem "bundler", "~> 1.0.0"
13
- gem "jeweler", "~> 1.5.2"
14
- gem "rcov", ">= 0"
15
- gem "uuidtools", ">= 2.1.2"
10
+ gem "jeweler", "~> 1.6.4"
11
+ gem "uuidtools", "~> 2.1.2"
12
+ gem "yard", "~> 0.7.2"
16
13
  end
data/Gemfile.lock CHANGED
@@ -1,28 +1,37 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
+ diff-lcs (1.1.3)
4
5
  git (1.2.5)
5
- jeweler (1.5.2)
6
- bundler (~> 1.0.0)
6
+ jeweler (1.6.4)
7
+ bundler (~> 1.0)
7
8
  git (>= 1.2.5)
8
9
  rake
9
10
  mime-types (1.16)
10
- rake (0.8.7)
11
- rcov (0.9.9)
12
- rest-client (1.6.1)
11
+ rake (0.9.2)
12
+ rest-client (1.6.7)
13
13
  mime-types (>= 1.16)
14
- shoulda (2.11.3)
14
+ rspec (2.6.0)
15
+ rspec-core (~> 2.6.0)
16
+ rspec-expectations (~> 2.6.0)
17
+ rspec-mocks (~> 2.6.0)
18
+ rspec-core (2.6.4)
19
+ rspec-expectations (2.6.0)
20
+ diff-lcs (~> 1.1.2)
21
+ rspec-mocks (2.6.0)
15
22
  uuidtools (2.1.2)
16
- yajl-ruby (0.8.2)
23
+ yajl-ruby (1.0.0)
24
+ yard (0.7.2)
17
25
 
18
26
  PLATFORMS
19
27
  ruby
20
28
 
21
29
  DEPENDENCIES
22
30
  bundler (~> 1.0.0)
23
- jeweler (~> 1.5.2)
24
- rcov
25
- rest-client (>= 1.6.1)
26
- shoulda
27
- uuidtools (>= 2.1.2)
28
- yajl-ruby (>= 0.8.2)
31
+ jeweler (~> 1.6.4)
32
+ rake (~> 0.9.2)
33
+ rest-client (~> 1.6.7)
34
+ rspec (~> 2.6.0)
35
+ uuidtools (~> 2.1.2)
36
+ yajl-ruby (~> 1.0.0)
37
+ yard (~> 0.7.2)
data/Rakefile CHANGED
@@ -26,28 +26,13 @@ Jeweler::Tasks.new do |gem|
26
26
  end
27
27
  Jeweler::RubygemsDotOrgTasks.new
28
28
 
29
- require 'rake/testtask'
30
- Rake::TestTask.new(:test) do |test|
31
- test.libs << 'lib' << 'test'
32
- test.pattern = 'test/**/test_*.rb'
33
- test.verbose = true
34
- end
29
+ require 'rspec/core/rake_task'
30
+ RSpec::Core::RakeTask.new(:spec)
35
31
 
36
- require 'rcov/rcovtask'
37
- Rcov::RcovTask.new do |test|
38
- test.libs << 'test'
39
- test.pattern = 'test/**/test_*.rb'
40
- test.verbose = true
32
+ require 'yard/rake/yardoc_task'
33
+ YARD::Rake::YardocTask.new do |t|
34
+ t.files = ['lib/**/*.rb']
35
+ t.options = ['--any', '--extra', '--opts']
41
36
  end
42
37
 
43
- task :default => :test
44
-
45
- require 'rake/rdoctask'
46
- Rake::RDocTask.new do |rdoc|
47
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
48
-
49
- rdoc.rdoc_dir = 'rdoc'
50
- rdoc.title = "fluidinfo #{version}"
51
- rdoc.rdoc_files.include('README*')
52
- rdoc.rdoc_files.include('lib/**/*.rb')
53
- end
38
+ task :default => :spec
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.1
1
+ 0.5.0
data/fluidinfo.gemspec CHANGED
@@ -4,20 +4,21 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{fluidinfo}
8
- s.version = "0.4.1"
7
+ s.name = "fluidinfo"
8
+ s.version = "0.5.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-06-09}
13
- s.description = %q{This gem provides a simple interface to fluidinfo, built on top of the rest-client gem.}
14
- s.email = %q{gridaphobe@gmail.com}
12
+ s.date = "2011-09-17"
13
+ s.description = "This gem provides a simple interface to fluidinfo, built on top of the rest-client gem."
14
+ s.email = "gridaphobe@gmail.com"
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE.txt",
17
17
  "README.rdoc"
18
18
  ]
19
19
  s.files = [
20
20
  ".document",
21
+ ".rspec",
21
22
  ".rvmrc",
22
23
  "Gemfile",
23
24
  "Gemfile.lock",
@@ -27,47 +28,47 @@ Gem::Specification.new do |s|
27
28
  "VERSION",
28
29
  "fluidinfo.gemspec",
29
30
  "lib/fluidinfo.rb",
30
- "test/helper.rb",
31
- "test/test_fluidinfo.rb"
31
+ "lib/fluidinfo/client.rb",
32
+ "lib/fluidinfo/response.rb",
33
+ "spec/fluidinfo_spec.rb"
32
34
  ]
33
- s.homepage = %q{http://github.com/gridaphobe/fluidinfo.rb}
35
+ s.homepage = "http://github.com/gridaphobe/fluidinfo.rb"
34
36
  s.licenses = ["MIT"]
35
37
  s.require_paths = ["lib"]
36
- s.rubygems_version = %q{1.6.2}
37
- s.summary = %q{Provides a simple interface to fluidinfo}
38
- s.test_files = [
39
- "test/helper.rb",
40
- "test/test_fluidinfo.rb"
41
- ]
38
+ s.rubygems_version = "1.8.10"
39
+ s.summary = "Provides a simple interface to fluidinfo"
42
40
 
43
41
  if s.respond_to? :specification_version then
44
42
  s.specification_version = 3
45
43
 
46
44
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
47
- s.add_runtime_dependency(%q<rest-client>, [">= 1.6.1"])
48
- s.add_runtime_dependency(%q<yajl-ruby>, [">= 0.8.2"])
49
- s.add_development_dependency(%q<shoulda>, [">= 0"])
45
+ s.add_runtime_dependency(%q<rest-client>, ["~> 1.6.7"])
46
+ s.add_runtime_dependency(%q<yajl-ruby>, ["~> 1.0.0"])
47
+ s.add_development_dependency(%q<rake>, ["~> 0.9.2"])
48
+ s.add_development_dependency(%q<rspec>, ["~> 2.6.0"])
50
49
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
51
- s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
52
- s.add_development_dependency(%q<rcov>, [">= 0"])
53
- s.add_development_dependency(%q<uuidtools>, [">= 2.1.2"])
50
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
51
+ s.add_development_dependency(%q<uuidtools>, ["~> 2.1.2"])
52
+ s.add_development_dependency(%q<yard>, ["~> 0.7.2"])
54
53
  else
55
- s.add_dependency(%q<rest-client>, [">= 1.6.1"])
56
- s.add_dependency(%q<yajl-ruby>, [">= 0.8.2"])
57
- s.add_dependency(%q<shoulda>, [">= 0"])
54
+ s.add_dependency(%q<rest-client>, ["~> 1.6.7"])
55
+ s.add_dependency(%q<yajl-ruby>, ["~> 1.0.0"])
56
+ s.add_dependency(%q<rake>, ["~> 0.9.2"])
57
+ s.add_dependency(%q<rspec>, ["~> 2.6.0"])
58
58
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
59
- s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
60
- s.add_dependency(%q<rcov>, [">= 0"])
61
- s.add_dependency(%q<uuidtools>, [">= 2.1.2"])
59
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
60
+ s.add_dependency(%q<uuidtools>, ["~> 2.1.2"])
61
+ s.add_dependency(%q<yard>, ["~> 0.7.2"])
62
62
  end
63
63
  else
64
- s.add_dependency(%q<rest-client>, [">= 1.6.1"])
65
- s.add_dependency(%q<yajl-ruby>, [">= 0.8.2"])
66
- s.add_dependency(%q<shoulda>, [">= 0"])
64
+ s.add_dependency(%q<rest-client>, ["~> 1.6.7"])
65
+ s.add_dependency(%q<yajl-ruby>, ["~> 1.0.0"])
66
+ s.add_dependency(%q<rake>, ["~> 0.9.2"])
67
+ s.add_dependency(%q<rspec>, ["~> 2.6.0"])
67
68
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
68
- s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
69
- s.add_dependency(%q<rcov>, [">= 0"])
70
- s.add_dependency(%q<uuidtools>, [">= 2.1.2"])
69
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
70
+ s.add_dependency(%q<uuidtools>, ["~> 2.1.2"])
71
+ s.add_dependency(%q<yard>, ["~> 0.7.2"])
71
72
  end
72
73
  end
73
74
 
@@ -0,0 +1,182 @@
1
+ require "rest-client"
2
+ require "cgi"
3
+ require "yajl"
4
+ require "base64"
5
+ require "set"
6
+
7
+ module Fluidinfo
8
+ ITERABLE_TYPES = Set.new [Array]
9
+ SERIALIZEABLE_TYPES = Set.new [NilClass, String, Fixnum, Float, Symbol,
10
+ TrueClass, FalseClass, Array]
11
+ JSON_TYPES = Set.new ["application/json",
12
+ "application/vnd.fluiddb.value+json"]
13
+
14
+ class Client
15
+ # The main fluidinfo instance.
16
+ MAIN = 'https://fluiddb.fluidinfo.com'
17
+ # The sandbox instance, test your code here.
18
+ SANDBOX = 'https://sandbox.fluidinfo.com'
19
+
20
+ def initialize(instance=:main)
21
+ if instance == :sandbox
22
+ @instance = SANDBOX
23
+ else
24
+ @instance = MAIN
25
+ end
26
+ @headers = {
27
+ :accept => "*/*",
28
+ :user_agent => "fluidinfo.rb/#{Fluidinfo.version}"
29
+ }
30
+ end
31
+
32
+ def login(user, pass)
33
+ @headers[:authorization] = "Basic " +
34
+ (Base64.encode64 "#{user}:#{pass}").strip
35
+ end
36
+
37
+ def logout
38
+ @headers.delete :authorization
39
+ end
40
+
41
+ ##
42
+ # Call GET on one of the APIs
43
+ #
44
+ # +options+ contains URI arguments that will be appended to +path+
45
+ # consult the {Fluidinfo API documentation}[api.fluidinfo.com] for a list of
46
+ # appropriate options
47
+ def get(path, options={})
48
+ url = build_url path, options
49
+ Response.new(RestClient.get url, @headers)
50
+ end
51
+
52
+ ##
53
+ # Call HEAD on the /about or /object API to test for the existence
54
+ # of a tag
55
+ def head(path)
56
+ path = @instance + path
57
+ Response.new(RestClient.head path, @headers)
58
+ end
59
+
60
+ ##
61
+ # Call POST on one of the APIs
62
+ #
63
+ # +options[:body]+ contains the request payload. For some API
64
+ # calls this may be empty.
65
+ def post(path, options={})
66
+ path = @instance + path
67
+ if options[:body]
68
+ payload = build_payload options
69
+ headers = @headers.merge :content_type => payload[:mime]
70
+ Response.new(RestClient.post path, payload[:body], headers)
71
+ else
72
+ Response.new(RestClient.post path, nil, @headers)
73
+ end
74
+ end
75
+
76
+ ##
77
+ # Call PUT on one of the APIs
78
+ #
79
+ # +options[:body]+ contains the request payload.
80
+ #
81
+ # +options[:mime]+ contains the MIME-type unless the payload is
82
+ # JSON-encodable
83
+ def put(path, options={})
84
+ url = build_url path, options
85
+ payload = build_payload options
86
+ headers = @headers.merge(:content_type => payload[:mime],
87
+ :content_length => payload[:size])
88
+ Response.new(RestClient.put url, payload[:body], headers)
89
+ end
90
+
91
+ ##
92
+ # Call DELETE on one of the APIs
93
+ #
94
+ # +options+ contains URI arguments that will be appended to +path+
95
+ # consult the {Fluidinfo API documentation}[api.fluidinfo.com] for a list
96
+ # of appropriate options
97
+ def delete(path, options={})
98
+ url = build_url path, options
99
+ # nothing returned in response body for DELETE
100
+ Response.new(RestClient.delete url, @headers)
101
+ end
102
+
103
+ private
104
+ ##
105
+ # Build a url from the given path and url args
106
+ def build_url(path, options={})
107
+ opts = options.reject do |key, val|
108
+ [:body, :mime].include? key
109
+ end
110
+ args = opts.inject([]) do |arr, (key, val)|
111
+ if key == :tags
112
+ # dealing with tag list
113
+ val.each do |tag|
114
+ arr << "tag=#{tag}"
115
+ end
116
+ else
117
+ arr << "#{key}=#{CGI.escape val.to_s}"
118
+ end
119
+ arr
120
+ end.join('&')
121
+ # fix for /about API
122
+ if path.start_with? '/about/'
123
+ path = path.split("/").map{|x| CGI.escape x}.join("/")
124
+ end
125
+ if args != ''
126
+ "#{@instance}#{path}?#{args}"
127
+ else
128
+ "#{@instance}#{path}"
129
+ end
130
+ end
131
+
132
+ ##
133
+ # Build the payload from the options hash
134
+ def build_payload(options)
135
+ payload = options.reject {|k,v| !([:body, :mime].include? k)}
136
+ if payload[:mime]
137
+ # user set mime-type, let them deal with it :)
138
+ # fix for ruby 1.8
139
+ if payload[:body].is_a? File
140
+ payload[:size] = payload[:body].path.size
141
+ else
142
+ payload[:size] = payload[:body].size
143
+ end
144
+ elsif payload[:body].is_a? Hash
145
+ payload[:body] = Yajl.dump payload[:body]
146
+ payload[:mime] = "application/json"
147
+ elsif SERIALIZEABLE_TYPES.include? payload[:body].class
148
+ if ITERABLE_TYPES.include? payload[:body].class
149
+ if is_set_of_strings? payload[:body]
150
+ # set of strings is primitive
151
+ payload[:mime] = "application/vnd.fluiddb.value+json"
152
+ else
153
+ # we have an Array with some non-String items
154
+ payload[:mime] = "application/json"
155
+ end
156
+ else
157
+ # primitive type
158
+ payload[:mime] = "application/vnd.fluiddb.value+json"
159
+ end
160
+ payload[:body] = Yajl.dump payload[:body]
161
+ else
162
+ raise TypeError, "You must supply the mime-type"
163
+ end
164
+ payload
165
+ end
166
+
167
+ ##
168
+ # Check if payload is a "set of strings"
169
+ def is_set_of_strings?(list)
170
+ # are all elements unique strings?
171
+ list.all? { |x| x.is_a? String } && list == list.uniq
172
+ end
173
+ end
174
+
175
+ def self.version
176
+ # This was borrowed from the rest-client gem :)
177
+ version_path = File.dirname(__FILE__) + "/../../VERSION"
178
+ return File.read(version_path).chomp if File.file?(version_path)
179
+ "0.0.0"
180
+ end
181
+
182
+ end
@@ -0,0 +1,24 @@
1
+ require "yajl"
2
+
3
+ module Fluidinfo
4
+ class Response
5
+ attr_reader :status, :headers, :content, :value, :response
6
+
7
+ def initialize(response)
8
+ @response = response
9
+ @status = response.code
10
+ @headers = response.headers
11
+ @content = response.body
12
+ @value = if JSON_TYPES.include? @headers[:content_type]
13
+ Yajl.load @content
14
+ else
15
+ @content
16
+ end
17
+ end
18
+
19
+ def [](key)
20
+ @value[key]
21
+ end
22
+
23
+ end
24
+ end
data/lib/fluidinfo.rb CHANGED
@@ -1,189 +1,2 @@
1
- require "rest-client"
2
- require "uri"
3
- require "cgi"
4
- require "yajl/json_gem"
5
- require "base64"
6
- require "set"
7
-
8
- module Fluidinfo
9
- ITERABLE_TYPES = Set.new [Array]
10
- SERIALIZEABLE_TYPES = Set.new [NilClass, String, Fixnum, Float, Symbol,
11
- TrueClass, FalseClass, Array]
12
- JSON_TYPES = Set.new ["application/json",
13
- "application/vnd.fluiddb.value+json"]
14
-
15
- class Client
16
- # The main fluidinfo instance.
17
- MAIN = 'https://fluiddb.fluidinfo.com'
18
- # The sandbox instance, test your code here.
19
- SANDBOX = 'https://sandbox.fluidinfo.com'
20
-
21
- def initialize(instance=:main)
22
- if instance == :sandbox
23
- @instance = SANDBOX
24
- else
25
- @instance = MAIN
26
- end
27
- @headers = {
28
- :accept => "*/*",
29
- :user_agent => "fluidinfo.rb/#{Fluidinfo.version}"
30
- }
31
- end
32
-
33
- def login(user, pass)
34
- @headers[:authorization] = "Basic " +
35
- (Base64.encode64 "#{user}:#{pass}").strip
36
- end
37
-
38
- def logout
39
- @headers.delete :authorization
40
- end
41
-
42
- ##
43
- # Call GET on one of the APIs
44
- #
45
- # +options+ contains URI arguments that will be appended to +path+
46
- # consult the {Fluidinfo API documentation}[api.fluidinfo.com] for a list of
47
- # appropriate options
48
- def get(path, options={})
49
- url = build_url path, options
50
- response = RestClient.get url, @headers
51
- if JSON_TYPES.include? response.headers[:content_type]
52
- JSON.parse response
53
- else
54
- response
55
- end
56
- end
57
-
58
- ##
59
- # Call HEAD on the /about or /object API to test for the existence
60
- # of a tag
61
- def head(path)
62
- path = @instance + path
63
- RestClient.head path, @headers
64
- end
65
-
66
- ##
67
- # Call POST on one of the APIs
68
- #
69
- # +options[:body]+ contains the request payload. For some API
70
- # calls this may be empty.
71
- def post(path, options={})
72
- path = @instance + path
73
- if options[:body]
74
- payload = build_payload options
75
- headers = @headers.merge :content_type => payload[:mime]
76
- JSON.parse(RestClient.post path, payload[:body], headers)
77
- else
78
- JSON.parse(RestClient.post path, nil, @headers)
79
- end
80
- end
81
-
82
- ##
83
- # Call PUT on one of the APIs
84
- #
85
- # +options[:body]+ contains the request payload.
86
- #
87
- # +options[:mime]+ contains the MIME-type unless the payload is
88
- # JSON-encodable
89
- def put(path, options={})
90
- url = build_url path, options
91
- payload = build_payload options
92
- headers = @headers.merge(:content_type => payload[:mime],
93
- :content_length => payload[:size])
94
- RestClient.put url, payload[:body], headers
95
- end
96
-
97
- ##
98
- # Call DELETE on one of the APIs
99
- #
100
- # +options+ contains URI arguments that will be appended to +path+
101
- # consult the {Fluidinfo API documentation}[api.fluidinfo.com] for a list
102
- # of appropriate options
103
- def delete(path, options={})
104
- url = build_url path, options
105
- # nothing returned in response body for DELETE
106
- RestClient.delete url, @headers
107
- end
108
-
109
- private
110
- ##
111
- # Build a url from the given path and url args
112
- def build_url(path, options={})
113
- opts = options.reject do |key, val|
114
- [:body, :mime].include? key
115
- end
116
- args = opts.inject([]) do |arr, (key, val)|
117
- if key == :tags
118
- # dealing with tag list
119
- val.each do |tag|
120
- arr << "tag=#{tag}"
121
- end
122
- else
123
- arr << "#{key}=#{CGI.escape val.to_s}"
124
- end
125
- arr
126
- end.join('&')
127
- # fix for /about API
128
- if path.start_with? '/about/'
129
- about = path[7..-1]
130
- path = "/about/#{CGI.escape about}"
131
- end
132
- if args != ''
133
- "#{@instance}#{path}?#{args}"
134
- else
135
- "#{@instance}#{path}"
136
- end
137
- end
138
-
139
- ##
140
- # Build the payload from the options hash
141
- def build_payload(options)
142
- payload = options.reject {|k,v| !([:body, :mime].include? k)}
143
- if payload[:mime]
144
- # user set mime-type, let them deal with it :)
145
- # fix for ruby 1.8
146
- if payload[:body].is_a? File
147
- payload[:size] = payload[:body].path.size
148
- else
149
- payload[:size] = payload[:body].size
150
- end
151
- elsif payload[:body].is_a? Hash
152
- payload[:body] = JSON.dump payload[:body]
153
- payload[:mime] = "application/json"
154
- elsif SERIALIZEABLE_TYPES.include? payload[:body].class
155
- if ITERABLE_TYPES.include? payload[:body].class
156
- if is_set_of_strings? payload[:body]
157
- # set of strings is primitive
158
- payload[:mime] = "application/vnd.fluiddb.value+json"
159
- else
160
- # we have an Array with some non-String items
161
- payload[:mime] = "application/json"
162
- end
163
- else
164
- # primitive type
165
- payload[:mime] = "application/vnd.fluiddb.value+json"
166
- end
167
- payload[:body] = JSON.dump payload[:body]
168
- else
169
- raise TypeError, "You must supply the mime-type"
170
- end
171
- payload
172
- end
173
-
174
- ##
175
- # Check if payload is a "set of strings"
176
- def is_set_of_strings?(list)
177
- # are all elements unique strings?
178
- list.all? { |x| x.is_a? String } && list == list.uniq
179
- end
180
- end
181
-
182
- def self.version
183
- # This was borrowed from the rest-client gem :)
184
- version_path = File.dirname(__FILE__) + "/../VERSION"
185
- return File.read(version_path).chomp if File.file?(version_path)
186
- "0.0.0"
187
- end
188
-
189
- end
1
+ require File.join(File.dirname(__FILE__), "/fluidinfo/client")
2
+ require File.join(File.dirname(__FILE__), "/fluidinfo/response")
@@ -1,64 +1,69 @@
1
- require 'helper'
1
+ require 'fluidinfo'
2
2
  require 'uuidtools'
3
3
 
4
- class FluidinfoTest < Test::Unit::TestCase
5
- context "GET" do
6
- setup do
4
+ describe Fluidinfo do
5
+ describe "GET" do
6
+ before(:each) do
7
7
  @fluid = Fluidinfo::Client.new
8
8
  end
9
9
 
10
- context "/objects" do
11
- should "retrieve tags correctly" do
10
+ it "should return a Fluidinfo::Response" do
11
+ r = @fluid.get("/about/fluidinfo")
12
+ r.should be_a(Fluidinfo::Response)
13
+ r.should respond_to(:status, :content, :headers, :value, :response)
14
+ end
15
+
16
+ describe "/objects" do
17
+ it "should retrieve tags correctly" do
12
18
  uid = "e034d8c0-a2e4-4094-895b-3a8065f9696e"
13
- tag = "gridaphobe/given-name"
14
- assert_equal "Eric", @fluid.get("/objects/#{uid}/#{tag}")
19
+ tag = "fluiddb/users/username"
20
+ @fluid.get("/objects/#{uid}/#{tag}").value.should eq("gridaphobe")
15
21
  end
16
22
 
17
- should "process queries correctly" do
23
+ it "should process queries correctly" do
18
24
  query = 'fluiddb/users/username = "gridaphobe"'
19
25
  expected = {
20
26
  "ids" => ["e034d8c0-a2e4-4094-895b-3a8065f9696e"]
21
27
  }
22
- assert_equal expected, @fluid.get("/objects", :query => query)
28
+ @fluid.get("/objects", :query => query).value.should eq(expected)
23
29
  end
24
30
 
25
- should "retrieve objects with about tag" do
31
+ it "should retrieve objects with about tag" do
26
32
  uid = "206b5ca5-cd69-469a-9aba-44b28cfb455e"
27
33
  expected = {
28
34
  "about"=>nil,
29
35
  "tagPaths"=>["gridaphobe/test/test_tag"]
30
36
  }
31
- assert_equal expected, @fluid.get("/objects/#{uid}", :showAbout => true)
37
+ @fluid.get("/objects/#{uid}",
38
+ :showAbout => true).value.should eq(expected)
32
39
  end
33
-
34
- should "retrieve objects without about tag" do
40
+
41
+ it "should retrieve objects without about tag" do
35
42
  uid = "206b5ca5-cd69-469a-9aba-44b28cfb455e"
36
43
  expected = {
37
44
  "tagPaths"=>["gridaphobe/test/test_tag"]
38
45
  }
39
- assert_equal expected, @fluid.get("/objects/#{uid}")
46
+ @fluid.get("/objects/#{uid}").value.should eq(expected)
40
47
  end
41
-
42
- should "raise 404 errors on bad request" do
48
+
49
+ it "should raise 404 errors on bad request" do
43
50
  uid = "1"
44
51
  tag = "gridaphobe/given-name"
45
- assert_raise RestClient::ResourceNotFound do
46
- @fluid.get "/objects/#{uid}/#{tag}"
47
- end
52
+ expect{@fluid.get "/objects/#{uid}/#{tag}"}.to raise_error(RestClient::ResourceNotFound)
48
53
  end
49
54
  end
50
55
 
51
- context "/namespaces" do
52
- should "show basic information about namespaces" do
56
+ describe "/namespaces" do
57
+ it "should show basic information about namespaces" do
53
58
  user = "gridaphobe"
54
59
  ns = "test"
55
60
  expected = {
56
61
  "id" =>"9c16dcbe-87fd-4fe9-ae0e-699be84f1105"
57
62
  }
58
- assert_equal expected, @fluid.get("/namespaces/#{user}/#{ns}")
63
+ @fluid.get("/namespaces/#{user}/#{ns}").value.should eq(expected)
59
64
  end
60
65
 
61
- should "show detailed information about namespaces" do
66
+ it "should show detailed information about namespaces" do
62
67
  user = "gridaphobe"
63
68
  ns = "test"
64
69
  expected = {
@@ -67,15 +72,15 @@ class FluidinfoTest < Test::Unit::TestCase
67
72
  "id" =>"9c16dcbe-87fd-4fe9-ae0e-699be84f1105",
68
73
  "description" =>"test"
69
74
  }
70
- assert_equal expected, @fluid.get("/namespaces/#{user}/#{ns}",
71
- :returnDescription => true,
72
- :returnTags => true,
73
- :returnNamespaces => true)
75
+ @fluid.get("/namespaces/#{user}/#{ns}",
76
+ :returnDescription => true,
77
+ :returnTags => true,
78
+ :returnNamespaces => true).value.should eq(expected)
74
79
  end
75
80
  end
76
-
77
- context "/values" do
78
- should "retrieve a set of tags" do
81
+
82
+ describe "/values" do
83
+ it "should retrieve a set of tags" do
79
84
  expected = {
80
85
  "results" => {
81
86
  "id" => {
@@ -86,53 +91,67 @@ class FluidinfoTest < Test::Unit::TestCase
86
91
  }
87
92
  }
88
93
  }
89
- assert_equal expected, @fluid.get("/values",
90
- :query => 'fluiddb/users/username="gridaphobe"',
91
- :tags => ['fluiddb/users/username', 'fluiddb/about'])
94
+ @fluid.get("/values",
95
+ :query => 'fluiddb/users/username="gridaphobe"',
96
+ :tags => ['fluiddb/users/username',
97
+ 'fluiddb/about']).value.should eq(expected)
92
98
  end
93
99
  end
94
100
  end
95
101
 
96
- context "POST" do
97
- setup do
98
- @fluid = Fluidinfo::Client.new :sandbox
102
+ describe "POST" do
103
+ before(:each) do
104
+ @fluid = Fluidinfo::Client.new
99
105
  @fluid.login 'test', 'test'
100
106
  end
101
107
 
102
- context "/namespaces" do
103
- should "create new namespaces" do
108
+ it "should return a Fluidinfo::Response" do
109
+ r = @fluid.post("/objects")
110
+ r.should be_a(Fluidinfo::Response)
111
+ r.should respond_to(:status, :content, :headers, :value, :response)
112
+ end
113
+
114
+ describe "/namespaces" do
115
+ it "should create new namespaces" do
104
116
  new_ns = UUIDTools::UUID.random_create
105
117
  body = {
106
118
  'description' => 'a test namespace',
107
119
  'name' => new_ns
108
120
  }
109
121
  resp = @fluid.post "/namespaces/test", :body => body
110
- # assert_equal 201, resp.code
111
- assert_not_nil resp["id"]
112
-
122
+ resp.status.should eq(201)
123
+ resp["id"].should_not be_nil
124
+
113
125
  # now cleanup
114
126
  @fluid.delete "/namespaces/test/#{new_ns}"
115
127
  end
116
128
  end
117
129
  end
118
130
 
119
- context "PUT" do
120
- setup do
121
- @fluid = Fluidinfo::Client.new :sandbox
131
+ describe "PUT" do
132
+ before(:each) do
133
+ @fluid = Fluidinfo::Client.new
122
134
  @fluid.login 'test', 'test'
123
135
  end
124
136
 
125
- context "/tags" do
126
- should "update primitive tag values" do
137
+ it "should return a Fluidinfo::Response" do
138
+ r = @fluid.put("/about/fluidinfo/test/tag", :body => nil)
139
+ r.should be_a(Fluidinfo::Response)
140
+ r.should respond_to(:status, :content, :headers, :value, :response)
141
+ @fluid.delete("/about/fluidinfo/test/tag")
142
+ end
143
+
144
+ describe "/tags" do
145
+ it "should update primitive tag values" do
127
146
  new_ns = UUIDTools::UUID.random_create
128
147
  ns_body = {
129
148
  'description' => 'a test namespace',
130
149
  'name' => new_ns
131
150
  }
132
151
  resp = @fluid.post '/namespaces/test', :body => ns_body
133
- assert_not_nil resp["id"]
134
- ns_id = resp["id"] # for later use
152
+ resp["id"].should_not be_nil
135
153
 
154
+ ns_id = resp["id"] # for later use
136
155
  new_tag = UUIDTools::UUID.random_create
137
156
  tag_body = {
138
157
  'description' => 'a test tag',
@@ -140,34 +159,35 @@ class FluidinfoTest < Test::Unit::TestCase
140
159
  'indexed' => false
141
160
  }
142
161
  resp = @fluid.post "/tags/test/#{new_ns}", :body => tag_body
143
- assert_not_nil resp["id"]
162
+ resp["id"].should_not be_nil
163
+
144
164
  path = "/objects/#{ns_id}/test/#{new_ns}/#{new_tag}"
145
165
  # Make sure that all primitive values are properly encoded and
146
166
  # sent to Fluidinfo
147
167
  primitives = [1, 1.1, "foo", true, nil, [1, '2', 3]]
148
168
  primitives.each do |p|
149
169
  resp = @fluid.put(path, :body => p)
150
- assert_equal p, @fluid.get(path)
170
+ @fluid.get(path).value.should eq(p)
151
171
  end
152
172
 
153
173
  # now cleanup
154
174
  response = @fluid.delete "/tags/test/#{new_ns}/#{new_tag}"
155
- assert_equal 204, response.code
156
-
175
+ response.status.should eq(204)
176
+
157
177
  response = @fluid.delete "/namespaces/test/#{new_ns}"
158
- assert_equal 204, response.code
178
+ response.status.should eq(204)
159
179
  end
160
180
 
161
- should "update opaque tag values" do
181
+ it "should update opaque tag values" do
162
182
  new_ns = UUIDTools::UUID.random_create
163
183
  ns_body = {
164
184
  'description' => 'a test namespace',
165
185
  'name' => new_ns
166
186
  }
167
187
  resp = @fluid.post '/namespaces/test', :body => ns_body
168
- assert_not_nil resp["id"]
169
- ns_id = resp["id"] # for later use
188
+ resp["id"].should_not be_nil
170
189
 
190
+ ns_id = resp["id"] # for later use
171
191
  new_tag = UUIDTools::UUID.random_create
172
192
  tag_body = {
173
193
  'description' => 'a test tag',
@@ -178,24 +198,22 @@ class FluidinfoTest < Test::Unit::TestCase
178
198
  file = File.new(__FILE__).read
179
199
  path = "/objects/#{ns_id}/test/#{new_ns}/#{new_tag}"
180
200
  resp = @fluid.put path, :body => file, :mime => "text/ruby"
181
- assert_equal File.new(__FILE__).read, @fluid.get(path)
201
+ File.new(__FILE__).read.should eq(@fluid.get(path).value)
182
202
 
183
203
  # now cleanup
184
204
  @fluid.delete "/tags/test/#{new_ns}/#{new_tag}"
185
205
  @fluid.delete "/namespaces/test/#{new_ns}"
186
206
  end
187
207
 
188
- should "raise TypeError on malformed request" do
208
+ it "should raise TypeError on malformed request" do
189
209
  file = File.new(__FILE__)
190
- assert_raise TypeError do
191
- @fluid.put("/objects", :body => file)
192
- end
210
+ expect {@fluid.put "/objects", :body => file}.to raise_error(TypeError)
193
211
  end
194
212
  end
195
213
  end
196
-
197
- context "private functions" do
198
- setup do
214
+
215
+ describe "private functions" do
216
+ before(:each) do
199
217
  @fluid = Fluidinfo::Client.new
200
218
  def @fluid.test_build_payload(*args)
201
219
  build_payload(*args)
@@ -204,37 +222,40 @@ class FluidinfoTest < Test::Unit::TestCase
204
222
  build_url(*args)
205
223
  end
206
224
  end
207
-
208
- context "build_url" do
209
- should "escape &'s in query tag-values" do
225
+
226
+ describe "build_url" do
227
+ it "escapes &'s in query tag-values" do
210
228
  query = "test/tag=\"1&2\""
211
- assert_equal "https://fluiddb.fluidinfo.com/objects?query=test%2Ftag%3D%221%262%22",
212
- @fluid.test_build_url("/objects", :query => query)
229
+ expected = "https://fluiddb.fluidinfo.com/objects?query=test%2Ftag%3D%221%262%22"
230
+ @fluid.test_build_url("/objects", :query => query).should eq(expected)
231
+
213
232
  query = "oreilly.com/title=\"HTML & CSS: The Good Parts\""
214
233
  tags = ["oreilly.com/isbn"]
215
- assert_equal "https://fluiddb.fluidinfo.com/values?query=oreilly.com%2Ftitle%3D%22HTML+%26+CSS%3A+The+Good+Parts%22&tag=oreilly.com/isbn",
216
- @fluid.test_build_url("/values", :query => query, :tags => tags)
234
+ expected = "https://fluiddb.fluidinfo.com/values?query=oreilly.com%2Ftitle%3D%22HTML+%26+CSS%3A+The+Good+Parts%22&tag=oreilly.com/isbn"
235
+ @fluid.test_build_url("/values",
236
+ :query => query,
237
+ :tags => tags).should eq(expected)
217
238
  end
218
239
 
219
- should "escape &'s in about-values" do
240
+ it "escapes &'s in about-values" do
220
241
  about = "tom & jerry"
221
- assert_equal "https://fluiddb.fluidinfo.com/about/tom+%26+jerry",
222
- @fluid.test_build_url('/about/tom & jerry')
242
+ expected = "https://fluiddb.fluidinfo.com/about/tom+%26+jerry"
243
+ @fluid.test_build_url('/about/tom & jerry').should eq(expected)
223
244
  end
224
245
  end
225
246
 
226
- context "build_payload" do
227
- should "set proper mime-types" do
247
+ describe "build_payload" do
248
+ it "sets proper mime-types" do
228
249
  primitives = [1, 1.1, true, false, nil, ["1", "2", "hi"]]
229
250
  primitives.each do |p|
230
251
  h = @fluid.test_build_payload :body => p
231
- assert_equal "application/vnd.fluiddb.value+json", h[:mime]
252
+ h[:mime].should eq("application/vnd.fluiddb.value+json")
232
253
  end
233
-
254
+
234
255
  non_primitives = [[1, 2, 3], {"hi" => "there"}]
235
256
  non_primitives.each do |n|
236
257
  h = @fluid.test_build_payload :body => n
237
- assert_equal "application/json", h[:mime]
258
+ h[:mime].should eq("application/json")
238
259
  end
239
260
  end
240
261
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluidinfo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,45 +9,55 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-06-09 00:00:00.000000000 -04:00
13
- default_executable:
12
+ date: 2011-09-17 00:00:00.000000000Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: rest-client
17
- requirement: &14319540 !ruby/object:Gem::Requirement
16
+ requirement: &70220778276580 !ruby/object:Gem::Requirement
18
17
  none: false
19
18
  requirements:
20
- - - ! '>='
19
+ - - ~>
21
20
  - !ruby/object:Gem::Version
22
- version: 1.6.1
21
+ version: 1.6.7
23
22
  type: :runtime
24
23
  prerelease: false
25
- version_requirements: *14319540
24
+ version_requirements: *70220778276580
26
25
  - !ruby/object:Gem::Dependency
27
26
  name: yajl-ruby
28
- requirement: &14318660 !ruby/object:Gem::Requirement
27
+ requirement: &70220778275920 !ruby/object:Gem::Requirement
29
28
  none: false
30
29
  requirements:
31
- - - ! '>='
30
+ - - ~>
32
31
  - !ruby/object:Gem::Version
33
- version: 0.8.2
32
+ version: 1.0.0
34
33
  type: :runtime
35
34
  prerelease: false
36
- version_requirements: *14318660
35
+ version_requirements: *70220778275920
37
36
  - !ruby/object:Gem::Dependency
38
- name: shoulda
39
- requirement: &14317480 !ruby/object:Gem::Requirement
37
+ name: rake
38
+ requirement: &70220778275320 !ruby/object:Gem::Requirement
40
39
  none: false
41
40
  requirements:
42
- - - ! '>='
41
+ - - ~>
43
42
  - !ruby/object:Gem::Version
44
- version: '0'
43
+ version: 0.9.2
45
44
  type: :development
46
45
  prerelease: false
47
- version_requirements: *14317480
46
+ version_requirements: *70220778275320
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: &70220778274720 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 2.6.0
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70220778274720
48
58
  - !ruby/object:Gem::Dependency
49
59
  name: bundler
50
- requirement: &14316120 !ruby/object:Gem::Requirement
60
+ requirement: &70220778274120 !ruby/object:Gem::Requirement
51
61
  none: false
52
62
  requirements:
53
63
  - - ~>
@@ -55,40 +65,40 @@ dependencies:
55
65
  version: 1.0.0
56
66
  type: :development
57
67
  prerelease: false
58
- version_requirements: *14316120
68
+ version_requirements: *70220778274120
59
69
  - !ruby/object:Gem::Dependency
60
70
  name: jeweler
61
- requirement: &14314720 !ruby/object:Gem::Requirement
71
+ requirement: &70220778273520 !ruby/object:Gem::Requirement
62
72
  none: false
63
73
  requirements:
64
74
  - - ~>
65
75
  - !ruby/object:Gem::Version
66
- version: 1.5.2
76
+ version: 1.6.4
67
77
  type: :development
68
78
  prerelease: false
69
- version_requirements: *14314720
79
+ version_requirements: *70220778273520
70
80
  - !ruby/object:Gem::Dependency
71
- name: rcov
72
- requirement: &14313480 !ruby/object:Gem::Requirement
81
+ name: uuidtools
82
+ requirement: &70220778272920 !ruby/object:Gem::Requirement
73
83
  none: false
74
84
  requirements:
75
- - - ! '>='
85
+ - - ~>
76
86
  - !ruby/object:Gem::Version
77
- version: '0'
87
+ version: 2.1.2
78
88
  type: :development
79
89
  prerelease: false
80
- version_requirements: *14313480
90
+ version_requirements: *70220778272920
81
91
  - !ruby/object:Gem::Dependency
82
- name: uuidtools
83
- requirement: &14304960 !ruby/object:Gem::Requirement
92
+ name: yard
93
+ requirement: &70220778272320 !ruby/object:Gem::Requirement
84
94
  none: false
85
95
  requirements:
86
- - - ! '>='
96
+ - - ~>
87
97
  - !ruby/object:Gem::Version
88
- version: 2.1.2
98
+ version: 0.7.2
89
99
  type: :development
90
100
  prerelease: false
91
- version_requirements: *14304960
101
+ version_requirements: *70220778272320
92
102
  description: This gem provides a simple interface to fluidinfo, built on top of the
93
103
  rest-client gem.
94
104
  email: gridaphobe@gmail.com
@@ -99,6 +109,7 @@ extra_rdoc_files:
99
109
  - README.rdoc
100
110
  files:
101
111
  - .document
112
+ - .rspec
102
113
  - .rvmrc
103
114
  - Gemfile
104
115
  - Gemfile.lock
@@ -108,9 +119,9 @@ files:
108
119
  - VERSION
109
120
  - fluidinfo.gemspec
110
121
  - lib/fluidinfo.rb
111
- - test/helper.rb
112
- - test/test_fluidinfo.rb
113
- has_rdoc: true
122
+ - lib/fluidinfo/client.rb
123
+ - lib/fluidinfo/response.rb
124
+ - spec/fluidinfo_spec.rb
114
125
  homepage: http://github.com/gridaphobe/fluidinfo.rb
115
126
  licenses:
116
127
  - MIT
@@ -126,7 +137,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
126
137
  version: '0'
127
138
  segments:
128
139
  - 0
129
- hash: -424493676000588461
140
+ hash: 3187277794314220845
130
141
  required_rubygems_version: !ruby/object:Gem::Requirement
131
142
  none: false
132
143
  requirements:
@@ -135,10 +146,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
146
  version: '0'
136
147
  requirements: []
137
148
  rubyforge_project:
138
- rubygems_version: 1.6.2
149
+ rubygems_version: 1.8.10
139
150
  signing_key:
140
151
  specification_version: 3
141
152
  summary: Provides a simple interface to fluidinfo
142
- test_files:
143
- - test/helper.rb
144
- - test/test_fluidinfo.rb
153
+ test_files: []
data/test/helper.rb DELETED
@@ -1,18 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- begin
4
- Bundler.setup(:default, :development)
5
- rescue Bundler::BundlerError => e
6
- $stderr.puts e.message
7
- $stderr.puts "Run `bundle install` to install missing gems"
8
- exit e.status_code
9
- end
10
- require 'test/unit'
11
- require 'shoulda'
12
-
13
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
- $LOAD_PATH.unshift(File.dirname(__FILE__))
15
- require 'fluidinfo'
16
-
17
- class Test::Unit::TestCase
18
- end