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 +8 -0
- data/.travis.yml +7 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +23 -0
- data/README.rdoc +72 -0
- data/Rakefile +18 -0
- data/lib/maxiskirt/version.rb +3 -0
- data/lib/maxiskirt.rb +130 -0
- data/maxiskirt.gemspec +26 -0
- data/test/test_helper.rb +65 -0
- data/test/unit/maxiskirt_test.rb +132 -0
- metadata +108 -0
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
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
|
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
|
data/test/test_helper.rb
ADDED
@@ -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:
|