jgrouper 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY.md CHANGED
@@ -1,46 +1,62 @@
1
1
  JGrouper History
2
2
  ================
3
3
 
4
+ 2013-08-15 JGrouper v0.5.0
5
+ --------------------------
6
+ * Add `JGrouper.start_root_session()`
7
+ * Add `JGrouper::Field`
8
+ * Add `JGrouper::Group#to_hash()`
9
+ * Add `JGrouper::Group#to_hash()`
10
+ * Add `JGrouper::GroupType`
11
+ * Add `JGrouper::Source`
12
+ * Add `JGrouper::Stem#root?()`
13
+ * Add `JGrouper::Stem#to_yaml()`
14
+ * Add `JGrouper::Stem#to_yaml()`
15
+ * Add `JGrouper::Subject#to_hash()`
16
+ * Add `JGrouper::Subject#to_yaml()`
17
+ * Update `JGrouper::Export` and `bin/jgrouper-export` to export to YAML
18
+
19
+
4
20
  2013-07-18 JGrouper v0.4.2
5
21
  --------------------------
6
- * Fix "JGrouper::AuditArchiver" end-of-day calculation
22
+ * Fix `JGrouper::AuditArchiver` end-of-day calculation
7
23
 
8
24
 
9
25
  2013-07-18 JGrouper v0.4.1
10
26
  --------------------------
11
- * Update "JGrouper::AuditArchiver" to detect re-archive attempts and increment date
12
- * Update "JGrouper::AuditArchiver" earliest entry detection (again)
27
+ * Update `JGrouper::AuditArchiver` to detect re-archive attempts and increment date
28
+ * Update `JGrouper::AuditArchiver` earliest entry detection (again)
13
29
 
14
30
 
15
31
  2013-07-05 JGrouper v0.4.0
16
32
  --------------------------
17
- * Add "--batch-size NUMBER" to "jgrouper-audit-archiver"
33
+ * Add `--batch-size NUMBER` to `jgrouper-audit-archiver`
18
34
  * Add more code examples
19
- * Update "JGrouper::AuditArchiver" to append to output files
20
- * Update "JGrouper::AuditArchiver" to lock output file
21
- * Update "JGrouper::AuditArchiver" to prune from database in batches to better support large datasets
22
- * Update "JGrouper::AuditArchiver" earliest entry detection
35
+ * Update `JGrouper::AuditArchiver` to append to output files
36
+ * Update `JGrouper::AuditArchiver` to lock output file
37
+ * Update `JGrouper::AuditArchiver` to prune from database in batches to better support large datasets
38
+ * Update `JGrouper::AuditArchiver` earliest entry detection
23
39
 
24
40
 
25
41
  2013-06-27 JGrouper v0.3.0
26
42
  --------------------------
27
- * Add "bin/jgrouper-grant"
28
- * Add *JGrouper::Group.find()*
29
- * Add *JGrouper::Group.grant()*
30
- * Add *JGrouper::Privilege*
31
- * Add *JGrouper::Stem.grant()*
32
- * Add *JGrouper::Subject*
33
- * Improve *JGrouper::Stem.find()* error handling
34
- * Fix various *to_s* bugs
35
- * Fix *JGrouper::Member.find()* error handling
36
- * Fix *JGrouper::Stem.stems()*
43
+ * Add `bin/jgrouper-grant`
44
+ * Add `JGrouper::Group.find()`
45
+ * Add `JGrouper::Group.grant()`
46
+ * Add `JGrouper::Privilege`
47
+ * Add `JGrouper::Stem.grant()`
48
+ * Add `JGrouper::Subject`
49
+ * Improve `JGrouper::Stem.find()` error handling
50
+ * Fix various `to_s` bugs
51
+ * Fix `JGrouper::Member.find()` error handling
52
+ * Fix `JGrouper::Stem.stems()`
37
53
 
38
54
 
39
55
  2013-05-17 JGrouper v0.2.0
40
56
  --------------------------
41
- * Add "-d directory" option to "jgrouper-audit-archiver"
42
- * Add "-n number of days" option to "jgrouper-audit-archiver"
43
- * Add "-S stop date" option to "jgrouper-audit-archiver"
57
+ * Add `-d directory` option to `jgrouper-audit-archiver`
58
+ * Add `-n number of days` option to `jgrouper-audit-archiver`
59
+ * Add `-S stop date` option to `jgrouper-audit-archiver`
44
60
 
45
61
 
46
62
  2013-05-15 JGrouper v0.1.1
@@ -52,65 +68,65 @@ JGrouper History
52
68
  --------------------------
53
69
  Starting over with a more clear design in mind.
54
70
 
