cim 0.3.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +4 -0
- data/History.txt +19 -0
- data/LICENSE +58 -0
- data/README.rdoc +24 -8
- data/Rakefile +3 -23
- data/cim.gemspec +27 -0
- data/lib/cim.rb +54 -23
- data/lib/cim/association.rb +27 -1
- data/lib/cim/class.rb +51 -8
- data/lib/cim/class_feature.rb +40 -11
- data/lib/cim/indication.rb +14 -0
- data/lib/cim/instance.rb +18 -2
- data/lib/cim/method.rb +28 -1
- data/lib/cim/named_element.rb +55 -7
- data/lib/cim/property.rb +27 -5
- data/lib/cim/qualifier.rb +47 -2
- data/lib/cim/qualifier_declaration.rb +59 -13
- data/lib/cim/qualifier_flavors.rb +84 -10
- data/lib/cim/qualifier_scopes.rb +87 -0
- data/lib/cim/qualifier_set.rb +73 -0
- data/lib/cim/reference.rb +18 -0
- data/lib/cim/type.rb +82 -1
- data/lib/cim/variant.rb +39 -0
- data/tasks/clean.rake +9 -0
- data/tasks/doc.rake +14 -0
- data/tasks/test.rake +6 -0
- data/test/test_method.rb +2 -1
- data/test/test_qualifier_set.rb +39 -0
- metadata +37 -67
- data/Manifest.txt +0 -27
- data/lib/cim/qualifier_scope.rb +0 -37
- data/lib/cim/qualifiers.rb +0 -53
@@ -0,0 +1,87 @@
|
|
1
|
+
#
|
2
|
+
# cim/qualifier_scopes.rb - class CIM::QualifierScopes, class CIM::QualifierScopesError
|
3
|
+
#
|
4
|
+
# A pure-Ruby implementation of the CIM meta model.
|
5
|
+
#
|
6
|
+
# Copyright (c) 2010 Klaus Kämpf <kkaempf@suse.de>
|
7
|
+
#
|
8
|
+
# Licensed under the Ruby license
|
9
|
+
#
|
10
|
+
module CIM
|
11
|
+
|
12
|
+
class QualifierScopesError < ArgumentError
|
13
|
+
#
|
14
|
+
# Raised if wrong Scope passed
|
15
|
+
#
|
16
|
+
def initialize element, msg = nil
|
17
|
+
@element = element
|
18
|
+
super msg
|
19
|
+
end
|
20
|
+
def to_s
|
21
|
+
"#{@element} is not a valid meta element for scopes"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class QualifierScopes
|
26
|
+
META_ELEMENTS = [ :schema, :class, :association, :indication, :qualifier, :property, :reference, :method, :parameter, :any ]
|
27
|
+
attr_reader :elements
|
28
|
+
#
|
29
|
+
# call-seq:
|
30
|
+
# QualifierScopes.new => qualifier_scopes
|
31
|
+
# QualifierScopes.new(:association) => qualifier_scopes
|
32
|
+
# QualifierScopes.new("association") => qualifier_scopes
|
33
|
+
# QualifierScopes.new("Association") => qualifier_scopes
|
34
|
+
#
|
35
|
+
# raises QualifierScopesError
|
36
|
+
#
|
37
|
+
def initialize *elements
|
38
|
+
@elements = []
|
39
|
+
elements.flatten.each do |element|
|
40
|
+
self << element
|
41
|
+
end
|
42
|
+
end
|
43
|
+
#
|
44
|
+
# call-seq:
|
45
|
+
# qualifier_scopes << :association
|
46
|
+
# qualifier_scopes << "association"
|
47
|
+
# qualifier_scopes << "Association"
|
48
|
+
#
|
49
|
+
# raises QualifierScopesError
|
50
|
+
#
|
51
|
+
def << element
|
52
|
+
@elements << (normalize element)
|
53
|
+
self
|
54
|
+
end
|
55
|
+
#
|
56
|
+
# call-seq:
|
57
|
+
# qualifier_scopes.has? :association
|
58
|
+
# qualifier_scopes.has? "association"
|
59
|
+
# qualifier_scopes.has? "Association"
|
60
|
+
#
|
61
|
+
# raises QualifierScopesError
|
62
|
+
#
|
63
|
+
def include? element
|
64
|
+
@elements.include?(normalize element)
|
65
|
+
end
|
66
|
+
alias includes? include?
|
67
|
+
#
|
68
|
+
# Number of scopes
|
69
|
+
#
|
70
|
+
def size
|
71
|
+
@elements.size
|
72
|
+
end
|
73
|
+
#
|
74
|
+
# returns a string representation in MOF syntax format
|
75
|
+
#
|
76
|
+
def to_s
|
77
|
+
"Scope(#{@elements.join(', ')})"
|
78
|
+
end
|
79
|
+
private
|
80
|
+
def normalize element
|
81
|
+
element.downcase! if element.is_a?(String)
|
82
|
+
e = element.to_sym
|
83
|
+
raise QualifierScopesError.new(element) unless META_ELEMENTS.include?(e)
|
84
|
+
e
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
#
|
2
|
+
# cim/qualifier_set.rb - class CIM::QualifierSet
|
3
|
+
#
|
4
|
+
# A pure-Ruby implementation of the CIM meta model.
|
5
|
+
#
|
6
|
+
# Copyright (c) 2010 Klaus Kämpf <kkaempf@suse.de>
|
7
|
+
#
|
8
|
+
# Licensed under the Ruby license
|
9
|
+
#
|
10
|
+
module CIM
|
11
|
+
#
|
12
|
+
# Set of Qualifier
|
13
|
+
#
|
14
|
+
class QualifierSet < ::Array
|
15
|
+
def initialize *args
|
16
|
+
super 0
|
17
|
+
args.flatten.each do |q|
|
18
|
+
case q
|
19
|
+
when QualifierDeclaration: q = Qualifier.new q
|
20
|
+
when Qualifier:
|
21
|
+
else
|
22
|
+
q = Qualifier.new(QualifierDeclaration.new q)
|
23
|
+
end
|
24
|
+
self << q
|
25
|
+
end
|
26
|
+
end
|
27
|
+
#
|
28
|
+
# check if qualifier exists
|
29
|
+
#
|
30
|
+
# call-seq:
|
31
|
+
# qualifier_set.includes?(qualifier) => bool
|
32
|
+
# qualifier_set.includes?(qualifier_declaration) => bool
|
33
|
+
# qualifier_set.includes?(:description) => bool
|
34
|
+
# qualifier_set.includes?("description", :string) => bool
|
35
|
+
#
|
36
|
+
def includes? qualifier,type=nil
|
37
|
+
(self[qualifier,type]) ? true : false
|
38
|
+
end
|
39
|
+
alias include? includes?
|
40
|
+
#
|
41
|
+
# get qualifier by name and type
|
42
|
+
#
|
43
|
+
def [] qualifier,type=nil
|
44
|
+
self.each do |q|
|
45
|
+
unless type.nil?
|
46
|
+
next unless q.type == type
|
47
|
+
end
|
48
|
+
# puts "#{q} == #{qualifier}<#{type}>"
|
49
|
+
return q if case qualifier
|
50
|
+
when CIM::Qualifier
|
51
|
+
q == qualifier.declaration
|
52
|
+
when CIM::QualifierDeclaration
|
53
|
+
q == qualifier
|
54
|
+
when String
|
55
|
+
q.declaration == qualifier
|
56
|
+
when Symbol
|
57
|
+
q.declaration == qualifier
|
58
|
+
else
|
59
|
+
raise "Unknown parameter in #{self.class}[]"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
nil
|
63
|
+
end
|
64
|
+
#
|
65
|
+
# returns a string representation in MOF syntax format
|
66
|
+
#
|
67
|
+
def to_s
|
68
|
+
return "" if self.empty?
|
69
|
+
q = self.join(", ")
|
70
|
+
return "[#{q}]"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/lib/cim/reference.rb
CHANGED
@@ -1,5 +1,23 @@
|
|
1
|
+
#
|
2
|
+
# cim/reference.rb - class CIM::Reference
|
3
|
+
#
|
4
|
+
# A pure-Ruby implementation of the CIM meta model.
|
5
|
+
#
|
6
|
+
# Copyright (c) 2010 Klaus Kämpf <kkaempf@suse.de>
|
7
|
+
#
|
8
|
+
# Licensed under the Ruby license
|
9
|
+
#
|
1
10
|
module CIM
|
11
|
+
#
|
12
|
+
# Reference is a pointer (reference) to a Class
|
13
|
+
#
|
14
|
+
# A Reference is a special type of Property reserved for
|
15
|
+
# use in Associations
|
16
|
+
#
|
2
17
|
class Reference < CIM::Property
|
18
|
+
#
|
19
|
+
# Identifies a Property as a Reference
|
20
|
+
#
|
3
21
|
def reference?
|
4
22
|
true
|
5
23
|
end
|
data/lib/cim/type.rb
CHANGED
@@ -1,4 +1,38 @@
|
|
1
|
+
#
|
2
|
+
# cim/type.rb - class CIM::Type, class CIM::Array, class CIM::ReferenceType
|
3
|
+
#
|
4
|
+
# A pure-Ruby implementation of the CIM meta model.
|
5
|
+
#
|
6
|
+
# Copyright (c) 2010 Klaus Kämpf <kkaempf@suse.de>
|
7
|
+
#
|
8
|
+
# Licensed under the Ruby license
|
9
|
+
#
|
10
|
+
|
11
|
+
|
1
12
|
module CIM
|
13
|
+
#
|
14
|
+
# Type represents a CIM basic type
|
15
|
+
#
|
16
|
+
# The following basic types are known:
|
17
|
+
# uint8:: Unsigned 8-bit integer
|
18
|
+
# sint8:: Signed 8-bit integer
|
19
|
+
# uint16:: Unsigned 16-bit integer
|
20
|
+
# sint16:: Signed 16-bit integer
|
21
|
+
# uint32:: Unsigned 32-bit integer
|
22
|
+
# sint32:: Signed 32-bit integer
|
23
|
+
# uint64:: Unsigned 64-bit integer
|
24
|
+
# sint64:: Signed 64-bit integer
|
25
|
+
# string:: UCS-2 string
|
26
|
+
# bool:: Boolean
|
27
|
+
# real32:: IEEE 4-byte floating-point
|
28
|
+
# real64:: IEEE 8-byte floating-point
|
29
|
+
# datetime:: A string containing a date-time
|
30
|
+
# reference:: Strongly typed reference
|
31
|
+
# char16:: 16-bit UCS-2 character
|
32
|
+
# datetime:: Timestamp
|
33
|
+
# void:: -- allowed for WMI only
|
34
|
+
#
|
35
|
+
#
|
2
36
|
class Type
|
3
37
|
TYPES = [:null,:void,:bool,:char16,:string,:uint8,:sint8,:uint16,:sint16,:uint32,:sint32,:uint64,:sint64,:real32,:real64,:datetime,:class,:reference,:array]
|
4
38
|
MATCHES = {
|
@@ -23,21 +57,36 @@ module CIM
|
|
23
57
|
:array => [ :null ]
|
24
58
|
}
|
25
59
|
attr_reader :type
|
60
|
+
#
|
61
|
+
# Basic types are created by-symbol or by-name
|
62
|
+
#
|
63
|
+
# CIM::Type.new(:bool) == CIM::Type.new("bool")
|
64
|
+
#
|
26
65
|
def initialize type
|
27
66
|
type.downcase! if type.is_a? String
|
28
67
|
@type = type.to_sym
|
29
68
|
raise TypeError.new("#{type}") unless TYPES.include? @type
|
30
69
|
end
|
70
|
+
#
|
71
|
+
# returns a string representation in MOF syntax format
|
72
|
+
#
|
31
73
|
def to_s
|
32
74
|
@type.to_s
|
33
75
|
end
|
76
|
+
#
|
77
|
+
# returns a symbol representation of the type
|
78
|
+
#
|
34
79
|
def to_sym
|
35
80
|
@type
|
36
81
|
end
|
82
|
+
#
|
83
|
+
# type equality
|
84
|
+
#
|
37
85
|
def == t
|
38
86
|
case t
|
39
87
|
when Type: t.type == @type
|
40
88
|
when Symbol: t == @type
|
89
|
+
when String: t.downcase == @type.to_s
|
41
90
|
else
|
42
91
|
false
|
43
92
|
end
|
@@ -77,6 +126,9 @@ module CIM
|
|
77
126
|
end
|
78
127
|
end
|
79
128
|
public
|
129
|
+
#
|
130
|
+
# check if another Type or Variant matches
|
131
|
+
#
|
80
132
|
def matches? x
|
81
133
|
# puts ">#{self}<{#{self.class}}.matches?>#{x.inspect}<{#{x.class}}"
|
82
134
|
case x
|
@@ -95,12 +147,30 @@ module CIM
|
|
95
147
|
end
|
96
148
|
end
|
97
149
|
end
|
150
|
+
|
151
|
+
#
|
152
|
+
# Array represents an array of identical typed value
|
153
|
+
#
|
154
|
+
#
|
98
155
|
class Array < Type
|
99
156
|
attr_reader :size
|
157
|
+
#
|
158
|
+
# Arrays are initialized by size and type
|
159
|
+
# Passing 0 (zero) as the size creates an unlimited array
|
160
|
+
#
|
100
161
|
def initialize size, type
|
101
162
|
@size = size
|
102
163
|
super type
|
103
164
|
end
|
165
|
+
#
|
166
|
+
# An array is equal to any other array, regardless of the enclosed type
|
167
|
+
#
|
168
|
+
def == t
|
169
|
+
t == :array
|
170
|
+
end
|
171
|
+
#
|
172
|
+
# returns a string representation of the array type
|
173
|
+
#
|
104
174
|
def to_s
|
105
175
|
if @size > 0
|
106
176
|
"#{super}[#{@size}]"
|
@@ -109,12 +179,23 @@ module CIM
|
|
109
179
|
end
|
110
180
|
end
|
111
181
|
end
|
182
|
+
|
183
|
+
#
|
184
|
+
# ReferenceType is a strongly typed reference to a class
|
185
|
+
#
|
186
|
+
#
|
112
187
|
class ReferenceType < Type
|
113
188
|
attr_reader :name
|
189
|
+
#
|
190
|
+
# Creates a strongly typed reference to class +name+
|
191
|
+
#
|
114
192
|
def initialize name
|
115
193
|
@name = name
|
116
|
-
super
|
194
|
+
super "class"
|
117
195
|
end
|
196
|
+
#
|
197
|
+
# returns a string representation of the reference type
|
198
|
+
#
|
118
199
|
def to_s
|
119
200
|
"#{@name} ref"
|
120
201
|
end
|
data/lib/cim/variant.rb
CHANGED
@@ -1,11 +1,50 @@
|
|
1
|
+
#
|
2
|
+
# cim/variant.rb - class CIM::Variant
|
3
|
+
#
|
4
|
+
# A pure-Ruby implementation of the CIM meta model.
|
5
|
+
#
|
6
|
+
# Copyright (c) 2010 Klaus Kämpf <kkaempf@suse.de>
|
7
|
+
#
|
8
|
+
# Licensed under the Ruby license
|
9
|
+
#
|
1
10
|
module CIM
|
11
|
+
#
|
2
12
|
# A Variant is a typed value
|
13
|
+
#
|
3
14
|
class Variant
|
4
15
|
attr_reader :type, :value
|
16
|
+
#
|
17
|
+
# Creates a typed value
|
18
|
+
#
|
19
|
+
# +type+: See CIM::Type
|
20
|
+
# +value+: A Ruby value
|
21
|
+
#
|
22
|
+
# No attempt is made to check if the type matches the value.
|
23
|
+
#
|
5
24
|
def initialize type = :null, value = nil
|
6
25
|
@type = (type.kind_of? CIM::Type) ? type : CIM::Type.new(type)
|
7
26
|
@value = value unless value == :null
|
8
27
|
end
|
28
|
+
#
|
29
|
+
# Checks equality of the Variant with a Ruby value or another Variant
|
30
|
+
#
|
31
|
+
def == v
|
32
|
+
# $stderr.puts "<#{@type}>#{self} == #{v.class}"
|
33
|
+
case v
|
34
|
+
when NilClass: @type == :null && @value.nil?
|
35
|
+
when FalseClass: @type == :bool && !@value
|
36
|
+
when TrueClass: @type == :bool && @value
|
37
|
+
when String: @type == :string && @value == v
|
38
|
+
when Integer: @type == :int && @value == v
|
39
|
+
when Float: @type == :real && @value == v
|
40
|
+
when CIM::Variant: @type == v.type && @value == v.value
|
41
|
+
else
|
42
|
+
false
|
43
|
+
end
|
44
|
+
end
|
45
|
+
#
|
46
|
+
# returns a string representation in MOF syntax format
|
47
|
+
#
|
9
48
|
def to_s
|
10
49
|
if @type == :null
|
11
50
|
"null"
|
data/tasks/clean.rake
ADDED
data/tasks/doc.rake
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
begin
|
2
|
+
require 'yard'
|
3
|
+
YARD::Rake::YardocTask.new(:doc) do |t|
|
4
|
+
t.files = ['lib/**/*.rb']
|
5
|
+
t.options = ['--no-private']
|
6
|
+
end
|
7
|
+
rescue LoadError
|
8
|
+
STDERR.puts "Install yard if you want prettier docs"
|
9
|
+
require 'rdoc/task'
|
10
|
+
Rake::RDocTask.new(:doc) do |rdoc|
|
11
|
+
rdoc.rdoc_dir = "doc"
|
12
|
+
rdoc.title = "dm-keeper-adapter #{CIM::VERSION}"
|
13
|
+
end
|
14
|
+
end
|
data/tasks/test.rake
ADDED
data/test/test_method.rb
CHANGED
@@ -9,7 +9,8 @@ class MethodTest < Test::Unit::TestCase
|
|
9
9
|
assert m
|
10
10
|
assert_equal "Foo", m.name
|
11
11
|
assert m.qualifiers.size > 0
|
12
|
-
|
12
|
+
assert m.qualifiers.include?( :description )
|
13
|
+
assert m.qualifiers.include?( :description, :string )
|
13
14
|
# assert_equal "This is a foo method", m.description
|
14
15
|
assert_equal false, m.to_s.empty?
|
15
16
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
$: << File.join(File.dirname(__FILE__),"..","lib")
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
require "cim"
|
5
|
+
|
6
|
+
class QualifierSetTest < Test::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
qbool = CIM::QualifierDeclaration.new("flag")
|
9
|
+
qint = CIM::QualifierDeclaration.new("value", :uint32)
|
10
|
+
qstring = CIM::QualifierDeclaration.new("description", :string, "This is a description")
|
11
|
+
@qualifiers = CIM::QualifierSet.new
|
12
|
+
@qualifiers << CIM::Qualifier.new(qbool)
|
13
|
+
@qualifiers << CIM::Qualifier.new(qint)
|
14
|
+
@qualifiers << CIM::Qualifier.new(qstring)
|
15
|
+
end
|
16
|
+
def test_key
|
17
|
+
assert_equal 3, @qualifiers.size
|
18
|
+
end
|
19
|
+
def test_prefill
|
20
|
+
q = CIM::QualifierSet.new "a", :b
|
21
|
+
assert 2, q.size
|
22
|
+
assert q.include?( "a" )
|
23
|
+
assert q.include?( "b", :bool )
|
24
|
+
end
|
25
|
+
def test_include
|
26
|
+
assert @qualifiers.include?( :flag )
|
27
|
+
assert @qualifiers.include?( "flag" )
|
28
|
+
assert @qualifiers.include?( "flag", :bool )
|
29
|
+
assert @qualifiers.include?( "flag", "bool" )
|
30
|
+
assert !@qualifiers.include?( "flag", :string )
|
31
|
+
end
|
32
|
+
def test_access
|
33
|
+
assert @qualifiers[:flag]
|
34
|
+
assert @qualifiers["flag"]
|
35
|
+
assert @qualifiers["flag", :bool]
|
36
|
+
assert @qualifiers["flag", "bool"]
|
37
|
+
assert !@qualifiers["flag", :string]
|
38
|
+
end
|
39
|
+
end
|