spectools 1.0.0 → 1.0.1

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.
@@ -1 +1,3 @@
1
1
  1.0.0 - Initial release.
2
+ 1.0.1 - Bugfix release.
3
+ Fixed some of the command handling to use proper quoting, as well as handling for escaping.
@@ -1,5 +1,5 @@
1
- TODO
2
1
  CHANGELOG.txt
2
+ TODO
3
3
  Manifest.txt
4
4
  README.txt
5
5
  README.vnmsh.txt
data/README.txt CHANGED
@@ -1,33 +1,378 @@
1
- SpecTools is a toolset designed to make working with CA's SPECTRUM product (now Network Fault Manager) much easier. The base library represents the SPECTRUM data model: Models, Events, Alarms, Model Types, etc. All extra functionality is provided by extensions.
1
+ = spectools
2
2
 
3
- Using the base SpecTools classes is very simple. Just require it!
3
+ * http://rubyforge.org/projects/spectools/
4
4
 
5
- require 'rubygems'
6
- require 'spcetools'
5
+ == DESCRIPTION:
7
6
 
8
- model = SpecTools::Model.new
9
- model.handle = 'test handle'
7
+ SpecTools is a library for accessing the data model for
8
+ CA SPECTRUM's data model.
10
9
 
11
- All of the classes have good RDoc, so reference it to see what the structure looks like.
12
10
 
13
- Using Extensions.
11
+ == FEATURES/PROBLEMS:
14
12
 
15
- SpecTools has a very easy way of adding extra functionality to the library, called extensions.
13
+ * Supplies basic data model classes.
14
+ * The VNMSH extension allows for data access via the CLI interface.
16
15
 
17
- Using extensions.
16
+ == SYNOPSIS:
18
17
 
19
- Using an extension is usually just a matter of requiring the object. For example, to use
20
- the CLI extenson, VNMSH, you would just:
18
+ require 'rubygems'
19
+ require 'spcetools'
21
20
 
22
- require 'rubygems'
23
- require 'spectools'
24
- require 'vnmsh'
21
+ model = SpecTools::Model.new
22
+ model.handle = 'test handle'
25
23
 