55
- * Add "bin/jgrouper-audit-archiver"
56
- * Add "bin/jgrouper-export"
57
- * Add "JGrouper.home!()"
58
- * Add "JGrouper::AuditArchiver"
59
- * Add "JGrouper::Exporter"
60
- * Add "JGrouper::Group"
61
- * Add "JGrouper::Member"
62
- * Add "JGrouper::Member.find()"
63
- * Add "JGrouper::Stem"
64
- * Add "JGrouper::Stem.find()"
65
- * Add "JGrouper::Stem#groups()"
66
- * Add "JGrouper::Stem.root()"
67
- * Add "JGrouper::Stem#stems()"
71
+ * Add `bin/jgrouper-audit-archiver`
72
+ * Add `bin/jgrouper-export`
73
+ * Add `JGrouper.home!()`
74
+ * Add `JGrouper::AuditArchiver`
75
+ * Add `JGrouper::Exporter`
76
+ * Add `JGrouper::Group`
77
+ * Add `JGrouper::Member`
78
+ * Add `JGrouper::Member.find()`
79
+ * Add `JGrouper::Stem`
80
+ * Add `JGrouper::Stem.find()`
81
+ * Add `JGrouper::Stem#groups()`
82
+ * Add `JGrouper::Stem.root()`
83
+ * Add `JGrouper::Stem#stems()`
68
84
 
69
85
 
70
86
  2012-11-20 JGrouper v0.0.5
71
87
  --------------------------
72
- * Add *JGrouper::Group#add_type*
73
- * Add *JGrouper::Group#delete_type*
74
- * Add *JGrouper::Group#method_missing*
75
- * Add *JGrouper::Group#types*
76
- * Add *JGrouper::GroupType#method_missing*
77
- * Add *JGrouper::Stem#method_missing*
78
- * Add *JGrouper::Subject#method_missing*
79
- * Fix *JGrouper::Group* tests
88
+ * Add `JGrouper::Group#add_type`
89
+ * Add `JGrouper::Group#delete_type`
90
+ * Add `JGrouper::Group#method_missing`
91
+ * Add `JGrouper::Group#types`
92
+ * Add `JGrouper::GroupType#method_missing`
93
+ * Add `JGrouper::Stem#method_missing`
94
+ * Add `JGrouper::Subject#method_missing`
95
+ * Fix `JGrouper::Group` tests
80
96
 
81
97
 
82
98
  2012-10-04 JGrouper v0.0.4
83
99
  --------------------------
84
- * Add *JGrouper::Group*
85
- * Add *JGrouper::Group.find*
86
- * Add *JGrouper::Group* support to *JGrouper::Shell*
87
- * Extracted *JGrouper::Shell* to its own gem
100
+ * Add `JGrouper::Group`
101
+ * Add `JGrouper::Group.find`
102
+ * Add `JGrouper::Group` support to `JGrouper::Shell`
103
+ * Extracted `JGrouper::Shell` to its own gem
88
104
 
89
105
 
90
106
  2012-08-17 JGrouper v0.0.3
91
107
  --------------------------
92
- * Add *JGrouper::Shell*
93
- * Add *bin/jgrouper* interactive shell
94
- * Rename *JGrouper::Stem#root_stem* to *JGrouper::Stem#root*
95
- * Rename *JGrouper::Subject#root_subject* to *JGrouper::Subject#root*
96
- * Add *JGrouper::GroupType.delete(name)*
97
- * Add *JGrouper::Stem.create( name, display_name = nil )*
98
- * Add *JGrouper::Stem#add_stem( name, display_name = nil )*
99
- * Add *JGrouper::Stem.find(name)*
100
- * Add *JGrouper::Subject::TestCase*
101
- * Add *JGrouper::GroupType::TestCase*
102
- * Add *JGrouper::Stem::TestCase*
108
+ * Add `JGrouper::Shell`
109
+ * Add `bin/jgrouper` interactive shell
110
+ * Rename `JGrouper::Stem#root_stem` to `JGrouper::Stem#root`
111
+ * Rename `JGrouper::Subject#root_subject` to `JGrouper::Subject#root`
112
+ * Add `JGrouper::GroupType.delete(name)`
113
+ * Add `JGrouper::Stem.create( name, display_name = nil )`
114
+ * Add `JGrouper::Stem#add_stem( name, display_name = nil )`
115
+ * Add `JGrouper::Stem.find(name)`
116
+ * Add `JGrouper::Subject::TestCase`
117
+ * Add `JGrouper::GroupType::TestCase`
118
+ * Add `JGrouper::Stem::TestCase`
103
119
 
104
120
 
105
121
  2012-08-10 JGrouper v0.0.2
106
122
  --------------------------
