stella 0.7.0.014 → 0.7.0.015

Sign up to get free protection for your applications and to get access to all the features.
data/Rudyfile ADDED
@@ -0,0 +1,174 @@
1
+ require 'stella'
2
+
3
+ machines do
4
+
5
+ region :'us-east-1' do
6
+ ami 'ami-e348af8a' # Alestic Debian 5.0, 32-bit (US)
7
+ end
8
+ region :'eu-west-1' do
9
+ ami 'ami-6ecde51a' # Alestic Debian 5.0, 32-bit (EU)
10
+ end
11
+
12
+ env :stage do
13
+
14
+ role :app do
15
+ user :root
16
+ size 'm1.small'
17
+ end
18
+
19
+ role :gen do
20
+ size 'm1.small'
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+
28
+
29
+ commands do
30
+ allow :apt_get, "apt-get", :y, :q
31
+ allow :gem_install, "/usr/bin/gem", "install", :n, '/usr/bin', :y, :V, "--no-rdoc", "--no-ri"
32
+ allow :gem_sources, "/usr/bin/gem", "sources"
33
+ allow :gem_uninstall, "/usr/bin/gem", "uninstall", :V
34
+ allow :update_rubygems
35
+ allow :rake
36
+ allow :thin
37
+ allow :stella
38
+ allow :rm
39
+ allow :rackup_path do
40
+ "/usr/lib/ruby/gems/1.8/gems/stella/#{Stella::VERSION}/support/sample_webapp/config.ru"
41
+ end
42
+ end
43
+
44
+ routines do
45
+
46
+ role :app do
47
+
48
+ start do
49
+ remote do
50
+ thin :d, :p, 3114, :R, rackup_path, 'start'
51
+ end
52
+ end
53
+
54
+ stop do
55
+ remote do
56
+ thin :d, :p, 3114, :R, rackup_path, 'stop'
57
+ end
58
+ end
59
+
60
+ end
61
+
62
+ role :gen do
63
+
64
+ # rudy -v -r gen verify ip-10-251-27-245.ec2.internal:3114
65
+ verify do
66
+ remote do |arg|
67
+ stella :v, 'verify', "#{arg.first}"
68
+ end
69
+ end
70
+
71
+ # rudy -v -r gen stress ip-10-251-27-245.ec2.internal:3114
72
+ stress do
73
+ remote do |arg|
74
+ stella :v, 'stress', :c, 50, :r, 4, "#{arg.first}"
75
+ end
76
+ end
77
+
78
+ end
79
+
80
+ setup do
81
+ after :sysupdate, :installdeps, :install_gem
82
+ end
83
+
84
+ shutdown do
85
+ end
86
+
87
+ reboot do
88
+ end
89
+
90
+ install_rubyforge do
91
+ remote :root do
92
+ gem_install 'stella', :V
93
+ end
94
+ end
95
+
96
+ install_github do
97
+ remote :root do
98
+ gem_sources :a, "http://gems.github.com"
99
+ gem_install 'solutious-stella'
100
+ end
101
+ end
102
+
103
+ package_gem do
104
+ local do
105
+ rm :r, :f, 'pkg'
106
+ rake 'package'
107
+ end
108
+ end
109
+
110
+ remove_rudy do
111
+ remote :root do
112
+ gem_uninstall 'stella'
113
+ rm :r, :f, '.stella'
114
+ end
115
+ end
116
+
117
+ install_gem do
118
+ before :package_gem
119
+ remote :root do
120
+ file_upload "pkg/stella-#{Stella::VERSION}.gem", "/tmp/"
121
+ gem_install "/tmp/stella-#{Stella::VERSION}.gem"
122
+ end
123
+
124
+ end
125
+
126
+ installdeps do
127
+ remote :root do
128
+ gem_install "test-spec", "rspec", "camping", "fcgi", "memcache-client"
129
+ gem_install "mongrel"
130
+ gem_install "ruby-openid", :v, "2.0.4" # thin requires 2.0.x
131
+ gem_install "rack", "thin", "sinatra"
132
+ end
133
+ end
134
+
135
+ install_ruby19 do
136
+ remote do
137
+ wget 'ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p243.tar.bz2'
138
+ tar :x, :j, :v, :f, 'ruby-1.9.1-p243.tar.bz2'
139
+ cd 'ruby-1.9.1-p243'
140
+ configure '--prefix=/usr/local', '--enable-shared'
141
+ make
142
+ make 'install'
143
+ end
144
+ end
145
+
146
+ sysupdate do
147
+ remote :root do
148
+ apt_get "update"
149
+ apt_get "install", "libxml2-dev", "libxslt-dev"
150
+ apt_get "install", "build-essential", "git-core"
151
+ apt_get "install", "ruby1.8-dev", "rdoc", "libzlib-ruby", "rubygems"
152
+ apt_get "install", "libfcgi-dev", "libfcgi-ruby1.8"
153
+ gem_sources :a, "http://gems.github.com"
154
+ mkdir :p, "/var/lib/gems/1.8/bin" # Doesn't get created, but causes Rubygems to fail
155
+ gem_install "builder", "session"
156
+ gem_install 'hoe-seattlerb'
157
+ gem_install 'rubygems-update', "-v=1.3.4"
158
+ update_rubygems
159
+ gem_install 'hoe'
160
+ end
161
+ end
162
+
163
+
164
+ end
165
+
166
+
167
+ defaults do
168
+ zone :'us-east-1a'
169
+ environment :stage
170
+ role :app
171
+ color true
172
+ user :root
173
+ end
174
+
data/bin/stella CHANGED
@@ -71,7 +71,8 @@ class Stella::CLI::Definition
71
71
  about "Run a functional test"