26
- Extensions extend the SpecTools by adding methods to the SpecTools classes. The methods all share
27
- a common prefix, which identifies the extension.`SpecTools has a config option,
28
- SpecTools::Config.default_access_method , that allows a user to determine what extension methods
29
- to use by default. For example, if SpecTools::Config.default_access_method = :cli , any method with
30
- a cli_ prefix will be available without needing to use the prefix. To continue the example, calling
31
- Model.find will automatically call Model.cli_find for you.
24
+ see README.spectools.txt for more details.
25
+ == REQUIREMENTS:
26
+
27
+ * Just rubygems!
28
+
29
+ == INSTALL:
30
+
31
+ * gem install spectools
32
+
33
+ == LICENSE:
34
+
35
+ GNU GENERAL PUBLIC LICENSE
36
+ Version 2, June 1991
37
+
38
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
39
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
40
+ Everyone is permitted to copy and distribute verbatim copies
41
+ of this license document, but changing it is not allowed.
42
+
43
+ Preamble
44
+
45
+ The licenses for most software are designed to take away your
46
+ freedom to share and change it. By contrast, the GNU General Public
47
+ License is intended to guarantee your freedom to share and change free
48
+ software--to make sure the software is free for all its users. This
49
+ General Public License applies to most of the Free Software
50
+ Foundation's software and to any other program whose authors commit to
51
+ using it. (Some other Free Software Foundation software is covered by
52
+ the GNU Library General Public License instead.) You can apply it to
53
+ your programs, too.
54
+
55
+ When we speak of free software, we are referring to freedom, not
56
+ price. Our General Public Licenses are designed to make sure that you
57
+ have the freedom to distribute copies of free software (and charge for
58
+ this service if you wish), that you receive source code or can get it
59
+ if you want it, that you can change the software or use pieces of it
60
+ in new free programs; and that you know you can do these things.
61
+
62
+ To protect your rights, we need to make restrictions that forbid
63
+ anyone to deny you these rights or to ask you to surrender the rights.
64
+ These restrictions translate to certain responsibilities for you if you
65
+ distribute copies of the software, or if you modify it.
66
+
67
+ For example, if you distribute copies of such a program, whether
68
+ gratis or for a fee, you must give the recipients all the rights that
69
+ you have. You must make sure that they, too, receive or can get the
70
+ source code. And you must show them these terms so they know their
71
+ rights.
72
+
73
+ We protect your rights with two steps: (1) copyright the software, and
74
+ (2) offer you this license which gives you legal permission to copy,
75
+ distribute and/or modify the software.
76
+
77
+ Also, for each author's protection and ours, we want to make certain
78
+ that everyone understands that there is no warranty for this free
79
+ software. If the software is modified by someone else and passed on, we
80
+ want its recipients to know that what they have is not the original, so
81
+ that any problems introduced by others will not reflect on the original
82
+ authors' reputations.
83
+
84
+ Finally, any free program is threatened constantly by software
85
+ patents. We wish to avoid the danger that redistributors of a free
86
+ program will individually obtain patent licenses, in effect making the
87
+ program proprietary. To prevent this, we have made it clear that any
88
+ patent must be licensed for everyone's free use or not licensed at all.
89
+
90
+ The precise terms and conditions for copying, distribution and
91
+ modification follow.
92
+
93
+ GNU GENERAL PUBLIC LICENSE
94
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
95
+
96
+ 0. This License applies to any program or other work which contains
97
+ a notice placed by the copyright holder saying it may be distributed
98
+ under the terms of this General Public License. The "Program", below,
99
+ refers to any such program or work, and a "work based on the Program"
100
+ means either the Program or any derivative work under copyright law:
101
+ that is to say, a work containing the Program or a portion of it,
102
+ either verbatim or with modifications and/or translated into another
103
+ language. (Hereinafter, translation is included without limitation in
104
+ the term "modification".) Each licensee is addressed as "you".
105
+
106
+ Activities other than copying, distribution and modification are not
107
+ covered by this License; they are outside its scope. The act of
108
+ running the Program is not restricted, and the output from the Program
109
+ is covered only if its contents constitute a work based on the
110
+ Program (independent of having been made by running the Program).
111
+ Whether that is true depends on what the Program does.
112
+
113
+ 1. You may copy and distribute verbatim copies of the Program's
114
+ source code as you receive it, in any medium, provided that you
115
+ conspicuously and appropriately publish on each copy an appropriate
116
+ copyright notice and disclaimer of warranty; keep intact all the
117
+ notices that refer to this License and to the absence of any warranty;
118
+ and give any other recipients of the Program a copy of this License
119
+ along with the Program.
120
+
121
+ You may charge a fee for the physical act of transferring a copy, and
122
+ you may at your option offer warranty protection in exchange for a fee.
123
+
124
+ 2. You may modify your copy or copies of the Program or any portion
125
+ of it, thus forming a work based on the Program, and copy and
126
+ distribute such modifications or work under the terms of Section 1
127
+ above, provided that you also meet all of these conditions:
128
+
129
+ a) You must cause the modified files to carry prominent notices
130
+ stating that you changed the files and the date of any change.
131
+
132
+ b) You must cause any work that you distribute or publish, that in
133
+ whole or in part contains or is derived from the Program or any
134
+ part thereof, to be licensed as a whole at no charge to all third
135
+ parties under the terms of this License.
136
+
137
+ c) If the modified program normally reads commands interactively
138
+ when run, you must cause it, when started running for such
139
+ interactive use in the most ordinary way, to print or display an
140
+ announcement including an appropriate copyright notice and a
141
+ notice that there is no warranty (or else, saying that you provide
142
+ a warranty) and that users may redistribute the program under
143
+ these conditions, and telling the user how to view a copy of this
144
+ License. (Exception: if the Program itself is interactive but
145
+ does not normally print such an announcement, your work based on
146
+ the Program is not required to print an announcement.)
147
+
148
+ These requirements apply to the modified work as a whole. If
149
+ identifiable sections of that work are not derived from the Program,
150
+ and can be reasonably considered independent and separate works in
151
+ themselves, then this License, and its terms, do not apply to those
152
+ sections when you distribute them as separate works. But when you
153
+ distribute the same sections as part of a whole which is a work based
154
+ on the Program, the distribution of the whole must be on the terms of
155
+ this License, whose permissions for other licensees extend to the
156
+ entire whole, and thus to each and every part regardless of who wrote it.
157
+
158
+ Thus, it is not the intent of this section to claim rights or contest
159
+ your rights to work written entirely by you; rather, the intent is to
160
+ exercise the right to control the distribution of derivative or
161
+ collective works based on the Program.
162
+
163
+ In addition, mere aggregation of another work not based on the Program
164
+ with the Program (or with a work based on the Program) on a volume of
165
+ a storage or distribution medium does not bring the other work under
166
+ the scope of this License.
167
+
168
+ 3. You may copy and distribute the Program (or a work based on it,
169
+ under Section 2) in object code or executable form under the terms of
170
+ Sections 1 and 2 above provided that you also do one of the following:
171
+
172
+ a) Accompany it with the complete corresponding machine-readable
173
+ source code, which must be distributed under the terms of Sections
174
+ 1 and 2 above on a medium customarily used for software
175
+ interchange; or,
176
+
177
+ b) Accompany it with a written offer, valid for at least three
178
+ years, to give any third party, for a charge no more than your
179
+ cost of physically performing source distribution, a complete
180
+ machine-readable copy of the corresponding source code, to be
181
+ distributed under the terms of Sections 1 and 2 above on a medium
182
+ customarily used for software interchange; or,
183
+
184
+ c) Accompany it with the information you received as to the offer
185
+ to distribute corresponding source code. (This alternative is
186
+ allowed only for noncommercial distribution and only if you
187
+ received the program in object code or executable form with such
188
+ an offer, in accord with Subsection b above.)
189
+
190
+ The source code for a work means the preferred form of the work for
191
+ making modifications to it. For an executable work, complete source
192
+ code means all the source code for all modules it contains, plus any
193
+ associated interface definition files, plus the scripts used to
194
+ control compilation and installation of the executable. However, as a
195
+ special exception, the source code distributed need not include
196
+ anything that is normally distributed (in either source or binary
197
+ form) with the major components (compiler, kernel, and so on) of the
198
+ operating system on which the executable runs, unless that component
199
+ itself accompanies the executable.
200
+
201
+ If distribution of executable or object code is made by offering
202
+ access to copy from a designated place, then offering equivalent
203
+ access to copy the source code from the same place counts as
204
+ distribution of the source code, even though third parties are not
205
+ compelled to copy the source along with the object code.
206
+
207
+ 4. You may not copy, modify, sublicense, or distribute the Program
208
+ except as expressly provided under this License. Any attempt
209
+ otherwise to copy, modify, sublicense or distribute the Program is
210
+ void, and will automatically terminate your rights under this License.
211
+ However, parties who have received copies, or rights, from you under
212
+ this License will not have their licenses terminated so long as such
213
+ parties remain in full compliance.
214
+
215
+ 5. You are not required to accept this License, since you have not
216
+ signed it. However, nothing else grants you permission to modify or
217
+ distribute the Program or its derivative works. These actions are
218
+ prohibited by law if you do not accept this License. Therefore, by
219
+ modifying or distributing the Program (or any work based on the
220
+ Program), you indicate your acceptance of this License to do so, and
221
+ all its terms and conditions for copying, distributing or modifying
222
+ the Program or works based on it.
223
+
224
+ 6. Each time you redistribute the Program (or any work based on the
225
+ Program), the recipient automatically receives a license from the
226
+ original licensor to copy, distribute or modify the Program subject to
227
+ these terms and conditions. You may not impose any further
228
+ restrictions on the recipients' exercise of the rights granted herein.
229
+ You are not responsible for enforcing compliance by third parties to
230
+ this License.
231
+
232
+ 7. If, as a consequence of a court judgment or allegation of patent
233
+ infringement or for any other reason (not limited to patent issues),
234
+ conditions are imposed on you (whether by court order, agreement or
235
+ otherwise) that contradict the conditions of this License, they do not
236
+ excuse you from the conditions of this License. If you cannot
237
+ distribute so as to satisfy simultaneously your obligations under this
238
+ License and any other pertinent obligations, then as a consequence you
239
+ may not distribute the Program at all. For example, if a patent
240
+ license would not permit royalty-free redistribution of the Program by
241
+ all those who receive copies directly or indirectly through you, then
242
+ the only way you could satisfy both it and this License would be to
243
+ refrain entirely from distribution of the Program.
244
+
245
+ If any portion of this section is held invalid or unenforceable under
246
+ any particular circumstance, the balance of the section is intended to
247
+ apply and the section as a whole is intended to apply in other
248
+ circumstances.
249
+
250
+ It is not the purpose of this section to induce you to infringe any
251
+ patents or other property right claims or to contest validity of any
252
+ such claims; this section has the sole purpose of protecting the
253
+ integrity of the free software distribution system, which is
254
+ implemented by public license practices. Many people have made
255
+ generous contributions to the wide range of software distributed
256
+ through that system in reliance on consistent application of that
257
+ system; it is up to the author/donor to decide if he or she is willing
258
+ to distribute software through any other system and a licensee cannot
259
+ impose that choice.
260
+
261
+ This section is intended to make thoroughly clear what is believed to
262
+ be a consequence of the rest of this License.
263
+
264
+ 8. If the distribution and/or use of the Program is restricted in
265
+ certain countries either by patents or by copyrighted interfaces, the
266
+ original copyright holder who places the Program under this License
267
+ may add an explicit geographical distribution limitation excluding
268
+ those countries, so that distribution is permitted only in or among
269
+ countries not thus excluded. In such case, this License incorporates
270
+ the limitation as if written in the body of this License.
271
+
272
+ 9. The Free Software Foundation may publish revised and/or new versions
273
+ of the General Public License from time to time. Such new versions will
274
+ be similar in spirit to the present version, but may differ in detail to
275
+ address new problems or concerns.
276
+
277
+ Each version is given a distinguishing version number. If the Program
278
+ specifies a version number of this License which applies to it and
279
+ "any later version", you have the option of following the terms and
280
+ conditions either of that version or of any later version published by
281
+ the Free Software Foundation. If the Program does not specify a
282
+ version number of this License, you may choose any version ever
283
+ published by the Free Software Foundation.
284
+
285
+ 10. If you wish to incorporate parts of the Program into other free
286
+ programs whose distribution conditions are different, write to the author
287
+ to ask for permission. For software which is copyrighted by the Free
288
+ Software Foundation, write to the Free Software Foundation; we sometimes
289
+ make exceptions for this. Our decision will be guided by the two goals
290
+ of preserving the free status of all derivatives of our free software and
291
+ of promoting the sharing and reuse of software generally.
292
+
293
+ NO WARRANTY
294
+
295
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
296
+ WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
297
+ EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
298
+ OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY
299
+ KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
300
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
301
+ PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
302
+ PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME
303
+ THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
304
+
305
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
306
+ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
307
+ AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
308
+ FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
309
+ CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
310
+ PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
311
+ RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
312
+ FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
313
+ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
314
+ DAMAGES.
315
+
316
+ END OF TERMS AND CONDITIONS
317
+
318
+ How to Apply These Terms to Your New Programs
319
+
320
+ If you develop a new program, and you want it to be of the greatest
321
+ possible use to the public, the best way to achieve this is to make it
322
+ free software which everyone can redistribute and change under these
323
+ terms.
324
+
325
+ To do so, attach the following notices to the program. It is safest
326
+ to attach them to the start of each source file to most effectively
327
+ convey the exclusion of warranty; and each file should have at least
328
+ the "copyright" line and a pointer to where the full notice is found.
329
+
330
+ <one line to give the program's name and a brief idea of what it does.>
331
+ Copyright (C) <year> <name of author>
332
+
333
+ This program is free software; you can redistribute it and/or modify
334
+ it under the terms of the GNU General Public License as published by
335
+ the Free Software Foundation; either version 2 of the License, or
336
+ (at your option) any later version.
337
+
338
+ This program is distributed in the hope that it will be useful,
339
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
340
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
341
+ GNU General Public License for more details.
342
+
343
+ You should have received a copy of the GNU General Public License
344
+ along with this program; if not, write to the Free Software
345
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
346
+
347
+
348
+ Also add information on how to contact you by electronic and paper mail.
349
+
350
+ If the program is interactive, make it output a short notice like this
351
+ when it starts in an interactive mode:
352
+
353
+ Gnomovision version 69, Copyright (C) year name of author
354
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
355
+ This is free software, and you are welcome to redistribute it
356
+ under certain conditions; type `show c' for details.
357
+
358
+ The hypothetical commands `show w' and `show c' should show the appropriate
359
+ parts of the General Public License. Of course, the commands you use may
360
+ be called something other than `show w' and `show c'; they could even be
361
+ mouse-clicks or menu items--whatever suits your program.
362
+
363
+ You should also get your employer (if you work as a programmer) or your
364
+ school, if any, to sign a "copyright disclaimer" for the program, if
365
+ necessary. Here is a sample; alter the names:
366
+
367
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
368
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
369
+
370
+ <signature of Ty Coon>, 1 April 1989
371
+ Ty Coon, President of Vice
372
+
373
+ This General Public License does not permit incorporating your program into
374
+ proprietary programs. If your program is a subroutine library, you may
375
+ consider it more useful to permit linking proprietary applications with the
376
+ library. If this is what you want to do, use the GNU Library General
377
+ Public License instead of this License.
32
378
 
