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.
- 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
|
|