mof 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/Manifest.txt +10 -0
- data/README.rdoc +63 -0
- data/Rakefile +29 -0
- data/bin/moflint +32 -0
- data/lib/mof.rb +7 -0
- data/lib/mof/helper.rb +167 -0
- data/lib/mof/parser.rb +1380 -0
- data/lib/mof/result.rb +35 -0
- data/lib/mof/scanner.rb +206 -0
- data/test/test_loading.rb +2 -0
- data/test/test_qualifier.rb +28 -0
- metadata +133 -0
data/lib/mof/result.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
module MOF
|
2
|
+
class Result
|
3
|
+
attr_reader :classes, :associations, :indications, :qualifiers, :instances
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@qualifiers = []
|
7
|
+
@classes = []
|
8
|
+
@associations = []
|
9
|
+
@indications = []
|
10
|
+
@instances = []
|
11
|
+
end
|
12
|
+
|
13
|
+
def is_qualifier? name
|
14
|
+
!qualifier(name).nil?
|
15
|
+
end
|
16
|
+
private
|
17
|
+
def join_to_s title, array
|
18
|
+
s = ""
|
19
|
+
if array.size > 0
|
20
|
+
s << "\n// #{title} [#{array.size}]\n"
|
21
|
+
s << array.join("\n")
|
22
|
+
end
|
23
|
+
s
|
24
|
+
end
|
25
|
+
public
|
26
|
+
def to_s
|
27
|
+
s = join_to_s( "Qualifiers", @qualifiers )
|
28
|
+
s << join_to_s( "Classes", @classes )
|
29
|
+
s << join_to_s( "Associations", @associations )
|
30
|
+
s << join_to_s( "Indications", @indications )
|
31
|
+
s << join_to_s( "Instances", @instances )
|
32
|
+
s
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/mof/scanner.rb
ADDED
@@ -0,0 +1,206 @@
|
|
1
|
+
#
|
2
|
+
# scanner.rb
|
3
|
+
#
|
4
|
+
# A scanner module for MOF files
|
5
|
+
# to extend the Scanner class (via include)
|
6
|
+
#
|
7
|
+
# functions offered:
|
8
|
+
# parse( file ) : start parsing of file
|
9
|
+
# next_token : return next [token,value] pair
|
10
|
+
# on_error : report error
|
11
|
+
#
|
12
|
+
# Class variables:
|
13
|
+
#
|
14
|
+
# @file: file being scanned
|
15
|
+
# @name: name of file
|
16
|
+
# @lineno: current line number in file (for error reports)
|
17
|
+
# @iconv: non-nil if iconv needed (i.e. Windows utf-16 mof files)
|
18
|
+
# @fstack: stack of [ @file, @name, @lineno, @iconv ] for open files (to handle includes)
|
19
|
+
# @q: Queue of [token,value] pairs, [false,false] denotes EOF
|
20
|
+
#
|
21
|
+
|
22
|
+
require 'iconv'
|
23
|
+
|
24
|
+
module MOF
|
25
|
+
module Scanner
|
26
|
+
def fill_queue
|
27
|
+
if @file.eof?
|
28
|
+
# $stderr.puts "eof ! #{@fstack.size}"
|
29
|
+
@file.close unless @file == $stdin
|
30
|
+
unless @fstack.empty?
|
31
|
+
@file, @name, @lineno, @iconv, $/, @result = @fstack.pop
|
32
|
+
# $stderr.puts "fill! #{@fstack.size}, #{@name}@#{@lineno}"
|
33
|
+
return fill_queue
|
34
|
+
end
|
35
|
+
@q.push [false, false]
|
36
|
+
return false
|
37
|
+
end
|
38
|
+
@line = @file.gets
|
39
|
+
return true unless @line
|
40
|
+
@lineno += 1
|
41
|
+
|
42
|
+
# $stderr.puts "fill_queue(#{@line.split('').inspect})"
|
43
|
+
@line.chomp! # remove $/
|
44
|
+
@line = Iconv.conv( "ISO-8859-1", @iconv, @line ) if @iconv
|
45
|
+
# $stderr.puts "scan(#{@line})" unless @quiet
|
46
|
+
scanner = StringScanner.new(@line)
|
47
|
+
|
48
|
+
until scanner.eos?
|
49
|
+
# $stderr.puts "#{@q.size}:\"#{scanner.rest}\""
|
50
|
+
if @in_comment
|
51
|
+
if scanner.scan(%r{.*\*/})
|
52
|
+
@in_comment = false
|
53
|
+
else
|
54
|
+
break
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
case
|
59
|
+
when scanner.scan(/\s+/)
|
60
|
+
next # ignore space
|
61
|
+
|
62
|
+
when m = scanner.scan(/\n+/)
|
63
|
+
@lineno += m.size
|
64
|
+
next # ignore newlines
|
65
|
+
|
66
|
+
when m = scanner.scan(%r{/\*})
|
67
|
+
@in_comment = true
|
68
|
+
|
69
|
+
when m = scanner.scan(%r{//.*})
|
70
|
+
next # c++ style comment
|
71
|
+
|
72
|
+
when m = scanner.scan(%r{[(){}\[\],;\$#:=]})
|
73
|
+
@q.push [m, m]
|
74
|
+
|
75
|
+
# hexValue = [ "+" | "-" ] [ "0x" | "0X"] 1*hexDigit
|
76
|
+
# hexDigit = decimalDigit | "a" | "A" | "b" | "B" | "c" | "C" | "d" | "D" | "e" | "E" | "f" | "F"
|
77
|
+
when m = scanner.scan(%r{(\+|-)?(0x|0X)([0123456789]|[abcdef]|[ABCDEF])+})
|
78
|
+
@q.push [:hexValue, m.to_i]
|
79
|
+
|
80
|
+
# octalValue = [ "+" | "-" ] "0" 1*octalDigit
|
81
|
+
when m = scanner.scan(%r{(\+|-)?0[01234567]+})
|
82
|
+
@q.push [:octalValue, m.to_i]
|
83
|
+
|
84
|
+
# binaryValue = [ "+" | "-" ] 1*binaryDigit ( "b" | "B" )
|
85
|
+
when m = scanner.scan(%r{(\+|-)?(0|1)(b|B)})
|
86
|
+
@q.push [:binaryValue, m.to_i]
|
87
|
+
|
88
|
+
# realValue = [ "+" | "-" ] *decimalDigit "." 1*decimalDigit
|
89
|
+
# [ ( "e" | "E" ) [ "+" | "-" ] 1*decimalDigit ]
|
90
|
+
|
91
|
+
when m = scanner.scan(%r{(\+|-)?\d*\.\d+})
|
92
|
+
@q.push [:realValue, m.to_f]
|
93
|
+
|
94
|
+
when m = scanner.scan(%r{[123456789]\d*})
|
95
|
+
@q.push [:positiveDecimalValue, m.to_i]
|
96
|
+
|
97
|
+
# decimalValue = [ "+" | "-" ] ( positiveDecimalDigit *decimalDigit | "0" )
|
98
|
+
# decimalDigit = "0" | positiveDecimalDigit
|
99
|
+
when m = scanner.scan(%r{(\+|-)?\d+})
|
100
|
+
@q.push [:decimalValue, m.to_i]
|
101
|
+
|
102
|
+
# charValue = // any single-quoted Unicode-character, except single quotes
|
103
|
+
|
104
|
+
when m = scanner.scan(%r{\'([^\'])\'})
|
105
|
+
@q.push [:charValue, scanner[1]]
|
106
|
+
|
107
|
+
# stringValue = 1*( """ *ucs2Character """ )
|
108
|
+
# ucs2Character = // any valid UCS-2-character
|
109
|
+
|
110
|
+
# when m = scanner.scan(%r{\"([^\\\"]*)\"})
|
111
|
+
# @q.push [:stringValue, scanner[1]]
|
112
|
+
|
113
|
+
# string with embedded backslash
|
114
|
+
when m = scanner.scan(%r{\"(([^\\\"]|(\\[nrt\(\)/\"\'\\]))*)\"})
|
115
|
+
# $stderr.puts "scan(#{@line})" unless @quiet
|
116
|
+
# $stderr.puts ":string(#{scanner[1]})"
|
117
|
+
@q.push [:stringValue, scanner[1]]
|
118
|
+
|
119
|
+
when m = scanner.scan(%r{\w+})
|
120
|
+
case m.downcase
|
121
|
+
when "amended": @q.push [:AMENDED, CIM::QualifierFlavors.new(m)]
|
122
|
+
when "any": @q.push [:ANY, m]
|
123
|
+
when "as": @q.push [:AS, nil]
|
124
|
+
when "association": @q.push [:ASSOCIATION, CIM::QualifierDeclaration.new(m.downcase)]
|
125
|
+
when "class": @q.push( [:CLASS, m] )
|
126
|
+
when "disableoverride": @q.push [:DISABLEOVERRIDE, CIM::QualifierFlavors.new(m)]
|
127
|
+
when "void": @q.push [:DT_VOID, CIM::Type.new(:void)]
|
128
|
+
when "boolean": @q.push [:DT_BOOL, CIM::Type.new(:bool)]
|
129
|
+
when "char16": @q.push [:DT_CHAR16, CIM::Type.new(m)]
|
130
|
+
when "datetime": @q.push [:DT_DATETIME, CIM::Type.new(m)]
|
131
|
+
when "real32": @q.push [:DT_REAL32, CIM::Type.new(m)]
|
132
|
+
when "real64": @q.push [:DT_REAL64, CIM::Type.new(m)]
|
133
|
+
when "sint16": @q.push [:DT_SINT16, CIM::Type.new(m)]
|
134
|
+
when "sint32": @q.push [:DT_SINT32, CIM::Type.new(m)]
|
135
|
+
when "sint64": @q.push [:DT_SINT64, CIM::Type.new(m)]
|
136
|
+
when "sint8": @q.push [:DT_SINT8, CIM::Type.new(m)]
|
137
|
+
when "string": @q.push [:DT_STR, CIM::Type.new(m)]
|
138
|
+
when "uint16": @q.push [:DT_UINT16, CIM::Type.new(m)]
|
139
|
+
when "uint32": @q.push [:DT_UINT32, CIM::Type.new(m)]
|
140
|
+
when "uint64": @q.push [:DT_UINT64, CIM::Type.new(m)]
|
141
|
+
when "uint8": @q.push [:DT_UINT8, CIM::Type.new(m)]
|
142
|
+
when "enableoverride": @q.push [:ENABLEOVERRIDE, CIM::QualifierFlavors.new(m)]
|
143
|
+
when "false": @q.push [:booleanValue, false]
|
144
|
+
when "flavor": @q.push [:FLAVOR, nil]
|
145
|
+
when "include": @q.push [:INCLUDE, nil]
|
146
|
+
when "indication": @q.push [:INDICATION, CIM::QualifierDeclaration.new(m.downcase)]
|
147
|
+
when "instance": @q.push [:INSTANCE, m.to_sym]
|
148
|
+
when "method": @q.push [:METHOD, m]
|
149
|
+
when "null": @q.push [:nullValue, CIM::Variant.new(:null,nil)]
|
150
|
+
when "of": @q.push [:OF, nil]
|
151
|
+
when "parameter": @q.push [:PARAMETER, m]
|
152
|
+
when "pragma": @q.push [:PRAGMA, nil]
|
153
|
+
when "property": @q.push [:PROPERTY, m]
|
154
|
+
when "qualifier": @q.push [:QUALIFIER, m]
|
155
|
+
when "ref": @q.push [:REF, nil]
|
156
|
+
when "reference": @q.push [:REFERENCE, m]
|
157
|
+
when "restricted": @q.push [:RESTRICTED, CIM::QualifierFlavors.new(m)]
|
158
|
+
when "schema": @q.push [:SCHEMA, m]
|
159
|
+
when "scope": @q.push [:SCOPE, nil]
|
160
|
+
when "toinstance": @q.push [:TOINSTANCE, CIM::QualifierFlavors.new(m)]
|
161
|
+
when "tosubclass": @q.push [:TOSUBCLASS, CIM::QualifierFlavors.new(m)]
|
162
|
+
when "translatable": @q.push [:TRANSLATABLE, CIM::QualifierFlavors.new(m)]
|
163
|
+
when "true": @q.push [:booleanValue, true]
|
164
|
+
else
|
165
|
+
@q.push( [:IDENTIFIER, m] )
|
166
|
+
end # case m.downcase
|
167
|
+
|
168
|
+
else
|
169
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
170
|
+
raise ParseHelper::ScannerError.new( @name, @lineno, @line, scanner.rest ) unless scanner.rest.empty?
|
171
|
+
end # case
|
172
|
+
end # until scanner.eos?
|
173
|
+
# $stderr.puts "scan done, @q #{@q.size} entries"
|
174
|
+
true
|
175
|
+
end
|
176
|
+
|
177
|
+
def parse files
|
178
|
+
return unless files
|
179
|
+
return if files.empty?
|
180
|
+
# open files in reverse order
|
181
|
+
# open() will stack them and parse starts in right order
|
182
|
+
files.reverse_each do |file|
|
183
|
+
open file, :argv
|
184
|
+
# puts "Opened #{file} as #{@file} @ #{@fstack.size}"
|
185
|
+
end
|
186
|
+
@q = [] # init the token queue
|
187
|
+
do_parse
|
188
|
+
end
|
189
|
+
|
190
|
+
def next_token
|
191
|
+
while @q.empty?
|
192
|
+
break unless fill_queue
|
193
|
+
end
|
194
|
+
# $stderr.puts "next_token #{@q.first.inspect}"
|
195
|
+
@q.shift
|
196
|
+
end
|
197
|
+
|
198
|
+
# stack_size, last_token, value_stack
|
199
|
+
# stack[0] == Result
|
200
|
+
def on_error token, token_value, value_stack
|
201
|
+
require File.join(File.dirname(__FILE__), 'parse_helper')
|
202
|
+
raise ParseHelper::ParserError.new @name,@lineno, @line, token,token_value,value_stack
|
203
|
+
end
|
204
|
+
|
205
|
+
end # module Scanner
|
206
|
+
end # module MOF
|
@@ -0,0 +1,28 @@
|
|
1
|
+
D = File.expand_path(File.dirname(__FILE__))
|
2
|
+
require "test/unit"
|
3
|
+
require File.join(D,'..','lib','mof')
|
4
|
+
|
5
|
+
class TestQualifiers < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@moffiles, @options = MOF::Parser.argv_handler "test_qualifier", ["qualifier.mof"]
|
9
|
+
@options[:style] ||= :cim
|
10
|
+
@options[:includes] ||= [ D, File.join(D,"mof")]
|
11
|
+
|
12
|
+
@parser = MOF::Parser.new @options
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_parse
|
16
|
+
result = @parser.parse @moffiles
|
17
|
+
assert result
|
18
|
+
# parsed one file
|
19
|
+
assert_equal 1, result.size
|
20
|
+
|
21
|
+
name,res = result.shift
|
22
|
+
assert !res.qualifiers.empty?
|
23
|
+
res.qualifiers.each do |q|
|
24
|
+
puts "#{q.class}"
|
25
|
+
assert q.is_a? CIM::QualifierDeclaration
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mof
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 19
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- "Klaus K\xC3\xA4mpf"
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-10-04 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: cim
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 25
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 2
|
33
|
+
- 7
|
34
|
+
version: 0.2.7
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rubyforge
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 7
|
46
|
+
segments:
|
47
|
+
- 2
|
48
|
+
- 0
|
49
|
+
- 4
|
50
|
+
version: 2.0.4
|
51
|
+
type: :development
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: hoe
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 21
|
62
|
+
segments:
|
63
|
+
- 2
|
64
|
+
- 6
|
65
|
+
- 1
|
66
|
+
version: 2.6.1
|
67
|
+
type: :development
|
68
|
+
version_requirements: *id003
|
69
|
+
description: |-
|
70
|
+
A parser for the Managed Object Format (MOF) language used to describe
|
71
|
+
classes and instances of the Common Information Model (CIM)
|
72
|
+
|
73
|
+
See http://www.dmtf.org/education/mof
|
74
|
+
email:
|
75
|
+
- kkaempf@suse.de
|
76
|
+
executables:
|
77
|
+
- moflint
|
78
|
+
extensions: []
|
79
|
+
|
80
|
+
extra_rdoc_files:
|
81
|
+
- History.txt
|
82
|
+
- Manifest.txt
|
83
|
+
files:
|
84
|
+
- History.txt
|
85
|
+
- Manifest.txt
|
86
|
+
- README.rdoc
|
87
|
+
- Rakefile
|
88
|
+
- bin/moflint
|
89
|
+
- lib/mof.rb
|
90
|
+
- lib/mof/helper.rb
|
91
|
+
- lib/mof/parser.rb
|
92
|
+
- lib/mof/result.rb
|
93
|
+
- lib/mof/scanner.rb
|
94
|
+
- test/test_qualifier.rb
|
95
|
+
- test/test_loading.rb
|
96
|
+
has_rdoc: true
|
97
|
+
homepage: http://github.com/kkaempf/mof
|
98
|
+
licenses: []
|
99
|
+
|
100
|
+
post_install_message:
|
101
|
+
rdoc_options:
|
102
|
+
- --main
|
103
|
+
- README.rdoc
|
104
|
+
require_paths:
|
105
|
+
- lib
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
hash: 3
|
112
|
+
segments:
|
113
|
+
- 0
|
114
|
+
version: "0"
|
115
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
hash: 3
|
121
|
+
segments:
|
122
|
+
- 0
|
123
|
+
version: "0"
|
124
|
+
requirements: []
|
125
|
+
|
126
|
+
rubyforge_project: mof
|
127
|
+
rubygems_version: 1.3.7
|
128
|
+
signing_key:
|
129
|
+
specification_version: 3
|
130
|
+
summary: A parser for the Managed Object Format (MOF) language used to describe classes and instances of the Common Information Model (CIM) See http://www.dmtf.org/education/mof
|
131
|
+
test_files:
|
132
|
+
- test/test_qualifier.rb
|
133
|
+
- test/test_loading.rb
|