mystro-common 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,9 +1,16 @@
1
1
  # Changelog
2
2
 
3
- ## v0.1.4:
4
- * merge
3
+ ## v0.1.6:
4
+
5
+ ## v0.1.5:
6
+ * update rails to 3.2.14. tweak plugins jobs output to match qujo. fix issue with getting zones through fog
7
+ * smarter errors in dns connect. add and use Account#get instead of @list attr
5
8
  * hard code rake version in Gemfile to match mystro server
6
9
  * support for templates in userdata, handled like files, but processed through erubis
10
+ * merge release v0.1.2
11
+ * new DSL framework
12
+ * ruby version file
13
+ * changelog rake tasks
7
14
 
8
15
  ## v0.1.3:
9
16
  * fixes bugs with dns usage and plugin methods when no plugins are defined
data/Gemfile CHANGED
@@ -4,3 +4,4 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  gem "rake", '10.0.4'
7
+ gem 'awesome_print'
data/Rakefile CHANGED
@@ -49,3 +49,13 @@ desc "show current changes (changelog output from HEAD to most recent tag)"
49
49
  task :current do
50
50
  changelog("HEAD",true)
51
51
  end
52
+
53
+ task :test do
54
+ require "mystro-common"
55
+ require "awesome_print"
56
+ %w{simple medium complex}.each do |n|
57
+ file = "test/#{n}.rb"
58
+ puts "processing: #{n} #{file}"
59
+ Mystro::Template.load(file)
60
+ end
61
+ end
@@ -29,8 +29,8 @@ module Mystro
29
29
  def default
30
30
  return ENV['MYSTRO_ACCOUNT'] if ENV['MYSTRO_ACCOUNT']
31
31
  return Mystro.config.default_account if Mystro.config.default_account?
32
- return "default" if list.keys.include?("default")
33
- list.keys.first
32
+ return "default" if @list.keys.include?("default")
33
+ @list.keys.first
34
34
  end
35
35
 
36
36
  def select(name)
@@ -102,4 +102,4 @@ module Mystro
102
102
  @environment ||= Mystro::Connect::Environment.new(self)
103
103
  end
104
104
  end
105
- end
105
+ end
@@ -3,7 +3,7 @@ module Mystro
3
3
  module Version
4
4
  MAJOR = 0
5
5
  MINOR = 1
6
- TINY = 6
6
+ TINY = 7
7
7
  TAG = nil
8
8
  STRING = [MAJOR, MINOR, TINY, TAG].compact.join(".")
9
9
  end
@@ -0,0 +1,11 @@
1
+ module Mystro
2
+ module DSL
3
+ class Health < Mystro::DSL::Base
4
+ attribute :target, value: "HTTP:80/"
5
+ attribute :interval, value: 30
6
+ attribute :timer, value: 5
7
+ attribute :healthy, value: 2
8
+ attribute :unhealthy, value: 10
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ module Mystro
2
+ module DSL
3
+ class Listener < Mystro::DSL::Base
4
+ attribute :from, value: "http:80"
5
+ attribute :to, value: "http:80"
6
+ attribute :cert
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ module Mystro
2
+ module DSL
3
+ class Sticky < Mystro::DSL::Base
4
+ attribute :type
5
+ attribute :arg
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ module Mystro
2
+ module DSL
3
+ class Balancer < Base
4
+ attribute :primary, type: :boolean, value: false
5
+ has_one :sticky
6
+ has_one :health
7
+ has_many :listeners
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,17 @@
1
+ module Mystro
2
+ module DSL
3
+ class Compute < Base
4
+ attribute :primary, type: :boolean, value: false
5
+ attribute :num, value: 1
6
+ attribute :image
7
+ attribute :flavor
8
+ attribute :keypair
9
+ attribute :userdata, value: "default"
10
+
11
+ attribute :roles, type: :array
12
+ attribute :groups, type: :array
13
+
14
+ references :balancer
15
+ end
16
+ end
17
+ end
@@ -1,281 +1,8 @@
1
1
  module Mystro
2
2
  module DSL
