famili 0.1.7 → 0.1.8
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/lib/famili/child.rb +5 -1
- data/lib/famili/father.rb +15 -7
- data/lib/famili/mother.rb +41 -38
- data/lib/famili/version.rb +1 -1
- metadata +5 -5
data/lib/famili/child.rb
CHANGED
|
@@ -36,7 +36,11 @@ module Famili
|
|
|
36
36
|
@unresolved_property_names.delete(name)
|
|
37
37
|
undefine_property_stub(name)
|
|
38
38
|
attribute_value = @attributes[name]
|
|
39
|
-
|
|
39
|
+
if attribute_value.is_a?(::Proc)
|
|
40
|
+
attribute_value = @model.instance_exec(&attribute_value)
|
|
41
|
+
elsif attribute_value.is_a?(::Famili::Father)
|
|
42
|
+
attribute_value = attribute_value.create
|
|
43
|
+
end
|
|
40
44
|
@model.send("#{name}=", attribute_value)
|
|
41
45
|
end
|
|
42
46
|
|
data/lib/famili/father.rb
CHANGED
|
@@ -6,7 +6,7 @@ module Famili
|
|
|
6
6
|
@mother = mother
|
|
7
7
|
@attributes = attributes
|
|
8
8
|
end
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
def build_hash(opts = {})
|
|
11
11
|
attributes = build(opts).attributes.symbolize_keys
|
|
12
12
|
attributes.delete(:updated_at)
|
|
@@ -15,7 +15,7 @@ module Famili
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def build(opts = {})
|
|
18
|
-
attributes = merge(opts)
|
|
18
|
+
attributes = merge(opts)
|
|
19
19
|
model = Famili::Child.new(@mother, attributes).born
|
|
20
20
|
yield model if block_given?
|
|
21
21
|
@mother.before_save(model)
|
|
@@ -29,16 +29,24 @@ module Famili
|
|
|
29
29
|
model
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
def
|
|
32
|
+
def produce_brothers(num, opts={}, init_block, &block)
|
|
33
33
|
brothers = []
|
|
34
|
-
|
|
34
|
+
if init_block && init_block.arity == 2
|
|
35
|
+
num.times { |i| brothers << block.call(opts) { |o| init_block.call(o, i) } }
|
|
36
|
+
else
|
|
37
|
+
num.times { brothers << block.call(opts, &init_block) }
|
|
38
|
+
end
|
|
35
39
|
brothers
|
|
36
40
|
end
|
|
37
41
|
|
|
42
|
+
private_methods :produce_brothers
|
|
43
|
+
|
|
44
|
+
def build_brothers(num, opts = {}, &block)
|
|
45
|
+
produce_brothers(num, opts, block) { |brother_opts, &init_block| build(brother_opts, &init_block) }
|
|
46
|
+
end
|
|
47
|
+
|
|
38
48
|
def create_brothers(num, opts = {}, &block)
|
|
39
|
-
|
|
40
|
-
num.times { brothers << create(opts, &block) }
|
|
41
|
-
brothers
|
|
49
|
+
produce_brothers(num, opts, block) { |brother_opts, &init_block| create(brother_opts, &init_block) }
|
|
42
50
|
end
|
|
43
51
|
|
|
44
52
|
def scoped(attributes = {})
|
data/lib/famili/mother.rb
CHANGED
|
@@ -18,10 +18,12 @@ module Famili
|
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
class << self
|
|
21
|
-
|
|
21
|
+
alias_method :class_name, :name
|
|
22
|
+
|
|
23
|
+
delegate :build, :create, :build_brothers, :create_brothers, :build_hash, :scoped, to: :new_father
|
|
22
24
|
|
|
23
25
|
def objects_sequence_number
|
|
24
|
-
@sequence_number ||=0
|
|
26
|
+
@sequence_number ||= 0
|
|
25
27
|
@sequence_number += 1
|
|
26
28
|
end
|
|
27
29
|
|
|
@@ -48,59 +50,39 @@ module Famili
|
|
|
48
50
|
end
|
|
49
51
|
|
|
50
52
|
def attributes
|
|
51
|
-
@attributes||=parent_class && parent_class.attributes.clone || {}
|
|
52
|
-
@attributes
|
|
53
|
+
@attributes ||= parent_class && parent_class.attributes.clone || {}
|
|
53
54
|
end
|
|
54
55
|
|
|
55
|
-
def field(method, &block)
|
|
56
|
+
def field(method, value = nil, &block)
|
|
57
|
+
block = -> { value } if value
|
|
56
58
|
attributes[method] = block
|
|
57
59
|
end
|
|
58
60
|
|
|
59
|
-
def
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
def has(name, &block)
|
|
62
|
+
pending_tasks.push(Proc.new do
|
|
63
|
+
father = "#{model_class.reflect_on_association(name.to_sym).klass.name}Famili".constantize.new_father
|
|
64
|
+
father = father.scoped(collect_attributes(&block)) if block_given?
|
|
65
|
+
attributes[name] = father
|
|
66
|
+
end)
|
|
65
67
|
end
|
|
66
68
|
|
|
67
|
-
def
|
|
68
|
-
|
|
69
|
+
def new_father
|
|
70
|
+
invoke_pending_tasks
|
|
71
|
+
Famili::Father.new(self.new, attributes)
|
|
69
72
|
end
|
|
70
73
|
|
|
71
|
-
def
|
|
72
|
-
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def build_brothers(num, opts = {}, &block)
|
|
76
|
-
father.build_brothers(num, opts, &block)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def create_brothers(num, opts = {}, &block)
|
|
80
|
-
father.create_brothers(num, opts, &block)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def scoped(attributes = {})
|
|
84
|
-
father.scoped(attributes)
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def scope(name)
|
|
88
|
-
saved_attributes = @attributes
|
|
89
|
-
@attributes = {}
|
|
90
|
-
yield
|
|
91
|
-
scopes[name] = @attributes
|
|
74
|
+
def scope(name, &block)
|
|
75
|
+
scopes[name] = collect_attributes(&block)
|
|
92
76
|
singleton_class.send(:define_method, name) do
|
|
93
|
-
|
|
77
|
+
new_father.send(name)
|
|
94
78
|
end
|
|
95
|
-
ensure
|
|
96
|
-
@attributes = saved_attributes
|
|
97
79
|
end
|
|
98
80
|
|
|
99
81
|
def scopes
|
|
100
82
|
@scopes ||= parent_class && parent_class.scopes.dup || {}
|
|
101
83
|
end
|
|
102
84
|
|
|
103
|
-
def model_class(klass=nil)
|
|
85
|
+
def model_class(klass = nil)
|
|
104
86
|
if klass
|
|
105
87
|
@model_class = klass
|
|
106
88
|
return
|
|
@@ -112,6 +94,27 @@ module Famili
|
|
|
112
94
|
end
|
|
113
95
|
end
|
|
114
96
|
end
|
|
97
|
+
|
|
98
|
+
protected
|
|
99
|
+
|
|
100
|
+
def pending_tasks
|
|
101
|
+
@pending_tasks ||= []
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def invoke_pending_tasks
|
|
105
|
+
parent_class.invoke_pending_tasks if parent_class
|
|
106
|
+
if @pending_tasks
|
|
107
|
+
@pending_tasks.each(&:call)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def collect_attributes
|
|
112
|
+
saved_attributes, @attributes = @attributes, {}
|
|
113
|
+
yield
|
|
114
|
+
@attributes
|
|
115
|
+
ensure
|
|
116
|
+
@attributes = saved_attributes
|
|
117
|
+
end
|
|
115
118
|
end
|
|
116
119
|
end
|
|
117
120
|
end
|
data/lib/famili/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: famili
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.8
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -10,7 +10,7 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: exe
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date: 2012-
|
|
13
|
+
date: 2012-06-28 00:00:00.000000000 Z
|
|
14
14
|
dependencies: []
|
|
15
15
|
description: Yet another object mother pattern implementation.
|
|
16
16
|
email:
|
|
@@ -38,7 +38,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
38
38
|
version: '0'
|
|
39
39
|
segments:
|
|
40
40
|
- 0
|
|
41
|
-
hash: -
|
|
41
|
+
hash: -3995658946911266953
|
|
42
42
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
43
43
|
none: false
|
|
44
44
|
requirements:
|
|
@@ -47,11 +47,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
47
47
|
version: '0'
|
|
48
48
|
segments:
|
|
49
49
|
- 0
|
|
50
|
-
hash: -
|
|
50
|
+
hash: -3995658946911266953
|
|
51
51
|
requirements: []
|
|
52
52
|
rubyforge_project:
|
|
53
53
|
rubygems_version: 1.8.10
|
|
54
54
|
signing_key:
|
|
55
55
|
specification_version: 3
|
|
56
|
-
summary: famili-0.1.
|
|
56
|
+
summary: famili-0.1.8
|
|
57
57
|
test_files: []
|