fluidinfo 0.2.1 → 0.2.2

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
@@ -2,8 +2,9 @@ source "http://rubygems.org"
2
2
  # Add dependencies required to use your gem here.
3
3
  # Example:
4
4
  # gem "activesupport", ">= 2.3.5"
5
- gem "rest-client"
6
- gem "json"
5
+ gem "rest-client", ">= 1.6.1"
6
+ gem "json", ">= 1.5.1"
7
+ gem "crack"
7
8
 
8
9
  # Add dependencies to develop your gem here.
9
10
  # Include everything needed to run rake, tests, features, etc.
@@ -12,4 +13,5 @@ group :development do
12
13
  gem "bundler", "~> 1.0.0"
13
14
  gem "jeweler", "~> 1.5.2"
14
15
  gem "rcov", ">= 0"
16
+ gem "uuidtools", ">= 2.1.2"
15
17
  end
data/Gemfile.lock CHANGED
@@ -1,6 +1,7 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
+ crack (0.1.8)
4
5
  git (1.2.5)
5
6
  jeweler (1.5.2)
6
7
  bundler (~> 1.0.0)
@@ -13,14 +14,17 @@ GEM
13
14
  rest-client (1.6.1)
14
15
  mime-types (>= 1.16)
15
16
  shoulda (2.11.3)
17
+ uuidtools (2.1.2)
16
18
 
17
19
  PLATFORMS
18
20
  ruby
19
21
 
20
22
  DEPENDENCIES
21
23
  bundler (~> 1.0.0)
24
+ crack
22
25
  jeweler (~> 1.5.2)
23
- json
26
+ json (>= 1.5.1)
24
27
  rcov
25
- rest-client
28
+ rest-client (>= 1.6.1)
26
29
  shoulda
30
+ uuidtools (>= 2.1.2)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.2.2
data/fluidinfo.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{fluidinfo}
8
- s.version = "0.2.1"
8
+ s.version = "0.2.2"
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"]
@@ -43,27 +43,33 @@ Gem::Specification.new do |s|
43
43
  s.specification_version = 3
44
44
 
45
45
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
46
- s.add_runtime_dependency(%q<rest-client>, [">= 0"])
47
- s.add_runtime_dependency(%q<json>, [">= 0"])
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"])
48
49
  s.add_development_dependency(%q<shoulda>, [">= 0"])
49
50
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
50
51
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
51
52
  s.add_development_dependency(%q<rcov>, [">= 0"])
53
+ s.add_development_dependency(%q<uuidtools>, [">= 2.1.2"])
52
54
  else
53
- s.add_dependency(%q<rest-client>, [">= 0"])
54
- s.add_dependency(%q<json>, [">= 0"])
55
+ 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
58
  s.add_dependency(%q<shoulda>, [">= 0"])
56
59
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
57
60
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
58
61
  s.add_dependency(%q<rcov>, [">= 0"])
62
+ s.add_dependency(%q<uuidtools>, [">= 2.1.2"])
59
63
  end
60
64
  else
61
- s.add_dependency(%q<rest-client>, [">= 0"])
62
- s.add_dependency(%q<json>, [">= 0"])
65
+ 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"])
63
68
  s.add_dependency(%q<shoulda>, [">= 0"])
64
69
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
65
70
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
66
71
  s.add_dependency(%q<rcov>, [">= 0"])
72
+ s.add_dependency(%q<uuidtools>, [">= 2.1.2"])
67
73
  end
68
74
  end
69
75
 
data/lib/fluidinfo.rb CHANGED
@@ -2,6 +2,7 @@ require "rest-client"
2
2
  require "uri"
3
3
  require "json"
4
4
  require "base64"
5
+ require "crack/json"
5
6
 
6
7
  module Fluidinfo
7
8
  class Client
@@ -10,27 +11,32 @@ module Fluidinfo
10
11
  # The sandbox instance, test your code here.
11
12
  @@SANDBOX = 'https://sandbox.fluidinfo.com'
12
13
 
13
- def initialize(options={})
14
- if options[:sandbox]
14
+ def initialize(instance=:main)
15
+ if instance == :sandbox
15
16
  @instance = @@SANDBOX
16
17
  else
17
18
  @instance = @@MAIN
18
19
  end
19
20
  @headers = {
20
- "Accept" => "*/*"
21
+ :accept => "*/*"
21
22
  }
22
23
  end
23
24
 
24
25
  def login(user, pass)
25
26
  auth = "Basic " + (Base64.encode64 "#{user}:#{pass}").strip
26
- @headers["Authorization"] = auth
27
+ @headers[:authorization] = auth
27
28
  end
28
29
 
29
30
  def logout
30
- @headers.delete "Authorization"
31
+ @headers.delete :authorization
31
32
  end
32
33
 