72
72
  usage "stella verify http://stellaaahhhh.com/"
73
73
  usage "stella verify -p path/2/testplan.rb http://stellaaahhhh.com/"
74
- option :w, :nowait, "Ignore wait times"
74
+ option :W, :nowait, "Ignore wait times"
75
+ option :w, :wait, Float, "Wait time (in seconds) between client requests (ignored if testplan supplied)"
75
76
  option :p, :testplan, String, "Path to testplan"
76
77
  command :verify => Stella::CLI
77
78
 
data/lib/stella.rb CHANGED
@@ -68,6 +68,7 @@ require 'stella/exceptions'
68
68
  require 'stella/utils'
69
69
  require 'stella/config'
70
70
  require 'stella/data'
71
+ require 'stella/client'
71
72
 
72
73
  Stella::Utils.require_vendor "httpclient", '2.1.5.2'
73
74
  Stella::Utils.require_glob(Stella::LIB_HOME, 'stella', '*.rb')
data/lib/stella/engine.rb CHANGED
@@ -2,22 +2,6 @@
2
2
 
3
3
  module Stella::Engine
4
4
 
5
- # These commented out timers are not very revealing.
6
- #Benelux.add_timer Stella::Client, :execute
7
- Benelux.add_counter Stella::Client, :execute_response_handler
8
- #Benelux.add_timer HTTPClient, :create_request
9
-
10
- # These timers are interesting from a reporting perspective.
11
- Benelux.add_timer HTTPClient, :do_request
12
- Benelux.add_timer HTTPClient::Session, :create_socket
13
- Benelux.add_timer HTTPClient::Session, :create_ssl_socket
14
- Benelux.add_timer HTTPClient::Session, :connect
15
- Benelux.add_timer HTTPClient::Session, :query
16
- Benelux.add_timer HTTPClient::Session, :socket_gets_first_byte
17
- Benelux.add_timer HTTPClient::Session, :get_body
18
-
19
- #Benelux.add_counter Stella::Client, :execute_response_handler
20
-
21
5
  module Base
22
6
  extend self
23
7
 
@@ -51,6 +35,19 @@ module Stella::Engine
51
35
  def update_request_error(*args) raise end
52
36
 
53
37
  end
38
+
39
+ Stella::Utils.require_glob(Stella::LIB_HOME, 'stella', 'engine', '*.rb')
40
+
41
+
42
+ # These timers are interesting from a reporting perspective.
43
+ Benelux.add_counter Stella::Client, :execute_response_handler
44
+ Benelux.add_timer HTTPClient, :do_request
45
+ Benelux.add_timer HTTPClient::Session, :create_socket
46
+ Benelux.add_timer HTTPClient::Session, :create_ssl_socket
47
+ Benelux.add_timer HTTPClient::Session, :connect
48
+ Benelux.add_timer HTTPClient::Session, :query
49
+ Benelux.add_timer HTTPClient::Session, :socket_gets_first_byte
50
+ Benelux.add_timer HTTPClient::Session, :get_body
51
+
54
52
  end