3
- module Template
4
- class << self
5
- def load(name_or_file)
6
- @templates ||= {}
7
- template_name = nil
8
- template_file = nil
9
- if File.exists?(name_or_file)
10
- template_name = File.basename(name_or_file).gsub(/\.rb$/, "").to_sym
11
- template_file = name_or_file
12
- elsif File.exists?("#{dir}/#{name_or_file}.rb")
13
- template_name = name.to_sym
14
- template_file = "#{dir}/#{name}.rb"
15
- end
16
- raise "could not load template #{template_name} (#{template_file})" unless template_file && File.file?(template_file)
17
- #raise "template already loaded #{template_name}" if @templates[template_name]
18
- @templates[template_name] ||= begin
19
- t = Mystro::DSL::Template::DSL.new(template_name)
20
- t.instance_eval(File.read(template_file), "Template(#{template_file})")
21
- @templates[template_name] = t
22
- end
23
- end
24
-
25
- def load_yaml_file(path)
26
- file = File.expand_path(path)
27
- raise "Configuration not found: #{path} (#{file})" unless File.exists?(file)
28
- yaml = YAML.load_file(file)
29
- yaml = yaml[yaml.keys.first] if yaml.keys.count == 1
30
-
31
- yaml
32
- end
33
-
34
- def list
35
- Dir["#{dir}/*"].inject({}) do |h, e|
36
- f = e.gsub("#{dir}/", "")
37
- f = File.basename(f, ".yml")
38
- h[f.to_sym] = e
39
- h
40
- end
41
- end
42
-
43
- private
44
- def dir
45
- "#{Mystro.directory}/templates"
46
- end
47
- end
48
-
49
- class DSL
50
- attr_reader :balancers, :servers
51
-
52
- def initialize(name)
53
- @name = name.to_sym
54
- @balancers = []
55
- @servers = []
56
- end
57
-
58
- def template(&block)
59
- instance_eval &block
60
- end
61
-
62
- def balancer(name, &block)
63
- balancer = Balancer.new(name)
64
- balancer.instance_eval &block
65
- @balancers << balancer
66
- end
67
-
68
- def server(name, &block)
69
- server = Server.new(name)
70
- server.instance_eval &block
71
- @servers << server
72
- end
73
- end
74
-
75
- class Base
76
- def attr(name, value=nil)
77
- @attrs[name] = value unless value.nil?
78
- @attrs[name]
79
- end
80
-
81
- def list_attr(name, value=nil)
82
- @attrs[name] ||= []
83
- unless value.nil?
84
- if value.kind_of?(Array)
85
- @attrs[name] += value
86
- else
87
- @attrs[name] << value
88
- end
89
- end
90
- @attrs[name]
91
- end
92
- end
93
-
94
- class Server < Base
95
- def initialize(name)
96
- @attrs = {
97
- :name => name.to_sym,
98
- :roles => [],
99
- :groups => [],
100
- :count => 1,
101
- :image => nil,
102
- :flavor => nil,
103
- :keypair => nil,
104
- :userdata => "default",
105
- :dnsnames => [],
106
- }
107
- end
108
-
109
- def name
110
- @attrs[:name]
111
- end
112
-
113
- def roles
114
- @attrs[:roles]
115
- end
116
-
117
- def groups
118
- @attrs[:groups]
119
- end
120
-
121
- def dnsnames
122
- @attrs[:dnsnames]
123
- end
124
-
125
- def role(r)
126
- list_attr(:roles, r)
127
- end
128
-
129
- def count(c=nil)
130
- attr(:count, c)
131
- end
132
-
133
- def image(i=nil)
134
- attr(:image, i)
135
- end
136
-
137
- def flavor(f=nil)
138
- attr(:flavor, f)
139
- end
140
-
141
- def group(g)
142
- list_attr(:groups, g)
143
- end
144
-
145
- def keypair(k=nil)
146
- attr(:keypair, k)
147
- end
148
-
149
- def userdata(u=nil)
150
- attr(:userdata, u)
151
- end
152
-
153
- def balancer(b=nil, &block)
154
- if block_given?
155
- raise "balancer block must specify name" unless b
156
- Mystro::DSL::Template::DSL.balancer(b, &block)
157
- end
158
- attr(:balancer, b)
159
- end
160
-
161
- def dns(name)
162
- n = name.gsub(Mystro.get_config(:dns_zone), "")
163
- list_attr(:dnsnames, n)
164
- end
165
- end
166
-
167
- class Balancer
168
- attr_reader :name, :sticky, :primary, :sticky_type, :sticky_arg
169
-
170
- def initialize(name)
171
- @listeners = []
172
- @name = name.to_sym
173
- @primary = false
174
- @sticky = false
175
- end
176
-
177
- def primary(enable = nil)
178
- enable.nil? ? @primary : @primary = enable
179
- end
180
-
181
- def listener(&block)
182
- listener = Listener.new
183
- listener.instance_eval &block
184
- @listeners << listener
185
- end
186
-
187
- def health(&block)
188
- healthcheck = HealthCheck.new
189
- healthcheck.instance_eval &block
190
- @healthcheck = healthcheck
191
- end
192
-
193
- def listeners
194
- @listeners.map { |e| e.spec }
195
- end
196
-
197
- def sticky(type=nil, expires_or_cookie=nil)
198
- if type && expires_or_cookie
199
- @sticky = true
200
- @sticky_type = type
201
- @sticky_arg = expires_or_cookie
202
- end
203
- @sticky
204
- end
205
- end
206
-
207
- class Listener
208
- def initialize
209
- @from_proto = nil
210
- @from_port = nil
211
- @to_proto = nil
212
- @to_port = nil
213
- @cert = nil
214
- end
215
-
216
- def from(proto, port)
217
- @from_proto = proto
218
- @from_port = port
219
- end
220
-
221
- def to(proto, port)
222
- @to_proto = proto
223
- @to_port = port
224
- end
225
-
226
- def cert(cert)
227
- @cert = cert
228
- end
229
-
230
- def spec
231
- {
232
- :from => "#@from_proto:#@from_port",
233
- :to => "#@to_proto:#@to_port",
234
- :cert => @cert,
235
- }
236
- end
237
- end
238
-
239
- class HealthCheck
240
- def initialize
241
- @healthy = 10
242
- @unhealthy = 2
243
- @interval = 30
244
- @target = nil
245
- @timeout = 5
246
- end
247
-
248
- def healthy(v)
249
- @healthy = v
250
- end
251
-
252
- def unhealthy(v)
253
- @unhealthy = v
254
- end
255
-
256
- def interval(v)
257
- @interval = v
258
- end
259
-
260
- def target(v)
261
- @target = v
262
- end
263
-
264
- def timeout(v)
265
- @timeout = v
266
- end
267
-
268
- def spec
269
- raise "target not specified for health check" unless @target
270
- {
271
- healthy: @healthy,
272
- unhealthy: @unhealthy,
273
- interval: @interval,
274
- target: @target,
275
- timeout: @timeout,
276
- }
277
- end
278
- end
3
+ class Template < Base
4
+ has_many :balancers, named: true
5
+ has_many :computes, named: true
279
6
  end
