fluidinfo 0.4.1 → 0.5.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/.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