55
53
 
56
- Stella::Utils.require_glob(Stella::LIB_HOME, 'stella', 'engine', '*.rb')
@@ -0,0 +1,293 @@
1
+
2
+ module Stella::Engine
3
+ module Stress
4
+ extend Stella::Engine::Base
5
+ extend self
6
+
7
+ @timers = [:do_request]
8
+ @counts = [:response_content_size]
9
+
10
+ class << self
11
+ attr_accessor :timers, :counts
12
+ end
13
+
14
+ def run(plan, opts={})
15
+ opts = {
16
+ :hosts => [],
17
+ :clients => 1,
18
+ :duration => nil,
19
+ :repetitions => 1
20
+ }.merge! opts
21
+ opts[:clients] = plan.usecases.size if opts[:clients] < plan.usecases.size
22
+ opts[:clients] = 1000 if opts[:clients] > 1000
23
+
24
+ if Stella.loglev > 1
25
+ Stress.timers += [:connect, :create_socket, :query, :socket_gets_first_byte, :get_body]
26
+ Stress.counts = [:request_header_size, :request_content_size]
27
+ Stress.counts += [:response_headers_size, :response_content_size]
28
+ end
29
+
30
+
31
+ Stella.ld "OPTIONS: #{opts.inspect}"
32
+ Stella.li3 "Hosts: " << opts[:hosts].join(', ')
33
+
34
+ counts = calculate_usecase_clients plan, opts
35
+
36
+ Stella.li $/, "Preparing #{counts[:total]} virtual clients...", $/
37
+ Stella.lflush
38
+ packages = build_thread_package plan, opts, counts
39
+
40
+ Stella.li "Generating load...", $/
41
+ Stella.lflush
42
+
43
+ begin
44
+ execute_test_plan packages, opts[:repetitions]
45
+ rescue Interrupt
46
+ Stella.li "Stopping test...", $/
47
+ Stella.abort!
48
+ ensure
49
+ Stella.li "Processing statistics...", $/
50
+ Stella.lflush
51
+
52
+
53
+ wait_for_reporter
54
+
55
+ tt = Benelux.thread_timeline
56
+ test_time = tt.ranges(:execute_test_plan).first.duration
57
+
58
+ generate_report plan, test_time
59
+
60
+ # No need to add the main thread
61
+ # stats to the global timeline.
62
+ # Benelux.reporter.force_update
63
+
64
+ Stella.li "Overall time: "
65
+ Stella.li " prep: %10.2fs" % tt.ranges(:build_thread_package).first.duration
66
+ Stella.li " test: %10.2fs" % test_time
67
+ Stella.li " wait: %10.2fs" % tt.ranges(:wait_for_reporter).first.duration
68
+ Stella.li " post: %10.2fs" % tt.ranges(:generate_report).first.duration
69
+ Stella.li $/
70
+ end
71
+
72
+ # errors?
73
+ end
74
+
75
+ def wait_for_reporter
76
+ Benelux.reporter.wait
77
+ end
78
+
79
+ protected
80
+ class ThreadPackage
81
+ attr_accessor :index
82
+ attr_accessor :client
83
+ attr_accessor :usecase
84
+ def initialize(i, c, u)
85
+ @index, @client, @usecase = i, c, u
86
+ end
87
+ end
88
+
89
+ def calculate_usecase_clients(plan, opts)
90
+ counts = { :total => 0 }
91
+ plan.usecases.each_with_index do |usecase,i|
92
+ count = case opts[:clients]
93
+ when 0..9
94
+ if (opts[:clients] % plan.usecases.size > 0)
95
+ msg = "Client count does not evenly match usecase count"
96
+ raise Stella::Testplan::WackyRatio, msg
97
+ else
98
+ (opts[:clients] / plan.usecases.size)
99
+ end
100
+ else
101
+ (opts[:clients] * usecase.ratio).to_i
102
+ end
103
+ counts[usecase.gibbler_cache] = count
104
+ counts[:total] += count
105
+ end
106
+ counts
107
+ end
108
+
109
+ def build_thread_package(plan, opts, counts)
110
+ packages, pointer = Array.new(counts[:total]), 0
111
+ plan.usecases.each do |usecase|
112
+ count = counts[usecase.gibbler_cache]
113
+ Stella.ld "THREAD PACKAGE: #{usecase.desc} (#{pointer} + #{count})"
114
+ # Fill the thread_package with the contents of the block
115
+ packages.fill(pointer, count) do |index|
116
+ Stella.li3 "Creating client ##{index+1} "
117
+ client = Stella::Client.new opts[:hosts].first, index+1
118
+ client.add_observer(self)
119
+ client.enable_nowait_mode
120
+ ThreadPackage.new(index+1, client, usecase)
121
+ end
122
+ pointer += count
123
+ end
124
+ packages.compact # TODO: Why one nil element sometimes?
125
+ end
126
+
127
+ def execute_test_plan(packages, reps=1)
128
+ Thread.ify packages, :threads => packages.size do |package|
129
+
130
+ # This thread will stay on this one track.
131
+ Benelux.current_track package.client.gibbler
132
+ Benelux.add_thread_tags :usecase => package.usecase.gibbler_cache
133
+
134
+ (1..reps).to_a.each do |rep|
135
+ Benelux.add_thread_tags :rep => rep
136
+ Stella::Engine::Stress.rescue(package.client.gibbler_cache) {
137
+ break if Stella.abort?
138
+ print '.' if Stella.loglev == 2
139
+ stats = package.client.execute package.usecase
140
+ }
141
+ Benelux.remove_thread_tags :rep
142
+ end
143
+
144
+ Benelux.remove_thread_tags :usecase
145
+
146
+ end
147
+ Stella.li2 $/, $/
148
+ end
149
+
150
+ def generate_report(plan,test_time)
151
+ #Benelux.update_all_track_timelines
152
+ global_timeline = Benelux.timeline
153
+
154
+ Stella.li $/, " %-72s ".att(:reverse) % ["#{plan.desc} (#{plan.gibbler_cache.shorter})"]
155
+ plan.usecases.uniq.each_with_index do |uc,i|
156
+
157
+ # TODO: Create Ranges object, like Stats object
158
+ # global_timeline.ranges(:do_request)[:usecase => '1111']
159
+ # The following returns globl do_request ranges.
160
+ requests = 0 #global_timeline.ranges(:do_request).size
161
+
162
+ desc = uc.desc || "Usecase ##{i+1} "
163
+ desc << " (#{uc.gibbler_cache.shorter}) "
164
+ str = ' ' << " %-66s %s %d%% ".bright.att(:reverse)
165
+ Stella.li str % [desc, '', uc.ratio_pretty]
166
+
167
+ uc.requests.each do |req|
168
+ filter = [uc.gibbler_cache, req.gibbler_cache]
169
+ desc = req.desc
170
+ Stella.li " %-72s ".bright % ["#{req.desc} (#{req.gibbler_cache.shorter})"]
171
+ Stella.li " %s" % [req.to_s]
172
+ Stress.timers.each do |sname|
173
+ stats = global_timeline.stats.group(sname)[filter]
174
+ str = ' %-30s %.3f <= ' << '%.3fs' << ' >= %.3f; %.3f(SD) %d(N)'
175
+ Stella.li str % [sname, stats.min, stats.mean, stats.max, stats.sd, stats.n]
176
+ Stella.lflush
177
+ end
178
+ Stella.li $/
179
+ end
180
+
181
+ Stella.li " Sub Total:".bright
182
+
183
+ stats = global_timeline.stats.group(:do_request)[uc.gibbler_cache]
184
+ failed = global_timeline.stats.group(:failed)[uc.gibbler_cache]
185
+ respgrp = global_timeline.stats.group(:execute_response_handler)[uc.gibbler_cache]
186
+ resst = respgrp.tag_values(:status)
187
+ statusi = []
188
+ resst.each do |status|
189
+ size = respgrp[:status => status].size
190
+ statusi << "#{status}: #{size}"
191
+ end
192
+ Stella.li ' %-30s %d (%s)' % ['Total requests', stats.n, statusi.join(', ')]
193
+ Stella.li ' %-29s %d' % [:success, stats.n - failed.n]
194
+ Stella.li ' %-29s %d' % [:failed, failed.n]
195
+
196
+ Stress.timers.each do |sname|
197
+ stats = global_timeline.stats.group(sname)[uc.gibbler_cache]
198
+ Stella.li ' %-30s %.3fs %.3f(SD)' % [sname, stats.mean, stats.sd]
199
+ Stella.lflush
200
+ end
201
+
202
+ Stress.counts.each do |sname|
203
+ stats = global_timeline.stats.group(sname)[uc.gibbler_cache]
204
+ Stella.li ' %-30s %-12s (avg:%s)' % [sname, stats.sum.to_bytes, stats.mean.to_bytes]
205
+ Stella.lflush
206
+ end
207
+ Stella.li $/
208
+ end
209
+
210
+ Stella.li ' ' << " %-66s ".att(:reverse) % 'Total:'
211
+ stats = global_timeline.stats.group(:do_request)
212
+ failed = global_timeline.stats.group(:failed)
213
+ respgrp = global_timeline.stats.group(:execute_response_handler)
214
+ resst = respgrp.tag_values(:status)
215
+ statusi = []
216
+ resst.each do |status|
217
+ size = respgrp[:status => status].size
218
+ statusi << [status, size]
219
+ end
220
+ Stella.li ' %-30s %d' % ['Total requests', stats.n]
221
+ success = stats.n - failed.n
222
+ Stella.li ' %-29s %d (req/s: %.2f)' % [:success, success, success/test_time]
223
+ statusi.each do |pair|
224
+ Stella.li2 ' %-28s %s: %d' % ['', *pair]
225
+ end
226
+ Stella.li ' %-29s %d' % [:failed, failed.n]
227
+
228
+ Stress.timers.each do |sname|
229
+ stats = global_timeline.stats.group(sname)
230
+ Stella.li ' %-30s %-.3fs %-.3f(SD)' % [sname, stats.mean, stats.sd]
231
+ Stella.lflush
232
+ end
233
+
234
+ Stress.counts.each do |sname|
235
+ stats = global_timeline.stats.group(sname)
236
+ Stella.li ' %-30s %-12s (avg:%s)' % [sname, stats.sum.to_bytes, stats.mean.to_bytes]
237
+ Stella.lflush
238
+ end
239
+ Stella.li $/
240
+ end
241
+
242
+
243
+ def update_prepare_request(client_id, usecase, req, counter)
244
+
245
+ end
246
+
247
+ def update_receive_response(client_id, usecase, uri, req, counter, container)
248
+ desc = "#{usecase.desc} > #{req.desc}"
249
+ Stella.li3 ' Client-%s %3d %-6s %-45s' % [client_id.shorter, container.status, req.http_method, uri]
250
+ end
251
+
252
+ def update_execute_response_handler(client_id, req, container)
253
+ end
254
+
255
+ def update_error_execute_response_handler(client_id, ex, req, container)
256
+ desc = "#{container.usecase.desc} > #{req.desc}"
257
+ Stella.li $/ if Stella.loglev == 1
258
+ Stella.le ' Client-%s %-45s %s' % [client_id.shorter, desc, ex.message]
259
+ Stella.li3 ex.backtrace
260
+ end
261
+
262
+ def update_request_error(client_id, usecase, uri, req, params, ex)
263
+ desc = "#{usecase.desc} > #{req.desc}"
264
+ Stella.li $/ if Stella.loglev == 1
265
+ Stella.le ' Client-%s %-45s %s' % [client_id.shorter, desc, ex.message]
266
+ Stella.li3 ex.backtrace
267
+ end
268
+
269
+ def update_quit_usecase client_id, msg
270
+ Stella.li3 " Client-%s QUIT %s" % [client_id.shorter, msg]
271
+ end
272
+
273
+
274
+ def update_repeat_request client_id, counter, total
275
+ Stella.li3 " Client-%s REPEAT %d of %d" % [client_id.shorter, counter, total]
276
+ end
277
+
278
+ def self.rescue(client_id, &blk)
279
+ blk.call
280
+ rescue => ex
281
+ Stella.le ' Error in Client-%s: %s' % [client_id.shorter, ex.message]
282
+ Stella.li3 ex.backtrace
283
+ end
284
+
285
+
286
+ Benelux.add_timer Stella::Engine::Stress, :build_thread_package
287
+ Benelux.add_timer Stella::Engine::Stress, :execute_test_plan
288
+ Benelux.add_timer Stella::Engine::Stress, :generate_report
289
+ Benelux.add_timer Stella::Engine::Stress, :wait_for_reporter
290
+
291
+ end
292
+ end
293
+
@@ -73,6 +73,8 @@ class Testplan
73
73
  req.desc = args[1] if args.size > 1 # Description is optional
