famili 1.1.2 → 1.2.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.
@@ -0,0 +1,27 @@
1
+ module Famili
2
+ class Attributes
3
+ attr :unresolved_names
4
+
5
+ def initialize(attributes)
6
+ @attributes = attributes
7
+ @unresolved_names = attributes.keys
8
+ end
9
+
10
+ def [](name)
11
+ (@cached_attributes ||= {})[name] ||= resolve(nil, name)
12
+ end
13
+
14
+ def resolve(model, name)
15
+ if unresolved_names.delete(name)
16
+ attribute_value = @attributes[name]
17
+ if attribute_value.is_a?(::Proc)
18
+ attribute_value = model.instance_exec(&attribute_value)
19
+ elsif attribute_value.respond_to?(:call)
20
+ attribute_value = attribute_value.call
21
+ end
22
+ attribute_value = attribute_value.build if attribute_value.is_a?(::Famili::Father)
23
+ attribute_value
24
+ end
25
+ end
26
+ end
27
+ end
data/lib/famili/child.rb CHANGED
@@ -1,15 +1,16 @@
1
+ require 'famili/attributes'
2
+
1
3
  module Famili
2
4
  class Child < BasicObject
3
5
  attr_reader :mother
4
6
 
5
7
  def initialize(mother, attributes)
6
8
  @mother = mother
7
- @attributes = attributes
9
+ @attributes = Attributes.new(attributes)
8
10
  end
9
11
 
10
12
  def born
11
- @unresolved_property_names = @attributes.keys
12
- @model = @mother.class.model_class.new
13
+ @model = @mother.instantiate(@attributes)
13
14
  @meta_class = @model.singleton_class
14
15
  @model.instance_variable_set(:@__famili_child__, self)
15
16
  define_method_stub(:method_missing) do |name, *args|
@@ -20,10 +21,10 @@ module Famili
20
21
  send(@__famili_child__.munge(:method_missing), name, *args)
21
22
  end
22
23
  end
23
- @unresolved_property_names.each do |key|
24
+ @attributes.unresolved_names.each do |key|
24
25
  define_property_stub(key)
25
26
  end
26
- resolve_property(@unresolved_property_names.first) until @unresolved_property_names.empty?
27
+ resolve_property(@attributes.unresolved_names.first) until @attributes.unresolved_names.empty?
27
28
  undefine_method_stub(:method_missing)
28
29
  @model
29
30
  end
@@ -33,16 +34,8 @@ module Famili
33
34
  end
34
35
 
35
36
  def resolve_property(name)
36
- @unresolved_property_names.delete(name)
37
37
  undefine_property_stub(name)
38
- attribute_value = @attributes[name]
39
- if attribute_value.is_a?(::Proc)
40
- attribute_value = @model.instance_exec(&attribute_value)
41
- elsif attribute_value.respond_to?(:call)
42
- attribute_value = attribute_value.call
43
- end
44
- attribute_value = attribute_value.build if attribute_value.is_a?(::Famili::Father)
45
- @model.send("#{name}=", attribute_value)
38
+ @model.send("#{name}=", @attributes.resolve(@model, name))
46
39
  end
47
40
 
48
41
  def define_property_stub(property_name)
@@ -0,0 +1,15 @@
1
+ class Module
2
+ def delegate(*method_names)
3
+ opts = method_names.pop
4
+ declarations = ''
5
+ to = opts[:to]
6
+ method_names.each do |name|
7
+ declarations << <<-RUBY
8
+ def #{name}(*args, &block)
9
+ #{to}.#{name}(*args, &block)
10
+ end
11
+ RUBY
12
+ end
13
+ module_eval declarations
14
+ end
15
+ end
@@ -1,6 +1,13 @@
1
1
  require 'famili/father'
2
2
  require "famili/lazy_value"
3
3
 
4
+ unless Class.respond_to?(:class_attribute)
5
+ require 'famili/class_attribute'
6
+ end
7
+ unless Module.respond_to?(:delegate)
8
+ require 'famili/delegate'
9
+ end
10
+
4
11
  module Famili
5
12
  class GrandMother
6
13
  class_attribute :father_class
@@ -12,12 +19,19 @@ module Famili
12
19
  @father ||= self.class.father_class.new(self, self.class.attributes)
13
20
  end
14
21
 
22
+ #noinspection RubyUnusedLocalVariable
23
+ def instantiate(attributes)
24
+ self.class.model_class.new
25
+ end
26
+
15
27
  def save(model)
16
28
  end
17
29
 
30
+ #noinspection RubyUnusedLocalVariable
18
31
  def before_save(model)
19
32
  end
20
33
 
34
+ #noinspection RubyUnusedLocalVariable
21
35
  def after_create(model)
22
36
  end
23
37
 
data/lib/famili/mother.rb CHANGED
@@ -1,10 +1,6 @@
1
1
  require 'date'
2
2
  require 'famili/grand_mother'
3
3
 
4
- unless Class.respond_to?(:class_attribute)
5
- require 'famili/class_attribute'
6
- end
7
-
8
4
  module Famili
9
5
  class Mother < Famili::GrandMother
10
6
  def save(model)
@@ -1,5 +1,5 @@
1
1
  module Famili
2
2
  module Version
3
- STRING = '1.1.2'
3
+ STRING = '1.2.0'
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.1.2
4
+ version: 1.2.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: 2013-08-20 00:00:00.000000000 Z
13
+ date: 2013-08-21 00:00:00.000000000 Z
14
14
  dependencies: []
15
15
  description: Yet another object mother pattern implementation.
16
16
  email:
@@ -19,8 +19,10 @@ extensions: []
19
19
  extra_rdoc_files: []
20
20
  files:
21
21
  - lib/famili.rb
22
+ - lib/famili/attributes.rb
22
23
  - lib/famili/child.rb
23
24
  - lib/famili/class_attribute.rb
25
+ - lib/famili/delegate.rb
24
26
  - lib/famili/father.rb
25
27
  - lib/famili/grand_mother.rb
26
28
  - lib/famili/lazy_value.rb
@@ -37,7 +39,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
37
39
  requirements:
38
40
  - - ! '>='
39
41
  - !ruby/object:Gem::Version
40
- hash: -3118589739651311701
42
+ hash: -1151566627510109189
41
43
  version: '0'
42
44
  segments:
43
45
  - 0
@@ -46,7 +48,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
46
48
  requirements:
47
49
  - - ! '>='
48
50
  - !ruby/object:Gem::Version
49
- hash: -3118589739651311701
51
+ hash: -1151566627510109189
50
52
  version: '0'
51
53
  segments:
52
54
  - 0
@@ -56,5 +58,5 @@ rubyforge_project:
56
58
  rubygems_version: 1.8.24
57
59
  signing_key:
58
60
  specification_version: 3
59
- summary: famili-1.1.2
61
+ summary: famili-1.2.0
60
62
  test_files: []