280
7
  end
281
8
  end
@@ -0,0 +1,7 @@
1
+ module Mystro
2
+ module DSL
3
+ class TemplateFile < Base
4
+ has_one :template
5
+ end
6
+ end
7
+ end
data/lib/mystro/dsl.rb ADDED
@@ -0,0 +1,145 @@
1
+ require "active_support/all"
2
+
3
+ module Mystro
4
+ module DSL
5
+ class Base
6
+ attr_reader :data
7
+
8
+ def initialize
9
+ @data = Marshal.load(Marshal.dump(self.class.attrs))
10
+ end
11
+
12
+ def method_missing(method, *args, &block)
13
+ m = method.to_sym
14
+ raise "unknown attribute #{method}: #{@data.inspect}" unless @data[m]
15
+ o = @data[m]
16
+
17
+ if o[:type] == :array
18
+ #puts "setting #{m} << #{args.first}"
19
+ o[:value] << args.first
20
+ elsif o[:type] == :child
21
+ #puts "setting child #{m} << #{o[:klass]}"
22
+ k = o[:klass].constantize
23
+ obj = k.new
24
+ obj.instance_eval &block
25
+ if o[:many]
26
+ if o[:named]
27
+ o[:value] ||= {}
28
+ o[:value][args.first.to_sym] = obj.to_hash
29
+ else
30
+ o[:value] << obj.to_hash
31
+ end
32
+ else
33
+ raise "setting more than one #{method}: previous: #{o[:value].inspect}" if o[:value]
34
+ o[:value] = obj.to_hash
35
+ end
36
+ else
37
+ #puts "setting #{m} = #{args.first}"
38
+ o[:value] = args.first
39
+ end
40
+ end
41
+
42
+ def validate!
43
+ if @data[:block]
44
+ block.call(self)
45
+ end
46
+ rescue => e
47
+ raise "validation failed: #{e.message} at #{e.backtrace.first}"
48
+ end
49
+
50
+ def to_hash
51
+ @hash ||= begin
52
+ validate!
53
+ out = {}
54
+ @data.each do |k, v|
55
+ out[k] = v[:value]
56
+ end
57
+ out
58
+ end
59
+ end
60
+
61
+ #def to_mash
62
+ # Hashie::Mash.new(to_hash)
63
+ #end
64
+
65
+ class << self
66
+ @attrs = {}
67
+ attr_accessor :attrs
68
+
69
+ def attribute(name, options={}, &block)
70
+ n = name.to_sym
71
+ o = {
72
+ value: nil,
73
+ type: :string,
74
+ klass: nil
75
+ }.merge(options)
76
+ #puts "ATTR: #{name} - #{o.inspect}"
77
+
78
+ if o[:type] == :array
79
+ n = name.to_s.singularize.to_sym
80
+ o[:value] = [] unless o[:value]
81
+ else
82
+ if o[:type] == :child
83
+ if o[:many]
84
+ if o[:named]
85
+ o[:value] = {} unless o[:value]
86
+ else
87
+ o[:value] = [] unless o[:value]
88
+ end
89
+ else
90
+ o[:value] = nil
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+ o[:block] = block if block_given?
97
+
98
+ @attrs ||= {}
99
+ @attrs[n] = o
100
+ end
101
+
102
+ def has_one(name, options={})
103
+ o = {
104
+ klass: find_class(name),
105
+ type: :child,
106
+ many: false,
107
+ named: false,
108
+ value: nil
109
+ }.merge(options)
110
+ attribute(name, o)
111
+ end
112
+
113
+ def has_many(names, options={})
114
+ singular = names.to_s.singularize
115
+ o = {
116
+ klass: find_class(singular),
117
+ type: :child,
118
+ many: true,
119
+ named: false,
120
+ value: nil
121
+ }.merge(options)
122
+ attribute(singular, o)
123
+ end
124
+
125
+ def references(name, options={})
126
+ attribute(name, options)
127
+ end
128
+
129
+ def find_class(name)
130
+ c = "Mystro::DSL::#{name.capitalize}"
131
+ #puts "FINDCLASS: #{name} #{c}"
132
+ c
133
+ rescue => e
134
+ raise "could not find class: #{c}: #{e.message} at #{e.backtrace.first}"
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+
141
+ dir = "#{File.dirname(__FILE__)}/dsl"
142
+ Dir[File.join("#{dir}/**", "*.rb")].each do |file|
143
+ #puts "loading: #{file}"
144
+ require "#{file.gsub(/\.rb/, '')}"
145
+ end
@@ -0,0 +1,50 @@
1
+ module Mystro
2
+ module Template
3
+ class << self
4
+ def load(name_or_file)
5
+ @templates ||= {}
6
+ template_name = nil
7
+ template_file = nil
8
+ if File.exists?(name_or_file)
9
+ template_name = File.basename(name_or_file).gsub(/\.rb$/, "").to_sym
10
+ template_file = name_or_file
11
+ elsif File.exists?("#{dir}/#{name_or_file}.rb")
12
+ template_name = name.to_sym
13
+ template_file = "#{dir}/#{name}.rb"
14
+ end
15
+ raise "could not load template #{template_name} (#{template_file})" unless template_file && File.file?(template_file)
16
+ #raise "template already loaded #{template_name}" if @templates[template_name]
17
+
18
+ @templates[template_name] ||= begin
19
+ d = File.read(template_file)
20
+ t = Mystro::DSL::TemplateFile.new
21
+ t.instance_eval(d, "TemplateFile(#{template_file})")
22
+ t.to_hash
23
+ end
24
+ end
25
+
26
+ #def load_yaml_file(path)
27
+ # file = File.expand_path(path)
28
+ # raise "Configuration not found: #{path} (#{file})" unless File.exists?(file)
29
+ # yaml = YAML.load_file(file)
30
+ # yaml = yaml[yaml.keys.first] if yaml.keys.count == 1
31
+ #
32
+ # yaml
33
+ #end
34
+
35
+ def list
36
+ Dir["#{dir}/*"].inject({}) do |h, e|
37
+ f = e.gsub("#{dir}/", "")
38
+ f = File.basename(f, ".yml")
39
+ h[f.to_sym] = e
40
+ h
41
+ end
42
+ end
43
+
44
+ private
45
+ def dir
46
+ "#{Mystro.directory}/templates"
47
+ end
48
+ end
49
+ end
50
+ end
data/lib/mystro-common.rb CHANGED
@@ -58,10 +58,12 @@ end
58
58
  require "mystro/config"
