foca-kaleidoscope 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/README.markdown +75 -0
- data/lib/kaleidoscope.rb +39 -0
- data/test/test_kaleidoscope.rb +82 -0
- metadata +63 -0
data/README.markdown
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
Kaleidoscope
|
2
|
+
============
|
3
|
+
|
4
|
+
**Simple** and **clean** object factories for ActiveRecord objects.
|
5
|
+
|
6
|
+
Kaleidoscopes are ridiculously simple objects, and they provide us with
|
7
|
+
beautiful images with almost no work on our part.
|
8
|
+
|
9
|
+
Example plz?
|
10
|
+
------------
|
11
|
+
|
12
|
+
Kaleidoscope.define do
|
13
|
+
factory(User) {{ :name => "Foo Bar", :email => "foo@bar.com", :password => "test" }}
|
14
|
+
factory(User, :admin) {{ :admin => true }}
|
15
|
+
factory(User, :named) do
|
16
|
+
lambda {|name| { :conditions => { :name => name }}}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
User.factory.create #=> #<User id: 1, name: "Foo Bar", email: "foo@bar.com", password: "test", admin: false>
|
21
|
+
User.admin.create #=> #<User id: 2, name: nil, email: nil, password: nil, admin: true>
|
22
|
+
|
23
|
+
# Overwriting values
|
24
|
+
User.factory.create(:name => "foca") #=> #<User id: 3, name: "foca", email: "foo@bar.com", password: "test", admin: false>
|
25
|
+
|
26
|
+
# Don't save values automatically
|
27
|
+
User.factory.new #=> #<User id: nil, ...>
|
28
|
+
|
29
|
+
How does it work?
|
30
|
+
-----------------
|
31
|
+
|
32
|
+
It just uses named scopes behind the scenes. Each factory declaration defines
|
33
|
+
a new named scope with the provided name (or `factory` by default).
|
34
|
+
|
35
|
+
This means we don't touch *any* class. No methods are added on
|
36
|
+
`ActiveRecord::Base`.
|
37
|
+
|
38
|
+
If the named scope already exists (or you have a class method with that
|
39
|
+
same name), the factory declaration will fail with an `ArgumentError`.
|
40
|
+
|
41
|
+
But enough README, read the code, the factory declaration is 5 lines of code.
|
42
|
+
Literally.
|
43
|
+
|
44
|
+
Why?
|
45
|
+
----
|
46
|
+
|
47
|
+
Just a thought experiment, but it might turn out to be useful after all. All
|
48
|
+
credit goes to [Jeremy McAnally][jeremy] for the original idea.
|
49
|
+
|
50
|
+
License
|
51
|
+
-------
|
52
|
+
|
53
|
+
Copyright (c) 2009 [Jeremy McAnally][jeremy] & [Nicolás Sanguinetti][foca] for [entp][].
|
54
|
+
|
55
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
56
|
+
of this software and associated documentation files (the "Software"), to deal
|
57
|
+
in the Software without restriction, including without limitation the rights
|
58
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
59
|
+
copies of the Software, and to permit persons to whom the Software is
|
60
|
+
furnished to do so, subject to the following conditions:
|
61
|
+
|
62
|
+
The above copyright notice and this permission notice shall be included in
|
63
|
+
all copies or substantial portions of the Software.
|
64
|
+
|
65
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
66
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
67
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
68
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
69
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
70
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
71
|
+
THE SOFTWARE.
|
72
|
+
|
73
|
+
[jeremy]: http://github.com/jeremymcanally
|
74
|
+
[foca]: http://github.com/foca
|
75
|
+
[entp]: http://entp.com
|
data/lib/kaleidoscope.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "activerecord"
|
3
|
+
|
4
|
+
module Kaleidoscope
|
5
|
+
# Setup simple and clean factories for activerecord using named_scopes
|
6
|
+
# (no touching of the internals!)
|
7
|
+
#
|
8
|
+
# Kaleidoscope.factory(User) {{
|
9
|
+
# :email => Faker::Internet.email,
|
10
|
+
# :password => "test",
|
11
|
+
# :password_confirmation => "test"
|
12
|
+
# }}
|
13
|
+
#
|
14
|
+
# User.kaleidoscope.create #=> #<User id: 1, email: "foo@bar.com", ...>
|
15
|
+
# User.kaleidoscope.new #=> #<User id: nil, email: "bar@foo.com" ...>
|
16
|
+
#
|
17
|
+
# Kaleidoscope.factory(User, :admin) {{
|
18
|
+
# :admin => true
|
19
|
+
# }}
|
20
|
+
#
|
21
|
+
# User.admin.create #=> #<User id: 1, admin: true, ...>
|
22
|
+
def self.factory(model, name=nil, &block)
|
23
|
+
name ||= :factory
|
24
|
+
raise ArgumentError, "#{model.name} already has a #{name} method" if model.respond_to?(name)
|
25
|
+
definition = block.call
|
26
|
+
definition = { :conditions => definition } if Hash === definition
|
27
|
+
model.named_scope name, definition
|
28
|
+
end
|
29
|
+
|
30
|
+
# Call this to define multiple factories together. Only for aesthetic reasons.
|
31
|
+
#
|
32
|
+
# Kaleidoscope.define do
|
33
|
+
# factory(User, :admin) {{ :admin => true }}
|
34
|
+
# factory(User, :inactive) {{ :state => 'pending' }}
|
35
|
+
# end
|
36
|
+
def self.define(&block)
|
37
|
+
module_eval(&block)
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require File.dirname(__FILE__) + "/../lib/kaleidoscope"
|
3
|
+
|
4
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :dbfile => ":memory:")
|
5
|
+
|
6
|
+
module TestHelpers
|
7
|
+
class User < ActiveRecord::Base
|
8
|
+
named_scope :lives_in, lambda {|country| { :conditions => { :country => country }}}
|
9
|
+
|
10
|
+
def self.create_table
|
11
|
+
connection.create_table table_name do |t|
|
12
|
+
t.string :name
|
13
|
+
t.string :email
|
14
|
+
t.string :password
|
15
|
+
t.string :country
|
16
|
+
t.boolean :admin, :default => false
|
17
|
+
t.timestamps
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.drop_table
|
22
|
+
connection.drop_table table_name
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
Kaleidoscope.define do
|
27
|
+
factory(User) {{ :name => "Foo Bar", :email => "foo@bar.com", :password => "test" }}
|
28
|
+
factory(User, :admin) {{ :admin => true }}
|
29
|
+
factory(User, :named) do
|
30
|
+
lambda {|name| { :conditions => { :name => name }}}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class TestKaleidoscope < Test::Unit::TestCase
|
36
|
+
include TestHelpers
|
37
|
+
|
38
|
+
def setup
|
39
|
+
User.create_table
|
40
|
+
end
|
41
|
+
|
42
|
+
def teardown
|
43
|
+
User.drop_table
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_models_are_created_with_correct_attributes
|
47
|
+
user = User.factory.create
|
48
|
+
|
49
|
+
assert_equal "Foo Bar", user.name
|
50
|
+
assert_equal "foo@bar.com", user.email
|
51
|
+
assert_equal "test", user.password
|
52
|
+
assert !user.admin?
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_you_can_overwrite_attributes_the_normal_activerecord_way
|
56
|
+
user = User.admin.create(:name => "John")
|
57
|
+
|
58
|
+
assert_equal "John", user.name
|
59
|
+
assert user.admin?
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_models_can_chain_factory_scopes
|
63
|
+
user = User.admin.named("John").create
|
64
|
+
|
65
|
+
assert_equal "John", user.name
|
66
|
+
assert user.admin?
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_raises_when_you_declare_duplicate_factory
|
70
|
+
assert_raise ArgumentError do
|
71
|
+
Kaleidoscope.factory(User) {{ :name => "Bar Foo" }}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_works_with_existing_named_scopes_in_the_model
|
76
|
+
user = User.factory.lives_in("Uruguay").create
|
77
|
+
|
78
|
+
assert_equal "Uruguay", user.country
|
79
|
+
assert_equal "Foo Bar", user.name
|
80
|
+
assert_equal "foo@bar.com", user.email
|
81
|
+
end
|
82
|
+
end
|
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: foca-kaleidoscope
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- "Nicol\xC3\xA1s Sanguinetti"
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-01-22 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: activerecord
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.2.2
|
23
|
+
version:
|
24
|
+
description: Easy and clean model factories for active record
|
25
|
+
email: contacto@nicolassanguinetti.info
|
26
|
+
executables: []
|
27
|
+
|
28
|
+
extensions: []
|
29
|
+
|
30
|
+
extra_rdoc_files: []
|
31
|
+
|
32
|
+
files:
|
33
|
+
- README.markdown
|
34
|
+
- lib/kaleidoscope.rb
|
35
|
+
- test/test_kaleidoscope.rb
|
36
|
+
has_rdoc: false
|
37
|
+
homepage:
|
38
|
+
post_install_message:
|
39
|
+
rdoc_options: []
|
40
|
+
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: "0"
|
48
|
+
version:
|
49
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
version:
|
55
|
+
requirements: []
|
56
|
+
|
57
|
+
rubyforge_project: kaleidoscope
|
58
|
+
rubygems_version: 1.2.0
|
59
|
+
signing_key:
|
60
|
+
specification_version: 2
|
61
|
+
summary: Easy and clean model factories for active record
|
62
|
+
test_files: []
|
63
|
+
|