famili 1.0.0 → 1.1.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/lib/famili/father.rb CHANGED
@@ -27,7 +27,7 @@ module Famili
27
27
 
28
28
  def create(opts = {}, &block)
29
29
  model = build(opts, &block)
30
- model.save!
30
+ @mother.save(model)
31
31
  @mother.after_create(model)
32
32
  model
33
33
  end
@@ -0,0 +1,120 @@
1
+ require 'famili/father'
2
+ require "famili/lazy_value"
3
+
4
+ module Famili
5
+ class GrandMother
6
+ class_attribute :father_class
7
+ self.father_class = Famili::Father
8
+
9
+ delegate :build, :create, :build_brothers, :create_brothers, :build_hash, :scoped, to: :father
10
+
11
+ def father
12
+ @father ||= self.class.father_class.new(self, self.class.attributes)
13
+ end
14
+
15
+ def save(model)
16
+ end
17
+
18
+ def before_save(model)
19
+ end
20
+
21
+ def after_create(model)
22
+ end
23
+
24
+ class << self
25
+ alias_method :class_name, :name
26
+
27
+ delegate :build, :create, :build_brothers, :create_brothers, :build_hash, :scoped, to: :new
28
+
29
+ def parent_class=(klass)
30
+ @parent_class = klass
31
+ end
32
+
33
+ def parent_class
34
+ @parent_class
35
+ end
36
+
37
+ def inherited(child)
38
+ child.parent_class = self
39
+ end
40
+
41
+ def name(&block)
42
+ return class_name unless block_given?
43
+ field(:name, &block)
44
+ end
45
+
46
+ def method_missing(method, &block)
47
+ return field(method, &block) if block_given?
48
+ super
49
+ end
50
+
51
+ def attributes
52
+ @attributes ||= parent_class && parent_class.attributes.clone || {}
53
+ end
54
+
55
+ def field(method, value = nil, &block)
56
+ block = -> { value } if value
57
+ attributes[method] = block
58
+ end
59
+
60
+ def lazy(&block)
61
+ Famili::LazyValue.new(&block)
62
+ end
63
+
64
+ def has(name, &block)
65
+ attributes[name] = lazy do
66
+ father = "#{model_class.reflect_on_association(name.to_sym).klass.name}Famili".constantize.new.father
67
+ father = father.scoped(collect_attributes(&block)) if block_given?
68
+ father
69
+ end
70
+ end
71
+
72
+ def trait(name, &block)
73
+ attributes = collect_attributes(&block)
74
+ scope(name) { scoped(attributes) }
75
+ end
76
+
77
+ def scope(name, &block)
78
+ ensure_own_father_class.send(:define_method, name, &block)
79
+ delegate name, to: :father
80
+ singleton_class.delegate name, to: :new
81
+ end
82
+
83
+ def scopes
84
+ @scopes ||= parent_class && parent_class.scopes.dup || {}
85
+ end
86
+
87
+ def model_class(klass = nil)
88
+ if klass
89
+ self.model_class = klass
90
+ return
91
+ end
92
+
93
+ @model_class ||= if class_name =~ /(.*)Famili$/ || class_name =~ /Famili::(.*)/
94
+ $1.split('::').inject(Object) do |mod, const|
95
+ mod.const_get(const)
96
+ end
97
+ end
98
+ end
99
+
100
+ def model_class=(klass)
101
+ @model_class = klass
102
+ end
103
+
104
+ protected
105
+
106
+ def ensure_own_father_class
107
+ @father_class = self.father_class = Class.new(self.father_class) unless @father_class == father_class
108
+ @father_class
109
+ end
110
+
111
+ def collect_attributes
112
+ saved_attributes, @attributes = @attributes, {}
113
+ yield
114
+ @attributes
115
+ ensure
116
+ @attributes = saved_attributes
117
+ end
118
+ end
119
+ end
120
+ end
data/lib/famili/mother.rb CHANGED
@@ -1,20 +1,14 @@
1
1
  require 'date'
2
- require 'famili/father'
3
- require "famili/lazy_value"
2
+ require 'famili/grand_mother'
4
3
 
5
4
  unless Class.respond_to?(:class_attribute)
6
5
  require 'famili/class_attribute'
7
6
  end
8
7
 
9
8
  module Famili
10
- class Mother
11
- class_attribute :father_class
12
- self.father_class = Famili::Father
13
-
14
- def before_save(model)
15
- end
16
-
17
- def after_create(model)
9
+ class Mother < Famili::GrandMother
10
+ def save(model)
11
+ model.save!
18
12
  end
19
13
 
