fabricas 1.0.0 → 1.1.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.
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