grouper-rest-client 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY CHANGED
@@ -1,3 +1,8 @@
1
+ 2011-03-18 v0.1.0
2
+ - API namespace change.
3
+ - Added "#subject(subject)" WS call.
4
+ - Added "#error?" and "#ok?"
5
+
1
6
  2011-03-17 v0.0.1
2
7
  - Initial prototype release.
3
8
  - Implements "#groups(subject, [stem_filter])" WS call.
data/README.rdoc CHANGED
@@ -2,11 +2,20 @@
2
2
 
3
3
  == Usage
4
4
 
5
- Grouper::Rest::Client.new url, :user => user, :password => pass do |grouper|
5
+ Grouper::Rest::Client::Resource.new url, :user => user, :password => pass do |grouper|
6
6
  # Get all group memberships.
7
7
  groups = grouper.groups('blair')
8
8
 
9
9
  # Get group memberships within stem prefix.
10
10
  filtered_groups = grouper.groups('blair', 'some:stem:')
11
+
12
+ # Get subjects matching query.
13
+ subjects = grouper.subjects('blair')
14
+
15
+ # Was the last WS call successful?
16
+ grouper.ok?
17
+
18
+ # Was there an error on the last WS call?
19
+ grouper.error?
11
20
  end
12
21
 
data/Rakefile CHANGED
@@ -1,2 +1,10 @@
1
1
  require 'bundler'
2
+ require 'rspec/core/rake_task'
3
+
2
4
  Bundler::GemHelper.install_tasks
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task :default => :spec
9
+
10
+
@@ -21,5 +21,7 @@ Gem::Specification.new do |s|
21
21
 
22
22
  s.add_dependency( %q<json>, [ ">=1.5.1" ] )
23
23
  s.add_dependency( %q<rest-client>, [ ">=1.6.1" ] )
24
+
25
+ s.add_development_dependency( %q<rspec> )
24
26
  end
25
27
 
@@ -2,48 +2,96 @@ require 'rubygems'
2
2
  require 'json'
3
3
  require 'rest_client'
4
4
 
5
- module Grouper # :nodoc:
6
- module Rest # :nodoc:
5
+ module Grouper # :nodoc:
6
+ module Rest # :nodoc:
7
7
  # = Minimal REST client for interacting with the Grouper WS API.
8
8
  #
9
9
  # == Usage
10
- # Grouper::Rest::Client.new url, :user => user, :password => pass do |grouper|
10
+ # Grouper::Rest::Client::Resource.new url, :user => user, :password => pass do |grouper|
11
11
  # # Get all group memberships.
12
12
  # groups = grouper.groups('blair')
13
13
  #
14
14
  # # Get group memberships within stem prefix.
15
15
  # filtered_groups = grouper.groups('blair', 'some:stem:')
