mirror_mirror 0.0.2 → 0.0.3

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/README.md CHANGED
@@ -65,6 +65,6 @@ In this scenario a `contractor_id` is present, but we don't know if the `Contrac
65
65
  <h1>Today's Punched-In Contractors</h1>
66
66
  <ul>
67
67
  <% @timesheets.each do |timesheet| %>
68
- <li><%= "#{timesheet.worker.first_name} #{timesheet.worker.last_name}"</li>
68
+ <li><%= "#{timesheet.contractor.first_name} #{timesheet.contractor.last_name}"</li>
69
69
  <% end %>
70
70
  </ul>
@@ -4,15 +4,20 @@ module MirrorMirror::ActiveRecordBase
4
4
  included do
5
5
 
6
6
  def reflect!
7
+ reflect
8
+ save!
9
+ self
10
+ end
11
+
12
+ def reflect
7
13
  hash = self.class.mirror_request!(:get, mirror_url)
8
14
  raise RecordNotFound, "Non-Hash returned from resource: #{mirror_url} => #{hash.inspect}" unless hash.is_a?(Hash)
9
15
  raise RecordNotFound, "Empty hash returned from resource." unless hash.any?
10
16
  hash.each {|k,v| send("#{k}=", v) if respond_to?("#{k}=") }
11
- self.updated_at = Time.now
12
- save!
13
17
  self
14
18
  end
15
19
 
20
+ # (See #mirror_url)
16
21
  def mirror_url
17
22
  self.class.mirror_url(id)
18
23
  end
@@ -21,32 +26,65 @@ module MirrorMirror::ActiveRecordBase
21
26
 
22
27
  module ClassMethods
23
28
 
29
+ # The setup/configuration method for mirror_mirror functionality.
30
+ # @param [String] url the url of the resource collection (e.g., http://example.com/api/books)
31
+ # @param [Hash] options
32
+ # * :find (Boolean) (default to: false) - If true, `#find` will automatically attempt to `#reflect!` the external record based on the given id.
33
+ # * :request (Symbol, Nil) (defaults to: nil) - Specify a custom class method within the model which will perform the HTTP request.
34
+ # @return [Nil]
24
35
  def mirror_mirror(*args)
25
36
  options = args.extract_options!
26
37
  raise ArgumentError, "url is blank." if args[0].blank?
27
38
  options[:url] = args[0]
28
39
  @mirror_mirrior_options = options
40
+ nil
29
41
  end
30
42
 
43
+ # Determine if this class has been setup to mirror an external resource using `MirrorMirror`.
44
+ #
45
+ # @return [Boolean]
31
46
  def mirroring?
32
- @mirror_mirrior_options.present?
47
+ mirror_mirror_options[:url].present?
33
48
  end
34
49
 
35
- def mirror_mirror_options(option)
50
+ # Get one, or all, of the mirror_mirror class options.
51
+ #
52
+ # @param [Symbol] option the specific option key (e.g., :find, :url, :request)
53
+ # @return [Mixed, Hash] mixed option values, or a Hash containg all class options.
54
+ def mirror_mirror_options(option = nil)
36
55
  @mirror_mirrior_options ||= {}
37
- @mirror_mirrior_options[option]
56
+ if option.nil?
57
+ @mirror_mirrior_options
58
+ else
59
+ @mirror_mirrior_options[option]
60
+ end
38
61
  end
39
62
 
63
+ # Determine if the `:find => true` option has been specified for this class.
64
+ #
65
+ # @return [Boolean]
40
66
  def mirror_find?
41
67
  mirroring? ? @mirror_mirrior_options[:find] : false
42
68
  end
43
69
 
70
+ # Get the url specified in the Model's `#mirror_mirror` setup. Optionally specify a record `id`.
71
+ #
72
+ # @param [Integer] id the resource record id.
73
+ # @return [String] the url.
44
74
  def mirror_url(id = nil)
45
75
  url = @mirror_mirrior_options[:url]
46
76
  url += "/#{id.to_i}" if id.to_i > 0
47
77
  url
48
78
  end
49
79
 
