miniskirt-mongoid 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/miniskirt.rb +53 -0
  2. data/miniskirt_test.rb +123 -0
  3. metadata +80 -0
data/miniskirt.rb ADDED
@@ -0,0 +1,53 @@
1
+ require 'active_support/inflector'
2
+ require 'active_support/core_ext/hash'
3
+ # Factory girl, relaxed.
4
+ #
5
+ # Factory.define :user do |f|
6
+ # f.login 'johndoe%d' # Sequence.
7
+ # f.email '%{login}@example.com' # Interpolate.
8
+ # f.password f.password_confirmation('foobar') # Chain.
9
+ # end
10
+ #
11
+ # Factory.define :post do |f|
12
+ # f.user { Factory :user } # Blocks, if you must.
13
+ # end
14
+ class Miniskirt < Struct.new(:__klass__)
15
+ undef_method *instance_methods.grep(/^(?!__|object_id)/)
16
+ @@attrs = {} and private_class_method :new
17
+
18
+ class << self
19
+ def define name, options = {}
20
+ @@attrs[name = name.to_s] = [{}, options] and yield new(name)
21
+ end
22
+
23
+ def build name, attrs = {}
24
+ (h, opts, n = @@attrs[name = name.to_s]) and klass = opts[:class] || name
25
+ p = opts[:parent] and (h, klass = @@attrs[p = p.to_s][0].merge(h), p)
26
+ (m = klass.is_a?(Class) ? klass : klass.classify.constantize).new do |r|
27
+ attrs.symbolize_keys!.reverse_update(h).each do |k, v|
28
+ r.send "#{k}=", case v when String # Sequence and interpolate.
29
+ v.sub(/%\d*d/) {|d| d % n ||= m.max(:id).to_i + 1} % attrs % n
30
+ when Proc then v.call(r) else v
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ def create name, attrs = {}
37
+ build(name, attrs).tap { |record| record.save! }
38
+ end
39
+ end
40
+
41
+ def method_missing name, value = nil, &block
42
+ @@attrs[__klass__][0][name] = block || value
43
+ end
44
+ end
45
+
46
+ def Miniskirt name, attrs = {}
47
+ Miniskirt.create(name, attrs)
48
+ end
49
+
50
+ unless Object.const_defined? :Factory
51
+ Factory = Miniskirt
52
+ alias Factory Miniskirt
53
+ end
data/miniskirt_test.rb ADDED
@@ -0,0 +1,123 @@
1
+ require './miniskirt'
2
+ require 'test/unit'
3
+
4
+ class MiniskirtTest < Test::Unit::TestCase
5
+ def test_should_define_factories
6
+ factories = Miniskirt.class_variable_get :@@attrs
7
+ assert_not_nil factories["user"]
8
+ assert_not_nil factories["blog_entry"]
9
+ end
10
+
11
+ def test_should_build_object
12
+ user = Factory.build :user
13
+ assert_instance_of User, user
14
+ assert user.new_record?
15
+ end
16
+
17
+ def test_should_create_object
18
+ user = Factory.create :user
19
+ assert_instance_of User, user
20
+ assert !user.new_record?
21
+ end
22
+
23
+ def test_should_create_object_with_shorthand
24
+ user = Factory :user
25
+ assert !user.new_record?
26
+ end
27
+
28
+ def test_should_assign_attributes
29
+ user = Factory.create :user
30
+ assert_not_nil user.login
31
+ assert_not_nil user.email
32
+ assert_not_nil user.password
33
+ assert_not_nil user.password_confirmation
34
+ end
35
+
36
+ def test_should_chain_attributes
37
+ user = Factory.create :user
38
+ assert_equal user.password, user.password_confirmation
39
+ end
40
+
41
+ def test_should_override_attributes_on_the_fly
42
+ user = Factory.create :user, :login => (login = "janedoe"),
43
+ :email => (email = "janedoe@example.com"),
44
+ :password => (password = "password"),
45
+ :password_confirmation => (password_confirmation = "passwrod")
46
+
47
+ assert_equal login, user.login
48
+ assert_equal email, user.email
49
+ assert_equal password, user.password
50
+ assert_equal password_confirmation, user.password_confirmation
51
+
52
+ user = Factory.create :user
53
+
54
+ assert_not_equal login, user.login
55
+ assert_not_equal email, user.email
56
+ assert_not_equal password, user.password
57
+ assert_not_equal password_confirmation, user.password_confirmation
58
+ end
59
+
60
+ def test_should_sequence
61
+ user1 = Factory.create :user
62
+ user2 = Factory.create :user
63
+ assert_equal user1.login.sub(/\d+$/) { |n| n.to_i.succ.to_s }, user2.login
64
+ end
65
+
66
+ def test_should_interpolate
67
+ user = Factory.create :user
68
+ assert_equal user.email, "#{user.login}@example.com"
69
+ end
70
+
71
+ def test_should_inherit
72
+ admin = Factory.create :admin
73
+ assert_equal 'admin', admin.login
74
+ assert_equal 'admin@example.com', admin.email
75
+ end
76
+
77
+ def test_should_alias
78
+ blog_entry = Factory.create :blog_entry
79
+ assert_equal 'admin', blog_entry.user.login
80
+ end
81
+ end
82
+
83
+ class Mock
84
+ @@maximum = nil
85
+ def self.maximum(column)
86
+ @@maximum
87
+ end
88
+
89
+ def initialize
90
+ yield self
91
+ end
92
+
93
+ def save!
94
+ @@maximum = @@maximum.to_i + 1 unless @saved
95
+ @saved = true
96
+ end
97
+
98
+ def new_record?
99
+ !@saved
100
+ end
101
+ end
102
+
103
+ class User < Mock
104
+ attr_accessor :login, :email, :password, :password_confirmation
105
+ end
106
+
107
+ class Post < Mock
108
+ attr_accessor :user
109
+ end
110
+
111
+ Miniskirt.define :admin, :parent => :user do |f|
112
+ f.login "admin"
113
+ end
114
+
115
+ Miniskirt.define :user do |f|
116
+ f.login "johndoe%d"
117
+ f.email "%{login}@example.com"
118
+ f.password f.password_confirmation("foobarbaz")
119
+ end
120
+
121
+ Miniskirt.define :blog_entry, :class => Post do |f|
122
+ f.user { Miniskirt :admin }
123
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: miniskirt-mongoid
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 0
8
+ - 0
9
+ version: 1.0.0
10
+ platform: ruby
11
+ authors:
12
+ - Stephen Celis, Alvaro Pereyra
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-01-02 00:00:00 -05:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: activesupport
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 2
30
+ - 2
31
+ version: "2.2"
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ description: Test::Unit begot MiniTest; factory_girl begets Miniskirt.
35
+ email: stephen@stephencelis.com
36
+ executables: []
37
+
38
+ extensions: []
39
+
40
+ extra_rdoc_files: []
41
+
42
+ files:
43
+ - miniskirt.rb
44
+ - miniskirt_test.rb
45
+ has_rdoc: true
46
+ homepage: http://github.com/stephencelis/miniskirt
47
+ licenses: []
48
+
49
+ post_install_message:
50
+ rdoc_options: []
51
+
52
+ require_paths:
53
+ - .
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ segments:
60
+ - 1
61
+ - 8
62
+ - 7
63
+ version: 1.8.7
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ segments:
70
+ - 0
71
+ version: "0"
72
+ requirements: []
73
+
74
+ rubyforge_project:
75
+ rubygems_version: 1.3.7
76
+ signing_key:
77
+ specification_version: 3
78
+ summary: factory_girl, relaxed with Mongoid support
79
+ test_files:
80
+ - miniskirt_test.rb