107
- * Add *JGrouper::GroupType*
108
- * Add *JGrouper::Stem#to_json*
109
- * Add *JGrouper::Subject#to_json*
123
+ * Add `JGrouper::GroupType`
124
+ * Add `JGrouper::Stem#to_json`
125
+ * Add `JGrouper::Subject#to_json`
110
126
 
111
127
 
112
128
  2012-08-10 JGrouper v0.0.1
113
129
  --------------------------
114
- * Add *JGrouper::Stem.root_stem*
115
- * Add *JGrouper::Subject.root_subject*
130
+ * Add `JGrouper::Stem.root_stem`
131
+ * Add `JGrouper::Subject.root_subject`
116
132
 
data/README.rdoc CHANGED
@@ -71,15 +71,24 @@
71
71
  archiver.archive { |entry| ... audit log entry being archived ... }
72
72
  end
73
73
 
74
+ === Exporter
75
+
76
+ require 'jgrouper'
77
+ require 'jgrouper/exporter'
78
+
79
+ JGrouper::Exporter do |exporter|
80
+ exporter.export 'stem:to:export', lambda { |_| puts _.to_yaml }
81
+ end
82
+
74
83
  === Scripts
75
84
 
76
85
  Archive Grouper audit log entries to disk:
77
86
 
78
87
  % jgrouper-audit-archiver -h
79
88
 
80
- Export (some of the) Groups registry to CSV:
89
+ Export Groups registry to YAML:
81
90
 
82
- % jgrouper-exporter -h
91
+ % jgrouper-export -h
83
92
 
84
93
  Grant privileges:
85
94
 
data/bin/jgrouper-export CHANGED
@@ -3,19 +3,26 @@
3
3
  require 'jgrouper'
4
4
  require 'jgrouper/exporter'
5
5
  require 'optparse'
6
+ require 'thread'
7
+ require 'yaml'
6
8
 
7
9
 
8
10
  JGrouper::Exporter.new do |exporter|
9
11
 
12
+ directory = Dir.pwd
13
+
10
14
  opts = OptionParser.new do |opts|
11
15
  opts.banner = "USAGE: #{ File.basename(__FILE__) } [-h]"
12
16
 
17
+ opts.on( '-d', '--directory DIR', 'Write output to this directory [DEFAULT: .]' ) do |value|
18
+ directory = value
19
+ end
13
20
  opts.on_tail('-h', '--help', "Show this message") do
14
21
  puts opts
15
22
  exit
16
23
  end
17
- opts.on_tail( '-v', '--[no-]verbose', 'Enable verbose mode [DEFAULT: no]' ) do |verbose|
18
- exporter.verbose = verbose
24
+ opts.on_tail( '-v', '--[no-]verbose', 'Enable verbose mode [DEFAULT: no]' ) do |value|
25
+ exporter.verbose = value
19
26
  end
20
27
  end.parse!
21
28
 
@@ -27,7 +34,41 @@ JGrouper::Exporter.new do |exporter|
27
34
  exit 1
28
35
  end
29
36
 
30
- exporter.export ARGV.shift
37
+ raise "ERROR: directory does not exist - #{directory}" unless File.directory?(directory)
38
+
39
+ done = false
40
+ queue = Queue.new
41
+
42
+ Thread.abort_on_exception = true
43
+ consumer = Thread.new do
44
+ JGrouper.start_root_session
45
+
46
+ # TODO GzipWriter?
47
+ fn = File.join directory, 'jgrouper-export.yaml'
48
+ File.open( fn, 'w' ) do |fh|
49
+ fh.flock File::LOCK_EX
50
+
51
+ loop do
52
+ while queue.size > 0
53
+ value = queue.pop
54
+ fh.puts value.to_yaml
55
+ end
56
+ if done && queue.empty?
57
+ break
58
+ end
59
+ sleep 0.1
60
+ end
61
+
62
+ fh.flock File::LOCK_UN
63
+ end
64
+ end
65
+ producer = Thread.new do
66
+ exporter.export base: ARGV.shift, block: lambda { |_| queue << _ ; sleep 0.1 if queue.size > 100 }
67
+ done = true
68
+ Thread.stop
69
+ end
70
+ consumer.join
71
+
31
72
  end
32
73
 
33
74
  # vim: syntax=ruby
@@ -1,8 +1,7 @@
1
- require 'csv'
2
1
 
3
2
  module JGrouper # :nodoc:
4
3
  #
5
- # = JGrouper::Exporter - Export (some of the) Groups registry to CSV
4
+ # = JGrouper::Exporter - Export Groups registry.
6
5
  #
7
6
  # == USAGE
8
7
  #
@@ -10,7 +9,7 @@ module JGrouper # :nodoc:
10
9
  # require 'jgrouper/exporter'