33
- Currently, the only available extension is VNMSH. You can read more about it in README.vnmsh.
@@ -283,8 +283,10 @@ module SpecTools
283
283
  attr_accessor :attrs
284
284
  #The type of inheritance
285
285
  attr_accessor :inheritance
286
+ #The landscape on which the MType exists.
287
+ attr_accessor :landscape
286
288
 
287
- def initialize(handle = nil, name = nil, attrs=Hash.new, visible = false, instantiable = false, derivable = false, destroyable = true, unique = false, required = false,inheritance = nil)
289
+ def initialize(handle = nil, name = nil, attrs=Hash.new, visible = false, instantiable = false, derivable = false, destroyable = true, unique = false, required = false,inheritance = nil, landscape = Landscape.new)
288
290
  if handle.nil? || handle.hex?
289
291
  @handle = handle
290
292
  else
@@ -299,6 +301,7 @@ module SpecTools
299
301
  @required = required
300
302
  @inheritance = inheritance
301
303
  @attrs = populate(attrs)
304
+ @landscape = landscape
302
305
  end
303
306
 
304
307
  #define a custom setter for attrs that will automatically convert
@@ -344,8 +347,10 @@ module SpecTools
344
347
  attr_accessor :type
345
348
  #A hash of Attr objects for the model
