ocelot 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ocelot.rb +1 -0
- data/lib/ocelot/dsl.rb +6 -2
- data/lib/ocelot/processor.rb +43 -16
- data/lib/ocelot/rules.rb +5 -1
- data/ocelot.gemspec +1 -1
- metadata +2 -2
data/lib/ocelot.rb
CHANGED
data/lib/ocelot/dsl.rb
CHANGED
@@ -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 =
|
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 =
|
151
|
+
@inspect = Rules::INSPECT_NONE
|
148
152
|
args = [obj, *args]
|
149
153
|
instance_exec(*args, &@p)
|
150
154
|
return @inspect
|
data/lib/ocelot/processor.rb
CHANGED
@@ -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
|
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
|
-
|
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)
|
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
|
-
|
143
|
-
array_rule.save(obj, value, assoc, self) do |child,
|
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
|
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
|
-
|
168
|
-
yield val,
|
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!
|
data/lib/ocelot/rules.rb
CHANGED
@@ -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
|
-
|
53
|
+
Rules::INSPECT_DEEP
|
50
54
|
end
|
51
55
|
end
|
52
56
|
end
|
data/ocelot.gemspec
CHANGED
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: ocelot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
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-
|
13
|
+
date: 2011-05-03 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|