74
74
  Stella.ld req
75
75
  @requests << req
76
+ req.gibbler
77
+ req.freeze
76
78
  req
77
79
  end
78
80
  def get(*args, &blk); add_request :get, *args, &blk; end
@@ -6,9 +6,9 @@ module Stella
6
6
  MAJOR = 0.freeze
7
7
  MINOR = 7.freeze
8
8
  TINY = 0.freeze
9
- PATCH = '014'.freeze
9
+ PATCH = '015'.freeze
10
10
  end
11
- def self.to_s; [MAJOR, MINOR, TINY].join('.'); end
11
+ def self.to_s; [MAJOR, MINOR, TINY, PATCH].join('.'); end
12
12
  def self.to_f; self.to_s.to_f; end
13
13
  def self.patch; PATCH; end
14
14
  end
data/stella.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  @spec = Gem::Specification.new do |s|
2
2
  s.name = "stella"
3
3
  s.rubyforge_project = 'stella'
4
- s.version = "0.7.0.014"
4
+ s.version = "0.7.0.015"
5
5
  s.summary = "Stella: Perform load tests on your web applications with beauty and brute strength."
6
6
  s.description = s.summary
7
7
  s.author = "Delano Mandelbaum"
@@ -15,9 +15,10 @@
15
15
 
