litmos-client 0.0.4 → 0.0.5

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.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- litmos-client (0.0.4)
4
+ litmos-client (0.0.5)
5
5
  json
6
6
  litmos-client
7
7
  rest-client
data/README.rdoc CHANGED
@@ -44,8 +44,7 @@ For methods that aren't yet implemented in the gem, you can simply use the *get*
44
44
  Litmos-client depends on the Rest-client[https://github.com/archiloque/rest-client], and JSON gems (should be automatically loaded via the gemspec).
45
45
 
46
46
  == TODO
47
- * Support for retrieving Teams and Courses
48
- * Support for creating objects and other http verbs (PUT, POST)
47
+ * Figure out how to write a test suite for a live API!
49
48
 
50
49
  == Contributing to litmos-client
51
50
 
data/Rakefile CHANGED
@@ -15,7 +15,7 @@ Jeweler::Tasks.new do |gem|
15
15
  gem.name = "litmos-client"
16
16
  gem.homepage = "http://github.com/kennon/litmos-client"
17
17
  gem.license = "MIT"
18
- gem.version = "0.0.4"
18
+ gem.version = "0.0.5"
19
19
  gem.summary = %Q{Litmos-client is a Ruby wrapper for the Litmos API}
20
20
  gem.description = %Q{Litmos-Client is a Ruby gem that provides a wrapper for interacting with the Litmos Learning Management System API.}
21
21
  gem.email = "kennon@angryturnip.com"
@@ -17,8 +17,8 @@ module LitmosClient
17
17
  end
18
18
 
19
19
  def add_user_to_team(options={})
20
- raise ArgumentError.new("team_id is required") if options[:team_id].blank?
21
- raise ArgumentError.new("user_id is required") if options[:user_id].blank?
20
+ raise ArgumentError.new(":team_id is required") if options[:team_id].blank?
21
+ raise ArgumentError.new(":user_id is required") if options[:user_id].blank?
22
22
 
23
23
  params = {
24
24
  'Id' => options[:user_id]
@@ -28,8 +28,8 @@ module LitmosClient
28
28
  end
29
29
 
30
30
  def remove_user_from_team(options={})
31
- raise ArgumentError.new("team_id is required") if options[:team_id].blank?
32
- raise ArgumentError.new("user_id is required") if options[:user_id].blank?
31
+ raise ArgumentError.new(":team_id is required") if options[:team_id].blank?
32
+ raise ArgumentError.new(":user_id is required") if options[:user_id].blank?
33
33
 
34
34
  delete("teams/#{options[:team_id]}/users/#{options[:user_id]}")
35
35
  end
data/lib/litmos_client.rb CHANGED
@@ -34,18 +34,28 @@ module LitmosClient
34
34
  end
35
35
 
36
36
  def get(path, params={})
37
+ dont_parse_response = params.delete(:dont_parse_response)
38
+
37
39
  options = {
38
40
  :content_type => :json,
39
41
  :accept => :json,
40
42
  :params => params.merge(:apikey => @api_key, :source => @source)
41
43
  }
44
+
42
45
  RestClient.get("#{@litmosURL}/#{path}", options) do |response, request, result|
43
46
  case response.code
44
47
  when 200, 201
45
48
  # 200 Success. User/Course etc updated, deleted or retrieved
46
49
  # 201 Success. User/Course etc created
47
- return response.blank? ? true : StringHelpers.convert_hash_keys(JSON.parse(response))
48
-
50
+ if response.blank?
51
+ true
52
+ else
53
+ if dont_parse_response
54
+ response
55
+ else
56
+ parse_response(response)
57
+ end
58
+ end
49
59
  when 404 # 404 Not Found. The User/Course etc that you requested does not exist
50
60
  raise NotFound.new(response)
51
61
 
@@ -63,6 +73,8 @@ module LitmosClient
63
73
  query_params = query_params.merge(:apikey => @api_key, :source => @source)
64
74
  query_string = query_params.collect { |k,v| "#{k}=#{CGI::escape(v)}" }.join('&')
65
75
  query_string = "?#{query_string}" unless query_string.blank?
76
+
77
+ dont_parse_response = params.delete(:dont_parse_response)
66
78
 
67
79
  options = {
68
80
  :content_type => :json,
@@ -74,7 +86,16 @@ module LitmosClient
74
86
  when 200, 201
75
87
  # 200 Success. User/Course etc updated, deleted or retrieved
76
88
  # 201 Success. User/Course etc created
77
- return response.blank? ? true : StringHelpers.convert_hash_keys(JSON.parse(response))
89
+
90
+ if response.blank?
91
+ true
92
+ else
93
+ if dont_parse_response
94
+ response
95
+ else
96
+ parse_response(response)
97
+ end
98
+ end
78
99
 
79
100
  when 404 # 404 Not Found. The User/Course etc that you requested does not exist
80
101
  raise NotFound.new(response)
@@ -90,17 +111,29 @@ module LitmosClient
90
111
  end
91
112
 
92
113
  def delete(path, params={})
114
+ dont_parse_response = params.delete(:dont_parse_response)
115
+
93
116
  options = {
94
117
  :content_type => :json,
95
118
  :accept => :json,
96
119
  :params => params.merge(:apikey => @api_key, :source => @source)
97
120
  }
121
+
98
122
  RestClient.delete("#{@litmosURL}/#{path}", options) do |response, request, result|
99
123
  case response.code
100
124
  when 200, 201
101
125
  # 200 Success. User/Course etc updated, deleted or retrieved
102
126
  # 201 Success. User/Course etc created
103
- return response.blank? ? true : StringHelpers.convert_hash_keys(JSON.parse(response))
127
+
128
+ if response.blank?
129
+ true
130
+ else
131
+ if dont_parse_response
132
+ response
133
+ else
134
+ parse_response(response)
135
+ end
136
+ end
104
137
 
105
138
  when 404 # 404 Not Found. The User/Course etc that you requested does not exist
106
139
  raise NotFound.new(response)
@@ -113,15 +146,20 @@ module LitmosClient
113
146
 
114
147
  end
115
148
  end
116
- end
149
+ end
150
+
151
+ protected
152
+
153
+ ASP_DATE_REGEXP=/\/Date\(([0-9]+)\+[0-9]+\)\//
154
+
155
+ def parse_asp_date(asp_date)
156
+ DateTime.strptime(asp_date.gsub(ASP_DATE_REGEXP, '\1'), '%Q')
157
+ end
117
158
 
118
- end
119
-
120
- module StringHelpers
121
159
  # for de-camelCasing the result keys
122
160
  # from: http://stackoverflow.com/questions/8706930/converting-nested-hash-keys-from-camelcase-to-snake-case-in-ruby
123
161
 
124
- def self.underscore(string)
162
+ def underscore(string)
125
163
  string.gsub(/::/, '/').
126
164
  gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
127
165
  gsub(/([a-z\d])([A-Z])/,'\1_\2').
@@ -129,11 +167,19 @@ module LitmosClient
129
167
  downcase
130
168
  end
131
169
 
132
- def self.underscore_key(k)
170
+ def underscore_key(k)
133
171
  underscore(k.to_s).to_sym
134
172
  end
135
173
 
136
- def self.convert_hash_keys(value)
174
+ def parse_response(response)
175
+ convert_hash_keys(JSON.parse(response))
176
+ end
177
+
178
+ def convert_hash_keys(value)
179
+ if value.is_a?(String) and value =~ ASP_DATE_REGEXP
180
+ return parse_asp_date(value)
181
+ end
182
+
137
183
  case value
138
184
  when Array
139
185
  value.map { |v| convert_hash_keys(v) }
@@ -144,6 +190,7 @@ module LitmosClient
144
190
  value
145
191
  end
146
192
  end
193
+
147
194
  end
148
195
 
149
196
  end
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "litmos-client"
8
- s.version = "0.0.4"
8
+ s.version = "0.0.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Kennon Ballou"]
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: litmos-client
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 4
10
- version: 0.0.4
9
+ - 5
10
+ version: 0.0.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kennon Ballou