famili 0.1.9.1 → 1.0.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.
- data/lib/famili/class_attribute.rb +40 -0
- data/lib/famili/father.rb +5 -10
- data/lib/famili/mother.rb +21 -6
- data/lib/famili/version.rb +1 -1
- metadata +7 -6
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
class Module
|
|
2
|
+
def remove_possible_method(method)
|
|
3
|
+
if method_defined?(method) || private_method_defined?(method)
|
|
4
|
+
undef_method(method)
|
|
5
|
+
end
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class Class
|
|
10
|
+
def class_attribute(*attrs)
|
|
11
|
+
attrs.each do |name|
|
|
12
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
|
13
|
+
def self.#{name}() nil end
|
|
14
|
+
def self.#{name}?() !!#{name} end
|
|
15
|
+
|
|
16
|
+
def self.#{name}=(val)
|
|
17
|
+
singleton_class.class_eval do
|
|
18
|
+
remove_possible_method(:#{name})
|
|
19
|
+
define_method(:#{name}) { val }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
if singleton_class?
|
|
23
|
+
class_eval do
|
|
24
|
+
remove_possible_method(:#{name})
|
|
25
|
+
def #{name}
|
|
26
|
+
defined?(@#{name}) ? @#{name} : singleton_class.#{name}
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
val
|
|
31
|
+
end
|
|
32
|
+
RUBY
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
def singleton_class?
|
|
38
|
+
ancestors.first != self
|
|
39
|
+
end
|
|
40
|
+
end
|
data/lib/famili/father.rb
CHANGED
|
@@ -2,6 +2,9 @@ require "famili/child"
|
|
|
2
2
|
|
|
3
3
|
module Famili
|
|
4
4
|
class Father
|
|
5
|
+
attr_reader :attributes
|
|
6
|
+
attr_reader :mother
|
|
7
|
+
|
|
5
8
|
def initialize(mother, attributes)
|
|
6
9
|
@mother = mother
|
|
7
10
|
@attributes = attributes
|
|
@@ -50,21 +53,13 @@ module Famili
|
|
|
50
53
|
end
|
|
51
54
|
|
|
52
55
|
def scoped(attributes = {})
|
|
53
|
-
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def method_missing(name, *args)
|
|
57
|
-
if scope_attributes = @mother.class.scopes[name]
|
|
58
|
-
scoped(scope_attributes)
|
|
59
|
-
else
|
|
60
|
-
super(name, *args)
|
|
61
|
-
end
|
|
56
|
+
self.class.new(@mother, merge(attributes))
|
|
62
57
|
end
|
|
63
58
|
|
|
64
59
|
private
|
|
65
60
|
|
|
66
61
|
def merge(attributes)
|
|
67
|
-
|
|
62
|
+
self.attributes.merge(attributes)
|
|
68
63
|
end
|
|
69
64
|
end
|
|
70
65
|
end
|
data/lib/famili/mother.rb
CHANGED
|
@@ -2,8 +2,15 @@ require 'date'
|
|
|
2
2
|
require 'famili/father'
|
|
3
3
|
require "famili/lazy_value"
|
|
4
4
|
|
|
5
|
+
unless Class.respond_to?(:class_attribute)
|
|
6
|
+
require 'famili/class_attribute'
|
|
7
|
+
end
|
|
8
|
+
|
|
5
9
|
module Famili
|
|
6
10
|
class Mother
|
|
11
|
+
class_attribute :father_class
|
|
12
|
+
self.father_class = Famili::Father
|
|
13
|
+
|
|
7
14
|
def before_save(model)
|
|
8
15
|
end
|
|
9
16
|
|
|
@@ -15,7 +22,7 @@ module Famili
|
|
|
15
22
|
end
|
|
16
23
|
|
|
17
24
|
def sequence_number
|
|
18
|
-
@sequence_number||= self.class.objects_sequence_number
|
|
25
|
+
@sequence_number ||= self.class.objects_sequence_number
|
|
19
26
|
end
|
|
20
27
|
|
|
21
28
|
class << self
|
|
@@ -72,14 +79,17 @@ module Famili
|
|
|
72
79
|
end
|
|
73
80
|
|
|
74
81
|
def new_father
|
|
75
|
-
|
|
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) }
|
|
76
88
|
end
|
|
77
89
|
|
|
78
90
|
def scope(name, &block)
|
|
79
|
-
|
|
80
|
-
singleton_class.
|
|
81
|
-
new_father.send(name)
|
|
82
|
-
end
|
|
91
|
+
ensure_own_father_class.send(:define_method, name, &block)
|
|
92
|
+
singleton_class.delegate name, to: :new_father
|
|
83
93
|
end
|
|
84
94
|
|
|
85
95
|
def scopes
|
|
@@ -105,6 +115,11 @@ module Famili
|
|
|
105
115
|
|
|
106
116
|
protected
|
|
107
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
|
+
|
|
108
123
|
def collect_attributes
|
|
109
124
|
saved_attributes, @attributes = @attributes, {}
|
|
110
125
|
yield
|
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:
|
|
4
|
+
version: 1.0.0
|
|
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-
|
|
13
|
+
date: 2012-07-06 00:00:00.000000000 Z
|
|
14
14
|
dependencies: []
|
|
15
15
|
description: Yet another object mother pattern implementation.
|
|
16
16
|
email:
|
|
@@ -20,6 +20,7 @@ extra_rdoc_files: []
|
|
|
20
20
|
files:
|
|
21
21
|
- lib/famili.rb
|
|
22
22
|
- lib/famili/child.rb
|
|
23
|
+
- lib/famili/class_attribute.rb
|
|
23
24
|
- lib/famili/father.rb
|
|
24
25
|
- lib/famili/lazy_value.rb
|
|
25
26
|
- lib/famili/mother.rb
|
|
@@ -39,7 +40,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
39
40
|
version: '0'
|
|
40
41
|
segments:
|
|
41
42
|
- 0
|
|
42
|
-
hash: -
|
|
43
|
+
hash: -2702514337539949147
|
|
43
44
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
44
45
|
none: false
|
|
45
46
|
requirements:
|
|
@@ -48,11 +49,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
48
49
|
version: '0'
|
|
49
50
|
segments:
|
|
50
51
|
- 0
|
|
51
|
-
hash: -
|
|
52
|
+
hash: -2702514337539949147
|
|
52
53
|
requirements: []
|
|
53
54
|
rubyforge_project:
|
|
54
|
-
rubygems_version: 1.8.
|
|
55
|
+
rubygems_version: 1.8.24
|
|
55
56
|
signing_key:
|
|
56
57
|
specification_version: 3
|
|
57
|
-
summary: famili-
|
|
58
|
+
summary: famili-1.0.0
|
|
58
59
|
test_files: []
|