sakai-info 0.3.2 → 0.3.3

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/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # sakai-info Change History #
2
2
 
3
+ ## 0.3.3 ##
4
+
5
+ *Released 2012-03-09*
6
+
7
+ * Fixed performance bug connecting to the database on every query
8
+ * Performance improvements (with possible downsides) in property lookups
9
+ * Group supports dbrow, improved serialization
10
+ * CLI now supports group objects
11
+
3
12
  ## 0.3.2 ##
4
13
 
5
14
  *Released 2012-03-08*
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # sakai-info #
2
2
 
3
- last updated: 2012-03-08
3
+ last updated: 2012-03-09
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.3.2.gem`.
27
+ `sakai-info-0.3.3.gem`.
28
28
 
29
29
  Cleanup built gems using:
30
30
 
data/ROADMAP.md CHANGED
@@ -1,29 +1,28 @@
1
1
  # sakai-info Roadmap #
2
2
 
3
- *Last updated 2012-03-08*
3
+ *Last updated 2012-03-09*
4
4
 
5
- ### 0.3.3 ###
5
+ ### 0.3.4 ###
6
6
 
7
- * CLI access to groups
8
7
  * User support for --mod and --dbrow
9
8
 
10
- ### 0.3.4 ###
9
+ ### 0.3.5 ###
11
10
 
12
11
  * CLI access to forums
13
12
 
14
- ### 0.3.5 ###
13
+ ### 0.3.6 ###
15
14
 
16
15
  * CLI access to gradebook
17
16
 
18
- ### 0.3.6 ###
17
+ ### 0.3.7 ###
19
18
 
20
19
  * CLI access to announcements
21
20
 
22
- ### 0.3.7 ###
21
+ ### 0.3.8 ###
23
22
 
24
23
  * CLI access to content
25
24
 
26
- ### 0.3.8 ###
25
+ ### 0.3.9 ###
27
26
 
28
27
  * CLI access to authz (realms, roles, functions)
29
28
 
@@ -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-03-08 daveadams@gmail.com
5
+ # Last updated 2012-03-09 daveadams@gmail.com
6
6
  #
7
7
  # https://github.com/daveadams/sakai-info
8
8
  #
@@ -11,6 +11,9 @@
11
11
 
12
12
  require 'sakai-info/cli/help'
13
13
 
14
+ # it's faster to run single-threaded
15
+ Sequel.single_threaded = true
16
+
14
17
  module SakaiInfo
15
18
  class CLI
16
19
  ObjectModes = {
@@ -18,6 +21,7 @@ module SakaiInfo
18
21
  "page" => Page,
19
22
  "tool" => Tool,
20
23
  "user" => User,
24
+ "group" => Group,
21
25
  "quiz" => Quiz,
22
26
  "quiz-section" => QuizSection,
23
27
  "quiz-item" => QuizItem,
@@ -2,7 +2,7 @@
2
2
  # - sakai-info command line help
3
3
  #
4
4
  # Created 2012-02-19 daveadams@gmail.com
5
- # Last updated 2012-03-08 daveadams@gmail.com
5
+ # Last updated 2012-03-09 daveadams@gmail.com
6
6
  #
7
7
  # https://github.com/daveadams/sakai-info
8
8
  #
@@ -20,6 +20,7 @@ sakai-info #{VERSION}
20
20
 
21
21
  Object commands:
22
22
  user User information
23
+ group Group information
23
24
 
24
25
  site Site information
25
26
  page Site page information
@@ -116,6 +117,19 @@ sakai-info user
116
117
  --all Print all possible details
117
118
  EOF
118
119
 
120
+ "group" => <<EOF,
121
+ sakai-info group
122
+
123
+ Usage: sakai-info group <id> [<options>]
124
+
125
+ Prints information about the group ID or EID specified. Additional options
126
+ may be passed to include additional information:
127
+
128
+ --users Print user membership information
129
+ --realm Print corresponding realm information
130
+ --all Print all possible details
131
+ EOF
132
+
119
133
  "site" => <<EOF,
120
134
  sakai-info site
121
135
 
@@ -135,7 +135,7 @@ module SakaiInfo
135
135
  end
136
136
 
137
137
  def alive?
138
- @connection.nil? && @connection.test_connection
138
+ (not @connection.nil?) && @connection.test_connection
139
139
  end
140
140
  end
141
141
  end
@@ -2,7 +2,7 @@
2
2
  # SakaiInfo::Group library
3
3
  #
4
4
  # Created 2012-02-17 daveadams@gmail.com
5
- # Last updated 2012-02-24 daveadams@gmail.com
5
+ # Last updated 2012-03-09 daveadams@gmail.com
6
6
  #
7
7
  # https://github.com/daveadams/sakai-info
8
8
  #
@@ -11,17 +11,18 @@
11
11
 
12
12
  module SakaiInfo
13
13
  class Group < SakaiObject
14
- attr_reader :site, :title
14
+ attr_reader :site_id, :title, :dbrow
15
15
 
16
- def initialize(id, site, title)
17
- @id = id
18
- if site.is_a? Site
19
- @site = site
20
- else
21
- # assume the string version is a site_id
22
- @site = Site.find(site.to_s)
23
- end
24
- @title = title
16
+ def initialize(dbrow)
17
+ @dbrow = dbrow
18
+
19
+ @id = dbrow[:group_id]
20
+ @site_id = dbrow[:site_id]
21
+ @title = dbrow[:title]
22
+ end
23
+
24
+ def site
25
+ @site ||= Site.find(@site_id)
25
26
  end
26
27
 
27
28
  @@cache = {}
@@ -31,35 +32,38 @@ module SakaiInfo
31
32
  if row.nil?
32
33
  raise ObjectNotFoundException.new(Group, id)
33
34
  end
34
- @@cache[id] = Group.new(id, row[:site_id], row[:title])
35
+ @@cache[id] = Group.new(row)
35
36
  end
36
37
  @@cache[id]
37
38
  end
38
39
 
39
- @@cache_by_site_id = {}
40
- def self.find_by_site_id(site_id)
41
- if @@cache_by_site_id[site_id].nil?
42
- @@cache_by_site_id[site_id] = []
43
- site = Site.find(site_id)
40
+ def self.query_by_site_id(site_id)
41
+ DB.connect[:sakai_site_group].where(:site_id => site_id)
42
+ end
44
43
 
45
- DB.connect[:sakai_site_group].filter(:site_id => site_id).all.each do |row|
46
- @@cache[row[:group_id]] = Group.new(row[:group_id], site, row[:title])
47
- @@cache_by_site_id[site_id] << @@cache[row[:group_id]]
48
- end
49
- end
50
- @@cache_by_site_id[site_id]
44
+ def self.find_by_site_id(site_id)
45
+ Group.query_by_site_id(site_id).all.
46
+ collect { |row| @@cache[row[:group_id]] = Group.new(row) }
51
47
  end
52
48
 
53
49
  def self.count_by_site_id(site_id)
54
- DB.connect[:sakai_site_group].filter(:site_id => site_id).count
50
+ Group.query_by_site_id(site_id).count
55
51
  end
56
52
 
57
53
  def properties
58
- @properties ||= GroupProperty.find_by_group_id(@id)
54
+ @properties ||= GroupProperty.find_by_group_id(self.id)
59
55
  end
60
56
 
61
57
  def realm
62
- @authz_realm ||= AuthzRealm.find_by_site_id_and_group_id(@site.id, @id)
58
+ @authz_realm ||= AuthzRealm.find_by_site_id_and_group_id(self.site_id, self.id)
59
+ end
60
+
61
+ def providers
62
+ @providers ||= self.realm.providers
63
+ end
64
+
65
+ def users
66
+ @users ||= AuthzRealmMembership.find_by_realm_id(self.realm.id).collect{|arm|arm.user}
63
67
  end
64
68
 
65
69
  # serialization
@@ -67,8 +71,9 @@ module SakaiInfo
67
71
  result = {
68
72
  "id" => self.id,
69
73
  "title" => self.title,
70
- "site_id" => self.site.id,
71
- "members" => self.realm.user_count,
74
+ "site" => self.site.serialize(:summary),
75
+ "user_count" => self.realm.user_count,
76
+ "providers" => self.providers,
72
77
  "properties" => self.properties
73
78
  }
74
79
  if result["properties"] == {}
@@ -81,9 +86,25 @@ module SakaiInfo
81
86
  {
82
87
  "id" => self.id,
83
88
  "title" => self.title,
84
- "members" => self.realm.user_count
89
+ "user_count" => self.realm.user_count
90
+ }
91
+ end
92
+
93
+ def users_serialization
94
+ {
95
+ "users" => self.users.collect { |u| u.serialize(:summary) }
85
96
  }
86
97
  end
98
+
99
+ def realm_serialization
100
+ {
101
+ "realm" => self.realm.name
102
+ }
103
+ end
104
+
105
+ def self.all_serializations
106
+ [:default, :users, :realm]
107
+ end
87
108
  end
88
109
 
89
110
  class GroupProperty
@@ -99,8 +120,17 @@ module SakaiInfo
99
120
 
100
121
  def self.find_by_group_id(group_id)
101
122
  properties = {}
102
- DB.connect[:sakai_site_group_property].where(:group_id => group_id).all.each do |row|
103
- properties[row[:name]] = row[:value].read
123
+ # HACK: reading blobs via OCI8 is really slow, make the db server do it!
124
+ # This is multiple orders of magnitude faster.
125
+ # But, this will break if the property value is > 4000chars and may not work
126
+ # on mysql, so here's the original version:
127
+ # DB.connect[:sakai_site_group_property].where(:group_id => group_id).all.each do |row|
128
+ # properties[row[:name]] = row[:value].read
129
+ # end
130
+ DB.connect[:sakai_site_group_property].
131
+ select(:name, :to_char.sql_function(:value).as(:value)).
132
+ where(:group_id => group_id).all.each do |row|
133
+ properties[row[:name]] = row[:value]
104
134
  end
105
135
  return properties
106
136
  end
@@ -2,7 +2,7 @@
2
2
  # SakaiInfo::Page library
3
3
  #
4
4
  # Created 2012-03-08 daveadams@gmail.com
5
- # Last updated 2012-03-08 daveadams@gmail.com
5
+ # Last updated 2012-03-09 daveadams@gmail.com
6
6
  #
7
7
  # https://github.com/daveadams/sakai-info
8
8
  #
@@ -101,8 +101,17 @@ module SakaiInfo
101
101
 
102
102
  def self.find_by_page_id(page_id)
103
103
  properties = {}
104
- DB.connect[:sakai_site_page_property].where(:page_id => page_id).all.each do |row|
105
- properties[row[:name]] = row[:value].read
104
+ # HACK: reading blobs via OCI8 is really slow, make the db server do it!
105
+ # This is multiple orders of magnitude faster.
106
+ # But, this will break if the property value is > 4000chars and may not work
107
+ # on mysql, so here's the original version:
108
+ # DB.connect[:sakai_site_page_property].where(:page_id => page_id).all.each do |row|
109
+ # properties[row[:name]] = row[:value].read
110
+ # end
111
+ DB.connect[:sakai_site_page_property].
112
+ select(:name, :to_char.sql_function(:value).as(:value)).
113
+ where(:page_id => page_id).all.each do |row|
114
+ properties[row[:name]] = row[:value]
106
115
  end
107
116
  return properties
108
117
  end
@@ -2,7 +2,7 @@
2
2
  # SakaiInfo::Site library
3
3
  #
4
4
  # Created 2012-02-17 daveadams@gmail.com
5
- # Last updated 2012-03-08 daveadams@gmail.com
5
+ # Last updated 2012-03-09 daveadams@gmail.com
6
6
  #
7
7
  # https://github.com/daveadams/sakai-info
8
8
  #
@@ -402,8 +402,17 @@ module SakaiInfo
402
402
 
403
403
  def self.find_by_site_id(site_id)
404
404
  properties = {}
405
- DB.connect[:sakai_site_property].where(:site_id => site_id).all.each do |row|
406
- properties[row[:name]] = row[:value].read
405
+ # HACK: reading blobs via OCI8 is really slow, make the db server do it!
406
+ # This is multiple orders of magnitude faster.
407
+ # But, this will break if the property value is > 4000chars and may not work
408
+ # on mysql, so here's the original version:
409
+ # DB.connect[:sakai_site_property].where(:site_id => site_id).all.each do |row|
410
+ # properties[row[:name]] = row[:value].read
411
+ # end
412
+ DB.connect[:sakai_site_property].
413
+ select(:name, :to_char.sql_function(:value).as(:value)).
414
+ where(:site_id => site_id).all.each do |row|
415
+ properties[row[:name]] = row[:value]
407
416
  end
408
417
  return properties
409
418
  end
@@ -2,7 +2,7 @@
2
2
  # SakaiInfo::Tool library
3
3
  #
4
4
  # Created 2012-03-08 daveadams@gmail.com
5
- # Last updated 2012-03-08 daveadams@gmail.com
5
+ # Last updated 2012-03-09 daveadams@gmail.com
6
6
  #
7
7
  # https://github.com/daveadams/sakai-info
8
8
  #
@@ -106,8 +106,17 @@ module SakaiInfo
106
106
 
107
107
  def self.find_by_tool_id(tool_id)
108
108
  properties = {}
109
- DB.connect[:sakai_site_tool_property].where(:tool_id => tool_id).all.each do |row|
110
- properties[row[:name]] = row[:value].read
109
+ # HACK: reading blobs via OCI8 is really slow, make the db server do it!
110
+ # This is multiple orders of magnitude faster.
111
+ # But, this will break if the property value is > 4000chars and may not work
112
+ # on mysql, so here's the original version:
113
+ # DB.connect[:sakai_site_tool_property].where(:tool_id => tool_id).all.each do |row|
114
+ # properties[row[:name]] = row[:value].read
115
+ # end
116
+ DB.connect[:sakai_site_tool_property].
117
+ select(:name, :to_char.sql_function(:value).as(:value)).
118
+ where(:tool_id => tool_id).all.each do |row|
119
+ properties[row[:name]] = row[:value]
111
120
  end
112
121
  return properties
113
122
  end
@@ -1,3 +1,3 @@
1
1
  module SakaiInfo
2
- VERSION = "0.3.2"
2
+ VERSION = "0.3.3"
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sakai-info
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 2
10
- version: 0.3.2
9
+ - 3
10
+ version: 0.3.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - David Adams
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-03-08 00:00:00 -06:00
18
+ date: 2012-03-09 00:00:00 -06:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency