spawn 0.0.8

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 ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 Michel Martens for CitrusByte (http://www.citrusbyte.com)
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.
@@ -0,0 +1,89 @@
1
+ Clown
2
+ =======
3
+
4
+ A ridiculously simple fixtures replacement for your web framework of
5
+ choice.
6
+
7
+ Description
8
+ -----------
9
+
10
+ Clown is a very small library (just 14 lines of code) that can
11
+ effectively replace fixtures or any other huge library for the same task.
12
+
13
+ Usage
14
+ -----
15
+
16
+ In the examples below we are using [Faker](http://faker.rubyforge.org/)
17
+ to generate random data, but you can use any method.
18
+
19
+ With ActiveRecord:
20
+
21
+ class User < ActiveRecord::Base
22
+ spawner do |user|
23
+ user.name = Faker::Name.name
24
+ user.email = Faker::Internet.email
25
+ end
26
+ end
27
+
28
+ With Sequel:
29
+
30
+ class User < Sequel::Model
31
+ extend Clown
32
+
33
+ spawner do |user|
34
+ user.name = Faker::Name.name
35
+ user.email = Faker::Internet.email
36
+ end
37
+ end
38
+
39
+ If you don't want to pollute your class definition, you
40
+ can of course use it from outside:
41
+
42
+ User.spawner do |user|
43
+ user.name = Faker::Name.name
44
+ user.email = Faker::Internet.email
45
+ end
46
+
47
+ Then, in your test or in any other place:
48
+
49
+ @user = User.spawn
50
+
51
+ Or, if you need something special:
52
+
53
+ @user = User.spawn :name => "Michel Martens"
54
+
55
+ Installation
56
+ ------------
57
+
58
+ $ sudo gem install clown
59
+
60
+ ### Thanks
61
+
62
+ Thanks to Foca (http://github.com/foca/) for his suggestions and Pedro
63
+ (http://github.com/peterpunk/) for the original gemspec.
64
+
65
+ License
66
+ -------
67
+
68
+ Copyright (c) 2009 Michel Martens for Citrusbyte
69
+
70
+ Permission is hereby granted, free of charge, to any person
71
+ obtaining a copy of this software and associated documentation
72
+ files (the "Software"), to deal in the Software without
73
+ restriction, including without limitation the rights to use,
74
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
75
+ copies of the Software, and to permit persons to whom the
76
+ Software is furnished to do so, subject to the following
77
+ conditions:
78
+
79
+ The above copyright notice and this permission notice shall be
80
+ included in all copies or substantial portions of the Software.
81
+
82
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
83
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
84
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
85
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
86
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
87
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
88
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
89
+ OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,26 @@
1
+ require 'rake'
2
+ require 'rake/gempackagetask'
3
+ require 'rake/testtask'
4
+ require 'rake/clean'
5
+
6
+ gem_spec_file = 'spawner.gemspec'
7
+
8
+ gem_spec = eval(File.read(gem_spec_file)) rescue nil
9
+
10
+ task :default => :test
11
+
12
+ Rake::TestTask.new(:test) do |t|
13
+ t.pattern = 'test/**/*_test.rb'
14
+ t.verbose = false
15
+ end
16
+
17
+ Rake::GemPackageTask.new(gem_spec) do |pkg|
18
+ pkg.need_zip = false
19
+ pkg.need_tar = false
20
+ rm_f FileList['pkg/**/*.*']
21
+ end if gem_spec
22
+
23
+ desc "Builds and installs the gem."
24
+ task :install => :repackage do
25
+ `sudo gem install pkg/#{gem_spec.name}-#{gem_spec.version}.gem`
26
+ end
@@ -0,0 +1,14 @@
1
+ require "ostruct"
2
+
3
+ module Spawner
4
+ def spawner &default
5
+ @@spawn ||= Hash.new
6
+ @@spawn[self.name] = default
7
+ end
8
+
9
+ def spawn attrs = {}
10
+ @@spawn[self.name].call(model = OpenStruct.new)
11
+ factory_method = respond_to?(:create!) ? :create! : :create
12
+ send(factory_method, model.send(:table).merge(attrs))
13
+ end
14
+ end
@@ -0,0 +1,44 @@
1
+ require "rubygems"
2
+ require "active_record"
3
+ require "contest"
4
+ require File.dirname(__FILE__) + "/../lib/clown"
5
+ require "faker"
6
+
7
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :dbfile => ":memory:")
8
+ ActiveRecord::Schema.define do
9
+ create_table :active_record_users do |table|
10
+ table.column :name, :string
11
+ table.column :email, :string
12
+ end
13
+ end
14
+
15
+ class ActiveRecordUser < ActiveRecord::Base
16
+ extend Spawner
17
+
18
+ validates_presence_of :name
19
+
20
+ spawner do |user|
21
+ user.name = Faker::Name.name
22
+ user.email = Faker::Internet.email
23
+ end
24
+ end
25
+
26
+ class TestSpawnerWithActiveRecord < Test::Unit::TestCase
27
+ setup do
28
+ @user = ActiveRecordUser.spawn :name => "John"
29
+ end
30
+
31
+ context "spawned user" do
32
+ should "have John as name" do
33
+ assert_equal "John", @user.name
34
+ end
35
+
36
+ context "with invalid attributes" do
37
+ should "raise an error" do
38
+ assert_raise ActiveRecord::RecordInvalid do
39
+ ActiveRecordUser.spawn :name => nil
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,117 @@
1
+ require 'rubygems'
2
+ require 'contest'
3
+ require File.dirname(__FILE__) + "/../lib/clown"
4
+
5
+ class Base
6
+ attr_accessor :attributes
7
+
8
+ def initialize(attrs = {})
9
+ @attributes = attrs
10
+ end
11
+
12
+ def self.create(attrs = {})
13
+ new(attrs)
14
+ end
15
+
16
+ def bar; attributes[:bar] end
17
+ def baz; attributes[:baz] end
18
+ def self.name; "Foo" end
19
+
20
+ extend Spawner
21
+
22
+ spawner do |object|
23
+ object.bar = 7
24
+ object.baz = 8
25
+ end
26
+ end
27
+
28
+ class Foo < Base
29
+ class << self
30
+ alias_method :create!, :create
31
+ end
32
+ end
33
+
34
+ class Bar < Foo
35
+ def self.name; "Bar" end
36
+
37
+ spawner do |bar|
38
+ bar.bar = 9
39
+ bar.baz = 10
40
+ end
41
+ end
42
+
43
+ class Baz < Base
44
+ end
45
+
46
+ class TestFoo < Test::Unit::TestCase
47
+ should "have a name class method" do
48
+ assert Foo.respond_to?(:name)
49
+ assert_equal "Foo", Foo.name
50
+ end
51
+
52
+ context "with attributes :bar and :baz" do
53
+ context "when sent a hash on initialization" do
54
+ should "set the attributes to the passed values" do
55
+ foo = Foo.new :bar => 1, :baz => 2
56
+ assert_equal 1, foo.bar
57
+ assert_equal 2, foo.baz
58
+ end
59
+ end
60
+ end
61
+
62
+ context "that implements Spawner" do
63
+ should "be kind of Spawner" do
64
+ assert Foo.kind_of?(Spawner)
65
+ end
66
+
67
+ context "when instantiated with spawn" do
68
+ context "without parameters" do
69
+ should "initialize the instance with the defined block" do
70
+ foo = Foo.spawn
71
+ assert_equal 7, foo.bar
72
+ assert_equal 8, foo.baz
73
+ end
74
+ end
75
+
76
+ context "with a hash supplied" do
77
+ should "override the default values" do
78
+ foo = Foo.spawn :bar => 1
79
+ assert_equal 1, foo.bar
80
+ assert_equal 8, foo.baz
81
+ end
82
+ end
83
+
84
+ context "and a class Bar" do
85
+ context "that also implements Spawner" do
86
+ should "be kind of Spawner" do
87
+ assert Bar.kind_of?(Spawner)
88
+ end
89
+
90
+ context "when sent :name" do
91
+ should "return 'Bar'" do
92
+ assert_equal "Bar", Bar.name
93
+ end
94
+ end
95
+
96
+ context "when sent :spawn" do
97
+ should "return an instance of Bar" do
98
+ assert Bar.spawn.kind_of?(Bar)
99
+ end
100
+
101
+ should "not interfere with Foo.spawn" do
102
+ assert_equal 7, Foo.spawn.bar
103
+ assert_equal 9, Bar.spawn.bar
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+
110
+ context "and it doesn't understand #create! (only #create)" do
111
+ should "work anyway" do
112
+ baz = Baz.spawn :bar => 1
113
+ assert_equal 1, baz.bar
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,41 @@
1
+ require "rubygems"
2
+ require "sequel"
3
+ require "contest"
4
+ require File.dirname(__FILE__) + "/../lib/clown"
5
+ require "faker"
6
+
7
+ DB = Sequel.sqlite
8
+ DB << "CREATE TABLE sequel_users (name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL)"
9
+
10
+ class SequelUser < Sequel::Model
11
+ extend Spawner
12
+
13
+ validates do
14
+ presence_of :name
15
+ end
16
+
17
+ spawner do |user|
18
+ user.name = Faker::Name.name
19
+ user.email = Faker::Internet.email
20
+ end
21
+ end
22
+
23
+ class TestSpawnerWithSequel < Test::Unit::TestCase
24
+ setup do
25
+ @user = SequelUser.spawn :name => "John"
26
+ end
27
+
28
+ context "spawned user" do
29
+ should "have John as name" do
30
+ assert_equal "John", @user.name
31
+ end
32
+
33
+ context "with invalid attributes" do
34
+ should "raise an error" do
35
+ assert_raise Sequel::Error::InvalidValue do
36
+ SequelUser.spawn :name => nil
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spawn
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.8
5
+ platform: ruby
6
+ authors:
7
+ - Michel Martens
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-12-18 00:00:00 -02:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: michel@soveran.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - lib/clown.rb
26
+ - README.markdown
27
+ - LICENSE
28
+ - Rakefile
29
+ - test/active_record_test.rb
30
+ - test/all_test.rb
31
+ - test/sequel_test.rb
32
+ has_rdoc: false
33
+ homepage: http://github.com/soveran/spawner
34
+ post_install_message:
35
+ rdoc_options: []
36
+
37
+ require_paths:
38
+ - lib
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ required_rubygems_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: "0"
50
+ version:
51
+ requirements: []
52
+
53
+ rubyforge_project:
54
+ rubygems_version: 1.3.1
55
+ signing_key:
56
+ specification_version: 2
57
+ summary: Simple fixtures replacement for Sequel, ActiveRecord and probably many other ORMs
58
+ test_files: []
59
+