20
14
  def unique
@@ -26,107 +20,10 @@ module Famili
26
20
  end
27
21
 
28
22
  class << self
29
- alias_method :class_name, :name
30
-
31
- delegate :build, :create, :build_brothers, :create_brothers, :build_hash, :scoped, to: :new_father
32
-
33
23
  def objects_sequence_number
34
24
  @sequence_number ||= 0
35
25
  @sequence_number += 1
36
26
  end
37
-
38
- def parent_class=(klass)
39
- @parent_class = klass
40
- end
41
-
42
- def parent_class
43
- @parent_class
44
- end
45
-
46
- def inherited(child)
47
- child.parent_class = self
48
- end
49
-
50
- def name(&block)
51
- return class_name unless block_given?
52
- field(:name, &block)
53
- end
54
-
55
- def method_missing(method, &block)
56
- return field(method, &block) if block_given?
57
- super
58
- end
59
-
60
- def attributes
61
- @attributes ||= parent_class && parent_class.attributes.clone || {}
62
- end
63
-
64
- def field(method, value = nil, &block)
65
- block = -> { value } if value
66
- attributes[method] = block
67
- end
68
-
69
- def lazy(&block)
70
- Famili::LazyValue.new(&block)
71
- end
72
-
73
- def has(name, &block)
74
- attributes[name] = lazy do
75
- father = "#{model_class.reflect_on_association(name.to_sym).klass.name}Famili".constantize.new_father
76
- father = father.scoped(collect_attributes(&block)) if block_given?
77
- father
78
- end
79
- end
80
-
81
- def new_father
82
- father_class.new(self.new, attributes)
83
- end
84
-
85
- def trait(name, &block)
86
- attributes = collect_attributes(&block)
87
- scope(name) { scoped(attributes) }
88
- end
89
-
90
- def scope(name, &block)
91
- ensure_own_father_class.send(:define_method, name, &block)
92
- singleton_class.delegate name, to: :new_father
93
- end
94
-
95
- def scopes
96
- @scopes ||= parent_class && parent_class.scopes.dup || {}
97
- end
98
-
99
- def model_class(klass = nil)
100
- if klass
101
- self.model_class = klass
102
- return
103
- end
104
-
105
- @model_class ||= if class_name =~ /(.*)Famili$/ || class_name =~ /Famili::(.*)/
106
- $1.split('::').inject(Object) do |mod, const|
107
- mod.const_get(const)
108
- end
109
- end
110
- end
111
-
112
- def model_class=(klass)
113
- @model_class = klass
114
- end
115
-
116
- protected
117
-
118
- def ensure_own_father_class
119
- @father_class = self.father_class = Class.new(self.father_class) unless @father_class == father_class
120
- @father_class
121
- end
122
-
123
- def collect_attributes
124
- saved_attributes, @attributes = @attributes, {}
125
- yield
126
- @attributes
127
- ensure
128
- @attributes = saved_attributes
129
- end
130
27
  end
131
28
  end
132
29
  end
@@ -1,5 +1,5 @@
1
1
  module Famili
2
2
  module Version
3
- STRING = '1.0.0'
3
+ STRING = '1.1.1'
4
4
  end
5
5
  end
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: 1.0.0
4
+ version: 1.1.1
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-07-06 00:00:00.000000000 Z
13
+ date: 2012-11-09 00:00:00.000000000 Z
14
14
  dependencies: []
15
15
  description: Yet another object mother pattern implementation.
16
16
  email:
@@ -22,6 +22,7 @@ files:
22
22
  - lib/famili/child.rb
23
23
  - lib/famili/class_attribute.rb
24
24
  - lib/famili/father.rb
25
+ - lib/famili/grand_mother.rb
25
26
  - lib/famili/lazy_value.rb
26
27
  - lib/famili/mother.rb
27
28
  - lib/famili/version.rb
@@ -40,7 +41,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
40
41
  version: '0'
41
42
  segments:
42
43
  - 0
43
- hash: -2702514337539949147
44
+ hash: 845392613528680780
44
45
  required_rubygems_version: !ruby/object:Gem::Requirement
45
46
  none: false
46
47
  requirements:
@@ -49,11 +50,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
49
50
  version: '0'
50
51
  segments:
51
52
  - 0
52
- hash: -2702514337539949147
53
+ hash: 845392613528680780
53
54
  requirements: []
54
55
  rubyforge_project:
55
56
  rubygems_version: 1.8.24
56
57
  signing_key:
57
58
  specification_version: 3
58
- summary: famili-1.0.0
59
+ summary: famili-1.1.1
59
60
  test_files: []