346
349
  attr_accessor :attrs
350
+ #The landscape on which the Model exists.
351
+ attr_accessor :landscape
347
352
 
348
- def initialize(handle = nil, name = nil, type = MType.new, *attrs)
353
+ def initialize(handle = nil, name = nil, type = MType.new, landscape = Landscape.new,*attrs)
349
354
  if handle.nil? || handle.hex?
350
355
  @handle = handle
351
356
  else
@@ -354,6 +359,7 @@ module SpecTools
354
359
  @name = name
355
360
  @type = type
356
361
  @attrs = Hash.new
362
+ @landscape = landscape
357
363
  attrs.each do |specattr|
358
364
  if specattr.nil? || specattr.instance_of?(Attr)
359
365
  @attrs[specattr.id] = specattr
@@ -377,10 +383,13 @@ module SpecTools
377
383
  attr_accessor :name
378
384
  #This relation's type
379
385
  attr_accessor :type
386
+ #The landscape on which the Relation exists.
387
+ attr_accessor :landscape
380
388
 
381
- def initialize(name = nil, type = nil)
389
+ def initialize(name = nil, type = nil, landscape = Landscape.new)
382
390
  @name = name
383
391
  @type = type
392
+ @landscape = landscape
384
393
  end
385
394
 
386
395
  end
@@ -439,8 +448,14 @@ module SpecTools
439
448
  attr_accessor :url
440
449
  #The ticket number associated with this alarm
441
450
  attr_accessor :ticket
442
-
443
- def initialize(id = nil, time = nil, causeid = nil, model = Model.new, severity = nil, ack = false, stale = false, assignment = nil, status = nil, message = nil, url = nil, ticket = nil)
451
+ #The landscape on which the alarm was thrown
452
+ attr_accessor :landscape
453
+ #Set to true if the alarm is clearable by a user.
454
+ attr_accessor :clearable
455
+ #The state of the alarm
456
+ attr_accessor :state
457
+
458
+ def initialize(id = nil, time = nil, causeid = nil, model = Model.new, severity = nil, ack = false, stale = false, assignment = nil, status = nil, message = nil, url = nil, ticket = nil, clearable = nil, state = nil, landscape = Landscape.new)
444
459
  @id = id
445
460
  @time = time
446
461
  if causeid.nil? || causeid.hex?
@@ -461,6 +476,9 @@ module SpecTools
461
476
  @message = message
462
477
  @url = url
463
478
  @ticket = ticket
479
+ @landscape = landscape
480
+ @clearable = clearable
481
+ @state = state
464
482
  end
465
483
 
466
484
  #Returns true if the alarm has been acknowledged
@@ -494,7 +512,7 @@ module SpecTools
494
512
  #The landscape's handle
495
513
  attr_accessor :handle
496
514
 
497
- def initialize(handle = nil, ssname = nil, precedence = nil, port = nil, service = nil )
515
+ def initialize(handle = nil, ssname = nil, precedence = nil, port = nil, service = nil)
498
516
  @ss = ssname
499
517
  @precedence = precedence
500
518
  @port = port
@@ -522,9 +540,11 @@ module SpecTools
522
540
  #The Model the event was asserted against
523
541
  attr_accessor :model
524
542
  #The event message
525
- attr_accessor :message
543
+ attr_accessor :message
544
+ #The landscape on which the Event exists.
545
+ attr_accessor :landscape
526
546
 
527
- def initialize(time = nil, type = nil, model = Model.new, message = '')
547
+ def initialize(time = nil, type = nil, model = Model.new, message = '',landscape = Landscape.new)
528
548
  @time = time
529
549
  if type.nil? || type.hex?
530
550
  @type = type
@@ -533,6 +553,7 @@ module SpecTools
533
553
  end
534
554
  @model = model
535
555
  @message = message
556
+ @landscape = landscape
536
557
  end
537
558
 
538
559
  end
@@ -548,10 +569,13 @@ module SpecTools
548
569
  attr_accessor :left_mtype
549
570
  #The MType on the right hand side of the rule
550
571
  attr_accessor :right_mtype
572
+ #The landscape on which the Rule exists.
573
+ attr_accessor :landscape
551
574
 
552
- def initialize(left_mtype = MType.new, right_mtype = MType.new)
575
+ def initialize(left_mtype = MType.new, right_mtype = MType.new, landscape = Landscape.new)
553
576
  @left_mtype = left_mtype
554
577
  @right_mtype = right_mtype
578
+ @landscape = landscape
555
579
  end
556
580
 
557
581
  end
@@ -2,7 +2,7 @@ module Spectools #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 1
4
4
  MINOR = 0
5
- TINY = 0
5
+ TINY = 1
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -176,7 +176,17 @@ if defined?(SpecTools::MType)
176
176
  end