11
10
  #
12
11
  # JGrouper::Exporter do |exporter|
13
- # exporter.export 'stem:to:export'
12
+ # exporter.export 'stem:to:export', lambda { |_| puts _.to_yaml }
14
13
  # end
15
14
  #
16
15
  class Exporter
@@ -18,55 +17,55 @@ module JGrouper # :nodoc:
18
17
  attr_writer :verbose
19
18
 
20
19
  def initialize
21
- @directory = Dir.pwd
22
- @fh = nil
23
- @verbose = false
20
+ @verbose = false
24
21
  yield self if block_given?
25
22
  self
26
23
  end
27
24
 
28
25
  #
29
- # Export (some of the) Groups registry to CSV.
26
+ # Export Groups registry.
30
27
  #
31
- def export( base = nil )
32
- entries = []
33
-
34
- filehandle @directory, "jgrouper-export.csv" do
35
- stem = base.nil? ? Stem.root : Stem.find(base)
36
- raise "ERROR: stem not found" if stem.nil?
37
- log "exporting stem=#{stem.name} ..."
38
-
39
- raise "NOT IMPLEMENTED - exporting child stems" if stem.stems.size > 0
28
+ def export(params)
29
+ stem = params[:base] ? Stem.find( params[:base] ) : Stem.root
30
+ raise "ERROR: stem not found" if stem.nil?
31
+ raise "ERROR: :block not specified" unless params[:block]
32
+ raise "ERROR: :block is not a block" unless params[:block].kind_of?(Proc)
33
+
34
+ # TODO Multiple readers?
35
+ txt = stem.root? ? 'root stem' : "stem #{stem.name}"
36
+ log "exporting #{txt} ..."
37
+ if stem.root? # TODO Configurable?
38
+ export_group_types params[:block]
39
+ export_sources params[:block]
40
+ end
41
+ export_stem stem, params[:block]
42
+ log "exporting #{txt} - done"
40
43
 
41
- groups = stem.groups do |child|
42
- g = %w( display_extension extension name ).collect { |k| child.send(k) }
43
- g << CSV.generate_line( child.members.collect { |m| "#{ m.subject_source_id }|#{ m.subject_type_id }|#{ m.subject_id }" } ).chomp
44
+ end
44
45
 
45
- entries << CSV.generate_line(g)
46
- @fh.puts entries.last
47
- yield entries.last if block_given?
48
- end
46
+ # Export group types.
47
+ def export_group_types(p)
48
+ log 'exporting group types ...'
49
+ p.call JGrouper::GroupType
50
+ end
49
51
 
50
- log "exporting stem=#{stem.name} - done"
51
- end
52
+ # Export subject sources.
53
+ def export_sources(p)
54
+ log 'exporting subject sources ...'
55
+ p.call JGrouper::Source
56
+ end
52
57
 
53
- entries
58
+ # Export stem and childen.
59
+ def export_stem( stem, p )
60
+ log "exporting stem #{stem.name} ..."
61
+ p.call stem
62
+ stem.groups { |child| p.call child }
63
+ stem.stems { |child| export_stem(child, p) }
54
64
  end
55
65
 
56
66
 
57
67
  private
58
68
 
59
- #
60
- # Open filehandle for writing or raise exception if a) directory does not exist or b) file does exist.
61
- # TODO DRY
62
- #
63
- def filehandle(directory, file)
64
- raise "ERROR: directory does not exist - #{directory}" unless File.directory?(directory)
65
- fn = File.join directory, file
66
- raise "ERROR: file already exists - #{fn}" if File.exists?(fn)
67
- File.open(fn, 'w') { |fh| @fh = fh ; yield self ; @fh = nil }
68
- end
69
-
70
69
  # TODO Use Logger...
71
70
  # TODO DRY
72
71
  def log(msg)
@@ -0,0 +1,54 @@
1
+
2
+ module JGrouper # :nodoc:
3
+
4
+ #
5
+ # = JGrouper::Field - Grouper Group Field
6
+ #
7
+ # == Usage
8
+ #
9
+ # require 'jgrouper'
10
+ #
11
+ # TODO
12
+ #
13
+ class Field
14
+
15
+ def initialize( obj = nil )
16
+ @obj = obj
17
+ yield self if block_given?
18
+ self
19
+ end
20
+
21
+ #
22
+ # For passing methods on to Grouper Field object.
23
+ #
24
+ def method_missing(meth, *args, &block)
25
+ super if @obj.nil?
26
+ begin
27
+ block.call @obj.send(meth, *args) if block
28
+ @obj.send(meth, *args)
29
+ rescue NoMethodError
30
+ super
31
+ end
32
+ end
33
+
34
+ def to_hash
35
+ {
36
+ 'kind' => 'field',
37
+ 'name' => @obj.get_name,
38
+ 'uuid' => @obj.get_uuid,
39
+ 'nullable' => @obj.get_is_nullable,
40
+ 'required' => @obj.get_required,
41
+ 'privilege' => {
42
+ 'read' => @obj.get_read_privilege,
43
+ 'write' => @obj.get_write_privilege
44
+ }
45
+ }
46
+ end
47
+
48
+ def to_yaml
49
+ to_hash.to_yaml
50
+ end
51
+
52
+ end
53
+ end
54
+
@@ -1,4 +1,3 @@
1
- require 'csv'
2
1
 