59
59
  require "mystro/account"
60
60
  require "mystro/log"
61
- require "mystro/dsl/template"
61
+
62
+ require "mystro/dsl"
62
63
  require "mystro/plugin"
63
64
  require "mystro/connect"
64
65
  require "mystro/userdata"
66
+ require "mystro/template"
65
67
 
66
68
  Mystro::Config.instance
67
69
  Mystro::Account.read
data/test/complex.rb ADDED
@@ -0,0 +1,74 @@
1
+ template do
2
+ balancer :frontend do
3
+ primary true
4
+ listener do
5
+ from "https:443"
6
+ to "http:80"
7
+ cert "arn:aws:iam::595408174370:server-certificate/2013inqlabs.com"
8
+ end
9
+ listener do
10
+ from "http:80"
11
+ to "http:80"
12
+ end
13
+ health do
14
+ target "HTTP:80/"
15
+ end
16
+ end
17
+
18
+ balancer :backend do
19
+ listener do
20
+ from "http:8080"
21
+ to "http:8080"
22
+ end
23
+ health do
24
+ target "HTTP:8080/INQReaderServer/rest/AjaxConfig/config"
25
+ end
26
+ end
27
+
28
+ balancer :image do
29
+ listener do
30
+ from "http:80"
31
+ to "http:80"
32
+ end
33
+ health do
34
+ target "HTTP:80/getImages?url=http%3A%2F%2Fwww.bbc.co.uk%2Fnews%2Fworld-us-canada-21638727"
35
+ interval 120
36
+ timer 60
37
+ unhealthy 3
38
+ healthy 10
39
+ end
40
+ end
41
+
42
+ compute :backend do
43
+ num 3
44
+ role :backend
45
+ flavor "m1.xlarge"
46
+ userdata "chef"
47
+ image "ami-3236ad5b" # 0.6.2.1
48
+ group "backend"
49
+ keypair "live"
50
+ balancer :backend
51
+ end
52
+
53
+ compute :frontend do
54
+ num 3
55
+ role :frontend
56
+ flavor "m1.medium"
57
+ userdata "chef"
58
+ image "ami-0145d268"
59
+ group "frontend"
60
+ keypair "live"
61
+ balancer :frontend
62
+ end
63
+
64
+ compute :image do
65
+ num 5
66
+ role :image
67
+ balancer :image
68
+ userdata "chef"
69
+ flavor "m1.large"
70
+ image "ami-ac8f13c5"
71
+ group "frontend"
72
+ keypair "live"
73
+ end
74
+ end
data/test/medium.rb ADDED
@@ -0,0 +1,78 @@
1
+ template do
2
+ balancer :frontend do
3
+ primary true
4
+ listener do
5
+ from :https, 443
6
+ to :http, 80
7
+ cert "arn:aws:iam::595408174370:server-certificate/2013inqlabs.com"
8
+ end
9
+ listener do
10
+ from :http, 80
11
+ to :http, 80
12
+ end
13
+ health do
14
+ target "HTTP:80/"
15
+ end
16
+ end
17
+
18
+ balancer :backend do
19
+ listener do
20
+ from :http, 8080
21
+ to :http, 8080
22
+ end
23
+ health do
24
+ target "HTTP:8080/INQReaderServer/rest/AjaxConfig/config"
25
+ end
26
+ end
27
+
28
+ balancer :image do
29
+ listener do
30
+ from :http, 80
31
+ to :http, 80
32
+ end
33
+ listener do
34
+ from :http, 8080
35
+ to :http, 8080
36
+ end
37
+ health do
38
+ target "HTTP:80/getImages?url=http%3A%2F%2Fwww.bbc.co.uk%2Fnews%2Fworld-us-canada-21638727"
39
+ interval 120
40
+ timer 60
41
+ unhealthy 3
42
+ healthy 10
43
+ end
44
+ end
45
+
46
+ compute :image do
47
+ num 2
48
+ role :app
49
+ balancer :image
50
+ userdata "chef"
51
+ flavor "m1.large"
52
+ image "ami-ac8f13c5"
53
+ group "frontend"
54
+ keypair "stage"
55
+ end
56
+
57
+ compute :backend do
58
+ num 2
59
+ role :backend
60
+ balancer :backend
61
+ flavor "m1.xlarge"
62
+ userdata "chef"
63
+ image "ami-3236ad5b" # 0.6.2.1
64
+ group "backend"
65
+ keypair "stage"
66
+ end
67
+
68
+ compute :frontend do
69
+ num 2
70
+ role :frontend
71
+ balancer :frontend
72
+ flavor "m1.large"
73
+ userdata "chef"
74
+ image "ami-0145d268"
75
+ group "frontend"
76
+ keypair "stage"
77
+ end
78
+ end
data/test/simple.rb ADDED
@@ -0,0 +1,31 @@
1
+ template do
2
+ compute :backend do
3
+ num 1
4
+ role :backend
5
+ flavor "m1.xlarge"
6
+ userdata "chef"
7
+ image "ami-3236ad5b" # 0.6.2.1
8
+ group "backend"
9
+ keypair "dev"
10
+ end
11
+
12
+ compute :frontend do
13
+ num 1
14
+ role :frontend
15
+ flavor "m1.large"
16
+ userdata "chef"
17
+ image "ami-0145d268"
18
+ group "frontend"
19
+ keypair "dev"
20
+ end
21
+
22
+ compute :image do
23
+ num 1
24
+ role :image
25
+ userdata "chef"
26
+ flavor "m1.large"
27
+ image "ami-ac8f13c5"
28
+ group "frontend"
29
+ keypair "dev"
30
+ end
31
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mystro-common
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -131,14 +131,25 @@ files:
131
131
  - lib/mystro/connect/compute.rb