177
177
  mtype_output = session.show_types(filter)
178
178
  mtype_output.each do |line|
179
- mtypes.push(MType.parse(line))
179
+ mtype = MType.parse(line)
180
+ if filter && filter[:landscape]
181
+ if filter[:landscape].kind_of?(Landscape)
182
+ mtype.landscape = filter[:landscape]
183
+ else
184
+ mtype.landscape = Landscape.new(filter[:landscape])
185
+ end
186
+ else
187
+ mtype.landscape = session.current_landscape
188
+ end
189
+ mtypes.push(mtype)
180
190
  end
181
191
  return mtypes
182
192
  end
@@ -302,7 +312,17 @@ if defined?(SpecTools::Model)
302
312
  model_output = session.show_models(filter)
303
313
  end
304
314
  model_output.each do |line|
305
- models.push(Model.parse(line))
315
+ model = Model.parse(line)
316
+ if filter && filter[:landscape]
317
+ if filter[:landscape].kind_of?(Landscape)
318
+ model.landscape = filter[:landscape]
319
+ else
320
+ model.landscape = Landscape.new(filter[:landscape])
321
+ end
322
+ else
323
+ model.landscape = session.current_landscape
324
+ end
325
+ models.push(model)
306
326
  end
307
327
  return models
308
328
  end
@@ -521,7 +541,18 @@ if defined?(SpecTools::Relation)
521
541
  session = VNMSH.get_session(session)
522
542
  rel_output = session.show_relations(landscape)
523
543
  rel_output.each do |line|
524
- relations.push(Relation.parse(line))
544
+ relation = Relation.parse(line)
545
+ if landscape
546
+ if landscape.kind_of?(Landscape)
547
+ relation.landscape = landscape
548
+ else
549
+ relation.landscape = Landscape.new(landscape)
550
+ end
551
+ else
552
+ relation.landscape = session.current_landscape
553
+ end
554
+ relations.push(relation)
555
+
525
556
  end
526
557
  return relations
527
558
  end
@@ -535,7 +566,17 @@ if defined?(SpecTools::Relation)
535
566
  rules = Array.new
536
567
  rule_output = session.show_rules(self)
537
568
  rule_output.each do |line|
538
- rules.push(Rule.parse(line))
569
+ rule = Rule.parse(line)
570
+ if landscape
571
+ if landscape.kind_of?(Landscape)
572
+ rule.landscape = landscape
573
+ else
574
+ rule.landscape = Landscape.new(landscape)
575
+ end
576
+ else
577
+ rule.landscape = session.current_landscape
578
+ end
579
+ rules.push(rule)
539
580
  end
540
581
  return rules
541
582
  end
@@ -668,7 +709,17 @@ if defined?(SpecTools::Alarm)
668
709
  causes = Hash.new
669
710
  alarm_output.each do |line|
670
711
  if line =~ /\d+\s+\d\d\/\d\d\/\d\d\d\d/
671
- alarms.push(Alarm.parse(line))
712
+ alarm = Alarm.parse(line)
713
+ if type == :landscape
714
+ if mh_or_lh.kind_of?(Landscape)
715
+ alarm.landscape = mh_or_lh
716
+ else
717
+ alarm.landscape = Landscape.new(mh_or_lh)
718
+ end
719
+ else
720
+ alarm.landscape = session.current_landscape
721
+ end
722
+ alarms.push(alarm)
672
723
  elsif line =~ /^(0x[a-fA-F0-9]+)\s/
673
724
  causeid = $1
674
725
  causes[causeid] = line.sub(/^(0x[a-fA-F0-9]+)\s/,"")
@@ -742,7 +793,17 @@ if defined?(SpecTools::Event)
742
793
  event_output = session.show_events(type,mh_or_lh,limit,evformat)
743
794
  event_output.each do |line|
744
795
  if line =~ /^\d\d\/\d\d\/\d\d\d\d/
745
- events.push(Event.parse(line))
796
+ event = Event.parse(line)
797
+ if type == :landscape
798
+ if mh_or_lh.kind_of?(Landscape)
799
+ event.landscape = mh_or_lh
800
+ else
801
+ event.landscape = Landscape.new(mh_or_lh)
802
+ end
803
+ else
804
+ event.landscape = session.current_landscape
805
+ end
806
+ events.push(event)
746
807
  else
747
808
  events.last.message = events.last.message + line
748
809
  end
@@ -896,6 +957,7 @@ class VNMSH
896
957
  disconnectcmd = @specroot + '/vnmsh/disconnect 2>&1'
897
958
  output = StringIO.new(`#{disconnectcmd}`)
898
959
  @connected = false
960
+ @current_landscape = nil
899
961
  result = output.readline
900
962
  if result =~ /^disconnect: successful/
901
963
  return true
@@ -1042,11 +1104,11 @@ class VNMSH
1042
1104
  when :type
1043
1105
  showcmd += ' mth=' + get_handle(filter[option],MType)
1044
1106
  when :name
1045
- showcmd += ' mname=' + filter[option]
1107
+ showcmd += ' mname="' + filter[option] + '"'
1046
1108
  when :landscape
1047
1109
  showcmd += ' lh=' + get_handle(filter[option],Landscape)
1048
1110
  else
1049
- raise ArgumentError, 'Valid filter options are :range, :name, :flag, or :landscape'
1111
+ raise ArgumentError, 'Valid filter options are :range, :name, :type, or :landscape'
1050
1112
  end
1051
1113
  end
1052
1114
  end
@@ -1148,7 +1210,7 @@ class VNMSH
1148
1210
  get_handle(filter[option][1],MType) if filter[option].kind_of?(Array)
1149
1211
 
1150
1212
  when :name
1151
- showcmd += ' mtname=' + filter[option]
1213
+ showcmd += ' mtname="' + filter[option] + '"'
1152
1214
  when :flag
1153
1215
  showcmd += ' flags=' + filter[option]
1154
1216
  when :landscape
@@ -1594,7 +1656,7 @@ class VNMSH
1594
1656
  createcmd += get_handle(mtype,MType)