3
2
  module JGrouper # :nodoc:
4
3
 
@@ -24,7 +23,7 @@ module JGrouper # :nodoc:
24
23
  #
25
24
  def self.find(name)
26
25
  begin
27
- obj = JGroupFinder.find_by_name GrouperSession.start_root_session, name, false
26
+ obj = JGroupFinder.find_by_name JGrouper.start_root_session, name, false
28
27
  rescue => e
29
28
  warn "JGrouper::Group.find(#{name}) => #{e}"
30
29
  end
@@ -51,11 +50,85 @@ module JGrouper # :nodoc:
51
50
  end
52
51
  end
53
52
 
53
+ def to_hash
54
+ begin
55
+ mod_subj = JGrouper::Subject.new( @obj.get_modify_subject )
56
+ rescue edu.internet2.middleware.subject.SubjectNotFoundException
57
+ mod_subj = nil
58
+ end
59
+
60
+ hash = {
61
+ 'kind' => 'group',
62
+ 'uuid' => @obj.get_uuid,
63
+ 'name' => @obj.get_name,
64
+ 'display_name' => @obj.get_display_name,
65
+ 'extension' => @obj.get_extension,
66
+ 'display_extension' => @obj.get_display_extension,
67
+ 'description' => @obj.get_description,
68
+ 'parent' => {
69
+ 'name' => @obj.get_parent_stem_name,
70
+ 'uuid' => @obj.get_parent_uuid,
71
+ },
72
+ 'create' => {
73
+ 'subject' => JGrouper::Subject.new( @obj.get_create_subject ).to_hash,
74
+ 'time' => Time.at( @obj.get_create_time_long / 1000 ).to_datetime.rfc3339
75
+ }
76
+ }
77
+
78
+ begin
79
+ mod_subj = JGrouper::Subject.new( @obj.get_modify_subject )
80
+ hash['modify'] = {
81
+ 'subject' => mod_subj ? mod_subj.to_hash : nil,
82
+ 'time' => Time.at( @obj.get_modify_time_long / 1000 ).to_datetime.rfc3339
83
+ }
84
+ rescue
85
+ end
86
+
87
+ # TODO Ugly
88
+ unless @obj.get_admins.empty? &&
89
+ @obj.get_optins.empty? &&
90
+ @obj.get_optouts.empty? &&
91
+ @obj.get_readers.empty? &&
92
+ @obj.get_updaters.empty &&
93
+ @obj.get_viewers.empty?
94
+ hash['privileges'] = {}
95
+ hash['privileges']['admin'] = @obj.get_admins.collect { |_| JGrouper::Subject.new(_).to_hash } unless @obj.get_admins.empty?
96
+ hash['privileges']['optin'] = @obj.get_optins.collect { |_| JGrouper::Subject.new(_).to_hash } unless @obj.get_optins.empty?
97
+ hash['privileges']['optout'] = @obj.get_optouts.collect { |_| JGrouper::Subject.new(_).to_hash } unless @obj.get_optouts.empty?
98
+ hash['privileges']['read'] = @obj.get_readers.collect { |_| JGrouper::Subject.new(_).to_hash } unless @obj.get_readers.empty?
99
+ hash['privileges']['update'] = @obj.get_updaters.collect { |_| JGrouper::Subject.new(_).to_hash } unless @obj.get_updaters.empty?
100
+ hash['privileges']['view'] = @obj.get_viewers.collect { |_| JGrouper::Subject.new(_).to_hash } unless @obj.get_viewers.empty?
101
+ end
102
+
103
+ hash['types'] = @obj.get_removable_types.collect { |_| { 'name' => _.get_name, 'uuid' => _.get_uuid } } unless @obj.get_removable_types.empty?
104
+ hash['attributes'] = @obj.get_attributes_map(false).inject({}) { |h, (k,v)| h[k] = v.get_value ; h } unless @obj.get_attributes_map(false).empty?
105
+ hash['alternate_names'] = @obj.get_alternate_names.collect { |_| _ } unless @obj.get_alternate_names.empty?
106
+
107
+ hash['role'] = 'role' if 'role' == @obj.get_type_of_group.to_string
108
+
109
+ composite = @obj.get_composite(false)
110
+ if composite
111
+ hash['composite'] = {
112
+ 'type' => composite.get_type.get_name,
113
+ 'left' => { 'name' => composite.get_left_group.get_name, 'uuid' => composite.get_left_group.get_uuid },
114
+ 'right' => { 'name' => composite.get_right_group.get_name, 'uuid' => composite.get_right_group.get_uuid }
115
+ }
116
+ else
117
+ hash['members'] = @obj.get_immediate_members.collect { |_| JGrouper::Subject.new( _.get_subject ).to_hash } unless @obj.get_immediate_members.empty?
118
+ end
119
+
120
+ hash
121
+ end
122
+
54
123
  def to_s