80
+ # A universial `request` method, used internally, that maps to either the default `#MirrorMirror.request!` method, or
81
+ # to a the optional `:request` method specified in the #mirror_mirror options of the Model.
82
+ #
83
+ # @note Will probably go through sweeping changes in the near future.
84
+ # @param [Symbol] verb the http request verb. (`:get`, `:put`, `:post`, and `:delete` are supported)
85
+ # @param [String] url the url to be requested.
86
+ # @param [Hash] params the parameters sent along with the request.
87
+ # @return [Hash, Array] dependant on the context of the call (Record vs Collection)
50
88
  def mirror_request!(verb, url, params = {})
51
89
  method = @mirror_mirrior_options[:request]
52
90
  if method.present?
@@ -65,6 +103,11 @@ module MirrorMirror::ActiveRecordBase
65
103
  end
66
104
  end
67
105
 
106
+ # Attempt to reflect all items from the external collection.
107
+ #
108
+ # @note Not ready for usage; just a thought worth building off from.
109
+ # @param [Hash] params the parameters to be passed to the request method.
110
+ # @return [Array] of active record objects.
68
111
  def reflect_all!(params = {})
69
112
  array = mirror_request(:get, mirror_url, params)
70
113
  raise RecordNotFound, "Non-Array returned from resource: #{mirror_url} => #{hash.inspect}" unless array.is_a?(Array)
@@ -83,20 +126,10 @@ module MirrorMirror::ActiveRecordBase
83
126
  all
84
127
  end
85
128
 
86
- # Active Record Polymorphing
87
- def find(*args)
88
- return super unless mirror_find?
89
- begin
90
- super
91
- rescue ActiveRecord::RecordNotFound
92
- if (id = args[0].to_i) > 0
93
- record = self.new
94
- record.id = id
95
- record.reflect!
96
- end
97
- end
98
- end
99
-
129
+ # Initialize a new record, set the id, and call `#reflect!`
130
+ #
131
+ # @param [Integer] id the id of the record.
132
+ # @return [Object] the active record object.
100
133
  def reflect_by_id!(id)
101
134
  record = self.new
102
135
  record.id = id
@@ -104,12 +137,32 @@ module MirrorMirror::ActiveRecordBase
104
137
  record
105
138
  end
106
139
 
140
+ # Call to find_or_initialize_by_id, and `#reflect!` if the record was not found locally.
141
+ #
142
+ # @param [Integer] id the id of the record.
143
+ # @return [Object] the active record object.
107
144
  def find_or_reflect_by_id!(*args)
108
145
  record = find_or_initialize_by_id(*args)
109
146
  record.reflect! if record.new_record?
110
147
  record
111
148
  end
112
149
 
150
+ # Monkey-Patching of the `ActiveRecord::Base.find()` method to support the `:find => true` option (see #mirror_mirror)
151
+ def find(*args)
152
+ return super unless mirror_find?
153
+ begin
154
+ super
155
+ rescue ActiveRecord::RecordNotFound
156
+ if (id = args[0].to_i) > 0
157
+ record = self.new
158
+ record.id = id
159
+ record.reflect!
160
+ end
161
+ end
162
+ end
163
+
164
+ # Monkey-Patching of the `ActiveRecord::Base.belongs_to()` method to support an extra option `:auto_reflect => true`
165
+ # which allows for automatic retrival of the associated record based on the `:foreign_key` using `#find()`
113
166
  def belongs_to(*args)
114
167
  options = args.extract_options!
115
168
  association_name = args[0].to_s
@@ -1,3 +1,3 @@
1
1
  module MirrorMirror
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: mirror_mirror
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.2
5
+ version: 0.0.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Daniel Doezema
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-06-17 00:00:00 Z
13
+ date: 2012-06-19 00:00:00 Z
14
14
  dependencies: []
15
15
 
16
16
  description: Allows for easier interactions and integration with external REST resources.
@@ -62,3 +62,4 @@ specification_version: 3
62
62
  summary: Allows for easier interactions and integration with external REST resources.
63
63
  test_files: []
64
64
 
65
+ has_rdoc: