ocelot 0.0.3 → 0.0.4

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.
@@ -56,6 +56,7 @@ module Ocelot
56
56
  else
57
57
  logger.error "Could not write #{target}.#{assoc} adding #{val.class}: #{e.message}"
58
58
  end
59
+ logger.debug e.backtrace
59
60
  end
60
61
  end
61
62
 
@@ -135,8 +135,12 @@ module Ocelot
135
135
  @p = p
136
136
  end
137
137
 
138
+ def inspect_shallow
139
+ @inspect = Rules::INSPECT_SHALLOW
140
+ end
141
+
138
142
  def inspect
139
- @inspect = true
143
+ @inspect = Rules::INSPECT_DEEP
140
144
  end
141
145
 
142
146
  def persist(obj)
@@ -144,7 +148,7 @@ module Ocelot
144
148
  end
145
149
 
146
150
  def save(obj, *args)
147
- @inspect = false
151
+ @inspect = Rules::INSPECT_NONE
148
152
  args = [obj, *args]
149
153
  instance_exec(*args, &@p)
150
154
  return @inspect
@@ -98,32 +98,55 @@ module Ocelot
98
98
  logger.warn "Unrecognised type #{obj.class}"
99
99
  @unrecognised << obj.class
100
100
  end
101
+ Rules::INSPECT_NONE
101
102
  end
102
103
 
103
- def go
104
+ def setup_rules_and_filters
104
105
  default_rule = Rules::DefaultRule.new
105
106
  default_filter = Rules::Filter.new
106
107
 
107
108
  @rules = Hash.new
108
109
  @filters = Hash.new
109
- @saved = Set.new
110
- @inspected = Set.new
111
110
 
112
- array_rule = ArrayRule.new
113
-
114
111
  @classes.each { |c| @rules[c] = default_rule; @filters[c] = default_filter }
112
+
115
113
  @rules.merge! @extra_rules
116
114
  @filters.merge! @extra_filters
117
- seeds = @seeds.collect { |o| [o, "script seed"] }
118
115
 
116
+ [@rules, @filters].each do |p|
117
+ class << p
118
+ alias :old_index :[]
119
+ def [](clazz)
120
+ c = clazz
121
+ while c
122
+ return old_index(c) if old_index(c)
123
+ c = c.superclass
124
+ end
125
+ end
126
+ end
127
+ end
128
+
129
+ debugger
130
+ end
131
+
132
+ def go
133
+ setup_rules_and_filters
134
+
135
+ @saved = Set.new
136
+ @inspected = Set.new
137
+
138
+ array_rule = ArrayRule.new
139
+
140
+ seeds = @seeds.collect { |o| [o, Rules::INSPECT_DEEP, "script seed"] }
119
141
  Graph::Traverser.run(seeds) do |objs, queue|
120
- obj, calller = *objs
142
+ obj, inspect_level, calller = *objs
121
143
 
122
144
  unless in? @saved, obj
123
- @inspected << obj unless process_rule(:obj => obj, :caller => calller)
145
+ inspect_level = process_rule(:obj => obj, :caller => calller)
146
+ @inspected << obj unless inspect_level > Rules::INSPECT_NONE
124
147
  end
125
148
 
126
- unless in? @inspected, obj
149
+ unless in? @inspected, obj and inspect_level > Rules::INSPECT_NONE
127
150
  obj.class.reflect_on_all_associations.each do |assoc|
128
151
  safely obj do
129
152
  connection.use_source = true
@@ -134,16 +157,20 @@ module Ocelot
134
157
  # simple has_one (A->B handling), save B and conditionally inspect
135
158
  if !assoc.collection?
136
159
  unless in? @saved, value
137
- process_rule(:obj => value, :caller => calller) and (queue << [value, obj_to_s(obj, assoc)])
160
+ child_inspect_level = process_rule(:obj => value, :caller => calller)
161
+ if child_inspect_level > Rules::INSPECT_NONE
162
+ queue << [value, child_inspect_level, obj_to_s(obj, assoc)]
163
+ end
138
164
  end
165
+
139
166
  # more complicated has many (A-B* and A-mapobj-B*), saving and inspecting each child
140
167
  # monkeypatching the array_rule must yield B and whether to inspect it
141
168
  # be very very very careful, as it handles saving objects whie yielding results
142
- else
143
- array_rule.save(obj, value, assoc, self) do |child, inspect|
169
+ elsif inspect_level > Rules::INSPECT_SHALLOW
170
+ array_rule.save(obj, value, assoc, self) do |child, child_inspect_level|
144
171
  @saved << child
145
- if inspect
146
- queue << [child, obj_to_s(obj, assoc)]
172
+ if child_inspect_level > Rules::INSPECT_NONE
173
+ queue << [child, child_inspect_level, obj_to_s(obj, assoc)]
147
174
  else
148
175
  @inspected << child
149
176
  end
@@ -164,8 +191,8 @@ module Ocelot
164
191
  c.process_filter(:obj => obj, :collection => array, :name => assoc.name).each do |val|
165
192
  unless in? c.saved, val
166
193
  use_source_db!
167
- inspect = c.process_rule(:obj => val, :caller => obj_to_s(obj))
168
- yield val, inspect
194
+ inspect_level = c.process_rule(:obj => val, :caller => obj_to_s(obj))
195
+ yield val, inspect_level
169
196
  end
170
197
 
171
198
  use_target_db!
@@ -1,5 +1,9 @@
1
1
  module Ocelot
2
2
  module Rules
3
+ INSPECT_NONE = 1
4
+ INSPECT_SHALLOW = 2
5
+ INSPECT_DEEP = 3
6
+
3
7
  class Filter < Ocelot::Base
4
8
  def filter(value)
5
9
  true
@@ -46,7 +50,7 @@ module Ocelot
46
50
  obj.id = id
47
51
  remove_callbacks(obj)
48
52
  save_to_db(obj)
49
- true
53
+ Rules::INSPECT_DEEP
50
54
  end
51
55
  end
52
56
  end
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "ocelot"
6
- s.version = "0.0.3"
6
+ s.version = "0.0.4"
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ["spencer p"]
9
9
  s.email = ["exussum@gmail.com"]
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: ocelot
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.3
5
+ version: 0.0.4
6
6
  platform: ruby
7
7
  authors:
8
8
  - spencer p
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-04-21 00:00:00 -04:00
13
+ date: 2011-05-03 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies: []
16
16