55
124
  return nil if @obj.nil?
56
125
  %w( name display_name uuid ).collect { |k| "#{k}=#{ self.send(k) }" }.to_csv.chomp
57
126
  end
58
127
 
128
+ def to_yaml
129
+ to_hash.to_yaml
130
+ end
131
+
59
132
  end
60
133
  end
61
134
 
@@ -0,0 +1,87 @@
1
+
2
+ module JGrouper # :nodoc:
3
+
4
+ #
5
+ # = JGrouper::GroupType - Grouper Group Type
6
+ #
7
+ # == Usage
8
+ #
9
+ # require 'jgrouper'
10
+ #
11
+ # TODO
12
+ #
13
+ class GroupType
14
+
15
+ def initialize( obj = nil )
16
+ @obj = obj
17
+ yield self if block_given?
18
+ self
19
+ end
20
+
21
+ #
22
+ # Find all group types.
23
+ #
24
+ def self.all
25
+ JGroupTypeFinder.find_all.collect { |_| self.new _ }
26
+ end
27
+
28
+ #
29
+ # Find group type by name. Returns +JGrouper::GroupType+ or +nil+.
30
+ #
31
+ def self.find(name)
32
+ begin
33
+ obj = JGroupTypeFinder.find name, false
34
+ rescue => e
35
+ warn "JGrouper::GroupType.find(#{name}) => #{e}"
36
+ end
37
+ return nil if obj.nil?
38
+ group_type = self.new obj
39
+ yield group_type if block_given?
40
+ group_type
41
+ end
42
+
43
+ #
44
+ # For passing methods on to Grouper GroupType object.
45
+ #
46
+ def method_missing(meth, *args, &block)
47
+ super if @obj.nil?
48
+ begin
49
+ block.call @obj.send(meth, *args) if block
50
+ @obj.send(meth, *args)
51
+ rescue NoMethodError
52
+ super
53
+ end
54
+ end
55
+
56
+ def to_hash
57
+ hash = {
58
+ 'kind' => 'group_type',
59
+ 'name' => @obj.get_name,
60
+ 'uuid' => @obj.get_uuid,
61
+ 'assignable' => @obj.get_is_assignable,
62
+ 'internal' => @obj.get_is_internal,
63
+ 'create' => {
64
+ 'uuid' => @obj.get_creator_uuid,
65
+ 'time' => Time.at( @obj.get_create_time / 1000 ).to_datetime.rfc3339
66
+ }
67
+ }
68
+ unless @obj.get_fields.empty?
69
+ hash['fields'] = @obj.get_fields.collect { |_| JGrouper::Field.new(_).to_hash }
70
+ end
71
+ hash
72
+ end
73
+
74
+ def self.to_yaml
75
+ {
76
+ 'kind' => 'group_types',
77
+ 'group_types' => all.collect { |_| self.new(_).to_hash }
78
+ }.to_yaml
79
+ end
80
+
81
+ def to_yaml
82
+ to_hash.to_yaml
83
+ end
84
+
85
+ end
86
+ end
87
+
@@ -23,7 +23,7 @@ module JGrouper # :nodoc:
23
23
  #
24
24
  def self.find(uuid)
25
25
  begin
26
- m = MemberFinder.find_by_uuid GrouperSession.start_root_session, uuid, false
26
+ m = MemberFinder.find_by_uuid JGrouper.start_root_session, uuid, false
27
27
  rescue => e
28
28
  warn "JGrouper::Member.find(#{uuid}) => #{e}"
29
29
  end
