fabricas 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6ea7ee05cb9fd845ff15449a531358f93c168e8e
4
- data.tar.gz: 09af594527a108e52ab1ca2ce405122e13b57055
3
+ metadata.gz: 3b6608c567c383f3d3ef165b065e95b57a2602ab
4
+ data.tar.gz: df81722a0858b92dd920c921f5c064d578729942
5
5
  SHA512:
6
- metadata.gz: 7a26f3aab3b18b5ca77832d61fe84d67a91cad11162595523d32635a2d8ec37e5c812d54925c97cfa97e57412a4dd2da1b1c549d144ed3a74706ef6d129bf045
7
- data.tar.gz: 003ee49dc7f7b7f93ebad20418a8e5fb80aa6d026c1487fafb3e53131c120122ef4d0854b4979514a00645a96b7bcbfe79d0a856377d9c50ac5345d93688d10a
6
+ metadata.gz: 0abf02bd476abf98478ca8ef61d4ae299eae41a316e9599fb693dea39af90e8c453900d1a7c0cafb64646634d856984d8907db2adc4b6bef633be2577e7b7c29
7
+ data.tar.gz: f8f8d92c38a54a045b5c2b193ae98fc9cfb76de2a56752e2401742b907b0c017f863d0452e07c15de955c12d830f5cd9f3f1a597a3391ab90dc4f12712400379
data/README.md CHANGED
@@ -47,15 +47,15 @@ You can provide your own class name to your factories using the `class_name` key
47
47
 
48
48
  ```ruby
49
49
  Fabricas.define do
50
- factory :admin, class_name: "User" do
51
- name "Big Boss"
52
- admin true
50
+ factory :employee, class_name: "User" do
51
+ name "Dilbert"
52
+ area "Engineer"
53
53
  end
54
54
  end
55
55
 
56
- admin = Fabricas.build :admin
57
- puts admin.inspect
58
- #=> <User @name= "Big Boss", @admin= true>
56
+ employee = Fabricas.build :employee
57
+ puts employee.inspect
58
+ #=> <User @name= "Dilbert", @area= "Engineer">
59
59
  ```
60
60
 
61
61
  ### Sending blocks as attributes
@@ -110,5 +110,30 @@ end
110
110
 
111
111
  user = Fabricas.build :user
112
112
  puts user.inspect