33
- # Call GET
34
+ ##
35
+ # Call GET on one of the APIs
36
+ #
37
+ # +options+ contains URI arguments that will be appended to +path+
38
+ # consult the {Fluidinfo API documentation}[api.fluidinfo.com] for a list of
39
+ # appropriate options
34
40
  def get(path, options={})
35
41
  path = @instance + path
36
42
  args = ''
@@ -50,36 +56,42 @@ module Fluidinfo
50
56
  JSON.load response.to_str
51
57
  rescue JSON::ParserError
52
58
  # this should mean that fluidinfo returned a non-hash/array primitive
53
- eval response.to_str
59
+ Crack::JSON.parse response.to_str
54
60
  end
55
61
  end
56
62
 
63
+ ##
64
+ # Call HEAD on the /about or /object API to test for the existence
65
+ # of a tag
57
66
  def head(path)
58
67
  path = @instance + path
59
68
  RestClient.head path
60
69
  end
61
-
70
+
71
+ ##
72
+ # Call POST on one of the APIs
73
+ #
74
+ # +options[:body]+ contains the request payload. For some API
75
+ # calls this may be empty.
62
76
  def post(path, options={})
63
77
  path = @instance + path
64
78
  if options[:body]
65
- if options[:mime]
66
- mime = options[:mime]
67
- body = options[:body]
68
- else
69
- mime = "application/json"
70
- begin
71
- body = JSON.dump options[:body]
72
- rescue JSON::GeneratorError
73
- body = options[:body]
74
- end
75
- end
79
+ body = options[:body]
80
+ mime = "application/json"
81
+ body = JSON.dump options[:body]
76
82
  headers = @headers.merge :content_type => mime
77
83
  JSON.parse(RestClient.post path, body, headers)
78
84
  else
79
85
  JSON.parse(RestClient.post path, nil)
80
86
  end
81
87
  end
82
-
88
+
89
+ ##
90
+ # Call PUT on one of the APIs
91
+ #
92
+ # +options[:body]+ contains the request payload.
93
+ #
94
+ # +options[:mime]+ contains the MIME-type unless the payload is JSON-encodable
83
95
  def put(path, options={})
84
96
  path = @instance + path
85
97
  if options[:query]
@@ -94,14 +106,24 @@ module Fluidinfo
94
106
  begin
95
107
  body = JSON.dump options[:body]
96
108
  rescue JSON::GeneratorError
97
- body = options[:body]
109
+ if options[:body] == nil
110
+ body = "null"
111
+ else
112
+ body = options[:body].to_s
113
+ end
98
114
  end
99
115
  end
100
116
  # nothing returned in response body for PUT
101
117
  headers = @headers.merge :content_type => mime
102
118
  RestClient.put path, body, headers
103
119
  end
104
-
120
+
121
+ ##
122
+ # Call DELETE on one of the APIs
123
+ #
124
+ # +options+ contains URI arguments that will be appended to +path+
125
+ # consult the {Fluidinfo API documentation}[api.fluidinfo.com] for a list of
126
+ # appropriate options
105
127
  def delete(path, options={})
106
128
  path = @instance + path
107
129
  if options[:query]
@@ -115,7 +137,7 @@ module Fluidinfo
115
137
  end
116
138
  end
117
139
  # nothing returned in response body for DELETE
118
- RestClient.delete path
140
+ RestClient.delete path, @headers
119
141
  end
120
142
  end
121
143
  end
@@ -1,4 +1,5 @@
1
1
  require 'helper'
2
+ require 'uuidtools'
2
3
 
3
4
  class FluidinfoTest < Test::Unit::TestCase
4
5
  context "GET" do
@@ -73,4 +74,68 @@ class FluidinfoTest < Test::Unit::TestCase
73
74
  end
74
75
  end
75
76
  end
