maxiskirt 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,8 @@
1
+ .DS_Store
2
+
3
+ *.gem
4
+ vendor
5
+
6
+ # Ctags
7
+ .tags
8
+ .tags_sorted_by_file
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - jruby
6
+ - rbx-18mode
7
+ - rbx-19mode
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'http://rubygems.org'
2
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,23 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ maxiskirt (1.2.3)
5
+ activesupport (>= 2.2)
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ activesupport (3.2.12)
11
+ i18n (~> 0.6)
12
+ multi_json (~> 1.0)
13
+ i18n (0.6.4)
14
+ multi_json (1.7.0)
15
+ rake (10.0.3)
16
+
17
+ PLATFORMS
18
+ ruby
19
+
20
+ DEPENDENCIES
21
+ bundler (>= 1.0.0)
22
+ maxiskirt!
23
+ rake
data/README.rdoc ADDED
@@ -0,0 +1,72 @@
1
+ = Midiskirt {<img src="https://secure.travis-ci.org/y8/maxiskirt.png?branch=master" alt="Build Status" />}[http://travis-ci.org/y8/maxiskirt]
2
+
3
+ Pretty same as Miniskirt[https://github.com/stephencelis/miniskirt], but didn't hurt your eyes.
4
+
5
+ == Usage
6
+
7
+ Factory girl, relaxed: http://www.stephencelis.com/2010/01/11/miniskirt.html
8
+
9
+ Factory.define :user do |f|
10
+ f.login 'johndoe%d' # Sequence.
11
+ f.email '%{login}@example.com' # Interpolate.
12
+ f.password f.password_confirmation('foobar') # Chain.
13
+ end
14
+
15
+ Factory.define :post do |f|
16
+ f.user { Factory :user } # Blocks, if you must.
17
+ end
18
+
19
+
20
+ == Install
21
+
22
+ % [sudo] gem install miniskirt
23
+
24
+
25
+ In a Rails ~> 3 project:
26
+
27
+ # Gemfile
28
+ gem "miniskirt"
29
+
30
+ % gem bundle # If necessary, `[sudo] gem install bundler`
31
+
32
+ # test/test_helper.rb
33
+ require "maxiskirt"
34
+ require "factories" # If you define your factories in test/factories.rb
35
+
36
+
37
+ In a Rails ~> 2.2 project:
38
+
39
+ # config/environments/test.rb
40
+ config.gem "maxiskirt"
41
+
42
+ % [sudo] rake gems:install
43
+
44
+ # test/test_helper.rb
45
+ require "factories" # If you define your factories in test/factories.rb
46
+
47
+
48
+ == License
49
+
50
+ (The MIT License)
51
+
52
+ (c) 2011 Stephen Celis, stephen@stephencelis.com.
53
+
54
+ (c) 2012 Alexey Bondar, y8@ya.ru
55
+
56
+ Permission is hereby granted, free of charge, to any person obtaining a copy
57
+ of this software and associated documentation files (the "Software"), to deal
58
+ in the Software without restriction, including without limitation the rights
59
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
60
+ copies of the Software, and to permit persons to whom the Software is
61
+ furnished to do so, subject to the following conditions:
62
+
63
+ The above copyright notice and this permission notice shall be included in all
64
+ copies or substantial portions of the Software.
65
+
66
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
67
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
68
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
69
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
70
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
71
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
72
+ SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,18 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.libs << 'test'
7
+ t.test_files = Dir["test/**/*_test.rb"]
8
+ end
9
+
10
+ task :default => :test
11
+
12
+ task :loc do
13
+ count = 0
14
+ File.open("maxiskirt.rb").each do |line|
15
+ count += 1 unless line =~ /^\s*($|#)/ # Any number of spaces followed by EOL or #
16
+ end
17
+ puts "#{count} lines of real code"
18
+ end
@@ -0,0 +1,3 @@
1
+ class Maxiskirt
2
+ VERSION = "0.0.1"
3
+ end
data/lib/maxiskirt.rb ADDED
@@ -0,0 +1,130 @@
1
+ require 'active_support/inflector'
2
+ require 'active_support/core_ext/hash'
3
+ require 'active_support/core_ext/object/duplicable'
4
+
5
+ # Factory girl, relaxed.
6
+ #
7
+ # Factory.define :user do |f|
8
+ # f.login 'johndoe%d' # Sequence.
9
+ # f.email '%{login}@example.com' # Interpolate.
10
+ # f.password f.password_confirmation('foobar') # Chain.
11
+ # end
12
+ #
13
+ # Factory.define :post do |f|
14
+ # f.user { Factory :user } # Blocks, if you must.
15
+ # end
16
+
17
+ Maxiskirt = Struct.new(:__name__, :__klass__, :__parent__, :__params__)
18
+
19
+ class Maxiskirt
20
+ undef_method *instance_methods.grep(/^(?!__|object_id)/)
21
+ private_class_method :new # "Hide" constructor from world
22
+
23
+ # Do not use class variable, as it will be shared among all childrens and
24
+ # can be unintentionally changed.
25
+ @factories = {}
26
+ @sequence = Hash.new(0)
27
+
28
+ class << self
29
+ # Define new factory with given name. New instance of Maxiskirt
30
+ # will be passed as argument to given block.
31
+ #
32
+ # Options are:
33
+ # * class - name of class to be instantiated. By default is same as name
34
+ # * parent - name of parent factory
35
+ def define(name, options = {})
36
+ name = name.to_s
37
+
38
+ # Get class name from options or use name
39
+ klass = options.delete(:class) || name
40
+ parent = options.delete(:parent)
41
+
42
+ @factories[name] = new(name, klass, parent, {})
43
+
44
+ yield(@factories[name])
45
+ end
46
+
47
+ # Initialize and setup class from factory.
48
+ #
49
+ # You can override default factory settings, by passing them
50
+ # as second argument.
51
+ def build(name, params = {})
52
+ factory = @factories[name.to_s]
53
+
54
+ klass = factory.__klass__
55
+ parent = factory.__parent__
56
+ attributes = attributes_for(name, params)
57
+
58
+ # If parent set, then merge parent template with current template
59
+ if parent
60
+ klass = @factories[parent.to_s].__klass__
61
+ end
62
+
63
+ # Convert klass to real Class
64
+ klass = klass.is_a?(Class) ? klass : klass.to_s.classify.constantize
65
+
66
+ object = klass.new
67
+
68
+ attributes.each do |name, value|
69
+ object.send(:"#{name}=", value)
70
+ end
71
+
72
+ return object
73
+ end
74
+
75
+ def attributes_for(name, params_for_replace = {})
76
+ params_for_replace = params_for_replace.symbolize_keys
77
+
78
+ factory = @factories[name.to_s]
79
+
80
+ klass = factory.__klass__
81
+ parent = factory.__parent__
82
+ params = factory.__params__
83
+
84
+ parent_params = if parent
85
+ @factories[parent.to_s].__params__
86
+ else
87
+ {}
88
+ end
89
+
90
+ attributes = {}
91
+
92
+ merged_params = parent_params.merge(params).merge(params_for_replace)
93
+ merged_params.each do |name, value|
94
+ attributes[name] = case value
95
+ when String
96
+ value.sub(/%\d*d/) { |d|
97
+ d % (@sequence[klass] += 1)
98
+ } % attributes
99
+ when Proc
100
+ value.call
101
+ else
102
+ value.duplicable? ? value.dup : value
103
+ end
104
+ end
105
+
106
+ return attributes
107
+ end
108
+
109
+ # Create and save new factory product
110
+ def create(name, params = {})
111
+ build(name, params).tap { |record| record.save! }
112
+ end
113
+ end
114
+
115
+ # Capture method calls, and save it to factory attributes
116
+ def method_missing(name, value = nil, &block)
117
+ __params__.merge!(name => block || value)
118
+ value # Return value to be able to use chaining like: f.password f.password_confirmation("something")
119
+ end
120
+ end
121
+
122
+ # Shortcut to Maxiskirt#create
123
+ def Maxiskirt(name, params = {})
124
+ Maxiskirt.create(name, params)
125
+ end
126
+
127
+ unless Object.const_defined? :Factory
128
+ Factory = Maxiskirt
129
+ alias Factory Maxiskirt
130
+ end
data/maxiskirt.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "maxiskirt/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "maxiskirt"
7
+ s.version = Maxiskirt::VERSION
8
+ s.summary = "factory_girl, relaxed"
9
+ s.description = "Test::Unit begot MiniTest; factory_girl begot Miniskirt, Miniskirt begot Midiskirt, Midiskirt begets Maxiskirt"
10
+
11
+ s.authors = ["vad4msiu"]
12
+ s.email = ["vad4msiu@gmail.com"]
13
+ s.homepage = "http://github.com/vad4msiu/maxiskirt"
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib"]
19
+
20
+ # Development depensencies
21
+ s.add_development_dependency "bundler", ">= 1.0.0"
22
+ s.add_development_dependency "rake"
23
+
24
+ # Runtime dependencies
25
+ s.add_runtime_dependency "activesupport", RUBY_VERSION >= "1.9" ? ">= 2.2" : ">= 3.0"
26
+ end
@@ -0,0 +1,65 @@
1
+ require 'maxiskirt'
2
+ require 'test/unit'
3
+
4
+ class Mock
5
+ # def initialize
6
+ # yield self
7
+ # end
8
+
9
+ def save!
10
+ @saved = true
11
+ end
12
+
13
+ def new_record?
14
+ !@saved
15
+ end
16
+ end
17
+
18
+ class User < Mock
19
+ attr_accessor :login, :email, :password, :password_confirmation, :settings
20
+ end
21
+
22
+ class Post < Mock
23
+ attr_accessor :user
24
+ end
25
+
26
+ class Unbeatable < Mock
27
+ attr_accessor :locked, :state, :email, :age, :male
28
+ end
29
+
30
+ Maxiskirt.define :admin, :parent => :user do |f|
31
+ f.login "admin"
32
+ end
33
+
34
+ Maxiskirt.define :user do |f|
35
+ f.login "johndoe%d"
36
+ f.email "%{login}@example.com"
37
+ f.password f.password_confirmation("foobarbaz")
38
+ end
39
+
40
+ Maxiskirt.define :blog_entry, :class => Post do |f|
41
+ f.user { Maxiskirt :admin }
42
+ end
43
+
44
+ DefaultSettings = {
45
+ "hair" => "green",
46
+ "eyes" => "gray"
47
+ }
48
+
49
+ Maxiskirt.define :guest, :class => :user do |f|
50
+ f.login "guest"
51
+ f.settings DefaultSettings
52
+ end
53
+
54
+ Maxiskirt.define :tenant, :class => :user do |f|
55
+ f.login "tenant"
56
+ f.settings { DefaultSettings }
57
+ end
58
+
59
+ Maxiskirt.define :unbeatable do |f|
60
+ f.locked false
61
+ f.state :enabled
62
+ f.email nil
63
+ f.age 19
64
+ f.male true
65
+ end
@@ -0,0 +1,132 @@
1
+ require "test_helper"
2
+
3
+ class MaxiskirtTest < Test::Unit::TestCase
4
+ def test_should_define_factories
5
+ factories = Maxiskirt.instance_variable_get :@factories
6
+
7
+ assert factories["user"]
8
+ assert factories["blog_entry"]
9
+ end
10
+
11
+ def test_should_attributes_for
12
+ attr_for_user = Factory.attributes_for :user
13
+ assert_instance_of Hash, attr_for_user
14
+ assert_not_nil attr_for_user[:login]
15
+ assert_not_nil attr_for_user[:email]
16
+ assert_not_nil attr_for_user[:password]
17
+ assert_not_nil attr_for_user[:password_confirmation]
18
+ end
19
+
20
+ def test_should_build_object
21
+ user = Factory.build :user
22
+ assert_instance_of User, user
23
+ assert user.new_record?
24
+ end
25
+
26
+ def test_should_create_object
27
+ user = Factory.create :user
28
+ assert_instance_of User, user
29
+ assert !user.new_record?
30
+ end
31
+
32
+ def test_should_create_object_with_shorthand
33
+ user = Factory :user
34
+ assert !user.new_record?
35
+ end
36
+
37
+ def test_should_assign_attributes
38
+ user = Factory.create :user
39
+ assert_not_nil user.login
40
+ assert_not_nil user.email
41
+ assert_not_nil user.password
42
+ assert_not_nil user.password_confirmation
43
+ end
44
+
45
+ def test_should_chain_attributes
46
+ user = Factory.create :user
47
+ assert_equal user.password, user.password_confirmation
48
+ end
49
+
50
+ def test_should_override_attributes_on_the_fly
51
+ user = Factory.create :user, :login => (login = "janedoe"),
52
+ :email => (email = "janedoe@example.com"),
53
+ :password => (password = "password"),
54
+ :password_confirmation => (password_confirmation = "passwrod")
55
+
56
+ assert_equal login, user.login
57
+ assert_equal email, user.email
58
+ assert_equal password, user.password
59
+ assert_equal password_confirmation, user.password_confirmation
60
+
61
+ user = Factory.create :user
62
+
63
+ assert_not_equal login, user.login
64
+ assert_not_equal email, user.email
65
+ assert_not_equal password, user.password
66
+ assert_not_equal password_confirmation, user.password_confirmation
67
+ end
68
+
69
+ def test_should_sequence
70
+ user1 = Factory.create :user
71
+ user2 = Factory.create :user
72
+ assert_equal user1.login.sub(/\d+$/) { |n| n.to_i.succ.to_s }, user2.login
73
+ end
74
+
75
+ def test_should_interpolate
76
+ user = Factory.create :user
77
+ assert_equal "#{user.login}@example.com", user.email
78
+ end
79
+
80
+ def test_should_inherit
81
+ admin = Factory.create :admin
82
+ assert_equal 'admin', admin.login
83
+ assert_equal 'admin@example.com', admin.email
84
+ end
85
+
86
+ def test_should_alias
87
+ blog_entry = Factory.create :blog_entry
88
+ assert_equal 'admin', blog_entry.user.login
89
+ end
90
+
91
+ def test_should_accept_class_as_symbol
92
+ assert_nothing_raised do
93
+ guest = Factory.create :guest
94
+ end
95
+ end
96
+
97
+ def test_objects_should_not_corrupt_attribute_templates
98
+ factories = Maxiskirt.instance_variable_get(:@factories)
99
+ assert_not_same DefaultSettings, factories["guest"].__params__["settings"]
100
+ end
101
+
102
+ def test_factories_should_not_corrupt_attribute_templates
103
+ alice = Factory.build :guest
104
+ bob = Factory.build :guest
105
+
106
+ assert_not_same DefaultSettings, alice.settings
107
+
108
+ alice.settings["eyes"] = "brown"
109
+
110
+ assert_equal "gray", bob.settings["eyes"]
111
+ end
112
+
113
+ def test_should_sequence_without_database
114
+ assert_not_equal Factory.build(:user).login, Factory.build(:user).login
115
+ end
116
+
117
+ def test_should_not_dup_singletons
118
+ assert_nothing_raised(TypeError) {
119
+ Factory(:unbeatable)
120
+ }
121
+ end
122
+
123
+ def test_should_not_dup_proc_results
124
+ assert_same Factory(:tenant).settings, DefaultSettings
125
+ end
126
+
127
+ def test_should_respect_closure_arity
128
+ assert_nothing_raised(ArgumentError) {
129
+ Factory(:tenant, :settings => lambda { DefaultSettings })
130
+ }
131
+ end
132
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: maxiskirt
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - vad4msiu
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-03-18 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.0.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 1.0.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: activesupport
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '2.2'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '2.2'
62
+ description: Test::Unit begot MiniTest; factory_girl begot Miniskirt, Miniskirt begot
63
+ Midiskirt, Midiskirt begets Maxiskirt
64
+ email:
65
+ - vad4msiu@gmail.com
66
+ executables: []
67
+ extensions: []
68
+ extra_rdoc_files: []
69
+ files:
70
+ - .gitignore
71
+ - .travis.yml
72
+ - Gemfile
73
+ - Gemfile.lock
74
+ - README.rdoc
75
+ - Rakefile
76
+ - lib/maxiskirt.rb
77
+ - lib/maxiskirt/version.rb
78
+ - maxiskirt.gemspec
79
+ - test/test_helper.rb
80
+ - test/unit/maxiskirt_test.rb
81
+ homepage: http://github.com/vad4msiu/maxiskirt
82
+ licenses: []
83
+ post_install_message:
84
+ rdoc_options: []
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ! '>='
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ requirements: []
100
+ rubyforge_project:
101
+ rubygems_version: 1.8.23
102
+ signing_key:
103
+ specification_version: 3
104
+ summary: factory_girl, relaxed
105
+ test_files:
106
+ - test/test_helper.rb
107
+ - test/unit/maxiskirt_test.rb
108
+ has_rdoc: