notahat-machinist 0.2.1 → 0.2.2

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.
Files changed (2) hide show
  1. data/lib/machinist/active_record.rb +107 -0
  2. metadata +2 -1
@@ -0,0 +1,107 @@
1
+ module Machinist
2
+
3
+ module ActiveRecord
4
+
5
+ # This method takes care of converting any associated objects,
6
+ # in the hash returned by Lathe#assigned_attributed, into their
7
+ # object ids.
8
+ #
9
+ # For example, let's say we have blueprints like this:
10
+ #
11
+ # Post.blueprint { }
12
+ # Comment.blueprint { post }
13
+ #
14
+ # Lathe#assigned_attributes will return { :post => ... }, but
15
+ # we want to pass { :post_id => 1 } to a controller.
16
+ #
17
+ # This method takes care of cleaning this up.
18
+ def self.assigned_attributes_without_associations(lathe)
19
+ attributes = {}
20
+ lathe.assigned_attributes.each_pair do |attribute, value|
21
+ association = lathe.object.class.reflect_on_association(attribute)
22
+ if association && association.macro == :belongs_to
23
+ attributes[association.primary_key_name.to_sym] = value.id
24
+ else
25
+ attributes[attribute] = value
26
+ end
27
+ end
28
+ attributes
29
+ end
30
+
31
+ # This sets a flag that stops make from saving objects, so
32
+ # that calls to make from within a blueprint don't create
33
+ # anything inside make_unsaved.
34
+ def self.with_save_nerfed
35
+ begin
36
+ @@nerfed = true
37
+ yield
38
+ ensure
39
+ @@nerfed = false
40
+ end
41
+ end
42
+
43
+ @@nerfed = false
44
+ def self.nerfed?
45
+ @@nerfed
46
+ end
47
+
48
+ module Extensions
49
+ def self.included(base)
50
+ base.extend(ClassMethods)
51
+ end
52
+
53
+ module ClassMethods
54
+ def blueprint(&blueprint)
55
+ @blueprint = blueprint if block_given?
56
+ @blueprint
57
+ end
58
+
59
+ def make(attributes = {}, &block)
60
+ lathe = Lathe.run(self.new, attributes)
61
+ unless Machinist::ActiveRecord.nerfed?
62
+ lathe.object.save!
63
+ lathe.object.reload
64
+ end
65
+ lathe.object(&block)
66
+ end
67
+
68
+ def make_unsaved(attributes = {})
69
+ returning(Machinist::ActiveRecord.with_save_nerfed { make(attributes) }) do |object|
70
+ yield object if block_given?
71
+ end
72
+ end
73
+
74
+ def plan(attributes = {})
75
+ lathe = Lathe.run(self.new, attributes)
76
+ Machinist::ActiveRecord.assigned_attributes_without_associations(lathe)
77
+ end
78
+ end
79
+ end
80
+
81
+ module BelongsToExtensions
82
+ def make(attributes = {}, &block)
83
+ lathe = Lathe.run(self.build, attributes)
84
+ unless Machinist::ActiveRecord.nerfed?
85
+ lathe.object.save!
86
+ lathe.object.reload
87
+ end
88
+ lathe.object(&block)
89
+ end
90
+
91
+ def plan(attributes = {})
92
+ lathe = Lathe.run(self.build, attributes)
93
+ Machinist::ActiveRecord.assigned_attributes_without_associations(lathe)
94
+ end
95
+ end
96
+
97
+ end
98
+ end
99
+
100
+
101
+ class ActiveRecord::Base
102
+ include Machinist::ActiveRecord::Extensions
103
+ end
104
+
105
+ class ActiveRecord::Associations::BelongsToAssociation
106
+ include Machinist::ActiveRecord::BelongsToExtensions
107
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: notahat-machinist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pete Yandell
@@ -24,6 +24,7 @@ extra_rdoc_files: []
24
24
  files:
25
25
  - lib/machinist.rb
26
26
  - lib/sham.rb
27
+ - lib/machinist/active_record.rb
27
28
  has_rdoc: false
28
29
  homepage: http://github.com/notahat/machinist
29
30
  post_install_message: