right_support 2.7.0 → 2.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2009-2012 RightScale Inc
1
+ # Copyright (c) 2009-2013 RightScale Inc
2
2
  #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining
4
4
  # a copy of this software and associated documentation files (the
@@ -44,22 +44,18 @@ module RightSupport
44
44
  # Convert 0 value to nil
45
45
  # This is in support of displaying "none" rather than 0
46
46
  #
47
- # === Parameters
48
- # value(Integer|Float):: Value to be converted
47
+ # @param value [Integer, Float] Value to be converted
49
48
  #
50
- # === Returns
51
- # (Integer|Float|nil):: nil if value is 0, otherwise the original value
49
+ # @return [Integer, Float, NilClass] nil if value is 0, otherwise the original value
52
50
  def self.nil_if_zero(value)
53
51
  value == 0 ? nil : value
54
52
  end
55
53
 
56
54
  # Convert values hash into percentages
57
55
  #
58
- # === Parameters
59
- # values(Hash):: Values to be converted whose sum is the total for calculating percentages
56
+ # @param values [Hash] Values to be converted whose sum is the total for calculating percentages
60
57
  #
61
- # === Return
62
- # (Hash):: Converted values with keys "total" and "percent" with latter being a hash with values as percentages
58
+ # @return [Hash] Converted values with keys "total" and "percent" with latter being a hash with values as percentages
63
59
  def self.percentage(values)
64
60
  total = 0
65
61
  values.each_value { |v| total += v }
@@ -70,11 +66,9 @@ module RightSupport
70
66
 
71
67
  # Convert elapsed time in seconds to displayable format
72
68
  #
73
- # === Parameters
74
- # time(Integer|Float):: Elapsed time
69
+ # @param time [Integer, Float] Elapsed time
75
70
  #
76
- # === Return
77
- # (String):: Display string
71
+ # @return [String] Display string
78
72
  def self.elapsed(time)
79
73
  time = time.to_i
80
74
  if time <= MINUTE
@@ -100,11 +94,9 @@ module RightSupport
100
94
  # string of that precision after applying rounding
101
95
  # When precision is wide ranging, limit precision of the larger numbers
102
96
  #
103
- # === Parameters
104
- # value(Float|Array|Hash):: Value(s) to be converted
97
+ # @param value [Float, Array, Hash] Value(s) to be converted
105
98
  #
106
- # === Return
107
- # (String|Array|Hash):: Value(s) converted to decimal digit string
99
+ # @return [String, Array, Hash] Value(s) converted to decimal digit string
108
100
  def self.enough_precision(value)
109
101
  scale = [1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0]