77
+
78
+ context "POST" do
79
+ setup do
80
+ @fluid = Fluidinfo::Client.new :sandbox
81
+ @fluid.login 'test', 'test'
82
+ end
83
+
84
+ context "/namespaces" do
85
+ should "create new namespaces" do
86
+ new_ns = UUIDTools::UUID.random_create
87
+ body = {
88
+ 'description' => 'a test namespace',
89
+ 'name' => new_ns
90
+ }
91
+ resp = @fluid.post "/namespaces/test", :body => body
92
+ # assert_equal 201, resp.code
93
+ assert_not_nil resp["id"]
94
+
95
+ # now cleanup
96
+ @fluid.delete "/namespaces/test/#{new_ns}"
97
+ end
98
+ end
99
+ end
100
+
101
+ context "PUT" do
102
+ setup do
103
+ @fluid = Fluidinfo::Client.new :sandbox
104
+ @fluid.login 'test', 'test'
105
+ end
106
+
107
+ context "/tags" do
108
+ should "update tag values" do
109
+ new_ns = UUIDTools::UUID.random_create
110
+ ns_body = {
111
+ 'description' => 'a test namespace',
112
+ 'name' => new_ns
113
+ }
114
+ resp = @fluid.post '/namespaces/test', :body => ns_body
115
+ assert_not_nil resp["id"]
116
+ ns_id = resp["id"] # for later use
117
+
118
+ new_tag = UUIDTools::UUID.random_create
119
+ tag_body = {
120
+ 'description' => 'a test tag',
121
+ 'name' => new_tag,
122
+ 'indexed' => false
123
+ }
124
+ resp = @fluid.post "/tags/test/#{new_ns}", :body => tag_body
125
+ assert_not_nil resp["id"]
126
+ path = "/objects/#{ns_id}/test/#{new_ns}/#{new_tag}"
127
+ # Make sure that all primitive values are properly encoded and
128
+ # sent to Fluidinfo
129
+ primitives = [1, 1.1, "foo", true, nil, [1, 2, 3]]
130
+ primitives.each do |p|
131
+ resp = @fluid.put path, :body => p
132
+ assert_equal p, @fluid.get(path)
133
+ end
134
+
135
+ # now cleanup
136
+ @fluid.delete "/tags/test/#{new_ns}/#{new_tag}"
137
+ @fluid.delete "/namespaces/test/#{new_ns}"
138
+ end
139
+ end
140
+ end
76
141
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluidinfo
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 1
10
- version: 0.2.1
9
+ - 2
10
+ version: 0.2.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Eric Seidel
@@ -24,10 +24,12 @@ dependencies:
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
- hash: 3
27
+ hash: 13
28
28
  segments:
29
- - 0
30
- version: "0"
29
+ - 1
30
+ - 6
31
+ - 1
32
+ version: 1.6.1
31
33
  name: rest-client
32
34
  version_requirements: *id001
33
35
  prerelease: false
@@ -38,10 +40,12 @@ dependencies:
38
40
  requirements:
39
41
  - - ">="
40
42
  - !ruby/object:Gem::Version
41
- hash: 3
43
+ hash: 1
42
44
  segments:
43
- - 0
44
- version: "0"
45
+ - 1
46
+ - 5
47
+ - 1
48
+ version: 1.5.1
45
49
  name: json
46
50
  version_requirements: *id002
47
51
  prerelease: false
@@ -56,12 +60,26 @@ dependencies:
56
60
  segments:
57
61
  - 0
58
62
  version: "0"
59
- name: shoulda
63
+ name: crack
60
64
  version_requirements: *id003
61
65
  prerelease: false
62
- type: :development
66
+ type: :runtime
63
67
  - !ruby/object:Gem::Dependency
64
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
+ name: shoulda
78
+ version_requirements: *id004
79
+ prerelease: false
80
+ type: :development
81
+ - !ruby/object:Gem::Dependency
82
+ requirement: &id005 !ruby/object:Gem::Requirement
65
83
  none: false
66
84
  requirements:
67
85
  - - ~>
@@ -73,11 +91,11 @@ dependencies:
73
91
  - 0
74
92
  version: 1.0.0
75
93
  name: bundler
76
- version_requirements: *id004
94
+ version_requirements: *id005
77
95
  prerelease: false
78
96
  type: :development
79
97
  - !ruby/object:Gem::Dependency
80
- requirement: &id005 !ruby/object:Gem::Requirement
98
+ requirement: &id006 !ruby/object:Gem::Requirement
81
99
  none: false
82
100
  requirements:
83
101
  - - ~>
@@ -89,11 +107,11 @@ dependencies:
89
107
  - 2
90
108
  version: 1.5.2
91
109
  name: jeweler
92
- version_requirements: *id005
110
+ version_requirements: *id006
93
111
  prerelease: false
94
112
  type: :development
95
113
  - !ruby/object:Gem::Dependency
96
- requirement: &id006 !ruby/object:Gem::Requirement
114
+ requirement: &id007 !ruby/object:Gem::Requirement
97
115
  none: false
98
116
  requirements:
99
117
  - - ">="
@@ -103,7 +121,23 @@ dependencies:
103
121
  - 0
104
122
  version: "0"
105
123
  name: rcov
106
- version_requirements: *id006
124
+ version_requirements: *id007
125
+ prerelease: false
126
+ type: :development
127
+ - !ruby/object:Gem::Dependency
128
+ requirement: &id008 !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ hash: 15
134
+ segments:
135
+ - 2
136
+ - 1
137
+ - 2
138
+ version: 2.1.2
139
+ name: uuidtools
140
+ version_requirements: *id008
107
141
  prerelease: false
108
142
  type: :development
109
143
  description: This gem provides a simple interface to fluidinfo, built on top of the rest-client gem.