1595
1657
  createcmd += expand_attrs(attrs) if attrs
1596
1658
  createcmd += ' lh=' + get_handle(landscape,Landscape) if landscape
1597
- output = exec_cmd(createcmd)
1659
+ output = exec_cmd(expand_backslashes(createcmd))
1598
1660
  result = output.readlines.last
1599
1661
  if result =~ /created model handle\s+=\s+(0x[0-f]+)/
1600
1662
  model = Model.new
@@ -1621,7 +1683,7 @@ class VNMSH
1621
1683
  updatecmd = 'update mh='
1622
1684
  updatecmd += get_handle(model,Model)
1623
1685
  updatecmd += expand_attrs(attrs)
1624
- output = exec_cmd(updatecmd)
1686
+ output = exec_cmd(expand_backslashes(updatecmd))
1625
1687
  result = output.readlines.first
1626
1688
  if result =~ /^Id/
1627
1689
  return true
@@ -1670,7 +1732,7 @@ class VNMSH
1670
1732
  updatecmd += process_alarm_action(key,action[key])
1671
1733
  end
1672
1734
  end
1673
- result = exec_cmd(updatecmd)
1735
+ result = exec_cmd(expand_backslashes(updatecmd))
1674
1736
  if $?.exitstatus == 0
1675
1737
  return true
1676
1738
  else
@@ -1730,11 +1792,11 @@ class VNMSH
1730
1792
  createcmd = 'create alarm '
1731
1793
  createcmd += '-nr ' if replace
1732
1794
  if severity =~ /CRITICAL/i ||
1733
- /MAJOR/i ||
1734
- /MINOR/i ||
1735
- /SUPPRESSED/i ||
1736
- /MAINTENANCE/i ||
1737
- /INITIAL/i
1795
+ severity =~ /MAJOR/i ||
1796
+ severity =~ /MINOR/i ||
1797
+ severity =~ /SUPPRESSED/i ||
1798
+ severity =~ /MAINTENANCE/i ||
1799
+ severity =~ /INITIAL/i
1738
1800
  createcmd += "sev=#{severity} "
1739
1801
  else
1740
1802
  raise ArgumentError, 'Severity must be CRITICAL, MAJOR, MINOR, SUPPRESSED, MAINTENANCE, or INITIAL'
@@ -1776,7 +1838,7 @@ class VNMSH
1776
1838
  raise ArgumentError, 'You must pass a valid Event Code'
1777
1839
  end
1778
1840
  createcmd += ' mh=' + get_handle(model,Model)
1779
- output = exec_cmd(createcmd)
1841
+ output = exec_cmd(expand_backslashes(createcmd))
1780
1842
  if $?.exitstatus > 0
1781
1843
  raise CommandError, output.readlines.first
1782
1844
  else
@@ -1794,6 +1856,10 @@ class VNMSH
1794
1856
 
1795
1857
  private
1796
1858
 
1859
+ def expand_backslashes(cmd)
1860
+ return cmd.gsub(/\\/,'\\\\\\\\')
1861
+ end
1862
+
1797
1863
  def valid_alarm_action?(action)