113
- #=> <User @name= "Julio", @url="workingawesome.com" @email= "julio@workingawesome.com">
113
+ #=> <User @name= "Julio", @url="workingawesome.com", @email= "julio@workingawesome.com">
114
+ ```
115
+
116
+ ### Inheritance
117
+ There is inheritance, your factory child can receive the same attributes and class name of its parent.
118
+
119
+ ```ruby
120
+ Fabricas.define do
121
+ factory :user do
122
+ first_name "Julio"
123
+ email "email@gmail.com"
124
+
125
+ factory :admin do
126
+ access true
127
+ end
128
+ end
129
+ end
130
+
131
+ user = Fabricas.build :user
132
+ admin = Fabricas.build :admin
133
+
134
+ puts user.inspect
135
+ #=> <User @name= "Julio", @email= "email@gmail.com">
136
+
137
+ puts admin.inspect
138
+ #=> <User @name= "Julio", @email= "email@gmail.com", @access= true>
114
139
  ```
data/lib/fabricas.rb CHANGED
@@ -18,7 +18,7 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
19
  # SOFTWARE.
20
20
  module Fabricas
21
- VERSION = "1.0.0"
21
+ VERSION = "1.1.0"
22
22
  @factories = {}
23
23
  def self.factories; @factories; end
24
24
 
@@ -27,14 +27,16 @@ module Fabricas
27
27
  end
28
28
 
29
29
  def self.factory(klass, args = {}, &block)
30
+ _o = args.fetch(:parent, nil)
30
31
  if block_given?
31
- factories[klass] = CleanRoom.new args.fetch(:class_name, nil)
32
+ factories[klass] = CleanRoom.new(args.fetch(:class_name, nil) || (_o.class_name if _o) || klass)
33
+ factories[klass].attributes = _o.attributes.clone if _o
32
34
  factories[klass].instance_eval(&block)
33
35
  end
34
36
  end
35
37
 
36
38
  def self.build(klass, values = {})
37
- _i = const_get((factories[klass].class_name || klass).capitalize).new
39
+ _i = const_get(factories[klass].class_name.capitalize).new
38
40
  attributes = factories[klass].attributes.merge(values)
39
41
  attributes.each do |name, value|
40
42
  _i.send("#{name}=", value.is_a?(Proc) ? _i.instance_eval(&value) : value)
@@ -43,15 +45,19 @@ module Fabricas
43
45
  end
44
46
 
45
47
  class CleanRoom < BasicObject
46
- attr_reader :attributes, :class_name
48
+ attr_accessor :class_name, :attributes
47
49
 
48
- def initialize(class_name)
50
+ def initialize(name)
49
51
  @attributes = {}
50
- @class_name = class_name.downcase.to_sym if class_name
52
+ @class_name = name.is_a?(::String) ? name.downcase.to_sym : name
51
53
  end
52
54
 
53
55
  def method_missing(method_name, *args, &block)
54
56
  attributes[method_name] = args.first || block
55
57
  end
58
+
59
+ def factory(klass, args={}, &block)
60
+ ::Fabricas.factory(klass, args.merge(parent: self), &block)
61
+ end
56
62
  end
57
63
  end
@@ -1,7 +1,7 @@
1
1
  require File.expand_path("../lib/fabricas", File.dirname(__FILE__))
2
2
 
3
3
  class User
4
- attr_accessor :name, :email, :pet, :admin, :password, :url
4
+ attr_accessor :name, :email, :pet, :admin, :password, :url, :access
5
5
 
6
6
  def self.generate_password
7
7
  "5555"
@@ -12,6 +12,10 @@ class Pet
12
12
  attr_accessor :name, :age, :adopted
13
13
  end
14
14
 
15
+ class Comment
16
+ attr_accessor :content, :sent
17
+ end
18
+
15
19
  Fabricas.define do
16
20
  factory :user do
17
21
  name "Julio"
@@ -19,6 +23,10 @@ Fabricas.define do
19
23
  email { "#{name.downcase}@#{url}" }
20
24
  password { User.generate_password }
21
25
  pet { Fabricas.build :pet }
26
+
27
+ factory :super_admin do
28
+ access true
29
+ end
22
30
  end
23
31
 
24
32
  factory :admin, class_name: "User" do
@@ -32,6 +40,14 @@ Fabricas.define do
32
40
  age 1
33
41
  adopted true
34
42
  end
43
+
44
+ factory :message, class_name: "Comment" do
45
+ content "Hei dude"
46
+
47
+ factory :message_sent do
48
+ sent true
49
+ end
50
+ end
35
51
  end
36
52
 
37
53
  scope do
@@ -39,6 +55,7 @@ scope do
39
55
  user = Fabricas.build :user
40
56
  assert_equal user.name, "Julio"
41
57
  assert_equal user.url, "workingawesome.com"
58
+ assert_equal user.access, nil
42
59
  end
43
60
 
44
61
  test "build user with name returns the sent name" do
@@ -75,4 +92,18 @@ scope do
75
92
  user = Fabricas.build :user
76
93
  assert_equal user.email, "julio@workingawesome.com"
77
94
  end
95
+
96
+ test "inheritance" do
97
+ super_admin = Fabricas.build :super_admin
98
+ assert_equal super_admin.name, "Julio"
99
+ assert_equal super_admin.access, true
100
+ end
101
+
102
+ test "inheritance with class_name in parent" do
103
+ message = Fabricas.build :message
104
+ message_sent = Fabricas.build :message_sent
105
+ assert_equal message.content, "Hei dude"
106
+ assert_equal message_sent.content, "Hei dude"
107
+ assert_equal message_sent.sent, true
108
+ end
78
109
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fabricas
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julio Lopez