132
132
  - lib/mystro/connect/dns.rb
133
133
  - lib/mystro/connect/environment.rb
134
+ - lib/mystro/dsl.rb
135
+ - lib/mystro/dsl/balancer.rb
136
+ - lib/mystro/dsl/balancer/health.rb
137
+ - lib/mystro/dsl/balancer/listener.rb
138
+ - lib/mystro/dsl/balancer/sticky.rb
139
+ - lib/mystro/dsl/compute.rb
134
140
  - lib/mystro/dsl/template.rb
141
+ - lib/mystro/dsl/template_file.rb
135
142
  - lib/mystro/ext/fog/balancer.rb
136
143
  - lib/mystro/job.rb
137
144
  - lib/mystro/log.rb
138
145
  - lib/mystro/model.rb
139
146
  - lib/mystro/plugin.rb
147
+ - lib/mystro/template.rb
140
148
  - lib/mystro/userdata.rb
141
149
  - mystro-common.gemspec
150
+ - test/complex.rb
151
+ - test/medium.rb
152
+ - test/simple.rb
142
153
  homepage: http://github.com/mystro
143
154
  licenses: []
144
155
  post_install_message:
@@ -159,8 +170,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
159
170
  version: '0'
160
171
  requirements: []
161
172
  rubyforge_project:
162
- rubygems_version: 1.8.24
173
+ rubygems_version: 1.8.25
163
174
  signing_key:
164
175
  specification_version: 3
165
176
  summary: common functionality for Mystro
166
- test_files: []
177
+ test_files:
178
+ - test/complex.rb
179
+ - test/medium.rb
180
+ - test/simple.rb