110
102
  enough = lambda { |v| v = v.abs
@@ -133,60 +125,55 @@ module RightSupport
133
125
  end
134
126
 
135
127
  # Wrap string by breaking it into lines at the specified separators
128
+ # Convert all whitespace sequences to single space before wrapping
136
129
  # Allow for presence of color encoding when measuring string length
137
130
  #
138
- # === Parameters
139
- # string(String):: String to be wrapped
140
- # max_length(Integer|Array):: Maximum length of a line, or array containing
131
+ # @param string [String] String to be wrapped
132
+ # @param max_length [Integer, Array] Maximum length of a line, or array containing
141
133
  # maximum length of first line followed by maximum for any subsequent line
142
134
  # including indent
143
- # indent(String):: Indentation for each line after first
144
- # separators(Regexp):: Separators where string can wrap
135
+ # @param indent [String] Indentation for each line after first
136
+ # @param separators [Regexp] Separators where string can wrap
145
137
  #
146
- # === Return
147
- # (String|Array):: Multi-line string
138
+ # @return [String, Array] Multi-line string
148
139
  def self.wrap(string, max_length, indent, separators)
149
140
  # Strip color encoding from string
150
- strip = lambda { |string| string.gsub(/\e\[[0-9]*m/, "") }
141
+ strip = lambda { |str| str.gsub(/\e\[[0-9]*m/, "") }
151
142
 
152
- # Split string at specified separators and return an array of arrays
153
- # containing string segments and associated separator
154
- split = lambda do |string, separators|
155
- head, sep, tail = string.partition(separators)
156
- if tail == ""
157
- [[head, sep]]
158
- else
159
- [[head, sep]].concat(split.call(tail, separators))
160
- end
161
- end
143
+ # Convert all whitespace (especially \n) to space
144
+ # to provide a clean slate for wrapping
145
+ string = string.gsub(/\s+/, " ")
162
146
 
163
- all = []
164
- line = ["", last_sep = ""]
147
+ # Split string apart using separators one step at a time
148
+ # while building lines of the requested length
149
+ lines = []
150
+ line = ["", last_separator = ""]
165
151
  limit = max_length.is_a?(Array) ? max_length[0] : max_length
166
152
  length = 0
167
153
  separators = /#{separators}/ if separators.is_a?(String)
168
- split.call(string, separators).each do |str, sep|
169
- if (length + strip.call(str).size + last_sep.size + sep.size) > limit
170
- all.push(line) unless line[0] == ""
171
- line = [indent, last_sep = ""]
154
+ while !string.empty? do
155
+ head, separator, tail = string.partition(separators)
156
+ if (length + strip.call(head).size + last_separator.size + separator.size) > limit
157
+ lines.push(line) unless line[0] == ""
158
+ line = [indent, last_separator = ""]
172
159
  length = indent.size
173
160
  limit = max_length.is_a?(Array) ? max_length[1] : max_length
174
161
  end
175
- line[0] += (str = last_sep + str)
176
- line[1] = last_sep = sep
177
- length += strip.call(str).size
162
+ line[0] += (head = last_separator + head)
163
+ line[1] = last_separator = separator
164
+ length += strip.call(head).size
165
+ string = tail
178
166
  end
179
- all.push(line)
180
- all[0..-2].inject("") { |a, (str, sep)| a + str + sep + "\n" } + all[-1][0]
167
+ lines.push(line)
168
+ lines[0..-2].inject("") { |a, (str, separator)| a + str + separator + "\n" } + lines[-1][0]
181
169
  end
182
170
 
183
171
  # Format time value in local time
184
172
  #
185
- # === Parameters
186
- # time(Integer):: Time in seconds in Unix-epoch to be formatted
187
- # with_year(Boolean):: Whether to include year, defaults to false
173
+ # @param time [Integer] Time in seconds in Unix-epoch to be formatted
174
+ # @param with_year [Boolean] Whether to include year, defaults to false
188
175
  #
189
- # (String):: Formatted time string
176
+ # @return [String] Formatted time string
190
177
  def self.time_at(time, with_year = false)
191
178
  if with_year
192
179
  Time.at(time).strftime("%a %b %d %H:%M:%S %Y")
@@ -198,42 +185,39 @@ module RightSupport
198
185
  # Sort hash elements by key in ascending order into array of key/value pairs
199
186
  # Sort keys numerically if possible, otherwise as is
200
187
  #
201
- # === Parameters
202
- # hash(Hash):: Data to be sorted
188
+ # @param hash [Hash] Data to be sorted
203
189
  #
204
- # === Return
205
- # (Array):: Key/value pairs from hash in key sorted order
190
+ # @return [Array] Key/value pairs from hash in key sorted order
206
191
  def self.sort_key(hash)
207
192
  hash.to_a.map { |k, v| [k =~ /^\d+$/ ? k.to_i : k, v] }.sort
208
193
  end
209
194
 
210
195
  # Sort hash elements by value in ascending order into array of key/value pairs
211
196
  #
212
- # === Parameters
213
- # hash(Hash):: Data to be sorted
197
+ # @param hash [Hash] Data to be sorted
214
198
  #
215
- # === Return
216
- # (Array):: Key/value pairs from hash in value sorted order
199
+ # @return [Array] Key/value pairs from hash in value sorted order
217
200
  def self.sort_value(hash)
218
201
  hash.to_a.sort { |a, b| a[1] <=> b[1] }
219
202
  end
220
203
 
221
204
  # Converts server statistics to a displayable format
222
205
  #
223
- # === Parameters
224
- # stats(Hash):: Statistics with generic keys "name", "identity", "hostname", "revision", "service uptime",
206
+ # @param stats [Hash] Statistics with generic keys "name", "identity", "hostname", "revision", "service uptime",
225
207
  # "machine uptime", "memory KB", "stat time", "last reset time", "version", and "brokers" with
226
208
  # "revision", "machine uptime", "memory KB", "version", and "brokers" being optional;
227
209
  # any other keys ending with "stats" have an associated hash value that is displayed in sorted
228
210
  # key order, unless "stats" is preceded by a non-blank, in which case that character is prepended
229
211
  # to the key to drive the sort order
230
- # options(Hash):: Formatting options
231
- # :name_width(Integer):: Maximum characters in displayed stat name
232
- # :sub_name_width(Integer):: Maximum characters in displayed sub-stat name
233
- # :sub_stat_value_width(Integer):: Maximum characters in displayed sub-stat value line
234
212
  #
235
- # === Return
236
- # (String):: Display string
213
+ # @option options [Integer] :name_width Maximum characters in displayed stat name
214
+ # @option options [Integer] :sub_name_width Maximum characters in displayed sub-stat name
215
+ # @option options [Integer] :sub_stat_value_width Maximum characters in displayed sub-stat value line
216
+ # @option options [Array<Hash>] :highlight Sub-statistics to highlight along with specific attributes to highlight,
217
+ # e.g., [{"exceptions" => "total"}, {"response time" => "> 1.0"}, {"health" => ["red", "yellow"]},
218
+ # {"non-deliveries" => [{"last" => "< 36000"}]}]
219
+ #
220
+ # @return [String] Display string
237
221
  def self.stats_str(stats, options = {})
238
222
  name_width = options[:name_width] || MAX_STAT_NAME_WIDTH
239
223
 
@@ -266,12 +250,10 @@ module RightSupport
266
250
 
267
251
  # Converts service uptime stats to displayable format
268
252
  #
269
- # === Parameters
270
- # stats(Integer|Hash):: Service uptime in seconds if an Integer, otherwise a Hash containing
253
+ # @param stats [Integer, Hash] Service uptime in seconds if an Integer, otherwise a Hash containing
271
254
  # "uptime", "total_uptime", "restarts", "graceful_exits", "crashes", and "last_crash_time" values
272
255
  #
273
- # === Return
274
- # (String):: Service uptime display
256
+ # @return [String] Service uptime display
275
257
  def self.service_up_str(stats)
276
258
  if stats.is_a?(Integer)
277
259
  elapsed(stats)
@@ -290,9 +272,8 @@ module RightSupport
290
272
 
291
273
  # Convert broker information to displayable format
292
274
  #
293
- # === Parameter
294
- # brokers(Hash):: Broker stats with keys
295
- # "brokers"(Array):: Stats for each broker in priority order as hash with keys
275
+ # @param brokers [Hash] Broker stats with keys
276
+ # "brokers" [Array] Stats for each broker in priority order as hash with keys
296
277
  # "alias"(String):: Broker alias
297
278
  # "identity"(String):: Broker identity
298
279
  # "status"(Symbol):: Status of connection
@@ -301,19 +282,21 @@ module RightSupport
301
282
  # "failure last"(Hash|nil):: Last connect failure information with key "elapsed", or nil if none
302
283
  # "failures"(Integer|nil):: Number of failed attempts to connect to broker, or nil if none
303
284
  # "retries"(Integer|nil):: Number of attempts to connect after failure, or nil if none
304
- # "exceptions"(Hash|nil):: Exceptions raised per category, or nil if none
285
+ # "exceptions" [Hash, NilClass] Exceptions raised per category, or nil if none
305
286
  # "total"(Integer):: Total exceptions for this category
306
287
  # "recent"(Array):: Most recent as a hash of "count", "type", "message", "when", and "where"
307
- # "heartbeat"(Integer|nil):: Number of seconds between AMQP heartbeats, or nil if heartbeat disabled
308
- # "returns"(Hash|nil):: Message return activity stats with keys "total", "percent", "last", and "rate"
288
+ # "heartbeat" [Integer, NilClass] Number of seconds between AMQP heartbeats, or nil if heartbeat disabled
289
+ # "returns" [Hash, NilClass] Message return activity stats with keys "total", "percent", "last", and "rate"
309
290
  # with percentage breakdown per request type, or nil if none
310
- # options(Hash):: Formatting options
311
- # :name_width(Integer):: Fixed width for left-justified name display
312
- # :sub_name_width(Integer):: Maximum characters in displayed sub-stat name
313
- # :sub_stat_value_width(Integer):: Maximum characters in displayed sub-stat value line
314
291
  #
315
- # === Return
316
- # str(String):: Broker display with one line per broker plus exceptions
292
+ # @option options [Integer] :name_width Fixed width for left-justified name display
293
+ # @option options [Integer] :sub_name_width Maximum characters in displayed sub-stat name
294
+ # @option options [Integer] :sub_stat_value_width Maximum characters in displayed sub-stat value line
295
+ # @option options [Array<Hash>] :highlight Sub-statistics to highlight along with specific attributes to highlight,
296
+ # e.g., [{"exceptions" => "total"}, {"response time" => "> 1.0"}, {"health" => ["red", "yellow"]},
297
+ # {"non-deliveries" => [{"last" => "< 36000"}]}]
298
+ #
299
+ # @return [String] Broker display with one line per broker plus exceptions
317
300
  def self.brokers_str(brokers, options = {})
318
301
  name_width = options[:name_width] || MAX_STAT_NAME_WIDTH
319
302
  sub_name_width = options[:sub_name_width] || MAX_SUB_STAT_NAME_WIDTH
@@ -373,16 +356,17 @@ module RightSupport
373
356
  # Display any nil value, empty hash, or hash with a "total" value of 0 as "none"
374
357
  # Display any floating point value or hash of values with at least two significant digits of precision
375
358
  #
376
- # === Parameters
377
- # name(String):: Display name for the stat
378
- # value(Object):: Value of this stat
379
- # options(Hash):: Formatting options
380
- # :name_width(Integer):: Fixed width for left-justified name display
381
- # :sub_name_width(Integer):: Maximum characters in displayed sub-stat name
382
- # :sub_stat_value_width(Integer):: Maximum characters in displayed sub-stat value line
359
+ # @param name [String] Display name for the stat
360
+ # @param value [Object] Value of this stat
361
+ #
362
+ # @option options [Integer] :name_width Fixed width for left-justified name display
363
+ # @option options [Integer] :sub_name_width Maximum characters in displayed sub-stat name
364
+ # @option options [Integer] :sub_stat_value_width Maximum characters in displayed sub-stat value line
365
+ # @option options [Array<Hash>] :highlight Sub-statistics to highlight along with specific attributes to highlight,
366
+ # e.g., [{"exceptions" => "total"}, {"response time" => "> 1.0"}, {"health" => ["red", "yellow"]},
367
+ # {"non-deliveries" => [{"last" => "< 36000"}]}]
383
368
  #
384
- # === Return
385
- # (String):: Single line display of stat
369
+ # @return [String] Single line display of stat
386
370
  def self.sub_stats_str(name, value, options = {})
387
371
  name_width = options[:name_width] || MAX_STAT_NAME_WIDTH
388
372
  sub_name_width = options[:sub_name_width] || MAX_SUB_STAT_NAME_WIDTH
@@ -393,7 +377,8 @@ module RightSupport
393
377
  sprintf("%-#{name_width}s#{SEPARATOR}", name) + value.to_a.sort.map do |attr|
394
378
  k, v = attr
395
379
  name = k =~ /percent$/ ? k[0..-9] : k
396
- sprintf("%-#{sub_name_width}s#{SEPARATOR}", name) + if v.is_a?(Float) || v.is_a?(Integer)
380
+ sprintf("%-#{sub_name_width}s#{SEPARATOR}", name) +
381
+ if v.is_a?(Numeric)
397
382
  str = k =~ /age$/ ? elapsed(v) : enough_precision(v)
398
383
  str += "/sec" if k =~ /rate$/
399
384
  str += " sec" if k =~ /time$/
@@ -421,19 +406,17 @@ module RightSupport
421
406
 
422
407
  # Convert activity information to displayable format
423
408
  #
424
- # === Parameters
425
- # value(Hash|nil):: Information about activity, or nil if the total is 0
426
- # "total"(Integer):: Total activity count
427
- # "percent"(Hash):: Percentage for each type of activity if tracking type, otherwise omitted
428
- # "last"(Hash):: Information about last activity
409
+ # @param value [Hash, NilClass] Information about activity, or nil if the total is 0
410
+ # "total" [Integer] Total activity count
411
+ # "percent" [Hash] Percentage for each type of activity if tracking type, otherwise omitted
412
+ # "last" [Hash] Information about last activity
429
413
  # "elapsed"(Integer):: Seconds since last activity started
430
414
  # "type"(String):: Type of activity if tracking type, otherwise omitted
431
415
  # "active"(Boolean):: Whether activity still active if tracking whether active, otherwise omitted
432
- # "rate"(Float):: Recent average rate if measuring rate, otherwise omitted
433
- # "duration"(Float):: Average duration of activity if tracking duration, otherwise omitted
416
+ # "rate" [Float] Recent average rate if measuring rate, otherwise omitted
417
+ # "duration" [Float] Average duration of activity if tracking duration, otherwise omitted
434
418
  #
435
- # === Return
436
- # str(String):: Activity stats in displayable format without any line separators
419
+ # @return [String] Activity stats in displayable format without any line separators
437
420
  def self.activity_str(value)
438
421
  str = ""
439
422
  str += enough_precision(sort_value(value["percent"]).reverse).map { |k, v| "#{k}: #{v}%" }.join(", ") +
@@ -452,15 +435,13 @@ module RightSupport
452
435
 
453
436
  # Convert last activity information to displayable format
454
437
  #
455
- # === Parameters
456
- # last(Hash):: Information about last activity
457
- # "elapsed"(Integer):: Seconds since last activity started
458
- # "type"(String):: Type of activity if tracking type, otherwise omitted
459
- # "active"(Boolean):: Whether activity still active if tracking whether active, otherwise omitted
460
- # single_item:: Whether this is to appear as a single item in a comma-separated list
438
+ # @param last [Hash] Information about last activity
439
+ # "elapsed" [Integer] Seconds since last activity started
440
+ # "type" [String] Type of activity if tracking type, otherwise omitted
441
+ # "active" [Boolean] Whether activity still active if tracking whether active, otherwise omitted
442
+ # @param single_item [Boolean] Whether this is to appear as a single item in a comma-separated list
461
443
  # in which case there should be no ':' in the formatted string
462
444
  #
463
- # === Return
464
445
  # str(String):: Last activity in displayable format without any line separators
465
446
  def self.last_activity_str(last, single_item = false)
466
447
  str = "#{elapsed(last['elapsed'])} ago"
@@ -477,25 +458,29 @@ module RightSupport
477
458
 
478
459
  # Convert exception information to displayable format
479
460
  #
480
- # === Parameters
481
- # exceptions(Hash):: Exceptions raised per category
482
- # "total"(Integer):: Total exceptions for this category
483
- # "recent"(Array):: Most recent as a hash of "count", "type", "message", "when", and "where"
484
- # indent(String):: Indentation for each line
485
- # options(Hash):: Formatting options
486
- # :sub_stat_value_width(Integer):: Maximum characters in displayed sub-stat value line
461
+ # @param exceptions [Hash] Exceptions raised per category
462
+ # "total" [Integer] Total exceptions for this category
463
+ # "recent" [Array<Hash>] Most recent as a hash of "count", "type", "message", "when", and "where"
464
+ # @param indent [String] Indentation for each line
487
465
  #
488
- # === Return
489
- # (String):: Exceptions in displayable format with line separators
466
+ # @option options [Integer] :sub_stat_value_width Maximum characters in displayed sub-stat value line
467
+ #
468
+ # @return [String] Exceptions in displayable format with line separators
490
469
  def self.exceptions_str(exceptions, indent, options = {})
491
470
  sub_stat_value_width = options[:sub_stat_value_width] || MAX_SUB_STAT_VALUE_WIDTH
492
471
  indent2 = indent + (" " * 4)
472
+ max_length = [sub_stat_value_width, sub_stat_value_width + indent2.size]
473
+ separators = / |\/\/|\/|::|\.|-/
493
474
  exceptions.to_a.sort.map do |k, v|
494
475
  sprintf("%s total: %d, most recent:\n", k, v["total"]) + v["recent"].reverse.map do |e|
495
- where = " IN #{e["where"]}" if e["where"]
496
- indent + wrap("(#{e["count"]}) #{time_at(e["when"])} #{e["type"]}: #{e["message"]}#{where}",
497
- [sub_stat_value_width, sub_stat_value_width + indent2.size],
498
- indent2, / |\/\/|\/|::|\.|-/)
476
+ head = "(#{e["count"]}) #{time_at(e["when"])} #{e["type"]}: "
477
+ message = e["message"]
478
+ if (i = (/(:[0-9]+:in `[^']+')/ =~ message))
479
+ # Dropping anything after the first line of an embedded backtrace to reduce bulk
480
+ message = message[0..i-1] + $1 + "..."
481
+ end
482
+ tail = " IN #{e["where"]}" if e["where"]
483
+ indent + wrap("#{head}#{message}#{tail}", max_length, indent2, separators)
499
484
  end.join("\n")
500
485
  end.join("\n" + indent)
501
486
  end
@@ -505,11 +490,9 @@ module RightSupport
505
490
  # Display any floating point values with one decimal place precision
506
491
  # Display any empty values as "none"
507
492
  #
508
- # === Parameters
509
- # hash(Hash):: Hash to be displayed
493
+ # @param hash [Hash] Hash to be displayed
510
494
  #
511
- # === Return
512
- # (String):: Single line hash display
495
+ # @return [String] Single line hash display
513
496
  def self.hash_str(hash)
514
497
  str = ""
515
498
  sort_key(hash).map do |k, v|
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{right_support}
8
- s.version = "2.7.0"
8
+ s.version = "2.8.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Tony Spataro", "Sergey Sergyenko", "Ryan Williamson", "Lee Kirchhoff", "Alexey Karpik", "Scott Messier"]
12
- s.date = %q{2013-01-26}
12
+ s.date = %q{2013-08-28}
13
13
  s.description = %q{A toolkit of useful, reusable foundation code created by RightScale.}
14
14
  s.email = %q{support@rightscale.com}
15
15
  s.extra_rdoc_files = [
@@ -143,41 +143,37 @@ Gem::Specification.new do |s|
143
143
  s.summary = %q{Reusable foundation code.}
144
144
 
145
145
  if s.respond_to? :specification_version then
146
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
147
146
  s.specification_version = 3
148
147
 
149
148
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
150
149
  s.add_development_dependency(%q<rake>, ["~> 0.9"])
151
150
  s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
151
+ s.add_development_dependency(%q<right_develop>, ["~> 1.0"])
152
152
  s.add_development_dependency(%q<ruby-debug>, [">= 0.10"])
153
153
  s.add_development_dependency(%q<ruby-debug19>, [">= 0.11.6"])
154
154
  s.add_development_dependency(%q<rdoc>, [">= 2.4.2"])
155
- s.add_development_dependency(%q<rspec>, ["~> 2.0"])
156
- s.add_development_dependency(%q<cucumber>, ["~> 1.0"])
157
- s.add_development_dependency(%q<flexmock>, ["~> 0.8"])
155
+ s.add_development_dependency(%q<flexmock>, ["~> 1.0"])
158
156
  s.add_development_dependency(%q<syntax>, ["~> 1.0.0"])
159
157
  s.add_development_dependency(%q<nokogiri>, ["~> 1.5"])
160
158
  else
161
159
  s.add_dependency(%q<rake>, ["~> 0.9"])
162
160
  s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
161
+ s.add_dependency(%q<right_develop>, ["~> 1.0"])
163
162
  s.add_dependency(%q<ruby-debug>, [">= 0.10"])
164
163
  s.add_dependency(%q<ruby-debug19>, [">= 0.11.6"])
165
164
  s.add_dependency(%q<rdoc>, [">= 2.4.2"])
166
- s.add_dependency(%q<rspec>, ["~> 2.0"])
167
- s.add_dependency(%q<cucumber>, ["~> 1.0"])
168
- s.add_dependency(%q<flexmock>, ["~> 0.8"])
165
+ s.add_dependency(%q<flexmock>, ["~> 1.0"])
169
166
  s.add_dependency(%q<syntax>, ["~> 1.0.0"])
170
167
  s.add_dependency(%q<nokogiri>, ["~> 1.5"])
171
168
  end
172
169
  else
173
170
  s.add_dependency(%q<rake>, ["~> 0.9"])
174
171
  s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
172
+ s.add_dependency(%q<right_develop>, ["~> 1.0"])
175
173
  s.add_dependency(%q<ruby-debug>, [">= 0.10"])
176
174
  s.add_dependency(%q<ruby-debug19>, [">= 0.11.6"])
177
175
  s.add_dependency(%q<rdoc>, [">= 2.4.2"])
178
- s.add_dependency(%q<rspec>, ["~> 2.0"])
179
- s.add_dependency(%q<cucumber>, ["~> 1.0"])
180
- s.add_dependency(%q<flexmock>, ["~> 0.8"])
176
+ s.add_dependency(%q<flexmock>, ["~> 1.0"])
181
177
  s.add_dependency(%q<syntax>, ["~> 1.0.0"])
182
178
  s.add_dependency(%q<nokogiri>, ["~> 1.5"])
183
179
  end