@@ -0,0 +1,63 @@
1
+
2
+ module JGrouper # :nodoc:
3
+
4
+ #
5
+ # = JGrouper::Source - Grouper Subject Source
6
+ #
7
+ # == Usage
8
+ #
9
+ # require 'jgrouper'
10
+ #
11
+ # TODO
12
+ #
13
+ class Source
14
+
15
+ def initialize( obj = nil )
16
+ @obj = obj
17
+ yield self if block_given?
18
+ self
19
+ end
20
+
21
+ #
22
+ # Find all subject sources.
23
+ #
24
+ def self.all
25
+ JSourceManager.get_instance.get_sources.collect { |_| self.new _ }
26
+ end
27
+
28
+ #
29
+ # For passing methods on to Grouper Source object.
30
+ #
31
+ def method_missing(meth, *args, &block)
32
+ super if @obj.nil?
33
+ begin
34
+ block.call @obj.send(meth, *args) if block
35
+ @obj.send(meth, *args)
36
+ rescue NoMethodError
37
+ super
38
+ end
39
+ end
40
+
41
+ def to_hash
42
+ {
43
+ 'kind' => 'source',
44
+ 'id' => @obj.get_id,
45
+ 'name' => @obj.get_name,
46
+ 'init_params' => @obj.get_init_params.inject({}) { |h, (k,v)| h[k] = v ; h }
47
+ }
48
+ end
49
+
50
+ def self.to_yaml
51
+ {
52
+ 'kind' => 'sources',
53
+ 'sources' => all.collect { |_| self.new(_).to_hash }
54
+ }.to_yaml
55
+ end
56
+
57
+ def to_yaml
58
+ to_hash.to_yaml
59
+ end
60
+
61
+ end
62
+ end
63
+
data/lib/jgrouper/stem.rb CHANGED
@@ -24,7 +24,7 @@ module JGrouper # :nodoc:
24
24
  #
25
25
  def self.find(name)
26
26
  begin
27
- obj = StemFinder.find_by_name GrouperSession.start_root_session, name, false
27
+ obj = StemFinder.find_by_name JGrouper.start_root_session, name, false
28
28
  rescue => e
29
29
  warn "JGrouper::Group.find(#{name}) => #{e}"
30
30
  end
@@ -66,13 +66,20 @@ module JGrouper # :nodoc:
66
66
  # Find Grouper root stem. Returns +JGrouper::Stem+ or +nil+.
67
67
  #
68
68
  def self.root
69
- obj = StemFinder.find_root_stem GrouperSession.start_root_session
69
+ obj = StemFinder.find_root_stem JGrouper.start_root_session
70
70
  return nil if obj.nil?
71
71
  stem = self.new obj
72
72
  yield stem if block_given?
73
73
  stem
74
74
  end
75
75
 
76
+ #
77
+ # Is this the root stem?
78
+ #
79
+ def root?
80
+ name.empty?
81
+ end
82
+
76
83
  #
77
84
  # Yield child stems.
78
85
  #
@@ -84,11 +91,55 @@ module JGrouper # :nodoc:
84
91
  end
85
92
  end
86
93
 
94
+ def to_hash
95
+ hash = {
96
+ 'kind' => 'stem',
97
+ 'uuid' => @obj.get_uuid,
98
+ 'name' => @obj.get_name,
99
+ 'display_name' => @obj.get_display_name,
100
+ 'extension' => @obj.get_extension,
101
+ 'display_extension' => @obj.get_display_extension
102
+ }
103
+
104
+ hash['description'] = @obj.get_description unless @obj.get_description.empty?
105
+
106
+ hash['create'] = {
107
+ 'subject' => JGrouper::Subject.new( @obj.get_create_subject ).to_hash,
108
+ 'time' => Time.at( @obj.get_create_time_long / 1000 ).to_datetime.rfc3339
109
+ }
110
+
111
+ begin
112
+ mod_subj = JGrouper::Subject.new( @obj.get_modify_subject )
113
+ hash['modify'] = {
114
+ 'subject' => mod_subj ? mod_subj.to_hash : nil,
115
+ 'time' => Time.at( @obj.get_modify_time_long / 1000 ).to_datetime.rfc3339
116
+ }
117
+ rescue
118
+ end
119
+
120
+ unless @obj.get_creators.empty? && @obj.get_stemmers.empty?
121
+ hash['privileges'] = {}
122
+ hash['privileges']['create'] = @obj.get_creators.collect { |_| JGrouper::Subject.new(_).to_hash } unless @obj.get_creators.empty?
123
+ hash['privileges']['stem'] = @obj.get_stemmers.collect { |_| JGrouper::Subject.new(_).to_hash } unless @obj.get_stemmers.empty?
124
+ end
125
+
126
+ hash['stems'] = @obj.child_stems.collect { |_| { 'name' => _.get_name, 'uuid' => _.get_uuid } } unless @obj.child_stems.empty?
127
+ hash['groups'] = @obj.child_groups.collect { |_| { 'name' => _.get_name, 'uuid' => _.get_uuid } } unless @obj.child_groups.empty?
128
+
129
+ hash['parent'] = { 'name' => @obj.get_parent_stem.get_name, 'uuid' => @obj.get_parent_uuid } unless root?
130
+
131
+ hash
132
+ end
133
+
87
134
  def to_s
