sakai-info 0.4.3 → 0.4.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +8 -0
- data/README.md +2 -2
- data/ROADMAP.md +3 -5
- data/lib/sakai-info/cli.rb +3 -1
- data/lib/sakai-info/cli/help.rb +20 -21
- data/lib/sakai-info/gradebook.rb +95 -94
- data/lib/sakai-info/site.rb +4 -7
- data/lib/sakai-info/version.rb +1 -1
- metadata +2 -2
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# sakai-info Change History #
|
2
2
|
|
3
|
+
### 0.4.4 ###
|
4
|
+
|
5
|
+
*Released 2012-05-12*
|
6
|
+
|
7
|
+
* Standardized gradebook and gradebook-item APIs
|
8
|
+
* Renamed GradableObject class to GradebookItem
|
9
|
+
* CLI access to gradebook and gradebook-item objects
|
10
|
+
|
3
11
|
### 0.4.3 ###
|
4
12
|
|
5
13
|
*Released 2012-05-10*
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# sakai-info #
|
2
2
|
|
3
|
-
last updated: 2012-05-
|
3
|
+
last updated: 2012-05-12
|
4
4
|
author: David Adams (daveadams@gmail.com)
|
5
5
|
github url: https://github.com/daveadams/sakai-info
|
6
6
|
|
@@ -24,7 +24,7 @@ Use `rake` to test and build the gem:
|
|
24
24
|
$ rake gem:build
|
25
25
|
|
26
26
|
The resulting gem will be saved to the working directory as
|
27
|
-
`sakai-info-0.4.
|
27
|
+
`sakai-info-0.4.4.gem`.
|
28
28
|
|
29
29
|
Cleanup built gems using:
|
30
30
|
|
data/ROADMAP.md
CHANGED
@@ -1,10 +1,6 @@
|
|
1
1
|
# sakai-info Roadmap #
|
2
2
|
|
3
|
-
*Last updated 2012-05-
|
4
|
-
|
5
|
-
### 0.4.4 ###
|
6
|
-
|
7
|
-
* CLI access to gradebook
|
3
|
+
*Last updated 2012-05-12*
|
8
4
|
|
9
5
|
### 0.4.5 ###
|
10
6
|
|
@@ -13,6 +9,8 @@
|
|
13
9
|
### 0.5.0 ###
|
14
10
|
|
15
11
|
* Sqlite test infrastructure for a few basic objects
|
12
|
+
* Deeper query functionality and field specification
|
13
|
+
* Simple web query interface - HTML, JSON, and YAML
|
16
14
|
|
17
15
|
### 0.6.0 ###
|
18
16
|
|
data/lib/sakai-info/cli.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# - sakai-info command line tool support
|
3
3
|
#
|
4
4
|
# Created 2012-02-19 daveadams@gmail.com
|
5
|
-
# Last updated 2012-05-
|
5
|
+
# Last updated 2012-05-12 daveadams@gmail.com
|
6
6
|
#
|
7
7
|
# https://github.com/daveadams/sakai-info
|
8
8
|
#
|
@@ -38,6 +38,8 @@ module SakaiInfo
|
|
38
38
|
"content" => Content,
|
39
39
|
"announcement" => Announcement,
|
40
40
|
"announcement-channel" => AnnouncementChannel,
|
41
|
+
"gradebook" => Gradebook,
|
42
|
+
"gradebook-item" => GradebookItem,
|
41
43
|
}
|
42
44
|
end
|
43
45
|
end
|
data/lib/sakai-info/cli/help.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# - sin command line help
|
3
3
|
#
|
4
4
|
# Created 2012-02-19 daveadams@gmail.com
|
5
|
-
# Last updated 2012-05-
|
5
|
+
# Last updated 2012-05-12 daveadams@gmail.com
|
6
6
|
#
|
7
7
|
# https://github.com/daveadams/sakai-info
|
8
8
|
#
|
@@ -21,7 +21,7 @@ sin #{VERSION}
|
|
21
21
|
user, group, site, page, tool, quiz, quiz-section, quiz-item, quiz-attempt,
|
22
22
|
quiz-attempt-item, quiz-attempt-item-attachment, question-pool, assignment,
|
23
23
|
assignment-submission, forum, forum-thread, forum-post, content,
|
24
|
-
announcement, announcement-channel
|
24
|
+
announcement, announcement-channel, gradebook, gradebook-item
|
25
25
|
|
26
26
|
Misc commands:
|
27
27
|
test Tests configured database connections
|
@@ -99,7 +99,6 @@ sin user
|
|
99
99
|
|
100
100
|
--sites Print site membership information
|
101
101
|
--pools Print list of owned question pools
|
102
|
-
--all Print all possible details
|
103
102
|
EOF
|
104
103
|
|
105
104
|
"group" => <<EOF,
|
@@ -112,7 +111,6 @@ sin group
|
|
112
111
|
|
113
112
|
--users Print user membership information
|
114
113
|
--realm Print corresponding realm information
|
115
|
-
--all Print all possible details
|
116
114
|
EOF
|
117
115
|
|
118
116
|
"site" => <<EOF,
|
@@ -133,7 +131,6 @@ sin site
|
|
133
131
|
--realm Print site realm details
|
134
132
|
--forums Print forum details
|
135
133
|
--mod Print creation/modification info
|
136
|
-
--all Print all possible details
|
137
134
|
EOF
|
138
135
|
|
139
136
|
"page" => <<EOF,
|
@@ -164,7 +161,6 @@ sin quiz
|
|
164
161
|
--sections Print section summary list
|
165
162
|
--attempts Print summary of user quiz attempts
|
166
163
|
--mod Print creation/modification info
|
167
|
-
--all Print all possible details
|
168
164
|
|
169
165
|
Not yet implemented:
|
170
166
|
--items Print summary of items on the quiz
|
@@ -181,7 +177,6 @@ sin quiz-section
|
|
181
177
|
|
182
178
|
--items Print summary of items in the section
|
183
179
|
--mod Print creation/modification info
|
184
|
-
--all Print all possible details
|
185
180
|
EOF
|
186
181
|
|
187
182
|
"quiz-item" => <<EOF,
|
@@ -194,7 +189,6 @@ sin quiz-item
|
|
194
189
|
passed to include additional information:
|
195
190
|
|
196
191
|
--mod Print creation/modification info
|
197
|
-
--all Print all possible details
|
198
192
|
EOF
|
199
193
|
|
200
194
|
"question-pool" => <<EOF,
|
@@ -211,7 +205,6 @@ sin question-pool
|
|
211
205
|
Not yet implemented:
|
212
206
|
--items Print summary of items in the pool
|
213
207
|
--quizzes Print summary of quizzes that link to this pool
|
214
|
-
--all Print all possible details
|
215
208
|
EOF
|
216
209
|
|
217
210
|
"quiz-attempt" => <<EOF,
|
@@ -223,7 +216,6 @@ sin quiz-attempt
|
|
223
216
|
may be passed to include additional information:
|
224
217
|
|
225
218
|
--items Print list of attempted items
|
226
|
-
--all Print all possible details
|
227
219
|
EOF
|
228
220
|
|
229
221
|
|
@@ -236,7 +228,6 @@ sin quiz-attempt-item
|
|
236
228
|
options may be passed to include additional information:
|
237
229
|
|
238
230
|
--attachments Print a list of file attachments, if any
|
239
|
-
--all Print all possible details
|
240
231
|
EOF
|
241
232
|
|
242
233
|
"quiz-attempt-item-attachment" => <<EOF,
|
@@ -248,7 +239,6 @@ sin quiz-attempt-item-attachment
|
|
248
239
|
Additional options may be passed to include additional information:
|
249
240
|
|
250
241
|
--mod Print creation/modification info
|
251
|
-
--all Print all possible details
|
252
242
|
EOF
|
253
243
|
|
254
244
|
"assignment" => <<EOF,
|
@@ -262,7 +252,6 @@ sin assignment
|
|
262
252
|
--submissions Print summary of all submissions
|
263
253
|
--xml Print the raw XML
|
264
254
|
--mod Print creation/modification info
|
265
|
-
--all Print all possible details
|
266
255
|
EOF
|
267
256
|
|
268
257
|
"assignment-submission" => <<EOF,
|
@@ -275,7 +264,6 @@ sin assignment-submission
|
|
275
264
|
|
276
265
|
--xml Print the raw XML
|
277
266
|
--mod Print creation/modification info
|
278
|
-
--all Print all possible details
|
279
267
|
EOF
|
280
268
|
|
281
269
|
"forum" => <<EOF,
|
@@ -288,7 +276,6 @@ sin forum
|
|
288
276
|
|
289
277
|
--threads Print summary of all threads
|
290
278
|
--mod Print creation/modification info
|
291
|
-
--all Print all possible details
|
292
279
|
EOF
|
293
280
|
|
294
281
|
"forum-thread" => <<EOF,
|
@@ -301,7 +288,6 @@ sin forum-thread
|
|
301
288
|
|
302
289
|
--posts Print summary of all posts
|
303
290
|
--mod Print creation/modification info
|
304
|
-
--all Print all possible details
|
305
291
|
EOF
|
306
292
|
|
307
293
|
"forum-post" => <<EOF,
|
@@ -313,7 +299,6 @@ sin forum-post
|
|
313
299
|
may be passed to include additional information:
|
314
300
|
|
315
301
|
--mod Print creation/modification info
|
316
|
-
--all Print all possible details
|
317
302
|
EOF
|
318
303
|
|
319
304
|
"content" => <<EOF,
|
@@ -327,7 +312,6 @@ sin content
|
|
327
312
|
--properties Print all properties
|
328
313
|
--children Recursively print collection children
|
329
314
|
--mod Print creation/modification info
|
330
|
-
--all Print all possible details
|
331
315
|
EOF
|
332
316
|
"announcement" => <<EOF,
|
333
317
|
sin announcement
|
@@ -338,10 +322,9 @@ sin announcement
|
|
338
322
|
be passed to include additional information:
|
339
323
|
|
340
324
|
--xml Print raw XML content
|
341
|
-
--all Print all possible details
|
342
325
|
EOF
|
343
326
|
"announcement-channel" => <<EOF,
|
344
|
-
sin
|
327
|
+
sin announcement-channel
|
345
328
|
|
346
329
|
Usage: sin announcement-channel <id> [<options>]
|
347
330
|
|
@@ -350,7 +333,23 @@ sin content
|
|
350
333
|
|
351
334
|
--announcements Print a summary of all announcements in this channel
|
352
335
|
--xml Print raw XML content
|
353
|
-
|
336
|
+
EOF
|
337
|
+
"gradebook" => <<EOF,
|
338
|
+
sin gradebook
|
339
|
+
|
340
|
+
Usage: sin gradebook <id> [<options>]
|
341
|
+
|
342
|
+
Prints information about the gradebook ID specified. Additional options may
|
343
|
+
be passed to include additional information:
|
344
|
+
|
345
|
+
--items Print all gradebook items
|
346
|
+
EOF
|
347
|
+
"gradebook-item" => <<EOF,
|
348
|
+
sin gradebook-item
|
349
|
+
|
350
|
+
Usage: sin gradebook-item <id> [<options>]
|
351
|
+
|
352
|
+
Prints information about the gradebook item ID specified.
|
354
353
|
EOF
|
355
354
|
}
|
356
355
|
|
data/lib/sakai-info/gradebook.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# SakaiInfo::Gradebook library
|
3
3
|
#
|
4
4
|
# Created 2012-02-17 daveadams@gmail.com
|
5
|
-
# Last updated 2012-05-
|
5
|
+
# Last updated 2012-05-12 daveadams@gmail.com
|
6
6
|
#
|
7
7
|
# https://github.com/daveadams/sakai-info
|
8
8
|
#
|
@@ -11,150 +11,151 @@
|
|
11
11
|
|
12
12
|
module SakaiInfo
|
13
13
|
class Gradebook < SakaiObject
|
14
|
-
attr_reader :version, :
|
14
|
+
attr_reader :version, :site_id, :name
|
15
15
|
|
16
16
|
def self.clear_cache
|
17
17
|
@@cache = {}
|
18
|
-
@@cache_by_site_id = {}
|
19
18
|
end
|
20
19
|
clear_cache
|
21
20
|
|
22
|
-
def initialize(
|
23
|
-
@
|
24
|
-
|
25
|
-
@
|
26
|
-
@
|
21
|
+
def initialize(dbrow)
|
22
|
+
@dbrow = dbrow
|
23
|
+
|
24
|
+
@id = @dbrow[:id].to_i
|
25
|
+
@version = @dbrow[:version].to_i
|
26
|
+
@site_id = @dbrow[:gradebook_uid]
|
27
|
+
@name = @dbrow[:name]
|
27
28
|
end
|
28
29
|
|
29
30
|
def self.find(id)
|
30
31
|
if @@cache[id].nil?
|
31
|
-
row = DB.connect.
|
32
|
-
"from gb_gradebook_t " +
|
33
|
-
"where id = :id", id).first
|
32
|
+
row = DB.connect[:gb_gradebook_t].where(:id => id).first
|
34
33
|
if row.nil?
|
35
34
|
raise ObjectNotFoundException.new(Gradebook, id)
|
36
35
|
end
|
37
36
|
|
38
|
-
|
39
|
-
site = Site.find(row[:gradebook_uid])
|
40
|
-
name = row[:name]
|
41
|
-
@@cache[id] = Gradebook.new(id, version, site, name)
|
42
|
-
@@cache_by_site_id[site.id] = @@cache[id]
|
37
|
+
@@cache[id] = Gradebook.new(row)
|
43
38
|
end
|
44
39
|
@@cache[id]
|
45
40
|
end
|
46
41
|
|
47
|
-
def
|
48
|
-
|
49
|
-
|
50
|
-
"from gb_gradebook_t " +
|
51
|
-
"where gradebook_uid = ?", site_id).first
|
52
|
-
if row.nil?
|
53
|
-
raise ObjectNotFoundException.new(Gradebook, site_id)
|
54
|
-
end
|
42
|
+
def site
|
43
|
+
@site ||= Site.find(self.site_id)
|
44
|
+
end
|
55
45
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
46
|
+
def self.query_by_site_id(site_id)
|
47
|
+
DB.connect[:gb_gradebook_t].where(:gradebook_uid => site_id)
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.count_by_site_id(site_id)
|
51
|
+
Gradebook.query_by_site_id(site_id).count
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.find_by_site_id(site_id)
|
55
|
+
Gradebook.query_by_site_id(site_id).all.collect { |row| Gradebook.new(row) }
|
64
56
|
end
|
65
57
|
|
66
58
|
def items
|
67
|
-
@items ||=
|
59
|
+
@items ||= GradebookItem.find_by_gradebook_id(self.id)
|
68
60
|
end
|
69
61
|
|
70
62
|
def item_count
|
71
|
-
|
63
|
+
@item_count ||= GradebookItem.count_by_gradebook_id(self.id)
|
64
|
+
end
|
65
|
+
|
66
|
+
def default_serialization
|
67
|
+
{
|
68
|
+
"id" => self.id,
|
69
|
+
"name" => self.name,
|
70
|
+
"site" => self.site.serialize(:summary),
|
71
|
+
"version" => self.version,
|
72
|
+
"item_count" => self.item_count,
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
def summary_serialization
|
77
|
+
{
|
78
|
+
"id" => self.id,
|
79
|
+
"name" => self.name,
|
80
|
+
"site_id" => self.site_id,
|
81
|
+
"item_count" => self.item_count,
|
82
|
+
}
|
83
|
+
end
|
84
|
+
|
85
|
+
def site_summary_serialization
|
86
|
+
{
|
87
|
+
"id" => self.id,
|
88
|
+
}
|
89
|
+
end
|
90
|
+
|
91
|
+
def items_serialization
|
92
|
+
{
|
93
|
+
"items" => self.items.collect { |item| item.serialize(:summary) }
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.all_serializations
|
98
|
+
[
|
99
|
+
:default,
|
100
|
+
:items
|
101
|
+
]
|
72
102
|
end
|
73
103
|
end
|
74
104
|
|
75
|
-
class
|
76
|
-
attr_reader :
|
77
|
-
attr_reader :points_possible, :due_date, :weight
|
105
|
+
class GradebookItem < SakaiObject
|
106
|
+
attr_reader :gradebook_id, :object_type_id, :version, :name, :points_possible, :due_date, :weight
|
78
107
|
|
79
108
|
def self.clear_cache
|
80
109
|
@@cache = {}
|
81
|
-
@@cache_by_gradebook_id = {}
|
82
110
|
end
|
83
111
|
clear_cache
|
84
112
|
|
85
|
-
def initialize(
|
86
|
-
|
87
|
-
|
88
|
-
@
|
89
|
-
@
|
90
|
-
@
|
91
|
-
@
|
92
|
-
@
|
93
|
-
@
|
94
|
-
@
|
113
|
+
def initialize(dbrow)
|
114
|
+
@dbrow = dbrow
|
115
|
+
|
116
|
+
@id = @dbrow[:id]
|
117
|
+
@gradebook_id = @dbrow[:gradebook_id].to_i
|
118
|
+
@object_type_id = @dbrow[:object_type_id].to_i
|
119
|
+
@version = @dbrow[:version].to_i
|
120
|
+
@name = @dbrow[:name]
|
121
|
+
@points_possible = @dbrow[:points_possible].to_f
|
122
|
+
@due_date = @dbrow[:due_date]
|
123
|
+
@weight = @dbrow[:assignment_weighting].to_f
|
95
124
|
end
|
96
125
|
|
97
126
|
def self.find(id)
|
98
127
|
if @@cache[id].nil?
|
99
|
-
row = DB.connect.
|
100
|
-
"name, points_possible, " +
|
101
|
-
"to_char(due_date, 'YYYY-MM-DD') as due, " +
|
102
|
-
"assignment_weighting " +
|
103
|
-
"from gb_gradable_object_t " +
|
104
|
-
"where id = ?", id).first
|
105
|
-
|
128
|
+
row = DB.connect[:gb_gradable_object_t].where(:id => id).first
|
106
129
|
if row.nil?
|
107
|
-
raise ObjectNotFoundException.new(
|
130
|
+
raise ObjectNotFoundException.new(GradebookItem, id)
|
108
131
|
end
|
109
|
-
|
110
|
-
gradebook = Gradebook.find(row[:gradebook_id].to_i)
|
111
|
-
object_type = row[:object_type_id].to_i
|
112
|
-
version = row[:version].to_i
|
113
|
-
name = row[:name]
|
114
|
-
points_possible = row[:points_possible].to_f
|
115
|
-
due_date = row[:due]
|
116
|
-
weight = row[:assignment_weighting].to_f
|
117
|
-
@@cache[id] = GradableObject.new(id, gradebook, object_type,
|
118
|
-
version, name, points_possible,
|
119
|
-
due_date, weight)
|
132
|
+
@@cache[id] = GradebookItem.new(row)
|
120
133
|
end
|
121
134
|
@@cache[id]
|
122
135
|
end
|
123
136
|
|
124
|
-
def
|
125
|
-
|
126
|
-
|
127
|
-
gradebook = Gradebook.find(gradebook_id)
|
128
|
-
DB.connect.fetch("select id, object_type_id, version, " +
|
129
|
-
"name, points_possible, " +
|
130
|
-
"to_char(due_date, 'YYYY-MM-DD') as due, " +
|
131
|
-
"assignment_weighting " +
|
132
|
-
"from gb_gradable_object_t " +
|
133
|
-
"where gradebook_id = ? " +
|
134
|
-
"order by due_date asc", gradebook_id) do |row|
|
135
|
-
id = row[:id].to_i
|
136
|
-
object_type = row[:object_type_id].to_i
|
137
|
-
version = row[:version].to_i
|
138
|
-
name = row[:name]
|
139
|
-
points_possible = row[:points_possible].to_f
|
140
|
-
due_date = row[:due]
|
141
|
-
weight = row[:assignment_weighting].to_f
|
142
|
-
objects << GradableObject.new(id, gradebook, object_type,
|
143
|
-
version, name, points_possible,
|
144
|
-
due_date, weight)
|
137
|
+
def gradebook
|
138
|
+
@gradebook = Gradebook.find(self.gradebook_id)
|
139
|
+
end
|
145
140
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
141
|
+
def self.query_by_gradebook_id(gradebook_id)
|
142
|
+
DB.connect[:gb_gradable_object_t].where(:gradebook_id => gradebook_id)
|
143
|
+
end
|
144
|
+
|
145
|
+
def self.count_by_gradebook_id(gradebook_id)
|
146
|
+
GradebookItem.query_by_gradebook_id(gradebook_id).count
|
147
|
+
end
|
148
|
+
|
149
|
+
def self.find_by_gradebook_id(gradebook_id)
|
150
|
+
GradebookItem.query_by_gradebook_id(gradebook_id).all.collect { |row| GradebookItem.new(row) }
|
150
151
|
end
|
151
152
|
|
152
153
|
def default_serialization
|
153
154
|
result = {
|
154
155
|
"id" => self.id,
|
155
156
|
"name" => self.name,
|
156
|
-
"gradebook_id" => self.
|
157
|
-
"
|
157
|
+
"gradebook_id" => self.gradebook_id,
|
158
|
+
"object_type_id" => self.object_type_id,
|
158
159
|
"version" => self.version,
|
159
160
|
"points_possible" => self.points_possible,
|
160
161
|
"due_date" => self.due_date,
|
data/lib/sakai-info/site.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# SakaiInfo::Site library
|
3
3
|
#
|
4
4
|
# Created 2012-02-17 daveadams@gmail.com
|
5
|
-
# Last updated 2012-05-
|
5
|
+
# Last updated 2012-05-12 daveadams@gmail.com
|
6
6
|
#
|
7
7
|
# https://github.com/daveadams/sakai-info
|
8
8
|
#
|
@@ -135,10 +135,7 @@ module SakaiInfo
|
|
135
135
|
|
136
136
|
# gradebook properties
|
137
137
|
def gradebook
|
138
|
-
@gradebook ||= Gradebook.find_by_site_id(@id)
|
139
|
-
rescue ObjectNotFoundException
|
140
|
-
# not all sites have a gradebook, don't panic
|
141
|
-
nil
|
138
|
+
@gradebook ||= Gradebook.find_by_site_id(@id).first
|
142
139
|
end
|
143
140
|
|
144
141
|
# forum properties
|
@@ -363,9 +360,9 @@ module SakaiInfo
|
|
363
360
|
end
|
364
361
|
|
365
362
|
def gradebook_serialization
|
366
|
-
if self.gradebook
|
363
|
+
if self.gradebook
|
367
364
|
{
|
368
|
-
"
|
365
|
+
"gradebook" => self.gradebook.serialize(:site_summary, :items)
|
369
366
|
}
|
370
367
|
else
|
371
368
|
{}
|
data/lib/sakai-info/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sakai-info
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05-
|
12
|
+
date: 2012-05-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sequel
|