dm-sweatshop 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
File without changes
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 Ben Burkert
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Manifest.txt ADDED
@@ -0,0 +1,14 @@
1
+ History.txt
2
+ LICENSE
3
+ Manifest.txt
4
+ README.textile
5
+ Rakefile
6
+ TODO
7
+ lib/dm-sweatshop.rb
8
+ lib/dm-sweatshop/sweatshop.rb
9
+ lib/dm-sweatshop/model.rb
10
+ lib/dm-sweatshop/version.rb
11
+ spec/dm-sweatshop/model_spec.rb
12
+ spec/dm-sweatshop/sweatshop_spec.rb
13
+ spec/spec.opts
14
+ spec/spec_helper.rb
data/README.textile ADDED
@@ -0,0 +1,224 @@
1
+ h1. dm-sweatshop
2
+
3
+ h2. Overview
4
+
5
+ dm-sweatshop is a model factory for DataMapper. It makes it easy & painless to crank out complex pseudo random models -- useful for tests and seed data. Production Goals:
6
+
7
+ * Easy generation of random models with data that fits the application domain.
8
+ * Simple syntax for declaring and generating model patterns.
9
+ * Add context to model patterns, allowing grouping and
10
+ * Effortlessly generate or fill in associations for creating complex models with few lines of code.
11
+
12
+ h2. Examples
13
+
14
+ Starting off with a simple user model.
15
+ <pre>
16
+ <code>
17
+ class User
18
+ include DataMapper::Resource
19
+
20
+ property :id, Serial
21
+ property :username, String
22
+ property :email, String
23
+ property :password, String
24
+ end
25
+ </code>
26
+ </pre>
27
+
28
+ A fixture for the user model can be defined using the @fixture@ method.
29
+ <pre>
30
+ <code>
31
+ User.fixture {{
32
+ :username => (username = /\w+/.gen),
33
+ :email => "#{username}@example.com",
34
+ :password => (password = /\w+/.gen),
35
+ :pasword_confirmation => password
36
+
37
+ # The /\w+/.gen notation is part of the randexp gem:
38
+ # http://github.com/benburkert/randexp/
39
+ }}
40
+ </code>
41
+ </pre>
42
+
43
+ Notice the double curly brace (@{{@), a quick little way to pass a block that returns a hash to the fixture method. This is important because it ensures the data is random when we generate a new instance of the model, by calling the block every time.
44
+
45
+ And here's how you generate said model.
46
+ <pre>
47
+ <code>
48
+ User.generate
49
+ </code>
50
+ </pre>
51
+
52
+ That's it. In fact, it can even be shortened.
53
+ <pre>
54
+ <code>
55
+ User.gen
56
+ </code>
57
+ </pre>
58
+
59
+ h3. Associations
60
+
61
+ The real power of sweatshop is generating working associations.
62
+ <pre>
63
+ <code>
64
+ DataMapper.setup(:default, "sqlite3::memory:")
65
+
66
+ class Tweet
67
+ include DataMapper::Resource
68
+
69
+ property :id, Serial
70
+ property :message, String, :length => 140
71
+ property :user_id, Integer
72
+
73
+ belongs_to :user
74
+ has n, :tags, :through => Resource
75
+ end
76
+
77
+ class Tag
78
+ include DataMapper::Resource
79
+
80
+ property :id, Serial
81
+ property :name, String
82
+
83
+ has n, :tweets, :through => Resource
84
+ end
85
+
86
+ class User
87
+ include DataMapper::Resource
88
+
89
+ property :id, Serial
90
+ property :username, String
91
+
92
+ has n, :tweets
93
+ end
94
+
95
+ DataMapper.auto_migrate!
96
+
97
+ User.fix {{
98
+ :username => /\w+/.gen,
99
+ :tweets => 500.of {Tweet.make}
100
+ }}
101
+
102
+ Tweet.fix {{
103
+ :message => /[:sentence:]/.gen[0..140],
104
+ :tags => (0..10).of {Tag.make}
105
+ }}
106
+
107
+ Tag.fix {{
108
+ :name => /\w+/.gen
109
+ }}
110
+
111
+ # now lets generate 100 users, each with 500 tweets. Also, the tweet's have 0 to 10 tags!
112
+ users = 10.of {User.gen}
113
+ </code>
114
+ </pre>
115
+
116
+ That's going to generate alot of tags, way more than you would see in the production app. Let's recylce some already generated tags instead.
117
+
118
+ <pre>
119
+ <code>
120
+ User.fix {{
121
+ :username => /\w+/.gen,
122
+ :tweets => 500.of {Tweet.make}
123
+ }}
124
+
125
+ Tweet.fix {{
126
+ :message => /[:sentence:]/.gen[0..140],
127
+ :tags => (0..10).of {Tag.pick} #lets pick, not make this time
128
+ }}
129
+
130
+ Tag.fix {{
131
+ :name => /\w+/.gen
132
+ }}
133
+
134
+ 50.times {Tag.gen}
135
+
136
+ users = 10.of {User.gen}
137
+ </code>
138
+ </pre>
139
+
140
+ h3. Contexts
141
+
142
+ You can add multiple fixtures to a mode, dm-sweatshop will randomly pick between the available fixtures when it generates a new model.
143
+
144
+ <pre>
145
+ <code>
146
+ Tweet.fix {{
147
+ :message => /\@#{User.pick.name} [:sentence:]/.gen[0..140], #an @reply for some user
148
+ :tags => (0..10).of {Tag.pick}
149
+ }}
150
+ </code>
151
+ </pre>
152
+
153
+ To keep track of all of our new fixtures, we can even give them a context.
154
+
155
+ <pre>
156
+ <code>
157
+ Tweet.fix(:at_reply) {{
158
+ :message => /\@#{User.pick.name} [:sentence:]/.gen[0..140],
159
+ :tags => (0..10).of {Tag.pick}
160
+ }}
161
+
162
+ Tweet.fix(:conversation) {{
163
+ :message => /\@#{(tweet = Tweet.pick(:at_reply)).user.name} [:sentence:]/.gen[0..140],
164
+ :tags => tweet.tags
165
+ }}
166
+ </code>
167
+ </pre>
168
+
169
+ h3. Overriding a fixture
170
+
171
+ Sometimes you will want to change one of your fixtures a little bit. You create a new fixture with a whole new context, but this can be overkill. The other option is to specify attributes in the call to @generate@.
172
+
173
+ <pre>
174
+ <code>
175
+ User.gen(:username => 'datamapper') #uses 'datamapper' as the user name instead of the randomly generated word
176
+ </code>
177
+ </pre>
178
+
179
+ This works with contexts too.
180
+
181
+ <pre>
182
+ <code>
183
+ User.gen(:conversation, :tags => Tag.all) #a very, very broad conversation
184
+ </code>
185
+ </pre>
186
+
187
+ Go forth, and populate your data.
188
+
189
+ h2. Best Practices
190
+
191
+ h3. Specs
192
+
193
+ The suggested way to use dm-sweatshop with test specs is to create a @spec/spec_fixtures.rb@ file, then declare your fixtures in there. Next, @require@ it in your @spec/spec_helper.rb@ file, after your models have loaded.
194
+
195
+ <pre>
196
+ <code>
197
+ Merb.start_environment(:testing => true, :adapter => 'runner', :environment => ENV['MERB_ENV'] || 'test')
198
+
199
+ require File.join(File.dirname(__FILE__), 'spec_fixtures')
200
+ </code>
201
+ </pre>
202
+
203
+ Add the @.generate@ calls in your @before@ setup. Make sure to clear your tables or @auto_migrate@ your models after each spec!
204
+
205
+ h2. Possible Improvements
206
+
207
+ h3. Enforcing Validations
208
+
209
+ Enforce validations at generation time, before the call to @new@/@create@.
210
+
211
+ <pre>
212
+ <code>
213
+ User.fix {{
214
+ :username.unique => /\w+/.gen,
215
+ :tweets => 500.of {Tweet.make}
216
+ }}
217
+ </code>
218
+ </pre>
219
+
220
+ h3. Better Exception Handling
221
+
222
+ h3. Smarter @pick@
223
+
224
+ Add multiple contexts to pick, or an ability to _fall back_ if one context has no generated models.
data/Rakefile ADDED
@@ -0,0 +1,63 @@
1
+ require 'rubygems'
2
+ require 'spec'
3
+ require 'spec/rake/spectask'
4
+ require 'pathname'
5
+
6
+ ROOT = Pathname(__FILE__).dirname.expand_path
7
+ require ROOT + 'lib/dm-sweatshop/version'
8
+
9
+ AUTHOR = "Ben Burkert"
10
+ EMAIL = "ben@benburkert.com"
11
+ GEM_NAME = "dm-sweatshop"
12
+ GEM_VERSION = DataMapper::Sweatshop::VERSION
13
+ GEM_DEPENDENCIES = [["dm-core", GEM_VERSION], "randexp"]
14
+ GEM_CLEAN = ["log", "pkg"]
15
+ GEM_EXTRAS = { :has_rdoc => true, :extra_rdoc_files => %w[ README.textile LICENSE TODO ] }
16
+
17
+ PROJECT_NAME = "datamapper"
18
+ PROJECT_URL = "http://github.com/sam/dm-more/tree/master/dm-Sweatshop"
19
+ PROJECT_DESCRIPTION = PROJECT_SUMMARY = "DataMapper plugin for building pseudo random models"
20
+
21
+ require ROOT.parent + 'tasks/hoe'
22
+
23
+ task :default => [ :spec ]
24
+
25
+ WIN32 = (RUBY_PLATFORM =~ /win32|mingw|cygwin/) rescue nil
26
+ SUDO = WIN32 ? '' : ('sudo' unless ENV['SUDOLESS'])
27
+
28
+ desc "Install #{GEM_NAME} #{GEM_VERSION} (default ruby)"
29
+ task :install => [ :package, :install_randexp ] do
30
+ sh "#{SUDO} gem install --local pkg/#{GEM_NAME}-#{GEM_VERSION} --no-update-sources", :verbose => false
31
+ end
32
+
33
+ desc "Install the randexp gem from rubyforge"
34
+ task :install_randexp do
35
+ sh "#{SUDO} gem install randexp --no-update-sources", :verbose => false
36
+ end
37
+
38
+ desc "Uninstall #{GEM_NAME} #{GEM_VERSION} (default ruby)"
39
+ task :uninstall => [ :clobber ] do
40
+ sh "#{SUDO} gem uninstall #{GEM_NAME} -v#{GEM_VERSION} -I -x", :verbose => false
41
+ end
42
+
43
+ namespace :jruby do
44
+ desc "Install #{GEM_NAME} #{GEM_VERSION} with JRuby"
45
+ task :install => [ :package ] do
46
+ sh %{#{SUDO} jruby -S gem install --local pkg/#{GEM_NAME}-#{GEM_VERSION} --no-update-sources}, :verbose => false
47
+ end
48
+ end
49
+
50
+ desc 'Run specifications'
51
+ Spec::Rake::SpecTask.new(:spec) do |t|
52
+ t.spec_opts << '--options' << 'spec/spec.opts' if File.exists?('spec/spec.opts')
53
+ t.spec_files = Pathname.glob(Pathname.new(__FILE__).dirname + 'spec/**/*_spec.rb')
54
+
55
+ begin
56
+ t.rcov = ENV.has_key?('NO_RCOV') ? ENV['NO_RCOV'] != 'true' : true
57
+ t.rcov_opts << '--exclude' << 'spec'
58
+ t.rcov_opts << '--text-summary'
59
+ t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse'
60
+ rescue Exception
61
+ # rcov not installed
62
+ end
63
+ end
data/TODO ADDED
File without changes
@@ -0,0 +1,11 @@
1
+ require 'rubygems'
2
+
3
+ gem 'dm-core', '=0.9.6'
4
+ require 'dm-core'
5
+ require 'randexp'
6
+
7
+ dir = Pathname(__FILE__).dirname.expand_path / 'dm-sweatshop'
8
+
9
+ require dir / "version"
10
+ require dir / "sweatshop"
11
+ require dir / "model"
@@ -0,0 +1,35 @@
1
+ module DataMapper
2
+ module Model
3
+ def fixture(name = default_fauxture_name, &blk)
4
+ Sweatshop.add(self, name, &blk)
5
+ end
6
+
7
+ alias_method :fix, :fixture
8
+
9
+ def generate(name = default_fauxture_name, attributes = {})
10
+ name, attributes = default_fauxture_name, name if name.is_a? Hash
11
+ Sweatshop.create(self, name, attributes)
12
+ end
13
+
14
+ alias_method :gen, :generate
15
+
16
+ def generate_attributes(name = default_fauxture_name)
17
+ Sweatshop.attributes(self, name)
18
+ end
19
+
20
+ alias_method :gen_attrs, :generate_attributes
21
+
22
+ def make(name = default_fauxture_name, attributes = {})
23
+ name, attributes = default_fauxture_name, name if name.is_a? Hash
24
+ Sweatshop.make(self, name, attributes)
25
+ end
26
+
27
+ def pick(name = default_fauxture_name)
28
+ Sweatshop.pick(self, name)
29
+ end
30
+
31
+ def default_fauxture_name
32
+ :default
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,49 @@
1
+ module DataMapper
2
+ class Sweatshop
3
+ class << self
4
+ attr_accessor :model_map
5
+ attr_accessor :record_map
6
+ end
7
+
8
+ self.model_map = Hash.new {|h,k| h[k] = Hash.new {|h,k| h[k] = []}}
9
+ self.record_map = Hash.new {|h,k| h[k] = Hash.new {|h,k| h[k] = []}}
10
+
11
+ def self.add(klass, name, &proc)
12
+ self.model_map[klass][name.to_sym] << proc
13
+ end
14
+
15
+ def self.record(klass, name, instance)
16
+ self.record_map[klass][name.to_sym] << instance
17
+ instance
18
+ end
19
+
20
+ def self.create(klass, name, attributes = {})
21
+ begin
22
+ record(klass, name, klass.create(attributes(klass, name).merge(attributes)))
23
+ rescue StandardError => e
24
+ retry if e.message =~ /^column \w+ is not unique$/
25
+ raise e
26
+ end
27
+ end
28
+
29
+ def self.make(klass, name, attributes = {})
30
+ record(klass, name, klass.new(attributes(klass, name).merge(attributes)))
31
+ end
32
+
33
+ def self.pick(klass, name)
34
+ self.record_map[klass][name.to_sym].pick || raise(NoFixturesExist, "no #{name} context fixtures have been generated for the #{klass} class")
35
+ end
36
+
37
+ def self.attributes(klass, name)
38
+ proc = model_map[klass][name.to_sym].pick
39
+
40
+ if not proc.nil?
41
+ proc.call
42
+ elsif klass.superclass.is_a?(DataMapper::Model)
43
+ attributes(klass.superclass, name)
44
+ else
45
+ raise "#{name} fixture was not found"
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,5 @@
1
+ module DataMapper
2
+ class Sweatshop
3
+ VERSION = "0.9.5"
4
+ end
5
+ end
@@ -0,0 +1,76 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe DataMapper::Model do
4
+
5
+ class Widget
6
+ include DataMapper::Resource
7
+
8
+ property :id, Integer, :serial => true
9
+ property :type, Discriminator
10
+ property :name, String
11
+ property :price, Integer
12
+
13
+ belongs_to :order
14
+ end
15
+
16
+ class Wonket < Widget
17
+ property :size, String
18
+ end
19
+
20
+ class Order
21
+ include DataMapper::Resource
22
+
23
+ property :id, Integer, :serial => true
24
+
25
+ has n, :widgets
26
+ end
27
+
28
+ before(:each) do
29
+ DataMapper.auto_migrate!
30
+ DataMapper::Sweatshop.model_map.clear
31
+ DataMapper::Sweatshop.record_map.clear
32
+ end
33
+
34
+ describe ".fixture" do
35
+ it "should add a fixture proc for the model" do
36
+ Widget.fixture {{
37
+ :name => /\w+/.gen.capitalize,
38
+ :price => /\d{4,5}/.gen.to_i
39
+ }}
40
+
41
+ DataMapper::Sweatshop.model_map[Widget][:default].should_not be_empty
42
+ end
43
+ end
44
+
45
+ it "should allow handle complex named fixtures" do
46
+ Wonket.fix {{
47
+ :name => /\w+ Wonket/.gen.capitalize,
48
+ :price => /\d{2,3}99/.gen.to_i,
49
+ :size => %w[small medium large xl].pick
50
+ }}
51
+
52
+ Order.fix {{
53
+ :widgets => (1..5).of { Widget.gen }
54
+ }}
55
+
56
+ Order.fix(:wonket_order) {{
57
+ :widgets => (5..10).of { Wonket.gen }
58
+ }}
59
+
60
+ wonket_order = Order.gen(:wonket_order)
61
+ wonket_order.widgets.should_not be_empty
62
+ end
63
+
64
+ it "should allow for STI fixtures" do
65
+ Widget.fix {{
66
+ :name => /\w+/.gen.capitalize,
67
+ :price => /\d{4,5}/.gen.to_i
68
+ }}
69
+
70
+ Order.fix {{
71
+ :widgets => (1..5).of { Wonket.gen }
72
+ }}
73
+
74
+ Order.gen.widgets.should_not be_empty
75
+ end
76
+ end
@@ -0,0 +1,143 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe DataMapper::Sweatshop do
4
+
5
+ class Parent
6
+ include DataMapper::Resource
7
+ property :id, Integer, :serial => true
8
+ property :type, Discriminator
9
+ property :first_name, String
10
+ property :last_name, String
11
+ end
12
+
13
+ class Child < Parent
14
+ property :age, Integer
15
+ end
16
+
17
+ before(:each) do
18
+ DataMapper.auto_migrate!
19
+ DataMapper::Sweatshop.model_map.clear
20
+ DataMapper::Sweatshop.record_map.clear
21
+ end
22
+
23
+ describe ".model_map" do
24
+ it "should return a Hash if the model is not mapped" do
25
+ DataMapper::Sweatshop.model_map[Class.new].should be_is_a(Hash)
26
+ end
27
+
28
+ it "should return a map for names to an array of procs if the model is not mapped" do
29
+ DataMapper::Sweatshop.model_map[Class.new][:unnamed].should be_is_a(Array)
30
+ end
31
+ end
32
+
33
+ describe ".add" do
34
+ it "should app a generator proc to the model map" do
35
+ proc = lambda {}
36
+ lambda {
37
+ DataMapper::Sweatshop.add(Parent, :default, &proc)
38
+ }.should change {
39
+ DataMapper::Sweatshop.model_map[Parent][:default].first
40
+ }.from(nil).to(proc)
41
+ end
42
+
43
+ it "should push repeat procs onto the mapped array" do
44
+ proc1, proc2 = lambda {}, lambda {}
45
+
46
+ DataMapper::Sweatshop.add(Parent, :default, &proc1)
47
+ DataMapper::Sweatshop.add(Parent, :default, &proc2)
48
+
49
+ DataMapper::Sweatshop.model_map[Parent][:default].first.should == proc1
50
+ DataMapper::Sweatshop.model_map[Parent][:default].last.should == proc2
51
+ end
52
+ end
53
+
54
+ describe ".attributes" do
55
+ it "should return an attributes hash" do
56
+ DataMapper::Sweatshop.add(Parent, :default) {{
57
+ :first_name => /\w+/.gen.capitalize,
58
+ :last_name => /\w+/.gen.capitalize
59
+ }}
60
+
61
+ DataMapper::Sweatshop.attributes(Parent, :default).should be_is_a(Hash)
62
+ end
63
+
64
+ it "should call the attribute proc on each call to attributes" do
65
+ calls = 0
66
+ proc = lambda {{:calls => (calls += 1)}}
67
+
68
+ DataMapper::Sweatshop.add(Parent, :default, &proc)
69
+ DataMapper::Sweatshop.attributes(Parent, :default).should == {:calls => 1}
70
+ DataMapper::Sweatshop.attributes(Parent, :default).should == {:calls => 2}
71
+ end
72
+
73
+ it "should call attributes with the superclass if the class is not mapped" do
74
+ DataMapper::Sweatshop.add(Parent, :default) {{:first_name => 'Bob'}}
75
+ DataMapper::Sweatshop.attributes(Child, :default).should == {:first_name => 'Bob'}
76
+ end
77
+
78
+ it "should raise an error if neither the class or it's parent class(es) have been mapped" do
79
+ lambda { DataMapper::Sweatshop.attributes(Child, :default) }.should raise_error("default fixture was not found")
80
+ end
81
+ end
82
+
83
+ describe ".create" do
84
+ it "should call create on the model class with the attributes generated from a mapped proc" do
85
+ DataMapper::Sweatshop.add(Parent, :default) {{
86
+ :first_name => 'Kenny',
87
+ :last_name => 'Rogers'
88
+ }}
89
+
90
+ Parent.should_receive(:create).with(:first_name => 'Kenny', :last_name => 'Rogers')
91
+
92
+ DataMapper::Sweatshop.create(Parent, :default)
93
+ end
94
+
95
+ it "should call create on the model with a parent class' mapped attributes proc when the original class has not been maped" do
96
+ DataMapper::Sweatshop.add(Parent, :default) {{
97
+ :first_name => 'Kenny',
98
+ :last_name => 'Rogers'
99
+ }}
100
+
101
+ Child.should_receive(:create).with(:first_name => 'Kenny', :last_name => 'Rogers')
102
+
103
+ DataMapper::Sweatshop.create(Child, :default)
104
+ end
105
+
106
+ it "should merge in any attributes as an argument" do
107
+ DataMapper::Sweatshop.add(Parent, :default) {{
108
+ :first_name => 'Kenny',
109
+ :last_name => 'Rogers'
110
+ }}
111
+
112
+ Parent.should_receive(:create).with(:first_name => 'Roddy', :last_name => 'Rogers')
113
+
114
+ DataMapper::Sweatshop.create(Parent, :default, :first_name => 'Roddy')
115
+ end
116
+ end
117
+
118
+ describe ".make" do
119
+ it "should call new on the model class with the attributes generated from a mapped proc" do
120
+ DataMapper::Sweatshop.add(Parent, :default) {{
121
+ :first_name => 'Kenny',
122
+ :last_name => 'Rogers'
123
+ }}
124
+
125
+ Parent.should_receive(:new).with(:first_name => 'Kenny', :last_name => 'Rogers')
126
+
127
+ DataMapper::Sweatshop.make(Parent, :default)
128
+ end
129
+ end
130
+
131
+ describe ".pick" do
132
+ it "should return a pre existing instance of a model from the record map" do
133
+ DataMapper::Sweatshop.add(Parent, :default) {{
134
+ :first_name => 'George',
135
+ :last_name => 'Clinton'
136
+ }}
137
+
138
+ DataMapper::Sweatshop.create(Parent, :default)
139
+
140
+ DataMapper::Sweatshop.pick(Parent, :default).should be_is_a(Parent)
141
+ end
142
+ end
143
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,2 @@
1
+ --format specdoc
2
+ --colour
@@ -0,0 +1,9 @@
1
+ $TESTING=true
2
+ $:.push File.join(File.dirname(__FILE__), '..', 'lib')
3
+
4
+ require 'dm-sweatshop'
5
+
6
+ DataMapper.setup(:default, 'sqlite3::memory:')
7
+
8
+ Spec::Runner.configure do |config|
9
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dm-sweatshop
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.5
5
+ platform: ruby
6
+ authors:
7
+ - Ben Burkert
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-08-28 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: dm-core
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - "="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.9.5
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: randexp
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: hoe
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 1.6.0
44
+ version:
45
+ description: DataMapper plugin for building pseudo random models
46
+ email:
47
+ - ben@benburkert.com
48
+ executables: []
49
+
50
+ extensions: []
51
+
52
+ extra_rdoc_files:
53
+ - README.textile
54
+ - LICENSE
55
+ - TODO
56
+ files:
57
+ - History.txt
58
+ - LICENSE
59
+ - Manifest.txt
60
+ - README.textile
61
+ - Rakefile
62
+ - TODO
63
+ - lib/dm-sweatshop.rb
64
+ - lib/dm-sweatshop/sweatshop.rb
65
+ - lib/dm-sweatshop/model.rb
66
+ - lib/dm-sweatshop/version.rb
67
+ - spec/dm-sweatshop/model_spec.rb
68
+ - spec/dm-sweatshop/sweatshop_spec.rb
69
+ - spec/spec.opts
70
+ - spec/spec_helper.rb
71
+ has_rdoc: true
72
+ homepage: http://github.com/sam/dm-more/tree/master/dm-Sweatshop
73
+ post_install_message:
74
+ rdoc_options:
75
+ - --main
76
+ - README.txt
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: "0"
84
+ version:
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: "0"
90
+ version:
91
+ requirements: []
92
+
93
+ rubyforge_project: datamapper
94
+ rubygems_version: 1.2.0
95
+ signing_key:
96
+ specification_version: 2
97
+ summary: DataMapper plugin for building pseudo random models
98
+ test_files: []
99
+