1798
1864
  validactions = [ :ticket,
1799
1865
  :assign,
@@ -49,6 +49,8 @@ class TestSpectool < Test::Unit::TestCase
49
49
  @alarmcause = "Test Cause"
50
50
  @alarmurl = "http://www.test.com"
51
51
  @alarmticket = "ticket12345"
52
+ @alarmclearable = true
53
+ @alarmstate = 'NEW'
52
54
  @ssname = "test.ss.com"
53
55
  @lscapeprecedence = 10
54
56
  @lscapeport = "0xbeef"
@@ -187,13 +189,14 @@ class TestSpectool < Test::Unit::TestCase
187
189
  assert_equal false, mtype.required
188
190
  assert_nil mtype.inheritance
189
191
  assert_instance_of Hash, mtype.attrs
190
-
192
+ assert_instance_of Landscape, mtype.landscape
191
193
  end
192
194
 
193
195
  def test_init_mtype_args
194
196
  attr1 = SpecTools::Attr.new('0x01','test')
195
197
  attr2 = SpecTools::Attr.new(@attrid,@attrname)
196
- mtype = SpecTools::MType.new(@mthandle,@mtname,[attr1,attr2],@mtvisible,@mtinstantiable,@mtderivable,@mtdestroy,@mtunique,@mtrequired,@mtinheritance)
198
+ testlscape = SpecTools::Landscape.new('0x400000')
199
+ mtype = SpecTools::MType.new(@mthandle,@mtname,[attr1,attr2],@mtvisible,@mtinstantiable,@mtderivable,@mtdestroy,@mtunique,@mtrequired,@mtinheritance,testlscape)
197
200
  assert_equal @mthandle, mtype.handle
198
201
  assert_equal @mtname, mtype.name
199
202
  assert_equal @mtvisible, mtype.visible
@@ -211,6 +214,7 @@ class TestSpectool < Test::Unit::TestCase
211
214
  assert_raise ArgumentError do
212
215
  SpecTools::MType.new(nil,nil,["notanattr"])
213
216
  end
217
+ assert_same testlscape, mtype.landscape
214
218
  end
215
219
 
216
220
  def test_set_mtype_attrs
@@ -234,29 +238,35 @@ class TestSpectool < Test::Unit::TestCase
234
238
  assert_nil smodel.handle
235
239
  assert_instance_of SpecTools::MType, smodel.type
236
240
  assert_equal Hash.new, smodel.attrs
241
+ assert_instance_of Landscape, smodel.landscape
237
242
  end
238
243
 
239
244
  def test_init_model_args
240
245
  attr1 = SpecTools::Attr.new
241
246
  attr2 = SpecTools::Attr.new(@attrid,@attrname)
242
247
  mtype = SpecTools::MType.new(@mthandle,@mtname)
243
- smodel = SpecTools::Model.new(@modelhandle, @modelname, mtype, attr1, attr2)
248
+ testlscape = SpecTools::Landscape.new('0x400000')
249
+ smodel = SpecTools::Model.new(@modelhandle, @modelname, mtype, testlscape,attr1, attr2)
244
250
  assert_equal @modelhandle, smodel.handle
245
251
  assert_same mtype, smodel.type
246
252
  assert_same attr1, smodel.attrs[attr1.id]
247
253
  assert_same attr2, smodel.attrs[attr2.id]
254
+ assert_same testlscape, smodel.landscape
248
255
  end
249
256
 
250
257
  def test_init_relation
251
258
  relation = SpecTools::Relation.new
252
259
  assert_nil relation.name
253
260
  assert_nil relation.type
261
+ assert_instance_of Landscape, relation.landscape
254
262
  end
255
263
 
256
264
  def test_init_relation_args
257
- relation = SpecTools::Relation.new(@relname,@reltype)
265
+ testlscape = SpecTools::Landscape.new('0x400000')
266
+ relation = SpecTools::Relation.new(@relname,@reltype,testlscape)
258
267
  assert_equal @relname, relation.name
259
268
  assert_equal @reltype, relation.type
269
+ assert_same testlscape, relation.landscape
260
270
  end
261
271
 
262
272
  def test_init_association
@@ -290,11 +300,15 @@ class TestSpectool < Test::Unit::TestCase
290
300
  assert_nil alarm.message
291
301
  assert_nil alarm.url
292
302
  assert_nil alarm.ticket
303
+ assert_nil alarm.clearable
304
+ assert_nil alarm.state
305
+ assert_instance_of SpecTools::Landscape, alarm.landscape
293
306
  end
294
307
 
295
308
  def test_init_alarm_args
296
309
  testmodel = SpecTools::Model.new(@modelhandle, @modelname, SpecTools::MType.new(nil,@mtname))
297
- alarm = SpecTools::Alarm.new(@alarmid, @alarmtime, @alarmcauseid, testmodel, @alarmseverity, @alarmack, @alarmstale, @alarmassign, @alarmstatus,@alarmcause,@alarmurl,@alarmticket)
310
+ testlscape = SpecTools::Landscape.new('0x400000')
311
+ alarm = SpecTools::Alarm.new(@alarmid, @alarmtime, @alarmcauseid, testmodel, @alarmseverity, @alarmack, @alarmstale, @alarmassign, @alarmstatus,@alarmcause,@alarmurl,@alarmticket,@alarmclearable,@alarmstate,testlscape)
298
312
  assert_equal @alarmid, alarm.id
299
313
  assert_equal @alarmtime, alarm.time
300
314
  assert_equal @alarmcauseid, alarm.causeid
@@ -307,12 +321,16 @@ class TestSpectool < Test::Unit::TestCase
307
321
  assert_equal @alarmcause, alarm.message
308
322
  assert_equal @alarmurl, alarm.url
309
323
  assert_equal @alarmticket, alarm.ticket
324
+ assert_equal @alarmclearable, alarm.clearable
325
+ assert_equal @alarmstate, alarm.state
326
+
310
327
  assert_raise ArgumentError do
311
328
  SpecTools::Alarm.new(nil,nil,"bogus")
312
329
  end
313
330
  assert_raise ArgumentError do
314
331
  SpecTools::Alarm.new(nil,nil,nil,"bogus")
315
332
  end
333
+ assert_same testlscape,alarm.landscape
316
334
  end
317
335
 
318
336
  def test_init_landscape
@@ -342,11 +360,13 @@ class TestSpectool < Test::Unit::TestCase
342
360
  assert_nil event.type
343
361
  assert_equal '', event.message
344
362
  assert_instance_of SpecTools::Model, event.model
363
+ assert_instance_of SpecTools::Landscape, event.landscape
345
364
  end
346
365
 
347
366
  def test_init_event_args
348
367
  model = SpecTools::Model.new(@modelhandle,@modelname)
349
- event = SpecTools::Event.new(@eventtime,@eventtype,model,@eventmessage)
368
+ testlscape = SpecTools::Landscape.new('0x400000')
369
+ event = SpecTools::Event.new(@eventtime,@eventtype,model,@eventmessage,testlscape)
350
370
  assert_equal @eventtime, event.time
351
371
  assert_equal @eventtype, event.type
352
372
  assert_equal @eventmessage, event.message
@@ -354,20 +374,25 @@ class TestSpectool < Test::Unit::TestCase
354
374
  assert_raise ArgumentError do
355
375
  SpecTools::Event.new(nil,"bogus")
356
376
  end
377
+ assert_same testlscape, event.landscape
378
+
357
379
  end
358
380
 
359
381
  def test_init_rule
360
382
  rule = SpecTools::Rule.new
361
383
  assert_instance_of SpecTools::MType, rule.left_mtype
362
384
  assert_instance_of SpecTools::MType, rule.right_mtype
385
+ assert_instance_of Landscape, rule.landscape
363
386
  end
364
387
 
365
388
  def test_init_rule_args
366
389
  mtype1 = SpecTools::MType.new
367
390
  mtype2 = SpecTools::MType.new
368
- rule = SpecTools::Rule.new(mtype1,mtype2)
391
+ testlscape = SpecTools::Landscape.new('0x400000')
392
+ rule = SpecTools::Rule.new(mtype1,mtype2,testlscape)
369
393
  assert_same mtype1, rule.left_mtype
370
394
  assert_same mtype2, rule.right_mtype
395
+ assert_same testlscape, rule.landscape
371
396
  end
372
397
 
373
398
  def test_watch_init
@@ -114,6 +114,7 @@ class VNMSHConnectionTests < Test::Unit::TestCase
114
114
  def test_vnmsh_connect
115
115
  landscape = @session.connect
116
116
  assert_instance_of SpecTools::Landscape, landscape
117
+ assert_same landscape, @session.current_landscape
117
118
  end
118
119
 
119
120
  def test_vnmsh_connect_args
@@ -126,6 +127,7 @@ class VNMSHConnectionTests < Test::Unit::TestCase
126
127
  assert_instance_of SpecTools::Landscape, landscape
127
128
  assert_equal 'testhost', landscape.ss
128
129
  assert_equal '0x400000', landscape.handle
130
+ assert_same landscape, @session.current_landscape
129
131
 
130
132
  (0..7).each do |i|
131
133
  assert_raise VNMSH::ConnectError do
@@ -142,6 +144,7 @@ class VNMSHConnectionTests < Test::Unit::TestCase
142
144
  @session.disconnect
143
145
  end
144
146
  assert_equal false, @session.connected?
147
+ assert_nil @session.current_landscape
145
148
  end
146
149
 
147
150
  def test_vnmsh_exec_cmd
@@ -1133,6 +1136,7 @@ class VNMSHCommandTests < Test::Unit::TestCase
1133
1136
  end
1134
1137
  models = SpecTools::Model.cli_find(nil,nil,@session)
1135
1138
  assert_equal 2251, models.size
1139
+ assert_same @session.current_landscape, models.first.landscape
1136
1140
 
1137
1141
 
1138
1142
  end
@@ -1159,6 +1163,7 @@ class VNMSHCommandTests < Test::Unit::TestCase
1159
1163
  end
1160
1164
  mtypes = SpecTools::MType.cli_find(nil,@session)
1161
1165
  assert_equal 4209, mtypes.size
1166
+ assert_same @session.current_landscape, mtypes.first.landscape
1162
1167
 
1163
1168
  end
1164
1169
 
@@ -1188,7 +1193,9 @@ class VNMSHCommandTests < Test::Unit::TestCase
1188
1193
  assert_raise ArgumentError do
1189
1194
  SpecTools::Alarm.cli_find(:all)
1190
1195
  end
1191
- assert_equal 10, SpecTools::Alarm.cli_find(:all,nil,nil,@session).size
1196
+ alarms = SpecTools::Alarm.cli_find(:all,nil,nil,@session)
1197
+ assert_equal 10, alarms.size
1198
+ assert_same @session.current_landscape, alarms.first.landscape
1192
1199
  end
1193
1200
 
1194
1201
  def test_event_cli_find_all
@@ -1211,6 +1218,7 @@ class VNMSHCommandTests < Test::Unit::TestCase
1211
1218
  end
1212
1219
  events = SpecTools::Event.cli_find(:all,nil,nil,nil,@session)
1213
1220
  assert_equal 2000,events.size
1221
+ assert_same @session.current_landscape, events.first.landscape
1214
1222
 
1215
1223
  end
1216
1224
 
@@ -1255,6 +1263,7 @@ class VNMSHCommandTests < Test::Unit::TestCase
1255
1263
  relations = nil
1256
1264
  relations = SpecTools::Relation.cli_find(nil,@session)
1257
1265
  assert_equal 150, relations.size
1266
+ assert_same @session.current_landscape, relations.first.landscape
1258
1267
 
1259
1268
  end
1260
1269
 
@@ -1328,7 +1337,9 @@ class VNMSHCommandTests < Test::Unit::TestCase
1328
1337
  end
1329
1338
 
1330
1339
  def test_relation_find_all
1331
- assert_equal 150, SpecTools::Relation.find(nil,@session).size
1340
+ relations = SpecTools::Relation.find(nil,@session)
1341
+ assert_equal 150, relations.size
1342
+ assert_same @session.current_landscape, relations.first.landscape
1332
1343
  end
1333
1344
 
1334
1345
  def test_cli_attr_get
@@ -1430,9 +1441,7 @@ class VNMSHCommandTests < Test::Unit::TestCase
1430
1441
  model = SpecTools::Model.new('0x400005cb')
1431
1442
 
1432
1443
  assert_equal 46, model.cli_get_children.size
1433
-
1434
1444
  assert_equal 46, model.get_children.size
1435
-
1436
1445
  assert_equal 13, model.get_children('PossPrimApp').size
1437
1446
 
1438
1447
  rel = SpecTools::Relation.new('PossPrimApp')
@@ -1484,7 +1493,9 @@ class VNMSHCommandTests < Test::Unit::TestCase
1484
1493
  def test_cli_rules_find
1485
1494
  relation = SpecTools::Relation.new('Collects')
1486
1495
  assert_equal 5837, relation.cli_get_rules.size
1487
- assert_equal 5837, relation.get_rules.size
1496
+ rules = relation.get_rules(nil,@session)
1497
+ assert_equal 5837, rules.size
1498
+ assert_same @session.current_landscape, rules.first.landscape
1488
1499
  end
1489
1500
 
1490
1501
  def test_cli_watch_find
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spectools
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Donavan Pantke
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-03-27 00:00:00 -04:00
12
+ date: 2008-04-24 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -19,11 +19,14 @@ executables: []
19
19
 
20
20
  extensions: []
21
21
 
22
- extra_rdoc_files: []
23
-
22
+ extra_rdoc_files:
23
+ - CHANGELOG.txt
24
+ - Manifest.txt
25
+ - README.txt
26
+ - README.vnmsh.txt
24
27
  files:
25
- - TODO
26
28
  - CHANGELOG.txt
29
+ - TODO
27
30
  - Manifest.txt
28
31
  - README.txt
29
32
  - README.vnmsh.txt
@@ -105,8 +108,9 @@ files:
105
108
  has_rdoc: true
106
109
  homepage: http://spectools.rubyforge.org
107
110
  post_install_message:
108
- rdoc_options: []
109
-
111
+ rdoc_options:
112
+ - --main
113
+ - README.txt
110
114
  require_paths:
111
115
  - lib
112
116
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -124,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
128
  requirements: []
125
129
 
126
130
  rubyforge_project: spectools
127
- rubygems_version: 1.0.1
131
+ rubygems_version: 1.1.1
128
132
  signing_key:
129
133
  specification_version: 2
130
134
  summary: A utility suite for CA's SPECTRUM Network Fault Manager