88
135
  return nil if @obj.nil?
89
136
  %w( name display_name uuid ).collect { |k| "#{k}=#{ self.send(k) }" }.to_csv.chomp
90
137
  end
91
138
 
139
+ def to_yaml
140
+ to_hash.to_yaml
141
+ end
142
+
92
143
  end
93
144
  end
94
145
 
@@ -48,11 +48,24 @@ module JGrouper # :nodoc:
48
48
 
49
49
  def to_grouper; @obj; end
50
50
 
51
+ def to_hash
52
+ {
53
+ 'kind' => 'subject',
54
+ 'id' => @obj.get_id,
55
+ 'source' => @obj.get_source_id,
56
+ 'type' => @obj.get_type_name
57
+ }
58
+ end
59
+
51
60
  def to_s
52
61
  return nil if @obj.nil?
53
62
  %w( id type_name source_id name ).collect { |k| "#{k}=#{ self.send(k) }" }.to_csv.chomp
54
63
  end
55
64
 
65
+ def to_yaml
66
+ to_hash.to_yaml
67
+ end
68
+
56
69
  end
57
70
  end
58
71
 
@@ -1,4 +1,4 @@
1
1
  module JGrouper
2
- VERSION = '0.4.2'
2
+ VERSION = '0.5.0'
3
3
  end
4
4
 
data/lib/jgrouper.rb CHANGED
@@ -1,8 +1,11 @@
1
1
  require 'java'
2
2
 
3
+ require 'jgrouper/field'
3
4
  require 'jgrouper/group'
5
+ require 'jgrouper/group_type'
4
6
  require 'jgrouper/member'
5
7
  require 'jgrouper/privilege'
8
+ require 'jgrouper/source'
6
9
  require 'jgrouper/stem'
7
10
  require 'jgrouper/subject'
8
11
  require 'jgrouper/version'
@@ -81,15 +84,24 @@ require 'jgrouper/version'
81
84
  # archiver.archive { |entry| ... audit log entry being archived ... }
82
85
  # end
83
86
  #
87
+ # === Exporter
88
+ #
89
+ # require 'jgrouper'
90
+ # require 'jgrouper/exporter'
91
+ #
92
+ # JGrouper::Exporter do |exporter|
93
+ # exporter.export 'stem:to:export', lambda { |_| puts _.to_yaml }
94
+ # end
95
+ #
84
96
  # === Scripts
85
97
  #
86
98
  # Archive Grouper audit log entries to disk:
87
99
  #
88
100
  # % jgrouper-audit-archiver -h
89
101
  #
90
- # Export (some of the) Groups registry to CSV:
102
+ # Export Groups registry to YAML:
91
103
  #
92
- # % jgrouper-exporter -h
104
+ # % jgrouper-export -h
93
105
  #
94
106
  # Grant privileges:
95
107
  #
@@ -158,13 +170,22 @@ module JGrouper
158
170
 
159
171
  # TODO Do this for everything?
160
172
  %w(
173
+ edu.internet2.middleware.grouper.Field
161
174
  edu.internet2.middleware.grouper.GroupFinder
175
+ edu.internet2.middleware.grouper.GroupTypeFinder
162
176
  edu.internet2.middleware.grouper.privs.Privilege
177
+ edu.internet2.middleware.subject.provider.SourceManager
163
178
  ).each do |klass|
164
179
  java_import klass do |pkg, cls| "J#{cls}"; end
165
180
  end
166
181
  end
167
182
 
183
+ # TODO Block method?
184
+ def self.start_root_session
185
+ # TODO Block method?
186
+ GrouperSession.start_root_session
187
+ end
188
+
168
189
  end
169
190
 
170
191
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jgrouper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.5.0
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: 2013-07-18 00:00:00.000000000 Z
12
+ date: 2013-08-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: jruby-jars
@@ -100,9 +100,12 @@ files:
100
100
  - lib/jgrouper.rb
101
101
  - lib/jgrouper/audit_archiver.rb
102
102
  - lib/jgrouper/exporter.rb
103
+ - lib/jgrouper/field.rb
103
104
  - lib/jgrouper/group.rb
105
+ - lib/jgrouper/group_type.rb
104
106
  - lib/jgrouper/member.rb
105
107
  - lib/jgrouper/privilege.rb
108
+ - lib/jgrouper/source.rb
106
109
  - lib/jgrouper/stem.rb
107
110
  - lib/jgrouper/subject.rb
108
111
  - lib/jgrouper/version.rb