maxiskirt 0.0.1

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/.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: