spawn 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2008 Michel Martens for CitrusByte (http://www.citrusbyte.com)
1
+ Copyright (c) 2008 Michel Martens and Damian Janowski
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -52,6 +52,36 @@ Or, if you need something special:
52
52
 
53
53
  @user = User.spawn :name => "Michel Martens"
54
54
 
55
+ Conditional evaluation
56
+ ----------------------
57
+
58
+ Spawn will execute the right hand side of your assignment even if you
59
+ provide a value for some particular key. Consider the following example:
60
+
61
+ User.spawner do |user|
62
+ user.profile = Profile.spawn # Profile.spawn is executed even if you provide a value for :profile.
63
+ end
64
+
65
+ User.spawn(:profile => Profile.first)
66
+
67
+ Here, you will be creating an extra instance of `Profile`, because when
68
+ the block is evaluated it calls `Profile.spawn`. If the right hand side
69
+ of your assignment is costly or has side effects, you may want to avoid
70
+ this behavior by using `||=`:
71
+
72
+ User.spawner do |user|
73
+ user.profile ||= Profile.spawn
74
+ end
75
+
76
+ Then, if you pass a `:profile`:
77
+
78
+ User.spawn(:profile => Profile.first)
79
+
80
+ You can verify that `Profile.spawn` is never called. Although this
81
+ may sound evident, it can bite you if you rely on the RHS not executing
82
+ (e.g. if you're using Spawn to populate fake data into a database and
83
+ you want to control how many instances you create).
84
+
55
85
  Installation
56
86
  ------------
57
87
 
@@ -59,13 +89,13 @@ Installation
59
89
 
60
90
  ### Thanks
61
91
 
62
- Thanks to Foca (http://github.com/foca/) for his suggestions and Pedro
63
- (http://github.com/peterpunk/) for the original gemspec.
92
+ Thanks to [Foca](http://github.com/foca) for his suggestions and
93
+ [Pedro](http://github.com/peterpunk) for the original gemspec.
64
94
 
65
95
  License
66
96
  -------
67
97
 
68
- Copyright (c) 2009 Michel Martens for Citrusbyte
98
+ Copyright (c) 2009 Michel Martens and Damian Janowski
69
99
 
70
100
  Permission is hereby granted, free of charge, to any person
71
101
  obtaining a copy of this software and associated documentation
@@ -3,11 +3,11 @@ require "ostruct"
3
3
  module Spawn
4
4
  def spawner &default
5
5
  @@spawn ||= Hash.new
6
- @@spawn[self.name] = default
6
+ @@spawn[self] = default
7
7
  end
8
8
 
9
9
  def spawn attrs = {}
10
- @@spawn[self.name].call(model = OpenStruct.new)
10
+ @@spawn[self].call(model = OpenStruct.new(attrs))
11
11
  factory_method = respond_to?(:create!) ? :create! : :create
12
12
  send(factory_method, model.send(:table).merge(attrs))
13
13
  end
@@ -1,10 +1,10 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'spawn'
3
- s.version = '0.1.1'
3
+ s.version = '0.1.2'
4
4
  s.summary = %{Simple fixtures replacement for Sequel, ActiveRecord, Ohm and probably many other ORMs}
5
5
  s.description = %{Spawn is a very small library (just 14 lines of code) that can effectively replace fixtures or any other library for the same task.}
6
- s.email = "michel@soveran.com"
7
- s.author = "Michel Martens"
6
+ s.authors = ["Michel Martens", "Damian Janowski"]
7
+ s.email = ["michel@soveran.com", "djanowski@dimaion.com"]
8
8
  s.homepage = "http://github.com/soveran/spawn"
9
9
  s.files = ["lib/spawn.rb", "rails/init.rb", "README.markdown", "LICENSE", "Rakefile", "test/active_record_test.rb", "test/all_test.rb", "test/sequel_test.rb", "spawn.gemspec"]
10
10
  s.require_paths = ['lib']
@@ -15,25 +15,22 @@ class Base
15
15
 
16
16
  def bar; attributes[:bar] end
17
17
  def baz; attributes[:baz] end
18
- def self.name; "Foo" end
19
18
 
20
19
  extend Spawn
21
-
22
- spawner do |object|
23
- object.bar = 7
24
- object.baz = 8
25
- end
26
20
  end
27
21
 
28
22
  class Foo < Base
29
23
  class << self
30
24
  alias_method :create!, :create
31
25
  end
26
+
27
+ spawner do |object|
28
+ object.bar = 7
29
+ object.baz = 8
30
+ end
32
31
  end
33
32
 
34
33
  class Bar < Foo
35
- def self.name; "Bar" end
36
-
37
34
  spawner do |bar|
38
35
  bar.bar = 9
39
36
  bar.baz = 10
@@ -41,6 +38,34 @@ class Bar < Foo
41
38
  end
42
39
 
43
40
  class Baz < Base
41
+ spawner do |object|
42
+ object.bar = 7
43
+ object.baz = 8
44
+ end
45
+ end
46
+
47
+ module FooBar
48
+ class Baz < ::Base
49
+ spawner do |baz|
50
+ baz.bar = 1
51
+ end
52
+ end
53
+ end
54
+
55
+ module FooBaz
56
+ class Baz < ::Base
57
+ spawner do |baz|
58
+ baz.bar = 2
59
+ end
60
+ end
61
+ end
62
+
63
+ class Qux < Base
64
+ def self.name; "Qux"; end
65
+
66
+ spawner do |barz|
67
+ barz.bar ||= raise "Should have received :bar"
68
+ end
44
69
  end
45
70
 
46
71
  class TestFoo < Test::Unit::TestCase
@@ -56,6 +81,14 @@ class TestFoo < Test::Unit::TestCase
56
81
  assert_equal 1, foo.bar
57
82
  assert_equal 2, foo.baz
58
83
  end
84
+
85
+ should "pass the values to the block" do
86
+ assert_raise(RuntimeError) do
87
+ Qux.spawn
88
+ end
89
+
90
+ assert_equal "Qux", Qux.spawn(:bar => "Qux").bar
91
+ end
59
92
  end
60
93
  end
61
94
 
@@ -114,4 +147,9 @@ class TestFoo < Test::Unit::TestCase
114
147
  end
115
148
  end
116
149
  end
150
+
151
+ should "respect namespaces" do
152
+ assert_equal 1, FooBar::Baz.spawn.bar
153
+ assert_equal 2, FooBaz::Baz.spawn.bar
154
+ end
117
155
  end
@@ -10,8 +10,8 @@ DB << "CREATE TABLE sequel_users (name VARCHAR(255) NOT NULL, email VARCHAR(255)
10
10
  class SequelUser < Sequel::Model
11
11
  extend Spawn
12
12
 
13
- validates do
14
- presence_of :name
13
+ def validate
14
+ errors.add(:name, "Not present") if name.nil? or name.empty?
15
15
  end
16
16
 
17
17
  spawner do |user|
metadata CHANGED
@@ -1,20 +1,23 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spawn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michel Martens
8
+ - Damian Janowski
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
12
 
12
- date: 2009-06-09 00:00:00 -03:00
13
+ date: 2009-06-16 00:00:00 -03:00
13
14
  default_executable:
14
15
  dependencies: []
15
16
 
16
17
  description: Spawn is a very small library (just 14 lines of code) that can effectively replace fixtures or any other library for the same task.
17
- email: michel@soveran.com
18
+ email:
19
+ - michel@soveran.com
20
+ - djanowski@dimaion.com
18
21
  executables: []
19
22
 
20
23
  extensions: []