miniskirt-mongoid 1.0.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.
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