16
- # end
17
- class Client
18
-
19
- # Response object from last request.
20
- attr_reader :response
21
-
22
- # Create Grouper REST client.
23
- # Params:
24
- # +url+:: Base URL for Grouper WS API.
25
- # +:user => user+:: Authenticate to the API as this user.
26
- # +:password => password+:: Authenticate to the API with this password.
27
- def initialize( url, options={} )
28
- @client = RestClient::Resource.new(url, options)
29
- @response = nil
30
- yield self if block_given?
31
- self
32
- end
33
-
34
- # Get subject's group memberships.
35
- # Returns array of hashes of group memberships.
36
- # Params:
37
- # +subject+:: Get groups for this subject.
38
- # +stem_filter+:: Limit groups to those within this stem prefix. (optional)
39
- def groups(subject, stem_filter=nil)
40
- @response = @client["subjects/#{subject}/groups"].get :content_type => 'text/x-json'
41
- result = JSON.parse( @response.body )
42
- groups = result['WsGetGroupsLiteResult']['wsGroups']
43
- groups = groups.select { |group| group['name'] =~ /^#{stem_filter}/ } if stem_filter
44
- groups
45
- end
46
- end
47
- end
48
- end
16
+ #
17
+ # # Get subjects matching query.
18
+ # subjects = grouper.subjects('blair')
19
+ #
20
+ # # Was the last WS call successful?
21
+ # grouper.ok?
22
+ #
23
+ # # Was there an error on the last WS call?
24
+ # grouper.error?
25
+ # end
26
+ module Client
27
+ class Resource
28
+
29
+ # Response object from last request.
30
+ attr_reader :response
31
+
32
+ # Create Grouper REST client.
33
+ # Params:
34
+ # +url+:: Base URL for Grouper WS API.
35
+ # +:user => user+:: Authenticate to the API as this user.
36
+ # +:password => password+:: Authenticate to the API with this password.
37
+ def initialize( url, options={} )
38
+ raise ArgumentError if url.nil? || url.empty?
39
+ @error = false
40
+ @client = RestClient::Resource.new( url, options.merge!( :headers => { :content_type => 'text/x-json' } ) )
41
+ @response = nil
42
+ yield self if block_given?
43
+ self
44
+ end
45
+
46
+ # Was there an error on the last WS call?
47
+ def error?; @error; end
48
+
49
+ # Get memberships for subject(s) matching identifier.
50
+ # Returns array of hashes of group memberships OR JSON error response.
51
+ # Params:
52
+ # +subject+:: Get groups for this subject.
53
+ # +stem_filter+:: Limit groups to those within this stem prefix. (optional)
54
+ def groups(subject, stem_filter=nil)
55
+ raise ArgumentError if subject.nil? || subject.empty?
56
+ k1, k2 = 'WsGetGroupsLiteResult', 'wsGroups'
57
+ result = call("subjects/#{subject}/groups")
58
+ if result.key?(k1) && result[k1].key?(k2)
59
+ groups = result['WsGetGroupsLiteResult']['wsGroups']
60
+ groups = groups.select { |group| group['name'] =~ /^#{stem_filter}/ } if stem_filter
61
+ return groups
62
+ end
63
+ return result
64
+ end
65
+
66
+ # Was the last WS call successful?
67
+ def ok?; !error?; end
68
+
69
+ # Get subject(s) matching identifier.
70
+ # Returns array of hashes of subjects OR JSON error response.
71
+ # Params:
72
+ # +subjects+:: Get subject(s) matching this identifier.
73
+ def subjects(subject)
74
+ raise ArgumentError if subject.nil? || subject.empty?
75
+ k1, k2 = 'WsGetSubjectsResults', 'wsSubjects'
76
+ result = call("subjects/#{subject}")
77
+ return result[k1][k2] if result.key?(k1) && result[k1].key?(k2)
78
+ return result
79
+ end
80
+
81
+ private
82
+
83
+ # Make WS call and return JSON response.
84
+ def call(resource, method = :get)
85
+ @response = @client[resource].send(method)
86
+ @error = false
87
+ JSON.parse( @response.body )
88
+ rescue RestClient::Exception => e
89
+ @error = true
90
+ return JSON.parse( e.response )
91
+ end
92
+
93
+ end # class Resource
94
+ end # module Client
95
+ end # module Rest
96
+ end # module Grouper
49
97
 
@@ -1,7 +1,7 @@
1
- module Grouper
2
- module Rest
1
+ module Grouper # :nodoc:
2
+ module Rest # :nodoc:
3
3
  module Client
4
- VERSION = "0.0.1"
4
+ VERSION = "0.1.0"
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,111 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Grouper::Rest::Client::Resource initialization" do
4
+
5
+ context "with no arguments" do
6
+ it "should raise ArgumentError" do
7
+ lambda { Grouper::Rest::Client::Resource.new }.should raise_error(ArgumentError)
8
+ end
9
+ end
10
+
11
+ context "with one argument" do
12
+
13
+ context "that is invalid" do
14
+ it "should raise ArgumentError when nil" do
15
+ lambda { Grouper::Rest::Client::Resource.new(nil) }.should raise_error(ArgumentError)
16
+ end
17
+ it "should raise ArgumentError when blank" do
18
+ lambda { Grouper::Rest::Client::Resource.new('') }.should raise_error(ArgumentError)
19
+ end
20
+ end
21
+
22
+ context "that is valid" do
23
+ it "should return Grouper::Rest::Client::Resource object" do
24
+ Grouper::Rest::Client::Resource.new('foo').should be_an_instance_of(Grouper::Rest::Client::Resource)
25
+ end
26
+ end
27
+
28
+ end
29
+
30
+ end # describe initialization
31
+
32
+
33
+ describe "Grouper::Rest::Client::Resource#groups()" do
34
+
35
+ before(:each) do
36
+ @grouper = Grouper::Rest::Client::Resource.new('foo')
37
+ end
38
+
39
+ context "with no arguments" do
40
+ it "should raise ArgumentError" do
41
+ lambda { @grouper.groups }.should raise_error(ArgumentError)
42
+ end
43
+ end
44
+
45
+ context "with one argument" do
46
+ context "that is invalid" do
47
+ it "should raise ArgumentError when nil" do
48
+ lambda { @grouper.groups(nil) }.should raise_error(ArgumentError)
49
+ end
50
+ it "should raise ArgumentError when blank" do
51
+ lambda { @grouper.groups('') }.should raise_error(ArgumentError)
52
+ end
53
+ end
54
+ end
55
+
56
+ end # describe #groups()
57
+
58
+
59
+ describe "Grouper::Rest::Client::Resource#error?()" do
60
+ context "before any WS calls have been made" do
61
+ it "should be false" do
62
+ Grouper::Rest::Client::Resource.new('foo').error?.should be_false
63
+ end
64
+ end
65
+ end # describe #error?()
66
+
67
+
68
+ describe "Grouper::Rest::Client::Resource#ok?()" do
69
+ context "before any WS calls have been made" do
70
+ it "should be true" do
71
+ Grouper::Rest::Client::Resource.new('foo').ok?.should be_true
72
+ end
73
+ end
74
+ end # describe #ok?()
75
+
76
+
77
+ describe "Grouper::Rest::Client::Resource#response" do
78
+ context "before any WS calls have been made" do
79
+ it "should be nil" do
80
+ Grouper::Rest::Client::Resource.new('foo').response.should be_nil
81
+ end
82
+ end
83
+ end # describe #response
84
+
85
+
86
+ describe "Grouper::Rest::Client::Resource#subjects()" do
87
+
88
+ before(:each) do
89
+ @grouper = Grouper::Rest::Client::Resource.new('foo')
90
+ end
91
+
92
+ context "with no arguments" do
93
+ it "should raise ArgumentError" do
94
+ lambda { @grouper.subjects }.should raise_error(ArgumentError)
95
+ end
96
+ end
97
+
98
+ context "with one argument" do
99
+ context "that is invalid" do
100
+ it "should raise ArgumentError when nil" do
101
+ lambda { @grouper.subjects(nil) }.should raise_error(ArgumentError)
102
+ end
103
+ it "should raise ArgumentError when blank" do
104
+ lambda { @grouper.subjects('') }.should raise_error(ArgumentError)
105
+ end
106
+ end
107
+ end
108
+
109
+ end # describe #subjects()
110
+
111
+
@@ -0,0 +1,2 @@
1
+ require File.join( File.dirname(__FILE__), '..', 'lib', 'grouper-rest-client' )
2
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grouper-rest-client
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 0
9
8
  - 1
10
- version: 0.0.1
9
+ - 0
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Blair Christensen
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-17 00:00:00 -05:00
18
+ date: 2011-03-18 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -50,6 +50,20 @@ dependencies:
50
50
  version: 1.6.1
51
51
  type: :runtime
52
52
  version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: rspec
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 3
62
+ segments:
63
+ - 0
64
+ version: "0"
65
+ type: :development
66
+ version_requirements: *id003
53
67
  description: REST client for accessing the Grouper WS API
54
68
  email:
55
69
  - blair.christensen@gmail.com
@@ -68,6 +82,8 @@ files:
68
82
  - grouper-rest-client.gemspec
69
83
  - lib/grouper-rest-client.rb
70
84
  - lib/grouper-rest-client/version.rb
85
+ - spec/resource_spec.rb
86
+ - spec/spec_helper.rb
71
87
  has_rdoc: true
72
88
  homepage: https://github.com/blairc/
73
89
  licenses: []
@@ -102,5 +118,6 @@ rubygems_version: 1.6.2
102
118
  signing_key:
103
119
  specification_version: 3
104
120
  summary: REST client for accessing the Grouper WS API
105
- test_files: []
106
-
121
+ test_files:
122
+ - spec/resource_spec.rb
123
+ - spec/spec_helper.rb