16
16
  s.executables = %w[stella]
17
17
 
18
- s.add_dependency 'benelux', '>= 0.4.0'
18
+ s.add_dependency 'benelux', '>= 0.4.2'
19
19
  s.add_dependency 'drydock', '>= 0.6.8'
20
20
  s.add_dependency 'gibbler', '>= 0.6.3'
21
+ s.add_dependency 'sysinfo', '>= 0.7.0'
21
22
  s.add_dependency 'storable', '>= 0.5.7'
22
23
  s.add_dependency 'httpclient', '>= 2.1.5'
23
24
  s.add_dependency 'nokogiri'
@@ -29,6 +30,7 @@
29
30
  LICENSE.txt
30
31
  README.rdoc
31
32
  Rakefile
33
+ Rudyfile
32
34
  bin/stella
33
35
  examples/cookies/plan.rb
34
36
  examples/essentials/logo.png
@@ -49,6 +51,7 @@
49
51
  lib/stella/engine.rb
50
52
  lib/stella/engine/functional.rb
51
53
  lib/stella/engine/load.rb
54
+ lib/stella/engine/stress.rb
52
55
  lib/stella/exceptions.rb
53
56
  lib/stella/guidelines.rb
54
57
  lib/stella/mixins.rb
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stella
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0.014
4
+ version: 0.7.0.015
5
5
  platform: ruby
6
6
  authors:
7
7
  - Delano Mandelbaum
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 0.4.0
23
+ version: 0.4.2
24
24
  version:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: drydock
@@ -42,6 +42,16 @@ dependencies:
42
42
  - !ruby/object:Gem::Version
43
43
  version: 0.6.3
44
44
  version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: sysinfo
47
+ type: :runtime
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.7.0
54
+ version:
45
55
  - !ruby/object:Gem::Dependency
46
56
  name: storable
47
57
  type: :runtime
@@ -87,6 +97,7 @@ files:
87
97
  - LICENSE.txt
88
98
  - README.rdoc
89
99
  - Rakefile
100
+ - Rudyfile
90
101
  - bin/stella
91
102
  - examples/cookies/plan.rb
92
103
  - examples/essentials/logo.png
@@ -107,6 +118,7 @@ files:
107
118
  - lib/stella/engine.rb
108
119
  - lib/stella/engine/functional.rb
109
120
  - lib/stella/engine/load.rb
121
+ - lib/stella/engine/stress.rb
110
122
  - lib/stella/exceptions.rb
111
123
  - lib/stella/guidelines.rb
112
124
  - lib/stella/mixins.rb