kathy_lee 0.1.0
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.
- data/LICENSE +21 -0
- data/README +150 -0
- data/lib/kathy_lee.rb +16 -0
- data/lib/kathy_lee/errors/no_fake_registered.rb +11 -0
- data/lib/kathy_lee/fakes.rb +81 -0
- data/lib/kathy_lee/kathy_lee.rb +15 -0
- data/lib/kathy_lee/proxy.rb +113 -0
- data/lib/kathy_lee/proxy_manager.rb +34 -0
- data/lib/kathy_lee/templates/proxy.html.erb +15 -0
- data/lib/kathy_lee/transaction.rb +51 -0
- metadata +74 -0
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2010 markbates
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,150 @@
|
|
1
|
+
=Kathy Lee
|
2
|
+
|
3
|
+
An easy to use factory framework for generating test data for ActiveRecord models.
|
4
|
+
|
5
|
+
==Setup Examples
|
6
|
+
|
7
|
+
KathyLee::User.define do
|
8
|
+
username(fake(:user_name))
|
9
|
+
email(fake(:email))
|
10
|
+
home_page_url(fake(:url))
|
11
|
+
fullname(fake(:full_name))
|
12
|
+
login_count(0)
|
13
|
+
|
14
|
+
has_many :posts, :size => 2
|
15
|
+
has_many :comments, :size => 1
|
16
|
+
end
|
17
|
+
|
18
|
+
KathyLee::User::Marge.define do
|
19
|
+
fullname('Marge Simpson')
|
20
|
+
login_count(1000)
|
21
|
+
end
|
22
|
+
|
23
|
+
KathyLee::User::Marge::Other.define do
|
24
|
+
home_page_url('http://www.simpsons.com')
|
25
|
+
|
26
|
+
has_many :posts, :size => 5
|
27
|
+
has_many :comments, :size => 1
|
28
|
+
end
|
29
|
+
|
30
|
+
KathyLee::Post.define do
|
31
|
+
title(fake(:title))
|
32
|
+
body(fake(:body))
|
33
|
+
|
34
|
+
belongs_to :user
|
35
|
+
has_many :comments, :size => 1
|
36
|
+
end
|
37
|
+
|
38
|
+
KathyLee::Comment.define do
|
39
|
+
body(fake(:body))
|
40
|
+
|
41
|
+
belongs_to :user
|
42
|
+
belongs_to :post
|
43
|
+
end
|
44
|
+
|
45
|
+
KathyLee::Movie.define(:title => 'Rocky II', :director => 'Sly Stallone')
|
46
|
+
|
47
|
+
|
48
|
+
# Build a new unsaved model:
|
49
|
+
user = KathyLee::User.new
|
50
|
+
user.username.should == 'bill.smith'
|
51
|
+
user.email.should == 'bill.smith@example.org'
|
52
|
+
user.home_page_url.should == 'http://www.example.com'
|
53
|
+
user.fullname.should == 'Bill Smith'
|
54
|
+
user.login_count.should == 0
|
55
|
+
user.new_record?.should be_true
|
56
|
+
|
57
|
+
# Build a new unsaved model with a few overrides:
|
58
|
+
user = KathyLee::User.new(:username => 'mark.bates', :login_count => 5)
|
59
|
+
user.username.should == 'mark.bates'
|
60
|
+
user.email.should == 'bill.smith@example.org'
|
61
|
+
user.home_page_url.should == 'http://www.example.com'
|
62
|
+
user.fullname.should == 'Bill Smith'
|
63
|
+
user.login_count.should == 5
|
64
|
+
user.new_record?.should be_true
|
65
|
+
|
66
|
+
# Build and save a new model:
|
67
|
+
user = KathyLee::User.create
|
68
|
+
user.username.should == 'bill.smith'
|
69
|
+
user.email.should == 'bill.smith@example.org'
|
70
|
+
user.home_page_url.should == 'http://www.example.com'
|
71
|
+
user.fullname.should == 'Bill Smith'
|
72
|
+
user.login_count.should == 0
|
73
|
+
user.new_record?.should be_false
|
74
|
+
|
75
|
+
# Build and save a new model with a few overrides:
|
76
|
+
user = KathyLee::User.create(:username => 'mark.bates')
|
77
|
+
user.username.should == 'mark.bates'
|
78
|
+
user.email.should == 'bill.smith@example.org'
|
79
|
+
user.home_page_url.should == 'http://www.example.com'
|
80
|
+
user.fullname.should == 'Bill Smith'
|
81
|
+
user.login_count.should == 0
|
82
|
+
user.new_record?.should be_false
|
83
|
+
|
84
|
+
# Build many unsaved models (can be used with/without block):
|
85
|
+
users = KathyLee::User.sweatshop(10) do |user, index|
|
86
|
+
user.login_count = index
|
87
|
+
end
|
88
|
+
users.size.should == 10
|
89
|
+
users.each_with_index do |user, index|
|
90
|
+
user.login_count.should == index
|
91
|
+
user.new_record?.should be_true
|
92
|
+
end
|
93
|
+
|
94
|
+
# Build and save many models (can be used with/without block):
|
95
|
+
users = KathyLee::User.sweatshop!(10) do |user, index|
|
96
|
+
user.login_count = index
|
97
|
+
end
|
98
|
+
users.size.should == 10
|
99
|
+
users.each_with_index do |user, index|
|
100
|
+
user.login_count.should == index
|
101
|
+
user.new_record?.should be_false
|
102
|
+
end
|
103
|
+
|
104
|
+
# Build belongs_to associations (change KathyLee::Post.new to KathyLee::Post.create to save the whole thing):
|
105
|
+
post = KathyLee::Post.new
|
106
|
+
post.title.should_not be_nil
|
107
|
+
post.user.should_not be_nil
|
108
|
+
post.user.should be_kind_of(User)
|
109
|
+
post.user.email.should == 'bill.smith@example.org'
|
110
|
+
|
111
|
+
# Build has_many associations (change KathyLee::User.new to KathyLee::User.create to save the whole thing):
|
112
|
+
user = KathyLee::User.new
|
113
|
+
user.should_not be_nil
|
114
|
+
user.posts.should_not be_nil
|
115
|
+
user.posts.size.should == 2
|
116
|
+
user.posts.each do |post|
|
117
|
+
post.should be_kind_of(Post)
|
118
|
+
post.title.should_not be_nil
|
119
|
+
end
|
120
|
+
user.comments.should_not be_nil
|
121
|
+
user.comments.size.should == 1
|
122
|
+
user.comments.each do |comment|
|
123
|
+
comment.should be_kind_of(Comment)
|
124
|
+
end
|
125
|
+
|
126
|
+
# Build a variant of a model using subclasses:
|
127
|
+
user = KathyLee::User::Marge.new
|
128
|
+
user.username.should == 'bill.smith'
|
129
|
+
user.email.should == 'bill.smith@example.org'
|
130
|
+
user.home_page_url.should == 'http://www.example.com'
|
131
|
+
user.fullname.should == 'Marge Simpson'
|
132
|
+
user.login_count.should == 1000
|
133
|
+
user.new_record?.should be_true
|
134
|
+
user.posts.size.should == 2
|
135
|
+
|
136
|
+
# Subclass your subclass for further customization:
|
137
|
+
user = KathyLee::User::Marge::Other.new
|
138
|
+
user.username.should == 'bill.smith'
|
139
|
+
user.email.should == 'bill.smith@example.org'
|
140
|
+
user.home_page_url.should == 'http://www.simpsons.com'
|
141
|
+
user.fullname.should == 'Marge Simpson'
|
142
|
+
user.login_count.should == 1000
|
143
|
+
user.new_record?.should be_true
|
144
|
+
user.posts.size.should == 5
|
145
|
+
|
146
|
+
==Contact
|
147
|
+
|
148
|
+
Please mail bugs, suggestions and patches to "development@metabates.com":mailto:development@metabates.com
|
149
|
+
|
150
|
+
On the web at: "http://www.metabates.com":http://www.metabates.
|
data/lib/kathy_lee.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
require 'faker'
|
3
|
+
require 'benchmark'
|
4
|
+
require 'erb'
|
5
|
+
|
6
|
+
class Symbol
|
7
|
+
|
8
|
+
def classify
|
9
|
+
self.to_s.classify
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
Dir.glob(File.join(File.dirname(__FILE__), 'kathy_lee', '**/*.rb')).each do |f|
|
15
|
+
require File.expand_path(f)
|
16
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module KathyLee
|
2
|
+
class Fakes
|
3
|
+
include Singleton
|
4
|
+
|
5
|
+
attr_accessor :list
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
self.reset!
|
9
|
+
end
|
10
|
+
|
11
|
+
def reset!
|
12
|
+
self.list = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def add(name, &block)
|
16
|
+
self.list[name.to_sym] = block
|
17
|
+
end
|
18
|
+
|
19
|
+
def alias(from, to)
|
20
|
+
self.list[from.to_sym] = KathyLee::Fakes::Alias.new(to)
|
21
|
+
end
|
22
|
+
|
23
|
+
def execute(name, *args)
|
24
|
+
block = self.list[name.to_sym]
|
25
|
+
if block.is_a?(KathyLee::Fakes::Alias)
|
26
|
+
return execute(block.to, *args)
|
27
|
+
end
|
28
|
+
if block
|
29
|
+
return block.call(*args)
|
30
|
+
end
|
31
|
+
raise KathyLee::Errors::NoFakeRegistered.new(name)
|
32
|
+
end
|
33
|
+
|
34
|
+
class << self
|
35
|
+
def method_missing(sym, *args, &block)
|
36
|
+
KathyLee::Fakes.instance.send(sym, *args, &block)
|
37
|
+
end
|
38
|
+
end # class << self
|
39
|
+
|
40
|
+
private
|
41
|
+
class Alias
|
42
|
+
attr_accessor :to
|
43
|
+
def initialize(to)
|
44
|
+
self.to = to
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end # Fakes
|
49
|
+
end # KathyLee
|
50
|
+
|
51
|
+
%w{first_name last_name name prefix suffix}.each do |m|
|
52
|
+
eval("KathyLee::Fakes.add(:#{m}) {|*args| Faker::Name.#{m}(*args)}")
|
53
|
+
end
|
54
|
+
|
55
|
+
%w{city city_prefix city_suffix secondary_address street_address street_name
|
56
|
+
street_suffix uk_country uk_county uk_postcode us_state us_state_abbr zip_code}.each do |m|
|
57
|
+
eval("KathyLee::Fakes.add(:#{m}) {|*args| Faker::Address.#{m}(*args)}")
|
58
|
+
end
|
59
|
+
|
60
|
+
%w{bs catch_phrase name suffix}.each do |m|
|
61
|
+
eval("KathyLee::Fakes.add(:#{m}) {|*args| Faker::Company.#{m}(*args)}")
|
62
|
+
end
|
63
|
+
|
64
|
+
%w{domain_name domain_suffix domain_word email free_email user_name}.each do |m|
|
65
|
+
eval("KathyLee::Fakes.add(:#{m}) {|*args| Faker::Internet.#{m}(*args)}")
|
66
|
+
end
|
67
|
+
|
68
|
+
%w{paragraph paragraphs sentence sentences words}.each do |m|
|
69
|
+
eval("KathyLee::Fakes.add(:#{m}) {|*args| Faker::Lorem.#{m}(*args)}")
|
70
|
+
end
|
71
|
+
|
72
|
+
%w{phone_number}.each do |m|
|
73
|
+
eval("KathyLee::Fakes.add(:#{m}) {|*args| Faker::PhoneNumber.#{m}(*args)}")
|
74
|
+
end
|
75
|
+
|
76
|
+
KathyLee::Fakes.add(:url) {|*args| 'http://' + Faker::Internet.domain_name(*args)}
|
77
|
+
KathyLee::Fakes.add(:lorem) {|*args| Faker::Lorem.paragraphs(*args).join("\n")}
|
78
|
+
KathyLee::Fakes.add(:name) {|*args| Faker::Name.first_name + ' ' + Faker::Name.last_name}
|
79
|
+
KathyLee::Fakes.alias(:body, :lorem)
|
80
|
+
KathyLee::Fakes.alias(:full_name, :name)
|
81
|
+
KathyLee::Fakes.alias(:title, :sentence)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module KathyLee
|
2
|
+
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def const_missing(klass, for_klass = klass)
|
6
|
+
@klass = klass
|
7
|
+
@for_klass = for_klass
|
8
|
+
result = ERB.new(File.read(File.join(File.dirname(__FILE__), 'templates', 'proxy.html.erb'))).result(binding)
|
9
|
+
eval(result)
|
10
|
+
return "KathyLee::#{klass}".constantize
|
11
|
+
end
|
12
|
+
|
13
|
+
end # class << self
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
module KathyLee
|
2
|
+
class Proxy
|
3
|
+
attr_accessor :for
|
4
|
+
attr_accessor :attributes
|
5
|
+
attr_accessor :belongs_tos
|
6
|
+
attr_accessor :has_manys
|
7
|
+
|
8
|
+
class << self
|
9
|
+
|
10
|
+
def define(options = {}, &block)
|
11
|
+
KathyLee::ProxyManager.set_attributes(self, options, &block)
|
12
|
+
end
|
13
|
+
|
14
|
+
def create(options = {})
|
15
|
+
model = self.new(options)
|
16
|
+
model.save!
|
17
|
+
return model
|
18
|
+
end
|
19
|
+
|
20
|
+
def new(options = {})
|
21
|
+
proxy = super(options)
|
22
|
+
KathyLee::Transaction.execute do
|
23
|
+
proxy.build_new
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def sweatshop(count, options = {}, &block)
|
28
|
+
models = []
|
29
|
+
count.times do |i|
|
30
|
+
model = self.new(options)
|
31
|
+
yield model, i if block_given?
|
32
|
+
models << model
|
33
|
+
end
|
34
|
+
return models
|
35
|
+
end
|
36
|
+
|
37
|
+
def sweatshop!(count, &block)
|
38
|
+
nmodels = []
|
39
|
+
models = self.sweatshop(count, &block)
|
40
|
+
models.each do |m|
|
41
|
+
m.save!
|
42
|
+
nmodels << m
|
43
|
+
end
|
44
|
+
return models
|
45
|
+
end
|
46
|
+
|
47
|
+
end # class << self
|
48
|
+
|
49
|
+
def initialize(options = {})
|
50
|
+
self.for = self.class.for
|
51
|
+
self.belongs_tos = {}
|
52
|
+
self.has_manys = {}
|
53
|
+
|
54
|
+
opts = KathyLee::ProxyManager.get_attributes(self.class)
|
55
|
+
self.attributes = opts[:attributes]
|
56
|
+
instance_eval(&opts[:definition_block]) if opts[:definition_block]
|
57
|
+
self.attributes.merge!(options) if options.is_a?(Hash)
|
58
|
+
end
|
59
|
+
|
60
|
+
def build_new
|
61
|
+
model = self.for.send(:new, self.attributes)
|
62
|
+
KathyLee::Transaction.register(model)
|
63
|
+
model = build_has_manys(model)
|
64
|
+
model = build_belongs_to(model)
|
65
|
+
return model
|
66
|
+
end
|
67
|
+
|
68
|
+
def method_missing(sym, *args)
|
69
|
+
self.attributes[sym] = *args
|
70
|
+
end
|
71
|
+
|
72
|
+
def belongs_to(owner, options = {})
|
73
|
+
self.belongs_tos[owner.to_sym] = options
|
74
|
+
end
|
75
|
+
|
76
|
+
def has_many(things, options = {})
|
77
|
+
self.has_manys[things.to_sym] = options
|
78
|
+
end
|
79
|
+
|
80
|
+
def fake(sym, *args)
|
81
|
+
KathyLee::Fakes.execute(sym, *args)
|
82
|
+
end
|
83
|
+
|
84
|
+
protected
|
85
|
+
def build_has_manys(model)
|
86
|
+
hm = self.has_manys.dup
|
87
|
+
hm.each do |things, opts|
|
88
|
+
options = opts.dup
|
89
|
+
size = options.delete(:size) || 2
|
90
|
+
thing_klass = "::KathyLee::#{things.classify}".constantize
|
91
|
+
model.send("#{things}=", []) # clear out any parents versions of this
|
92
|
+
model.send(things) << thing_klass.sweatshop(size)
|
93
|
+
end
|
94
|
+
|
95
|
+
return model
|
96
|
+
end
|
97
|
+
|
98
|
+
def build_belongs_to(model)
|
99
|
+
bt = self.belongs_tos.dup
|
100
|
+
|
101
|
+
bt.each do |owner, opts|
|
102
|
+
thing_klass = "::KathyLee::#{owner.classify}".constantize
|
103
|
+
thing = KathyLee::Transaction.get_model(thing_klass.for) do
|
104
|
+
thing_klass.new(opts)
|
105
|
+
end
|
106
|
+
model.send("#{owner}=", thing)
|
107
|
+
end
|
108
|
+
|
109
|
+
return model
|
110
|
+
end
|
111
|
+
|
112
|
+
end # Proxy
|
113
|
+
end # KathyLee
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module KathyLee
|
2
|
+
class ProxyManager
|
3
|
+
include Singleton
|
4
|
+
|
5
|
+
attr_accessor :proxies
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
self.reset!
|
9
|
+
end
|
10
|
+
|
11
|
+
def reset!
|
12
|
+
self.proxies = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_attributes(klass)
|
16
|
+
proxy = self.proxies[klass]
|
17
|
+
return proxy if proxy
|
18
|
+
return {:attributes => {}}
|
19
|
+
end
|
20
|
+
|
21
|
+
def set_attributes(klass, attributes = {}, &block)
|
22
|
+
options = {:attributes => attributes}
|
23
|
+
options[:definition_block] = block if block_given?
|
24
|
+
self.proxies[klass] = options
|
25
|
+
end
|
26
|
+
|
27
|
+
class << self
|
28
|
+
def method_missing(sym, *args, &block)
|
29
|
+
KathyLee::ProxyManager.instance.send(sym, *args, &block)
|
30
|
+
end
|
31
|
+
end # class << self
|
32
|
+
|
33
|
+
end # ProxyManager
|
34
|
+
end # KathyLee
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module KathyLee
|
2
|
+
class Transaction
|
3
|
+
include Singleton
|
4
|
+
|
5
|
+
attr_accessor :started
|
6
|
+
attr_accessor :models
|
7
|
+
attr_accessor :transaction_id
|
8
|
+
|
9
|
+
class << self
|
10
|
+
def method_missing(sym, *args, &block)
|
11
|
+
KathyLee::Transaction.instance.send(sym, *args, &block)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
self.reset!
|
17
|
+
end
|
18
|
+
|
19
|
+
def reset!
|
20
|
+
self.started = false
|
21
|
+
self.models = {}
|
22
|
+
end
|
23
|
+
|
24
|
+
def register(model)
|
25
|
+
self.models[model.class.name.to_sym] = model
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_model(klass, &block)
|
29
|
+
model = self.models[klass.name.to_sym]
|
30
|
+
if block_given? && model.nil?
|
31
|
+
model = yield
|
32
|
+
self.register(model)
|
33
|
+
end
|
34
|
+
return model
|
35
|
+
end
|
36
|
+
|
37
|
+
def execute(&block)
|
38
|
+
unless self.started
|
39
|
+
self.transaction_id = rand.to_s.gsub('0.', '')
|
40
|
+
self.started = true
|
41
|
+
results = yield if block_given?
|
42
|
+
self.reset!
|
43
|
+
return results
|
44
|
+
else
|
45
|
+
results = yield if block_given?
|
46
|
+
return results
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end # Transaction
|
51
|
+
end # KathyLee
|
metadata
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kathy_lee
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- markbates
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-01-04 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: faker
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.3.1
|
24
|
+
version:
|
25
|
+
description: "kathy_lee was developed by: markbates"
|
26
|
+
email: ""
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files:
|
32
|
+
- README
|
33
|
+
- LICENSE
|
34
|
+
files:
|
35
|
+
- lib/kathy_lee/errors/no_fake_registered.rb
|
36
|
+
- lib/kathy_lee/fakes.rb
|
37
|
+
- lib/kathy_lee/kathy_lee.rb
|
38
|
+
- lib/kathy_lee/proxy.rb
|
39
|
+
- lib/kathy_lee/proxy_manager.rb
|
40
|
+
- lib/kathy_lee/templates/proxy.html.erb
|
41
|
+
- lib/kathy_lee/transaction.rb
|
42
|
+
- lib/kathy_lee.rb
|
43
|
+
- README
|
44
|
+
- LICENSE
|
45
|
+
has_rdoc: true
|
46
|
+
homepage: ""
|
47
|
+
licenses: []
|
48
|
+
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options: []
|
51
|
+
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: "0"
|
59
|
+
version:
|
60
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: "0"
|
65
|
+
version:
|
66
|
+
requirements: []
|
67
|
+
|
68
|
+
rubyforge_project: magrathea
|
69
|
+
rubygems_version: 1.3.5
|
70
|
+
signing_key:
|
71
|
+
specification_version: 3
|
72
|
+
summary: kathy_lee
|
73
|
+
test_files: []
|
74
|
+
|